From b4490f2f0c625396892bb06b4c1afd0f997f430c Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 16 Mar 2024 13:04:42 +0100 Subject: [PATCH 01/59] feat: crowdin config file --- crowdin.yml | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 crowdin.yml diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 000000000..431204de6 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,125 @@ +project_identifier: refined-storage-2 +commit_message: "chore: update translations from crowdin" +api_key_env: CROWDIN_API_KEY +base_path: . +files: + - source: /refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json + translation: /refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/%locale_with_underscore%.json + languages_mapping: + locale_with_underscore: + af: af_za + ar: ar_sa + ast: ast_es + az: az_az + ba: ba_ru + be: be_by + bg: bg_bg + br-FR: br_fr + bs: bs_ba + ca: ca_es + cs: cs_cz + cy: cy_gb + da: da_dk + de-AT: de_at + de-CH: de_ch + de: de_de + el: el_gr + en-AU: en_au + en-CA: en_ca + en-GB: en_gb + en-NZ: en_nz + en-PT: en_pt + en-US: en_us + en-ZA: en_za + eo: eo_uy + es-AR: es_ar + es-CL: es_cl + es-ES: es_es + es-MX: es_mx + es-UY: es_uy + es-VE: es_ve + et: et_ee + eu: eu_es + fa: fa_ir + fi: fi_fi + fil: fil_ph + fo: fo_fo + fr-CA: fr_ca + fr: fr_fr + fra-DE: fra_de + fy-NL: fy_nl + ga-IE: ga_ie + gd: gd_gb + gl: gl_es + got: got_de + gv: gv_im + haw: haw_us + he: he_il + hi: hi_in + hr: hr_hr + hu: hu_hu + hy-AM: hy_am + id: id_id + ig: ig_ng + ido: io_en + is: is_is + it: it_it + ja: ja_jp + jbo: jbo_en + ka: ka_ge + kab: kab_kab + kk: kk_kz + kn: kn_in + ko: ko_kr + kw: kw_gb + la-LA: la_va + lb: lb_lu + li: li_li + lol: lol_us + lt: lt_lt + lv: lv_lv + mi: mi_nz + mk: mk_mk + mn: mn_mn + moh: moh_ca + ms: ms_my + mt: mt_mt + nb: nb_no + nds: nds_de + nl-BE: nl_be + nl: nl_nl + nn-NO: nn_no + #no: nn_no + oc: oc_fr + oj: oj_ca + pl: pl_pl + pt-BR: pt_br + pt-PT: pt_pt + qya-AA: qya_aa + ro: ro_ro + ru: ru_ru + sk: sk_sk + sl: sl_si + so: so_so + sq: sq_al + sr: sr_sp + sr-CS: sr_cs + sv-SE: sv_se + ta: ta_in + th: th_th + tl: tl_ph + tlh-AA: tlh_aa + tr: tr_tr + tt-RU: tt_ru + tzl: tzl_tzl + uk: uk_ua + val-ES: val_es + vec: vec_it + vi: vi_vn + yi: yi_de + yo: yo_ng + zh-CN: zh_cn + zh-TW: zh_tw + zh-HK: zh_hk + fur-IT: fur_it + ry: ry_ua \ No newline at end of file From 617f008ff2372cbb95f4d3475a030305e1c13c2c Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 16 Mar 2024 13:43:54 +0100 Subject: [PATCH 02/59] fix: crowdin commit message and pr label --- .github/workflows/build.yml | 2 +- .github/workflows/draft-release.yml | 2 +- .github/workflows/issue-for-unsupported-version.yml | 2 +- .github/workflows/publish-release.yml | 2 +- .github/workflows/resolved-issue-locking.yml | 2 +- .github/workflows/validate-branch-name.yml | 2 +- .github/workflows/validate-changelog.yml | 2 +- .github/workflows/validate-commit-messages.yml | 2 +- crowdin.yml | 5 ++++- settings.gradle | 2 +- 10 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 268ae06af..bfd3a654c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,5 +8,5 @@ on: types: [ opened, synchronize, reopened ] jobs: build: - uses: refinedmods/refinedarchitect/.github/workflows/build.yml@v0.11.3 + uses: refinedmods/refinedarchitect/.github/workflows/build.yml@v0.11.5 secrets: inherit diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index 196cb28c4..b34ffa667 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -17,7 +17,7 @@ on: type: string jobs: draft: - uses: refinedmods/refinedarchitect/.github/workflows/draft-release.yml@v0.11.3 + uses: refinedmods/refinedarchitect/.github/workflows/draft-release.yml@v0.11.5 with: release-type: ${{ inputs.release-type }} version-number-override: ${{ inputs.version-number-override }} diff --git a/.github/workflows/issue-for-unsupported-version.yml b/.github/workflows/issue-for-unsupported-version.yml index 1fc712916..7aa68ecb9 100644 --- a/.github/workflows/issue-for-unsupported-version.yml +++ b/.github/workflows/issue-for-unsupported-version.yml @@ -4,4 +4,4 @@ on: types: [ labeled, unlabeled, reopened ] jobs: unsupported-labeler: - uses: refinedmods/refinedarchitect/.github/workflows/issue-for-unsupported-version.yml@v0.11.3 \ No newline at end of file + uses: refinedmods/refinedarchitect/.github/workflows/issue-for-unsupported-version.yml@v0.11.5 \ No newline at end of file diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 48fbf42e4..bd9b29525 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -7,7 +7,7 @@ on: - closed jobs: publish-release: - uses: refinedmods/refinedarchitect/.github/workflows/publish-release.yml@v0.11.3 + uses: refinedmods/refinedarchitect/.github/workflows/publish-release.yml@v0.11.5 secrets: inherit with: project-name: 'Refined Storage' diff --git a/.github/workflows/resolved-issue-locking.yml b/.github/workflows/resolved-issue-locking.yml index 8d3457d78..cbfb9219d 100644 --- a/.github/workflows/resolved-issue-locking.yml +++ b/.github/workflows/resolved-issue-locking.yml @@ -4,4 +4,4 @@ on: - cron: '0 0 * * *' jobs: lock: - uses: refinedmods/refinedarchitect/.github/workflows/resolved-issue-locking.yml@v0.11.3 \ No newline at end of file + uses: refinedmods/refinedarchitect/.github/workflows/resolved-issue-locking.yml@v0.11.5 \ No newline at end of file diff --git a/.github/workflows/validate-branch-name.yml b/.github/workflows/validate-branch-name.yml index b3852e5b9..7f4ce5e06 100644 --- a/.github/workflows/validate-branch-name.yml +++ b/.github/workflows/validate-branch-name.yml @@ -2,4 +2,4 @@ name: Validate branch name on: [ pull_request ] jobs: validate-branch-name: - uses: refinedmods/refinedarchitect/.github/workflows/validate-branch-name.yml@v0.11.3 \ No newline at end of file + uses: refinedmods/refinedarchitect/.github/workflows/validate-branch-name.yml@v0.11.5 \ No newline at end of file diff --git a/.github/workflows/validate-changelog.yml b/.github/workflows/validate-changelog.yml index c3f9f04d0..8b90c5051 100644 --- a/.github/workflows/validate-changelog.yml +++ b/.github/workflows/validate-changelog.yml @@ -4,4 +4,4 @@ on: types: [ opened, synchronize, reopened, ready_for_review, labeled, unlabeled ] jobs: validate-changelog: - uses: refinedmods/refinedarchitect/.github/workflows/validate-changelog.yml@v0.11.3 \ No newline at end of file + uses: refinedmods/refinedarchitect/.github/workflows/validate-changelog.yml@v0.11.5 \ No newline at end of file diff --git a/.github/workflows/validate-commit-messages.yml b/.github/workflows/validate-commit-messages.yml index f08e60096..d8d12de6b 100644 --- a/.github/workflows/validate-commit-messages.yml +++ b/.github/workflows/validate-commit-messages.yml @@ -2,4 +2,4 @@ name: Validate commit messages on: [ pull_request ] jobs: validate-commit-messages: - uses: refinedmods/refinedarchitect/.github/workflows/validate-commit-messages.yml@v0.11.3 \ No newline at end of file + uses: refinedmods/refinedarchitect/.github/workflows/validate-commit-messages.yml@v0.11.5 \ No newline at end of file diff --git a/crowdin.yml b/crowdin.yml index 431204de6..638d88a8d 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,7 +1,10 @@ project_identifier: refined-storage-2 -commit_message: "chore: update translations from crowdin" +commit_message: "chore: update translation %language% from crowdin" +append_commit_message: false api_key_env: CROWDIN_API_KEY base_path: . +pull_request_labels: + - skip-changelog files: - source: /refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json translation: /refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/%locale_with_underscore%.json diff --git a/settings.gradle b/settings.gradle index 62c0315a2..37d224592 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -gradle.ext.refinedArchitectVersion = "0.11.3" +gradle.ext.refinedArchitectVersion = "0.11.5" dependencyResolutionManagement { repositories { From 8ac58fa0203dbd34aa8e18350c8ca7f06861558e Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:03:50 +0100 Subject: [PATCH 03/59] chore: update translation Chinese Simplified from crowdin --- .../assets/refinedstorage2/lang/zh_cn.json | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_cn.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_cn.json index d226f265b..8bb3939ce 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_cn.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_cn.json @@ -30,6 +30,8 @@ "block.refinedstorage2.storage_monitor": "存储监控器", "block.refinedstorage2.network_receiver": "网络接收器", "block.refinedstorage2.network_transmitter": "网络变送器", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", "gui.refinedstorage2.controller.redstone_mode_help": "当此设备处于非活动状态时,存储网络将无法将此设备用作能源来源。", "gui.refinedstorage2.disk_drive.disks": "磁盘", "gui.refinedstorage2.storage.redstone_mode_help": "当此设备处于非活动状态时,存储在其中的存储空间将无法从存储网络内访问。", @@ -127,6 +129,9 @@ "gui.refinedstorage2.access_mode.insert.help": "存储网络只能插入此存储。包含的资源仍然可在终端中看到。", "gui.refinedstorage2.access_mode.extract": "仅提取", "gui.refinedstorage2.access_mode.extract.help": "存储网络只能从此存储中提取。", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", "gui.refinedstorage2.upgrade_slot": "空升级槽", "gui.refinedstorage2.filter_slot.empty_filter": "空过滤器", "gui.refinedstorage2.filter_slot.left_click_for": "左键点击", @@ -304,7 +309,6 @@ "text.autoconfig.refinedstorage2.option.externalStorage": "外部存储", "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "能源", "text.autoconfig.refinedstorage2.option.wirelessGrid": "无线网格", - "text.autoconfig.refinedstorage2.option.wirelessGrid.useEnergy": "使用能源", "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "能源容量", "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "打开能源", "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "插入能源", @@ -316,6 +320,13 @@ "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "能源", "text.autoconfig.refinedstorage2.option.networkReceiver": "网络接收器", "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "能源", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", "advancements.refinedstorage2.root.description": "在网络中使用一个或多个控制器为您的网络提供能源", "advancements.refinedstorage2.connecting": "连接中", "advancements.refinedstorage2.connecting.description": "使用电缆将设备连接在一起,或将设备放置在一起", @@ -350,5 +361,7 @@ "advancements.refinedstorage2.better_than_a_barrel": "比桶更好", "advancements.refinedstorage2.better_than_a_barrel.description": "制作存储监视器以查看、插入或提取存储网络中的资源", "advancements.refinedstorage2.no_cables_required": "无需电缆", - "advancements.refinedstorage2.no_cables_required.description": "通过使用网络发射器、网络接收器和网络卡,添加额外组件到您的网络而无需使用电缆" + "advancements.refinedstorage2.no_cables_required.description": "通过使用网络发射器、网络接收器和网络卡,添加额外组件到您的网络而无需使用电缆", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" } From 15de5aef7ee5388a20140c7dfdaa215f0157fbef Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:03:51 +0100 Subject: [PATCH 04/59] chore: update translation French from crowdin --- .../assets/refinedstorage2/lang/fr_fr.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From f723a5d9d1c076aea968415a46577bb6dc079780 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:03:52 +0100 Subject: [PATCH 05/59] chore: update translation Spanish from crowdin --- .../assets/refinedstorage2/lang/es_es.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/es_es.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/es_es.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/es_es.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/es_es.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 60e1a9d6b915d8e9842ab64a259de4510b299d42 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:03:52 +0100 Subject: [PATCH 06/59] chore: update translation German from crowdin --- .../assets/refinedstorage2/lang/de_de.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 3e2599f7dd9bdaafa92f04dc83b6f2b3dbabba0f Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:03:53 +0100 Subject: [PATCH 07/59] chore: update translation Polish from crowdin --- .../assets/refinedstorage2/lang/pl_pl.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From d63af11877fe5751b3eda620716705977008c22f Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:03:53 +0100 Subject: [PATCH 08/59] chore: update translation Russian from crowdin --- .../assets/refinedstorage2/lang/ru_ru.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ru_ru.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ru_ru.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ru_ru.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ru_ru.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From ca5bc155c18c2f03292bc44f4385fd13a6373788 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:03:54 +0100 Subject: [PATCH 09/59] chore: update translation Portuguese, Brazilian from crowdin --- .../assets/refinedstorage2/lang/pt_br.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 4cfa4c145940eb81ba5ee7eb060b1dbb91a2d14d Mon Sep 17 00:00:00 2001 From: Raoul Date: Sat, 16 Mar 2024 14:23:12 +0100 Subject: [PATCH 10/59] chore: update translation Hungarian from crowdin --- .../assets/refinedstorage2/lang/hu_hu.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/hu_hu.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/hu_hu.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/hu_hu.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/hu_hu.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 9e4a0f4b6a0a62af603d1027c60a00f0f490fc57 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 16 Mar 2024 15:11:22 +0100 Subject: [PATCH 11/59] docs: crowdin badge and link --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 84405d714..c7f8db9c9 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

Refined Storage is a mass storage mod for Minecraft that offers the player a network-based storage system, allowing them to store items and fluids on a massively expandable device network.

- [![Build Status](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=coverage)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Downloads on CurseForge](http://cf.way2muchnoise.eu/full_243076_downloads.svg)](http://minecraft.curseforge.com/projects/refined-storage) [![Downloads on Modrinth](https://img.shields.io/modrinth/dt/refined-storage?logo=modrinth)](https://modrinth.com/mod/refined-storage) [![Discord](https://img.shields.io/discord/342942776494653441)](https://discordapp.com/invite/VYzsydb) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE.md) + [![Build Status](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=coverage)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Crowdin](https://badges.crowdin.net/refined-storage-2/localized.svg)](https://crowdin.com/project/refined-storage-2) [![Downloads on CurseForge](http://cf.way2muchnoise.eu/full_243076_downloads.svg)](http://minecraft.curseforge.com/projects/refined-storage) [![Downloads on Modrinth](https://img.shields.io/modrinth/dt/refined-storage?logo=modrinth)](https://modrinth.com/mod/refined-storage) [![Discord](https://img.shields.io/discord/342942776494653441)](https://discordapp.com/invite/VYzsydb) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE.md) ## About @@ -26,6 +26,7 @@ this mod that allow the player to setup auto-crafting, allowing the crafting of - [Roadmap](https://github.com/refinedmods/refinedstorage2/projects) - [Wiki](https://github.com/refinedmods/refinedstorage2/wiki) - [Refined Mods on GitHub](https://github.com/refinedmods) +- [Crowdin](https://crowdin.com/project/refined-storage-2) - [Javadoc](https://refinedmods.com/javadoc/refinedstorage2) - [Discord](https://discordapp.com/invite/VYzsydb) - [Twitter](https://twitter.com/refinedmods) From 59448136a055a6a6d3083f3f691e7e46f1c74534 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 16 Mar 2024 15:14:06 +0100 Subject: [PATCH 12/59] fix: wireless grid name not being correct in gui --- CHANGELOG.md | 4 ++++ .../refinedstorage2/platform/common/content/ContentNames.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e1bfd107..2e384f902 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed + +- Wireless Grid name not being correct in the GUI. + ## [2.0.0-milestone.3.4] - 2024-03-16 ### Added diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java index d938b5a6a..0d94ede1c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java @@ -16,7 +16,7 @@ public final class ContentNames { public static final MutableComponent DESTRUCTOR = name("destructor"); public static final MutableComponent CONTROLLER = name("controller"); public static final MutableComponent CREATIVE_CONTROLLER = name("creative_controller"); - public static final MutableComponent WIRELESS_GRID = name("wireless_grid"); + public static final MutableComponent WIRELESS_GRID = createTranslation("item", "wireless_grid"); public static final MutableComponent WIRELESS_TRANSMITTER = name("wireless_transmitter"); public static final MutableComponent REGULATOR_UPGRADE = name("regulator_upgrade"); public static final MutableComponent STORAGE_MONITOR = name("storage_monitor"); From 44bc06e912ec66797279c494de333412093f6c49 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 16 Mar 2024 15:15:29 +0100 Subject: [PATCH 13/59] fix: minecraft version in issue template --- .github/ISSUE_TEMPLATE/bug-report.yml | 113 +++++++++++++------------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 0d3811bd6..247bb242b 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -2,60 +2,59 @@ name: Bug report description: Found a bug or encountered a crash? Please report it here. labels: [ bug ] body: - - type: markdown - attributes: - value: | - Provide a summary of the issue in the title above. - - type: textarea - id: description - attributes: - label: Describe the bug - description: | - Be as detailed as possible. - If applicable, also tell us what you expected to happen instead. - validations: - required: true - - type: textarea - id: reproduce - attributes: - label: How can we reproduce this bug or crash? - description: | - Provide us with steps on how to reproduce this issue. - Try to reproduce the issue with only Refined Storage 2 installed, if possible. - placeholder: | - 1. - 2. - 3. - validations: - required: true - - type: dropdown - id: minecraft - attributes: - label: What Minecraft version is this happening on? - description: | - If your Minecraft version isn't listed here, it means that it isn't supported. In that case, don't create an issue. - options: - - Minecraft 1.19.4 - - Minecraft 1.20.1 - validations: - required: true - - type: input - id: modloader-version - attributes: - label: What Forge or Fabric version is this happening on? - validations: - required: true - - type: input - id: version - attributes: - label: What Refined Storage version is this happening on? - description: | - Ensure that you are using the latest version. - validations: - required: true - - type: textarea - id: logs - attributes: - label: Relevant log output - description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. - render: shell + - type: markdown + attributes: + value: | + Provide a summary of the issue in the title above. + - type: textarea + id: description + attributes: + label: Describe the bug + description: | + Be as detailed as possible. + If applicable, also tell us what you expected to happen instead. + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: How can we reproduce this bug or crash? + description: | + Provide us with steps on how to reproduce this issue. + Try to reproduce the issue with only Refined Storage 2 installed, if possible. + placeholder: | + 1. + 2. + 3. + validations: + required: true + - type: dropdown + id: minecraft + attributes: + label: What Minecraft version is this happening on? + description: | + If your Minecraft version isn't listed here, it means that it isn't supported. In that case, don't create an issue. + options: + - Minecraft 1.20.4 + validations: + required: true + - type: input + id: modloader-version + attributes: + label: What NeoForge or Fabric version is this happening on? + validations: + required: true + - type: input + id: version + attributes: + label: What Refined Storage version is this happening on? + description: | + Ensure that you are using the latest version. + validations: + required: true + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + render: shell From ea2c9266723b89f6dc30d83bd1d7cd3676aab989 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:28 +0100 Subject: [PATCH 14/59] chore: update translation French from crowdin --- .../assets/refinedstorage2/lang/fr_fr.json | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json index 0e58472c8..5dae1aed6 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json @@ -1,40 +1,40 @@ { "itemGroup.refinedstorage2.general": "Refined Storage 2", - "block.refinedstorage2.cable": "Cable", - "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", - "block.refinedstorage2.disk_drive": "Disk Drive", - "block.refinedstorage2.machine_casing": "Machine Casing", - "block.refinedstorage2.grid": "Grid", - "block.refinedstorage2.crafting_grid": "Crafting Grid", - "block.refinedstorage2.controller": "Controller", - "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", - "block.refinedstorage2.creative_controller": "Creative Controller", - "block.refinedstorage2.1k_storage_block": "1K Storage Block", - "block.refinedstorage2.4k_storage_block": "4K Storage Block", - "block.refinedstorage2.16k_storage_block": "16K Storage Block", - "block.refinedstorage2.64k_storage_block": "64K Storage Block", - "block.refinedstorage2.creative_storage_block": "Creative Storage Block", - "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", - "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", - "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", - "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", - "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", - "block.refinedstorage2.importer": "Importer", - "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.cable": "Câble", + "block.refinedstorage2.quartz_enriched_iron_block": "Bloc de Fer Enrichi en Quartz", + "block.refinedstorage2.disk_drive": "Lecteur de Disque", + "block.refinedstorage2.machine_casing": "Boitier de Machine", + "block.refinedstorage2.grid": "Terminal", + "block.refinedstorage2.crafting_grid": "Terminal d’Artisanat", + "block.refinedstorage2.controller": "Contrôleur", + "block.refinedstorage2.controller.rei_fully_charged": "Contrôleur entièrement chargé", + "block.refinedstorage2.creative_controller": "Contrôleur créatif", + "block.refinedstorage2.1k_storage_block": "Bloc de Stockage 1K", + "block.refinedstorage2.4k_storage_block": "Bloc de Stockage 4k", + "block.refinedstorage2.16k_storage_block": "Bloc de Stockage 16k", + "block.refinedstorage2.64k_storage_block": "Bloc de Stockage 64k", + "block.refinedstorage2.creative_storage_block": "Bloc de Stockage Créatif", + "block.refinedstorage2.64b_fluid_storage_block": "Bloc de Stockage de Fluides 64B", + "block.refinedstorage2.256b_fluid_storage_block": "Bloc de Stockage de Fluides 256B", + "block.refinedstorage2.1024b_fluid_storage_block": "Bloc de Stockage de Fluides 1024B", + "block.refinedstorage2.4096b_fluid_storage_block": "Bloc de Stockage de Fluides 4096B", + "block.refinedstorage2.creative_fluid_storage_block": "Bloc de Stockage de Fluides Créatif", + "block.refinedstorage2.importer": "Importateur", + "block.refinedstorage2.exporter": "Exportateur", "block.refinedstorage2.interface": "Interface", - "block.refinedstorage2.external_storage": "External Storage", - "block.refinedstorage2.detector": "Detector", - "block.refinedstorage2.constructor": "Constructor", - "block.refinedstorage2.destructor": "Destructor", - "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", - "block.refinedstorage2.storage_monitor": "Storage Monitor", - "block.refinedstorage2.network_receiver": "Network Receiver", - "block.refinedstorage2.network_transmitter": "Network Transmitter", - "block.refinedstorage2.portable_grid": "Portable Grid", - "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", - "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", - "gui.refinedstorage2.disk_drive.disks": "Disks", - "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "block.refinedstorage2.external_storage": "Stockage Externe", + "block.refinedstorage2.detector": "Détecteur", + "block.refinedstorage2.constructor": "Constructeur", + "block.refinedstorage2.destructor": "Destructeur", + "block.refinedstorage2.wireless_transmitter": "Transmetteur sans fil", + "block.refinedstorage2.storage_monitor": "Moniteur de Stockage", + "block.refinedstorage2.network_receiver": "Récepteur Réseau", + "block.refinedstorage2.network_transmitter": "Transmetteur Réseau", + "block.refinedstorage2.portable_grid": "Terminal Portatif", + "block.refinedstorage2.creative_portable_grid": "Terminal Portatif Créatif", + "gui.refinedstorage2.controller.redstone_mode_help": "Lorsque cet appareil est inactif, le réseau de stockage ne pourra pas utiliser cet appareil comme source d'énergie.", + "gui.refinedstorage2.disk_drive.disks": "Disques", + "gui.refinedstorage2.storage.redstone_mode_help": "Lorsque cet appareil est inactif, le stockage contenu ne sera plus accessible depuis le réseau de stockage.", "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", From 6637ba85206fd2a3c7ec22d41cc964c33a3f5558 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:29 +0100 Subject: [PATCH 15/59] chore: update translation German from crowdin --- .../assets/refinedstorage2/lang/de_de.json | 704 +++++++++--------- 1 file changed, 352 insertions(+), 352 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json index 0e58472c8..325293e3d 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/de_de.json @@ -1,367 +1,367 @@ { "itemGroup.refinedstorage2.general": "Refined Storage 2", - "block.refinedstorage2.cable": "Cable", - "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", - "block.refinedstorage2.disk_drive": "Disk Drive", - "block.refinedstorage2.machine_casing": "Machine Casing", - "block.refinedstorage2.grid": "Grid", - "block.refinedstorage2.crafting_grid": "Crafting Grid", - "block.refinedstorage2.controller": "Controller", - "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", - "block.refinedstorage2.creative_controller": "Creative Controller", - "block.refinedstorage2.1k_storage_block": "1K Storage Block", - "block.refinedstorage2.4k_storage_block": "4K Storage Block", - "block.refinedstorage2.16k_storage_block": "16K Storage Block", - "block.refinedstorage2.64k_storage_block": "64K Storage Block", - "block.refinedstorage2.creative_storage_block": "Creative Storage Block", - "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", - "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", - "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", - "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", - "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", - "block.refinedstorage2.importer": "Importer", - "block.refinedstorage2.exporter": "Exporter", - "block.refinedstorage2.interface": "Interface", - "block.refinedstorage2.external_storage": "External Storage", - "block.refinedstorage2.detector": "Detector", - "block.refinedstorage2.constructor": "Constructor", - "block.refinedstorage2.destructor": "Destructor", - "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", - "block.refinedstorage2.storage_monitor": "Storage Monitor", - "block.refinedstorage2.network_receiver": "Network Receiver", - "block.refinedstorage2.network_transmitter": "Network Transmitter", - "block.refinedstorage2.portable_grid": "Portable Grid", - "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", - "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", - "gui.refinedstorage2.disk_drive.disks": "Disks", - "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", - "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", - "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", - "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", - "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", - "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", - "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", - "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", - "gui.refinedstorage2.grid.sorting.type": "Sorting type", - "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "block.refinedstorage2.cable": "Kabel", + "block.refinedstorage2.quartz_enriched_iron_block": "Quarz angereichertes Eisenblock", + "block.refinedstorage2.disk_drive": "Laufwerk", + "block.refinedstorage2.machine_casing": "Maschinengehäuse", + "block.refinedstorage2.grid": "Konsole", + "block.refinedstorage2.crafting_grid": "Herstellungskonsole", + "block.refinedstorage2.controller": "Kontrollblock", + "block.refinedstorage2.controller.rei_fully_charged": "Vollständig geladener Kontrollblock", + "block.refinedstorage2.creative_controller": "Kreativer Kontrollblock", + "block.refinedstorage2.1k_storage_block": "1k Speicherblock", + "block.refinedstorage2.4k_storage_block": "4k Speicherblock", + "block.refinedstorage2.16k_storage_block": "16k Speicherblock", + "block.refinedstorage2.64k_storage_block": "64k Speicherblock", + "block.refinedstorage2.creative_storage_block": "Kreativer Speicherblock", + "block.refinedstorage2.64b_fluid_storage_block": "64B Flüssigspeicherblock", + "block.refinedstorage2.256b_fluid_storage_block": "256B Flüssigspeicherblock", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Flüssigspeicherblock", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Flüssigspeicherblock", + "block.refinedstorage2.creative_fluid_storage_block": "Kreativer Flüssigspeicherblock", + "block.refinedstorage2.importer": "Importierer", + "block.refinedstorage2.exporter": "Exportierer", + "block.refinedstorage2.interface": "Schnittstelle", + "block.refinedstorage2.external_storage": "Externer Speicher", + "block.refinedstorage2.detector": "Detektor", + "block.refinedstorage2.constructor": "Konstruktor", + "block.refinedstorage2.destructor": "Destruktor", + "block.refinedstorage2.wireless_transmitter": "Funksender", + "block.refinedstorage2.storage_monitor": "Speichermonitor", + "block.refinedstorage2.network_receiver": "Netzwerkempfänger", + "block.refinedstorage2.network_transmitter": "Netzwerksender", + "block.refinedstorage2.portable_grid": "Mobile Konsole", + "block.refinedstorage2.creative_portable_grid": "Mobile Kreative Konsole", + "gui.refinedstorage2.controller.redstone_mode_help": "Falls dieses Gerät inaktiv ist, kann das Speichernetzwerk dieses Gerät nicht als Energiequelle nutzen.", + "gui.refinedstorage2.disk_drive.disks": "Speicherplatten", + "gui.refinedstorage2.storage.redstone_mode_help": "Falls dieses Gerät inaktiv ist, ist der enthaltene Speicher nicht mehr über das Speichernetzwerk zugänglich.", + "gui.refinedstorage2.storage.filter_help": "Die Ressourcen, die in diesem Speicher erlaubt sind oder nicht, je nachdem, ob sich das Gerät in der Erlaubnisliste oder in der Sperrliste befindet.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Ohne konfigurierte Filter werden keine Ressourcen in diesem Speicher akzeptiert.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Erlaube nur Ressourcen in diesen Speicher, die in den Filtern konfiguriert sind.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Erlaube nur Ressourcen in diesen Speicher, die in den Filtern konfiguriert sind.", + "gui.refinedstorage2.grid.sorting.direction": "Sortierrichtung", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Aufsteigend", + "gui.refinedstorage2.grid.sorting.direction.descending": "Absteigend", + "gui.refinedstorage2.grid.sorting.type": "Sortierart", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantität", "gui.refinedstorage2.grid.sorting.type.name": "Name", "gui.refinedstorage2.grid.sorting.type.id": "ID", - "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", - "gui.refinedstorage2.grid.size": "Size", - "gui.refinedstorage2.grid.size.stretch": "Stretch", - "gui.refinedstorage2.grid.size.small": "Small", - "gui.refinedstorage2.grid.size.medium": "Medium", - "gui.refinedstorage2.grid.size.large": "Large", - "gui.refinedstorage2.grid.size.extra_large": "Extra large", - "gui.refinedstorage2.grid.auto_selected": "Auto-selected", - "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", - "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", - "gui.refinedstorage2.grid.synchronizer.off": "Off", - "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Zuletzt geändert", + "gui.refinedstorage2.grid.size": "Größe", + "gui.refinedstorage2.grid.size.stretch": "Strecken", + "gui.refinedstorage2.grid.size.small": "Klein", + "gui.refinedstorage2.grid.size.medium": "Mittel", + "gui.refinedstorage2.grid.size.large": "Groß", + "gui.refinedstorage2.grid.size.extra_large": "Extra groß", + "gui.refinedstorage2.grid.auto_selected": "Automatisch ausgewählt", + "gui.refinedstorage2.grid.auto_selected.help": "Gibt an, ob das Suchfeld beim Öffnen der Konsole automatisch ausgewählt werden soll.", + "gui.refinedstorage2.grid.synchronizer": "Synchronisierungsmodus", + "gui.refinedstorage2.grid.synchronizer.off": "Aus", + "gui.refinedstorage2.grid.synchronizer.off.help": "Suchfeldtext nicht synchronisieren.", "gui.refinedstorage2.grid.synchronizer.jei": "JEI", - "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", - "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", - "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Synchronisieren Sie das Suchfeld Text mit dem JEI Filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI beidseitig", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Synchronisieren Sie das Suchfeld Text mit dem JEI Filter und den JEI Filter mit dem Suchfeld Text.", "gui.refinedstorage2.grid.synchronizer.rei": "REI", - "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", - "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", - "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", - "gui.refinedstorage2.grid.resource_type": "Resource type", - "gui.refinedstorage2.grid.resource_type.all": "All", - "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", - "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", - "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", - "gui.refinedstorage2.detector.mode": "Mode", - "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", - "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", - "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", - "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", - "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", - "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", - "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", - "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", - "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", - "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", - "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", - "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", - "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", - "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", - "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", - "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", - "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", - "gui.refinedstorage2.redstone_mode": "Redstone mode", - "gui.refinedstorage2.redstone_mode.ignore": "Ignore", - "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", - "gui.refinedstorage2.redstone_mode.high": "High", - "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", - "gui.refinedstorage2.redstone_mode.low": "Low", - "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", - "gui.refinedstorage2.scheduling_mode": "Scheduling mode", - "gui.refinedstorage2.scheduling_mode.default": "Default", - "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", - "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", - "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", - "gui.refinedstorage2.scheduling_mode.random": "Random", - "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", - "gui.refinedstorage2.priority": "Priority", - "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", - "gui.refinedstorage2.amount": "Amount", - "gui.refinedstorage2.amount.reset": "Reset", - "gui.refinedstorage2.amount.set": "Set", - "gui.refinedstorage2.filter_mode": "Filter mode", - "gui.refinedstorage2.filter_mode.allow": "Allowlist", - "gui.refinedstorage2.filter_mode.block": "Blocklist", - "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", - "gui.refinedstorage2.fuzzy_mode.on": "On", - "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", - "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", - "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", - "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", - "gui.refinedstorage2.fuzzy_mode.off": "Off", - "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", - "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", - "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", - "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", - "gui.refinedstorage2.access_mode": "Access mode", - "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", - "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", - "gui.refinedstorage2.access_mode.insert": "Insert only", - "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", - "gui.refinedstorage2.access_mode.extract": "Extract only", - "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", - "gui.refinedstorage2.void_excess": "Void excess resources", - "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", - "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", - "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", - "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", - "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", - "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", - "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", - "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", - "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", - "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", - "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", - "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", - "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", - "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", - "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", - "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", - "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", - "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", - "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", - "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", - "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", - "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", - "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", - "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", - "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", - "item.refinedstorage2.processor_binding": "Processor Binding", - "item.refinedstorage2.silicon": "Silicon", - "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", - "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", - "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", - "item.refinedstorage2.basic_processor": "Basic Processor", - "item.refinedstorage2.improved_processor": "Improved Processor", - "item.refinedstorage2.advanced_processor": "Advanced Processor", - "item.refinedstorage2.1k_storage_part": "1K Storage Part", - "item.refinedstorage2.4k_storage_part": "4K Storage Part", - "item.refinedstorage2.16k_storage_part": "16K Storage Part", - "item.refinedstorage2.64k_storage_part": "64K Storage Part", - "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", - "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", - "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", - "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", - "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", - "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", - "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", - "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", - "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", - "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", - "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", - "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", - "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", - "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", - "item.refinedstorage2.storage_housing": "Storage Housing", - "item.refinedstorage2.construction_core": "Construction Core", - "item.refinedstorage2.destruction_core": "Destruction Core", - "item.refinedstorage2.wrench": "Wrench", - "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Synchronisieren Sie das Suchfeld Text mit dem REI Filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI beidseitig", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Synchronisieren Sie das Suchfeld Text mit dem JEI Filter und den JEI Filter mit dem Suchfeld Text.", + "gui.refinedstorage2.grid.resource_type": "Ressourcentyp", + "gui.refinedstorage2.grid.resource_type.all": "Alle", + "gui.refinedstorage2.grid.resource_type.help": "Spezifische Ressourcentypen filtern.", + "gui.refinedstorage2.crafting_grid.move.network": "Items ins Netzwerk verschieben", + "gui.refinedstorage2.crafting_grid.move.inventory": "Items ins Inventar verschieben", + "gui.refinedstorage2.detector.mode": "Modus", + "gui.refinedstorage2.detector.mode.under": "Redstone-Signal ausgeben, falls unter der Menge", + "gui.refinedstorage2.detector.mode.equal": "Redstone-Signal ausgeben, falls auf der Menge", + "gui.refinedstorage2.detector.mode.above": "Redstone-Signal ausgeben, falls über der Menge", + "gui.refinedstorage2.detector.filter_help": "Die Ressource, die im Speichernetzwerk erkannt werden sollte.", + "gui.refinedstorage2.destructor.pickup_items": "Items aufheben, statt abzubauen", + "gui.refinedstorage2.destructor.filter_help": "Die Blöcke, die in diesem Speicher zerstört werden sollen oder nicht, je nachdem, ob sich das Gerät in der Erlaubnisliste oder in der Sperrliste befindet.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Erlaube nur Blöcke in das Speichernetzwerk, die in den Filtern konfiguriert sind.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Erlaube keine Blöcke in das Speichernetzwerk, die in den Filtern konfiguriert sind.", + "gui.refinedstorage2.constructor.drop_items": "Items fallenlassen, anstatt Blöcke zu platzieren", + "gui.refinedstorage2.constructor.filter_help": "Die Ressourcen, die ins Speichernetzwerk platziert werden sollen.", + "gui.refinedstorage2.interface.filter_help": "Die Ressourcen, die ins Speichernetzwerk exportiert werden sollen.", + "gui.refinedstorage2.exporter.filter_help": "Die Ressourcen, die vom Speichernetzwerk exportiert werden sollen.", + "gui.refinedstorage2.importer.filter_help": "Die Ressourcen, die aus dem Zielinventar importiert werden können.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Erlaube nur Ressourcen in das Speichernetzwerk, die in den Filtern konfiguriert sind.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Erlaube keine Ressourcen in das Speichernetzwerk, die in den Filtern konfiguriert sind.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d Block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "Die anzuzeigende Ressource.", + "gui.refinedstorage2.redstone_mode": "Redstone-Modus", + "gui.refinedstorage2.redstone_mode.ignore": "Ignorieren", + "gui.refinedstorage2.redstone_mode.ignore.help": "Dieses Gerät ist immer aktiv, unabhängig von Redstone-Signal.", + "gui.refinedstorage2.redstone_mode.high": "Hoch", + "gui.refinedstorage2.redstone_mode.high.help": "Dieses Gerät ist nur mit einem Redstone-Signal aktiv.", + "gui.refinedstorage2.redstone_mode.low": "Niedrig", + "gui.refinedstorage2.redstone_mode.low.help": "Dieses Gerät ist nur ohne Redstone-Signal aktiv.", + "gui.refinedstorage2.scheduling_mode": "Planungsmodus", + "gui.refinedstorage2.scheduling_mode.default": "Standard", + "gui.refinedstorage2.scheduling_mode.default.help": "Den ersten verfügbaren Filter verwenden.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Rundlaufverfahren", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Verwenden Sie jeden Filter nacheinander.", + "gui.refinedstorage2.scheduling_mode.random": "Zufällig", + "gui.refinedstorage2.scheduling_mode.random.help": "Benutze einen zufälligen Filter.", + "gui.refinedstorage2.priority": "Priorität", + "gui.refinedstorage2.priority.storage_help": "Die Reihenfolge, in der das Speichernetzwerk Ressourcen einfügen oder extrahieren soll, das höchste zuerst.", + "gui.refinedstorage2.amount": "Anzahl", + "gui.refinedstorage2.amount.reset": "Zurücksetzen", + "gui.refinedstorage2.amount.set": "Setzen", + "gui.refinedstorage2.filter_mode": "Filtermodus", + "gui.refinedstorage2.filter_mode.allow": "Erlaubnisliste", + "gui.refinedstorage2.filter_mode.block": "Sperrliste", + "gui.refinedstorage2.fuzzy_mode": "Unscharfer Modus", + "gui.refinedstorage2.fuzzy_mode.on": "An", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Passen Sie die Filter exakt auf die Erlaubnis- oder Sperrliste an.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Passen Sie den Filter exakt an.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Passen Sie die Filter beim Extrahieren aus dem Speichernetzwerk genau an.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Passen Sie die Filter beim Extrahieren aus der Quelle genau an.", + "gui.refinedstorage2.fuzzy_mode.off": "Aus", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Passen Sie die Filter für die Erlaubnisliste oder die Sperrliste an, ohne NBT-Tags zu vergleichen.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Passen Sie den Filter an, ohne NBT-Tags zu vergleichen.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Passen Sie die Filter beim Extrahieren aus dem Speichernetzwerk an, ohne NBT-Tags zu vergleichen.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Passen Sie die Filter an, wenn Sie aus der Quelle extrahieren, ohne NBT-Tags zu vergleichen.", + "gui.refinedstorage2.access_mode": "Zugriffsmodus", + "gui.refinedstorage2.access_mode.insert_extract": "Importieren und exportieren", + "gui.refinedstorage2.access_mode.insert_extract.help": "Das Speichernetzwerk kann von diesem Speicher importieren oder exportieren.", + "gui.refinedstorage2.access_mode.insert": "Nur importieren", + "gui.refinedstorage2.access_mode.insert.help": "Das Speichernetzwerk kann nur in diesen Speicher importieren. Enthaltene Ressourcen werden weiterhin in der Konsole sichtbar sein.", + "gui.refinedstorage2.access_mode.extract": "Nur exportieren", + "gui.refinedstorage2.access_mode.extract.help": "Das Speichernetzwerk kann nur von diesem Speicher extrahieren.", + "gui.refinedstorage2.void_excess": "Überschüssige Ressourcen löschen", + "gui.refinedstorage2.void_excess.help": "Wenn der überschüssige Modus eingeschaltet ist und die Speicherung voll ist, akzeptiert er weiterhin Ressourcen, löscht sie jedoch.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Der überschüssige Modus funktioniert nur, wenn der Speicher im Erlaubnisliste Modus ist.", + "gui.refinedstorage2.upgrade_slot": "Leerer Upgrade-Slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Leerer Filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Linksklick für", + "gui.refinedstorage2.filter_slot.right_click_for": "Rechtsklick für", + "gui.refinedstorage2.filter_slot.click_to_clear": "Klicke zum Löschen", + "gui.refinedstorage2.regulator_upgrade.filter_help": "Die Ressource, die im Ziel reguliert werden sollte.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inaktiv", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Fehlende Netzwerkkarte", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d Block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unerreichbar", + "item.refinedstorage2.controller.help": "Stellt das Speichernetzwerk mit Energie zur Verfügung. Mehrere sind in einem einzigen Speichernetzwerk erlaubt.", + "item.refinedstorage2.creative_controller.help": "Stellt dem Speichernetzwerk eine unendliche Energiequelle zur Verfügung.", + "item.refinedstorage2.disk_drive.help": "Akzeptiert Speicherplatten, um dem Speichernetz Speicherplatz zur Verfügung zu stellen.", + "item.refinedstorage2.grid.help": "Ermöglicht die Interaktion mit dem Speichernetzwerk.", + "item.refinedstorage2.crafting_grid.help": "Ermöglicht die Interaktion mit dem Speichernetzwerk, mit Herstellungsfähigkeiten.", + "item.refinedstorage2.importer.help": "Importiert Ressourcen von einer externen Quelle in das Speichernetzwerk.", + "item.refinedstorage2.exporter.help": "Exportiert Ressourcen aus dem Speichernetzwerk an ein externes Ziel.", + "item.refinedstorage2.interface.help": "Funktioniert als die Kombination von Importierer und Exportierer.", + "item.refinedstorage2.external_storage.help": "Stellt dem Speichernetzwerk Speicher von einer externen Quelle zur Verfügung.", + "item.refinedstorage2.detector.help": "Sendet ein Redstone Signal, wenn das Speichernetzwerk eine Ressource enthält, die gleich über oder unter einer bestimmten Menge ist.", + "item.refinedstorage2.constructor.help": "Platziert Blöcke aus dem Speichernetzwerk in der Welt.", + "item.refinedstorage2.destructor.help": "Zerstört Blöcke aus der Welt und setzt sie in das Speichernetzwerk.", + "item.refinedstorage2.quartz_enriched_iron": "Quarz angereichertes Eisen", + "item.refinedstorage2.processor_binding": "Prozessor Rohmaterial", + "item.refinedstorage2.silicon": "Silikon", + "item.refinedstorage2.raw_basic_processor": "Basisrohprozessor", + "item.refinedstorage2.raw_improved_processor": "Verbesserter Rohprozessor", + "item.refinedstorage2.raw_advanced_processor": "Fortschrittlicher Rohprozessor", + "item.refinedstorage2.basic_processor": "Basisprozessor", + "item.refinedstorage2.improved_processor": "Verbesserter Prozessor", + "item.refinedstorage2.advanced_processor": "Fortschrittlicher Prozessor", + "item.refinedstorage2.1k_storage_part": "1k Speicherkern", + "item.refinedstorage2.4k_storage_part": "4k Speicherkern", + "item.refinedstorage2.16k_storage_part": "16k Speicherkern", + "item.refinedstorage2.64k_storage_part": "64k Speicherkern", + "item.refinedstorage2.1k_storage_disk": "1k Speicherplatte", + "item.refinedstorage2.4k_storage_disk": "4k Speicherplatte", + "item.refinedstorage2.16k_storage_disk": "16k Speicherplatte", + "item.refinedstorage2.64k_storage_disk": "64k Speicherplatte", + "item.refinedstorage2.creative_storage_disk": "Kreative Speicherplatte", + "item.refinedstorage2.64b_fluid_storage_part": "64B Flüssigspeicherkern", + "item.refinedstorage2.256b_fluid_storage_part": "256B Flüssigspeicherkern", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Flüssigspeicherkern", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Flüssigspeicherkern", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Flüssigspeicherplatte", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Flüssigspeicherplatte", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Flüssigspeicherplatte", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Flüssigspeicherplatte", + "item.refinedstorage2.creative_fluid_storage_disk": "Kreative Flüssigspeicherplatte", + "item.refinedstorage2.storage_housing": "Speichergehäuse", + "item.refinedstorage2.construction_core": "Konstruktionskern", + "item.refinedstorage2.destruction_core": "Zerstörungskern", + "item.refinedstorage2.wrench": "Schraubenschlüssel", + "item.refinedstorage2.wrench.helper": "Verwende es, um Blöcke zu drehen oder drücke SHIFT und baue Refined Storage Blöcke ab.", "item.refinedstorage2.upgrade": "Upgrade", - "item.refinedstorage2.speed_upgrade": "Speed Upgrade", - "item.refinedstorage2.stack_upgrade": "Stack Upgrade", - "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", - "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", - "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", - "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.speed_upgrade": "Geschwindigkeitsupgrade", + "item.refinedstorage2.stack_upgrade": "Stapelupgrade", + "item.refinedstorage2.silk_touch_upgrade": "Behutsamkeitsupgrade", + "item.refinedstorage2.fortune_upgrade.1": "Glück I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Glück II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Glück III Upgrade", "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", - "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", - "item.refinedstorage2.range_upgrade": "Range Upgrade", - "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", - "item.refinedstorage2.wireless_grid": "Wireless Grid", - "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", - "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", - "item.refinedstorage2.network_item.unbound": "Unbound.", - "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", - "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", - "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", - "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", - "item.refinedstorage2.configuration_card": "Configuration Card", - "item.refinedstorage2.configuration_card.empty": "Empty.", - "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", - "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", - "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", - "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", - "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", - "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", - "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", - "item.refinedstorage2.network_card": "Network Card", - "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", - "item.refinedstorage2.network_card.unbound": "Unbound.", - "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", - "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", - "misc.refinedstorage2.stored": "Stored: %s", - "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", - "misc.refinedstorage2.total": "%d total", - "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", - "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", - "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", - "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", - "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", - "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", - "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", - "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", - "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", - "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", - "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", - "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", - "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "item.refinedstorage2.regulator_upgrade.help": "In einem Exportierer wird nur dann exportiert, wenn der Betrag im Ziel geringer als im Upgrade konfiguriert ist. In einem Importierer wird nur importiert, wenn der Betrag im Ziel mehr als im Upgrade konfiguriert ist. Benutzen Sie das Item zur Konfiguration.", + "item.refinedstorage2.range_upgrade": "Reichweitenupgrade", + "item.refinedstorage2.creative_range_upgrade": "Kreativer Reichweitenupgrade", + "item.refinedstorage2.wireless_grid": "Drahtlose Konsole", + "item.refinedstorage2.creative_wireless_grid": "Kreative drahtlose Konsole", + "item.refinedstorage2.wireless_transmitter.help": "Stellt drahtlosen Netzwerkzugang für Items wie die drahtlose Konsole zur Verfügung. Mehrere sind in einem Bereich für eine breitere Abdeckung erlaubt.", + "item.refinedstorage2.network_item.unbound": "Ungebunden.", + "item.refinedstorage2.network_item.unbound.help": "Auf irgendeinem Speichernetzwerk verwenden, um es zu verbinden.", + "item.refinedstorage2.network_item.bound_to": "Verbunden zu %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "Es gibt mehr als ein %s in deinem Inventar.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "Es gibt keine %s in deinem Inventar.", + "item.refinedstorage2.configuration_card": "Konfigurationskarte", + "item.refinedstorage2.configuration_card.empty": "Leer.", + "item.refinedstorage2.configuration_card.configured": "Enthält Konfiguration für %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Konfiguration für %s kopiert.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Konfiguration geleert.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Konfigurationskarte kann nicht auf andere Gerätetypen angewendet werden. Sie ist für %s konfiguriert.", + "item.refinedstorage2.configuration_card.applied_configuration": "Konfiguration angewandt.", + "item.refinedstorage2.configuration_card.empty_help": "Benutzen auf einem Speichernetzwerkgerät während Sie schleichen um die Konfigurationen und Upgrades auf die Karte zu kopieren.", + "item.refinedstorage2.configuration_card.configured_help": "Benutzen auf dem Ziel Speichernetzwerk während Sie Schleichen um die Konfigurationen und Upgrades zu übertragen. Zum Leeren beim Schleichen verwenden.", + "item.refinedstorage2.network_card": "Netzwerkkarte", + "item.refinedstorage2.network_card.unbound_help": "Verwende beim Schleichen auf einem Netzwerk-Empfänger.", + "item.refinedstorage2.network_card.unbound": "Ungebunden.", + "item.refinedstorage2.network_card.bound_help": "Einfügen in einen Netzwerksender. Benutzen beim Schleichen um die Verbindung zu löschen.", + "item.refinedstorage2.network_card.bound": "Verbunden zu %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Gespeichert: %s", + "misc.refinedstorage2.stored_with_capacity": "Gespeichert: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d Gesamt", + "misc.refinedstorage2.last_modified.just_now": "Zuletzt geändert von %s", + "misc.refinedstorage2.last_modified.second": "Zuletzt vor %d Sekunde von %s geändert", + "misc.refinedstorage2.last_modified.seconds": "Zuletzt vor %d Sekunden von %s geändert", + "misc.refinedstorage2.last_modified.minute": "Zuletzt vor %d Minute von %s geändert", + "misc.refinedstorage2.last_modified.minutes": "Zuletzt vor %d Minuten von %s geändert", + "misc.refinedstorage2.last_modified.hour": "Zuletzt vor %d Stunde von %s geändert", + "misc.refinedstorage2.last_modified.hours": "Zuletzt vor %d Stunden von %s geändert", + "misc.refinedstorage2.last_modified.day": "Zuletzt vor %d Tag von %s geändert", + "misc.refinedstorage2.last_modified.days": "Zuletzt vor %d Tagen von %s geändert", + "misc.refinedstorage2.last_modified.week": "Zuletzt vor %d Woche von %s geändert", + "misc.refinedstorage2.last_modified.weeks": "Zuletzt vor %d Wochen von %s geändert", + "misc.refinedstorage2.last_modified.year": "Zuletzt vor %d Jahr von %s geändert", + "misc.refinedstorage2.last_modified.years": "Zuletzt vor %d Jahren von %s geändert", "misc.refinedstorage2.resource_type.item": "Item", - "misc.refinedstorage2.resource_type.fluid": "Fluid", - "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", - "key.refinedstorage2.focus_search_bar": "Focus search bar", - "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", - "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", - "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", - "refinedstorage2.subtitle.wrench": "Wrench used", + "misc.refinedstorage2.resource_type.fluid": "Flüssigkeit", + "misc.refinedstorage2.press_shift_for_help": "Drücke SHIFT für Hilfe", + "key.refinedstorage2.focus_search_bar": "Suchleiste Selektieren", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Werkbank in der Konsole zum Netzwerk leeren", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Werkbank in der Konsole zum Inventar leeren", + "key.refinedstorage2.open_wireless_grid": "Drahtlose Konsole öffnen", + "refinedstorage2.subtitle.wrench": "Schraubenschlüssel benutzt", "category.refinedstorage2.key_bindings": "Refined Storage 2", "curios.identifier.refinedstorage2": "Refined Storage 2", "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", "text.autoconfig.refinedstorage2.title": "Refined Storage 2", - "text.autoconfig.refinedstorage2.option.grid": "Grid", - "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", - "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", - "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", - "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", - "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", - "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", - "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", - "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", - "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", - "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", - "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", - "text.autoconfig.refinedstorage2.option.grid.size": "Size", - "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", - "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", - "text.autoconfig.refinedstorage2.option.controller": "Controller", - "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", - "text.autoconfig.refinedstorage2.option.cable": "Cable", - "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", - "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", - "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", - "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", - "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", - "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", - "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", - "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", - "text.autoconfig.refinedstorage2.option.importer": "Importer", - "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.exporter": "Exporter", - "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.detector": "Detector", - "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.constructor": "Constructor", - "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.destructor": "Destructor", - "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid": "Konsole", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Große Schriftart", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximale Anzahl von Zeilen wenn gestreckt", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Sortierung verhindern während SHIFT gedrückt ist", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detaillierte Kurzinfo", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Suchabfrage merken", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Sanftes Scrollen", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Autoselektieres Suchfeld", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronisator", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Ressourcentyp", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sortierrichtung", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sortierart", + "text.autoconfig.refinedstorage2.option.grid.size": "Größe", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Herstellungskonsole", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Werkbank Schließverhalten", + "text.autoconfig.refinedstorage2.option.controller": "Kontrollblock", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energiekapazität", + "text.autoconfig.refinedstorage2.option.cable": "Kabel", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.diskDrive": "Laufwerk", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energieverbrauch pro Festplatte", + "text.autoconfig.refinedstorage2.option.storageBlock": "Speicherblock", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1k Energieverbrauch", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4k Energieverbrauch", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16k Energieverbrauch", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64k Energieverbrauch", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Kreativer Energieverbrauch", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Flüssigspeicherblock", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B Energieverbrauch", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B Energieverbrauch", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B Energieverbrauch", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B Energieverbrauch", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Kreativer Energieverbrauch", + "text.autoconfig.refinedstorage2.option.importer": "Importierer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.exporter": "Exportierer", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.detector": "Detektor", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.constructor": "Konstruktor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.destructor": "Destruktor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energieverbrauch", "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", - "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", - "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", - "text.autoconfig.refinedstorage2.option.iface": "Interface", - "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", - "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", - "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", - "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", - "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", - "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", - "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", - "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", - "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", - "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", - "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", - "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", - "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", - "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", - "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", - "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", - "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", - "advancements.refinedstorage2.connecting": "Connecting", - "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", - "advancements.refinedstorage2.drives": "Drives", - "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", - "advancements.refinedstorage2.storing_items": "Storing items", - "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", - "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", - "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", - "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", - "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", - "advancements.refinedstorage2.storing_fluids": "Storing fluids", - "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", - "advancements.refinedstorage2.importing": "Importing", - "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", - "advancements.refinedstorage2.exporting": "Exporting", - "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", - "advancements.refinedstorage2.upgrading": "Upgrading", - "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", - "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", - "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", - "advancements.refinedstorage2.storing_externally": "Storing externally", - "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", - "advancements.refinedstorage2.detecting": "Detecting", - "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", - "advancements.refinedstorage2.construction": "Construction", - "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", - "advancements.refinedstorage2.destruction": "Destruction", - "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", - "advancements.refinedstorage2.wireless": "Wireless", - "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", - "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", - "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", - "advancements.refinedstorage2.no_cables_required": "No cables required", - "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", - "advancements.refinedstorage2.portable_storage": "Portable storage", - "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Energieverbrauch von Geschwindigkeitsupgrade", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Energieverbrauch vom Stapelupgrade", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Energieverbrauch vom Glück 1 Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Energieverbrauch vom Glück 2 Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Energieverbrauch vom Glück 3 Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Energieverbrauch vom Behutsamkeitsupgrade", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Energieverbrauch vom Regulator Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Energieverbrauch vom Reichweitenupgrade", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Energieverbrauch vom Kreativen Reichweitenupgrade", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Reichweite vom Reichweitenupgrade", + "text.autoconfig.refinedstorage2.option.iface": "Schnittstelle", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.externalStorage": "Externer Speicher", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Drahtlose Konsole", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energiekapazität", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Energieverbrauch beim Öffnen", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Energieverbrauch beim Importieren", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Energieverbrauch beim Exportieren", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Funksender", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Basisreichweite", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Speichermonitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Netzwerkempfänger", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Netzwerksender", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energieverbrauch", + "text.autoconfig.refinedstorage2.option.portableGrid": "Mobile Konsole", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energiekapazität", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Energieverbrauch beim Öffnen", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Energieverbrauch beim Importieren", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Energieverbrauch beim Exportieren", + "advancements.refinedstorage2.root.description": "Verwenden Sie einen oder mehrere Konsolen in einem Netzwerk, um Ihr Netzwerk mit Energie zu versorgen", + "advancements.refinedstorage2.connecting": "Verbinden", + "advancements.refinedstorage2.connecting.description": "Benutze Kabel um Geräte miteinander zu verbinden, oder platziere Geräte nebeneinander", + "advancements.refinedstorage2.drives": "Festplatten", + "advancements.refinedstorage2.drives.description": "Erstellen Sie ein Laufwerk, um Ihre Speicherplatten einsetzen zu können", + "advancements.refinedstorage2.storing_items": "Items speichern", + "advancements.refinedstorage2.storing_items.description": "Erstelle eine Speicherplatte und stecke sie in dein Laufwerk", + "advancements.refinedstorage2.viewing_your_storage": "Ihren Speicher anzeigen", + "advancements.refinedstorage2.viewing_your_storage.description": "Stelle eine Konsole her, um mit deinem Speicher zu interagieren", + "advancements.refinedstorage2.upgrading_your_grid": "Konsole verbessern", + "advancements.refinedstorage2.upgrading_your_grid.description": "Verbessere deine Konsole zu einem Handwerksraster, um eine Werkbank zu erhalten", + "advancements.refinedstorage2.storing_fluids": "Flüssigkeiten speichern", + "advancements.refinedstorage2.storing_fluids.description": "Erstelle eine Flüssigspeicherplatte und stecke sie in dein Laufwerk", + "advancements.refinedstorage2.importing": "Importieren", + "advancements.refinedstorage2.importing.description": "Holen Sie sich Ressourcen in das Speichernetzwerk mit einem Importierer", + "advancements.refinedstorage2.exporting": "Exportieren", + "advancements.refinedstorage2.exporting.description": "Holen Sie Ressourcen aus dem Speichernetzwerk mit einem Exportierer", + "advancements.refinedstorage2.upgrading": "Verbessern", + "advancements.refinedstorage2.upgrading.description": "Bau ein Upgrade um verschiedene Geräte zu verbessern", + "advancements.refinedstorage2.interface_to_the_world": "Schnittstelle zur Welt", + "advancements.refinedstorage2.interface_to_the_world.description": "Exportieren und Importieren von Items gleichzeitig mit einer Schnittstelle", + "advancements.refinedstorage2.storing_externally": "Extern speichern", + "advancements.refinedstorage2.storing_externally.description": "Verwenden Sie einen externen Speicher um dem Netzwerk Speicher von einem externen Block wie einer Truhe zur Verfügung zu stellen", + "advancements.refinedstorage2.detecting": "Erkennung", + "advancements.refinedstorage2.detecting.description": "Verwende Redstone um Ressourcen im Netzwerk zu überprüfen", + "advancements.refinedstorage2.construction": "Konstruktion", + "advancements.refinedstorage2.construction.description": "Erhalte Blöcke aus dem Speichernetzwerk in die Welt mit einem Konstruktor", + "advancements.refinedstorage2.destruction": "Zerstörung", + "advancements.refinedstorage2.destruction.description": "Erhalte Blöcke aus der Welt in das Speichernetzwerk mit einem Destruktor", + "advancements.refinedstorage2.wireless": "Drahtlos", + "advancements.refinedstorage2.wireless.description": "Greifen Sie drahtlos auf Ihre Ressourcen mit einer drahtlosen Konsole zu.", + "advancements.refinedstorage2.better_than_a_barrel": "Besser als ein Fass", + "advancements.refinedstorage2.better_than_a_barrel.description": "Stelle einen Speichermonitor her, um Ressourcen in einem Speichernetzwerk anzuzeigen, zu importieren oder zu exportieren", + "advancements.refinedstorage2.no_cables_required": "Keine Kabel erforderlich", + "advancements.refinedstorage2.no_cables_required.description": "Fügen Sie Ihrem Netzwerk zusätzliche Komponenten hinzu, ohne Kabel zu verwenden, indem Sie einen Netzwerkübermittler, Netzwerkempfänger und Netzwerkkarte verwenden", + "advancements.refinedstorage2.portable_storage": "Tragbarer Speicher", + "advancements.refinedstorage2.portable_storage.description": "Erstelle eine mobile Konsole um auf den Inhalt von Speicherplatten zuzugreifen, ohne ein Speichernetzwerk zu benötigen" } From d468362a5ea5817563494aac8b2e3365f173006d Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:30 +0100 Subject: [PATCH 16/59] chore: update translation Italian from crowdin --- .../assets/refinedstorage2/lang/it_it.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/it_it.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/it_it.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/it_it.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/it_it.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 9f857777de8c8dd9bc4b300b0f9407fc128e4955 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:31 +0100 Subject: [PATCH 17/59] chore: update translation Japanese from crowdin --- .../assets/refinedstorage2/lang/ja_jp.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ja_jp.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ja_jp.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ja_jp.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ja_jp.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 128cf80d57e8befb3b92f6c279389d9dbfe09eec Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:32 +0100 Subject: [PATCH 18/59] chore: update translation Korean from crowdin --- .../assets/refinedstorage2/lang/ko_kr.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ko_kr.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ko_kr.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ko_kr.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/ko_kr.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From fd4a30d176d64b9c07a58cfd5df358e5017e7abf Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:33 +0100 Subject: [PATCH 19/59] chore: update translation Dutch from crowdin --- .../assets/refinedstorage2/lang/nl_nl.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/nl_nl.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/nl_nl.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/nl_nl.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/nl_nl.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From c7b2891cb4e04257827210968d650e340fa5f886 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:34 +0100 Subject: [PATCH 20/59] chore: update translation Chinese Traditional from crowdin --- .../assets/refinedstorage2/lang/zh_tw.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_tw.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_tw.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_tw.json new file mode 100644 index 000000000..0e58472c8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/zh_tw.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Cable", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Disk Drive", + "block.refinedstorage2.machine_casing": "Machine Casing", + "block.refinedstorage2.grid": "Grid", + "block.refinedstorage2.crafting_grid": "Crafting Grid", + "block.refinedstorage2.controller": "Controller", + "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", + "block.refinedstorage2.creative_controller": "Creative Controller", + "block.refinedstorage2.1k_storage_block": "1K Storage Block", + "block.refinedstorage2.4k_storage_block": "4K Storage Block", + "block.refinedstorage2.16k_storage_block": "16K Storage Block", + "block.refinedstorage2.64k_storage_block": "64K Storage Block", + "block.refinedstorage2.creative_storage_block": "Creative Storage Block", + "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", + "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", + "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", + "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", + "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.importer": "Importer", + "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.interface": "Interface", + "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.detector": "Detector", + "block.refinedstorage2.constructor": "Constructor", + "block.refinedstorage2.destructor": "Destructor", + "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", + "block.refinedstorage2.storage_monitor": "Storage Monitor", + "block.refinedstorage2.network_receiver": "Network Receiver", + "block.refinedstorage2.network_transmitter": "Network Transmitter", + "block.refinedstorage2.portable_grid": "Portable Grid", + "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", + "gui.refinedstorage2.disk_drive.disks": "Disks", + "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", + "gui.refinedstorage2.grid.sorting.type": "Sorting type", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", + "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", + "gui.refinedstorage2.grid.size": "Size", + "gui.refinedstorage2.grid.size.stretch": "Stretch", + "gui.refinedstorage2.grid.size.small": "Small", + "gui.refinedstorage2.grid.size.medium": "Medium", + "gui.refinedstorage2.grid.size.large": "Large", + "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", + "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", + "gui.refinedstorage2.grid.synchronizer.off": "Off", + "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.resource_type": "Resource type", + "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", + "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", + "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", + "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", + "gui.refinedstorage2.redstone_mode": "Redstone mode", + "gui.refinedstorage2.redstone_mode.ignore": "Ignore", + "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", + "gui.refinedstorage2.redstone_mode.high": "High", + "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", + "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Default", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Random", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Priority", + "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", + "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.amount.reset": "Reset", + "gui.refinedstorage2.amount.set": "Set", + "gui.refinedstorage2.filter_mode": "Filter mode", + "gui.refinedstorage2.filter_mode.allow": "Allowlist", + "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "On", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Match the filters when extracting from the source exactly.", + "gui.refinedstorage2.fuzzy_mode.off": "Off", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Access mode", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Empty upgrade slot", + "gui.refinedstorage2.filter_slot.empty_filter": "Empty filter", + "gui.refinedstorage2.filter_slot.left_click_for": "Left click for", + "gui.refinedstorage2.filter_slot.right_click_for": "Right click for", + "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", + "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", + "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Processor Binding", + "item.refinedstorage2.silicon": "Silicon", + "item.refinedstorage2.raw_basic_processor": "Raw Basic Processor", + "item.refinedstorage2.raw_improved_processor": "Raw Improved Processor", + "item.refinedstorage2.raw_advanced_processor": "Raw Advanced Processor", + "item.refinedstorage2.basic_processor": "Basic Processor", + "item.refinedstorage2.improved_processor": "Improved Processor", + "item.refinedstorage2.advanced_processor": "Advanced Processor", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Speed Upgrade", + "item.refinedstorage2.stack_upgrade": "Stack Upgrade", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Range Upgrade", + "item.refinedstorage2.creative_range_upgrade": "Creative Range Upgrade", + "item.refinedstorage2.wireless_grid": "Wireless Grid", + "item.refinedstorage2.creative_wireless_grid": "Creative Wireless Grid", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Unbound.", + "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", + "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card.empty": "Empty.", + "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", + "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Use while crouching on a Network Receiver.", + "item.refinedstorage2.network_card.unbound": "Unbound.", + "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", + "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "misc.refinedstorage2.stored": "Stored: %s", + "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", + "misc.refinedstorage2.total": "%d total", + "misc.refinedstorage2.last_modified.just_now": "Last modified just now by %s", + "misc.refinedstorage2.last_modified.second": "Last modified %d second ago by %s", + "misc.refinedstorage2.last_modified.seconds": "Last modified %d seconds ago by %s", + "misc.refinedstorage2.last_modified.minute": "Last modified %d minute ago by %s", + "misc.refinedstorage2.last_modified.minutes": "Last modified %d minutes ago by %s", + "misc.refinedstorage2.last_modified.hour": "Last modified %d hour ago by %s", + "misc.refinedstorage2.last_modified.hours": "Last modified %d hours ago by %s", + "misc.refinedstorage2.last_modified.day": "Last modified %d day ago by %s", + "misc.refinedstorage2.last_modified.days": "Last modified %d days ago by %s", + "misc.refinedstorage2.last_modified.week": "Last modified %d week ago by %s", + "misc.refinedstorage2.last_modified.weeks": "Last modified %d weeks ago by %s", + "misc.refinedstorage2.last_modified.year": "Last modified %d year ago by %s", + "misc.refinedstorage2.last_modified.years": "Last modified %d years ago by %s", + "misc.refinedstorage2.resource_type.item": "Item", + "misc.refinedstorage2.resource_type.fluid": "Fluid", + "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Wrench used", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", + "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Controller", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.cable": "Cable", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive": "Disk Drive", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Energy usage per disk", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "1K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "4K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Stack Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Fortune 1 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Fortune 2 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Fortune 3 Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Silk Touch Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Regulator Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Creative Range Upgrade energy usage", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", + "text.autoconfig.refinedstorage2.option.iface": "Interface", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 6249bbbe7896a23494c15fff884433e814c2ea80 Mon Sep 17 00:00:00 2001 From: Raoul Date: Sun, 17 Mar 2024 15:39:34 +0100 Subject: [PATCH 21/59] chore: update translation Indonesian from crowdin --- .../assets/refinedstorage2/lang/id_id.json | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json new file mode 100644 index 000000000..51e48da2d --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json @@ -0,0 +1,367 @@ +{ + "itemGroup.refinedstorage2.general": "Refined Storage 2", + "block.refinedstorage2.cable": "Kabel", + "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.disk_drive": "Lemari Cakram", + "block.refinedstorage2.machine_casing": "Kerangka Mesin", + "block.refinedstorage2.grid": "Kisi", + "block.refinedstorage2.crafting_grid": "Kisi Kerajinan", + "block.refinedstorage2.controller": "Pengendali", + "block.refinedstorage2.controller.rei_fully_charged": "Pengendali terisi penuh", + "block.refinedstorage2.creative_controller": "Pengendali Kreatif", + "block.refinedstorage2.1k_storage_block": "Balok Penyimpanan 1K", + "block.refinedstorage2.4k_storage_block": "Balok Penyimpanan 4K", + "block.refinedstorage2.16k_storage_block": "Balok Penyimpanan 16K", + "block.refinedstorage2.64k_storage_block": "Balok Penyimpanan 64K", + "block.refinedstorage2.creative_storage_block": "Balok Penyimpanan Kreatif", + "block.refinedstorage2.64b_fluid_storage_block": "Balok Penyimpan Cairan 64B", + "block.refinedstorage2.256b_fluid_storage_block": "Balok Penyimpan Cairan 256B", + "block.refinedstorage2.1024b_fluid_storage_block": "Balok Penyimpan Cairan 1024B", + "block.refinedstorage2.4096b_fluid_storage_block": "Balok Penyimpan Cairan 4096B", + "block.refinedstorage2.creative_fluid_storage_block": "Balok Penyimpan Cairan Kreatif", + "block.refinedstorage2.importer": "Importir", + "block.refinedstorage2.exporter": "Eksportir", + "block.refinedstorage2.interface": "Antarmuka", + "block.refinedstorage2.external_storage": "Penyimpanan Eksternal", + "block.refinedstorage2.detector": "Pendeteksi", + "block.refinedstorage2.constructor": "Pembangun", + "block.refinedstorage2.destructor": "Penghancur", + "block.refinedstorage2.wireless_transmitter": "Pemancar Nirkabel", + "block.refinedstorage2.storage_monitor": "Monitor Penyimpanan", + "block.refinedstorage2.network_receiver": "Penerima Jaringan", + "block.refinedstorage2.network_transmitter": "Pemancar Jaringan", + "block.refinedstorage2.portable_grid": "Kisi Portabel", + "block.refinedstorage2.creative_portable_grid": "Kisi Portabel Kreatif", + "gui.refinedstorage2.controller.redstone_mode_help": "Ketika peranagkat ini nonaktif, jaringan penyimpanan tidak dapat menggunakan perangkat ini sebagai sumber energi.", + "gui.refinedstorage2.disk_drive.disks": "Cakram", + "gui.refinedstorage2.storage.redstone_mode_help": "Ketika perangkat ini nonaktif, penyimpanan akan tidak dapat diakses dari dalam jaringan penyimpanan.", + "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.grid.sorting.direction": "Arah Pengurutan", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Menaik", + "gui.refinedstorage2.grid.sorting.direction.descending": "Menurun", + "gui.refinedstorage2.grid.sorting.type": "Jenis pengurutan", + "gui.refinedstorage2.grid.sorting.type.quantity": "Kuantitas", + "gui.refinedstorage2.grid.sorting.type.name": "Nama", + "gui.refinedstorage2.grid.sorting.type.id": "ID", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Terakhir dirubah", + "gui.refinedstorage2.grid.size": "Ukuran", + "gui.refinedstorage2.grid.size.stretch": "Regang", + "gui.refinedstorage2.grid.size.small": "Kecil", + "gui.refinedstorage2.grid.size.medium": "Sedang", + "gui.refinedstorage2.grid.size.large": "Besar", + "gui.refinedstorage2.grid.size.extra_large": "Ekstra Besar", + "gui.refinedstorage2.grid.auto_selected": "Pilih otomatis", + "gui.refinedstorage2.grid.auto_selected.help": "Memilih kotak pencarian secara otomatis saat membuka Kisi.", + "gui.refinedstorage2.grid.synchronizer": "Mode sinkronisasi", + "gui.refinedstorage2.grid.synchronizer.off": "Nonaktif", + "gui.refinedstorage2.grid.synchronizer.off.help": "Jangan sinkronkan teks kotak pencarian.", + "gui.refinedstorage2.grid.synchronizer.jei": "JEI", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Sinkronkan teks kotak pencarian ke filter JEI.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI dua arah", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sinkronkan teks kotak pencarian ke filter JEI, dan filter JEI ke teks kotak pencarian.", + "gui.refinedstorage2.grid.synchronizer.rei": "REI", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Sinkronkan teks kotak pencarian ke filter REI.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI dua arah", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sinkronkan teks kotak pencarian ke filter JEI, dan filter JEI ke teks kotak pencarian.", + "gui.refinedstorage2.grid.resource_type": "Jenis sumber daya", + "gui.refinedstorage2.grid.resource_type.all": "Semua", + "gui.refinedstorage2.grid.resource_type.help": "Filter jenis sumber daya tertentu.", + "gui.refinedstorage2.crafting_grid.move.network": "Pindahkan barang ke jaringan", + "gui.refinedstorage2.crafting_grid.move.inventory": "Pindahkan barang ke inventaris", + "gui.refinedstorage2.detector.mode": "Mode", + "gui.refinedstorage2.detector.mode.under": "Pancarkan sinyal redstone saat berada di bawah jumlah", + "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", + "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", + "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", + "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", + "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", + "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", + "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", + "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", + "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d blok", + "gui.refinedstorage2.storage_monitor.filter_help": "Sumber daya untuk ditampilkan.", + "gui.refinedstorage2.redstone_mode": "Mode redstone", + "gui.refinedstorage2.redstone_mode.ignore": "Abaikan", + "gui.refinedstorage2.redstone_mode.ignore.help": "Perangkat ini akan selalu aktif, menghiraukan sinyal redstone.", + "gui.refinedstorage2.redstone_mode.high": "Tinggi", + "gui.refinedstorage2.redstone_mode.high.help": "Perangkat ini hanya akan aktif dengan sinyal redstone.", + "gui.refinedstorage2.redstone_mode.low": "Rendah", + "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", + "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.scheduling_mode.default": "Bawaan", + "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.random": "Acak", + "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.priority": "Prioritas", + "gui.refinedstorage2.priority.storage_help": "Urutan dimana jaringan penyimpanan akan memasukkan atau mengeluarkan sumber daya, mulai dari yang tertinggi.", + "gui.refinedstorage2.amount": "Jumlah", + "gui.refinedstorage2.amount.reset": "Atur Ulang", + "gui.refinedstorage2.amount.set": "Atur", + "gui.refinedstorage2.filter_mode": "Mode Filter", + "gui.refinedstorage2.filter_mode.allow": "Diperbolehkan", + "gui.refinedstorage2.filter_mode.block": "Dilarang", + "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.fuzzy_mode.on": "Hidup", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Sesuaikan filter ketika mengekstrak dari sumber.", + "gui.refinedstorage2.fuzzy_mode.off": "Nonaktif", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.access_mode": "Modus akses", + "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", + "gui.refinedstorage2.access_mode.insert": "Insert only", + "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", + "gui.refinedstorage2.access_mode.extract": "Extract only", + "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", + "gui.refinedstorage2.void_excess": "Void excess resources", + "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.upgrade_slot": "Slot peningkatan kosong", + "gui.refinedstorage2.filter_slot.empty_filter": "Filter kosong", + "gui.refinedstorage2.filter_slot.left_click_for": "Klik kiri untuk", + "gui.refinedstorage2.filter_slot.right_click_for": "Klik kanan untuk", + "gui.refinedstorage2.filter_slot.click_to_clear": "Klik untuk membersihkan", + "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.network_transmitter.status.inactive": "Tidak aktif", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Kartu Jaringan Tidak Ditemukan", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d blok", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Tidak dapat diraih", + "item.refinedstorage2.controller.help": "Menyediakan energi ke jaringan penyimpanan. dapat digunakan beberapa kali dalam satu jaringan penyimpanan.", + "item.refinedstorage2.creative_controller.help": "Menyediakan energi tidak terbatas ke jaringan penyimpanan.", + "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.grid.help": "Memungkinkan untuk mengakses jaringan penyimpanan.", + "item.refinedstorage2.crafting_grid.help": "Memungkinkan untuk mengakses jaringan penyimpanan, dengan kemampuan untuk merakit.", + "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", + "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", + "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", + "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", + "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", + "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.processor_binding": "Pengikat Prosesor", + "item.refinedstorage2.silicon": "Silikon", + "item.refinedstorage2.raw_basic_processor": "Procesor Dasar Mentah", + "item.refinedstorage2.raw_improved_processor": "Prosesor Ditingkatkan Mentah", + "item.refinedstorage2.raw_advanced_processor": "Prosesor Canggih Mentah", + "item.refinedstorage2.basic_processor": "Procesor Dasar", + "item.refinedstorage2.improved_processor": "Prosesor Ditingkatkan", + "item.refinedstorage2.advanced_processor": "Prosesor Canggih", + "item.refinedstorage2.1k_storage_part": "1K Storage Part", + "item.refinedstorage2.4k_storage_part": "4K Storage Part", + "item.refinedstorage2.16k_storage_part": "16K Storage Part", + "item.refinedstorage2.64k_storage_part": "64K Storage Part", + "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", + "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", + "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", + "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", + "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", + "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", + "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", + "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", + "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", + "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", + "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", + "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", + "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", + "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", + "item.refinedstorage2.storage_housing": "Storage Housing", + "item.refinedstorage2.construction_core": "Construction Core", + "item.refinedstorage2.destruction_core": "Destruction Core", + "item.refinedstorage2.wrench": "Wrench", + "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", + "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.speed_upgrade": "Peningkatan Kecepatan", + "item.refinedstorage2.stack_upgrade": "Peningkatan Tumpukan", + "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", + "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", + "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", + "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", + "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", + "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.range_upgrade": "Peningkatan Jangkauan", + "item.refinedstorage2.creative_range_upgrade": "Peningkatan Jangkauan Kreatif", + "item.refinedstorage2.wireless_grid": "Kisi Nirkabel", + "item.refinedstorage2.creative_wireless_grid": "Kisi Nirkabel Kreatif", + "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.network_item.unbound": "Tidak terikat.", + "item.refinedstorage2.network_item.unbound.help": "Gunakan pada perangkat jaringan penyimpanan manapun untuk mengikat.", + "item.refinedstorage2.network_item.bound_to": "Terikat pada %d, %d, %d.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.configuration_card": "Kartu Konfigurasi", + "item.refinedstorage2.configuration_card.empty": "Kosong.", + "item.refinedstorage2.configuration_card.configured": "Berisi konfigurasi untuk %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Menyalin konfigurasi untuk %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Konfigurasi dibersihkan.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.empty_help": "Gunakan pada perangkat perangkat jaringan penyimpanan sambil berjongkok untuk menyalin konfigurasi dan peningkatannya kedalam kartu.", + "item.refinedstorage2.configuration_card.configured_help": "Gunakan pada perangkat jaringan penyimpanan tujuan sambil berjongkok untuk mengirimkan konfigurasi dan peningkatan. Gunakan sambil berjongkok untuk membersihkan.", + "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card.unbound_help": "Gunakan sambil berjongkok pada Penerima Jaringan.", + "item.refinedstorage2.network_card.unbound": "Tidak terikat.", + "item.refinedstorage2.network_card.bound_help": "Masukkan ke Pemancar Jaringan. Gunakan sambil berjongkok untuk membersihkan ikatan.", + "item.refinedstorage2.network_card.bound": "Terikat pada %d, %d, %d dalam %s.", + "misc.refinedstorage2.stored": "Tersimpan: %s", + "misc.refinedstorage2.stored_with_capacity": "Tersimpan: %s / %s (%d%%)", + "misc.refinedstorage2.total": "Total %d", + "misc.refinedstorage2.last_modified.just_now": "Baru saja dirubah oleh %s", + "misc.refinedstorage2.last_modified.second": "Terakhir dirubah %d detik yang lalu oleh %s", + "misc.refinedstorage2.last_modified.seconds": "Terakhir dirubah %d detik yang lalu oleh %s", + "misc.refinedstorage2.last_modified.minute": "Terakhir dirubah %d menit yang lalu oleh %s", + "misc.refinedstorage2.last_modified.minutes": "Terakhir dirubah %d menit yang lalu oleh %s", + "misc.refinedstorage2.last_modified.hour": "Terakhir dirubah %d jam yang lalu oleh %s", + "misc.refinedstorage2.last_modified.hours": "Terakhir dirubah %d jam yang lalu oleh %s", + "misc.refinedstorage2.last_modified.day": "Terakhir dirubah %d hari yang lalu oleh %s", + "misc.refinedstorage2.last_modified.days": "Terakhir dirubah %d hari yang lalu oleh %s", + "misc.refinedstorage2.last_modified.week": "Terakhir dirubah %d minggu yang lalu oleh %s", + "misc.refinedstorage2.last_modified.weeks": "Terakhir dirubah %d minggu yang lalu oleh %s", + "misc.refinedstorage2.last_modified.year": "Terakhir dirubah %d tahun yang lalu oleh %s", + "misc.refinedstorage2.last_modified.years": "Terakhir dirubah %d tahun yang lalu oleh %s", + "misc.refinedstorage2.resource_type.item": "Barang", + "misc.refinedstorage2.resource_type.fluid": "Cairan", + "misc.refinedstorage2.press_shift_for_help": "Tekan SHIFT untuk bantuan", + "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Singkirkan matriks Kisi Kerajinan ke jaringan", + "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Singkirkan matriks Kisi Kerajinan ke inventaris", + "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "refinedstorage2.subtitle.wrench": "Kunci inggris digunakan", + "category.refinedstorage2.key_bindings": "Refined Storage 2", + "curios.identifier.refinedstorage2": "Refined Storage 2", + "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid.largeFont": "Font besar", + "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Baris maksimum saat diregangkan", + "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Mencegah pengurutan ketika SHIFT ditekan", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Ingat permintaan pencarian", + "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Pengguliran mulus", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Arah Pengurutan", + "text.autoconfig.refinedstorage2.option.grid.sortingType": "Jenis pengurutan", + "text.autoconfig.refinedstorage2.option.grid.size": "Ukuran", + "text.autoconfig.refinedstorage2.option.craftingGrid": "Kisi Kerajinan", + "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.controller": "Pengendali", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Kapasitas energi", + "text.autoconfig.refinedstorage2.option.cable": "Kabel", + "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.diskDrive": "Lemari Cakram", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Pemakaian daya per cakram", + "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "Pemakaian energy 1K", + "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "Pemakaian daya 4K", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", + "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Pemakaian daya peningkat kecepatan", + "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Pemakaian daya peningkat tumpukan", + "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Pemakaian daya peningkat peruntungan 1", + "text.autoconfig.refinedstorage2.option.upgrade.fortune2UpgradeEnergyUsage": "Pemakaian daya peningkat peruntungan 2", + "text.autoconfig.refinedstorage2.option.upgrade.fortune3UpgradeEnergyUsage": "Pemakaian daya peningkat peruntungan 3", + "text.autoconfig.refinedstorage2.option.upgrade.silkTouchUpgradeEnergyUsage": "Pemakaian daya peningkat sentuhan sutra", + "text.autoconfig.refinedstorage2.option.upgrade.regulatorUpgradeEnergyUsage": "Pemakaian daya peningkat pengatur", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeEnergyUsage": "Pemakaian daya peningkat jangkauan", + "text.autoconfig.refinedstorage2.option.upgrade.creativeRangeUpgradeEnergyUsage": "Pemakaian daya peningkat jangkauan kreatif", + "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Rentang Peningkatan Jangkauan", + "text.autoconfig.refinedstorage2.option.iface": "Antarmuka", + "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.externalStorage": "Penyimpanan Eksternal", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Kisi Nirkabel", + "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Kapasitas energi", + "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Buka pemakaian daya", + "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Masukkan pemakaian daya", + "text.autoconfig.refinedstorage2.option.wirelessGrid.extractEnergyUsage": "Ekstrak pemakaian daya", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Pemancar Nirkabel", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Jangkauan Dasar", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Pemancar Jaringan", + "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Pemakaian daya", + "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Kapasitas energi", + "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Buka pemakaian daya", + "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Masukkan pemakaian daya", + "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Ekstrak pemakaian daya", + "advancements.refinedstorage2.root.description": "Gunakan satu atau beberapa Pengendali dalam jaringan untuk menyediakan energi kedalam jaringan anda", + "advancements.refinedstorage2.connecting": "Connecting", + "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", + "advancements.refinedstorage2.drives": "Drives", + "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", + "advancements.refinedstorage2.storing_items": "Storing items", + "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", + "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", + "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", + "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", + "advancements.refinedstorage2.storing_fluids": "Storing fluids", + "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", + "advancements.refinedstorage2.importing": "Importing", + "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", + "advancements.refinedstorage2.exporting": "Exporting", + "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", + "advancements.refinedstorage2.upgrading": "Upgrading", + "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", + "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", + "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", + "advancements.refinedstorage2.storing_externally": "Storing externally", + "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.detecting": "Detecting", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.construction": "Construction", + "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", + "advancements.refinedstorage2.destruction": "Destruction", + "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", + "advancements.refinedstorage2.wireless": "Wireless", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", + "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", + "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.no_cables_required.description": "Tambahkan komponen tambahan ke jaringan anda tanpa menggunakan kabel dengan menggunakan Pemancar Jaringan, Penerima Jaringan dan Kartu Jaringan", + "advancements.refinedstorage2.portable_storage": "Portable storage", + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" +} From 6f768d840b737c66a4a57b06b19494362ca1dc9a Mon Sep 17 00:00:00 2001 From: Raoul Date: Mon, 18 Mar 2024 15:44:41 +0100 Subject: [PATCH 22/59] chore: update translation Polish from crowdin --- .../src/main/resources/assets/refinedstorage2/lang/pl_pl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json index 0e58472c8..2a5ee438e 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json @@ -1,7 +1,7 @@ { "itemGroup.refinedstorage2.general": "Refined Storage 2", - "block.refinedstorage2.cable": "Cable", - "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.cable": "Kabel", + "block.refinedstorage2.quartz_enriched_iron_block": "Blok kwarcowego żelaza", "block.refinedstorage2.disk_drive": "Disk Drive", "block.refinedstorage2.machine_casing": "Machine Casing", "block.refinedstorage2.grid": "Grid", From 0f950d2f61f6f665dc2a7526c9912dff47770c2b Mon Sep 17 00:00:00 2001 From: Raoul Date: Mon, 18 Mar 2024 15:44:42 +0100 Subject: [PATCH 23/59] chore: update translation Portuguese, Brazilian from crowdin --- .../assets/refinedstorage2/lang/pt_br.json | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json index 0e58472c8..f62422275 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pt_br.json @@ -1,43 +1,43 @@ { "itemGroup.refinedstorage2.general": "Refined Storage 2", - "block.refinedstorage2.cable": "Cable", - "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", - "block.refinedstorage2.disk_drive": "Disk Drive", - "block.refinedstorage2.machine_casing": "Machine Casing", - "block.refinedstorage2.grid": "Grid", - "block.refinedstorage2.crafting_grid": "Crafting Grid", - "block.refinedstorage2.controller": "Controller", - "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", - "block.refinedstorage2.creative_controller": "Creative Controller", - "block.refinedstorage2.1k_storage_block": "1K Storage Block", - "block.refinedstorage2.4k_storage_block": "4K Storage Block", - "block.refinedstorage2.16k_storage_block": "16K Storage Block", - "block.refinedstorage2.64k_storage_block": "64K Storage Block", - "block.refinedstorage2.creative_storage_block": "Creative Storage Block", - "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", - "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", - "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", - "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", - "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", - "block.refinedstorage2.importer": "Importer", - "block.refinedstorage2.exporter": "Exporter", + "block.refinedstorage2.cable": "Cabo", + "block.refinedstorage2.quartz_enriched_iron_block": "Bloco de ferro com quartzo infundido", + "block.refinedstorage2.disk_drive": "Disco rígido", + "block.refinedstorage2.machine_casing": "Revestimento de máquina", + "block.refinedstorage2.grid": "Grade", + "block.refinedstorage2.crafting_grid": "Grade de Criação", + "block.refinedstorage2.controller": "Controlador", + "block.refinedstorage2.controller.rei_fully_charged": "Controlador com carga completa", + "block.refinedstorage2.creative_controller": "Controlador Criativo", + "block.refinedstorage2.1k_storage_block": "Bloco de armazenamento 1k", + "block.refinedstorage2.4k_storage_block": "Bloco de armazenamento 4K", + "block.refinedstorage2.16k_storage_block": "Bloco de armazenamento 16K", + "block.refinedstorage2.64k_storage_block": "Bloco de armazenamento 64K", + "block.refinedstorage2.creative_storage_block": "Bloco de armazenamento Criativo", + "block.refinedstorage2.64b_fluid_storage_block": "Bloco de Armazenamento de Fluido 64B", + "block.refinedstorage2.256b_fluid_storage_block": "Bloco de Armazenamento de Fluido 256B", + "block.refinedstorage2.1024b_fluid_storage_block": "Bloco de Armazenamento de Fluido 1024B", + "block.refinedstorage2.4096b_fluid_storage_block": "Bloco de armazenamento de fluido 4096B", + "block.refinedstorage2.creative_fluid_storage_block": "Bloco de armazenamento de fluido Criativo", + "block.refinedstorage2.importer": "Importador", + "block.refinedstorage2.exporter": "Exportador", "block.refinedstorage2.interface": "Interface", - "block.refinedstorage2.external_storage": "External Storage", + "block.refinedstorage2.external_storage": "Armazenamento Externo", "block.refinedstorage2.detector": "Detector", - "block.refinedstorage2.constructor": "Constructor", - "block.refinedstorage2.destructor": "Destructor", - "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", - "block.refinedstorage2.storage_monitor": "Storage Monitor", - "block.refinedstorage2.network_receiver": "Network Receiver", - "block.refinedstorage2.network_transmitter": "Network Transmitter", - "block.refinedstorage2.portable_grid": "Portable Grid", - "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", - "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", - "gui.refinedstorage2.disk_drive.disks": "Disks", - "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", - "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", - "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", - "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", + "block.refinedstorage2.constructor": "Construtor", + "block.refinedstorage2.destructor": "Destrutor", + "block.refinedstorage2.wireless_transmitter": "Transmissor sem fio", + "block.refinedstorage2.storage_monitor": "Monitor de Armazenamento", + "block.refinedstorage2.network_receiver": "Receptor da Rede", + "block.refinedstorage2.network_transmitter": "Transmissor de Rede", + "block.refinedstorage2.portable_grid": "Grade Portátil", + "block.refinedstorage2.creative_portable_grid": "Grade Portátil Criativa", + "gui.refinedstorage2.controller.redstone_mode_help": "Quando este dispositivo estiver inativo, a rede de armazenamento não poderá usar este dispositivo como fonte de energia.", + "gui.refinedstorage2.disk_drive.disks": "Discos", + "gui.refinedstorage2.storage.redstone_mode_help": "Quando este dispositivo estiver inativo, o armazenamento contido não estará mais acessível a partir da rede de armazenamento.", + "gui.refinedstorage2.storage.filter_help": "Os recursos que podem ou não ser permitidos neste armazenamento, dependendo se o dispositivo está no modo de lista de permissões ou lista de bloqueio.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Sem filtros configurados, nenhum recurso será aceito neste armazenamento.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Só permite recursos neste armazenamento que está configurado nos filtros.", "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", From 4b3e59d24047d50f84cf998d51de5f15a555014c Mon Sep 17 00:00:00 2001 From: Raoul Date: Mon, 18 Mar 2024 15:44:43 +0100 Subject: [PATCH 24/59] chore: update translation Indonesian from crowdin --- .../assets/refinedstorage2/lang/id_id.json | 324 +++++++++--------- 1 file changed, 162 insertions(+), 162 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json index 51e48da2d..7259a10a3 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/id_id.json @@ -1,7 +1,7 @@ { "itemGroup.refinedstorage2.general": "Refined Storage 2", "block.refinedstorage2.cable": "Kabel", - "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", + "block.refinedstorage2.quartz_enriched_iron_block": "Balok Besi yang Diperkaya Kuarsa", "block.refinedstorage2.disk_drive": "Lemari Cakram", "block.refinedstorage2.machine_casing": "Kerangka Mesin", "block.refinedstorage2.grid": "Kisi", @@ -14,11 +14,11 @@ "block.refinedstorage2.16k_storage_block": "Balok Penyimpanan 16K", "block.refinedstorage2.64k_storage_block": "Balok Penyimpanan 64K", "block.refinedstorage2.creative_storage_block": "Balok Penyimpanan Kreatif", - "block.refinedstorage2.64b_fluid_storage_block": "Balok Penyimpan Cairan 64B", - "block.refinedstorage2.256b_fluid_storage_block": "Balok Penyimpan Cairan 256B", - "block.refinedstorage2.1024b_fluid_storage_block": "Balok Penyimpan Cairan 1024B", - "block.refinedstorage2.4096b_fluid_storage_block": "Balok Penyimpan Cairan 4096B", - "block.refinedstorage2.creative_fluid_storage_block": "Balok Penyimpan Cairan Kreatif", + "block.refinedstorage2.64b_fluid_storage_block": "Balok Penyimpanan Cairan 64B", + "block.refinedstorage2.256b_fluid_storage_block": "Balok Penyimpanan Cairan 256B", + "block.refinedstorage2.1024b_fluid_storage_block": "Balok Penyimpanan Cairan 1024B", + "block.refinedstorage2.4096b_fluid_storage_block": "Balok Penyimpanan Cairan 4096B", + "block.refinedstorage2.creative_fluid_storage_block": "Balok Penyimpanan Cairan Kreatif", "block.refinedstorage2.importer": "Importir", "block.refinedstorage2.exporter": "Eksportir", "block.refinedstorage2.interface": "Antarmuka", @@ -34,11 +34,11 @@ "block.refinedstorage2.creative_portable_grid": "Kisi Portabel Kreatif", "gui.refinedstorage2.controller.redstone_mode_help": "Ketika peranagkat ini nonaktif, jaringan penyimpanan tidak dapat menggunakan perangkat ini sebagai sumber energi.", "gui.refinedstorage2.disk_drive.disks": "Cakram", - "gui.refinedstorage2.storage.redstone_mode_help": "Ketika perangkat ini nonaktif, penyimpanan akan tidak dapat diakses dari dalam jaringan penyimpanan.", - "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", - "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", - "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", - "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", + "gui.refinedstorage2.storage.redstone_mode_help": "Ketika perangkat ini nonaktif, penyimpanan tidak akan dapat diakses dari dalam jaringan penyimpanan.", + "gui.refinedstorage2.storage.filter_help": "Sumber daya yang diperbolehkan atau tidak ke dalam penyimpanan ini, tergantung jika perangkat dalam mode diizinkan atau diblokir.", + "gui.refinedstorage2.storage.filter_mode.empty_warning": "Tanpa konfigurasi filter, tidak ada sumber daya yang akan diterima kedalam penyimpanan ini.", + "gui.refinedstorage2.storage.filter_mode.allow.help": "Hanya izinkan sumber daya kedalam penyimpanan ini yang telah dikonfigurasi dalam filter.", + "gui.refinedstorage2.storage.filter_mode.block.help": "Blokir sumber daya kedalam penyimpanan ini yang telah dikonfigurasi dalam filter.", "gui.refinedstorage2.grid.sorting.direction": "Arah Pengurutan", "gui.refinedstorage2.grid.sorting.direction.ascending": "Menaik", "gui.refinedstorage2.grid.sorting.direction.descending": "Menurun", @@ -72,21 +72,21 @@ "gui.refinedstorage2.crafting_grid.move.network": "Pindahkan barang ke jaringan", "gui.refinedstorage2.crafting_grid.move.inventory": "Pindahkan barang ke inventaris", "gui.refinedstorage2.detector.mode": "Mode", - "gui.refinedstorage2.detector.mode.under": "Pancarkan sinyal redstone saat berada di bawah jumlah", - "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", - "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", - "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", - "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", - "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", - "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", - "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", - "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", - "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", - "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", - "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", - "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", - "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", - "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", + "gui.refinedstorage2.detector.mode.under": "Pancarkan sinyal redstone saat berada di bawah jumlah yang ditentukan", + "gui.refinedstorage2.detector.mode.equal": "Pancarkan sinyal redstone saat berada pada jumlah yang ditentukan", + "gui.refinedstorage2.detector.mode.above": "Pancarkan sinyal redstone saat berada diatas jumlah yang ditentukan", + "gui.refinedstorage2.detector.filter_help": "Sumber daya yang harus dideteksi dalam jaringan penyimpanan.", + "gui.refinedstorage2.destructor.pickup_items": "Ambil barang daripada memecah", + "gui.refinedstorage2.destructor.filter_help": "Balok yang dapat atau tidak dapat untuk dihancurkan, tergantung jika perangkat dalam mode diizinkan atau diblokir.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Hanya izinkan balok kedalam jaringan penyimpanan yang telah dikonfigurasi dalam filter.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Blokir balok kedalam jaringan penyimpanan yang telah dikonfigurasi dalam filter.", + "gui.refinedstorage2.constructor.drop_items": "Jatuhkan barang dibanding menempatkan balok", + "gui.refinedstorage2.constructor.filter_help": "Sumber daya yang harus ditempatkan dari jaringan penyimpanan.", + "gui.refinedstorage2.interface.filter_help": "Sumber daya yang harus diekspor dari jaringan penyimpanan.", + "gui.refinedstorage2.exporter.filter_help": "Sumber daya yang harus diekspor dari jaringan penyimpanan.", + "gui.refinedstorage2.importer.filter_help": "Sumber daya yang mungkin diimpor dari penyimpanan sasaran.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Hanya izinkan sumber daya kedalam jaringan penyimpanan yang telah dikonfigurasi dalam filter.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Blokir sumber daya kedalam jaringan penyimpanan yang telah dikonfigurasi dalam filter.", "gui.refinedstorage2.wireless_transmitter.distance": "%d blok", "gui.refinedstorage2.storage_monitor.filter_help": "Sumber daya untuk ditampilkan.", "gui.refinedstorage2.redstone_mode": "Mode redstone", @@ -95,66 +95,66 @@ "gui.refinedstorage2.redstone_mode.high": "Tinggi", "gui.refinedstorage2.redstone_mode.high.help": "Perangkat ini hanya akan aktif dengan sinyal redstone.", "gui.refinedstorage2.redstone_mode.low": "Rendah", - "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", - "gui.refinedstorage2.scheduling_mode": "Scheduling mode", + "gui.refinedstorage2.redstone_mode.low.help": "Perangkat ini hanya akan aktif tanpa sinyal redstone.", + "gui.refinedstorage2.scheduling_mode": "Mode penjadwalan", "gui.refinedstorage2.scheduling_mode.default": "Bawaan", - "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", + "gui.refinedstorage2.scheduling_mode.default.help": "Gunakan filter yang tersedia terlebih dahulu.", "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", - "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", + "gui.refinedstorage2.scheduling_mode.round_robin.help": "Gunakan setiap filter secara bergilir.", "gui.refinedstorage2.scheduling_mode.random": "Acak", - "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", + "gui.refinedstorage2.scheduling_mode.random.help": "Gunakan filter acak.", "gui.refinedstorage2.priority": "Prioritas", - "gui.refinedstorage2.priority.storage_help": "Urutan dimana jaringan penyimpanan akan memasukkan atau mengeluarkan sumber daya, mulai dari yang tertinggi.", + "gui.refinedstorage2.priority.storage_help": "Urutan dimana jaringan penyimpanan akan memasukkan atau mengekstrak sumber daya, mulai dari yang tertinggi.", "gui.refinedstorage2.amount": "Jumlah", "gui.refinedstorage2.amount.reset": "Atur Ulang", "gui.refinedstorage2.amount.set": "Atur", "gui.refinedstorage2.filter_mode": "Mode Filter", - "gui.refinedstorage2.filter_mode.allow": "Diperbolehkan", - "gui.refinedstorage2.filter_mode.block": "Dilarang", - "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", + "gui.refinedstorage2.filter_mode.allow": "Diizinkan", + "gui.refinedstorage2.filter_mode.block": "Diblokir", + "gui.refinedstorage2.fuzzy_mode": "Mode acak", "gui.refinedstorage2.fuzzy_mode.on": "Hidup", - "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", - "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Match the filter exactly.", - "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Match the filters when extracting from the storage network exactly.", - "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Sesuaikan filter ketika mengekstrak dari sumber.", + "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Cocokkan persis filter untuk daftar yang diizinkan atau yang diblokir.", + "gui.refinedstorage2.fuzzy_mode.on.generic_help": "Sesuaikan persis filter.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_storage_network_help": "Sesuaikan persis filter ketika mengekstrak dari jaringan penyimpanan.", + "gui.refinedstorage2.fuzzy_mode.on.extracting_source_help": "Sesuaikan persis filter ketika mengekstrak dari sumber.", "gui.refinedstorage2.fuzzy_mode.off": "Nonaktif", - "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Match the filters for the allowlist or blocklist without comparing NBT tags.", - "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", - "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", - "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", + "gui.refinedstorage2.fuzzy_mode.off.storage_help": "Cocokkan filter untuk daftar yang diizinkan atau yang diblokir tanpa membandingkan label NBT.", + "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Sesuaikan filter tanpa membandingkan label NBT.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Sesuaikan filter ketika mengekstrak dari jaringan penyimpanan tanpa membandingkan label NBT.", + "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Sesuaikan filter ketika mengekstrak dari sumber tanpa membandingkan label NBT.", "gui.refinedstorage2.access_mode": "Modus akses", - "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", - "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", - "gui.refinedstorage2.access_mode.insert": "Insert only", - "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", - "gui.refinedstorage2.access_mode.extract": "Extract only", - "gui.refinedstorage2.access_mode.extract.help": "The storage network will only be able to extract from this storage.", - "gui.refinedstorage2.void_excess": "Void excess resources", - "gui.refinedstorage2.void_excess.help": "When void excess mode is turned on and the storage is full, it will keep accepting resources but void them.", - "gui.refinedstorage2.void_excess.allowlist_warning": "Void excess will only work when the storage is in allowlist mode.", + "gui.refinedstorage2.access_mode.insert_extract": "Masukkan dan ekstrak", + "gui.refinedstorage2.access_mode.insert_extract.help": "Jaringan penyimpanan akan dapat memasukkan atau mengekstrak dari penyimpanan ini.", + "gui.refinedstorage2.access_mode.insert": "Masukkan saja", + "gui.refinedstorage2.access_mode.insert.help": "Jaringan penyimpanan hanya akan dapat memasukkan kedalam penyimpanan ini. Sumber daya masih dapat dilihat dalam Kisi.", + "gui.refinedstorage2.access_mode.extract": "Ekstrak saja", + "gui.refinedstorage2.access_mode.extract.help": "Jaringan penyimpanan hanya akan dapat mengekstrak dari penyimpanan ini.", + "gui.refinedstorage2.void_excess": "Kosongkan sumber daya berlebih", + "gui.refinedstorage2.void_excess.help": "Ketika mode kosongan kelebihan dihidupkan dan penyimpanan penuh, penyimpanan akan tetap menerima sumber daya akan tetapi akan mengosongkannya.", + "gui.refinedstorage2.void_excess.allowlist_warning": "Kosongkan kelebihan hanya akan bekerja ketika penyimpanan dalam mode diizinkan.", "gui.refinedstorage2.upgrade_slot": "Slot peningkatan kosong", "gui.refinedstorage2.filter_slot.empty_filter": "Filter kosong", "gui.refinedstorage2.filter_slot.left_click_for": "Klik kiri untuk", "gui.refinedstorage2.filter_slot.right_click_for": "Klik kanan untuk", "gui.refinedstorage2.filter_slot.click_to_clear": "Klik untuk membersihkan", - "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", + "gui.refinedstorage2.regulator_upgrade.filter_help": "Sumber daya yang harus diatur dalam sasaran.", "gui.refinedstorage2.network_transmitter.status.inactive": "Tidak aktif", "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Kartu Jaringan Tidak Ditemukan", "gui.refinedstorage2.network_transmitter.status.transmitting": "%d blok", "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Tidak dapat diraih", "item.refinedstorage2.controller.help": "Menyediakan energi ke jaringan penyimpanan. dapat digunakan beberapa kali dalam satu jaringan penyimpanan.", "item.refinedstorage2.creative_controller.help": "Menyediakan energi tidak terbatas ke jaringan penyimpanan.", - "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", + "item.refinedstorage2.disk_drive.help": "Menerima cakram penyimpanan untuk menyediakan ruang penyimpanan kedalam jaringan penyimpanan.", "item.refinedstorage2.grid.help": "Memungkinkan untuk mengakses jaringan penyimpanan.", "item.refinedstorage2.crafting_grid.help": "Memungkinkan untuk mengakses jaringan penyimpanan, dengan kemampuan untuk merakit.", - "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", - "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", - "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", - "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", - "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", - "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", - "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", - "item.refinedstorage2.quartz_enriched_iron": "Quartz Enriched Iron", + "item.refinedstorage2.importer.help": "Import sumber daya dari sumber eksternal kedalam jaringan penyimpanan.", + "item.refinedstorage2.exporter.help": "Ekspor sumber daya dari jaringan penyimpanan kedalam tujuan eksternal.", + "item.refinedstorage2.interface.help": "Berfungsi sebagai gabungan dari Importir dan Eksportir.", + "item.refinedstorage2.external_storage.help": "Menyediakan penyimpanan dari sumber eksternal kedalam jaringan penyimpanan.", + "item.refinedstorage2.detector.help": "Pancarkan sinyal redstone jika jaringan penyimpanan berisi sumber daya sama dengan, diatas atau dibawah jumlah yang ditentukan.", + "item.refinedstorage2.constructor.help": "Tempatkan balok dari jaringan penyimpanan ke dunia.", + "item.refinedstorage2.destructor.help": "Memecahkan balok dari dunia dan memasukkannya kedalam jaringan penyimpanan.", + "item.refinedstorage2.quartz_enriched_iron": "Besi yang Diperkaya Kuarsa", "item.refinedstorage2.processor_binding": "Pengikat Prosesor", "item.refinedstorage2.silicon": "Silikon", "item.refinedstorage2.raw_basic_processor": "Procesor Dasar Mentah", @@ -163,58 +163,58 @@ "item.refinedstorage2.basic_processor": "Procesor Dasar", "item.refinedstorage2.improved_processor": "Prosesor Ditingkatkan", "item.refinedstorage2.advanced_processor": "Prosesor Canggih", - "item.refinedstorage2.1k_storage_part": "1K Storage Part", - "item.refinedstorage2.4k_storage_part": "4K Storage Part", - "item.refinedstorage2.16k_storage_part": "16K Storage Part", - "item.refinedstorage2.64k_storage_part": "64K Storage Part", - "item.refinedstorage2.1k_storage_disk": "1K Storage Disk", - "item.refinedstorage2.4k_storage_disk": "4K Storage Disk", - "item.refinedstorage2.16k_storage_disk": "16K Storage Disk", - "item.refinedstorage2.64k_storage_disk": "64K Storage Disk", - "item.refinedstorage2.creative_storage_disk": "Creative Storage Disk", - "item.refinedstorage2.64b_fluid_storage_part": "64B Fluid Storage Part", - "item.refinedstorage2.256b_fluid_storage_part": "256B Fluid Storage Part", - "item.refinedstorage2.1024b_fluid_storage_part": "1024B Fluid Storage Part", - "item.refinedstorage2.4096b_fluid_storage_part": "4096B Fluid Storage Part", - "item.refinedstorage2.64b_fluid_storage_disk": "64B Fluid Storage Disk", - "item.refinedstorage2.256b_fluid_storage_disk": "256B Fluid Storage Disk", - "item.refinedstorage2.1024b_fluid_storage_disk": "1024B Fluid Storage Disk", - "item.refinedstorage2.4096b_fluid_storage_disk": "4096B Fluid Storage Disk", - "item.refinedstorage2.creative_fluid_storage_disk": "Creative Fluid Storage Disk", - "item.refinedstorage2.storage_housing": "Storage Housing", - "item.refinedstorage2.construction_core": "Construction Core", - "item.refinedstorage2.destruction_core": "Destruction Core", - "item.refinedstorage2.wrench": "Wrench", - "item.refinedstorage2.wrench.helper": "Use to rotate blocks or press SHIFT and use to dismantle Refined Storage blocks.", - "item.refinedstorage2.upgrade": "Upgrade", + "item.refinedstorage2.1k_storage_part": "Suku Cadang Penyimpanan 1K", + "item.refinedstorage2.4k_storage_part": "Suku Cadang Penyimpanan 4K", + "item.refinedstorage2.16k_storage_part": "Suku Cadang Penyimpanan 16K", + "item.refinedstorage2.64k_storage_part": "Suku Cadang Penyimpanan 64K", + "item.refinedstorage2.1k_storage_disk": "Cakram Penyimpanan 1K", + "item.refinedstorage2.4k_storage_disk": "Cakram Penyimpanan 4K", + "item.refinedstorage2.16k_storage_disk": "Cakram Penyimpanan 16K", + "item.refinedstorage2.64k_storage_disk": "Cakram Penyimpanan 64K", + "item.refinedstorage2.creative_storage_disk": "Cakram Penyimpanan Kreatif", + "item.refinedstorage2.64b_fluid_storage_part": "Suku cadang Penyimpanan Cairan 64B", + "item.refinedstorage2.256b_fluid_storage_part": "Suku cadang Penyimpanan Cairan 256B", + "item.refinedstorage2.1024b_fluid_storage_part": "Suku cadang Penyimpanan Cairan 1024B", + "item.refinedstorage2.4096b_fluid_storage_part": "Suku cadang Penyimpanan Cairan 4096B", + "item.refinedstorage2.64b_fluid_storage_disk": "Cakram Penyimpanan Cairan 64B", + "item.refinedstorage2.256b_fluid_storage_disk": "Cakram Penyimpanan Cairan 256B", + "item.refinedstorage2.1024b_fluid_storage_disk": "Cakram Penyimpanan Cairan 1024B", + "item.refinedstorage2.4096b_fluid_storage_disk": "Cakram Penyimpanan Cairan 4096B", + "item.refinedstorage2.creative_fluid_storage_disk": "Cakram Penyimpanan Cairan Kreatif", + "item.refinedstorage2.storage_housing": "Kerangka Penyimpanan", + "item.refinedstorage2.construction_core": "Inti Pembangunan", + "item.refinedstorage2.destruction_core": "Inti Penghancuran", + "item.refinedstorage2.wrench": "Kunci inggris", + "item.refinedstorage2.wrench.helper": "Gunakan untuk memutar balok atau tekan SHIFT dan gunakan untuk membongkar balok Refined Storage.", + "item.refinedstorage2.upgrade": "Tingkatkan", "item.refinedstorage2.speed_upgrade": "Peningkatan Kecepatan", "item.refinedstorage2.stack_upgrade": "Peningkatan Tumpukan", - "item.refinedstorage2.silk_touch_upgrade": "Silk Touch Upgrade", - "item.refinedstorage2.fortune_upgrade.1": "Fortune I Upgrade", - "item.refinedstorage2.fortune_upgrade.2": "Fortune II Upgrade", - "item.refinedstorage2.fortune_upgrade.3": "Fortune III Upgrade", - "item.refinedstorage2.regulator_upgrade": "Regulator Upgrade", - "item.refinedstorage2.regulator_upgrade.help": "In an Exporter, will only export if the amount in the target is less than configured in the upgrade. In an Importer, will only import if the amount in the target is more than configured in the upgrade. Use item to configure.", + "item.refinedstorage2.silk_touch_upgrade": "Peningkatan Sentuhan Sutra", + "item.refinedstorage2.fortune_upgrade.1": "Peningkatan Peruntungan 1", + "item.refinedstorage2.fortune_upgrade.2": "Peningkatan Peruntungan 2", + "item.refinedstorage2.fortune_upgrade.3": "Peningkatan Peruntungan 3", + "item.refinedstorage2.regulator_upgrade": "Peningkatan Pengatur", + "item.refinedstorage2.regulator_upgrade.help": "Didalam Eksportir, hanya akan mengekspor jika jumlah sasaran kurang dari yang dikonfigurasi dalam peningkatan. Didalam Importir, hanya akan mengimpor jika jumlah sasaran lebih dari yang dikonfigurasi dalam peningkatan. Gunakan barang untuk mengonfigurasi.", "item.refinedstorage2.range_upgrade": "Peningkatan Jangkauan", "item.refinedstorage2.creative_range_upgrade": "Peningkatan Jangkauan Kreatif", "item.refinedstorage2.wireless_grid": "Kisi Nirkabel", "item.refinedstorage2.creative_wireless_grid": "Kisi Nirkabel Kreatif", - "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", + "item.refinedstorage2.wireless_transmitter.help": "Menyediakan akses jaringan nirkabel untuk barang seperti Kisi Nirkabel. Dapat digunakan beberapa dalam area untuk jangkauan yang lebih luas.", "item.refinedstorage2.network_item.unbound": "Tidak terikat.", "item.refinedstorage2.network_item.unbound.help": "Gunakan pada perangkat jaringan penyimpanan manapun untuk mengikat.", "item.refinedstorage2.network_item.bound_to": "Terikat pada %d, %d, %d.", - "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", - "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", + "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "Terdapat %s lebih dari satu di inventaris anda.", + "item.refinedstorage2.network_item.cannot_open_because_not_found": "Tidak ada %s di inventaris anda.", "item.refinedstorage2.configuration_card": "Kartu Konfigurasi", "item.refinedstorage2.configuration_card.empty": "Kosong.", "item.refinedstorage2.configuration_card.configured": "Berisi konfigurasi untuk %s.", "item.refinedstorage2.configuration_card.copied_configuration": "Menyalin konfigurasi untuk %s.", "item.refinedstorage2.configuration_card.cleared_configuration": "Konfigurasi dibersihkan.", - "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", - "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Tidak dapat menerapkan kartu konfigurasi ke jenis perangkat yang berbeda. Kartu terkonfigurasi untuk %s.", + "item.refinedstorage2.configuration_card.applied_configuration": "Konfigurasi diterapkan.", "item.refinedstorage2.configuration_card.empty_help": "Gunakan pada perangkat perangkat jaringan penyimpanan sambil berjongkok untuk menyalin konfigurasi dan peningkatannya kedalam kartu.", "item.refinedstorage2.configuration_card.configured_help": "Gunakan pada perangkat jaringan penyimpanan tujuan sambil berjongkok untuk mengirimkan konfigurasi dan peningkatan. Gunakan sambil berjongkok untuk membersihkan.", - "item.refinedstorage2.network_card": "Network Card", + "item.refinedstorage2.network_card": "Kartu Jaringan", "item.refinedstorage2.network_card.unbound_help": "Gunakan sambil berjongkok pada Penerima Jaringan.", "item.refinedstorage2.network_card.unbound": "Tidak terikat.", "item.refinedstorage2.network_card.bound_help": "Masukkan ke Pemancar Jaringan. Gunakan sambil berjongkok untuk membersihkan ikatan.", @@ -238,62 +238,62 @@ "misc.refinedstorage2.resource_type.item": "Barang", "misc.refinedstorage2.resource_type.fluid": "Cairan", "misc.refinedstorage2.press_shift_for_help": "Tekan SHIFT untuk bantuan", - "key.refinedstorage2.focus_search_bar": "Focus search bar", + "key.refinedstorage2.focus_search_bar": "Fokus pada kotak pencarian", "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Singkirkan matriks Kisi Kerajinan ke jaringan", "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Singkirkan matriks Kisi Kerajinan ke inventaris", - "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", + "key.refinedstorage2.open_wireless_grid": "Buka Kisi Nirkabel", "refinedstorage2.subtitle.wrench": "Kunci inggris digunakan", "category.refinedstorage2.key_bindings": "Refined Storage 2", "curios.identifier.refinedstorage2": "Refined Storage 2", "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", "text.autoconfig.refinedstorage2.title": "Refined Storage 2", - "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid": "Kisi", "text.autoconfig.refinedstorage2.option.grid.largeFont": "Font besar", "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Baris maksimum saat diregangkan", "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Mencegah pengurutan ketika SHIFT ditekan", - "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", + "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detail teks keterangan", "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Ingat permintaan pencarian", "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Pemakaian daya", "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Pengguliran mulus", - "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", - "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", - "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", + "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Memilih otomatis kotak pencarian", + "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Sinkronisasi", + "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Jenis sumber daya", "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Arah Pengurutan", "text.autoconfig.refinedstorage2.option.grid.sortingType": "Jenis pengurutan", "text.autoconfig.refinedstorage2.option.grid.size": "Ukuran", "text.autoconfig.refinedstorage2.option.craftingGrid": "Kisi Kerajinan", "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", + "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Perilaku menutup Matriks kerajinan", "text.autoconfig.refinedstorage2.option.controller": "Pengendali", - "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Kapasitas energi", + "text.autoconfig.refinedstorage2.option.controller.energyCapacity": "Kapasitas daya", "text.autoconfig.refinedstorage2.option.cable": "Kabel", "text.autoconfig.refinedstorage2.option.cable.energyUsage": "Pemakaian daya", "text.autoconfig.refinedstorage2.option.diskDrive": "Lemari Cakram", "text.autoconfig.refinedstorage2.option.diskDrive.energyUsage": "Pemakaian daya", "text.autoconfig.refinedstorage2.option.diskDrive.energyUsagePerDisk": "Pemakaian daya per cakram", - "text.autoconfig.refinedstorage2.option.storageBlock": "Storage Block", - "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "Pemakaian energy 1K", + "text.autoconfig.refinedstorage2.option.storageBlock": "Balok Penyimpanan", + "text.autoconfig.refinedstorage2.option.storageBlock.oneKEnergyUsage": "Pemakaian daya 1K", "text.autoconfig.refinedstorage2.option.storageBlock.fourKEnergyUsage": "Pemakaian daya 4K", - "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "16K energy usage", - "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "64K energy usage", - "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Creative energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Fluid Storage Block", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "64B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "256B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", - "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", - "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.storageBlock.sixteenKEnergyUsage": "Pemakaian daya 16K", + "text.autoconfig.refinedstorage2.option.storageBlock.sixtyFourKEnergyUsage": "Pemakaian daya 64K", + "text.autoconfig.refinedstorage2.option.storageBlock.creativeEnergyUsage": "Pemakaian daya kreatif", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock": "Balok Penyimpanan Cairan", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.sixtyFourBEnergyUsage": "Pemakaian daya 64M", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.twoHundredFiftySixBEnergyUsage": "Pemakaian daya 256M", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "Pemakaian daya 1024M", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "Pemakaian daya 4096M", + "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Pemakaian daya kreatif", + "text.autoconfig.refinedstorage2.option.importer": "Importir", "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter": "Eksportir", "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector": "Pendeteksi", "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor": "Pembangun", "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor": "Penghancur", "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", + "text.autoconfig.refinedstorage2.option.upgrade": "Peningkatan", "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Pemakaian daya peningkat kecepatan", "text.autoconfig.refinedstorage2.option.upgrade.stackUpgradeEnergyUsage": "Pemakaian daya peningkat tumpukan", "text.autoconfig.refinedstorage2.option.upgrade.fortune1UpgradeEnergyUsage": "Pemakaian daya peningkat peruntungan 1", @@ -316,52 +316,52 @@ "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Pemancar Nirkabel", "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Pemakaian daya", "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Jangkauan Dasar", - "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Monitor Penyimpanan", "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Penerima Jaringan", "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Pemakaian daya", "text.autoconfig.refinedstorage2.option.networkTransmitter": "Pemancar Jaringan", "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Pemakaian daya", - "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid": "Kisi Portabel", "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Kapasitas energi", "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Buka pemakaian daya", "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Masukkan pemakaian daya", "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Ekstrak pemakaian daya", "advancements.refinedstorage2.root.description": "Gunakan satu atau beberapa Pengendali dalam jaringan untuk menyediakan energi kedalam jaringan anda", - "advancements.refinedstorage2.connecting": "Connecting", - "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", - "advancements.refinedstorage2.drives": "Drives", - "advancements.refinedstorage2.drives.description": "Craft a Disk Drive to be able to store your storage disks", - "advancements.refinedstorage2.storing_items": "Storing items", - "advancements.refinedstorage2.storing_items.description": "Craft a Storage Disk and put it in your Disk Drive", - "advancements.refinedstorage2.viewing_your_storage": "Viewing your storage", - "advancements.refinedstorage2.viewing_your_storage.description": "Craft a Grid to interact with your storage", - "advancements.refinedstorage2.upgrading_your_grid": "Upgrading your Grid", - "advancements.refinedstorage2.upgrading_your_grid.description": "Upgrade your Grid to a Crafting Grid to get crafting abilities", - "advancements.refinedstorage2.storing_fluids": "Storing fluids", - "advancements.refinedstorage2.storing_fluids.description": "Craft a Fluid Storage Disk and put it in your Disk Drive", - "advancements.refinedstorage2.importing": "Importing", - "advancements.refinedstorage2.importing.description": "Get resources into the storage network with an Importer", - "advancements.refinedstorage2.exporting": "Exporting", - "advancements.refinedstorage2.exporting.description": "Get resources out of the storage network with an Exporter", - "advancements.refinedstorage2.upgrading": "Upgrading", - "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", - "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", - "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", - "advancements.refinedstorage2.storing_externally": "Storing externally", - "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", - "advancements.refinedstorage2.detecting": "Detecting", - "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", - "advancements.refinedstorage2.construction": "Construction", - "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", - "advancements.refinedstorage2.destruction": "Destruction", - "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", - "advancements.refinedstorage2.wireless": "Wireless", - "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", - "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", - "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", - "advancements.refinedstorage2.no_cables_required": "No cables required", + "advancements.refinedstorage2.connecting": "Menyambungkan", + "advancements.refinedstorage2.connecting.description": "Gunakan Kabel untuk menghubungkan perangkat satu sama lain, atau letakkan perangkat melawan satu sama lain", + "advancements.refinedstorage2.drives": "Cakram", + "advancements.refinedstorage2.drives.description": "Rakit Lemari Cakram untuk menyimpan cakram penyimpanan anda", + "advancements.refinedstorage2.storing_items": "Menyimpan Barang", + "advancements.refinedstorage2.storing_items.description": "Rakit Cakram Penyimpanan dan letakkan kedalam Lemari Cakram anda", + "advancements.refinedstorage2.viewing_your_storage": "Melihat penyimpanan anda", + "advancements.refinedstorage2.viewing_your_storage.description": "Rakit Kisi untuk berinteraksi dengan penyimpanan anda", + "advancements.refinedstorage2.upgrading_your_grid": "Meningkatkan Kisi anda", + "advancements.refinedstorage2.upgrading_your_grid.description": "Tingkatkan Kisi anda menjadi Kisi Kerajinan untuk mendapatkan kemampuan kerajinan", + "advancements.refinedstorage2.storing_fluids": "Menyimpan cairan", + "advancements.refinedstorage2.storing_fluids.description": "Rakit Cakram Penyimpanan Cairan dan letakkan kedalam Lemari Cakram anda", + "advancements.refinedstorage2.importing": "Pengimporan", + "advancements.refinedstorage2.importing.description": "Masukkan sumber daya kedalam jaringan penyimpanan menggunakan Importir", + "advancements.refinedstorage2.exporting": "Pengeksporan", + "advancements.refinedstorage2.exporting.description": "Keluarkan sumberdaya dari jaringan penyimpanan menggunakan Eksportir", + "advancements.refinedstorage2.upgrading": "Meningkatkan", + "advancements.refinedstorage2.upgrading.description": "Rakit Peningkatan untuk meningkatkan berbagai perangkat", + "advancements.refinedstorage2.interface_to_the_world": "Antarmuka ke dunia", + "advancements.refinedstorage2.interface_to_the_world.description": "Ekspor dan Impor barang secara bersamaan dengan Antarmuka", + "advancements.refinedstorage2.storing_externally": "Menyimpan secara eksternal", + "advancements.refinedstorage2.storing_externally.description": "Gunakan Penyimpanan Eksternal untuk menyediakan jaringan dengan penyimpanan dari balok eksternal seperti peti", + "advancements.refinedstorage2.detecting": "Mendeteksi", + "advancements.refinedstorage2.detecting.description": "Gunakan redstone untuk memeriksa sumber daya yang tersimpan di jaringan", + "advancements.refinedstorage2.construction": "Pembangunan", + "advancements.refinedstorage2.construction.description": "Tempatkan balok dari jaringan penyimpanan ke dunia menggunakan Pembangun", + "advancements.refinedstorage2.destruction": "Penghancuran", + "advancements.refinedstorage2.destruction.description": "Peroleh balok dari dunia kedalam jaringan penyimpanan menggunakan Penghancur", + "advancements.refinedstorage2.wireless": "Nirkabel", + "advancements.refinedstorage2.wireless.description": "Akses sumber daya anda secara nirkabel menggunakan Kisi Nirkabel.", + "advancements.refinedstorage2.better_than_a_barrel": "Lebih baik dari tong", + "advancements.refinedstorage2.better_than_a_barrel.description": "Rakit Monitor Penyimpanan untuk melihat, memasukkan atau mengekstrak sumber daya dalam jaringan penyimpanan", + "advancements.refinedstorage2.no_cables_required": "Tidak memerlukan kabel", "advancements.refinedstorage2.no_cables_required.description": "Tambahkan komponen tambahan ke jaringan anda tanpa menggunakan kabel dengan menggunakan Pemancar Jaringan, Penerima Jaringan dan Kartu Jaringan", - "advancements.refinedstorage2.portable_storage": "Portable storage", - "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" + "advancements.refinedstorage2.portable_storage": "Penyimpanan portabel", + "advancements.refinedstorage2.portable_storage.description": "Rakit Kisi Portabel untuk mengakses isi dari cakram tanpa memerlukan jaringan penyimpanan" } From 42bc76d3aae209964c3b8c8842f3e1af16aafdd9 Mon Sep 17 00:00:00 2001 From: Raoul Date: Tue, 19 Mar 2024 15:41:10 +0100 Subject: [PATCH 25/59] chore: update translation French from crowdin --- .../assets/refinedstorage2/lang/fr_fr.json | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json index 5dae1aed6..9d221632a 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/fr_fr.json @@ -4,8 +4,8 @@ "block.refinedstorage2.quartz_enriched_iron_block": "Bloc de Fer Enrichi en Quartz", "block.refinedstorage2.disk_drive": "Lecteur de Disque", "block.refinedstorage2.machine_casing": "Boitier de Machine", - "block.refinedstorage2.grid": "Terminal", - "block.refinedstorage2.crafting_grid": "Terminal d’Artisanat", + "block.refinedstorage2.grid": "Grille", + "block.refinedstorage2.crafting_grid": "Grille d’Artisanat", "block.refinedstorage2.controller": "Contrôleur", "block.refinedstorage2.controller.rei_fully_charged": "Contrôleur entièrement chargé", "block.refinedstorage2.creative_controller": "Contrôleur créatif", @@ -30,8 +30,8 @@ "block.refinedstorage2.storage_monitor": "Moniteur de Stockage", "block.refinedstorage2.network_receiver": "Récepteur Réseau", "block.refinedstorage2.network_transmitter": "Transmetteur Réseau", - "block.refinedstorage2.portable_grid": "Terminal Portatif", - "block.refinedstorage2.creative_portable_grid": "Terminal Portatif Créatif", + "block.refinedstorage2.portable_grid": "Grille portable", + "block.refinedstorage2.creative_portable_grid": "Grille portable créative", "gui.refinedstorage2.controller.redstone_mode_help": "Lorsque cet appareil est inactif, le réseau de stockage ne pourra pas utiliser cet appareil comme source d'énergie.", "gui.refinedstorage2.disk_drive.disks": "Disques", "gui.refinedstorage2.storage.redstone_mode_help": "Lorsque cet appareil est inactif, le stockage contenu ne sera plus accessible depuis le réseau de stockage.", @@ -40,19 +40,19 @@ "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", - "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", - "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", - "gui.refinedstorage2.grid.sorting.type": "Sorting type", - "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", - "gui.refinedstorage2.grid.sorting.type.name": "Name", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascendant", + "gui.refinedstorage2.grid.sorting.direction.descending": "Descendant", + "gui.refinedstorage2.grid.sorting.type": "Type de tri", + "gui.refinedstorage2.grid.sorting.type.quantity": "Quantité", + "gui.refinedstorage2.grid.sorting.type.name": "Nom", "gui.refinedstorage2.grid.sorting.type.id": "ID", "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", - "gui.refinedstorage2.grid.size": "Size", - "gui.refinedstorage2.grid.size.stretch": "Stretch", - "gui.refinedstorage2.grid.size.small": "Small", - "gui.refinedstorage2.grid.size.medium": "Medium", - "gui.refinedstorage2.grid.size.large": "Large", - "gui.refinedstorage2.grid.size.extra_large": "Extra large", + "gui.refinedstorage2.grid.size": "Taille", + "gui.refinedstorage2.grid.size.stretch": "Étirée", + "gui.refinedstorage2.grid.size.small": "Petite", + "gui.refinedstorage2.grid.size.medium": "Moyenne", + "gui.refinedstorage2.grid.size.large": "Grande", + "gui.refinedstorage2.grid.size.extra_large": "Très grande", "gui.refinedstorage2.grid.auto_selected": "Auto-selected", "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", @@ -66,8 +66,8 @@ "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", - "gui.refinedstorage2.grid.resource_type": "Resource type", - "gui.refinedstorage2.grid.resource_type.all": "All", + "gui.refinedstorage2.grid.resource_type": "Type de ressource", + "gui.refinedstorage2.grid.resource_type.all": "Toutes", "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", @@ -101,16 +101,16 @@ "gui.refinedstorage2.scheduling_mode.default.help": "Use the first available filter.", "gui.refinedstorage2.scheduling_mode.round_robin": "Round robin", "gui.refinedstorage2.scheduling_mode.round_robin.help": "Use each filter in turn.", - "gui.refinedstorage2.scheduling_mode.random": "Random", - "gui.refinedstorage2.scheduling_mode.random.help": "Use a random filter.", - "gui.refinedstorage2.priority": "Priority", - "gui.refinedstorage2.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first.", - "gui.refinedstorage2.amount": "Amount", + "gui.refinedstorage2.scheduling_mode.random": "Aléatoire", + "gui.refinedstorage2.scheduling_mode.random.help": "Utiliser un filtre aléatoire.", + "gui.refinedstorage2.priority": "Priorité", + "gui.refinedstorage2.priority.storage_help": "L'ordre dans lequel le réseau de stockage va insérer ou extraire les ressources, le plus élevé en premier.", + "gui.refinedstorage2.amount": "Quantité", "gui.refinedstorage2.amount.reset": "Reset", "gui.refinedstorage2.amount.set": "Set", "gui.refinedstorage2.filter_mode": "Filter mode", - "gui.refinedstorage2.filter_mode.allow": "Allowlist", - "gui.refinedstorage2.filter_mode.block": "Blocklist", + "gui.refinedstorage2.filter_mode.allow": "Liste blanche", + "gui.refinedstorage2.filter_mode.block": "Liste noire", "gui.refinedstorage2.fuzzy_mode": "Fuzzy mode", "gui.refinedstorage2.fuzzy_mode.on": "On", "gui.refinedstorage2.fuzzy_mode.on.storage_help": "Match the filters for the allowlist or blocklist exactly.", @@ -122,8 +122,8 @@ "gui.refinedstorage2.fuzzy_mode.off.generic_help": "Match the filter without comparing NBT tags.", "gui.refinedstorage2.fuzzy_mode.off.extracting_storage_network_help": "Match the filters when extracting from the storage network without comparing NBT tags.", "gui.refinedstorage2.fuzzy_mode.off.extracting_source_help": "Match the filters when extracting from the source without comparing NBT tags.", - "gui.refinedstorage2.access_mode": "Access mode", - "gui.refinedstorage2.access_mode.insert_extract": "Insert and extract", + "gui.refinedstorage2.access_mode": "Mode d'accès", + "gui.refinedstorage2.access_mode.insert_extract": "Insertion et extraction", "gui.refinedstorage2.access_mode.insert_extract.help": "The storage network will be able to insert or extract from this storage.", "gui.refinedstorage2.access_mode.insert": "Insert only", "gui.refinedstorage2.access_mode.insert.help": "The storage network will only be able to insert into this storage. Contained resources will still be visible in a Grid.", @@ -202,15 +202,15 @@ "item.refinedstorage2.wireless_transmitter.help": "Provides wireless network access for items like the Wireless Grid. Multiple are allowed in an area for wider coverage.", "item.refinedstorage2.network_item.unbound": "Unbound.", "item.refinedstorage2.network_item.unbound.help": "Use on any storage network device to bind.", - "item.refinedstorage2.network_item.bound_to": "Bound to %d, %d, %d.", + "item.refinedstorage2.network_item.bound_to": "Lié à %d, %d, %d.", "item.refinedstorage2.network_item.cannot_open_with_shortcut_due_to_duplicate": "There is more than one %s in your inventory.", "item.refinedstorage2.network_item.cannot_open_because_not_found": "There isn't any %s in your inventory.", - "item.refinedstorage2.configuration_card": "Configuration Card", + "item.refinedstorage2.configuration_card": "Carte de configuration", "item.refinedstorage2.configuration_card.empty": "Empty.", - "item.refinedstorage2.configuration_card.configured": "Contains configuration for %s.", - "item.refinedstorage2.configuration_card.copied_configuration": "Copied configuration for %s.", - "item.refinedstorage2.configuration_card.cleared_configuration": "Cleared configuration.", - "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Cannot apply configuration card to different type of device. It is configured for %s.", + "item.refinedstorage2.configuration_card.configured": "Contient une configuration pour %s.", + "item.refinedstorage2.configuration_card.copied_configuration": "Configuration copiée pour %s.", + "item.refinedstorage2.configuration_card.cleared_configuration": "Configuration effacée.", + "item.refinedstorage2.configuration_card.cannot_apply_configuration": "Impossible d'appliquer la carte de configuration à un autre type d'appareil. Elle est configurée pour %s.", "item.refinedstorage2.configuration_card.applied_configuration": "Applied configuration.", "item.refinedstorage2.configuration_card.empty_help": "Use on a storage network device while crouching to copy its configuration and upgrades to the card.", "item.refinedstorage2.configuration_card.configured_help": "Use on the destination storage network device while crouching to transfer the configuration and upgrades. Use while crouching to clear.", @@ -247,7 +247,7 @@ "curios.identifier.refinedstorage2": "Refined Storage 2", "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", "text.autoconfig.refinedstorage2.title": "Refined Storage 2", - "text.autoconfig.refinedstorage2.option.grid": "Grid", + "text.autoconfig.refinedstorage2.option.grid": "Grille", "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", @@ -283,15 +283,15 @@ "text.autoconfig.refinedstorage2.option.fluidStorageBlock.thousandTwentyFourBEnergyUsage": "1024B energy usage", "text.autoconfig.refinedstorage2.option.fluidStorageBlock.fourThousandNinetySixBEnergyUsage": "4096B energy usage", "text.autoconfig.refinedstorage2.option.fluidStorageBlock.creativeEnergyUsage": "Creative energy usage", - "text.autoconfig.refinedstorage2.option.importer": "Importer", + "text.autoconfig.refinedstorage2.option.importer": "Importateur", "text.autoconfig.refinedstorage2.option.importer.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.exporter": "Exporter", + "text.autoconfig.refinedstorage2.option.exporter": "Exportateur", "text.autoconfig.refinedstorage2.option.exporter.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.detector": "Detector", + "text.autoconfig.refinedstorage2.option.detector": "Détecteur", "text.autoconfig.refinedstorage2.option.detector.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.constructor": "Constructor", + "text.autoconfig.refinedstorage2.option.constructor": "Constructeur", "text.autoconfig.refinedstorage2.option.constructor.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.destructor": "Destructor", + "text.autoconfig.refinedstorage2.option.destructor": "Destructeur", "text.autoconfig.refinedstorage2.option.destructor.energyUsage": "Energy usage", "text.autoconfig.refinedstorage2.option.upgrade": "Upgrade", "text.autoconfig.refinedstorage2.option.upgrade.speedUpgradeEnergyUsage": "Speed Upgrade energy usage", @@ -306,9 +306,9 @@ "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", "text.autoconfig.refinedstorage2.option.iface": "Interface", "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", + "text.autoconfig.refinedstorage2.option.externalStorage": "Stockage Externe", "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", + "text.autoconfig.refinedstorage2.option.wirelessGrid": "Grille sans fil", "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", "text.autoconfig.refinedstorage2.option.wirelessGrid.insertEnergyUsage": "Insert energy usage", @@ -316,13 +316,13 @@ "text.autoconfig.refinedstorage2.option.wirelessTransmitter": "Wireless Transmitter", "text.autoconfig.refinedstorage2.option.wirelessTransmitter.energyUsage": "Energy usage", "text.autoconfig.refinedstorage2.option.wirelessTransmitter.baseRange": "Base range", - "text.autoconfig.refinedstorage2.option.storageMonitor": "Storage Monitor", + "text.autoconfig.refinedstorage2.option.storageMonitor": "Moniteur de Stockage", "text.autoconfig.refinedstorage2.option.storageMonitor.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.networkReceiver": "Network Receiver", + "text.autoconfig.refinedstorage2.option.networkReceiver": "Récepteur Réseau", "text.autoconfig.refinedstorage2.option.networkReceiver.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.networkTransmitter": "Network Transmitter", + "text.autoconfig.refinedstorage2.option.networkTransmitter": "Transmetteur Réseau", "text.autoconfig.refinedstorage2.option.networkTransmitter.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.portableGrid": "Portable Grid", + "text.autoconfig.refinedstorage2.option.portableGrid": "Grille portable", "text.autoconfig.refinedstorage2.option.portableGrid.energyCapacity": "Energy capacity", "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", From adc5a4f13a9b67e158d96e325d3e7274253879c9 Mon Sep 17 00:00:00 2001 From: Raoul Date: Tue, 19 Mar 2024 15:41:11 +0100 Subject: [PATCH 26/59] chore: update translation Polish from crowdin --- .../assets/refinedstorage2/lang/pl_pl.json | 198 +++++++++--------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json index 2a5ee438e..de98e8bce 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/pl_pl.json @@ -2,99 +2,99 @@ "itemGroup.refinedstorage2.general": "Refined Storage 2", "block.refinedstorage2.cable": "Kabel", "block.refinedstorage2.quartz_enriched_iron_block": "Blok kwarcowego żelaza", - "block.refinedstorage2.disk_drive": "Disk Drive", - "block.refinedstorage2.machine_casing": "Machine Casing", - "block.refinedstorage2.grid": "Grid", - "block.refinedstorage2.crafting_grid": "Crafting Grid", - "block.refinedstorage2.controller": "Controller", - "block.refinedstorage2.controller.rei_fully_charged": "Fully charged Controller", - "block.refinedstorage2.creative_controller": "Creative Controller", - "block.refinedstorage2.1k_storage_block": "1K Storage Block", - "block.refinedstorage2.4k_storage_block": "4K Storage Block", - "block.refinedstorage2.16k_storage_block": "16K Storage Block", - "block.refinedstorage2.64k_storage_block": "64K Storage Block", - "block.refinedstorage2.creative_storage_block": "Creative Storage Block", - "block.refinedstorage2.64b_fluid_storage_block": "64B Fluid Storage Block", - "block.refinedstorage2.256b_fluid_storage_block": "256B Fluid Storage Block", - "block.refinedstorage2.1024b_fluid_storage_block": "1024B Fluid Storage Block", - "block.refinedstorage2.4096b_fluid_storage_block": "4096B Fluid Storage Block", - "block.refinedstorage2.creative_fluid_storage_block": "Creative Fluid Storage Block", + "block.refinedstorage2.disk_drive": "Napęd dysku", + "block.refinedstorage2.machine_casing": "Osłona maszyny", + "block.refinedstorage2.grid": "Terminal", + "block.refinedstorage2.crafting_grid": "Terminal rzemieślniczy", + "block.refinedstorage2.controller": "Kontroler", + "block.refinedstorage2.controller.rei_fully_charged": "Kontroler w pełni naładowany", + "block.refinedstorage2.creative_controller": "Kontroler kreatywny", + "block.refinedstorage2.1k_storage_block": "Blok pamięci 1k", + "block.refinedstorage2.4k_storage_block": "Blok pamięci 4k", + "block.refinedstorage2.16k_storage_block": "Blok pamięci 16k", + "block.refinedstorage2.64k_storage_block": "Blok pamięci 64k", + "block.refinedstorage2.creative_storage_block": "Kreatywny blok pamięci", + "block.refinedstorage2.64b_fluid_storage_block": "Blok pamięci płynów 64B", + "block.refinedstorage2.256b_fluid_storage_block": "Blok pamięci płynów 256B", + "block.refinedstorage2.1024b_fluid_storage_block": "Blok pamięci płynów 1024B", + "block.refinedstorage2.4096b_fluid_storage_block": "Blok pamięci płynów 4096B", + "block.refinedstorage2.creative_fluid_storage_block": "Kreatywny blok pamięci płynów", "block.refinedstorage2.importer": "Importer", - "block.refinedstorage2.exporter": "Exporter", - "block.refinedstorage2.interface": "Interface", - "block.refinedstorage2.external_storage": "External Storage", - "block.refinedstorage2.detector": "Detector", - "block.refinedstorage2.constructor": "Constructor", - "block.refinedstorage2.destructor": "Destructor", - "block.refinedstorage2.wireless_transmitter": "Wireless Transmitter", - "block.refinedstorage2.storage_monitor": "Storage Monitor", - "block.refinedstorage2.network_receiver": "Network Receiver", - "block.refinedstorage2.network_transmitter": "Network Transmitter", - "block.refinedstorage2.portable_grid": "Portable Grid", - "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", - "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", - "gui.refinedstorage2.disk_drive.disks": "Disks", + "block.refinedstorage2.exporter": "Eksporter", + "block.refinedstorage2.interface": "Interfejs", + "block.refinedstorage2.external_storage": "Zewnętrzny magazyn", + "block.refinedstorage2.detector": "Detektor", + "block.refinedstorage2.constructor": "Konstruktor", + "block.refinedstorage2.destructor": "Destruktor", + "block.refinedstorage2.wireless_transmitter": "Nadajnik bezprzewodowy", + "block.refinedstorage2.storage_monitor": "Monitor magazynu", + "block.refinedstorage2.network_receiver": "Odbiornik sieci", + "block.refinedstorage2.network_transmitter": "Nadajnik sieci", + "block.refinedstorage2.portable_grid": "Przenośny terminal", + "block.refinedstorage2.creative_portable_grid": "Kreatywny przenośny terminal", + "gui.refinedstorage2.controller.redstone_mode_help": "Gdy to urządzenie jest nieaktywne, sieć magazynowa nie będzie w stanie używać tego urządzenia jako źródła energii.", + "gui.refinedstorage2.disk_drive.disks": "Dyski", "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", "gui.refinedstorage2.storage.filter_help": "The resources that may or may not be allowed in this storage, depending if the device is in allowlist or blocklist mode.", "gui.refinedstorage2.storage.filter_mode.empty_warning": "Without any configured filters, no resources will be accepted in this storage.", "gui.refinedstorage2.storage.filter_mode.allow.help": "Only allow resources into this storage that are configured in the filters.", "gui.refinedstorage2.storage.filter_mode.block.help": "Disallow resources into this storage that are configured in the filters.", - "gui.refinedstorage2.grid.sorting.direction": "Sorting direction", - "gui.refinedstorage2.grid.sorting.direction.ascending": "Ascending", - "gui.refinedstorage2.grid.sorting.direction.descending": "Descending", - "gui.refinedstorage2.grid.sorting.type": "Sorting type", - "gui.refinedstorage2.grid.sorting.type.quantity": "Quantity", - "gui.refinedstorage2.grid.sorting.type.name": "Name", - "gui.refinedstorage2.grid.sorting.type.id": "ID", - "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", - "gui.refinedstorage2.grid.size": "Size", - "gui.refinedstorage2.grid.size.stretch": "Stretch", - "gui.refinedstorage2.grid.size.small": "Small", - "gui.refinedstorage2.grid.size.medium": "Medium", - "gui.refinedstorage2.grid.size.large": "Large", - "gui.refinedstorage2.grid.size.extra_large": "Extra large", - "gui.refinedstorage2.grid.auto_selected": "Auto-selected", + "gui.refinedstorage2.grid.sorting.direction": "Kierunek sortowania", + "gui.refinedstorage2.grid.sorting.direction.ascending": "Rosnąco", + "gui.refinedstorage2.grid.sorting.direction.descending": "Malejąco", + "gui.refinedstorage2.grid.sorting.type": "Rodzaj sortowania", + "gui.refinedstorage2.grid.sorting.type.quantity": "Ilość", + "gui.refinedstorage2.grid.sorting.type.name": "Nazwa", + "gui.refinedstorage2.grid.sorting.type.id": "Identyfikator", + "gui.refinedstorage2.grid.sorting.type.last_modified": "Ostatnia modyfikacja", + "gui.refinedstorage2.grid.size": "Rozmiar", + "gui.refinedstorage2.grid.size.stretch": "Rozciągnięcie", + "gui.refinedstorage2.grid.size.small": "Mały", + "gui.refinedstorage2.grid.size.medium": "Średni", + "gui.refinedstorage2.grid.size.large": "Duży", + "gui.refinedstorage2.grid.size.extra_large": "Bardzo duży", + "gui.refinedstorage2.grid.auto_selected": "Automatycznie zaznaczone", "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", - "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", - "gui.refinedstorage2.grid.synchronizer.off": "Off", - "gui.refinedstorage2.grid.synchronizer.off.help": "Don't sync the search box text.", + "gui.refinedstorage2.grid.synchronizer": "Tryb synchronizacji", + "gui.refinedstorage2.grid.synchronizer.off": "Wyłączone", + "gui.refinedstorage2.grid.synchronizer.off.help": "Nie synchronizuj tekstu pola wyszukiwania.", "gui.refinedstorage2.grid.synchronizer.jei": "JEI", - "gui.refinedstorage2.grid.synchronizer.jei.help": "Sync the search box text to the JEI filter.", - "gui.refinedstorage2.grid.synchronizer.jei.two_way": "JEI two-way", - "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.jei.help": "Synchronizuj pole wyszukiwania z filtrem JEI.", + "gui.refinedstorage2.grid.synchronizer.jei.two_way": "Dwukierunkowe JEI", + "gui.refinedstorage2.grid.synchronizer.jei.two_way.help": "Synchronizuj pole wyszukiwania z filtrem JEI i filtr JEI do pola wyszukiwania.", "gui.refinedstorage2.grid.synchronizer.rei": "REI", - "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", - "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", - "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", - "gui.refinedstorage2.grid.resource_type": "Resource type", - "gui.refinedstorage2.grid.resource_type.all": "All", - "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", - "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", - "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", - "gui.refinedstorage2.detector.mode": "Mode", - "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", - "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", - "gui.refinedstorage2.detector.mode.above": "Emit redstone signal when above the amount", - "gui.refinedstorage2.detector.filter_help": "The resource that should be detected in the storage network.", - "gui.refinedstorage2.destructor.pickup_items": "Pickup items instead of breaking", - "gui.refinedstorage2.destructor.filter_help": "The blocks that may or may not be destroyed, depending if the device is in allowlist or blocklist mode.", - "gui.refinedstorage2.destructor.filter_mode.allow.help": "Only allow blocks into the storage network that are configured in the filters.", - "gui.refinedstorage2.destructor.filter_mode.block.help": "Disallow blocks into the storage network that are configured in the filters.", - "gui.refinedstorage2.constructor.drop_items": "Drop items instead of placing blocks", - "gui.refinedstorage2.constructor.filter_help": "The resources that should be placed from the storage network.", - "gui.refinedstorage2.interface.filter_help": "The resources that should be exported from the storage network.", - "gui.refinedstorage2.exporter.filter_help": "The resources that should be exported from the storage network.", - "gui.refinedstorage2.importer.filter_help": "The resources that may be imported from the target inventory.", - "gui.refinedstorage2.importer.filter_mode.allow.help": "Only allow resources into the storage network that are configured in the filters.", - "gui.refinedstorage2.importer.filter_mode.block.help": "Disallow resources into the storage network that are configured in the filters.", - "gui.refinedstorage2.wireless_transmitter.distance": "%d block(s)", - "gui.refinedstorage2.storage_monitor.filter_help": "The resource to display.", - "gui.refinedstorage2.redstone_mode": "Redstone mode", - "gui.refinedstorage2.redstone_mode.ignore": "Ignore", - "gui.refinedstorage2.redstone_mode.ignore.help": "This device will always be active, regardless of redstone signal.", - "gui.refinedstorage2.redstone_mode.high": "High", - "gui.refinedstorage2.redstone_mode.high.help": "This device will only be active with a redstone signal.", - "gui.refinedstorage2.redstone_mode.low": "Low", + "gui.refinedstorage2.grid.synchronizer.rei.help": "Synchronizuj pole wyszukiwania z filtrem REI.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way": "Dwukierunkowe REI", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Synchronizuj pole wyszukiwania z filtrem REI i filtr REI do pola wyszukiwania.", + "gui.refinedstorage2.grid.resource_type": "Typ zasobu", + "gui.refinedstorage2.grid.resource_type.all": "Wszystko", + "gui.refinedstorage2.grid.resource_type.help": "Filtruj określone typy zasobów.", + "gui.refinedstorage2.crafting_grid.move.network": "Przenieś przedmioty do sieci", + "gui.refinedstorage2.crafting_grid.move.inventory": "Przenieś przedmioty do ekwipunku", + "gui.refinedstorage2.detector.mode": "Tryb", + "gui.refinedstorage2.detector.mode.under": "Emituj sygnał redstone, kiedy poniżej danej ilości", + "gui.refinedstorage2.detector.mode.equal": "Emituj sygnał redstone, kiedy dana ilość", + "gui.refinedstorage2.detector.mode.above": "Emituj sygnał redstone, kiedy powyżej danej ilości", + "gui.refinedstorage2.detector.filter_help": "Zasób, który powinien zostać wykryty w sieci magazynowania.", + "gui.refinedstorage2.destructor.pickup_items": "Ponieść przedmiot, zamiast niszczyć", + "gui.refinedstorage2.destructor.filter_help": "Bloki, które mogą lub nie mogą być zniszczone, w zależności od tego, czy urządzenie jest w trybie dozwolonych lub zablokowanych.", + "gui.refinedstorage2.destructor.filter_mode.allow.help": "Zezwalaj tylko na bloki do sieci magazynowej, które są skonfigurowane w filtrach.", + "gui.refinedstorage2.destructor.filter_mode.block.help": "Nie zezwalaj na bloki do sieci magazynowej, które są skonfigurowane w filtrach.", + "gui.refinedstorage2.constructor.drop_items": "Upuszczaj przedmioty zamiast stawiania bloków", + "gui.refinedstorage2.constructor.filter_help": "Zasób, który zostać postawiony z sieci magazynowania.", + "gui.refinedstorage2.interface.filter_help": "Zasoby, które powinny być eksportowane z sieci magazynowania.", + "gui.refinedstorage2.exporter.filter_help": "Zasoby, które powinny być eksportowane z sieci magazynowania.", + "gui.refinedstorage2.importer.filter_help": "Zasoby, które mogą być importowane z docelowego ekwipunku.", + "gui.refinedstorage2.importer.filter_mode.allow.help": "Zezwalaj tylko na zasoby do sieci magazynowej, które są skonfigurowane w filtrach.", + "gui.refinedstorage2.importer.filter_mode.block.help": "Nie zezwalaj na zasoby do sieci magazynowej, które są skonfigurowane w filtrach.", + "gui.refinedstorage2.wireless_transmitter.distance": "%d blok(ów)", + "gui.refinedstorage2.storage_monitor.filter_help": "Zasób do wyświetlenia.", + "gui.refinedstorage2.redstone_mode": "Tryb redstone", + "gui.refinedstorage2.redstone_mode.ignore": "Ignoruj", + "gui.refinedstorage2.redstone_mode.ignore.help": "To urządzenie będzie zawsze aktywne, niezależnie od sygnału redstone.", + "gui.refinedstorage2.redstone_mode.high": "Wysoki", + "gui.refinedstorage2.redstone_mode.high.help": "To urządzenie będzie aktywne tylko z sygnałem redstone.", + "gui.refinedstorage2.redstone_mode.low": "Niski", "gui.refinedstorage2.redstone_mode.low.help": "This device will only be active without a redstone signal.", "gui.refinedstorage2.scheduling_mode": "Scheduling mode", "gui.refinedstorage2.scheduling_mode.default": "Default", @@ -139,18 +139,18 @@ "gui.refinedstorage2.filter_slot.click_to_clear": "Click to clear", "gui.refinedstorage2.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", "gui.refinedstorage2.network_transmitter.status.inactive": "Inactive", - "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", - "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", - "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", - "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", - "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", - "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", - "item.refinedstorage2.grid.help": "Allows for interacting with the storage network.", - "item.refinedstorage2.crafting_grid.help": "Allows for interacting with the storage network, with crafting abilities.", - "item.refinedstorage2.importer.help": "Imports resources from an external source to the storage network.", - "item.refinedstorage2.exporter.help": "Exports resources from the storage network to an external destination.", + "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Brak karty sieci", + "gui.refinedstorage2.network_transmitter.status.transmitting": "%d blok(ów)", + "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Nieosiągalny", + "item.refinedstorage2.controller.help": "Zapewnia sieć magazynowania w energie. Sieć może mieć ich kilka.", + "item.refinedstorage2.creative_controller.help": "Zapewnia sieć magazynowania w nieskończoną energię.", + "item.refinedstorage2.disk_drive.help": "Akceptuje dyski do zapewnienia przestrzeni dyskowej dla sieci magazynowania.", + "item.refinedstorage2.grid.help": "Umożliwia interakcję z siecią magazynowania.", + "item.refinedstorage2.crafting_grid.help": "Umożliwia interakcję z siecią magazynowania, z możliwością tworzenia.", + "item.refinedstorage2.importer.help": "Importuj zasoby ze źródła zewnętrznego do sieci magazynowej.", + "item.refinedstorage2.exporter.help": "Eksport zasobów z sieci magazynowej do zewnętrznego miejsca przeznaczenia.", "item.refinedstorage2.interface.help": "Acts as the combination of an Importer and Exporter.", - "item.refinedstorage2.external_storage.help": "Provides the storage network with storage from an external source.", + "item.refinedstorage2.external_storage.help": "Dostarcza pamięć z zewnętrznego źródła.", "item.refinedstorage2.detector.help": "Emits a redstone signal if the storage network contains a resource equal, above or under a given amount.", "item.refinedstorage2.constructor.help": "Places blocks from the storage network in the world.", "item.refinedstorage2.destructor.help": "Destroys blocks from the world and puts them in the storage network.", @@ -306,8 +306,8 @@ "text.autoconfig.refinedstorage2.option.upgrade.rangeUpgradeRange": "Range Upgrade range", "text.autoconfig.refinedstorage2.option.iface": "Interface", "text.autoconfig.refinedstorage2.option.iface.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.externalStorage": "External Storage", - "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.externalStorage": "Zewnętrzny magazyn", + "text.autoconfig.refinedstorage2.option.externalStorage.energyUsage": "Zużycie energii", "text.autoconfig.refinedstorage2.option.wirelessGrid": "Wireless Grid", "text.autoconfig.refinedstorage2.option.wirelessGrid.energyCapacity": "Energy capacity", "text.autoconfig.refinedstorage2.option.wirelessGrid.openEnergyUsage": "Open energy usage", @@ -348,8 +348,8 @@ "advancements.refinedstorage2.upgrading.description": "Craft an Upgrade to improve various devices", "advancements.refinedstorage2.interface_to_the_world": "Interface to the world", "advancements.refinedstorage2.interface_to_the_world.description": "Export and import items at the same time with an Interface", - "advancements.refinedstorage2.storing_externally": "Storing externally", - "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", + "advancements.refinedstorage2.storing_externally": "Przechowywanie zewnętrzne", + "advancements.refinedstorage2.storing_externally.description": "Użyj zewnętrznego magazynu, aby zapewnić sieć w pamięć z zewnętrznego bloku jak skrzynia", "advancements.refinedstorage2.detecting": "Detecting", "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", "advancements.refinedstorage2.construction": "Construction", From 1c9d66d32ad6877a98957332b3af0965f6912b0a Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 16 Mar 2024 21:11:38 +0100 Subject: [PATCH 27/59] refactor: move network components to their related package instead of one global package --- .../refinedstorage2/api/network/Network.java | 1 - .../network/{component => }/NetworkComponent.java | 8 +------- .../EnergyNetworkComponent.java | 4 +++- .../{component => node}/GraphNetworkComponent.java | 3 ++- .../node/container/NetworkNodeContainer.java | 3 ++- .../StorageNetworkComponent.java | 3 ++- .../{component => storage}/StorageProvider.java | 2 +- .../{component => storage}/package-info.java | 2 +- .../network/test/NetworkTestExtension.java | 4 ++-- .../network/test/NetworkTestFixtures.java | 14 +++++++------- .../network/test/NetworkTestExtensionTest.java | 6 +++--- .../api/network/impl/NetworkBuilderImpl.java | 2 +- .../api/network/impl/NetworkFactory.java | 2 +- .../api/network/impl/NetworkImpl.java | 2 +- .../api/network/impl/component/package-info.java | 7 ------- .../EnergyNetworkComponentImpl.java | 5 ++--- .../GraphNetworkComponentImpl.java | 4 ++-- .../detector/AbstractDetectorAmountStrategy.java | 2 +- .../exporter/ExporterTransferStrategyImpl.java | 2 +- .../ExternalStorageNetworkNode.java | 2 +- .../network/impl/node/grid/GridNetworkNode.java | 2 +- .../impl/node/iface/InterfaceNetworkNode.java | 2 +- .../importer/ImporterTransferStrategyImpl.java | 2 +- .../node/multistorage/MultiStorageNetworkNode.java | 2 +- .../impl/node/storage/StorageNetworkNode.java | 2 +- .../network/impl/storage/AbstractNetworkNode.java | 2 +- .../impl/storage/AbstractStorageNetworkNode.java | 2 +- .../StorageNetworkComponentImpl.java | 6 +++--- .../impl/AbstractNetworkBuilderImplTest.java | 2 +- .../impl/InitializeNetworkBuilderImplTest.java | 2 +- .../network/impl/RemoveNetworkBuilderImplTest.java | 2 +- .../network/impl/UpdateNetworkBuilderImplTest.java | 2 +- .../EnergyNetworkComponentImplTest.java | 5 ++--- .../GraphNetworkComponentImplTest.java | 5 ++--- .../network/impl/node/SimpleNetworkNodeTest.java | 2 +- .../exporter/AbstractExporterNetworkNodeTest.java | 2 +- .../impl/node/iface/InterfaceNetworkNodeTest.java | 2 +- .../node/importer/ImporterNetworkNodeTest.java | 2 +- .../StorageNetworkComponentImplTest.java | 4 ++-- .../refinedstorage2/platform/api/PlatformApi.java | 2 +- .../platform/api/PlatformApiProxy.java | 2 +- .../platform/common/AbstractModInitializer.java | 10 +++++----- .../platform/common/PlatformApiImpl.java | 2 +- .../AbstractItemConstructorStrategy.java | 2 +- .../BlockBreakDestructorStrategy.java | 2 +- .../FluidBreakDestructorStrategy.java | 2 +- .../ItemPickupDestructorStrategy.java | 2 +- .../PlaceFluidConstructorStrategy.java | 2 +- .../common/grid/AbstractGridBlockEntity.java | 2 +- .../common/grid/CraftingGridBlockEntity.java | 2 +- .../common/grid/CraftingGridSourceImpl.java | 2 +- .../platform/common/grid/WirelessGrid.java | 4 ++-- .../networking/NetworkTransmitterBlockEntity.java | 2 +- .../FluidStorageMonitorExtractionStrategy.java | 2 +- .../FluidStorageMonitorInsertionStrategy.java | 2 +- .../ItemStorageMonitorExtractionStrategy.java | 2 +- .../ItemStorageMonitorInsertionStrategy.java | 2 +- .../storagemonitor/StorageMonitorBlockEntity.java | 2 +- .../NetworkNodeContainerBlockEntityImpl.java | 2 +- .../bounditem/NetworkBoundItemSessionImpl.java | 2 +- .../component/PlatformStorageNetworkComponent.java | 2 +- 61 files changed, 85 insertions(+), 97 deletions(-) rename refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/{component => }/NetworkComponent.java (81%) rename refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/{component => energy}/EnergyNetworkComponent.java (65%) rename refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/{component => node}/GraphNetworkComponent.java (89%) rename refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/{component => storage}/StorageNetworkComponent.java (79%) rename refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/{component => storage}/StorageProvider.java (94%) rename refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/{component => storage}/package-info.java (76%) delete mode 100644 refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/package-info.java rename refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/{component => energy}/EnergyNetworkComponentImpl.java (82%) rename refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/{component => node}/GraphNetworkComponentImpl.java (96%) rename refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/{component => storage}/StorageNetworkComponentImpl.java (88%) rename refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/{component => energy}/EnergyNetworkComponentImplTest.java (92%) rename refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/{component => node}/GraphNetworkComponentImplTest.java (97%) rename refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/{component => storage}/StorageNetworkComponentImplTest.java (96%) diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/Network.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/Network.java index a0dba68c0..1eaec0ac4 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/Network.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/Network.java @@ -1,7 +1,6 @@ package com.refinedmods.refinedstorage2.api.network; import com.refinedmods.refinedstorage2.api.core.component.ComponentAccessor; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import java.util.Set; diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/NetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/NetworkComponent.java similarity index 81% rename from refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/NetworkComponent.java rename to refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/NetworkComponent.java index 1d669a715..6795743a1 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/NetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/NetworkComponent.java @@ -1,6 +1,5 @@ -package com.refinedmods.refinedstorage2.api.network.component; +package com.refinedmods.refinedstorage2.api.network; -import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import java.util.Set; @@ -10,22 +9,17 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.1.1") public interface NetworkComponent { default void onContainerAdded(NetworkNodeContainer container) { - } default void onContainerRemoved(NetworkNodeContainer container) { - } default void onNetworkRemoved() { - } default void onNetworkSplit(Set networks) { - } default void onNetworkMergedWith(Network newMainNetwork) { - } } diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/EnergyNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/energy/EnergyNetworkComponent.java similarity index 65% rename from refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/EnergyNetworkComponent.java rename to refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/energy/EnergyNetworkComponent.java index c8f6067b3..59f01fd78 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/EnergyNetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/energy/EnergyNetworkComponent.java @@ -1,4 +1,6 @@ -package com.refinedmods.refinedstorage2.api.network.component; +package com.refinedmods.refinedstorage2.api.network.energy; + +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import org.apiguardian.api.API; diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/GraphNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/GraphNetworkComponent.java similarity index 89% rename from refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/GraphNetworkComponent.java rename to refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/GraphNetworkComponent.java index 3fd9c1071..4da9fa7f0 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/GraphNetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/GraphNetworkComponent.java @@ -1,5 +1,6 @@ -package com.refinedmods.refinedstorage2.api.network.component; +package com.refinedmods.refinedstorage2.api.network.node; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import java.util.Set; diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java index 3f7aaf65d..5964ff5ef 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage2.api.network.node.container; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; import javax.annotation.Nullable; @@ -18,7 +19,7 @@ public interface NetworkNodeContainer { * If it changes after adding it into the graph, the container would not be removed from the key index when the * container is removed! * The container can be queried by - * {@link com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent#getContainer(Object)}. + * {@link GraphNetworkComponent#getContainer(Object)}. * * @return the key, or null if indexing is not required */ diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/StorageNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/StorageNetworkComponent.java similarity index 79% rename from refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/StorageNetworkComponent.java rename to refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/StorageNetworkComponent.java index 80abdd04e..7b6a9ad0d 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/StorageNetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/StorageNetworkComponent.java @@ -1,5 +1,6 @@ -package com.refinedmods.refinedstorage2.api.network.component; +package com.refinedmods.refinedstorage2.api.network.storage; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.TrackedResourceAmount; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/StorageProvider.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/StorageProvider.java similarity index 94% rename from refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/StorageProvider.java rename to refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/StorageProvider.java index efb73f178..ee7e1cad5 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/StorageProvider.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/StorageProvider.java @@ -1,4 +1,4 @@ -package com.refinedmods.refinedstorage2.api.network.component; +package com.refinedmods.refinedstorage2.api.network.storage; import com.refinedmods.refinedstorage2.api.storage.Storage; diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/package-info.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/package-info.java similarity index 76% rename from refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/package-info.java rename to refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/package-info.java index 6eb332e32..8ed1419ba 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/component/package-info.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/storage/package-info.java @@ -1,6 +1,6 @@ @ParametersAreNonnullByDefault @FieldsAndMethodsAreNonnullByDefault -package com.refinedmods.refinedstorage2.api.network.component; +package com.refinedmods.refinedstorage2.api.network.storage; import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; diff --git a/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtension.java b/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtension.java index 7eabe5bba..96c5afaa1 100644 --- a/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtension.java +++ b/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtension.java @@ -2,13 +2,13 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; import com.refinedmods.refinedstorage2.api.network.impl.NetworkImpl; import com.refinedmods.refinedstorage2.api.network.impl.energy.EnergyStorageImpl; import com.refinedmods.refinedstorage2.api.network.impl.node.controller.ControllerNetworkNode; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; import com.refinedmods.refinedstorage2.network.test.nodefactory.NetworkNodeFactory; diff --git a/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestFixtures.java b/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestFixtures.java index c32013a72..71914cc5f 100644 --- a/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestFixtures.java +++ b/refinedstorage2-network-test/src/main/java/com/refinedmods/refinedstorage2/network/test/NetworkTestFixtures.java @@ -2,13 +2,13 @@ import com.refinedmods.refinedstorage2.api.core.component.ComponentMapFactory; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.impl.component.EnergyNetworkComponentImpl; -import com.refinedmods.refinedstorage2.api.network.impl.component.GraphNetworkComponentImpl; -import com.refinedmods.refinedstorage2.api.network.impl.component.StorageNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.impl.energy.EnergyNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.impl.node.GraphNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.impl.storage.StorageNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.list.ResourceListImpl; public final class NetworkTestFixtures { diff --git a/refinedstorage2-network-test/src/test/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtensionTest.java b/refinedstorage2-network-test/src/test/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtensionTest.java index 45af0666f..fa703a9b1 100644 --- a/refinedstorage2-network-test/src/test/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtensionTest.java +++ b/refinedstorage2-network-test/src/test/java/com/refinedmods/refinedstorage2/network/test/NetworkTestExtensionTest.java @@ -1,13 +1,13 @@ package com.refinedmods.refinedstorage2.network.test; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; import com.refinedmods.refinedstorage2.api.network.impl.node.multistorage.MultiStorageNetworkNode; import com.refinedmods.refinedstorage2.api.network.impl.node.storage.StorageNetworkNode; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; import com.refinedmods.refinedstorage2.network.test.nodefactory.AbstractNetworkNodeFactory; import com.refinedmods.refinedstorage2.network.test.nodefactory.MultiStorageNetworkNodeFactory; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkBuilderImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkBuilderImpl.java index 5023859cc..52404150c 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkBuilderImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkBuilderImpl.java @@ -5,7 +5,7 @@ import com.refinedmods.refinedstorage2.api.network.Connections; import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.NetworkBuilder; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkFactory.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkFactory.java index 9cf601583..e03c4d389 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkFactory.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkFactory.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.component.ComponentMapFactory; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; public class NetworkFactory { private final ComponentMapFactory componentMapFactory; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkImpl.java index b9e1378d0..fd14afd8c 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/NetworkImpl.java @@ -3,7 +3,7 @@ import com.refinedmods.refinedstorage2.api.core.component.ComponentMap; import com.refinedmods.refinedstorage2.api.core.component.ComponentMapFactory; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import java.util.Set; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/package-info.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/package-info.java deleted file mode 100644 index af8789144..000000000 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@FieldsAndMethodsAreNonnullByDefault -package com.refinedmods.refinedstorage2.api.network.impl.component; - -import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/EnergyNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/energy/EnergyNetworkComponentImpl.java similarity index 82% rename from refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/EnergyNetworkComponentImpl.java rename to refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/energy/EnergyNetworkComponentImpl.java index 142afe2c2..e9bfe0a3b 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/EnergyNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/energy/EnergyNetworkComponentImpl.java @@ -1,9 +1,8 @@ -package com.refinedmods.refinedstorage2.api.network.impl.component; +package com.refinedmods.refinedstorage2.api.network.impl.energy; import com.refinedmods.refinedstorage2.api.core.Action; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; -import com.refinedmods.refinedstorage2.api.network.impl.energy.CompositeEnergyStorage; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; public class EnergyNetworkComponentImpl implements EnergyNetworkComponent { diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/GraphNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/GraphNetworkComponentImpl.java similarity index 96% rename from refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/GraphNetworkComponentImpl.java rename to refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/GraphNetworkComponentImpl.java index 9ce369dc1..8abdde984 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/GraphNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/GraphNetworkComponentImpl.java @@ -1,7 +1,7 @@ -package com.refinedmods.refinedstorage2.api.network.impl.component; +package com.refinedmods.refinedstorage2.api.network.impl.node; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import java.util.Collections; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/detector/AbstractDetectorAmountStrategy.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/detector/AbstractDetectorAmountStrategy.java index 0266f5c37..84000d748 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/detector/AbstractDetectorAmountStrategy.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/detector/AbstractDetectorAmountStrategy.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.detector; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; public abstract class AbstractDetectorAmountStrategy implements DetectorAmountStrategy { diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/ExporterTransferStrategyImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/ExporterTransferStrategyImpl.java index 587f0201f..086e9250c 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/ExporterTransferStrategyImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/ExporterTransferStrategyImpl.java @@ -1,8 +1,8 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.exporter; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.exporter.ExporterTransferStrategy; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.InsertableStorage; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/externalstorage/ExternalStorageNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/externalstorage/ExternalStorageNetworkNode.java index 6d4d66bb2..7ea8a845b 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/externalstorage/ExternalStorageNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/externalstorage/ExternalStorageNetworkNode.java @@ -1,8 +1,8 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.externalstorage; -import com.refinedmods.refinedstorage2.api.network.component.StorageProvider; import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractStorageNetworkNode; import com.refinedmods.refinedstorage2.api.network.node.externalstorage.ExternalStorageProviderFactory; +import com.refinedmods.refinedstorage2.api.network.storage.StorageProvider; import com.refinedmods.refinedstorage2.api.storage.Storage; import com.refinedmods.refinedstorage2.api.storage.external.ExternalStorage; import com.refinedmods.refinedstorage2.api.storage.tracked.TrackedStorageRepository; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/grid/GridNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/grid/GridNetworkNode.java index 255721c6c..1df665710 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/grid/GridNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/grid/GridNetworkNode.java @@ -4,8 +4,8 @@ import com.refinedmods.refinedstorage2.api.grid.watcher.GridWatcherManager; import com.refinedmods.refinedstorage2.api.grid.watcher.GridWatcherManagerImpl; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.storage.Actor; import javax.annotation.Nullable; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNode.java index 5ebb5580e..95a969da1 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNode.java @@ -1,11 +1,11 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.iface; import com.refinedmods.refinedstorage2.api.core.Action; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.node.externalstorage.ExposedExternalStorage; import com.refinedmods.refinedstorage2.api.network.impl.node.iface.externalstorage.InterfaceExternalStorageProvider; import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode; import com.refinedmods.refinedstorage2.api.network.node.NetworkNodeActor; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.Storage; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterTransferStrategyImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterTransferStrategyImpl.java index eaf157014..bd343045f 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterTransferStrategyImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterTransferStrategyImpl.java @@ -1,8 +1,8 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.importer; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.importer.ImporterTransferStrategy; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.resource.filter.Filter; import com.refinedmods.refinedstorage2.api.storage.Actor; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/multistorage/MultiStorageNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/multistorage/MultiStorageNetworkNode.java index 667f40117..463778f84 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/multistorage/MultiStorageNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/multistorage/MultiStorageNetworkNode.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.multistorage; -import com.refinedmods.refinedstorage2.api.network.component.StorageProvider; import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractStorageNetworkNode; +import com.refinedmods.refinedstorage2.api.network.storage.StorageProvider; import com.refinedmods.refinedstorage2.api.storage.StateTrackedStorage; import com.refinedmods.refinedstorage2.api.storage.Storage; import com.refinedmods.refinedstorage2.api.storage.StorageState; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/storage/StorageNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/storage/StorageNetworkNode.java index 6b0b57a45..ca7e2773f 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/storage/StorageNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/storage/StorageNetworkNode.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.storage; -import com.refinedmods.refinedstorage2.api.network.component.StorageProvider; import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractStorageNetworkNode; +import com.refinedmods.refinedstorage2.api.network.storage.StorageProvider; import com.refinedmods.refinedstorage2.api.storage.Storage; import javax.annotation.Nullable; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractNetworkNode.java index 8a6955d77..62668a51e 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractNetworkNode.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.storage; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; import javax.annotation.Nullable; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractStorageNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractStorageNetworkNode.java index 3712bbe59..695e0a26f 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractStorageNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/AbstractStorageNetworkNode.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.api.network.impl.storage; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.resource.filter.Filter; import com.refinedmods.refinedstorage2.api.resource.filter.FilterMode; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/StorageNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/StorageNetworkComponentImpl.java similarity index 88% rename from refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/StorageNetworkComponentImpl.java rename to refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/StorageNetworkComponentImpl.java index 27f9c57a3..6e25cc557 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/component/StorageNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/storage/StorageNetworkComponentImpl.java @@ -1,8 +1,8 @@ -package com.refinedmods.refinedstorage2.api.network.impl.component; +package com.refinedmods.refinedstorage2.api.network.impl.storage; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.StorageProvider; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageProvider; import com.refinedmods.refinedstorage2.api.resource.list.ResourceList; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.Storage; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/AbstractNetworkBuilderImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/AbstractNetworkBuilderImplTest.java index 756321467..7baf1d54b 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/AbstractNetworkBuilderImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/AbstractNetworkBuilderImplTest.java @@ -3,7 +3,7 @@ import com.refinedmods.refinedstorage2.api.core.component.ComponentMapFactory; import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.NetworkBuilder; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import com.refinedmods.refinedstorage2.network.test.NetworkTestFixtures; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/InitializeNetworkBuilderImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/InitializeNetworkBuilderImplTest.java index 76f4d1e9a..4fdfe747f 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/InitializeNetworkBuilderImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/InitializeNetworkBuilderImplTest.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import org.junit.jupiter.api.Test; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/RemoveNetworkBuilderImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/RemoveNetworkBuilderImplTest.java index 16aeb3b0d..d83d71a2a 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/RemoveNetworkBuilderImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/RemoveNetworkBuilderImplTest.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import java.util.List; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/UpdateNetworkBuilderImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/UpdateNetworkBuilderImplTest.java index deba09825..bfa4da26f 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/UpdateNetworkBuilderImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/UpdateNetworkBuilderImplTest.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import java.util.Set; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/EnergyNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/energy/EnergyNetworkComponentImplTest.java similarity index 92% rename from refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/EnergyNetworkComponentImplTest.java rename to refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/energy/EnergyNetworkComponentImplTest.java index 784282354..e7ca16904 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/EnergyNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/energy/EnergyNetworkComponentImplTest.java @@ -1,8 +1,7 @@ -package com.refinedmods.refinedstorage2.api.network.impl.component; +package com.refinedmods.refinedstorage2.api.network.impl.energy; import com.refinedmods.refinedstorage2.api.core.Action; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.impl.energy.EnergyStorageImpl; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.node.controller.ControllerNetworkNode; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/GraphNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/GraphNetworkComponentImplTest.java similarity index 97% rename from refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/GraphNetworkComponentImplTest.java rename to refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/GraphNetworkComponentImplTest.java index 901e04bb8..b577f37c2 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/GraphNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/GraphNetworkComponentImplTest.java @@ -1,8 +1,7 @@ -package com.refinedmods.refinedstorage2.api.network.impl.component; +package com.refinedmods.refinedstorage2.api.network.impl.node; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.NetworkImpl; -import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import com.refinedmods.refinedstorage2.network.test.NetworkTestFixtures; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/SimpleNetworkNodeTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/SimpleNetworkNodeTest.java index 2adab7ad3..cb3d53eb9 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/SimpleNetworkNodeTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/SimpleNetworkNodeTest.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.api.network.impl.node; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.network.test.AddNetworkNode; import com.refinedmods.refinedstorage2.network.test.InjectNetworkEnergyComponent; import com.refinedmods.refinedstorage2.network.test.NetworkTest; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/AbstractExporterNetworkNodeTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/AbstractExporterNetworkNodeTest.java index e8f24c153..e36a0c7f9 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/AbstractExporterNetworkNodeTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/exporter/AbstractExporterNetworkNodeTest.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.exporter; import com.refinedmods.refinedstorage2.api.core.Action; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.exporter.ExporterTransferStrategy; import com.refinedmods.refinedstorage2.api.network.node.task.TaskExecutor; import com.refinedmods.refinedstorage2.api.resource.ResourceAmount; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNodeTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNodeTest.java index 3e995a5ca..7365d7687 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNodeTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/iface/InterfaceNetworkNodeTest.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.iface; import com.refinedmods.refinedstorage2.api.core.Action; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceAmount; import com.refinedmods.refinedstorage2.api.storage.EmptyActor; import com.refinedmods.refinedstorage2.api.storage.InMemoryStorageImpl; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterNetworkNodeTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterNetworkNodeTest.java index 870b03c00..03e491b57 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterNetworkNodeTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/node/importer/ImporterNetworkNodeTest.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.node.importer; import com.refinedmods.refinedstorage2.api.core.Action; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.importer.ImporterTransferStrategy; import com.refinedmods.refinedstorage2.api.resource.ResourceAmount; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/StorageNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/storage/StorageNetworkComponentImplTest.java similarity index 96% rename from refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/StorageNetworkComponentImplTest.java rename to refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/storage/StorageNetworkComponentImplTest.java index c4720c52e..0e8246008 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/component/StorageNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/storage/StorageNetworkComponentImplTest.java @@ -1,10 +1,10 @@ -package com.refinedmods.refinedstorage2.api.network.impl.component; +package com.refinedmods.refinedstorage2.api.network.impl.storage; import com.refinedmods.refinedstorage2.api.core.Action; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.NetworkImpl; import com.refinedmods.refinedstorage2.api.network.impl.node.storage.StorageNetworkNode; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceAmount; import com.refinedmods.refinedstorage2.api.resource.list.ResourceListImpl; import com.refinedmods.refinedstorage2.api.storage.EmptyActor; diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java index 74ce585f4..50b2d335d 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.component.ComponentMapFactory; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.ConstructorStrategyFactory; diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java index 840eebc04..0e1fb87cf 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.component.ComponentMapFactory; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.ConstructorStrategyFactory; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index e692aaa46..400979c2c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -1,11 +1,11 @@ package com.refinedmods.refinedstorage2.platform.common; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.impl.component.EnergyNetworkComponentImpl; -import com.refinedmods.refinedstorage2.api.network.impl.component.GraphNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.impl.energy.EnergyNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.impl.node.GraphNetworkComponentImpl; import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.PlatformApiProxy; import com.refinedmods.refinedstorage2.platform.api.upgrade.AbstractUpgradeItem; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index 07d5805d0..c8185d7ea 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -3,7 +3,7 @@ import com.refinedmods.refinedstorage2.api.core.component.ComponentMapFactory; import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.NetworkBuilder; -import com.refinedmods.refinedstorage2.api.network.component.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; import com.refinedmods.refinedstorage2.api.network.impl.NetworkBuilderImpl; import com.refinedmods.refinedstorage2.api.network.impl.NetworkFactory; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/AbstractItemConstructorStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/AbstractItemConstructorStrategy.java index deaff8a3c..fd1086858 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/AbstractItemConstructorStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/AbstractItemConstructorStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/BlockBreakDestructorStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/BlockBreakDestructorStrategy.java index 0b15939a8..923363145 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/BlockBreakDestructorStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/BlockBreakDestructorStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.filter.Filter; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/FluidBreakDestructorStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/FluidBreakDestructorStrategy.java index 74bdc3a7b..f258547be 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/FluidBreakDestructorStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/FluidBreakDestructorStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.filter.Filter; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ItemPickupDestructorStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ItemPickupDestructorStrategy.java index b010c19fc..43c6a13e8 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ItemPickupDestructorStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ItemPickupDestructorStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.filter.Filter; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/PlaceFluidConstructorStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/PlaceFluidConstructorStrategy.java index b44515091..16cd1b25c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/PlaceFluidConstructorStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/PlaceFluidConstructorStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java index 51277a021..a5d0b50e5 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java @@ -2,9 +2,9 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage2.api.grid.watcher.GridWatcher; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.node.container.NetworkNodeContainerPriorities; import com.refinedmods.refinedstorage2.api.network.impl.node.grid.GridNetworkNode; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.Storage; import com.refinedmods.refinedstorage2.api.storage.TrackedResourceAmount; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlockEntity.java index bd48406f7..e331a52e4 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlockEntity.java @@ -2,8 +2,8 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.node.grid.GridNetworkNode; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.common.Platform; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridSourceImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridSourceImpl.java index b6a27e6dc..7fad1dd98 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridSourceImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridSourceImpl.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.platform.common.grid; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceAmount; import com.refinedmods.refinedstorage2.api.resource.list.ResourceList; import com.refinedmods.refinedstorage2.api.resource.list.ResourceListImpl; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java index 4389dadac..c9a66bada 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java @@ -5,8 +5,8 @@ import com.refinedmods.refinedstorage2.api.grid.watcher.GridWatcher; import com.refinedmods.refinedstorage2.api.grid.watcher.GridWatcherManager; import com.refinedmods.refinedstorage2.api.grid.watcher.GridWatcherManagerImpl; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.NoopStorage; import com.refinedmods.refinedstorage2.api.storage.Storage; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java index 03adbb4bf..295f425cd 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java @@ -1,8 +1,8 @@ package com.refinedmods.refinedstorage2.platform.common.networking; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.support.network.ConnectionSink; import com.refinedmods.refinedstorage2.platform.common.Platform; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorExtractionStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorExtractionStrategy.java index 87329091f..4d941915c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorExtractionStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorExtractionStrategy.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.platform.common.storagemonitor; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.TransferHelper; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorInsertionStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorInsertionStrategy.java index 1c428973b..3929d4a31 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorInsertionStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/FluidStorageMonitorInsertionStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorExtractionStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorExtractionStrategy.java index 915d9ce36..5a91d2740 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorExtractionStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorExtractionStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.platform.api.storagemonitor.StorageMonitorExtractionStrategy; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorInsertionStrategy.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorInsertionStrategy.java index 2eb65b710..63b251f10 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorInsertionStrategy.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/ItemStorageMonitorInsertionStrategy.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.Actor; import com.refinedmods.refinedstorage2.platform.api.storagemonitor.StorageMonitorInsertionStrategy; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java index 9e76ff199..e9b4fac46 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java @@ -1,8 +1,8 @@ package com.refinedmods.refinedstorage2.platform.common.storagemonitor; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.api.resource.ResourceAmount; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/NetworkNodeContainerBlockEntityImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/NetworkNodeContainerBlockEntityImpl.java index 0ee9dbf3f..47e629a7c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/NetworkNodeContainerBlockEntityImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/NetworkNodeContainerBlockEntityImpl.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.platform.common.support.network; -import com.refinedmods.refinedstorage2.api.network.component.EnergyNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.support.network.AbstractNetworkNodeContainerBlockEntity; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/bounditem/NetworkBoundItemSessionImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/bounditem/NetworkBoundItemSessionImpl.java index a1ffad1c5..5011671a2 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/bounditem/NetworkBoundItemSessionImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/bounditem/NetworkBoundItemSessionImpl.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.api.core.Action; import com.refinedmods.refinedstorage2.api.network.Network; -import com.refinedmods.refinedstorage2.api.network.component.GraphNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.node.GraphNetworkComponent; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; import com.refinedmods.refinedstorage2.platform.api.support.network.PlatformNetworkNodeContainer; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.NetworkBoundItemSession; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/component/PlatformStorageNetworkComponent.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/component/PlatformStorageNetworkComponent.java index 2dc393e0e..879384f6d 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/component/PlatformStorageNetworkComponent.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/component/PlatformStorageNetworkComponent.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.platform.common.support.network.component; -import com.refinedmods.refinedstorage2.api.network.impl.component.StorageNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.impl.storage.StorageNetworkComponentImpl; import com.refinedmods.refinedstorage2.api.resource.ResourceAmount; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.api.resource.list.ResourceListImpl; From 4a57de7e3e5c07b5146e5adfc994f87620a43bd3 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 16 Mar 2024 21:39:49 +0100 Subject: [PATCH 28/59] feat: security primitives --- .../node/container/NetworkNodeContainer.java | 3 +- .../api/network/security/Operation.java | 7 ++++ .../api/network/security/SecurityActor.java | 7 ++++ .../network/security/SecurityDecision.java | 19 +++++++++ .../security/SecurityDecisionProvider.java | 8 ++++ .../security/SecurityNetworkComponent.java | 10 +++++ .../api/network/security/package-info.java | 7 ++++ .../SecurityNetworkComponentImpl.java | 42 +++++++++++++++++++ .../network/impl/security/package-info.java | 7 ++++ .../SecurityNetworkComponentImplTest.java | 36 ++++++++++++++++ 10 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Operation.java create mode 100644 refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityActor.java create mode 100644 refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecision.java create mode 100644 refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java create mode 100644 refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java create mode 100644 refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/package-info.java create mode 100644 refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java create mode 100644 refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/package-info.java create mode 100644 refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java index 5964ff5ef..1bbc43a2b 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/node/container/NetworkNodeContainer.java @@ -18,8 +18,7 @@ public interface NetworkNodeContainer { * The key must be kept stable, and must stay the same for the lifetime of the container. * If it changes after adding it into the graph, the container would not be removed from the key index when the * container is removed! - * The container can be queried by - * {@link GraphNetworkComponent#getContainer(Object)}. + * The container can be queried by {@link GraphNetworkComponent#getContainer(Object)}. * * @return the key, or null if indexing is not required */ diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Operation.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Operation.java new file mode 100644 index 000000000..4089f95cc --- /dev/null +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Operation.java @@ -0,0 +1,7 @@ +package com.refinedmods.refinedstorage2.api.network.security; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public interface Operation { +} diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityActor.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityActor.java new file mode 100644 index 000000000..07514890c --- /dev/null +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityActor.java @@ -0,0 +1,7 @@ +package com.refinedmods.refinedstorage2.api.network.security; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public interface SecurityActor { +} diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecision.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecision.java new file mode 100644 index 000000000..74f0ab94f --- /dev/null +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecision.java @@ -0,0 +1,19 @@ +package com.refinedmods.refinedstorage2.api.network.security; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public enum SecurityDecision { + /** + * Allow the operation. + */ + ALLOW, + /** + * Deny the operation. + */ + DENY, + /** + * Pass the decision to the next {@link SecurityDecisionProvider}. + */ + PASS +} diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java new file mode 100644 index 000000000..a8e540744 --- /dev/null +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java @@ -0,0 +1,8 @@ +package com.refinedmods.refinedstorage2.api.network.security; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public interface SecurityDecisionProvider { + SecurityDecision isAllowed(Operation operation, SecurityActor actor); +} diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java new file mode 100644 index 000000000..ecae20e11 --- /dev/null +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java @@ -0,0 +1,10 @@ +package com.refinedmods.refinedstorage2.api.network.security; + +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public interface SecurityNetworkComponent extends NetworkComponent { + boolean isAllowed(Operation operation, SecurityActor actor); +} diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/package-info.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/package-info.java new file mode 100644 index 000000000..225161f99 --- /dev/null +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@FieldsAndMethodsAreNonnullByDefault +package com.refinedmods.refinedstorage2.api.network.security; + +import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java new file mode 100644 index 000000000..28c647db7 --- /dev/null +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -0,0 +1,42 @@ +package com.refinedmods.refinedstorage2.api.network.impl.security; + +import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; +import com.refinedmods.refinedstorage2.api.network.security.Operation; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; +import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; + +import java.util.HashSet; +import java.util.Set; + +public class SecurityNetworkComponentImpl implements SecurityNetworkComponent { + private final Set providers = new HashSet<>(); + + @Override + public void onContainerAdded(final NetworkNodeContainer container) { + if (container instanceof SecurityDecisionProvider provider) { + providers.add(provider); + } + } + + @Override + public void onContainerRemoved(final NetworkNodeContainer container) { + if (container instanceof SecurityDecisionProvider provider) { + providers.remove(provider); + } + } + + @Override + public boolean isAllowed(final Operation operation, final SecurityActor actor) { + for (final SecurityDecisionProvider provider : providers) { + final SecurityDecision decision = provider.isAllowed(operation, actor); + if (decision == SecurityDecision.DENY) { + return false; + } else if (decision == SecurityDecision.ALLOW) { + return true; + } + } + return true; + } +} diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/package-info.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/package-info.java new file mode 100644 index 000000000..ea536fa20 --- /dev/null +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@FieldsAndMethodsAreNonnullByDefault +package com.refinedmods.refinedstorage2.api.network.impl.security; + +import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java new file mode 100644 index 000000000..a0205f01e --- /dev/null +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java @@ -0,0 +1,36 @@ +package com.refinedmods.refinedstorage2.api.network.impl.security; + +import com.refinedmods.refinedstorage2.api.network.security.Operation; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class SecurityNetworkComponentImplTest { + SecurityNetworkComponent sut; + + @BeforeEach + void setUp() { + sut = new SecurityNetworkComponentImpl(); + } + + @EnumSource(TestPermissions.class) + @ParameterizedTest + void everythingIsAllowedByDefault(final TestPermissions permission) { + // Act & assert + assertThat(sut.isAllowed(permission, TestActors.X)).isTrue(); + assertThat(sut.isAllowed(permission, TestActors.Y)).isTrue(); + } + + enum TestPermissions implements Operation { + A, B + } + + enum TestActors implements SecurityActor { + X, Y + } +} From 95f14db7497daca0b09a1747db8c33556d1d0d0a Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 17 Mar 2024 15:21:50 +0100 Subject: [PATCH 29/59] docs: note about crowdin --- .github/CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f8c8c5b5c..875b35587 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -42,6 +42,10 @@ Valid examples are: - `fix/GH-123/add-branch-linting` - `docs/GH-123/cleanup` +## Translations + +If you want to contribute to the translations of this project, please use [Crowdin](https://crowdin.com/project/refined-storage-2). + ## Versioning This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). From d47cae747d1f89d4ac62702e704335ee65a26628 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 17 Mar 2024 15:21:55 +0100 Subject: [PATCH 30/59] feat: security card item --- .../common/AbstractModInitializer.java | 3 +++ .../platform/common/content/ContentIds.java | 1 + .../common/content/CreativeModeTabItems.java | 1 + .../platform/common/content/Items.java | 11 ++++++++ .../common/security/SecurityCardItem.java | 14 ++++++++++ .../SecurityCardItemPropertyFunction.java | 24 ++++++++++++++++++ .../common/security/package-info.java | 7 +++++ .../assets/refinedstorage2/lang/en_us.json | 1 + .../models/item/security_card.json | 17 +++++++++++++ .../models/item/security_card/active.json | 6 +++++ .../models/item/security_card/inactive.json | 6 +++++ .../textures/gui/security_card.png | Bin 0 -> 1142 bytes .../textures/item/security_card/active.png | Bin 0 -> 1602 bytes .../textures/item/security_card/inactive.png | Bin 0 -> 1603 bytes .../recipes/security_card.json | 22 ++++++++++++++++ .../fabric/ClientModInitializerImpl.java | 6 +++++ .../platform/forge/ClientModInitializer.java | 6 +++++ 17 files changed, 125 insertions(+) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/package-info.java create mode 100755 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card.json create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/active.json create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/inactive.json create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_card.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/item/security_card/active.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/item/security_card/inactive.png create mode 100644 refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/security_card.json diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index 400979c2c..52e60ce8c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -55,6 +55,7 @@ import com.refinedmods.refinedstorage2.platform.common.networking.NetworkReceiverBlockEntity; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterBlockEntity; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.StorageTypes; @@ -151,6 +152,7 @@ import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.QUARTZ_ENRICHED_IRON; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.QUARTZ_ENRICHED_IRON_BLOCK; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.REGULATOR_UPGRADE; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.SECURITY_CARD; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.SILICON; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.STORAGE_BLOCK; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.STORAGE_HOUSING; @@ -360,6 +362,7 @@ private void registerSimpleItems(final RegistryCallback callback) { ConfigurationCardItem::new )); Items.INSTANCE.setNetworkCard(callback.register(ContentIds.NETWORK_CARD, NetworkCardItem::new)); + Items.INSTANCE.setSecurityCard(callback.register(SECURITY_CARD, SecurityCardItem::new)); } private void registerProcessor(final RegistryCallback callback, final ProcessorItem.Type type) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java index 0eb7ca2bb..b902d1f91 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java @@ -54,6 +54,7 @@ public final class ContentIds { public static final ResourceLocation NETWORK_TRANSMITTER = createIdentifier("network_transmitter"); public static final ResourceLocation PORTABLE_GRID = createIdentifier("portable_grid"); public static final ResourceLocation CREATIVE_PORTABLE_GRID = createIdentifier("creative_portable_grid"); + public static final ResourceLocation SECURITY_CARD = createIdentifier("security_card"); private ContentIds() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java index 239dd8ea5..f1c73e3f3 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java @@ -103,5 +103,6 @@ private static void appendItems(final Consumer consumer) { itemConsumer.accept(Items.INSTANCE.getCreativeWirelessGrid()); itemConsumer.accept(Items.INSTANCE.getConfigurationCard()); itemConsumer.accept(Items.INSTANCE.getNetworkCard()); + itemConsumer.accept(Items.INSTANCE.getSecurityCard()); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java index 75b7eea13..c961a74cc 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java @@ -5,6 +5,7 @@ import com.refinedmods.refinedstorage2.platform.common.controller.CreativeControllerBlockItem; import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.misc.ProcessorItem; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockItem; @@ -92,6 +93,8 @@ public final class Items { private Supplier portableGrid; @Nullable private Supplier creativePortableGrid; + @Nullable + private Supplier securityCard; private Items() { } @@ -415,4 +418,12 @@ public PortableGridBlockItem getCreativePortableGrid() { public void setCreativePortableGrid(final Supplier supplier) { this.creativePortableGrid = supplier; } + + public SecurityCardItem getSecurityCard() { + return requireNonNull(securityCard).get(); + } + + public void setSecurityCard(final Supplier securityCard) { + this.securityCard = securityCard; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java new file mode 100644 index 000000000..f7a082f50 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java @@ -0,0 +1,14 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +public class SecurityCardItem extends Item { + public SecurityCardItem() { + super(new Item.Properties().stacksTo(1)); + } + + boolean isActive(final ItemStack stack) { + return false; + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java new file mode 100644 index 000000000..1d36f5a53 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java @@ -0,0 +1,24 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import javax.annotation.Nullable; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +public class SecurityCardItemPropertyFunction implements ClampedItemPropertyFunction { + public static final ResourceLocation NAME = new ResourceLocation("active"); + + @Override + public float unclampedCall(final ItemStack itemStack, + @Nullable final ClientLevel clientLevel, + @Nullable final LivingEntity livingEntity, + final int i) { + if (itemStack.getItem() instanceof SecurityCardItem cardItem) { + return cardItem.isActive(itemStack) ? 1 : 0; + } + return 0; + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/package-info.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/package-info.java new file mode 100644 index 000000000..77692e9ab --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@FieldsAndMethodsAreNonnullByDefault +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 0e58472c8..23e61b007 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -219,6 +219,7 @@ "item.refinedstorage2.network_card.unbound": "Unbound.", "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", + "item.refinedstorage2.security_card": "Security Card", "misc.refinedstorage2.stored": "Stored: %s", "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", "misc.refinedstorage2.total": "%d total", diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card.json new file mode 100755 index 000000000..9bf6e03d2 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card.json @@ -0,0 +1,17 @@ +{ + "parent": "item/generated", + "overrides": [ + { + "predicate": { + "active": 0 + }, + "model": "refinedstorage2:item/security_card/inactive" + }, + { + "predicate": { + "active": 1 + }, + "model": "refinedstorage2:item/security_card/active" + } + ] +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/active.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/active.json new file mode 100644 index 000000000..c007d44dc --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/active.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage2:item/security_card/active" + } +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/inactive.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/inactive.json new file mode 100644 index 000000000..3753723ad --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/security_card/inactive.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage2:item/security_card/inactive" + } +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_card.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_card.png new file mode 100644 index 0000000000000000000000000000000000000000..de3f689808cebc73f03e7767eb29731f0cc5d969 GIT binary patch literal 1142 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIGwruBVG* zNX4ADcVqpuB1IZ5HWzC2I4uhlR!o%hIb<%;&eL7@B74_uwHKlj9@S;<{WSfqVbl%lASXTU3l<9ZBZZF$?G>J!0!vFA5{|mQo-em(bxP3M=R_H7IwetZ)DsCtLV zVFm+sbmQiJmYDU|#rGdD@lD=;e|GY@?a$YQt?qtaaBF!zmyPdbSN#n)bB@*RH$Ofn z|NO>3kIV2FhH1%-o3#u;-{@6VuneX!!iDa4nUDT_Ch^?yUWfPp zWpC7f-#Z5+P}kS%u>G+lLklO-=q5+Xxi`-Xtj(Ba8vnL5W4a48f+B;`&6y6$+~g>+ z&0|#XVE~~wZ=4;X8_&)>Jf}apai<)J`B#R2dH!)-qFo8}&rPlzutT>oeJ;ph-6sc2 z&^A-PZ~q^2{If)|j#&4{Z{MD^a~t|Ue&4RqJ$?H0>iMku-dtyP(EIX{^VLVa%#} zSi!^ifG8v3U`howC@LKZ!OI$r&xw8fvqXt0gZu;wAu<^9dZTd-Tl0dI{zt|Ot$ABH zOG8$gXG%FztcNor1{QPoaz{}^Q4MD1JYrFZ5}YARy|hm-;A&9(BBMMM=A>1QY!s18 zm2z4x%|hg~lt3K{shn0RP=`}aIIv>KI8tA}-nMuQ-_Y^6q{)55AOygR6JTK7j-{K#^Q~x)AkSGd@Hp{=7C-zG0$msU@D2RvW z!$kYU3F5?2xoJH5sYEi`VZb#u|J8T4ncd$KX`O9tY{qY&r%#-VC-iPko4IkR7Yk?)-xL-25vkeH%idkSu)al;mUUoZfpw1toKD zob552e!t#&=D_icWNuGflchQwCQyZ9Q(xc8*0#SUJ>1#na^>X)`uC36`p3{#ee*ZK z4_8k|BI~EThlA-n&(GWYYTLo)>0`m|rk^j?Os%$Mw&q6SzX&DgHkvWX>szXtn$qnD zmS%^->?%Q+RP5TRl@IKSD__1if1eFZOWqwS*&UZ!(=ISm>c9IH#~M1q;q;Ybif8SF z&jtDye7{<80iU(4spzv}3P?>nclz|`i#<;s+a3&HWL8w(E)+*R%>?C9(aEyNmv z#^xhS4lG?Fs|)x0fw~KajvT3CmDh&q>nm-U?VzQhBPYYwVNtc^w@c z_4by_k--U5fySQ7>n%Us@3?hqW@{02@9Pz^*^`n=7^c~}kCj(09`$7~82q4%Qf8vl z-v2Qa+Nf_Pw(L`X=#cE#Cm#57f)v^{xu$(_`^s^V{f7@Lf+o|<3DYMR gz46J=@(rUT0|TSRpV)k&I{H^P=uG&*{8bfy1AyycJOBUy literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/item/security_card/inactive.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/item/security_card/inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3f9b102a4628bb90cddebd778f7eba6a8dfb27 GIT binary patch literal 1603 zcmbVMdrT8|9PfNG-a588*z~MMtMhtyrLApkA*BymLlJ2=nL5_%-Bpg#yLvrn(cv~l zpaF-**K|`bh9PcI34w?Zj54R_A6?^^LHB?m7-N`#(~7vcD^RyTj9KHdJYI~^pv~s?_|S})#jOh-JVUwdO;(q~nrS=hK^cOl#%UV?7@g=QBAY<* z;>}%zlE<4~L|Ss#98-n@qn$!DBqQ`XT^yRnQ>J=dDCQtoz(#B$DHZ>I+j%}f;wt_+ zi3v8jG(;Y0*uoIzEtwW7)xzm&x>;m~u}AiVGR!MO_dggdwLho6RQvG2?~OZcDL? zfU*fUUC3ZuKJ1IaU@mqqR}>QDtWm6CNG>U8ftJP!odm@iwJJXMMTnEQ!cNF-QV}8s zWnw}MCL>}3L`60UC?@0*k4tI#k6%F>L5rVGMVkd;TXv^$S>0UFIj)&apflEP_^ zds!$=lU{2HhAbj*JwrQzi8w3B7ufLM{GY_*|2KXRXA~4FmVXsb_=&5?(D8XIaF^%J zL{MA@FVeB)xD z(ztRY>)_$~*!5Q{1cUl7sJb({RTVbtsu{N~bk;gP-#$3FMtCWqy!GjiLA5URRPgb( z`wvq5zE6;ay#9nar_Vm1;-@G14PSym2!LIJ$ zs%O*ve!sb?r^+R(q8pUIr<7zmpkF^Y*%ui-tFsQ@up#L-BY!(7slWF|hky4kZPob$ z5u>LUkcj~Jx?%BLK|_0xaGF?VYoH#SW_mSs3CiT7!LN@%dG zPESv7T}wZ$8Lr(>HoD9mJbqdBwLd9h#x%C5=%T$TuxHPlvm1qi z{i{D38=gP#A!&(=9abgoJa=c|lkxGs;CP@w3MH_Gg`8G2Dk`eta{m=vw7Uy;`Fqx8 z)LR4XpXiVG9X(-L{=>b8QLkOHA(BHGGPzv6eE-F(S0k^DEEyUa^4|Nhb7TZ*&xK~E zuj#I;uHNgO*}OhxkD+w@OiRmmgPN3@JJ^x2{s&_+S$qUMhFh(@X|G^`{O0y6d16M| zvTJqS_UwkzfdS%=M~`e`3-QJ?MVrui|IVB|}5wms(4qhuQ{(f{{Q_qUIz8Pq(&-ZF+ z+QR7A*ilS@*>gAUa@2I$8h4v#?ib%t?18E1*H!|zjdQ7Q+q1Sy8Un2fMKox literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/security_card.json b/refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/security_card.json new file mode 100644 index 000000000..073ce7ff8 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/security_card.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "EEE", + "CAC", + "EEE" + ], + "key": { + "E": { + "item": "refinedstorage2:quartz_enriched_iron" + }, + "C": { + "item": "refinedstorage2:network_card" + }, + "A": { + "item": "refinedstorage2:advanced_processor" + } + }, + "result": { + "item": "refinedstorage2:security_card" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java index 18eac2b73..0d4f6ce6f 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java @@ -13,6 +13,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.KeyMappings; import com.refinedmods.refinedstorage2.platform.common.controller.ControllerModelPredicateProvider; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkCardItemPropertyFunction; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItemPropertyFunction; import com.refinedmods.refinedstorage2.platform.common.storagemonitor.StorageMonitorBlockEntityRenderer; import com.refinedmods.refinedstorage2.platform.common.support.network.bounditem.NetworkBoundItemItemPropertyFunction; import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; @@ -427,5 +428,10 @@ private void registerItemProperties() { NetworkCardItemPropertyFunction.NAME, new NetworkCardItemPropertyFunction() ); + ItemProperties.register( + Items.INSTANCE.getSecurityCard(), + SecurityCardItemPropertyFunction.NAME, + new SecurityCardItemPropertyFunction() + ); } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java index 90c5f8129..7f0734f01 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java @@ -11,6 +11,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.KeyMappings; import com.refinedmods.refinedstorage2.platform.common.controller.ControllerModelPredicateProvider; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkCardItemPropertyFunction; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItemPropertyFunction; import com.refinedmods.refinedstorage2.platform.common.storagemonitor.StorageMonitorBlockEntityRenderer; import com.refinedmods.refinedstorage2.platform.common.support.network.bounditem.NetworkBoundItemItemPropertyFunction; import com.refinedmods.refinedstorage2.platform.common.support.tooltip.CompositeClientTooltipComponent; @@ -245,5 +246,10 @@ private static void registerItemProperties() { NetworkCardItemPropertyFunction.NAME, new NetworkCardItemPropertyFunction() ); + ItemProperties.register( + Items.INSTANCE.getSecurityCard(), + SecurityCardItemPropertyFunction.NAME, + new SecurityCardItemPropertyFunction() + ); } } From 5d5b3702d1192b2537c4cb2f45bf61e00c49c2ef Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 23 Mar 2024 16:09:54 +0100 Subject: [PATCH 31/59] feat: security card screen --- .../{Operation.java => Permission.java} | 2 +- .../security/SecurityDecisionProvider.java | 2 +- .../security/SecurityNetworkComponent.java | 2 +- .../SecurityNetworkComponentImpl.java | 6 +- .../SecurityNetworkComponentImplTest.java | 4 +- .../platform/api/PlatformApi.java | 9 +- .../platform/api/PlatformApiProxy.java | 18 +- .../api/security/BuiltinPermissions.java | 14 ++ .../api/security/PlatformPermission.java | 15 ++ .../platform/api/security/package-info.java | 7 + .../common/AbstractClientModInitializer.java | 2 + .../common/AbstractModInitializer.java | 21 +- .../platform/common/Config.java | 18 +- .../platform/common/PlatformApiImpl.java | 24 ++- .../platform/common/content/ContentNames.java | 2 + .../platform/common/content/Menus.java | 11 + .../grid/AbstractGridContainerMenu.java | 23 +-- .../grid/CraftingGridContainerMenu.java | 8 +- .../common/grid/GridContainerMenu.java | 4 +- .../grid/WirelessGridContainerMenu.java | 4 +- .../grid/screen/AbstractGridScreen.java | 155 ++++----------- .../common/security/BuiltinPermission.java | 76 +++++++ .../security/SecurityCardContainerMenu.java | 57 ++++++ .../SecurityCardExtendedMenuProvider.java | 48 +++++ .../common/security/SecurityCardItem.java | 92 ++++++++- .../common/security/SecurityCardScreen.java | 148 ++++++++++++++ .../common/storage/StorageTooltipHelper.java | 8 +- .../AbstractPortableGridContainerMenu.java | 4 +- .../PortableGridBlockContainerMenu.java | 4 +- .../PortableGridItemContainerMenu.java | 4 +- .../stretching/AbstractStretchingScreen.java | 188 ++++++++++++++++++ .../stretching/ScreenSize.java} | 6 +- .../stretching/ScreenSizeListener.java | 5 + .../ScreenSizeSideButtonWidget.java} | 38 ++-- .../support/stretching/package-info.java | 7 + .../support/widget/CustomCheckboxWidget.java | 76 +++++++ .../support/widget/ScrollbarWidget.java | 24 ++- .../assets/refinedstorage2/lang/en_us.json | 35 +++- .../textures/gui/security_card.png | Bin 1142 -> 1100 bytes .../platform/fabric/ConfigImpl.java | 58 +++--- .../platform/fabric/ModInitializerImpl.java | 14 +- .../platform/forge/ConfigImpl.java | 66 +++--- .../platform/forge/ModInitializer.java | 13 +- 43 files changed, 1036 insertions(+), 286 deletions(-) rename refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/{Operation.java => Permission.java} (84%) create mode 100644 refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/BuiltinPermissions.java create mode 100644 refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java create mode 100644 refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/package-info.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java rename refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/{grid/GridSize.java => support/stretching/ScreenSize.java} (69%) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java rename refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/{grid/screen/SizeSideButtonWidget.java => support/stretching/ScreenSizeSideButtonWidget.java} (53%) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/package-info.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Operation.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Permission.java similarity index 84% rename from refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Operation.java rename to refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Permission.java index 4089f95cc..83d8d54d9 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Operation.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/Permission.java @@ -3,5 +3,5 @@ import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") -public interface Operation { +public interface Permission { } diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java index a8e540744..fe65abda1 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java @@ -4,5 +4,5 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") public interface SecurityDecisionProvider { - SecurityDecision isAllowed(Operation operation, SecurityActor actor); + SecurityDecision isAllowed(Permission permission, SecurityActor actor); } diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java index ecae20e11..834fc0332 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java @@ -6,5 +6,5 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") public interface SecurityNetworkComponent extends NetworkComponent { - boolean isAllowed(Operation operation, SecurityActor actor); + boolean isAllowed(Permission permission, SecurityActor actor); } diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java index 28c647db7..ea7f962e7 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage2.api.network.impl.security; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; -import com.refinedmods.refinedstorage2.api.network.security.Operation; +import com.refinedmods.refinedstorage2.api.network.security.Permission; import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; @@ -28,9 +28,9 @@ public void onContainerRemoved(final NetworkNodeContainer container) { } @Override - public boolean isAllowed(final Operation operation, final SecurityActor actor) { + public boolean isAllowed(final Permission permission, final SecurityActor actor) { for (final SecurityDecisionProvider provider : providers) { - final SecurityDecision decision = provider.isAllowed(operation, actor); + final SecurityDecision decision = provider.isAllowed(permission, actor); if (decision == SecurityDecision.DENY) { return false; } else if (decision == SecurityDecision.ALLOW) { diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java index a0205f01e..36f8b1158 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.api.network.impl.security; -import com.refinedmods.refinedstorage2.api.network.security.Operation; +import com.refinedmods.refinedstorage2.api.network.security.Permission; import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; @@ -26,7 +26,7 @@ void everythingIsAllowedByDefault(final TestPermissions permission) { assertThat(sut.isAllowed(permission, TestActors.Y)).isTrue(); } - enum TestPermissions implements Operation { + enum TestPermissions implements Permission { A, B } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java index 50b2d335d..f75dbef1d 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java @@ -20,6 +20,8 @@ import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridScrollingStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.importer.ImporterTransferStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.recipemod.IngredientConverter; +import com.refinedmods.refinedstorage2.platform.api.security.BuiltinPermissions; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.storage.StorageContainerItemHelper; import com.refinedmods.refinedstorage2.platform.api.storage.StorageRepository; import com.refinedmods.refinedstorage2.platform.api.storage.StorageType; @@ -45,7 +47,6 @@ import java.util.Set; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -91,8 +92,6 @@ public interface PlatformApi { StorageMonitorInsertionStrategy getStorageMonitorInsertionStrategy(); - MutableComponent createTranslation(String category, String value, Object... args); - ComponentMapFactory getNetworkComponentMapFactory(); PlatformRegistry getGridSynchronizerRegistry(); @@ -180,4 +179,8 @@ EnergyStorage asBlockItemEnergyStorage( SlotReference createInventorySlotReference(Player player, InteractionHand hand); void useNetworkBoundItem(Player player, Item... items); + + BuiltinPermissions getBuiltinPermissions(); + + PlatformRegistry getPermissionRegistry(); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java index 0e1fb87cf..59603d009 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java @@ -20,6 +20,8 @@ import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridScrollingStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.importer.ImporterTransferStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.recipemod.IngredientConverter; +import com.refinedmods.refinedstorage2.platform.api.security.BuiltinPermissions; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.storage.StorageContainerItemHelper; import com.refinedmods.refinedstorage2.platform.api.storage.StorageRepository; import com.refinedmods.refinedstorage2.platform.api.storage.StorageType; @@ -46,7 +48,6 @@ import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -146,11 +147,6 @@ public StorageMonitorInsertionStrategy getStorageMonitorInsertionStrategy() { return ensureLoaded().getStorageMonitorInsertionStrategy(); } - @Override - public MutableComponent createTranslation(final String category, final String value, final Object... args) { - return ensureLoaded().createTranslation(category, value, args); - } - @Override public ComponentMapFactory getNetworkComponentMapFactory() { return ensureLoaded().getNetworkComponentMapFactory(); @@ -357,6 +353,16 @@ public void useNetworkBoundItem(final Player player, final Item... items) { ensureLoaded().useNetworkBoundItem(player, items); } + @Override + public BuiltinPermissions getBuiltinPermissions() { + return ensureLoaded().getBuiltinPermissions(); + } + + @Override + public PlatformRegistry getPermissionRegistry() { + return ensureLoaded().getPermissionRegistry(); + } + private PlatformApi ensureLoaded() { if (delegate == null) { throw new IllegalStateException("Platform API not loaded yet"); diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/BuiltinPermissions.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/BuiltinPermissions.java new file mode 100644 index 000000000..5ff12f708 --- /dev/null +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/BuiltinPermissions.java @@ -0,0 +1,14 @@ +package com.refinedmods.refinedstorage2.platform.api.security; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public record BuiltinPermissions( + PlatformPermission insert, + PlatformPermission extract, + PlatformPermission autocrafting, + PlatformPermission modify, + PlatformPermission build, + PlatformPermission security +) { +} diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java new file mode 100644 index 000000000..67ca7333c --- /dev/null +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java @@ -0,0 +1,15 @@ +package com.refinedmods.refinedstorage2.platform.api.security; + +import com.refinedmods.refinedstorage2.api.network.security.Permission; + +import net.minecraft.network.chat.Component; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public interface PlatformPermission extends Permission { + Component getName(); + + Component getDescription(); + + Component getOwnerName(); +} diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/package-info.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/package-info.java new file mode 100644 index 000000000..256520c96 --- /dev/null +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@FieldsAndMethodsAreNonnullByDefault +package com.refinedmods.refinedstorage2.platform.api.security; + +import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java index 87096e77e..ba8ba4096 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java @@ -17,6 +17,7 @@ import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceScreen; import com.refinedmods.refinedstorage2.platform.common.importer.ImporterScreen; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterScreen; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardScreen; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.DiskDriveScreen; @@ -67,6 +68,7 @@ protected static void registerScreens(final ScreenRegistration registration) { registration.register(Menus.INSTANCE.getNetworkTransmitter(), NetworkTransmitterScreen::new); registration.register(Menus.INSTANCE.getPortableGridBlock(), PortableGridScreen::new); registration.register(Menus.INSTANCE.getPortableGridItem(), PortableGridScreen::new); + registration.register(Menus.INSTANCE.getSecurityCard(), SecurityCardScreen::new); } protected static void registerAlternativeGridHints() { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index 52e60ce8c..6659b7e90 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -55,6 +55,8 @@ import com.refinedmods.refinedstorage2.platform.common.networking.NetworkReceiverBlockEntity; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterBlockEntity; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; @@ -183,6 +185,7 @@ protected final void initializePlatformApi() { registerStorageMonitorExtractionStrategies(); registerNetworkComponents(); registerWirelessTransmitterRangeModifiers(); + registerPermissions(); } private void registerAdditionalStorageTypes() { @@ -252,6 +255,15 @@ private void registerWirelessTransmitterRangeModifiers() { ); } + private void registerPermissions() { + for (final BuiltinPermission permission : BuiltinPermission.values()) { + if (permission == BuiltinPermission.SECURITY) { + continue; + } + PlatformApi.INSTANCE.getPermissionRegistry().register(permission.getId(), permission); + } + } + protected final void registerBlocks( final RegistryCallback callback, final BiFunction diskDriveBlockEntityFactory, @@ -307,7 +319,8 @@ protected final void registerItems( final Supplier wirelessGridItemSupplier, final Supplier creativeWirelessGridItemSupplier, final Supplier portableGridBlockItemSupplier, - final Supplier creativePortableGridBlockItemSupplier + final Supplier creativePortableGridBlockItemSupplier, + final Supplier securityCardItemSupplier ) { registerSimpleItems(callback); Blocks.INSTANCE.getGrid().registerItems(callback); @@ -337,6 +350,7 @@ protected final void registerItems( CREATIVE_PORTABLE_GRID, creativePortableGridBlockItemSupplier )); + Items.INSTANCE.setSecurityCard(callback.register(SECURITY_CARD, securityCardItemSupplier)); } private void registerSimpleItems(final RegistryCallback callback) { @@ -362,7 +376,6 @@ private void registerSimpleItems(final RegistryCallback callback) { ConfigurationCardItem::new )); Items.INSTANCE.setNetworkCard(callback.register(ContentIds.NETWORK_CARD, NetworkCardItem::new)); - Items.INSTANCE.setSecurityCard(callback.register(SECURITY_CARD, SecurityCardItem::new)); } private void registerProcessor(final RegistryCallback callback, final ProcessorItem.Type type) { @@ -714,6 +727,10 @@ protected final void registerMenus(final RegistryCallback> callback, createIdentifier("portable_grid_item"), () -> menuTypeFactory.create(PortableGridItemContainerMenu::new) )); + Menus.INSTANCE.setSecurityCard(callback.register( + SECURITY_CARD, + () -> menuTypeFactory.create(SecurityCardContainerMenu::new) + )); } protected final void registerLootFunctions(final RegistryCallback callback) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java index 61c22ab7e..d8ddad985 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java @@ -2,8 +2,8 @@ import com.refinedmods.refinedstorage2.api.grid.view.GridSortingDirection; import com.refinedmods.refinedstorage2.platform.common.grid.CraftingGridMatrixCloseBehavior; -import com.refinedmods.refinedstorage2.platform.common.grid.GridSize; import com.refinedmods.refinedstorage2.platform.common.grid.GridSortingTypes; +import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSize; import java.util.Optional; @@ -52,6 +52,14 @@ public interface Config { PortableGridEntry getPortableGrid(); + boolean isSmoothScrolling(); + + ScreenSize getScreenSize(); + + void setScreenSize(ScreenSize size); + + int getMaxRowsStretch(); + interface SimpleEnergyUsageEntry { long getEnergyUsage(); } @@ -59,16 +67,12 @@ interface SimpleEnergyUsageEntry { interface GridEntry extends SimpleEnergyUsageEntry { boolean isLargeFont(); - int getMaxRowsStretch(); - boolean isPreventSortingWhileShiftIsDown(); boolean isDetailedTooltip(); boolean isRememberSearchQuery(); - boolean isSmoothScrolling(); - boolean isAutoSelected(); void setAutoSelected(boolean autoSelected); @@ -87,10 +91,6 @@ interface GridEntry extends SimpleEnergyUsageEntry { void setSortingType(GridSortingTypes sortingType); - GridSize getSize(); - - void setSize(GridSize size); - Optional getResourceTypeId(); void setResourceTypeId(ResourceLocation resourceTypeId); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index c8185d7ea..687522c80 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -24,6 +24,8 @@ import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridScrollingStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.importer.ImporterTransferStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.recipemod.IngredientConverter; +import com.refinedmods.refinedstorage2.platform.api.security.BuiltinPermissions; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.storage.StorageContainerItemHelper; import com.refinedmods.refinedstorage2.platform.api.storage.StorageRepository; import com.refinedmods.refinedstorage2.platform.api.storage.StorageType; @@ -52,6 +54,7 @@ import com.refinedmods.refinedstorage2.platform.common.grid.strategy.CompositeGridInsertionStrategy; import com.refinedmods.refinedstorage2.platform.common.grid.strategy.CompositeGridScrollingStrategy; import com.refinedmods.refinedstorage2.platform.common.recipemod.CompositeIngredientConverter; +import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; import com.refinedmods.refinedstorage2.platform.common.storage.ClientStorageRepository; import com.refinedmods.refinedstorage2.platform.common.storage.StorageContainerItemHelperImpl; import com.refinedmods.refinedstorage2.platform.common.storage.StorageRepositoryImpl; @@ -72,7 +75,6 @@ import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; import com.refinedmods.refinedstorage2.platform.common.upgrade.BuiltinUpgradeDestinationsImpl; import com.refinedmods.refinedstorage2.platform.common.upgrade.UpgradeRegistryImpl; -import com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil; import com.refinedmods.refinedstorage2.platform.common.util.ServerEventQueue; import com.refinedmods.refinedstorage2.platform.common.wirelesstransmitter.CompositeWirelessTransmitterRangeModifier; @@ -92,7 +94,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -164,6 +165,10 @@ public class PlatformApiImpl implements PlatformApi { InventorySlotReferenceFactory.INSTANCE ); private final CompositeSlotReferenceProvider slotReferenceProvider = new CompositeSlotReferenceProvider(); + private final PlatformRegistry permissionRegistry = new PlatformRegistryImpl<>( + BuiltinPermission.SECURITY.getId(), + BuiltinPermission.SECURITY + ); @Override public PlatformRegistry getStorageTypeRegistry() { @@ -264,11 +269,6 @@ public StorageMonitorInsertionStrategy getStorageMonitorInsertionStrategy() { return storageMonitorInsertionStrategy; } - @Override - public MutableComponent createTranslation(final String category, final String value, final Object... args) { - return IdentifierUtil.createTranslation(category, value, args); - } - @Override public ComponentMapFactory getNetworkComponentMapFactory() { return networkComponentMapFactory; @@ -527,4 +527,14 @@ public void useNetworkBoundItem(final Player player, final Item... items) { slotReference -> Platform.INSTANCE.getClientToServerCommunications().sendUseNetworkBoundItem(slotReference) ); } + + @Override + public BuiltinPermissions getBuiltinPermissions() { + return BuiltinPermission.VIEW; + } + + @Override + public PlatformRegistry getPermissionRegistry() { + return permissionRegistry; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java index 0d94ede1c..bfb5cd6f8 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java @@ -5,6 +5,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public final class ContentNames { + public static final MutableComponent MOD = createTranslation("itemGroup", "general"); public static final MutableComponent CABLE = name("cable"); public static final MutableComponent GRID = name("grid"); public static final MutableComponent CRAFTING_GRID = name("crafting_grid"); @@ -25,6 +26,7 @@ public final class ContentNames { public static final MutableComponent NETWORK_RECEIVER = name("network_receiver"); public static final MutableComponent NETWORK_TRANSMITTER = name("network_transmitter"); public static final MutableComponent PORTABLE_GRID = name("portable_grid"); + public static final MutableComponent SECURITY_CARD = createTranslation("item", "security_card"); private ContentNames() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java index 98e8a9e96..78ab613f8 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java @@ -11,6 +11,7 @@ import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceContainerMenu; import com.refinedmods.refinedstorage2.platform.common.importer.ImporterContainerMenu; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.DiskDriveContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.externalstorage.ExternalStorageContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockContainerMenu; @@ -71,6 +72,8 @@ public final class Menus { private Supplier> portableGridBlock; @Nullable private Supplier> portableGridItem; + @Nullable + private Supplier> securityCard; private Menus() { } @@ -234,4 +237,12 @@ public MenuType getPortableGridItem() { public void setPortableGridItem(final Supplier> portableGridItem) { this.portableGridItem = portableGridItem; } + + public MenuType getSecurityCard() { + return requireNonNull(securityCard).get(); + } + + public void setSecurityCard(final Supplier> securityCard) { + this.securityCard = securityCard; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java index bf2de122c..0ca32b10f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java @@ -33,6 +33,7 @@ import com.refinedmods.refinedstorage2.platform.common.grid.strategy.ClientGridScrollingStrategy; import com.refinedmods.refinedstorage2.platform.common.grid.view.CompositeGridResourceFactory; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSizeListener; import com.refinedmods.refinedstorage2.platform.common.util.PacketUtil; import com.refinedmods.refinedstorage2.query.lexer.LexerTokenMappings; import com.refinedmods.refinedstorage2.query.parser.ParserOperatorMappings; @@ -57,7 +58,7 @@ import static java.util.Objects.requireNonNull; public abstract class AbstractGridContainerMenu extends AbstractBaseContainerMenu - implements GridWatcher, GridInsertionStrategy, GridExtractionStrategy, GridScrollingStrategy { + implements GridWatcher, GridInsertionStrategy, GridExtractionStrategy, GridScrollingStrategy, ScreenSizeListener { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractGridContainerMenu.class); private static final GridQueryParserImpl QUERY_PARSER = new GridQueryParserImpl( LexerTokenMappings.DEFAULT_MAPPINGS, @@ -82,8 +83,6 @@ public abstract class AbstractGridContainerMenu extends AbstractBaseContainerMen private GridExtractionStrategy extractionStrategy; @Nullable private GridScrollingStrategy scrollingStrategy; - @Nullable - private Runnable sizeChangedListener; private GridSynchronizer synchronizer; @Nullable private ResourceType resourceTypeFilter; @@ -172,10 +171,6 @@ public void onResourceUpdate(final ResourceKey resource, view.onChange(resource, amount, trackedResource); } - public void setSizeChangedListener(@Nullable final Runnable sizeChangedListener) { - this.sizeChangedListener = sizeChangedListener; - } - public GridSortingDirection getSortingDirection() { return Platform.INSTANCE.getConfig().getGrid().getSortingDirection(); } @@ -196,17 +191,6 @@ public void setSortingType(final GridSortingTypes sortingType) { view.sort(); } - public GridSize getSize() { - return Platform.INSTANCE.getConfig().getGrid().getSize(); - } - - public void setSize(final GridSize size) { - Platform.INSTANCE.getConfig().getGrid().setSize(size); - if (sizeChangedListener != null) { - sizeChangedListener.run(); - } - } - public void setSearchBox(final GridSearchBox searchBox) { this.searchBox = searchBox; registerViewUpdatingListener(searchBox); @@ -250,7 +234,8 @@ public void removed(final Player playerEntity) { } } - public void addSlots(final int playerInventoryY) { + @Override + public void initSlots(final int playerInventoryY) { resetSlots(); addPlayerInventory(playerInventory, 8, playerInventoryY); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java index 43ea346da..4ef029e92 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java @@ -41,7 +41,7 @@ public CraftingGridContainerMenu(final int syncId, final Inventory playerInvento super(Menus.INSTANCE.getCraftingGrid(), syncId, playerInventory, buf); this.source = new ClientCraftingGridSource(); this.player = playerInventory.player; - addSlots(0); + initSlots(0); registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); } @@ -51,7 +51,7 @@ public CraftingGridContainerMenu(final int syncId, final Inventory playerInvento super(Menus.INSTANCE.getCraftingGrid(), syncId, playerInventory, grid); this.source = new CraftingGridSourceImpl(grid); this.player = playerInventory.player; - addSlots(0); + initSlots(0); registerProperty(new ServerProperty<>( PropertyTypes.REDSTONE_MODE, grid::getRedstoneMode, @@ -88,8 +88,8 @@ public ItemStack quickMoveStack(final Player actor, final int slotIndex) { } @Override - public void addSlots(final int playerInventoryY) { - super.addSlots(playerInventoryY); + public void initSlots(final int playerInventoryY) { + super.initSlots(playerInventoryY); craftingMatrixSlots.clear(); for (int y = 0; y < 3; ++y) { for (int x = 0; x < 3; ++x) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java index e2d5eb918..d3ce3af2e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java @@ -12,13 +12,13 @@ public class GridContainerMenu extends AbstractGridContainerMenu { public GridContainerMenu(final int syncId, final Inventory playerInventory, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getGrid(), syncId, playerInventory, buf); - addSlots(0); + initSlots(0); registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); } GridContainerMenu(final int syncId, final Inventory playerInventory, final GridBlockEntity grid) { super(Menus.INSTANCE.getGrid(), syncId, playerInventory, grid); - addSlots(0); + initSlots(0); registerProperty(new ServerProperty<>( PropertyTypes.REDSTONE_MODE, grid::getRedstoneMode, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java index 7ecfa7dfa..33ccc6987 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java @@ -12,7 +12,7 @@ public class WirelessGridContainerMenu extends AbstractGridContainerMenu { public WirelessGridContainerMenu(final int syncId, final Inventory playerInventory, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getWirelessGrid(), syncId, playerInventory, buf); this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); - addSlots(0); + initSlots(0); } WirelessGridContainerMenu(final int syncId, @@ -21,6 +21,6 @@ public WirelessGridContainerMenu(final int syncId, final Inventory playerInvento final SlotReference slotReference) { super(Menus.INSTANCE.getWirelessGrid(), syncId, playerInventory, grid); this.disabledSlot = slotReference; - addSlots(0); + initSlots(0); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java index a46f2213e..454afcd89 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java @@ -14,20 +14,18 @@ import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.grid.AbstractGridContainerMenu; import com.refinedmods.refinedstorage2.platform.common.grid.view.ItemGridResource; -import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseScreen; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.DisabledSlot; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.PropertyTypes; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; +import com.refinedmods.refinedstorage2.platform.common.support.stretching.AbstractStretchingScreen; import com.refinedmods.refinedstorage2.platform.common.support.tooltip.SmallTextClientTooltipComponent; import com.refinedmods.refinedstorage2.platform.common.support.widget.History; import com.refinedmods.refinedstorage2.platform.common.support.widget.RedstoneModeSideButtonWidget; -import com.refinedmods.refinedstorage2.platform.common.support.widget.ScrollbarWidget; import com.refinedmods.refinedstorage2.query.lexer.SyntaxHighlighter; import com.refinedmods.refinedstorage2.query.lexer.SyntaxHighlighterColors; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import javax.annotation.Nullable; import com.mojang.blaze3d.systems.RenderSystem; @@ -43,16 +41,14 @@ import org.slf4j.LoggerFactory; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; +import static java.util.Objects.requireNonNullElse; -public abstract class AbstractGridScreen extends AbstractBaseScreen { +public abstract class AbstractGridScreen extends AbstractStretchingScreen { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractGridScreen.class); private static final int MODIFIED_JUST_NOW_MAX_SECONDS = 10; - private static final int TOP_HEIGHT = 19; - private static final int INVENTORY_INCLUDING_TITLE_HEIGHT = 99; private static final int COLUMNS = 9; - private static final int MIN_ROWS = 3; private static final int DISABLED_SLOT_COLOR = 0xFF5B5B5B; private static final int SELECTION_SLOT_COLOR = -2130706433; @@ -63,10 +59,7 @@ public abstract class AbstractGridScreen ex @Nullable GridSearchBoxWidget searchField; - @Nullable - private ScrollbarWidget scrollbar; private int totalRows; - private int visibleRows; private int currentGridSlotIndex; protected AbstractGridScreen(final T menu, @@ -75,17 +68,12 @@ protected AbstractGridScreen(final T menu, final int bottomHeight) { super(menu, playerInventory, text); this.bottomHeight = bottomHeight; - this.menu.setSizeChangedListener(this::init); } @Override protected void init() { LOGGER.info("Initializing grid screen"); - this.visibleRows = calculateVisibleRows(); - this.imageHeight = TOP_HEIGHT + (visibleRows * 18) + bottomHeight; - this.inventoryLabelY = imageHeight - INVENTORY_INCLUDING_TITLE_HEIGHT + 4; - super.init(); if (searchField == null) { @@ -103,14 +91,9 @@ protected void init() { } getMenu().setSearchBox(searchField); - getMenu().addSlots(imageHeight - INVENTORY_INCLUDING_TITLE_HEIGHT + 17); - - this.scrollbar = new ScrollbarWidget(leftPos + 174, topPos + 20, 12, (visibleRows * 18) - 2); - this.scrollbar.setScrollAnimation(Platform.INSTANCE.getConfig().getGrid().isSmoothScrolling()); - this.getMenu().getView().setListener(this::resourcesChanged); - resourcesChanged(); + getMenu().getView().setListener(this::updateScrollbar); + updateScrollbar(); - addWidget(scrollbar); addWidget(searchField); if (getMenu().hasProperty(PropertyTypes.REDSTONE_MODE)) { @@ -118,7 +101,6 @@ protected void init() { } addSideButton(new SortingDirectionSideButtonWidget(getMenu())); addSideButton(new SortingTypeSideButtonWidget(getMenu())); - addSideButton(new SizeSideButtonWidget(getMenu())); addSideButton(new AutoSelectedSideButtonWidget(getMenu())); addSideButton(new ResourceTypeSideButtonWidget(getMenu())); @@ -150,70 +132,54 @@ private void trySynchronizeToGrid() { searchField.setValue(text); } - private void resourcesChanged() { - if (scrollbar == null) { - return; - } - totalRows = (int) Math.ceil((float) getMenu().getView().getViewList().size() / (float) COLUMNS); - scrollbar.setEnabled(totalRows > visibleRows); - final int rowsExcludingVisibleOnes = totalRows - visibleRows; - final int maxOffset = scrollbar.isScrollAnimation() - ? (rowsExcludingVisibleOnes * 18) - : rowsExcludingVisibleOnes; - scrollbar.setMaxOffset(maxOffset); - } - - private int calculateVisibleRows() { - final int screenSpaceAvailable = height - TOP_HEIGHT - bottomHeight; - final int maxRows = getMaxRows(); - return Math.max(MIN_ROWS, Math.min((screenSpaceAvailable / 18) - MIN_ROWS, maxRows)); - } - - private int getMaxRows() { - return switch (getMenu().getSize()) { - case STRETCH -> Platform.INSTANCE.getConfig().getGrid().getMaxRowsStretch(); - case SMALL -> 3; - case MEDIUM -> 5; - case LARGE -> 8; - case EXTRA_LARGE -> 12; - }; + private void updateScrollbar() { + this.totalRows = (int) Math.ceil((float) getMenu().getView().getViewList().size() / (float) COLUMNS); + updateScrollbar(totalRows); } private boolean isOverStorageArea(final int mouseX, final int mouseY) { final int relativeMouseX = mouseX - leftPos; final int relativeMouseY = mouseY - topPos; return relativeMouseX >= 7 - && relativeMouseY >= TOP_HEIGHT && relativeMouseX <= 168 - && relativeMouseY <= TOP_HEIGHT + (visibleRows * 18); + && isInStretchedArea(relativeMouseY); } @Override - protected void renderBg(final GuiGraphics graphics, final float delta, final int mouseX, final int mouseY) { - final int x = (width - imageWidth) / 2; - final int y = (height - imageHeight) / 2; - - graphics.blit(getTexture(), x, y, 0, 0, imageWidth, TOP_HEIGHT); - - for (int row = 0; row < visibleRows; ++row) { + protected void renderStretchingBackground(final GuiGraphics graphics, final int x, final int y, final int rows) { + for (int row = 0; row < rows; ++row) { int textureY = 37; if (row == 0) { textureY = 19; - } else if (row == visibleRows - 1) { + } else if (row == rows - 1) { textureY = 55; } - graphics.blit(getTexture(), x, y + TOP_HEIGHT + (18 * row), 0, textureY, imageWidth, 18); + graphics.blit(getTexture(), x, y + (ROW_SIZE * row), 0, textureY, imageWidth, ROW_SIZE); } + } - graphics.blit(getTexture(), x, y + TOP_HEIGHT + (18 * visibleRows), 0, 73, imageWidth, bottomHeight); + @Override + protected int getBottomHeight() { + return bottomHeight; + } - currentGridSlotIndex = -1; + @Override + protected int getBottomV() { + return 73; + } - graphics.enableScissor(x + 7, y + TOP_HEIGHT, x + 7 + (18 * COLUMNS), y + TOP_HEIGHT + (visibleRows * 18)); - for (int row = 0; row < Math.max(totalRows, visibleRows); ++row) { - renderRow(graphics, mouseX, mouseY, x, y, row); + @Override + protected void renderRows(final GuiGraphics graphics, + final int x, + final int y, + final int topHeight, + final int rows, + final int mouseX, + final int mouseY) { + currentGridSlotIndex = -1; + for (int row = 0; row < Math.max(totalRows, rows); ++row) { + renderRow(graphics, mouseX, mouseY, x, y, topHeight, row, rows); } - graphics.disableScissor(); } private void renderRow(final GuiGraphics graphics, @@ -221,33 +187,22 @@ private void renderRow(final GuiGraphics graphics, final int mouseY, final int x, final int y, - final int row) { + final int topHeight, + final int row, + final int visibleRows) { final int rowX = x + 7; - final int rowY = y + TOP_HEIGHT + (row * 18) - getScrollbarOffset(); - - final boolean isOutOfFrame = (rowY < y + TOP_HEIGHT - 18) || (rowY > y + TOP_HEIGHT + (visibleRows * 18)); + final int rowY = y + topHeight + (row * ROW_SIZE) - getScrollbarOffset(); + final boolean isOutOfFrame = (rowY < y + topHeight - ROW_SIZE) + || (rowY > y + topHeight + (ROW_SIZE * visibleRows)); if (isOutOfFrame) { return; } - - graphics.blit(getTexture(), rowX, rowY, 0, 238, 162, 18); - + graphics.blit(getTexture(), rowX, rowY, 0, 238, 162, ROW_SIZE); for (int column = 0; column < COLUMNS; ++column) { renderCell(graphics, mouseX, mouseY, rowX, rowY, (row * COLUMNS) + column, column); } } - private int getScrollbarOffset() { - if (scrollbar == null) { - return 0; - } - final int scrollbarOffset = (int) scrollbar.getOffset(); - if (!scrollbar.isScrollAnimation()) { - return scrollbarOffset * 18; - } - return scrollbarOffset; - } - private void renderCell(final GuiGraphics graphics, final int mouseX, final int mouseY, @@ -256,7 +211,7 @@ private void renderCell(final GuiGraphics graphics, final int idx, final int column) { final GridView view = getMenu().getView(); - final int slotX = rowX + 1 + (column * 18); + final int slotX = rowX + 1 + (column * ROW_SIZE); final int slotY = rowY + 1; if (!getMenu().isActive()) { renderDisabledSlot(graphics, slotX, slotY); @@ -308,8 +263,8 @@ private void renderAmount(final GuiGraphics graphics, } final String text = resource.isZeroed() ? "0" : platformResource.getDisplayedAmount(); final int color = resource.isZeroed() - ? Objects.requireNonNullElse(ChatFormatting.RED.getColor(), 15) - : Objects.requireNonNullElse(ChatFormatting.WHITE.getColor(), 15); + ? requireNonNullElse(ChatFormatting.RED.getColor(), 15) + : requireNonNullElse(ChatFormatting.WHITE.getColor(), 15); final boolean large = (minecraft != null && minecraft.isEnforceUnicode()) || Platform.INSTANCE.getConfig().getGrid().isLargeFont(); renderAmount(graphics, slotX, slotY, text, color, large); @@ -439,9 +394,6 @@ public PlatformResourceKey getCurrentResource() { @Override public void render(final GuiGraphics graphics, final int mouseX, final int mouseY, final float partialTicks) { super.render(graphics, mouseX, mouseY, partialTicks); - if (scrollbar != null) { - scrollbar.render(graphics, mouseX, mouseY, partialTicks); - } if (searchField != null) { searchField.render(graphics, 0, 0, 0); } @@ -449,10 +401,6 @@ public void render(final GuiGraphics graphics, final int mouseX, final int mouse @Override public boolean mouseClicked(final double mouseX, final double mouseY, final int clickedButton) { - if (scrollbar != null && scrollbar.mouseClicked(mouseX, mouseY, clickedButton)) { - return true; - } - final ItemStack carriedStack = getMenu().getCarried(); final PlatformGridResource resource = getCurrentGridResource(); @@ -497,19 +445,6 @@ private static boolean shouldExtractToCursor() { return !hasShiftDown(); } - @Override - public void mouseMoved(final double mx, final double my) { - if (scrollbar != null) { - scrollbar.mouseMoved(mx, my); - } - super.mouseMoved(mx, my); - } - - @Override - public boolean mouseReleased(final double mx, final double my, final int button) { - return (scrollbar != null && scrollbar.mouseReleased(mx, my, button)) || super.mouseReleased(mx, my, button); - } - @Override public boolean mouseScrolled(final double x, final double y, final double z, final double delta) { final boolean up = delta > 0; @@ -523,9 +458,7 @@ public boolean mouseScrolled(final double x, final double y, final double z, fin mouseScrolledInInventory(up, hoveredSlot); } - final boolean didScrollbar = - scrollbar != null && !hasShiftDown() && !hasControlDown() && scrollbar.mouseScrolled(x, y, z, delta); - return didScrollbar || super.mouseScrolled(x, y, z, delta); + return super.mouseScrolled(x, y, z, delta); } private void mouseScrolledInInventory(final boolean up, final Slot slot) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java new file mode 100644 index 000000000..ba2f4ba90 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java @@ -0,0 +1,76 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.security.BuiltinPermissions; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public enum BuiltinPermission implements PlatformPermission { + /** + * Whether the player can insert resources into a network. + */ + INSERT("insert"), + /** + * Whether the player can extract resources from a network. + */ + EXTRACT("extract"), + /** + * Whether the player can start, cancel or view an autocrafting task. + */ + AUTOCRAFTING("autocrafting"), + /** + * Whether the player can open network device GUIs. + */ + MODIFY("modify"), + /** + * Whether the player can add or remove network devices. + */ + BUILD("build"), + /** + * Whether the player can manage the security options for a network. + */ + SECURITY("security"); + + public static final BuiltinPermissions VIEW = new BuiltinPermissions( + INSERT, + EXTRACT, + AUTOCRAFTING, + MODIFY, + BUILD, + SECURITY + ); + + private final ResourceLocation id; + private final Component name; + private final Component description; + + BuiltinPermission(final String id) { + this.id = createIdentifier(id); + this.name = createTranslation("permission", id); + this.description = createTranslation("permission", id + ".description"); + } + + public ResourceLocation getId() { + return id; + } + + @Override + public Component getName() { + return name; + } + + @Override + public Component getDescription() { + return description; + } + + @Override + public Component getOwnerName() { + return ContentNames.MOD; + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java new file mode 100644 index 000000000..4bbc6bdbd --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java @@ -0,0 +1,57 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.common.content.Menus; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSizeListener; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +public class SecurityCardContainerMenu extends AbstractBaseContainerMenu implements ScreenSizeListener { + private final Inventory playerInventory; + private final List permissions; + + public SecurityCardContainerMenu(final int syncId, + final Inventory playerInventory, + final FriendlyByteBuf buf) { + super(Menus.INSTANCE.getSecurityCard(), syncId); + this.playerInventory = playerInventory; + this.permissions = new ArrayList<>(); + this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); + final int amountOfPermissions = buf.readInt(); + for (int i = 0; i < amountOfPermissions; ++i) { + final ResourceLocation id = buf.readResourceLocation(); + PlatformApi.INSTANCE.getPermissionRegistry().get(id).ifPresent(permission -> permissions.add(new Permission( + id, + permission.getName(), + permission.getDescription(), + permission.getOwnerName() + ))); + } + } + + SecurityCardContainerMenu(final int syncId, final Inventory playerInventory) { + super(Menus.INSTANCE.getSecurityCard(), syncId); + this.playerInventory = playerInventory; + this.permissions = new ArrayList<>(); + } + + List getPermissions() { + return permissions; + } + + @Override + public void initSlots(final int playerInventoryY) { + resetSlots(); + addPlayerInventory(playerInventory, 8, playerInventoryY); + } + + record Permission(ResourceLocation id, Component name, Component description, Component ownerName) { + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java new file mode 100644 index 000000000..b5a4a2cbb --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java @@ -0,0 +1,48 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; + +import java.util.List; +import javax.annotation.Nullable; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; + +class SecurityCardExtendedMenuProvider implements ExtendedMenuProvider { + private final SlotReference slotReference; + + SecurityCardExtendedMenuProvider(final SlotReference slotReference) { + this.slotReference = slotReference; + } + + @Override + public void writeScreenOpeningData(final ServerPlayer player, final FriendlyByteBuf buf) { + PlatformApi.INSTANCE.writeSlotReference(slotReference, buf); + final List permissions = PlatformApi.INSTANCE.getPermissionRegistry().getAll(); + buf.writeInt(permissions.size()); + for (final PlatformPermission permission : permissions) { + final ResourceLocation id = PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).orElseThrow(); + buf.writeResourceLocation(id); + } + } + + @Override + public Component getDisplayName() { + return ContentNames.SECURITY_CARD; + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(final int syncId, final Inventory inventory, final Player player) { + return new SecurityCardContainerMenu(syncId, inventory); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java index f7a082f50..5dd31e8a2 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java @@ -1,14 +1,104 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; +import com.refinedmods.refinedstorage2.platform.common.Platform; + +import java.util.List; +import java.util.Optional; +import javax.annotation.Nullable; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class SecurityCardItem extends Item { + private static final Component UNBOUND_HELP = createTranslation("item", "security_card.unbound.help"); + private static final Component BOUND_HELP = createTranslation("item", "security_card.bound.help"); + + private static final String TAG_BOUND_TO = "boundto"; + private static final String TAG_BOUND_TO_NAME = "boundtoname"; + public SecurityCardItem() { super(new Item.Properties().stacksTo(1)); } + @Override + public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { + final ItemStack stack = player.getItemInHand(hand); + if (player instanceof ServerPlayer serverPlayer) { + if (serverPlayer.isCrouching()) { + bindOrUnbind(serverPlayer, stack); + } else { + Platform.INSTANCE.getMenuOpener().openMenu(serverPlayer, new SecurityCardExtendedMenuProvider( + PlatformApi.INSTANCE.createInventorySlotReference(player, hand) + )); + } + } + return InteractionResultHolder.consume(stack); + } + + private void bindOrUnbind(final ServerPlayer player, final ItemStack stack) { + if (stack.hasTag()) { + unbind(player, stack); + } else { + bind(player, stack); + } + } + + private void unbind(final ServerPlayer player, final ItemStack stack) { + stack.setTag(null); + player.sendSystemMessage(createTranslation( + "item", + "security_card.unbound" + )); + } + + private void bind(final ServerPlayer player, final ItemStack stack) { + stack.getOrCreateTag().putUUID(TAG_BOUND_TO, player.getGameProfile().getId()); + stack.getOrCreateTag().putString(TAG_BOUND_TO_NAME, player.getGameProfile().getName()); + player.sendSystemMessage(createTranslation( + "item", + "security_card.bound", + Component.literal(player.getGameProfile().getName()).withStyle(ChatFormatting.YELLOW) + )); + } + + @Override + public void appendHoverText(final ItemStack stack, + @Nullable final Level level, + final List lines, + final TooltipFlag flag) { + super.appendHoverText(stack, level, lines, flag); + if (stack.getTag() == null) { + lines.add(createTranslation("item", "security_card.unbound").withStyle(ChatFormatting.GRAY)); + return; + } + final Component boundToName = Component.literal(stack.getTag().getString(TAG_BOUND_TO_NAME)) + .withStyle(ChatFormatting.YELLOW); + lines.add(createTranslation( + "item", + "security_card.bound", + boundToName + ).withStyle(ChatFormatting.GRAY)); + } + + @Override + public Optional getTooltipImage(final ItemStack stack) { + return Optional.of(new HelpTooltipComponent(isActive(stack) ? BOUND_HELP : UNBOUND_HELP)); + } + boolean isActive(final ItemStack stack) { - return false; + return stack.getTag() != null && stack.getTag().contains(TAG_BOUND_TO); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java new file mode 100644 index 000000000..db6ab736d --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java @@ -0,0 +1,148 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.common.support.stretching.AbstractStretchingScreen; +import com.refinedmods.refinedstorage2.platform.common.support.widget.CustomCheckboxWidget; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public class SecurityCardScreen extends AbstractStretchingScreen { + private static final ResourceLocation TEXTURE = createIdentifier("textures/gui/security_card.png"); + + private static final int BINDING_RIGHT_PADDING = 6; + private static final int BINDING_WIDTH = 80; + private static final MutableComponent UNBOUND_TITLE = Component.literal("<") + .append(createTranslation("gui", "security_card.unbound")) + .append(">"); + + private final List checkboxes = new ArrayList<>(); + + public SecurityCardScreen(final SecurityCardContainerMenu menu, + final Inventory playerInventory, + final Component text) { + super(menu, playerInventory, text); + this.inventoryLabelY = 97; + this.imageWidth = 193; + this.imageHeight = 176; + } + + @Override + protected void init() { + super.init(); + + checkboxes.clear(); + final List permissions = getMenu().getPermissions(); + for (int i = 0; i < permissions.size(); ++i) { + final CustomCheckboxWidget checkbox = createPermissionCheckbox(permissions.get(i), i); + addWidget(checkbox); + checkboxes.add(checkbox); + } + updateScrollbar(checkboxes.size()); + + final Button playerButton = Button.builder(UNBOUND_TITLE, btn -> toggleBoundPlayer()) + .pos(leftPos + imageWidth - BINDING_RIGHT_PADDING - BINDING_WIDTH, topPos + 4) + .size(BINDING_WIDTH, 14) + .build(); + addRenderableWidget(playerButton); + } + + private CustomCheckboxWidget createPermissionCheckbox( + final SecurityCardContainerMenu.Permission permission, + final int index + ) { + final CustomCheckboxWidget checkbox = new CustomCheckboxWidget( + leftPos + 10, + getPermissionCheckboxY(index), + permission.name(), + font, + false + ); + checkbox.setTooltip(getPermissionTooltip(permission)); + return checkbox; + } + + private Tooltip getPermissionTooltip(final SecurityCardContainerMenu.Permission permission) { + final MutableComponent ownerName = permission.ownerName().copy().withStyle( + Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY) + ); + return Tooltip.create(permission.description().copy().append("\n").append(ownerName)); + } + + private int getPermissionCheckboxY(final int index) { + return topPos + 19 + (index * ROW_SIZE) + 3; + } + + @Override + protected int getScrollPanePadding() { + return 4; + } + + private void toggleBoundPlayer() { + // todo! + } + + @Override + protected void scrollbarChanged(final int rows) { + final int offset = getScrollbarOffset(); + for (int i = 0; i < checkboxes.size(); ++i) { + final CustomCheckboxWidget checkbox = checkboxes.get(i); + final int y = getPermissionCheckboxY(i) - offset; + checkbox.visible = y >= (topPos + 19 - ROW_SIZE) && y < (topPos + 19 + (rows * ROW_SIZE)); + checkbox.setY(y); + } + } + + @Override + protected void renderRows(final GuiGraphics graphics, + final int x, + final int y, + final int topHeight, + final int rows, + final int mouseX, + final int mouseY) { + for (final CustomCheckboxWidget checkbox : checkboxes) { + checkbox.render(graphics, mouseX, mouseY, 0); + } + } + + @Override + protected void renderStretchingBackground(final GuiGraphics graphics, final int x, final int y, final int rows) { + for (int row = 0; row < rows; ++row) { + int textureY = 37; + if (row == 0) { + textureY = 19; + } else if (row == rows - 1) { + textureY = 55; + } + graphics.blit(getTexture(), x, y + (ROW_SIZE * row), 0, textureY, imageWidth, ROW_SIZE); + } + } + + @Override + protected int getBottomHeight() { + return 99; + } + + @Override + protected int getBottomV() { + return 73; + } + + @Override + protected ResourceLocation getTexture() { + return TEXTURE; + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/StorageTooltipHelper.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/StorageTooltipHelper.java index 8b7334c2b..3b3d562f0 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/StorageTooltipHelper.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/StorageTooltipHelper.java @@ -1,13 +1,13 @@ package com.refinedmods.refinedstorage2.platform.common.storage; -import com.refinedmods.refinedstorage2.platform.api.PlatformApi; - import java.util.List; import java.util.function.LongFunction; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + final class StorageTooltipHelper { private StorageTooltipHelper() { } @@ -15,7 +15,7 @@ private StorageTooltipHelper() { static void addAmountStoredWithoutCapacity(final List tooltip, final long stored, final LongFunction quantityFormatter) { - tooltip.add(PlatformApi.INSTANCE.createTranslation( + tooltip.add(createTranslation( "misc", "stored", Component.literal(quantityFormatter.apply(stored)).withStyle(ChatFormatting.WHITE) @@ -31,7 +31,7 @@ static void addAmountStoredWithCapacity(final List tooltip, return; } final int progress = (int) ((double) stored / capacity * 100D); - tooltip.add(PlatformApi.INSTANCE.createTranslation( + tooltip.add(createTranslation( "misc", "stored_with_capacity", Component.literal(quantityFormatter.apply(stored)).withStyle(ChatFormatting.WHITE), diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java index ab9a16b06..82dc1c709 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java @@ -65,8 +65,8 @@ protected boolean canTransferSlot(final Slot slot) { } @Override - public void addSlots(final int playerInventoryY) { - super.addSlots(playerInventoryY); + public void initSlots(final int playerInventoryY) { + super.initSlots(playerInventoryY); diskSlot = new ValidatedSlot( diskInventory, 0, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java index 880c59258..799c8ac19 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java @@ -15,7 +15,7 @@ public PortableGridBlockContainerMenu(final int syncId, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getPortableGridBlock(), syncId, playerInventory, buf); registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); - addSlots(0); + initSlots(0); } PortableGridBlockContainerMenu(final int syncId, @@ -34,6 +34,6 @@ public PortableGridBlockContainerMenu(final int syncId, portableGrid::getRedstoneMode, portableGrid::setRedstoneMode )); - addSlots(0); + initSlots(0); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java index 995c5af9c..c6c58ffb2 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java @@ -16,7 +16,7 @@ public PortableGridItemContainerMenu(final int syncId, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getPortableGridItem(), syncId, playerInventory, buf); this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); - addSlots(0); + initSlots(0); } PortableGridItemContainerMenu(final int syncId, @@ -34,6 +34,6 @@ public PortableGridItemContainerMenu(final int syncId, energyStorage ); this.disabledSlot = slotReference; - addSlots(0); + initSlots(0); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java new file mode 100644 index 000000000..eac896eea --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java @@ -0,0 +1,188 @@ +package com.refinedmods.refinedstorage2.platform.common.support.stretching; + +import com.refinedmods.refinedstorage2.platform.common.Platform; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseScreen; +import com.refinedmods.refinedstorage2.platform.common.support.widget.ScrollbarWidget; + +import javax.annotation.Nullable; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; + +public abstract class AbstractStretchingScreen + extends AbstractBaseScreen { + protected static final int ROW_SIZE = 18; + + private static final int TOP_HEIGHT = 19; + private static final int COLUMNS = 9; + private static final int MIN_ROWS = 3; + private static final int INVENTORY_INCLUDING_TITLE_HEIGHT = 99; + private static final int ROW_PADDING = 3; + + private int visibleRows; + @Nullable + private ScrollbarWidget scrollbar; + + protected AbstractStretchingScreen(final T menu, + final Inventory playerInventory, + final Component text) { + super(menu, playerInventory, text); + } + + @Override + protected void init() { + this.visibleRows = calculateVisibleRows(); + this.imageHeight = TOP_HEIGHT + (ROW_SIZE * visibleRows) + getBottomHeight(); + this.inventoryLabelY = imageHeight - INVENTORY_INCLUDING_TITLE_HEIGHT + 4; + + getMenu().initSlots(imageHeight - INVENTORY_INCLUDING_TITLE_HEIGHT + 17); + + super.init(); + + addSideButton(new ScreenSizeSideButtonWidget(this)); + + this.scrollbar = new ScrollbarWidget(leftPos + 174, topPos + 20, 12, (visibleRows * ROW_SIZE) - 2); + this.scrollbar.setListener(offset -> scrollbarChanged(visibleRows)); + addWidget(scrollbar); + } + + protected final int getScrollbarOffset() { + if (scrollbar == null) { + return 0; + } + final int scrollbarOffset = (int) scrollbar.getOffset(); + if (!scrollbar.isSmoothScrolling()) { + return scrollbarOffset * ROW_SIZE; + } + return scrollbarOffset; + } + + protected void scrollbarChanged(final int rows) { + // empty + } + + @Override + protected void renderBg(final GuiGraphics graphics, final float delta, final int mouseX, final int mouseY) { + final int x = (width - imageWidth) / 2; + final int y = (height - imageHeight) / 2; + renderBackground(graphics, x, y); + renderRows(graphics, mouseX, mouseY, x, y); + } + + private void renderBackground(final GuiGraphics graphics, final int x, final int y) { + graphics.blit(getTexture(), x, y, 0, 0, imageWidth, TOP_HEIGHT); + renderStretchingBackground(graphics, x, y + TOP_HEIGHT, visibleRows); + graphics.blit( + getTexture(), + x, + y + TOP_HEIGHT + (ROW_SIZE * visibleRows), + 0, + getBottomV(), + imageWidth, + getBottomHeight() + ); + } + + private void renderRows(final GuiGraphics graphics, final int mouseX, final int mouseY, final int x, final int y) { + graphics.enableScissor( + x + 7, + y + TOP_HEIGHT + 1, + x + 7 + (ROW_SIZE * COLUMNS), + y + TOP_HEIGHT + 1 + (ROW_SIZE * visibleRows) - 2 + ); + renderRows(graphics, x, y, TOP_HEIGHT, visibleRows, mouseX, mouseY); + graphics.disableScissor(); + } + + protected abstract void renderRows( + GuiGraphics graphics, + int x, + int y, + int topHeight, + int rows, + int mouseX, + int mouseY + ); + + protected abstract void renderStretchingBackground(GuiGraphics graphics, int x, int y, int rows); + + @Override + public void render(final GuiGraphics graphics, final int mouseX, final int mouseY, final float partialTicks) { + super.render(graphics, mouseX, mouseY, partialTicks); + if (scrollbar != null) { + scrollbar.render(graphics, mouseX, mouseY, partialTicks); + } + } + + @Override + public boolean mouseClicked(final double mouseX, final double mouseY, final int clickedButton) { + if (scrollbar != null && scrollbar.mouseClicked(mouseX, mouseY, clickedButton)) { + return true; + } + return super.mouseClicked(mouseX, mouseY, clickedButton); + } + + @Override + public void mouseMoved(final double mx, final double my) { + if (scrollbar != null) { + scrollbar.mouseMoved(mx, my); + } + super.mouseMoved(mx, my); + } + + @Override + public boolean mouseReleased(final double mx, final double my, final int button) { + return (scrollbar != null && scrollbar.mouseReleased(mx, my, button)) || super.mouseReleased(mx, my, button); + } + + @Override + public boolean mouseScrolled(final double x, final double y, final double z, final double delta) { + final boolean didScrollbar = scrollbar != null + && !hasShiftDown() + && !hasControlDown() + && scrollbar.mouseScrolled(x, y, z, delta); + return didScrollbar || super.mouseScrolled(x, y, z, delta); + } + + private int calculateVisibleRows() { + final int screenSpaceAvailable = height - TOP_HEIGHT - getBottomHeight(); + final int maxRows = getMaxRows(); + return Math.max(MIN_ROWS, Math.min((screenSpaceAvailable / ROW_SIZE) - ROW_PADDING, maxRows)); + } + + protected final boolean isInStretchedArea(final int y) { + return y >= TOP_HEIGHT && y < TOP_HEIGHT + (ROW_SIZE * visibleRows); + } + + private int getMaxRows() { + return switch (Platform.INSTANCE.getConfig().getScreenSize()) { + case STRETCH -> Platform.INSTANCE.getConfig().getMaxRowsStretch(); + case SMALL -> 3; + case MEDIUM -> 5; + case LARGE -> 8; + case EXTRA_LARGE -> 12; + }; + } + + protected final void updateScrollbar(final int totalRows) { + if (scrollbar == null) { + return; + } + scrollbar.setEnabled(totalRows > visibleRows); + final int rowsExcludingVisibleOnes = totalRows - visibleRows; + final int maxOffset = scrollbar.isSmoothScrolling() + ? ((rowsExcludingVisibleOnes * ROW_SIZE) + getScrollPanePadding()) + : rowsExcludingVisibleOnes; + scrollbar.setMaxOffset(maxOffset); + } + + protected abstract int getBottomHeight(); + + protected abstract int getBottomV(); + + protected int getScrollPanePadding() { + return 0; + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridSize.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSize.java similarity index 69% rename from refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridSize.java rename to refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSize.java index f045e4881..79efb5b0c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridSize.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSize.java @@ -1,13 +1,13 @@ -package com.refinedmods.refinedstorage2.platform.common.grid; +package com.refinedmods.refinedstorage2.platform.common.support.stretching; -public enum GridSize { +public enum ScreenSize { STRETCH, SMALL, MEDIUM, LARGE, EXTRA_LARGE; - public GridSize toggle() { + public ScreenSize toggle() { return switch (this) { case STRETCH -> SMALL; case SMALL -> MEDIUM; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java new file mode 100644 index 000000000..f26c565bf --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java @@ -0,0 +1,5 @@ +package com.refinedmods.refinedstorage2.platform.common.support.stretching; + +public interface ScreenSizeListener { + void initSlots(int playerInventoryY); +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/SizeSideButtonWidget.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeSideButtonWidget.java similarity index 53% rename from refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/SizeSideButtonWidget.java rename to refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeSideButtonWidget.java index 957c0b467..e4affb966 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/SizeSideButtonWidget.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeSideButtonWidget.java @@ -1,35 +1,36 @@ -package com.refinedmods.refinedstorage2.platform.common.grid.screen; +package com.refinedmods.refinedstorage2.platform.common.support.stretching; -import com.refinedmods.refinedstorage2.platform.common.grid.AbstractGridContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.support.widget.AbstractSideButtonWidget; import net.minecraft.network.chat.MutableComponent; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -class SizeSideButtonWidget extends AbstractSideButtonWidget { - private static final MutableComponent TITLE = createTranslation("gui", "grid.size"); +public class ScreenSizeSideButtonWidget extends AbstractSideButtonWidget { + private static final MutableComponent TITLE = createTranslation("gui", "screen_size"); - private static final MutableComponent SUBTEXT_STRETCH = createTranslation("gui", "grid.size.stretch"); - private static final MutableComponent SUBTEXT_SMALL = createTranslation("gui", "grid.size.small"); - private static final MutableComponent SUBTEXT_MEDIUM = createTranslation("gui", "grid.size.medium"); - private static final MutableComponent SUBTEXT_LARGE = createTranslation("gui", "grid.size.large"); - private static final MutableComponent SUBTEXT_EXTRA_LARGE = createTranslation("gui", "grid.size.extra_large"); + private static final MutableComponent SUBTEXT_STRETCH = createTranslation("gui", "screen_size.stretch"); + private static final MutableComponent SUBTEXT_SMALL = createTranslation("gui", "screen_size.small"); + private static final MutableComponent SUBTEXT_MEDIUM = createTranslation("gui", "screen_size.medium"); + private static final MutableComponent SUBTEXT_LARGE = createTranslation("gui", "screen_size.large"); + private static final MutableComponent SUBTEXT_EXTRA_LARGE = createTranslation("gui", "screen_size.extra_large"); - private final AbstractGridContainerMenu menu; - - SizeSideButtonWidget(final AbstractGridContainerMenu menu) { - super(createPressAction(menu)); - this.menu = menu; + public ScreenSizeSideButtonWidget(final AbstractStretchingScreen stretchingScreen) { + super(createPressAction(stretchingScreen)); } - private static OnPress createPressAction(final AbstractGridContainerMenu menu) { - return btn -> menu.setSize(menu.getSize().toggle()); + private static OnPress createPressAction(final AbstractStretchingScreen stretchingScreen) { + return btn -> { + Platform.INSTANCE.getConfig().setScreenSize(Platform.INSTANCE.getConfig().getScreenSize().toggle()); + stretchingScreen.init(); + }; } @Override protected int getXTexture() { - return switch (menu.getSize()) { + final ScreenSize screenSize = Platform.INSTANCE.getConfig().getScreenSize(); + return switch (screenSize) { case STRETCH -> 64 + 48; case SMALL -> 64; case MEDIUM -> 64 + 16; @@ -49,7 +50,8 @@ protected MutableComponent getTitle() { @Override protected MutableComponent getSubText() { - return switch (menu.getSize()) { + final ScreenSize screenSize = Platform.INSTANCE.getConfig().getScreenSize(); + return switch (screenSize) { case STRETCH -> SUBTEXT_STRETCH; case SMALL -> SUBTEXT_SMALL; case MEDIUM -> SUBTEXT_MEDIUM; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/package-info.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/package-info.java new file mode 100644 index 000000000..c18a46a5b --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@FieldsAndMethodsAreNonnullByDefault +package com.refinedmods.refinedstorage2.platform.common.support.stretching; + +import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java new file mode 100644 index 000000000..3912a253f --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java @@ -0,0 +1,76 @@ +package com.refinedmods.refinedstorage2.platform.common.support.widget; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractButton; +import net.minecraft.client.gui.narration.NarratedElementType; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +// A custom checkbox so we can change the font color. +public class CustomCheckboxWidget extends AbstractButton { + private static final ResourceLocation CHECKBOX_SELECTED_HIGHLIGHTED_SPRITE = new ResourceLocation( + "widget/checkbox_selected_highlighted" + ); + private static final ResourceLocation CHECKBOX_SELECTED_SPRITE = new ResourceLocation( + "widget/checkbox_selected" + ); + private static final ResourceLocation CHECKBOX_HIGHLIGHTED_SPRITE = new ResourceLocation( + "widget/checkbox_highlighted" + ); + private static final ResourceLocation CHECKBOX_SPRITE = new ResourceLocation("widget/checkbox"); + + private static final int BOX_SIZE = 9 + 8; + + private boolean selected; + + public CustomCheckboxWidget(final int x, + final int y, + final Component text, + final Font font, + final boolean selected) { + super(x, y, BOX_SIZE + 4 + font.width(text), BOX_SIZE, text); + this.selected = selected; + } + + public void onPress() { + this.selected = !this.selected; + } + + public boolean selected() { + return this.selected; + } + + public void updateWidgetNarration(final NarrationElementOutput output) { + output.add(NarratedElementType.TITLE, this.createNarrationMessage()); + if (this.active) { + if (this.isFocused()) { + output.add(NarratedElementType.USAGE, Component.translatable("narration.checkbox.usage.focused")); + } else { + output.add(NarratedElementType.USAGE, Component.translatable("narration.checkbox.usage.hovered")); + } + } + } + + public void renderWidget(final GuiGraphics graphics, final int mouseX, final int mouseY, final float partialTicks) { + final Minecraft minecraft = Minecraft.getInstance(); + RenderSystem.enableDepthTest(); + final Font font = minecraft.font; + graphics.setColor(1.0F, 1.0F, 1.0F, this.alpha); + RenderSystem.enableBlend(); + final ResourceLocation sprite; + if (selected) { + sprite = isFocused() ? CHECKBOX_SELECTED_HIGHLIGHTED_SPRITE : CHECKBOX_SELECTED_SPRITE; + } else { + sprite = isFocused() ? CHECKBOX_HIGHLIGHTED_SPRITE : CHECKBOX_SPRITE; + } + final int x = getX() + BOX_SIZE + 4; + final int y = (getY() + (height >> 1)) - (9 >> 1); + graphics.blitSprite(sprite, getX(), getY(), BOX_SIZE, BOX_SIZE); + graphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + graphics.drawString(font, getMessage(), x, y, 4210752, false); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/ScrollbarWidget.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/ScrollbarWidget.java index 2925c0a8a..9111b4348 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/ScrollbarWidget.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/ScrollbarWidget.java @@ -1,5 +1,10 @@ package com.refinedmods.refinedstorage2.platform.common.support.widget; +import com.refinedmods.refinedstorage2.platform.common.Platform; + +import java.util.function.DoubleConsumer; +import javax.annotation.Nullable; + import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -15,27 +20,31 @@ public class ScrollbarWidget extends AbstractWidget { private static final int ANIMATION_SCROLL_DURATION_IN_TICKS = 10; private static final double ANIMATION_SCROLL_HEIGHT_IN_PIXELS = 30; + private final boolean smoothScrolling; + private double offset; private double maxOffset; private boolean enabled = true; private boolean clicked; - private boolean scrollAnimation; private int animationScrollDirection = 0; private double animationStartOffset; private double animationTickCounter; private int animationSpeed; + @Nullable + private DoubleConsumer listener; public ScrollbarWidget(final int x, final int y, final int width, final int height) { super(x, y, width, height, Component.empty()); + this.smoothScrolling = Platform.INSTANCE.getConfig().isSmoothScrolling(); } - public boolean isScrollAnimation() { - return scrollAnimation; + public void setListener(@Nullable final DoubleConsumer listener) { + this.listener = listener; } - public void setScrollAnimation(final boolean scrollAnimation) { - this.scrollAnimation = scrollAnimation; + public boolean isSmoothScrolling() { + return smoothScrolling; } public void setEnabled(final boolean enabled) { @@ -127,7 +136,7 @@ public boolean mouseReleased(final double mouseX, final double mouseY, final int public boolean mouseScrolled(final double x, final double y, final double z, final double delta) { if (enabled) { final int scrollDirection = Math.max(Math.min(-(int) delta, 1), -1); - if (scrollAnimation) { + if (smoothScrolling) { startScrollAnimation(scrollDirection); } else { setOffset(offset + scrollDirection); @@ -161,6 +170,9 @@ public double getOffset() { public void setOffset(final double offset) { this.offset = Math.min(Math.max(0, offset), maxOffset); + if (listener != null) { + listener.accept(this.offset); + } } private void updateOffset(final double mouseY) { diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 23e61b007..943ade269 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -47,12 +47,6 @@ "gui.refinedstorage2.grid.sorting.type.name": "Name", "gui.refinedstorage2.grid.sorting.type.id": "ID", "gui.refinedstorage2.grid.sorting.type.last_modified": "Last modified", - "gui.refinedstorage2.grid.size": "Size", - "gui.refinedstorage2.grid.size.stretch": "Stretch", - "gui.refinedstorage2.grid.size.small": "Small", - "gui.refinedstorage2.grid.size.medium": "Medium", - "gui.refinedstorage2.grid.size.large": "Large", - "gui.refinedstorage2.grid.size.extra_large": "Extra large", "gui.refinedstorage2.grid.auto_selected": "Auto-selected", "gui.refinedstorage2.grid.auto_selected.help": "Whether to auto-select the search box when opening the Grid.", "gui.refinedstorage2.grid.synchronizer": "Synchronization mode", @@ -71,6 +65,12 @@ "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", "gui.refinedstorage2.crafting_grid.move.network": "Move items to network", "gui.refinedstorage2.crafting_grid.move.inventory": "Move items to inventory", + "gui.refinedstorage2.screen_size": "Screen size", + "gui.refinedstorage2.screen_size.stretch": "Stretch", + "gui.refinedstorage2.screen_size.small": "Small", + "gui.refinedstorage2.screen_size.medium": "Medium", + "gui.refinedstorage2.screen_size.large": "Large", + "gui.refinedstorage2.screen_size.extra_large": "Extra large", "gui.refinedstorage2.detector.mode": "Mode", "gui.refinedstorage2.detector.mode.under": "Emit redstone signal when under the amount", "gui.refinedstorage2.detector.mode.equal": "Emit redstone signal when on the amount", @@ -142,6 +142,7 @@ "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", + "gui.refinedstorage2.security_card.unbound": "Unbound", "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", @@ -220,6 +221,10 @@ "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", "item.refinedstorage2.security_card": "Security Card", + "item.refinedstorage2.security_card.unbound": "Unbound.", + "item.refinedstorage2.security_card.unbound.help": "Use while crouching to bind to the current player. Right click to configure.", + "item.refinedstorage2.security_card.bound": "Bound to %s.", + "item.refinedstorage2.security_card.bound.help": "Use while crouching to clear binding. Right click to configure.", "misc.refinedstorage2.stored": "Stored: %s", "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", "misc.refinedstorage2.total": "%d total", @@ -247,21 +252,33 @@ "category.refinedstorage2.key_bindings": "Refined Storage 2", "curios.identifier.refinedstorage2": "Refined Storage 2", "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", + "permission.refinedstorage2.insert": "Insert", + "permission.refinedstorage2.insert.description": "Whether the player can insert resources in a network.", + "permission.refinedstorage2.extract": "Extract", + "permission.refinedstorage2.extract.description": "Whether the player can extract resources from a network.", + "permission.refinedstorage2.autocrafting": "Autocrafting", + "permission.refinedstorage2.autocrafting.description": "Whether the player can start, cancel or view an autocrafting task.", + "permission.refinedstorage2.modify": "Modify", + "permission.refinedstorage2.modify.description": "Whether the player can open network device GUIs.", + "permission.refinedstorage2.build": "Build", + "permission.refinedstorage2.build.description": "Whether the player can add or remove network devices.", + "permission.refinedstorage2.security": "Security", + "permission.refinedstorage2.security.description": "Whether the player can manage the security options for a network.", "text.autoconfig.refinedstorage2.title": "Refined Storage 2", + "text.autoconfig.refinedstorage2.option.smoothScrolling": "Smooth scrolling", "text.autoconfig.refinedstorage2.option.grid": "Grid", "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", - "text.autoconfig.refinedstorage2.option.grid.maxRowsStretch": "Maximum amount of rows when stretched", "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", "text.autoconfig.refinedstorage2.option.grid.detailedTooltip": "Detailed tooltip", "text.autoconfig.refinedstorage2.option.grid.rememberSearchQuery": "Remember search query", "text.autoconfig.refinedstorage2.option.grid.energyUsage": "Energy usage", - "text.autoconfig.refinedstorage2.option.grid.smoothScrolling": "Smooth scrolling", "text.autoconfig.refinedstorage2.option.grid.autoSelected": "Auto selected search box", "text.autoconfig.refinedstorage2.option.grid.synchronizer": "Synchronizer", "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", - "text.autoconfig.refinedstorage2.option.grid.size": "Size", + "text.autoconfig.refinedstorage2.option.screenSize": "Screen size", + "text.autoconfig.refinedstorage2.option.maxRowsStretch": "Maximum amount of rows when screen size is stretched", "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_card.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_card.png index de3f689808cebc73f03e7767eb29731f0cc5d969..a6e5b98c47836cb127fe45c043e5a7c86055ec7f 100644 GIT binary patch literal 1100 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIGvAv!{z= zNX4ADcW>uD3J__#m^&qCg;L&Qlcpzj8A|y9>{Fgr&TuiF?D!-}+UMWadqo$YX>{2q zYTtVKs(+(`d-;3jH3x6=C(5{Ax3}E2ZnaS3tts8}9hP5Sd208)SFd6j&OQJ9*N@qJ z)BX3WSG_8*2w~kXeB;mG#%}pdId=cV9xNAP;80@_@L^Dx!Qf!P*pR@)aFB(eiIagv z7)`?e`o0~v-{zI_?O3rjtoHu@&pY4$iHnWFv%bmAnlj9d`4Lkn$qD=8V+vV?npDf<-=CD0$-df+P z#zcu%6*jYy&uxDm@o%FHiD9{W7eCP8!v;Qeg2iVN=k8i1b-ZxRs$cmZn|d9dtw}uh zyVoKAzwC|r?{m+&DHMmBcjWe`Tg6D^IXoJwI9bLQxKjQTo^7 z9G0lQbkbsev*3w2SI;L}hMO}Tl)A}bA`kcNhSmIxxvXaCyv6tOS<~#cG0oom%Tmry z|F|w@62SfqVbl%lASXTU3l<9ZBZZF$?G>J!0!vFA5{|mQo-em(bxP3M=R_H7IwetZ)DsCtLV zVFm+sbmQiJmYDU|#rGdD@lD=;e|GY@?a$YQt?qtaaBF!zmyPdbSN#n)bB@*RH$Ofn z|NO>3kIV2FhH1%-o3#u;-{@6VuneX!!iDa4nUDT_Ch^?yUWfPp zWpC7f-#Z5+P}kS%u>G+lLklO-=q5+Xxi`-Xtj(Ba8vnL5W4a48f+B;`&6y6$+~g>+ z&0|#XVE~~wZ=4;X8_&)>Jf}apai<)J`B#R2dH!)-qFo8}&rPlzutT>oeJ;ph-6sc2 z&^A-PZ~q^2{If)|j#&4{Z{MD^a~t|Ue&4RqJ$?H0>iMku-dtyP(EIX{^VLVa getResourceTypeId() { if (resourceTypeId == null || resourceTypeId.trim().isBlank()) { diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java index 93908e0ec..31b8aec40 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java @@ -6,6 +6,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntityTypeFactory; import com.refinedmods.refinedstorage2.platform.common.content.Blocks; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.content.CreativeModeTabItems; import com.refinedmods.refinedstorage2.platform.common.content.DirectRegistryCallback; import com.refinedmods.refinedstorage2.platform.common.content.Items; @@ -13,6 +14,7 @@ import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceBlockEntity; import com.refinedmods.refinedstorage2.platform.common.iface.InterfacePlatformExternalStorageProviderFactory; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.AbstractDiskDriveBlockEntity; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockItem; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridType; @@ -84,7 +86,6 @@ import team.reborn.energy.api.EnergyStorage; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; -import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class ModInitializerImpl extends AbstractModInitializer implements ModInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(ModInitializerImpl.class); @@ -241,6 +242,15 @@ public boolean allowNbtUpdateAnimation(final Player player, final ItemStack newStack) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } + }, + () -> new SecurityCardItem() { + @Override + public boolean allowNbtUpdateAnimation(final Player player, + final InteractionHand hand, + final ItemStack oldStack, + final ItemStack newStack) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } } ); registerUpgradeMappings(); @@ -272,7 +282,7 @@ private void registerCreativeModeTab() { BuiltInRegistries.CREATIVE_MODE_TAB, createIdentifier("general"), CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) - .title(createTranslation("itemGroup", "general")) + .title(ContentNames.MOD) .icon(() -> new ItemStack(Blocks.INSTANCE.getCreativeController().getDefault())) .displayItems((params, output) -> CreativeModeTabItems.append(output::accept)) .build() diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java index 3055b0a68..202a56c63 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java @@ -4,8 +4,8 @@ import com.refinedmods.refinedstorage2.platform.common.Config; import com.refinedmods.refinedstorage2.platform.common.content.DefaultEnergyUsage; import com.refinedmods.refinedstorage2.platform.common.grid.CraftingGridMatrixCloseBehavior; -import com.refinedmods.refinedstorage2.platform.common.grid.GridSize; import com.refinedmods.refinedstorage2.platform.common.grid.GridSortingTypes; +import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSize; import java.util.Optional; @@ -40,6 +40,9 @@ public class ConfigImpl implements Config { private final SimpleEnergyUsageEntry networkReceiver; private final SimpleEnergyUsageEntry networkTransmitter; private final PortableGridEntry portableGrid; + private final ModConfigSpec.BooleanValue smoothScrolling; + private final ModConfigSpec.EnumValue screenSize; + private final ModConfigSpec.IntValue maxRowsStretch; public ConfigImpl() { cable = new SimpleEnergyUsageEntryImpl("cable", "Cable", DefaultEnergyUsage.CABLE); @@ -79,6 +82,15 @@ public ConfigImpl() { DefaultEnergyUsage.NETWORK_TRANSMITTER ); portableGrid = new PortableGridEntryImpl(); + smoothScrolling = builder + .comment("Whether scrollbars should use smooth scrolling") + .define("smoothScrolling", true); + screenSize = builder + .comment("The screen size") + .defineEnum("screenSize", ScreenSize.STRETCH); + maxRowsStretch = builder + .comment("The maximum amount of rows that can be displayed when the screen size is stretched") + .defineInRange("maxRowsStretch", 256, 3, 256); spec = builder.build(); } @@ -86,6 +98,16 @@ public ModConfigSpec getSpec() { return spec; } + @Override + public ScreenSize getScreenSize() { + return screenSize.get(); + } + + @Override + public void setScreenSize(final ScreenSize screenSize) { + this.screenSize.set(screenSize); + } + @Override public GridEntry getGrid() { return grid; @@ -191,6 +213,16 @@ public PortableGridEntry getPortableGrid() { return portableGrid; } + @Override + public boolean isSmoothScrolling() { + return smoothScrolling.get(); + } + + @Override + public int getMaxRowsStretch() { + return maxRowsStretch.get(); + } + private class SimpleEnergyUsageEntryImpl implements SimpleEnergyUsageEntry { private final ModConfigSpec.LongValue energyUsage; @@ -250,27 +282,21 @@ public long getEnergyUsagePerDisk() { private class GridEntryImpl implements GridEntry { private final ModConfigSpec.BooleanValue largeFont; - private final ModConfigSpec.IntValue maxRowsStretch; private final ModConfigSpec.BooleanValue preventSortingWhileShiftIsDown; private final ModConfigSpec.BooleanValue detailedTooltip; private final ModConfigSpec.BooleanValue rememberSearchQuery; private final ModConfigSpec.LongValue energyUsage; - private final ModConfigSpec.BooleanValue smoothScrolling; private final ModConfigSpec.BooleanValue autoSelected; private final ModConfigSpec.ConfigValue synchronizer; private final ModConfigSpec.ConfigValue resourceType; private final ModConfigSpec.EnumValue sortingDirection; private final ModConfigSpec.EnumValue sortingType; - private final ModConfigSpec.EnumValue size; GridEntryImpl() { builder.push("grid"); largeFont = builder .comment("Whether the Grid should use a large font for quantities") .define("largeFont", false); - maxRowsStretch = builder - .comment("The maximum amount of rows that can be displayed when the Grid is in stretch view mode") - .defineInRange("maxRowsStretch", 256, 3, 256); preventSortingWhileShiftIsDown = builder .comment("Whether the Grid should avoid sorting when shift is held down") .define("preventSortingWhileShiftIsDown", true); @@ -283,9 +309,6 @@ private class GridEntryImpl implements GridEntry { energyUsage = builder .comment("The energy used by the Grid") .defineInRange(ENERGY_USAGE, DefaultEnergyUsage.GRID, 0, Long.MAX_VALUE); - smoothScrolling = builder - .comment("Whether the Grid should use smooth scrolling") - .define("smoothScrolling", true); autoSelected = builder .comment("Whether the Grid search box is auto selected") .define("autoSelected", false); @@ -301,9 +324,6 @@ private class GridEntryImpl implements GridEntry { sortingType = builder .comment("The sorting type") .defineEnum("sortingType", GridSortingTypes.QUANTITY); - size = builder - .comment("The size") - .defineEnum("size", GridSize.STRETCH); builder.pop(); } @@ -312,11 +332,6 @@ public boolean isLargeFont() { return largeFont.get(); } - @Override - public int getMaxRowsStretch() { - return maxRowsStretch.get(); - } - @Override public boolean isPreventSortingWhileShiftIsDown() { return preventSortingWhileShiftIsDown.get(); @@ -337,11 +352,6 @@ public long getEnergyUsage() { return energyUsage.get(); } - @Override - public boolean isSmoothScrolling() { - return smoothScrolling.get(); - } - @Override public boolean isAutoSelected() { return autoSelected.get(); @@ -390,16 +400,6 @@ public void setSortingType(final GridSortingTypes sortingType) { this.sortingType.set(sortingType); } - @Override - public GridSize getSize() { - return this.size.get(); - } - - @Override - public void setSize(final GridSize size) { - this.size.set(size); - } - @Override public Optional getResourceTypeId() { if (resourceType == null || resourceType.get().trim().isBlank()) { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index a1edc8856..01885de40 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -6,6 +6,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntityTypeFactory; import com.refinedmods.refinedstorage2.platform.common.content.Blocks; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.content.CreativeModeTabItems; import com.refinedmods.refinedstorage2.platform.common.content.DirectRegistryCallback; import com.refinedmods.refinedstorage2.platform.common.content.Items; @@ -13,6 +14,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.RegistryCallback; import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.iface.InterfacePlatformExternalStorageProviderFactory; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockItem; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridType; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseBlock; @@ -96,7 +98,6 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.MOD_ID; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; -import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; @Mod(IdentifierUtil.MOD_ID) public class ModInitializer extends AbstractModInitializer { @@ -245,6 +246,14 @@ public boolean shouldCauseReequipAnimation(final ItemStack oldStack, final boolean slotChanged) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } + }, + () -> new SecurityCardItem() { + @Override + public boolean shouldCauseReequipAnimation(final ItemStack oldStack, + final ItemStack newStack, + final boolean slotChanged) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } } ); itemRegistry.register(eventBus); @@ -358,7 +367,7 @@ public void onRegister(final RegisterEvent e) { e.register(Registries.CREATIVE_MODE_TAB, helper -> helper.register( createIdentifier("general"), CreativeModeTab.builder() - .title(createTranslation("itemGroup", "general")) + .title(ContentNames.MOD) .icon(() -> new ItemStack(Blocks.INSTANCE.getController().getDefault())) .displayItems((params, output) -> CreativeModeTabItems.append(output::accept)) .build() From 52bbb3a7780ad1d5f7be449c1ef709c7b885112d Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 31 Mar 2024 13:11:42 +0200 Subject: [PATCH 32/59] feat: security security logic --- CHANGELOG.md | 11 ++ .../security/SecurityDecisionProvider.java | 1 + .../security/SecurityNetworkComponent.java | 1 + .../SecurityNetworkComponentImplTest.java | 30 ++- .../api/security/PlatformPermission.java | 2 + .../grid/screen/AbstractGridScreen.java | 4 +- .../common/security/BuiltinPermission.java | 5 + .../security/SecurityCardContainerMenu.java | 137 ++++++++++++- .../SecurityCardExtendedMenuProvider.java | 26 ++- .../common/security/SecurityCardItem.java | 73 ++++--- .../common/security/SecurityCardModel.java | 89 +++++++++ .../common/security/SecurityCardScreen.java | 180 ++++++++++++++---- .../support/ClientToServerCommunications.java | 9 + .../common/support/packet/PacketIds.java | 5 + .../stretching/AbstractStretchingScreen.java | 10 +- .../support/widget/CustomCheckboxWidget.java | 26 ++- .../assets/refinedstorage2/lang/en_us.json | 3 + .../platform/fabric/ModInitializerImpl.java | 15 ++ .../c2s/ClientToServerCommunicationsImpl.java | 27 +++ .../c2s/SecurityCardBoundPlayerPacket.java | 27 +++ .../c2s/SecurityCardPermissionPacket.java | 26 +++ .../SecurityCardResetPermissionPacket.java | 25 +++ .../platform/forge/ModInitializer.java | 18 ++ .../c2s/ClientToServerCommunicationsImpl.java | 17 ++ .../c2s/SecurityCardBoundPlayerPacket.java | 42 ++++ .../c2s/SecurityCardPermissionPacket.java | 35 ++++ .../SecurityCardResetPermissionPacket.java | 33 ++++ 27 files changed, 787 insertions(+), 90 deletions(-) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java create mode 100644 refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java create mode 100644 refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java create mode 100644 refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java create mode 100644 refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java create mode 100644 refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java create mode 100644 refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e384f902..82119cd5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added + +- Security Card + +### Changed + +- The permissions for a Security Card must be configured through the card itself, instead of via the Security Manager. +- The Security Card can be bound to other (currently online) players via its GUI. +- The binding of a Security Card can now be cleared. +- The Security Card tooltip and GUI now show whether the permission has been touched/changed in any way. + ### Fixed - Wireless Grid name not being correct in the GUI. diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java index fe65abda1..effdbe7cc 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java @@ -3,6 +3,7 @@ import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +@FunctionalInterface public interface SecurityDecisionProvider { SecurityDecision isAllowed(Permission permission, SecurityActor actor); } diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java index 834fc0332..fcda6ad8c 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java @@ -5,6 +5,7 @@ import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +@FunctionalInterface public interface SecurityNetworkComponent extends NetworkComponent { boolean isAllowed(Permission permission, SecurityActor actor); } diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java index 36f8b1158..198fa3115 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java @@ -1,12 +1,15 @@ package com.refinedmods.refinedstorage2.api.network.impl.security; +import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; +import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import com.refinedmods.refinedstorage2.api.network.security.Permission; import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -18,12 +21,13 @@ void setUp() { sut = new SecurityNetworkComponentImpl(); } - @EnumSource(TestPermissions.class) - @ParameterizedTest - void everythingIsAllowedByDefault(final TestPermissions permission) { + @Test + void everythingIsAllowedByDefault() { // Act & assert - assertThat(sut.isAllowed(permission, TestActors.X)).isTrue(); - assertThat(sut.isAllowed(permission, TestActors.Y)).isTrue(); + sut.onContainerAdded(new TestContainer()); + assertThat(sut.isAllowed(TestPermissions.A, TestActors.X)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.B, TestActors.Y)).isFalse(); + sut.onContainerRemoved(new TestContainer()); } enum TestPermissions implements Permission { @@ -33,4 +37,16 @@ enum TestPermissions implements Permission { enum TestActors implements SecurityActor { X, Y } + + private static class TestContainer implements SecurityDecisionProvider, NetworkNodeContainer { + @Override + public SecurityDecision isAllowed(final Permission permission, final SecurityActor actor) { + return permission == TestPermissions.A ? SecurityDecision.ALLOW : SecurityDecision.DENY; + } + + @Override + public NetworkNode getNode() { + throw new RuntimeException(); + } + } } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java index 67ca7333c..d93d77ef0 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java @@ -12,4 +12,6 @@ public interface PlatformPermission extends Permission { Component getDescription(); Component getOwnerName(); + + boolean isAllowedByDefault(); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java index 454afcd89..dd20dde26 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java @@ -71,11 +71,9 @@ protected AbstractGridScreen(final T menu, } @Override - protected void init() { + protected void init(final int rows) { LOGGER.info("Initializing grid screen"); - super.init(); - if (searchField == null) { searchField = new GridSearchBoxWidget( font, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java index ba2f4ba90..bd2d820a6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java @@ -73,4 +73,9 @@ public Component getDescription() { public Component getOwnerName() { return ContentNames.MOD; } + + @Override + public boolean isAllowedByDefault() { + return true; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java index 4bbc6bdbd..40e71de9f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java @@ -1,57 +1,182 @@ package com.refinedmods.refinedstorage2.platform.common.security; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.Menus; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSizeListener; import java.util.ArrayList; import java.util.List; +import java.util.UUID; +import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; public class SecurityCardContainerMenu extends AbstractBaseContainerMenu implements ScreenSizeListener { private final Inventory playerInventory; - private final List permissions; + private final List permissions = new ArrayList<>(); + private final List players = new ArrayList<>(); + + @Nullable + private Player boundTo; public SecurityCardContainerMenu(final int syncId, final Inventory playerInventory, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getSecurityCard(), syncId); this.playerInventory = playerInventory; - this.permissions = new ArrayList<>(); + this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); + final int amountOfPermissions = buf.readInt(); for (int i = 0; i < amountOfPermissions; ++i) { final ResourceLocation id = buf.readResourceLocation(); + final boolean allowed = buf.readBoolean(); + final boolean dirty = buf.readBoolean(); PlatformApi.INSTANCE.getPermissionRegistry().get(id).ifPresent(permission -> permissions.add(new Permission( id, permission.getName(), permission.getDescription(), - permission.getOwnerName() + permission.getOwnerName(), + allowed, + dirty ))); } + + if (buf.readBoolean()) { + this.boundTo = new Player(buf.readUUID(), buf.readUtf()); + } + + final int amountOfPlayers = buf.readInt(); + for (int i = 0; i < amountOfPlayers; ++i) { + final UUID id = buf.readUUID(); + final String name = buf.readUtf(); + players.add(new Player(id, name)); + } } - SecurityCardContainerMenu(final int syncId, final Inventory playerInventory) { + SecurityCardContainerMenu(final int syncId, final Inventory playerInventory, final SlotReference disabledSlot) { super(Menus.INSTANCE.getSecurityCard(), syncId); this.playerInventory = playerInventory; - this.permissions = new ArrayList<>(); + this.disabledSlot = disabledSlot; } List getPermissions() { return permissions; } + List getPlayers() { + return players; + } + + @Nullable + Player getBoundTo() { + return boundTo; + } + @Override public void initSlots(final int playerInventoryY) { resetSlots(); addPlayerInventory(playerInventory, 8, playerInventoryY); } - record Permission(ResourceLocation id, Component name, Component description, Component ownerName) { + public void setPermission(final ResourceLocation permissionId, final boolean allowed) { + if (disabledSlot == null) { + return; + } + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> setPermission(permissionId, allowed, stack)); + } + + private void setPermission(final ResourceLocation permissionId, final boolean allowed, final ItemStack stack) { + if (stack.getItem() instanceof SecurityCardItem securityCardItem) { + securityCardItem.getModel(stack).setPermission(permissionId, allowed); + } + } + + public void resetPermissionServer(final ResourceLocation permissionId) { + if (disabledSlot == null) { + return; + } + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> resetPermissionServer(permissionId, stack)); + } + + private void resetPermissionServer(final ResourceLocation permissionId, final ItemStack stack) { + if (stack.getItem() instanceof SecurityCardItem securityCardItem) { + securityCardItem.getModel(stack).resetPermission(permissionId); + } + } + + public void setBoundPlayer(final MinecraftServer server, @Nullable final UUID playerId) { + if (disabledSlot == null) { + return; + } + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> setBoundPlayer(server, playerId, stack)); + } + + private void setBoundPlayer(final MinecraftServer server, @Nullable final UUID playerId, final ItemStack stack) { + if (stack.getItem() instanceof SecurityCardItem securityCardItem) { + final ServerPlayer player = playerId == null ? null : server.getPlayerList().getPlayer(playerId); + securityCardItem.getModel(stack).setBoundPlayer(player); + } + } + + Permission changePermission(final ResourceLocation permissionId, final boolean selected) { + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardPermission(permissionId, selected); + return updatePermissionLocally(permissionId, selected, true); + } + + Permission resetPermission(final ResourceLocation permissionId) { + final PlatformPermission permission = PlatformApi.INSTANCE.getPermissionRegistry() + .get(permissionId) + .orElseThrow(); + final boolean allowed = permission.isAllowedByDefault(); + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardResetPermission(permissionId); + return updatePermissionLocally(permissionId, allowed, false); + } + + private Permission updatePermissionLocally(final ResourceLocation permissionId, + final boolean allowed, + final boolean dirty) { + final Permission localPermission = permissions.stream().filter(p -> p.id().equals(permissionId)) + .findFirst() + .orElseThrow(); + final int index = permissions.indexOf(localPermission); + final Permission updatedLocalPermission = new Permission( + localPermission.id(), + localPermission.name(), + localPermission.description(), + localPermission.ownerName(), + allowed, + dirty + ); + permissions.set(index, updatedLocalPermission); + return updatedLocalPermission; + } + + void changeBoundPlayer(@Nullable final Player player) { + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardBoundPlayer( + player == null ? null : player.id() + ); + this.boundTo = player; + } + + record Permission(ResourceLocation id, + Component name, + Component description, + Component ownerName, + boolean allowed, + boolean dirty) { + } + + record Player(UUID id, String name) { } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java index b5a4a2cbb..393cfd486 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java @@ -6,6 +6,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import java.util.Collections; import java.util.List; import javax.annotation.Nullable; @@ -19,19 +20,40 @@ class SecurityCardExtendedMenuProvider implements ExtendedMenuProvider { private final SlotReference slotReference; + private final SecurityCardModel model; - SecurityCardExtendedMenuProvider(final SlotReference slotReference) { + SecurityCardExtendedMenuProvider(final SlotReference slotReference, final SecurityCardModel model) { this.slotReference = slotReference; + this.model = model; } @Override public void writeScreenOpeningData(final ServerPlayer player, final FriendlyByteBuf buf) { PlatformApi.INSTANCE.writeSlotReference(slotReference, buf); + final List permissions = PlatformApi.INSTANCE.getPermissionRegistry().getAll(); buf.writeInt(permissions.size()); for (final PlatformPermission permission : permissions) { final ResourceLocation id = PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).orElseThrow(); buf.writeResourceLocation(id); + buf.writeBoolean(model.isAllowed(permission)); + buf.writeBoolean(model.isDirty(permission)); + } + + final boolean bound = model.getBoundPlayerId() != null && model.getBoundPlayerName() != null; + buf.writeBoolean(bound); + if (bound) { + buf.writeUUID(model.getBoundPlayerId()); + buf.writeUtf(model.getBoundPlayerName()); + } + + final List players = player.getServer() == null + ? Collections.emptyList() + : player.getServer().getPlayerList().getPlayers(); + buf.writeInt(players.size()); + for (final ServerPlayer otherPlayer : players) { + buf.writeUUID(otherPlayer.getUUID()); + buf.writeUtf(otherPlayer.getGameProfile().getName()); } } @@ -43,6 +65,6 @@ public Component getDisplayName() { @Nullable @Override public AbstractContainerMenu createMenu(final int syncId, final Inventory inventory, final Player player) { - return new SecurityCardContainerMenu(syncId, inventory); + return new SecurityCardContainerMenu(syncId, inventory, slotReference); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java index 5dd31e8a2..bc819ad2b 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java @@ -10,6 +10,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; @@ -26,47 +27,54 @@ public class SecurityCardItem extends Item { private static final Component UNBOUND_HELP = createTranslation("item", "security_card.unbound.help"); private static final Component BOUND_HELP = createTranslation("item", "security_card.bound.help"); - private static final String TAG_BOUND_TO = "boundto"; - private static final String TAG_BOUND_TO_NAME = "boundtoname"; - public SecurityCardItem() { super(new Item.Properties().stacksTo(1)); } + SecurityCardModel getModel(final ItemStack stack) { + return new SecurityCardModel(stack); + } + + boolean isActive(final ItemStack stack) { + return SecurityCardModel.isActive(stack); + } + @Override public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { final ItemStack stack = player.getItemInHand(hand); if (player instanceof ServerPlayer serverPlayer) { - if (serverPlayer.isCrouching()) { - bindOrUnbind(serverPlayer, stack); - } else { - Platform.INSTANCE.getMenuOpener().openMenu(serverPlayer, new SecurityCardExtendedMenuProvider( - PlatformApi.INSTANCE.createInventorySlotReference(player, hand) - )); - } + use(hand, serverPlayer, stack); } return InteractionResultHolder.consume(stack); } - private void bindOrUnbind(final ServerPlayer player, final ItemStack stack) { + private void use(final InteractionHand hand, final ServerPlayer player, final ItemStack stack) { + if (player.isCrouching()) { + bindOrClear(player, stack); + return; + } + Platform.INSTANCE.getMenuOpener().openMenu(player, new SecurityCardExtendedMenuProvider( + PlatformApi.INSTANCE.createInventorySlotReference(player, hand), + getModel(stack) + )); + } + + private void bindOrClear(final ServerPlayer player, final ItemStack stack) { if (stack.hasTag()) { - unbind(player, stack); + clear(player, stack); } else { bind(player, stack); } } - private void unbind(final ServerPlayer player, final ItemStack stack) { + private void clear(final ServerPlayer player, final ItemStack stack) { stack.setTag(null); - player.sendSystemMessage(createTranslation( - "item", - "security_card.unbound" - )); + player.sendSystemMessage(createTranslation("item", "security_card.cleared")); } private void bind(final ServerPlayer player, final ItemStack stack) { - stack.getOrCreateTag().putUUID(TAG_BOUND_TO, player.getGameProfile().getId()); - stack.getOrCreateTag().putString(TAG_BOUND_TO_NAME, player.getGameProfile().getName()); + final SecurityCardModel model = getModel(stack); + model.setBoundPlayer(player); player.sendSystemMessage(createTranslation( "item", "security_card.bound", @@ -80,25 +88,36 @@ public void appendHoverText(final ItemStack stack, final List lines, final TooltipFlag flag) { super.appendHoverText(stack, level, lines, flag); - if (stack.getTag() == null) { + final SecurityCardModel model = getModel(stack); + + final String boundPlayerName = model.getBoundPlayerName(); + if (boundPlayerName == null) { lines.add(createTranslation("item", "security_card.unbound").withStyle(ChatFormatting.GRAY)); return; } - final Component boundToName = Component.literal(stack.getTag().getString(TAG_BOUND_TO_NAME)) - .withStyle(ChatFormatting.YELLOW); + lines.add(createTranslation( "item", "security_card.bound", - boundToName + Component.literal(boundPlayerName).withStyle(ChatFormatting.YELLOW) ).withStyle(ChatFormatting.GRAY)); + + PlatformApi.INSTANCE.getPermissionRegistry().getAll().forEach(permission -> { + final boolean allowed = model.isAllowed(permission); + final boolean dirty = model.isDirty(permission); + final Style style = Style.EMPTY + .withColor(allowed ? ChatFormatting.GREEN : ChatFormatting.RED) + .withItalic(dirty); + final Component permissionTooltip = Component.literal(allowed ? "✓ " : "❌ ") + .append(permission.getName()) + .append(dirty ? " (*)" : "") + .withStyle(style); + lines.add(permissionTooltip); + }); } @Override public Optional getTooltipImage(final ItemStack stack) { return Optional.of(new HelpTooltipComponent(isActive(stack) ? BOUND_HELP : UNBOUND_HELP)); } - - boolean isActive(final ItemStack stack) { - return stack.getTag() != null && stack.getTag().contains(TAG_BOUND_TO); - } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java new file mode 100644 index 000000000..5ef43ae9d --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java @@ -0,0 +1,89 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; + +import java.util.UUID; +import javax.annotation.Nullable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +class SecurityCardModel { + private static final String TAG_BOUND_PLAYER_ID = "bid"; + private static final String TAG_BOUND_PLAYER_NAME = "bname"; + private static final String TAG_PERMISSIONS = "permissions"; + + private final ItemStack stack; + + SecurityCardModel(final ItemStack stack) { + this.stack = stack; + } + + boolean isAllowed(final PlatformPermission permission) { + if (stack.getTag() != null && stack.getTag().contains(TAG_PERMISSIONS)) { + final ResourceLocation permissionId = PlatformApi.INSTANCE.getPermissionRegistry() + .getId(permission) + .orElseThrow(); + final CompoundTag permissionsTag = stack.getTag().getCompound(TAG_PERMISSIONS); + final boolean dirty = permissionsTag.contains(permissionId.toString()); + if (dirty) { + return permissionsTag.getBoolean(permissionId.toString()); + } + } + return permission.isAllowedByDefault(); + } + + boolean isDirty(final PlatformPermission permission) { + final ResourceLocation permissionId = PlatformApi.INSTANCE.getPermissionRegistry() + .getId(permission) + .orElseThrow(); + return stack.getTag() != null + && stack.getTag().contains(TAG_PERMISSIONS) + && stack.getTag().getCompound(TAG_PERMISSIONS).contains(permissionId.toString()); + } + + void setPermission(final ResourceLocation permissionId, final boolean allowed) { + final CompoundTag permissionsTag = stack.getOrCreateTagElement(TAG_PERMISSIONS); + permissionsTag.putBoolean(permissionId.toString(), allowed); + } + + void resetPermission(final ResourceLocation permissionId) { + final CompoundTag permissionsTag = stack.getOrCreateTagElement(TAG_PERMISSIONS); + permissionsTag.remove(permissionId.toString()); + } + + @Nullable + UUID getBoundPlayerId() { + return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_ID)) + ? null + : stack.getTag().getUUID(TAG_BOUND_PLAYER_ID); + } + + @Nullable + String getBoundPlayerName() { + return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_NAME)) + ? null + : stack.getTag().getString(TAG_BOUND_PLAYER_NAME); + } + + void setBoundPlayer(@Nullable final ServerPlayer player) { + final CompoundTag tag = stack.getOrCreateTag(); + if (player == null) { + tag.remove(TAG_BOUND_PLAYER_ID); + tag.remove(TAG_BOUND_PLAYER_NAME); + return; + } + tag.putUUID(TAG_BOUND_PLAYER_ID, player.getGameProfile().getId()); + tag.putString(TAG_BOUND_PLAYER_NAME, player.getGameProfile().getName()); + } + + static boolean isActive(final ItemStack stack) { + return stack.getTag() != null + && stack.getTag().contains(TAG_BOUND_PLAYER_ID) + && stack.getTag().contains(TAG_BOUND_PLAYER_NAME) + && stack.getTag().contains(TAG_PERMISSIONS); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java index db6ab736d..7669855ca 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; +import javax.annotation.Nullable; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; @@ -22,13 +23,19 @@ public class SecurityCardScreen extends AbstractStretchingScreen { private static final ResourceLocation TEXTURE = createIdentifier("textures/gui/security_card.png"); - private static final int BINDING_RIGHT_PADDING = 6; - private static final int BINDING_WIDTH = 80; + private static final int BOUND_PLAYER_BUTTON_RIGHT_PADDING = 6; + private static final int BOUND_PLAYER_BUTTON_WIDTH = 80; private static final MutableComponent UNBOUND_TITLE = Component.literal("<") .append(createTranslation("gui", "security_card.unbound")) .append(">"); - private final List checkboxes = new ArrayList<>(); + private static final int RESET_BUTTON_WIDTH = 40; + private static final int RESET_BUTTON_RIGHT_PADDING = 16; + private static final Component RESET_TITLE = createTranslation("gui", "security_card.permission.reset"); + private static final Component MODIFIED_TITLE = createTranslation("gui", "security_card.permission.modified") + .withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.YELLOW)); + + private final List permissions = new ArrayList<>(); public SecurityCardScreen(final SecurityCardContainerMenu menu, final Inventory playerInventory, @@ -40,68 +47,148 @@ public SecurityCardScreen(final SecurityCardContainerMenu menu, } @Override - protected void init() { - super.init(); - - checkboxes.clear(); - final List permissions = getMenu().getPermissions(); - for (int i = 0; i < permissions.size(); ++i) { - final CustomCheckboxWidget checkbox = createPermissionCheckbox(permissions.get(i), i); - addWidget(checkbox); - checkboxes.add(checkbox); + protected void init(final int rows) { + permissions.clear(); + final List menuPermissions = getMenu().getPermissions(); + for (int i = 0; i < menuPermissions.size(); ++i) { + final Permission permission = createPermission(menuPermissions.get(i), i, rows); + addWidget(permission.checkbox); + addWidget(permission.resetButton); + permissions.add(permission); } - updateScrollbar(checkboxes.size()); - - final Button playerButton = Button.builder(UNBOUND_TITLE, btn -> toggleBoundPlayer()) - .pos(leftPos + imageWidth - BINDING_RIGHT_PADDING - BINDING_WIDTH, topPos + 4) - .size(BINDING_WIDTH, 14) + updateScrollbar(permissions.size()); + + final Component boundToText = menu.getBoundTo() == null + ? UNBOUND_TITLE + : Component.literal(menu.getBoundTo().name()); + final Button boundPlayerButton = Button.builder(boundToText, this::toggleBoundPlayer) + .pos(leftPos + imageWidth - BOUND_PLAYER_BUTTON_RIGHT_PADDING - BOUND_PLAYER_BUTTON_WIDTH, topPos + 4) + .size(BOUND_PLAYER_BUTTON_WIDTH, 14) .build(); - addRenderableWidget(playerButton); + addRenderableWidget(boundPlayerButton); } - private CustomCheckboxWidget createPermissionCheckbox( - final SecurityCardContainerMenu.Permission permission, - final int index + private Permission createPermission( + final SecurityCardContainerMenu.Permission menuPermission, + final int index, + final int rows ) { + final int y = getPermissionY(index); + final boolean visible = isPermissionVisible(rows, y); + final CustomCheckboxWidget checkbox = createPermissionCheckbox(menuPermission, y, visible); + final Button resetButton = createPermissionResetButton(menuPermission, checkbox, y, visible); + checkbox.setOnPressed((c, selected) -> updatePermission(menuPermission, resetButton, c, selected)); + return new Permission(checkbox, resetButton); + } + + private CustomCheckboxWidget createPermissionCheckbox(final SecurityCardContainerMenu.Permission menuPermission, + final int y, + final boolean visible) { final CustomCheckboxWidget checkbox = new CustomCheckboxWidget( leftPos + 10, - getPermissionCheckboxY(index), - permission.name(), + y, + getPermissionName(menuPermission), font, - false + menuPermission.allowed() ); - checkbox.setTooltip(getPermissionTooltip(permission)); + checkbox.visible = visible; + checkbox.setTooltip(getPermissionTooltip(menuPermission)); return checkbox; } - private Tooltip getPermissionTooltip(final SecurityCardContainerMenu.Permission permission) { - final MutableComponent ownerName = permission.ownerName().copy().withStyle( + private void updatePermission(final SecurityCardContainerMenu.Permission menuPermission, + final Button resetButton, + final CustomCheckboxWidget checkbox, + final boolean allowed) { + updateCheckboxAndResetButton(checkbox, resetButton, menu.changePermission(menuPermission.id(), allowed)); + } + + private Tooltip getPermissionTooltip(final SecurityCardContainerMenu.Permission menuPermission) { + final MutableComponent ownerName = menuPermission.ownerName().copy().withStyle( Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY) ); - return Tooltip.create(permission.description().copy().append("\n").append(ownerName)); + final MutableComponent tooltip = menuPermission.description().copy().append("\n").append(ownerName); + return Tooltip.create(menuPermission.dirty() ? tooltip.append("\n").append(MODIFIED_TITLE) : tooltip); } - private int getPermissionCheckboxY(final int index) { + private Button createPermissionResetButton(final SecurityCardContainerMenu.Permission menuPermission, + final CustomCheckboxWidget checkbox, + final int y, + final boolean visible) { + final Button resetButton = Button.builder(RESET_TITLE, btn -> resetPermission(menuPermission, checkbox, btn)) + .pos(leftPos + imageWidth - RESET_BUTTON_RIGHT_PADDING - RESET_BUTTON_WIDTH - 11, y) + .size(RESET_BUTTON_WIDTH, 16) + .build(); + resetButton.visible = visible; + resetButton.active = menuPermission.dirty(); + return resetButton; + } + + private void resetPermission(final SecurityCardContainerMenu.Permission menuPermission, + final CustomCheckboxWidget checkbox, + final Button resetButton) { + updateCheckboxAndResetButton(checkbox, resetButton, menu.resetPermission(menuPermission.id())); + } + + private void updateCheckboxAndResetButton(final CustomCheckboxWidget checkbox, + final Button resetButton, + final SecurityCardContainerMenu.Permission menuPermission) { + checkbox.setMessage(getPermissionName(menuPermission)); + checkbox.setTooltip(getPermissionTooltip(menuPermission)); + checkbox.setSelected(menuPermission.allowed()); + resetButton.active = menuPermission.dirty(); + } + + private Component getPermissionName(final SecurityCardContainerMenu.Permission menuPermission) { + if (!menuPermission.dirty()) { + return menuPermission.name(); + } + return menuPermission.name().copy().append(" (*)").setStyle(Style.EMPTY.withItalic(true)); + } + + private int getPermissionY(final int index) { return topPos + 19 + (index * ROW_SIZE) + 3; } + private boolean isPermissionVisible(final int rows, final int y) { + return y >= (topPos + 19 - ROW_SIZE) && y < (topPos + 19 + (rows * ROW_SIZE)); + } + @Override protected int getScrollPanePadding() { return 4; } - private void toggleBoundPlayer() { - // todo! + private void toggleBoundPlayer(final Button button) { + if (menu.getPlayers().isEmpty()) { + return; + } + if (menu.getBoundTo() == null) { + setBoundPlayer(button, menu.getPlayers().get(0)); + return; + } + final int nextIndex = menu.getPlayers().indexOf(menu.getBoundTo()) + 1; + if (nextIndex >= menu.getPlayers().size()) { + setBoundPlayer(button, null); + } else { + setBoundPlayer(button, menu.getPlayers().get(nextIndex)); + } + } + + private void setBoundPlayer(final Button button, @Nullable final SecurityCardContainerMenu.Player player) { + menu.changeBoundPlayer(player); + button.setMessage(player == null ? UNBOUND_TITLE : Component.literal(player.name())); } @Override protected void scrollbarChanged(final int rows) { final int offset = getScrollbarOffset(); - for (int i = 0; i < checkboxes.size(); ++i) { - final CustomCheckboxWidget checkbox = checkboxes.get(i); - final int y = getPermissionCheckboxY(i) - offset; - checkbox.visible = y >= (topPos + 19 - ROW_SIZE) && y < (topPos + 19 + (rows * ROW_SIZE)); - checkbox.setY(y); + for (int i = 0; i < permissions.size(); ++i) { + final Permission permission = permissions.get(i); + final int y = getPermissionY(i) - offset; + final boolean visible = isPermissionVisible(rows, y); + permission.setY(y); + permission.setVisible(visible); } } @@ -113,8 +200,8 @@ protected void renderRows(final GuiGraphics graphics, final int rows, final int mouseX, final int mouseY) { - for (final CustomCheckboxWidget checkbox : checkboxes) { - checkbox.render(graphics, mouseX, mouseY, 0); + for (final Permission permission : permissions) { + permission.render(graphics, mouseX, mouseY); } } @@ -145,4 +232,21 @@ protected int getBottomV() { protected ResourceLocation getTexture() { return TEXTURE; } + + private record Permission(CustomCheckboxWidget checkbox, Button resetButton) { + private void setY(final int y) { + checkbox.setY(y); + resetButton.setY(y); + } + + private void setVisible(final boolean visible) { + checkbox.visible = visible; + resetButton.visible = visible; + } + + private void render(final GuiGraphics graphics, final int mouseX, final int mouseY) { + checkbox.render(graphics, mouseX, mouseY, 0); + resetButton.render(graphics, mouseX, mouseY, 0); + } + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java index 5aeca9c19..c1d47204b 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java @@ -10,6 +10,9 @@ import java.util.List; import java.util.UUID; +import javax.annotation.Nullable; + +import net.minecraft.resources.ResourceLocation; public interface ClientToServerCommunications { void sendGridExtract(PlatformResourceKey resource, GridExtractMode mode, boolean cursor); @@ -35,4 +38,10 @@ public interface ClientToServerCommunications { void sendSingleAmountChange(double amount); void sendUseNetworkBoundItem(SlotReference slotReference); + + void sendSecurityCardPermission(ResourceLocation permissionId, boolean allowed); + + void sendSecurityCardResetPermission(ResourceLocation permissionId); + + void sendSecurityCardBoundPlayer(@Nullable UUID playerId); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java index bf476c452..1d3eea67a 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java @@ -26,6 +26,11 @@ public final class PacketIds { public static final ResourceLocation SINGLE_AMOUNT_CHANGE = createIdentifier("detector_amount_change"); public static final ResourceLocation USE_NETWORK_BOUND_ITEM = createIdentifier("use_network_bound_item"); public static final ResourceLocation NETWORK_TRANSMITTER_STATUS = createIdentifier("network_transmitter_status"); + public static final ResourceLocation SECURITY_CARD_PERMISSION = createIdentifier("security_card_permission"); + public static final ResourceLocation SECURITY_CARD_RESET_PERMISSION = createIdentifier( + "security_card_reset_permission" + ); + public static final ResourceLocation SECURITY_CARD_BOUND_PLAYER = createIdentifier("security_card_bound_player"); private PacketIds() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java index eac896eea..8c73972d9 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java @@ -41,11 +41,17 @@ protected void init() { super.init(); - addSideButton(new ScreenSizeSideButtonWidget(this)); - this.scrollbar = new ScrollbarWidget(leftPos + 174, topPos + 20, 12, (visibleRows * ROW_SIZE) - 2); this.scrollbar.setListener(offset -> scrollbarChanged(visibleRows)); addWidget(scrollbar); + + init(visibleRows); + + addSideButton(new ScreenSizeSideButtonWidget(this)); + } + + protected void init(final int rows) { + // no op } protected final int getScrollbarOffset() { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java index 3912a253f..ed1032afb 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java @@ -1,5 +1,7 @@ package com.refinedmods.refinedstorage2.platform.common.support.widget; +import javax.annotation.Nullable; + import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -25,6 +27,8 @@ public class CustomCheckboxWidget extends AbstractButton { private static final int BOX_SIZE = 9 + 8; + @Nullable + private OnPressed onPressed; private boolean selected; public CustomCheckboxWidget(final int x, @@ -36,18 +40,25 @@ public CustomCheckboxWidget(final int x, this.selected = selected; } + public void setOnPressed(@Nullable final OnPressed onPressed) { + this.onPressed = onPressed; + } + public void onPress() { this.selected = !this.selected; + if (onPressed != null) { + onPressed.onPressed(this, selected); + } } - public boolean selected() { - return this.selected; + public void setSelected(final boolean selected) { + this.selected = selected; } public void updateWidgetNarration(final NarrationElementOutput output) { - output.add(NarratedElementType.TITLE, this.createNarrationMessage()); - if (this.active) { - if (this.isFocused()) { + output.add(NarratedElementType.TITLE, createNarrationMessage()); + if (active) { + if (isFocused()) { output.add(NarratedElementType.USAGE, Component.translatable("narration.checkbox.usage.focused")); } else { output.add(NarratedElementType.USAGE, Component.translatable("narration.checkbox.usage.hovered")); @@ -73,4 +84,9 @@ public void renderWidget(final GuiGraphics graphics, final int mouseX, final int graphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); graphics.drawString(font, getMessage(), x, y, 4210752, false); } + + @FunctionalInterface + public interface OnPressed { + void onPressed(CustomCheckboxWidget checkbox, boolean selected); + } } diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 943ade269..a1a39448a 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -143,6 +143,8 @@ "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", "gui.refinedstorage2.security_card.unbound": "Unbound", + "gui.refinedstorage2.security_card.permission.reset": "Reset", + "gui.refinedstorage2.security_card.permission.modified": "Modified", "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", @@ -221,6 +223,7 @@ "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", "item.refinedstorage2.security_card": "Security Card", + "item.refinedstorage2.security_card.cleared": "Cleared binding.", "item.refinedstorage2.security_card.unbound": "Unbound.", "item.refinedstorage2.security_card.unbound.help": "Use while crouching to bind to the current player. Right click to configure.", "item.refinedstorage2.security_card.bound": "Bound to %s.", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java index 31b8aec40..0676e4244 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java @@ -39,6 +39,9 @@ import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.ResourceFilterSlotChangePacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.ResourceSlotAmountChangePacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.ResourceSlotChangePacket; +import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.SecurityCardBoundPlayerPacket; +import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.SecurityCardPermissionPacket; +import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.SecurityCardResetPermissionPacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.SingleAmountChangePacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.StorageInfoRequestPacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.UseNetworkBoundItemPacket; @@ -314,6 +317,18 @@ private void registerPackets() { ); ServerPlayNetworking.registerGlobalReceiver(PacketIds.SINGLE_AMOUNT_CHANGE, new SingleAmountChangePacket()); ServerPlayNetworking.registerGlobalReceiver(PacketIds.USE_NETWORK_BOUND_ITEM, new UseNetworkBoundItemPacket()); + ServerPlayNetworking.registerGlobalReceiver( + PacketIds.SECURITY_CARD_PERMISSION, + new SecurityCardPermissionPacket() + ); + ServerPlayNetworking.registerGlobalReceiver( + PacketIds.SECURITY_CARD_RESET_PERMISSION, + new SecurityCardResetPermissionPacket() + ); + ServerPlayNetworking.registerGlobalReceiver( + PacketIds.SECURITY_CARD_BOUND_PLAYER, + new SecurityCardBoundPlayerPacket() + ); } private void registerSidedHandlers() { diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java index 064d16ddb..d61df1fc2 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.UUID; import java.util.function.Consumer; +import javax.annotation.Nullable; import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; @@ -129,6 +130,32 @@ public void sendUseNetworkBoundItem(final SlotReference slotReference) { ); } + @Override + public void sendSecurityCardPermission(final ResourceLocation permissionId, final boolean allowed) { + sendToServer( + PacketIds.SECURITY_CARD_PERMISSION, + buf -> { + buf.writeResourceLocation(permissionId); + buf.writeBoolean(allowed); + } + ); + } + + @Override + public void sendSecurityCardResetPermission(final ResourceLocation permissionId) { + sendToServer(PacketIds.SECURITY_CARD_RESET_PERMISSION, buf -> buf.writeResourceLocation(permissionId)); + } + + @Override + public void sendSecurityCardBoundPlayer(@Nullable final UUID playerId) { + sendToServer(PacketIds.SECURITY_CARD_BOUND_PLAYER, buf -> { + buf.writeBoolean(playerId != null); + if (playerId != null) { + buf.writeUUID(playerId); + } + }); + } + private static void sendToServer(final ResourceLocation id, final Consumer bufConsumer) { final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); bufConsumer.accept(buf); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java new file mode 100644 index 000000000..ccca1783c --- /dev/null +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java @@ -0,0 +1,27 @@ +package com.refinedmods.refinedstorage2.platform.fabric.packet.c2s; + +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; + +import java.util.UUID; + +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; + +public class SecurityCardBoundPlayerPacket implements ServerPlayNetworking.PlayChannelHandler { + @Override + public void receive(final MinecraftServer server, + final ServerPlayer player, + final ServerGamePacketListenerImpl handler, + final FriendlyByteBuf buf, + final PacketSender responseSender) { + final boolean hasPlayer = buf.readBoolean(); + final UUID playerId = hasPlayer ? buf.readUUID() : null; + if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + server.execute(() -> securityCardContainerMenu.setBoundPlayer(server, playerId)); + } + } +} diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java new file mode 100644 index 000000000..9c392195b --- /dev/null +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java @@ -0,0 +1,26 @@ +package com.refinedmods.refinedstorage2.platform.fabric.packet.c2s; + +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; + +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; + +public class SecurityCardPermissionPacket implements ServerPlayNetworking.PlayChannelHandler { + @Override + public void receive(final MinecraftServer server, + final ServerPlayer player, + final ServerGamePacketListenerImpl handler, + final FriendlyByteBuf buf, + final PacketSender responseSender) { + final ResourceLocation permissionId = buf.readResourceLocation(); + final boolean allowed = buf.readBoolean(); + if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + server.execute(() -> securityCardContainerMenu.setPermission(permissionId, allowed)); + } + } +} diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java new file mode 100644 index 000000000..16e54f230 --- /dev/null +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java @@ -0,0 +1,25 @@ +package com.refinedmods.refinedstorage2.platform.fabric.packet.c2s; + +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; + +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; + +public class SecurityCardResetPermissionPacket implements ServerPlayNetworking.PlayChannelHandler { + @Override + public void receive(final MinecraftServer server, + final ServerPlayer player, + final ServerGamePacketListenerImpl handler, + final FriendlyByteBuf buf, + final PacketSender responseSender) { + final ResourceLocation permissionId = buf.readResourceLocation(); + if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + server.execute(() -> securityCardContainerMenu.resetPermissionServer(permissionId)); + } + } +} diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index 01885de40..647cf114e 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -46,6 +46,9 @@ import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.ResourceFilterSlotChangePacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.ResourceSlotAmountChangePacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.ResourceSlotChangePacket; +import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.SecurityCardBoundPlayerPacket; +import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.SecurityCardPermissionPacket; +import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.SecurityCardResetPermissionPacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.SingleAmountChangePacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.StorageInfoRequestPacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s.UseNetworkBoundItemPacket; @@ -504,6 +507,21 @@ private static void registerClientToServerPackets(final IPayloadRegistrar regist UseNetworkBoundItemPacket::decode, handler -> handler.server(UseNetworkBoundItemPacket::handle) ); + registrar.play( + PacketIds.SECURITY_CARD_PERMISSION, + SecurityCardPermissionPacket::decode, + handler -> handler.server(SecurityCardPermissionPacket::handle) + ); + registrar.play( + PacketIds.SECURITY_CARD_RESET_PERMISSION, + SecurityCardResetPermissionPacket::decode, + handler -> handler.server(SecurityCardResetPermissionPacket::handle) + ); + registrar.play( + PacketIds.SECURITY_CARD_BOUND_PLAYER, + SecurityCardBoundPlayerPacket::decode, + handler -> handler.server(SecurityCardBoundPlayerPacket::handle) + ); } @SubscribeEvent diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java index 7554e91d4..3380b0937 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java @@ -13,8 +13,10 @@ import java.util.List; import java.util.UUID; +import javax.annotation.Nullable; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.network.PacketDistributor; public class ClientToServerCommunicationsImpl implements ClientToServerCommunications { @@ -110,4 +112,19 @@ public void sendSingleAmountChange(final double amount) { public void sendUseNetworkBoundItem(final SlotReference slotReference) { sendPacket(new UseNetworkBoundItemPacket(slotReference)); } + + @Override + public void sendSecurityCardPermission(final ResourceLocation permissionId, final boolean allowed) { + sendPacket(new SecurityCardPermissionPacket(permissionId, allowed)); + } + + @Override + public void sendSecurityCardResetPermission(final ResourceLocation permissionId) { + sendPacket(new SecurityCardResetPermissionPacket(permissionId)); + } + + @Override + public void sendSecurityCardBoundPlayer(@Nullable final UUID playerId) { + sendPacket(new SecurityCardBoundPlayerPacket(playerId)); + } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java new file mode 100644 index 000000000..465576003 --- /dev/null +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java @@ -0,0 +1,42 @@ +package com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s; + +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; + +import java.util.UUID; +import javax.annotation.Nullable; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.PlayPayloadContext; + +public record SecurityCardBoundPlayerPacket(@Nullable UUID playerId) implements CustomPacketPayload { + public static SecurityCardBoundPlayerPacket decode(final FriendlyByteBuf buf) { + return new SecurityCardBoundPlayerPacket(buf.readBoolean() ? buf.readUUID() : null); + } + + public static void handle(final SecurityCardBoundPlayerPacket packet, final PlayPayloadContext ctx) { + ctx.player().ifPresent(player -> ctx.workHandler().submitAsync(() -> { + if (player.getServer() == null) { + return; + } + if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + securityCardContainerMenu.setBoundPlayer(player.getServer(), packet.playerId); + } + })); + } + + @Override + public void write(final FriendlyByteBuf buf) { + buf.writeBoolean(playerId != null); + if (playerId != null) { + buf.writeUUID(playerId); + } + } + + @Override + public ResourceLocation id() { + return PacketIds.SECURITY_CARD_BOUND_PLAYER; + } +} diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java new file mode 100644 index 000000000..c1807187c --- /dev/null +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java @@ -0,0 +1,35 @@ +package com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s; + +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.PlayPayloadContext; + +public record SecurityCardPermissionPacket(ResourceLocation permissionId, boolean allowed) + implements CustomPacketPayload { + public static SecurityCardPermissionPacket decode(final FriendlyByteBuf buf) { + return new SecurityCardPermissionPacket(buf.readResourceLocation(), buf.readBoolean()); + } + + public static void handle(final SecurityCardPermissionPacket packet, final PlayPayloadContext ctx) { + ctx.player().ifPresent(player -> ctx.workHandler().submitAsync(() -> { + if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + securityCardContainerMenu.setPermission(packet.permissionId, packet.allowed); + } + })); + } + + @Override + public void write(final FriendlyByteBuf buf) { + buf.writeResourceLocation(permissionId); + buf.writeBoolean(allowed); + } + + @Override + public ResourceLocation id() { + return PacketIds.SECURITY_CARD_PERMISSION; + } +} diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java new file mode 100644 index 000000000..f517c608d --- /dev/null +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java @@ -0,0 +1,33 @@ +package com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s; + +import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.PlayPayloadContext; + +public record SecurityCardResetPermissionPacket(ResourceLocation permissionId) implements CustomPacketPayload { + public static SecurityCardResetPermissionPacket decode(final FriendlyByteBuf buf) { + return new SecurityCardResetPermissionPacket(buf.readResourceLocation()); + } + + public static void handle(final SecurityCardResetPermissionPacket packet, final PlayPayloadContext ctx) { + ctx.player().ifPresent(player -> ctx.workHandler().submitAsync(() -> { + if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + securityCardContainerMenu.resetPermissionServer(packet.permissionId); + } + })); + } + + @Override + public void write(final FriendlyByteBuf buf) { + buf.writeResourceLocation(permissionId); + } + + @Override + public ResourceLocation id() { + return PacketIds.SECURITY_CARD_RESET_PERMISSION; + } +} From c071fd661ad9db0cf8f9c9a54ce639bc7509e8ac Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 31 Mar 2024 20:00:13 +0200 Subject: [PATCH 33/59] feat: fallback security card --- CHANGELOG.md | 2 + .../common/AbstractClientModInitializer.java | 2 + .../common/AbstractModInitializer.java | 14 +- .../platform/common/content/ContentIds.java | 1 + .../platform/common/content/ContentNames.java | 1 + .../common/content/CreativeModeTabItems.java | 1 + .../platform/common/content/Items.java | 11 + .../platform/common/content/Menus.java | 13 ++ .../AbstractSecurityCardContainerMenu.java | 135 +++++++++++ ...tractSecurityCardExtendedMenuProvider.java | 36 +++ .../security/AbstractSecurityCardItem.java | 92 ++++++++ .../security/AbstractSecurityCardScreen.java | 216 ++++++++++++++++++ .../FallbackSecurityCardContainerMenu.java | 21 ++ ...lbackSecurityCardExtendedMenuProvider.java | 31 +++ .../security/FallbackSecurityCardItem.java | 37 +++ .../security/FallbackSecurityCardScreen.java | 12 + .../security/PlayerSecurityCardModel.java | 53 +++++ .../security/SecurityCardContainerMenu.java | 115 +--------- .../SecurityCardExtendedMenuProvider.java | 30 +-- .../common/security/SecurityCardItem.java | 97 +++----- .../common/security/SecurityCardModel.java | 40 +--- .../common/security/SecurityCardScreen.java | 198 +--------------- .../assets/refinedstorage2/lang/en_us.json | 6 +- .../models/item/fallback_security_card.json | 6 + .../textures/item/security_card/fallback.png | Bin 0 -> 570 bytes .../recipes/fallback_security_card.json | 14 ++ .../platform/fabric/ModInitializerImpl.java | 10 + .../c2s/SecurityCardPermissionPacket.java | 4 +- .../SecurityCardResetPermissionPacket.java | 4 +- .../platform/forge/ModInitializer.java | 9 + .../c2s/SecurityCardPermissionPacket.java | 4 +- .../SecurityCardResetPermissionPacket.java | 4 +- 32 files changed, 778 insertions(+), 441 deletions(-) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardContainerMenu.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardScreen.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java create mode 100755 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/fallback_security_card.json create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/item/security_card/fallback.png create mode 100644 refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/fallback_security_card.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 82119cd5e..9f90e9936 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Added - Security Card +- Fallback Security Card ### Changed @@ -17,6 +18,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - The Security Card can be bound to other (currently online) players via its GUI. - The binding of a Security Card can now be cleared. - The Security Card tooltip and GUI now show whether the permission has been touched/changed in any way. +- A global (fallback) permission set for a network can be defined using the Fallback Security Card instead of using an "unbound" Security Card. ### Fixed diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java index ba8ba4096..8c24202b4 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java @@ -17,6 +17,7 @@ import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceScreen; import com.refinedmods.refinedstorage2.platform.common.importer.ImporterScreen; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterScreen; +import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardScreen; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardScreen; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; @@ -69,6 +70,7 @@ protected static void registerScreens(final ScreenRegistration registration) { registration.register(Menus.INSTANCE.getPortableGridBlock(), PortableGridScreen::new); registration.register(Menus.INSTANCE.getPortableGridItem(), PortableGridScreen::new); registration.register(Menus.INSTANCE.getSecurityCard(), SecurityCardScreen::new); + registration.register(Menus.INSTANCE.getFallbackSecurityCard(), FallbackSecurityCardScreen::new); } protected static void registerAlternativeGridHints() { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index 6659b7e90..e1d95c1a6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -56,6 +56,8 @@ import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterBlockEntity; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; +import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; @@ -141,6 +143,7 @@ import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.DISK_DRIVE; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.EXPORTER; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.EXTERNAL_STORAGE; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.FALLBACK_SECURITY_CARD; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.FLUID_STORAGE_BLOCK; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.GRID; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.IMPORTER; @@ -320,7 +323,8 @@ protected final void registerItems( final Supplier creativeWirelessGridItemSupplier, final Supplier portableGridBlockItemSupplier, final Supplier creativePortableGridBlockItemSupplier, - final Supplier securityCardItemSupplier + final Supplier securityCardItemSupplier, + final Supplier fallbackSecurityCardItemSupplier ) { registerSimpleItems(callback); Blocks.INSTANCE.getGrid().registerItems(callback); @@ -351,6 +355,10 @@ protected final void registerItems( creativePortableGridBlockItemSupplier )); Items.INSTANCE.setSecurityCard(callback.register(SECURITY_CARD, securityCardItemSupplier)); + Items.INSTANCE.setFallbackSecurityCard(callback.register( + FALLBACK_SECURITY_CARD, + fallbackSecurityCardItemSupplier + )); } private void registerSimpleItems(final RegistryCallback callback) { @@ -731,6 +739,10 @@ protected final void registerMenus(final RegistryCallback> callback, SECURITY_CARD, () -> menuTypeFactory.create(SecurityCardContainerMenu::new) )); + Menus.INSTANCE.setFallbackSecurityCard(callback.register( + FALLBACK_SECURITY_CARD, + () -> menuTypeFactory.create(FallbackSecurityCardContainerMenu::new) + )); } protected final void registerLootFunctions(final RegistryCallback callback) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java index b902d1f91..0955232ba 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java @@ -55,6 +55,7 @@ public final class ContentIds { public static final ResourceLocation PORTABLE_GRID = createIdentifier("portable_grid"); public static final ResourceLocation CREATIVE_PORTABLE_GRID = createIdentifier("creative_portable_grid"); public static final ResourceLocation SECURITY_CARD = createIdentifier("security_card"); + public static final ResourceLocation FALLBACK_SECURITY_CARD = createIdentifier("fallback_security_card"); private ContentIds() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java index bfb5cd6f8..06afd3e37 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java @@ -27,6 +27,7 @@ public final class ContentNames { public static final MutableComponent NETWORK_TRANSMITTER = name("network_transmitter"); public static final MutableComponent PORTABLE_GRID = name("portable_grid"); public static final MutableComponent SECURITY_CARD = createTranslation("item", "security_card"); + public static final MutableComponent FALLBACK_SECURITY_CARD = createTranslation("item", "fallback_security_card"); private ContentNames() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java index f1c73e3f3..c5bb5336a 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java @@ -104,5 +104,6 @@ private static void appendItems(final Consumer consumer) { itemConsumer.accept(Items.INSTANCE.getConfigurationCard()); itemConsumer.accept(Items.INSTANCE.getNetworkCard()); itemConsumer.accept(Items.INSTANCE.getSecurityCard()); + itemConsumer.accept(Items.INSTANCE.getFallbackSecurityCard()); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java index c961a74cc..bd99e3a14 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java @@ -5,6 +5,7 @@ import com.refinedmods.refinedstorage2.platform.common.controller.CreativeControllerBlockItem; import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.misc.ProcessorItem; +import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; @@ -95,6 +96,8 @@ public final class Items { private Supplier creativePortableGrid; @Nullable private Supplier securityCard; + @Nullable + private Supplier fallbackSecurityCard; private Items() { } @@ -426,4 +429,12 @@ public SecurityCardItem getSecurityCard() { public void setSecurityCard(final Supplier securityCard) { this.securityCard = securityCard; } + + public FallbackSecurityCardItem getFallbackSecurityCard() { + return requireNonNull(fallbackSecurityCard).get(); + } + + public void setFallbackSecurityCard(final Supplier fallbackSecurityCard) { + this.fallbackSecurityCard = fallbackSecurityCard; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java index 78ab613f8..45433d8f0 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java @@ -11,6 +11,7 @@ import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceContainerMenu; import com.refinedmods.refinedstorage2.platform.common.importer.ImporterContainerMenu; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.DiskDriveContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.externalstorage.ExternalStorageContainerMenu; @@ -74,6 +75,8 @@ public final class Menus { private Supplier> portableGridItem; @Nullable private Supplier> securityCard; + @Nullable + private Supplier> fallbackSecurityCard; private Menus() { } @@ -245,4 +248,14 @@ public MenuType getSecurityCard() { public void setSecurityCard(final Supplier> securityCard) { this.securityCard = securityCard; } + + public MenuType getFallbackSecurityCard() { + return requireNonNull(fallbackSecurityCard).get(); + } + + public void setFallbackSecurityCard( + final Supplier> fallbackSecurityCard + ) { + this.fallbackSecurityCard = fallbackSecurityCard; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java new file mode 100644 index 000000000..272153b45 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java @@ -0,0 +1,135 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.Platform; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSizeListener; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; + +public abstract class AbstractSecurityCardContainerMenu extends AbstractBaseContainerMenu + implements ScreenSizeListener { + protected final Inventory playerInventory; + private final List permissions = new ArrayList<>(); + + protected AbstractSecurityCardContainerMenu(final MenuType menuType, + final int syncId, + final Inventory playerInventory, + final FriendlyByteBuf buf) { + super(menuType, syncId); + this.playerInventory = playerInventory; + this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); + final int amountOfPermissions = buf.readInt(); + for (int i = 0; i < amountOfPermissions; ++i) { + final ResourceLocation id = buf.readResourceLocation(); + final boolean allowed = buf.readBoolean(); + final boolean dirty = buf.readBoolean(); + PlatformApi.INSTANCE.getPermissionRegistry().get(id).ifPresent(permission -> permissions.add(new Permission( + id, + permission.getName(), + permission.getDescription(), + permission.getOwnerName(), + allowed, + dirty + ))); + } + } + + protected AbstractSecurityCardContainerMenu(final MenuType menuType, + final int syncId, + final Inventory playerInventory, + final SlotReference disabledSlot) { + super(menuType, syncId); + this.playerInventory = playerInventory; + this.disabledSlot = disabledSlot; + } + + List getPermissions() { + return permissions; + } + + @Override + public void initSlots(final int playerInventoryY) { + resetSlots(); + addPlayerInventory(playerInventory, 8, playerInventoryY); + } + + public void setPermission(final ResourceLocation permissionId, final boolean allowed) { + if (disabledSlot == null) { + return; + } + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> setPermission(permissionId, allowed, stack)); + } + + private void setPermission(final ResourceLocation permissionId, final boolean allowed, final ItemStack stack) { + if (stack.getItem() instanceof AbstractSecurityCardItem securityCardItem) { + final SecurityCardModel model = securityCardItem.createModel(stack); + model.setPermission(permissionId, allowed); + } + } + + public void resetPermissionServer(final ResourceLocation permissionId) { + if (disabledSlot == null) { + return; + } + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> resetPermissionServer(permissionId, stack)); + } + + private void resetPermissionServer(final ResourceLocation permissionId, final ItemStack stack) { + if (stack.getItem() instanceof AbstractSecurityCardItem securityCardItem) { + final SecurityCardModel model = securityCardItem.createModel(stack); + model.resetPermission(permissionId); + } + } + + Permission changePermission(final ResourceLocation permissionId, final boolean selected) { + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardPermission(permissionId, selected); + return updatePermissionLocally(permissionId, selected, true); + } + + Permission resetPermission(final ResourceLocation permissionId) { + final PlatformPermission permission = PlatformApi.INSTANCE.getPermissionRegistry() + .get(permissionId) + .orElseThrow(); + final boolean allowed = permission.isAllowedByDefault(); + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardResetPermission(permissionId); + return updatePermissionLocally(permissionId, allowed, false); + } + + private Permission updatePermissionLocally(final ResourceLocation permissionId, + final boolean allowed, + final boolean dirty) { + final Permission localPermission = permissions.stream().filter(p -> p.id().equals(permissionId)) + .findFirst() + .orElseThrow(); + final int index = permissions.indexOf(localPermission); + final Permission updatedLocalPermission = new Permission( + localPermission.id(), + localPermission.name(), + localPermission.description(), + localPermission.ownerName(), + allowed, + dirty + ); + permissions.set(index, updatedLocalPermission); + return updatedLocalPermission; + } + + record Permission(ResourceLocation id, + Component name, + Component description, + Component ownerName, + boolean allowed, + boolean dirty) { + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java new file mode 100644 index 000000000..6b0540a82 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java @@ -0,0 +1,36 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; + +import java.util.List; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +abstract class AbstractSecurityCardExtendedMenuProvider implements ExtendedMenuProvider { + private final SlotReference slotReference; + private final SecurityCardModel model; + + AbstractSecurityCardExtendedMenuProvider(final SlotReference slotReference, final SecurityCardModel model) { + this.slotReference = slotReference; + this.model = model; + } + + @Override + public void writeScreenOpeningData(final ServerPlayer player, final FriendlyByteBuf buf) { + PlatformApi.INSTANCE.writeSlotReference(slotReference, buf); + + final List permissions = PlatformApi.INSTANCE.getPermissionRegistry().getAll(); + buf.writeInt(permissions.size()); + for (final PlatformPermission permission : permissions) { + final ResourceLocation id = PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).orElseThrow(); + buf.writeResourceLocation(id); + buf.writeBoolean(model.isAllowed(permission)); + buf.writeBoolean(model.isDirty(permission)); + } + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java new file mode 100644 index 000000000..4a5f0b17f --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java @@ -0,0 +1,92 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.Platform; + +import java.util.List; +import javax.annotation.Nullable; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +abstract class AbstractSecurityCardItem extends Item { + protected AbstractSecurityCardItem(final Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(final ItemStack stack, + @Nullable final Level level, + final List lines, + final TooltipFlag flag) { + super.appendHoverText(stack, level, lines, flag); + final M model = createModel(stack); + if (addTooltip(stack, lines, model)) { + addPermissions(lines, model); + } + } + + protected boolean addTooltip(final ItemStack stack, final List lines, final M model) { + return true; + } + + private void addPermissions(final List lines, final SecurityCardModel model) { + PlatformApi.INSTANCE.getPermissionRegistry().getAll().forEach(permission -> { + final boolean allowed = model.isAllowed(permission); + final boolean dirty = model.isDirty(permission); + final Style style = Style.EMPTY + .withColor(allowed ? ChatFormatting.GREEN : ChatFormatting.RED) + .withItalic(dirty); + final Component permissionTooltip = Component.literal(allowed ? "✓ " : "❌ ") + .append(permission.getName()) + .append(dirty ? " (*)" : "") + .withStyle(style); + lines.add(permissionTooltip); + }); + } + + @Override + public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { + final ItemStack stack = player.getItemInHand(hand); + if (player instanceof ServerPlayer serverPlayer) { + final M model = createModel(stack); + use(hand, serverPlayer, stack, model); + } + return InteractionResultHolder.consume(stack); + } + + private void use(final InteractionHand hand, final ServerPlayer player, final ItemStack stack, final M model) { + if (player.isCrouching()) { + tryClear(player, model); + return; + } + Platform.INSTANCE.getMenuOpener().openMenu(player, createMenuProvider( + PlatformApi.INSTANCE.createInventorySlotReference(player, hand), + model + )); + } + + void tryClear(final ServerPlayer player, final M model) { + model.clear(); + player.sendSystemMessage(createTranslation("item", "security_card.cleared")); + } + + abstract M createModel(ItemStack stack); + + abstract AbstractSecurityCardExtendedMenuProvider createMenuProvider( + SlotReference slotReference, + M model + ); +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java new file mode 100644 index 000000000..cdc1d2760 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java @@ -0,0 +1,216 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.common.support.stretching.AbstractStretchingScreen; +import com.refinedmods.refinedstorage2.platform.common.support.widget.CustomCheckboxWidget; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public abstract class AbstractSecurityCardScreen + extends AbstractStretchingScreen { + private static final ResourceLocation TEXTURE = createIdentifier("textures/gui/security_card.png"); + + private static final int RESET_BUTTON_WIDTH = 40; + private static final int RESET_BUTTON_RIGHT_PADDING = 16; + private static final Component RESET_TITLE = createTranslation("gui", "security_card.permission.reset"); + private static final Component MODIFIED_TITLE = createTranslation("gui", "security_card.permission.modified") + .withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.YELLOW)); + + private final List permissions = new ArrayList<>(); + + public AbstractSecurityCardScreen(final T menu, final Inventory playerInventory, final Component text) { + super(menu, playerInventory, text); + this.inventoryLabelY = 97; + this.imageWidth = 193; + this.imageHeight = 176; + } + + @Override + protected void init(final int rows) { + permissions.clear(); + final List menuPermissions = getMenu().getPermissions(); + for (int i = 0; i < menuPermissions.size(); ++i) { + final Permission permission = createPermission(menuPermissions.get(i), i, rows); + addWidget(permission.checkbox); + addWidget(permission.resetButton); + permissions.add(permission); + } + updateScrollbar(permissions.size()); + } + + private Permission createPermission( + final AbstractSecurityCardContainerMenu.Permission menuPermission, + final int index, + final int rows + ) { + final int y = getPermissionY(index); + final boolean visible = isPermissionVisible(rows, y); + final CustomCheckboxWidget checkbox = createPermissionCheckbox(menuPermission, y, visible); + final Button resetButton = createPermissionResetButton(menuPermission, checkbox, y, visible); + checkbox.setOnPressed((c, selected) -> updatePermission(menuPermission, resetButton, c, selected)); + return new Permission(checkbox, resetButton); + } + + private CustomCheckboxWidget createPermissionCheckbox( + final AbstractSecurityCardContainerMenu.Permission menuPermission, + final int y, + final boolean visible + ) { + final CustomCheckboxWidget checkbox = new CustomCheckboxWidget( + leftPos + 10, + y, + getPermissionName(menuPermission), + font, + menuPermission.allowed() + ); + checkbox.visible = visible; + checkbox.setTooltip(getPermissionTooltip(menuPermission)); + return checkbox; + } + + private void updatePermission(final AbstractSecurityCardContainerMenu.Permission menuPermission, + final Button resetButton, + final CustomCheckboxWidget checkbox, + final boolean allowed) { + updateCheckboxAndResetButton(checkbox, resetButton, menu.changePermission(menuPermission.id(), allowed)); + } + + private Tooltip getPermissionTooltip(final AbstractSecurityCardContainerMenu.Permission menuPermission) { + final MutableComponent ownerName = menuPermission.ownerName().copy().withStyle( + Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY) + ); + final MutableComponent tooltip = menuPermission.description().copy().append("\n").append(ownerName); + return Tooltip.create(menuPermission.dirty() ? tooltip.append("\n").append(MODIFIED_TITLE) : tooltip); + } + + private Button createPermissionResetButton(final AbstractSecurityCardContainerMenu.Permission menuPermission, + final CustomCheckboxWidget checkbox, + final int y, + final boolean visible) { + final Button resetButton = Button.builder(RESET_TITLE, btn -> resetPermission(menuPermission, checkbox, btn)) + .pos(leftPos + imageWidth - RESET_BUTTON_RIGHT_PADDING - RESET_BUTTON_WIDTH - 11, y) + .size(RESET_BUTTON_WIDTH, 16) + .build(); + resetButton.visible = visible; + resetButton.active = menuPermission.dirty(); + return resetButton; + } + + private void resetPermission(final AbstractSecurityCardContainerMenu.Permission menuPermission, + final CustomCheckboxWidget checkbox, + final Button resetButton) { + updateCheckboxAndResetButton(checkbox, resetButton, menu.resetPermission(menuPermission.id())); + } + + private void updateCheckboxAndResetButton(final CustomCheckboxWidget checkbox, + final Button resetButton, + final AbstractSecurityCardContainerMenu.Permission menuPermission) { + checkbox.setMessage(getPermissionName(menuPermission)); + checkbox.setTooltip(getPermissionTooltip(menuPermission)); + checkbox.setSelected(menuPermission.allowed()); + resetButton.active = menuPermission.dirty(); + } + + private Component getPermissionName(final AbstractSecurityCardContainerMenu.Permission menuPermission) { + if (!menuPermission.dirty()) { + return menuPermission.name(); + } + return menuPermission.name().copy().append(" (*)").setStyle(Style.EMPTY.withItalic(true)); + } + + private int getPermissionY(final int index) { + return topPos + 19 + (index * ROW_SIZE) + 3; + } + + private boolean isPermissionVisible(final int rows, final int y) { + return y >= (topPos + 19 - ROW_SIZE) && y < (topPos + 19 + (rows * ROW_SIZE)); + } + + @Override + protected int getScrollPanePadding() { + return 4; + } + + @Override + protected void scrollbarChanged(final int rows) { + final int offset = getScrollbarOffset(); + for (int i = 0; i < permissions.size(); ++i) { + final Permission permission = permissions.get(i); + final int y = getPermissionY(i) - offset; + final boolean visible = isPermissionVisible(rows, y); + permission.setY(y); + permission.setVisible(visible); + } + } + + @Override + protected void renderRows(final GuiGraphics graphics, + final int x, + final int y, + final int topHeight, + final int rows, + final int mouseX, + final int mouseY) { + for (final Permission permission : permissions) { + permission.render(graphics, mouseX, mouseY); + } + } + + @Override + protected void renderStretchingBackground(final GuiGraphics graphics, final int x, final int y, final int rows) { + for (int row = 0; row < rows; ++row) { + int textureY = 37; + if (row == 0) { + textureY = 19; + } else if (row == rows - 1) { + textureY = 55; + } + graphics.blit(getTexture(), x, y + (ROW_SIZE * row), 0, textureY, imageWidth, ROW_SIZE); + } + } + + @Override + protected int getBottomHeight() { + return 99; + } + + @Override + protected int getBottomV() { + return 73; + } + + @Override + protected ResourceLocation getTexture() { + return TEXTURE; + } + + private record Permission(CustomCheckboxWidget checkbox, Button resetButton) { + private void setY(final int y) { + checkbox.setY(y); + resetButton.setY(y); + } + + private void setVisible(final boolean visible) { + checkbox.visible = visible; + resetButton.visible = visible; + } + + private void render(final GuiGraphics graphics, final int mouseX, final int mouseY) { + checkbox.render(graphics, mouseX, mouseY, 0); + resetButton.render(graphics, mouseX, mouseY, 0); + } + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardContainerMenu.java new file mode 100644 index 000000000..67eb37da1 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardContainerMenu.java @@ -0,0 +1,21 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.content.Menus; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; + +public class FallbackSecurityCardContainerMenu extends AbstractSecurityCardContainerMenu { + public FallbackSecurityCardContainerMenu(final int syncId, + final Inventory playerInventory, + final FriendlyByteBuf buf) { + super(Menus.INSTANCE.getFallbackSecurityCard(), syncId, playerInventory, buf); + } + + FallbackSecurityCardContainerMenu(final int syncId, + final Inventory playerInventory, + final SlotReference disabledSlot) { + super(Menus.INSTANCE.getFallbackSecurityCard(), syncId, playerInventory, disabledSlot); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java new file mode 100644 index 000000000..f631beb08 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java @@ -0,0 +1,31 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; + +import javax.annotation.Nullable; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; + +class FallbackSecurityCardExtendedMenuProvider extends AbstractSecurityCardExtendedMenuProvider { + private final SlotReference slotReference; + + FallbackSecurityCardExtendedMenuProvider(final SlotReference slotReference, final SecurityCardModel model) { + super(slotReference, model); + this.slotReference = slotReference; + } + + @Override + public Component getDisplayName() { + return ContentNames.FALLBACK_SECURITY_CARD; + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(final int syncId, final Inventory inventory, final Player player) { + return new FallbackSecurityCardContainerMenu(syncId, inventory, slotReference); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java new file mode 100644 index 000000000..0fa8b8460 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java @@ -0,0 +1,37 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; + +import java.util.Optional; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public class FallbackSecurityCardItem extends AbstractSecurityCardItem { + private static final Component HELP = createTranslation("item", "fallback_security_card.help"); + + public FallbackSecurityCardItem() { + super(new Item.Properties().stacksTo(1)); + } + + @Override + SecurityCardModel createModel(final ItemStack stack) { + return new SecurityCardModel(stack); + } + + @Override + AbstractSecurityCardExtendedMenuProvider createMenuProvider(final SlotReference slotReference, + final SecurityCardModel model) { + return new FallbackSecurityCardExtendedMenuProvider(slotReference, model); + } + + @Override + public Optional getTooltipImage(final ItemStack stack) { + return Optional.of(new HelpTooltipComponent(HELP)); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardScreen.java new file mode 100644 index 000000000..3ea220f41 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardScreen.java @@ -0,0 +1,12 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; + +public class FallbackSecurityCardScreen extends AbstractSecurityCardScreen { + public FallbackSecurityCardScreen(final FallbackSecurityCardContainerMenu menu, + final Inventory playerInventory, + final Component text) { + super(menu, playerInventory, text); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java new file mode 100644 index 000000000..ffc0c8279 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java @@ -0,0 +1,53 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import java.util.UUID; +import javax.annotation.Nullable; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +class PlayerSecurityCardModel extends SecurityCardModel { + private static final String TAG_BOUND_PLAYER_ID = "bid"; + private static final String TAG_BOUND_PLAYER_NAME = "bname"; + + PlayerSecurityCardModel(final ItemStack stack) { + super(stack); + } + + @Nullable + UUID getBoundPlayerId() { + return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_ID)) + ? null + : stack.getTag().getUUID(TAG_BOUND_PLAYER_ID); + } + + @Nullable + String getBoundPlayerName() { + return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_NAME)) + ? null + : stack.getTag().getString(TAG_BOUND_PLAYER_NAME); + } + + void setBoundPlayer(@Nullable final ServerPlayer player) { + final CompoundTag tag = stack.getOrCreateTag(); + if (player == null) { + tag.remove(TAG_BOUND_PLAYER_ID); + tag.remove(TAG_BOUND_PLAYER_NAME); + return; + } + tag.putUUID(TAG_BOUND_PLAYER_ID, player.getGameProfile().getId()); + tag.putString(TAG_BOUND_PLAYER_NAME, player.getGameProfile().getName()); + } + + @Override + boolean isActive() { + return super.isActive() && isActive(stack); + } + + static boolean isActive(final ItemStack stack) { + return stack.getTag() != null + && stack.getTag().contains(TAG_BOUND_PLAYER_ID) + && stack.getTag().contains(TAG_BOUND_PLAYER_NAME); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java index 40e71de9f..9e5177c04 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java @@ -1,11 +1,8 @@ package com.refinedmods.refinedstorage2.platform.common.security; -import com.refinedmods.refinedstorage2.platform.api.PlatformApi; -import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.Menus; -import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSizeListener; import java.util.ArrayList; @@ -14,16 +11,12 @@ import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; -public class SecurityCardContainerMenu extends AbstractBaseContainerMenu implements ScreenSizeListener { - private final Inventory playerInventory; - private final List permissions = new ArrayList<>(); +public class SecurityCardContainerMenu extends AbstractSecurityCardContainerMenu implements ScreenSizeListener { private final List players = new ArrayList<>(); @Nullable @@ -32,30 +25,10 @@ public class SecurityCardContainerMenu extends AbstractBaseContainerMenu impleme public SecurityCardContainerMenu(final int syncId, final Inventory playerInventory, final FriendlyByteBuf buf) { - super(Menus.INSTANCE.getSecurityCard(), syncId); - this.playerInventory = playerInventory; - - this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); - - final int amountOfPermissions = buf.readInt(); - for (int i = 0; i < amountOfPermissions; ++i) { - final ResourceLocation id = buf.readResourceLocation(); - final boolean allowed = buf.readBoolean(); - final boolean dirty = buf.readBoolean(); - PlatformApi.INSTANCE.getPermissionRegistry().get(id).ifPresent(permission -> permissions.add(new Permission( - id, - permission.getName(), - permission.getDescription(), - permission.getOwnerName(), - allowed, - dirty - ))); - } - + super(Menus.INSTANCE.getSecurityCard(), syncId, playerInventory, buf); if (buf.readBoolean()) { this.boundTo = new Player(buf.readUUID(), buf.readUtf()); } - final int amountOfPlayers = buf.readInt(); for (int i = 0; i < amountOfPlayers; ++i) { final UUID id = buf.readUUID(); @@ -65,13 +38,7 @@ public SecurityCardContainerMenu(final int syncId, } SecurityCardContainerMenu(final int syncId, final Inventory playerInventory, final SlotReference disabledSlot) { - super(Menus.INSTANCE.getSecurityCard(), syncId); - this.playerInventory = playerInventory; - this.disabledSlot = disabledSlot; - } - - List getPermissions() { - return permissions; + super(Menus.INSTANCE.getSecurityCard(), syncId, playerInventory, disabledSlot); } List getPlayers() { @@ -83,38 +50,6 @@ Player getBoundTo() { return boundTo; } - @Override - public void initSlots(final int playerInventoryY) { - resetSlots(); - addPlayerInventory(playerInventory, 8, playerInventoryY); - } - - public void setPermission(final ResourceLocation permissionId, final boolean allowed) { - if (disabledSlot == null) { - return; - } - disabledSlot.resolve(playerInventory.player).ifPresent(stack -> setPermission(permissionId, allowed, stack)); - } - - private void setPermission(final ResourceLocation permissionId, final boolean allowed, final ItemStack stack) { - if (stack.getItem() instanceof SecurityCardItem securityCardItem) { - securityCardItem.getModel(stack).setPermission(permissionId, allowed); - } - } - - public void resetPermissionServer(final ResourceLocation permissionId) { - if (disabledSlot == null) { - return; - } - disabledSlot.resolve(playerInventory.player).ifPresent(stack -> resetPermissionServer(permissionId, stack)); - } - - private void resetPermissionServer(final ResourceLocation permissionId, final ItemStack stack) { - if (stack.getItem() instanceof SecurityCardItem securityCardItem) { - securityCardItem.getModel(stack).resetPermission(permissionId); - } - } - public void setBoundPlayer(final MinecraftServer server, @Nullable final UUID playerId) { if (disabledSlot == null) { return; @@ -125,43 +60,11 @@ public void setBoundPlayer(final MinecraftServer server, @Nullable final UUID pl private void setBoundPlayer(final MinecraftServer server, @Nullable final UUID playerId, final ItemStack stack) { if (stack.getItem() instanceof SecurityCardItem securityCardItem) { final ServerPlayer player = playerId == null ? null : server.getPlayerList().getPlayer(playerId); - securityCardItem.getModel(stack).setBoundPlayer(player); + final PlayerSecurityCardModel model = securityCardItem.createModel(stack); + model.setBoundPlayer(player); } } - Permission changePermission(final ResourceLocation permissionId, final boolean selected) { - Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardPermission(permissionId, selected); - return updatePermissionLocally(permissionId, selected, true); - } - - Permission resetPermission(final ResourceLocation permissionId) { - final PlatformPermission permission = PlatformApi.INSTANCE.getPermissionRegistry() - .get(permissionId) - .orElseThrow(); - final boolean allowed = permission.isAllowedByDefault(); - Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardResetPermission(permissionId); - return updatePermissionLocally(permissionId, allowed, false); - } - - private Permission updatePermissionLocally(final ResourceLocation permissionId, - final boolean allowed, - final boolean dirty) { - final Permission localPermission = permissions.stream().filter(p -> p.id().equals(permissionId)) - .findFirst() - .orElseThrow(); - final int index = permissions.indexOf(localPermission); - final Permission updatedLocalPermission = new Permission( - localPermission.id(), - localPermission.name(), - localPermission.description(), - localPermission.ownerName(), - allowed, - dirty - ); - permissions.set(index, updatedLocalPermission); - return updatedLocalPermission; - } - void changeBoundPlayer(@Nullable final Player player) { Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardBoundPlayer( player == null ? null : player.id() @@ -169,14 +72,6 @@ void changeBoundPlayer(@Nullable final Player player) { this.boundTo = player; } - record Permission(ResourceLocation id, - Component name, - Component description, - Component ownerName, - boolean allowed, - boolean dirty) { - } - record Player(UUID id, String name) { } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java index 393cfd486..2c60c85b1 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java @@ -1,10 +1,7 @@ package com.refinedmods.refinedstorage2.platform.common.security; -import com.refinedmods.refinedstorage2.platform.api.PlatformApi; -import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; import java.util.Collections; import java.util.List; @@ -12,39 +9,30 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; -class SecurityCardExtendedMenuProvider implements ExtendedMenuProvider { +class SecurityCardExtendedMenuProvider extends AbstractSecurityCardExtendedMenuProvider { private final SlotReference slotReference; - private final SecurityCardModel model; + private final PlayerSecurityCardModel playerModel; - SecurityCardExtendedMenuProvider(final SlotReference slotReference, final SecurityCardModel model) { + SecurityCardExtendedMenuProvider(final SlotReference slotReference, final PlayerSecurityCardModel model) { + super(slotReference, model); this.slotReference = slotReference; - this.model = model; + this.playerModel = model; } @Override public void writeScreenOpeningData(final ServerPlayer player, final FriendlyByteBuf buf) { - PlatformApi.INSTANCE.writeSlotReference(slotReference, buf); + super.writeScreenOpeningData(player, buf); - final List permissions = PlatformApi.INSTANCE.getPermissionRegistry().getAll(); - buf.writeInt(permissions.size()); - for (final PlatformPermission permission : permissions) { - final ResourceLocation id = PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).orElseThrow(); - buf.writeResourceLocation(id); - buf.writeBoolean(model.isAllowed(permission)); - buf.writeBoolean(model.isDirty(permission)); - } - - final boolean bound = model.getBoundPlayerId() != null && model.getBoundPlayerName() != null; + final boolean bound = playerModel.getBoundPlayerId() != null && playerModel.getBoundPlayerName() != null; buf.writeBoolean(bound); if (bound) { - buf.writeUUID(model.getBoundPlayerId()); - buf.writeUtf(model.getBoundPlayerName()); + buf.writeUUID(playerModel.getBoundPlayerId()); + buf.writeUtf(playerModel.getBoundPlayerName()); } final List players = player.getServer() == null diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java index bc819ad2b..c10b17af0 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java @@ -1,29 +1,21 @@ package com.refinedmods.refinedstorage2.platform.common.security; -import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; -import com.refinedmods.refinedstorage2.platform.common.Platform; +import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import java.util.List; import java.util.Optional; -import javax.annotation.Nullable; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -public class SecurityCardItem extends Item { +public class SecurityCardItem extends AbstractSecurityCardItem { private static final Component UNBOUND_HELP = createTranslation("item", "security_card.unbound.help"); private static final Component BOUND_HELP = createTranslation("item", "security_card.bound.help"); @@ -31,49 +23,16 @@ public SecurityCardItem() { super(new Item.Properties().stacksTo(1)); } - SecurityCardModel getModel(final ItemStack stack) { - return new SecurityCardModel(stack); - } - - boolean isActive(final ItemStack stack) { - return SecurityCardModel.isActive(stack); - } - @Override - public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { - final ItemStack stack = player.getItemInHand(hand); - if (player instanceof ServerPlayer serverPlayer) { - use(hand, serverPlayer, stack); - } - return InteractionResultHolder.consume(stack); - } - - private void use(final InteractionHand hand, final ServerPlayer player, final ItemStack stack) { - if (player.isCrouching()) { - bindOrClear(player, stack); + void tryClear(final ServerPlayer player, final PlayerSecurityCardModel model) { + if (model.isCleared()) { + bind(player, model); return; } - Platform.INSTANCE.getMenuOpener().openMenu(player, new SecurityCardExtendedMenuProvider( - PlatformApi.INSTANCE.createInventorySlotReference(player, hand), - getModel(stack) - )); - } - - private void bindOrClear(final ServerPlayer player, final ItemStack stack) { - if (stack.hasTag()) { - clear(player, stack); - } else { - bind(player, stack); - } - } - - private void clear(final ServerPlayer player, final ItemStack stack) { - stack.setTag(null); - player.sendSystemMessage(createTranslation("item", "security_card.cleared")); + super.tryClear(player, model); } - private void bind(final ServerPlayer player, final ItemStack stack) { - final SecurityCardModel model = getModel(stack); + private void bind(final ServerPlayer player, final PlayerSecurityCardModel model) { model.setBoundPlayer(player); player.sendSystemMessage(createTranslation( "item", @@ -83,41 +42,39 @@ private void bind(final ServerPlayer player, final ItemStack stack) { } @Override - public void appendHoverText(final ItemStack stack, - @Nullable final Level level, - final List lines, - final TooltipFlag flag) { - super.appendHoverText(stack, level, lines, flag); - final SecurityCardModel model = getModel(stack); - + protected boolean addTooltip(final ItemStack stack, + final List lines, + final PlayerSecurityCardModel model) { final String boundPlayerName = model.getBoundPlayerName(); if (boundPlayerName == null) { lines.add(createTranslation("item", "security_card.unbound").withStyle(ChatFormatting.GRAY)); - return; + return false; } - lines.add(createTranslation( "item", "security_card.bound", Component.literal(boundPlayerName).withStyle(ChatFormatting.YELLOW) ).withStyle(ChatFormatting.GRAY)); - - PlatformApi.INSTANCE.getPermissionRegistry().getAll().forEach(permission -> { - final boolean allowed = model.isAllowed(permission); - final boolean dirty = model.isDirty(permission); - final Style style = Style.EMPTY - .withColor(allowed ? ChatFormatting.GREEN : ChatFormatting.RED) - .withItalic(dirty); - final Component permissionTooltip = Component.literal(allowed ? "✓ " : "❌ ") - .append(permission.getName()) - .append(dirty ? " (*)" : "") - .withStyle(style); - lines.add(permissionTooltip); - }); + return true; } @Override public Optional getTooltipImage(final ItemStack stack) { return Optional.of(new HelpTooltipComponent(isActive(stack) ? BOUND_HELP : UNBOUND_HELP)); } + + @Override + PlayerSecurityCardModel createModel(final ItemStack stack) { + return new PlayerSecurityCardModel(stack); + } + + @Override + AbstractSecurityCardExtendedMenuProvider createMenuProvider(final SlotReference slotReference, + final PlayerSecurityCardModel model) { + return new SecurityCardExtendedMenuProvider(slotReference, model); + } + + boolean isActive(final ItemStack stack) { + return PlayerSecurityCardModel.isActive(stack); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java index 5ef43ae9d..8b6c09ba0 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java @@ -3,20 +3,14 @@ import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; -import java.util.UUID; -import javax.annotation.Nullable; - import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; class SecurityCardModel { - private static final String TAG_BOUND_PLAYER_ID = "bid"; - private static final String TAG_BOUND_PLAYER_NAME = "bname"; private static final String TAG_PERMISSIONS = "permissions"; - private final ItemStack stack; + protected final ItemStack stack; SecurityCardModel(final ItemStack stack) { this.stack = stack; @@ -55,35 +49,15 @@ void resetPermission(final ResourceLocation permissionId) { permissionsTag.remove(permissionId.toString()); } - @Nullable - UUID getBoundPlayerId() { - return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_ID)) - ? null - : stack.getTag().getUUID(TAG_BOUND_PLAYER_ID); + boolean isActive() { + return stack.getTag() != null && stack.getTag().contains(TAG_PERMISSIONS); } - @Nullable - String getBoundPlayerName() { - return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_NAME)) - ? null - : stack.getTag().getString(TAG_BOUND_PLAYER_NAME); + boolean isCleared() { + return stack.getTag() == null; } - void setBoundPlayer(@Nullable final ServerPlayer player) { - final CompoundTag tag = stack.getOrCreateTag(); - if (player == null) { - tag.remove(TAG_BOUND_PLAYER_ID); - tag.remove(TAG_BOUND_PLAYER_NAME); - return; - } - tag.putUUID(TAG_BOUND_PLAYER_ID, player.getGameProfile().getId()); - tag.putString(TAG_BOUND_PLAYER_NAME, player.getGameProfile().getName()); - } - - static boolean isActive(final ItemStack stack) { - return stack.getTag() != null - && stack.getTag().contains(TAG_BOUND_PLAYER_ID) - && stack.getTag().contains(TAG_BOUND_PLAYER_NAME) - && stack.getTag().contains(TAG_PERMISSIONS); + public void clear() { + stack.setTag(null); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java index 7669855ca..a0b900925 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java @@ -1,63 +1,30 @@ package com.refinedmods.refinedstorage2.platform.common.security; -import com.refinedmods.refinedstorage2.platform.common.support.stretching.AbstractStretchingScreen; -import com.refinedmods.refinedstorage2.platform.common.support.widget.CustomCheckboxWidget; - -import java.util.ArrayList; -import java.util.List; import javax.annotation.Nullable; -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Tooltip; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; -import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -public class SecurityCardScreen extends AbstractStretchingScreen { - private static final ResourceLocation TEXTURE = createIdentifier("textures/gui/security_card.png"); - +public class SecurityCardScreen extends AbstractSecurityCardScreen { private static final int BOUND_PLAYER_BUTTON_RIGHT_PADDING = 6; private static final int BOUND_PLAYER_BUTTON_WIDTH = 80; private static final MutableComponent UNBOUND_TITLE = Component.literal("<") .append(createTranslation("gui", "security_card.unbound")) .append(">"); - private static final int RESET_BUTTON_WIDTH = 40; - private static final int RESET_BUTTON_RIGHT_PADDING = 16; - private static final Component RESET_TITLE = createTranslation("gui", "security_card.permission.reset"); - private static final Component MODIFIED_TITLE = createTranslation("gui", "security_card.permission.modified") - .withStyle(Style.EMPTY.withItalic(true).withColor(ChatFormatting.YELLOW)); - - private final List permissions = new ArrayList<>(); - public SecurityCardScreen(final SecurityCardContainerMenu menu, final Inventory playerInventory, final Component text) { super(menu, playerInventory, text); - this.inventoryLabelY = 97; - this.imageWidth = 193; - this.imageHeight = 176; } @Override protected void init(final int rows) { - permissions.clear(); - final List menuPermissions = getMenu().getPermissions(); - for (int i = 0; i < menuPermissions.size(); ++i) { - final Permission permission = createPermission(menuPermissions.get(i), i, rows); - addWidget(permission.checkbox); - addWidget(permission.resetButton); - permissions.add(permission); - } - updateScrollbar(permissions.size()); - + super.init(rows); final Component boundToText = menu.getBoundTo() == null ? UNBOUND_TITLE : Component.literal(menu.getBoundTo().name()); @@ -68,97 +35,6 @@ protected void init(final int rows) { addRenderableWidget(boundPlayerButton); } - private Permission createPermission( - final SecurityCardContainerMenu.Permission menuPermission, - final int index, - final int rows - ) { - final int y = getPermissionY(index); - final boolean visible = isPermissionVisible(rows, y); - final CustomCheckboxWidget checkbox = createPermissionCheckbox(menuPermission, y, visible); - final Button resetButton = createPermissionResetButton(menuPermission, checkbox, y, visible); - checkbox.setOnPressed((c, selected) -> updatePermission(menuPermission, resetButton, c, selected)); - return new Permission(checkbox, resetButton); - } - - private CustomCheckboxWidget createPermissionCheckbox(final SecurityCardContainerMenu.Permission menuPermission, - final int y, - final boolean visible) { - final CustomCheckboxWidget checkbox = new CustomCheckboxWidget( - leftPos + 10, - y, - getPermissionName(menuPermission), - font, - menuPermission.allowed() - ); - checkbox.visible = visible; - checkbox.setTooltip(getPermissionTooltip(menuPermission)); - return checkbox; - } - - private void updatePermission(final SecurityCardContainerMenu.Permission menuPermission, - final Button resetButton, - final CustomCheckboxWidget checkbox, - final boolean allowed) { - updateCheckboxAndResetButton(checkbox, resetButton, menu.changePermission(menuPermission.id(), allowed)); - } - - private Tooltip getPermissionTooltip(final SecurityCardContainerMenu.Permission menuPermission) { - final MutableComponent ownerName = menuPermission.ownerName().copy().withStyle( - Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY) - ); - final MutableComponent tooltip = menuPermission.description().copy().append("\n").append(ownerName); - return Tooltip.create(menuPermission.dirty() ? tooltip.append("\n").append(MODIFIED_TITLE) : tooltip); - } - - private Button createPermissionResetButton(final SecurityCardContainerMenu.Permission menuPermission, - final CustomCheckboxWidget checkbox, - final int y, - final boolean visible) { - final Button resetButton = Button.builder(RESET_TITLE, btn -> resetPermission(menuPermission, checkbox, btn)) - .pos(leftPos + imageWidth - RESET_BUTTON_RIGHT_PADDING - RESET_BUTTON_WIDTH - 11, y) - .size(RESET_BUTTON_WIDTH, 16) - .build(); - resetButton.visible = visible; - resetButton.active = menuPermission.dirty(); - return resetButton; - } - - private void resetPermission(final SecurityCardContainerMenu.Permission menuPermission, - final CustomCheckboxWidget checkbox, - final Button resetButton) { - updateCheckboxAndResetButton(checkbox, resetButton, menu.resetPermission(menuPermission.id())); - } - - private void updateCheckboxAndResetButton(final CustomCheckboxWidget checkbox, - final Button resetButton, - final SecurityCardContainerMenu.Permission menuPermission) { - checkbox.setMessage(getPermissionName(menuPermission)); - checkbox.setTooltip(getPermissionTooltip(menuPermission)); - checkbox.setSelected(menuPermission.allowed()); - resetButton.active = menuPermission.dirty(); - } - - private Component getPermissionName(final SecurityCardContainerMenu.Permission menuPermission) { - if (!menuPermission.dirty()) { - return menuPermission.name(); - } - return menuPermission.name().copy().append(" (*)").setStyle(Style.EMPTY.withItalic(true)); - } - - private int getPermissionY(final int index) { - return topPos + 19 + (index * ROW_SIZE) + 3; - } - - private boolean isPermissionVisible(final int rows, final int y) { - return y >= (topPos + 19 - ROW_SIZE) && y < (topPos + 19 + (rows * ROW_SIZE)); - } - - @Override - protected int getScrollPanePadding() { - return 4; - } - private void toggleBoundPlayer(final Button button) { if (menu.getPlayers().isEmpty()) { return; @@ -179,74 +55,4 @@ private void setBoundPlayer(final Button button, @Nullable final SecurityCardCon menu.changeBoundPlayer(player); button.setMessage(player == null ? UNBOUND_TITLE : Component.literal(player.name())); } - - @Override - protected void scrollbarChanged(final int rows) { - final int offset = getScrollbarOffset(); - for (int i = 0; i < permissions.size(); ++i) { - final Permission permission = permissions.get(i); - final int y = getPermissionY(i) - offset; - final boolean visible = isPermissionVisible(rows, y); - permission.setY(y); - permission.setVisible(visible); - } - } - - @Override - protected void renderRows(final GuiGraphics graphics, - final int x, - final int y, - final int topHeight, - final int rows, - final int mouseX, - final int mouseY) { - for (final Permission permission : permissions) { - permission.render(graphics, mouseX, mouseY); - } - } - - @Override - protected void renderStretchingBackground(final GuiGraphics graphics, final int x, final int y, final int rows) { - for (int row = 0; row < rows; ++row) { - int textureY = 37; - if (row == 0) { - textureY = 19; - } else if (row == rows - 1) { - textureY = 55; - } - graphics.blit(getTexture(), x, y + (ROW_SIZE * row), 0, textureY, imageWidth, ROW_SIZE); - } - } - - @Override - protected int getBottomHeight() { - return 99; - } - - @Override - protected int getBottomV() { - return 73; - } - - @Override - protected ResourceLocation getTexture() { - return TEXTURE; - } - - private record Permission(CustomCheckboxWidget checkbox, Button resetButton) { - private void setY(final int y) { - checkbox.setY(y); - resetButton.setY(y); - } - - private void setVisible(final boolean visible) { - checkbox.visible = visible; - resetButton.visible = visible; - } - - private void render(final GuiGraphics graphics, final int mouseX, final int mouseY) { - checkbox.render(graphics, mouseX, mouseY, 0); - resetButton.render(graphics, mouseX, mouseY, 0); - } - } } diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index a1a39448a..5ccab4c59 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -225,9 +225,11 @@ "item.refinedstorage2.security_card": "Security Card", "item.refinedstorage2.security_card.cleared": "Cleared binding.", "item.refinedstorage2.security_card.unbound": "Unbound.", - "item.refinedstorage2.security_card.unbound.help": "Use while crouching to bind to the current player. Right click to configure.", + "item.refinedstorage2.security_card.unbound.help": "Right click to configure. Use while crouching to bind to the current player.", "item.refinedstorage2.security_card.bound": "Bound to %s.", - "item.refinedstorage2.security_card.bound.help": "Use while crouching to clear binding. Right click to configure.", + "item.refinedstorage2.security_card.bound.help": "Right click to configure. Use while crouching to clear configuration and binding.", + "item.refinedstorage2.fallback_security_card": "Fallback Security Card", + "item.refinedstorage2.fallback_security_card.help": "Acts as a fallback if no matching Security Card for a player is found. Right click to configure. Use while crouching to clear configuration.", "misc.refinedstorage2.stored": "Stored: %s", "misc.refinedstorage2.stored_with_capacity": "Stored: %s / %s (%d%%)", "misc.refinedstorage2.total": "%d total", diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/fallback_security_card.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/fallback_security_card.json new file mode 100755 index 000000000..2ec96d3b9 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/item/fallback_security_card.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage2:item/security_card/fallback" + } +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/item/security_card/fallback.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/item/security_card/fallback.png new file mode 100644 index 0000000000000000000000000000000000000000..af70c71432c506a5b8adc4ad7d54c8b4428b812c GIT binary patch literal 570 zcmV-A0>%A_P)8t4$^!J8l*J%}Dma=N7H zNgOd`jSiBYf|XL#i!OT^NE#Fr!qZ|bo)$8!QBq_?mm(oqD}9|BTH3>G|MUC(zV~?F z12jYs1kzG>W|GMyDT+d|SnT|gR4PT|@t6vQ0^Qs{qI>VYX_utaX&Q}2l+Wks>hnEf z><{SH-k~;0CX=DTU_iNCjyB#L(e3WfQxcEIqe^sVz3g_o@qL`f!`@{~58h&7x`JzW zY+!z!;L(pBTrL+FhS}+KI>`%v!|`~WoK7d^!~E;;8(A~D@(SBqI)t8mfyH7$tJQ)iiYlybpI z-|t8HwSv2rAwEwofz?m(^wmXJtyVOfO%#j8Q}90#1c78(CP5JB{lOCo27@GuBKdqi z?LROS3Q@n`r)V@vk|Yt&^XI>TNF+j%BvCjV{{Jfs1Ol4i-wWmVZ{CiDp#T5?07*qo IM6N<$f|=<4lmGw# literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/fallback_security_card.json b/refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/fallback_security_card.json new file mode 100644 index 000000000..0186f81b7 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/fallback_security_card.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "refinedstorage2:security_card" + }, + { + "item": "minecraft:paper" + } + ], + "result": { + "item": "refinedstorage2:fallback_security_card" + } +} diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java index 0676e4244..907e9a872 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java @@ -14,6 +14,7 @@ import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceBlockEntity; import com.refinedmods.refinedstorage2.platform.common.iface.InterfacePlatformExternalStorageProviderFactory; +import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.AbstractDiskDriveBlockEntity; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockItem; @@ -254,6 +255,15 @@ public boolean allowNbtUpdateAnimation(final Player player, final ItemStack newStack) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } + }, + () -> new FallbackSecurityCardItem() { + @Override + public boolean allowNbtUpdateAnimation(final Player player, + final InteractionHand hand, + final ItemStack oldStack, + final ItemStack newStack) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } } ); registerUpgradeMappings(); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java index 9c392195b..cfebef7b1 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardPermissionPacket.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.platform.fabric.packet.c2s; -import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.AbstractSecurityCardContainerMenu; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -19,7 +19,7 @@ public void receive(final MinecraftServer server, final PacketSender responseSender) { final ResourceLocation permissionId = buf.readResourceLocation(); final boolean allowed = buf.readBoolean(); - if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + if (player.containerMenu instanceof AbstractSecurityCardContainerMenu securityCardContainerMenu) { server.execute(() -> securityCardContainerMenu.setPermission(permissionId, allowed)); } } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java index 16e54f230..ded155bf9 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.platform.fabric.packet.c2s; -import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.AbstractSecurityCardContainerMenu; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -18,7 +18,7 @@ public void receive(final MinecraftServer server, final FriendlyByteBuf buf, final PacketSender responseSender) { final ResourceLocation permissionId = buf.readResourceLocation(); - if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + if (player.containerMenu instanceof AbstractSecurityCardContainerMenu securityCardContainerMenu) { server.execute(() -> securityCardContainerMenu.resetPermissionServer(permissionId)); } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index 647cf114e..af65f270d 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -14,6 +14,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.RegistryCallback; import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.iface.InterfacePlatformExternalStorageProviderFactory; +import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockItem; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridType; @@ -257,6 +258,14 @@ public boolean shouldCauseReequipAnimation(final ItemStack oldStack, final boolean slotChanged) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } + }, + () -> new FallbackSecurityCardItem() { + @Override + public boolean shouldCauseReequipAnimation(final ItemStack oldStack, + final ItemStack newStack, + final boolean slotChanged) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } } ); itemRegistry.register(eventBus); diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java index c1807187c..16a8f5353 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardPermissionPacket.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s; -import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.AbstractSecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; import net.minecraft.network.FriendlyByteBuf; @@ -16,7 +16,7 @@ public static SecurityCardPermissionPacket decode(final FriendlyByteBuf buf) { public static void handle(final SecurityCardPermissionPacket packet, final PlayPayloadContext ctx) { ctx.player().ifPresent(player -> ctx.workHandler().submitAsync(() -> { - if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + if (player.containerMenu instanceof AbstractSecurityCardContainerMenu securityCardContainerMenu) { securityCardContainerMenu.setPermission(packet.permissionId, packet.allowed); } })); diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java index f517c608d..cdd621829 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage2.platform.forge.support.packet.c2s; -import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.AbstractSecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; import net.minecraft.network.FriendlyByteBuf; @@ -15,7 +15,7 @@ public static SecurityCardResetPermissionPacket decode(final FriendlyByteBuf buf public static void handle(final SecurityCardResetPermissionPacket packet, final PlayPayloadContext ctx) { ctx.player().ifPresent(player -> ctx.workHandler().submitAsync(() -> { - if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { + if (player.containerMenu instanceof AbstractSecurityCardContainerMenu securityCardContainerMenu) { securityCardContainerMenu.resetPermissionServer(packet.permissionId); } })); From 6753b307a72ea928ca4bb68c4779ac29b30e8ef2 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 31 Mar 2024 20:49:15 +0200 Subject: [PATCH 34/59] refactor: remove duplicated mod name translation --- .../platform/common/content/ContentNames.java | 5 ++++- .../resources/assets/refinedstorage2/lang/en_us.json | 3 +-- .../platform/fabric/ClientModInitializerImpl.java | 6 +++--- .../platform/forge/ClientModInitializer.java | 10 +++++----- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java index 06afd3e37..7cfa030b9 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java @@ -1,11 +1,14 @@ package com.refinedmods.refinedstorage2.platform.common.content; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.MOD_ID; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public final class ContentNames { - public static final MutableComponent MOD = createTranslation("itemGroup", "general"); + public static final String MOD_TRANSLATION_KEY = "mod." + MOD_ID; + public static final MutableComponent MOD = Component.translatable(MOD_TRANSLATION_KEY); public static final MutableComponent CABLE = name("cable"); public static final MutableComponent GRID = name("grid"); public static final MutableComponent CRAFTING_GRID = name("crafting_grid"); diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 5ccab4c59..ef681b9e1 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -1,5 +1,5 @@ { - "itemGroup.refinedstorage2.general": "Refined Storage 2", + "mod.refinedstorage2": "Refined Storage 2", "block.refinedstorage2.cable": "Cable", "block.refinedstorage2.quartz_enriched_iron_block": "Block of Quartz Enriched Iron", "block.refinedstorage2.disk_drive": "Disk Drive", @@ -254,7 +254,6 @@ "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", "key.refinedstorage2.open_wireless_grid": "Open Wireless Grid", "refinedstorage2.subtitle.wrench": "Wrench used", - "category.refinedstorage2.key_bindings": "Refined Storage 2", "curios.identifier.refinedstorage2": "Refined Storage 2", "trinkets.slot.refinedstorage2.wireless": "Refined Storage 2", "permission.refinedstorage2.insert": "Insert", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java index 0d4f6ce6f..d252a6878 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java @@ -9,6 +9,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockColorMap; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.Blocks; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.content.Items; import com.refinedmods.refinedstorage2.platform.common.content.KeyMappings; import com.refinedmods.refinedstorage2.platform.common.controller.ControllerModelPredicateProvider; @@ -74,7 +75,6 @@ public class ClientModInitializerImpl extends AbstractClientModInitializer implements ClientModInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(ClientModInitializerImpl.class); - private static final String KEY_BINDINGS_TRANSLATION_KEY = createTranslationKey("category", "key_bindings"); @Override public void onInitializeClient() { @@ -365,13 +365,13 @@ private void registerKeyBindings() { createTranslationKey("key", "focus_search_bar"), InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_TAB, - KEY_BINDINGS_TRANSLATION_KEY + ContentNames.MOD_TRANSLATION_KEY ))); KeyMappings.INSTANCE.setOpenWirelessGrid(KeyBindingHelper.registerKeyBinding(new KeyMapping( createTranslationKey("key", "open_wireless_grid"), InputConstants.Type.KEYSYM, InputConstants.UNKNOWN.getValue(), - KEY_BINDINGS_TRANSLATION_KEY + ContentNames.MOD_TRANSLATION_KEY ))); ClientTickEvents.END_CLIENT_TICK.register(client -> handleInputEvents()); } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java index 7f0734f01..7dc124604 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java @@ -7,6 +7,7 @@ import com.refinedmods.refinedstorage2.platform.common.AbstractClientModInitializer; import com.refinedmods.refinedstorage2.platform.common.configurationcard.ConfigurationCardItemPropertyFunction; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.content.Items; import com.refinedmods.refinedstorage2.platform.common.content.KeyMappings; import com.refinedmods.refinedstorage2.platform.common.controller.ControllerModelPredicateProvider; @@ -60,7 +61,6 @@ public final class ClientModInitializer extends AbstractClientModInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(ClientModInitializer.class); - private static final String KEY_BINDINGS_TRANSLATION_KEY = createTranslationKey("category", "key_bindings"); private ClientModInitializer() { } @@ -116,7 +116,7 @@ public static void onRegisterKeyMappings(final RegisterKeyMappingsEvent e) { createTranslationKey("key", "focus_search_bar"), InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_TAB, - KEY_BINDINGS_TRANSLATION_KEY + ContentNames.MOD_TRANSLATION_KEY ); e.register(focusSearchBarKeyBinding); KeyMappings.INSTANCE.setFocusSearchBar(focusSearchBarKeyBinding); @@ -127,7 +127,7 @@ public static void onRegisterKeyMappings(final RegisterKeyMappingsEvent e) { KeyModifier.CONTROL, InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_X, - KEY_BINDINGS_TRANSLATION_KEY + ContentNames.MOD_TRANSLATION_KEY ); e.register(clearCraftingGridMatrixToNetwork); KeyMappings.INSTANCE.setClearCraftingGridMatrixToNetwork(clearCraftingGridMatrixToNetwork); @@ -135,7 +135,7 @@ public static void onRegisterKeyMappings(final RegisterKeyMappingsEvent e) { final KeyMapping clearCraftingGridMatrixToInventory = new KeyMapping( createTranslationKey("key", "clear_crafting_grid_matrix_to_inventory"), InputConstants.UNKNOWN.getValue(), - KEY_BINDINGS_TRANSLATION_KEY + ContentNames.MOD_TRANSLATION_KEY ); e.register(clearCraftingGridMatrixToInventory); KeyMappings.INSTANCE.setClearCraftingGridMatrixToInventory(clearCraftingGridMatrixToInventory); @@ -144,7 +144,7 @@ public static void onRegisterKeyMappings(final RegisterKeyMappingsEvent e) { createTranslationKey("key", "open_wireless_grid"), KeyConflictContext.IN_GAME, InputConstants.UNKNOWN, - KEY_BINDINGS_TRANSLATION_KEY + ContentNames.MOD_TRANSLATION_KEY ); e.register(openWirelessGrid); KeyMappings.INSTANCE.setOpenWirelessGrid(openWirelessGrid); From 567ddaf86592ff73401a415ecacfc91617690f7f Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 10:43:24 +0200 Subject: [PATCH 35/59] chore: add intellij word dictionary --- .gitignore | 1 + .idea/dictionaries/refinedstorage2.xml | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 .idea/dictionaries/refinedstorage2.xml diff --git a/.gitignore b/.gitignore index 924b02b7b..b1194b2f1 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ eclipse/ *.ipr *.iws .idea/ +!.idea/dictionaries/refinedstorage2.xml out/ /bin/ logs/ diff --git a/.idea/dictionaries/refinedstorage2.xml b/.idea/dictionaries/refinedstorage2.xml new file mode 100644 index 000000000..358caf40a --- /dev/null +++ b/.idea/dictionaries/refinedstorage2.xml @@ -0,0 +1,8 @@ + + + + autocrafting + redstone + + + \ No newline at end of file From 2a20052c1c8034f391f673e11e7da0f527dbcbf4 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 10:55:30 +0200 Subject: [PATCH 36/59] chore: add intellij project icon --- .gitignore | 1 + .idea/icon.png | Bin 0 -> 160558 bytes 2 files changed, 1 insertion(+) create mode 100644 .idea/icon.png diff --git a/.gitignore b/.gitignore index b1194b2f1..ae1892911 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ eclipse/ *.iws .idea/ !.idea/dictionaries/refinedstorage2.xml +!.idea/icon.png out/ /bin/ logs/ diff --git a/.idea/icon.png b/.idea/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..242164c12f44db2e18722bd634cb37aa531763f3 GIT binary patch literal 160558 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

2GU= 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 Date: Mon, 1 Apr 2024 11:02:34 +0200 Subject: [PATCH 37/59] chore: reduce logging level We don't need to do this much logging. --- .../api/grid/watcher/GridWatcherManagerImpl.java | 10 +++++----- .../common/grid/AbstractGridContainerMenu.java | 2 +- .../networking/NetworkTransmitterBlockEntity.java | 6 +++--- .../recipemod/jei/RefinedStorageJeiModPlugin.java | 2 +- ...ractUpgradeableNetworkNodeContainerBlockEntity.java | 2 +- .../common/support/network/ConnectionProviderImpl.java | 8 ++++++-- .../platform/common/upgrade/UpgradeContainer.java | 2 +- .../platform/fabric/ClientModInitializerImpl.java | 2 +- .../platform/fabric/ModInitializerImpl.java | 2 +- .../platform/forge/ClientModInitializer.java | 2 +- 10 files changed, 21 insertions(+), 17 deletions(-) diff --git a/refinedstorage2-grid-api/src/main/java/com/refinedmods/refinedstorage2/api/grid/watcher/GridWatcherManagerImpl.java b/refinedstorage2-grid-api/src/main/java/com/refinedmods/refinedstorage2/api/grid/watcher/GridWatcherManagerImpl.java index c86437cab..a5b85402f 100644 --- a/refinedstorage2-grid-api/src/main/java/com/refinedmods/refinedstorage2/api/grid/watcher/GridWatcherManagerImpl.java +++ b/refinedstorage2-grid-api/src/main/java/com/refinedmods/refinedstorage2/api/grid/watcher/GridWatcherManagerImpl.java @@ -31,7 +31,7 @@ public void addWatcher( attach(registration, storageChannel, false); } watchers.put(watcher, registration); - LOGGER.info("Added watcher {}, new count is {}", watcher, watchers.size()); + LOGGER.debug("Added watcher {}, new count is {}", watcher, watchers.size()); } @Override @@ -57,7 +57,7 @@ private void attach( final StorageChannel storageChannel, final boolean replay ) { - LOGGER.info("Attaching {} to {}", registration, storageChannel); + LOGGER.debug("Attaching {} to {}", registration, storageChannel); registration.attach(storageChannel, replay); } @@ -71,17 +71,17 @@ public void removeWatcher(final GridWatcher watcher, @Nullable final StorageChan detach(registration, storageChannel); } watchers.remove(watcher); - LOGGER.info("Removed watcher {}, remaining {}", watcher, watchers.size()); + LOGGER.debug("Removed watcher {}, remaining {}", watcher, watchers.size()); } @Override public void detachAll(final StorageChannel storageChannel) { - LOGGER.info("Detaching {} watchers", watchers.size()); + LOGGER.debug("Detaching {} watchers", watchers.size()); watchers.values().forEach(watcher -> detach(watcher, storageChannel)); } private void detach(final GridWatcherRegistration registration, final StorageChannel storageChannel) { - LOGGER.info("Detaching {} from {}", registration, storageChannel); + LOGGER.debug("Detaching {} from {}", registration, storageChannel); registration.detach(storageChannel); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java index 0ca32b10f..06b474e93 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java @@ -261,7 +261,7 @@ public void onChanged( if (!(resource instanceof PlatformResourceKey platformResource)) { return; } - LOGGER.info("{} received a change of {} for {}", this, change, resource); + LOGGER.debug("{} received a change of {} for {}", this, change, resource); Platform.INSTANCE.getServerToClientCommunications().sendGridUpdate( (ServerPlayer) playerInventory.player, platformResource, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java index 295f425cd..45fd2e0aa 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java @@ -67,7 +67,7 @@ public NetworkTransmitterBlockEntity(final BlockPos pos, final BlockState state) setChanged(); updateReceiverLocation(); if (level != null) { - LOGGER.info("Network card was changed at {}, sending network update", worldPosition); + LOGGER.debug("Network card was changed at {}, sending network update", worldPosition); PlatformApi.INSTANCE.requestNetworkNodeUpdate(this, level); } }); @@ -86,7 +86,7 @@ public void updateStateInLevel(final BlockState state) { final NetworkTransmitterState currentState = state.getValue(NetworkTransmitterBlock.STATE); final NetworkTransmitterState newState = getState(); if (currentState != newState && level != null && stateChangeRateLimiter.tryAcquire()) { - LOGGER.info("Updating network transmitter at {} from {} to {}", worldPosition, currentState, newState); + LOGGER.debug("Updating network transmitter at {} from {} to {}", worldPosition, currentState, newState); level.setBlockAndUpdate(worldPosition, state.setValue(NetworkTransmitterBlock.STATE, newState)); } } @@ -142,7 +142,7 @@ private void tryReconnectingWithReceiver() { if (level == null) { return; } - LOGGER.info( + LOGGER.debug( "Receiver {} was not found in network for transmitter at {}, retrying and sending network update", receiverKey, worldPosition diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/recipemod/jei/RefinedStorageJeiModPlugin.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/recipemod/jei/RefinedStorageJeiModPlugin.java index 767208eb4..5f4657f2f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/recipemod/jei/RefinedStorageJeiModPlugin.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/recipemod/jei/RefinedStorageJeiModPlugin.java @@ -69,7 +69,7 @@ public static IJeiRuntime getRuntime() { } private void initializePlatform(final IPlatformFluidHelper fluidHelper) { - LOGGER.info("Enabling JEI integration"); + LOGGER.debug("Enabling JEI integration"); registerIngredientConverters(fluidHelper); registerGridSynchronizers(); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractUpgradeableNetworkNodeContainerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractUpgradeableNetworkNodeContainerBlockEntity.java index 3746b213e..69dc02d40 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractUpgradeableNetworkNodeContainerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractUpgradeableNetworkNodeContainerBlockEntity.java @@ -103,7 +103,7 @@ public void load(final CompoundTag tag) { } private void configureAccordingToUpgrades() { - LOGGER.info("Reconfiguring {} for upgrades", getBlockPos()); + LOGGER.debug("Reconfiguring {} for upgrades", getBlockPos()); final int amountOfSpeedUpgrades = upgradeContainer.getAmount(Items.INSTANCE.getSpeedUpgrade()); this.rateLimiter = createRateLimiter(amountOfSpeedUpgrades); this.setEnergyUsage(upgradeContainer.getEnergyUsage()); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/ConnectionProviderImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/ConnectionProviderImpl.java index 7d6f81382..4c0abfa92 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/ConnectionProviderImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/ConnectionProviderImpl.java @@ -40,7 +40,11 @@ public Connections findConnections(final NetworkNodeContainer pivot, .filter(PlatformNetworkNodeContainer.class::isInstance) .map(PlatformNetworkNodeContainer.class::cast) .collect(Collectors.toSet()); - LOGGER.info("Finding connections for pivot {} with {} existing connections", pivot, existingConnections.size()); + LOGGER.debug( + "Finding connections for pivot {} with {} existing connections", + pivot, + existingConnections.size() + ); final ScanState scanState = new ScanState(existingPlatformConnections); addStartContainer(pivot, scanState); PlatformNetworkNodeContainer currentContainer; @@ -49,7 +53,7 @@ public Connections findConnections(final NetworkNodeContainer pivot, visit(scanState, new ScanEntry(currentContainer)); requests++; } - LOGGER.info( + LOGGER.debug( "Processed {} requests for pivot {} with {} found entries ({} removed and {} new)", requests, pivot, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/upgrade/UpgradeContainer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/upgrade/UpgradeContainer.java index 9cd9caaf9..de42370b7 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/upgrade/UpgradeContainer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/upgrade/UpgradeContainer.java @@ -82,7 +82,7 @@ public void fromTag(final ListTag tag) { } private void updateIndex() { - LOGGER.info("Updating upgrade index for {}", destination); + LOGGER.debug("Updating upgrade index for {}", destination); index.clear(); for (int i = 0; i < getContainerSize(); ++i) { updateIndex(i); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java index d252a6878..db388346e 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java @@ -392,7 +392,7 @@ private void registerGridSynchronizers() { } private void registerReiGridSynchronizers() { - LOGGER.info("Enabling REI grid synchronizers"); + LOGGER.debug("Enabling REI grid synchronizers"); // This is so the ingredient converters are only registered once // see https://github.com/refinedmods/refinedstorage2/pull/302#discussion_r1070015672 RefinedStorageREIClientPlugin.registerIngredientConverters(); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java index 907e9a872..adc8c3296 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java @@ -115,7 +115,7 @@ public void onInitialize() { registerSlotReferenceProviders(); registerWrenchingEvent(); - LOGGER.info("Refined Storage 2 has loaded."); + LOGGER.debug("Refined Storage 2 has loaded."); } private void registerAdditionalGridInsertionStrategyFactories() { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java index 7dc124604..9190295d6 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java @@ -179,7 +179,7 @@ private static void registerGridSynchronizers() { } private static void registerReiGridSynchronizers() { - LOGGER.info("Enabling REI grid synchronizers"); + LOGGER.debug("Enabling REI grid synchronizers"); // This is so the ingredient converters are only registered once // see https://github.com/refinedmods/refinedstorage2/pull/302#discussion_r1070015672 RefinedStorageREIClientPlugin.registerIngredientConverters(); From be52b743636032049ce0223e0886058854690697 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 11:36:00 +0200 Subject: [PATCH 38/59] refactor: remove default registry values They weren't needed and were not always applicable (the permission registry doesn't need a default) --- .../support/registry/PlatformRegistry.java | 21 +--------- .../common/AbstractClientModInitializer.java | 8 ++++ .../common/AbstractModInitializer.java | 29 +++++++++---- .../platform/common/PlatformApiImpl.java | 32 ++++----------- .../grid/AbstractGridContainerMenu.java | 13 +++--- .../common/grid/NoopGridSynchronizer.java | 5 +++ .../grid/screen/AbstractGridScreen.java | 10 +++-- .../security/AbstractSecurityCardItem.java | 18 ++++---- .../registry/PlatformRegistryImpl.java | 32 +++------------ .../platform/common/PlatformTestFixtures.java | 9 ++-- .../registry/PlatformRegistryImplTest.java | 41 +++++-------------- .../fabric/ClientModInitializerImpl.java | 1 + .../platform/fabric/ModInitializerImpl.java | 5 ++- .../platform/forge/ClientModInitializer.java | 1 + .../platform/forge/ModInitializer.java | 3 +- 15 files changed, 94 insertions(+), 134 deletions(-) diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/registry/PlatformRegistry.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/registry/PlatformRegistry.java index 1e179ce6e..29a490e35 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/registry/PlatformRegistry.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/registry/PlatformRegistry.java @@ -21,11 +21,6 @@ public interface PlatformRegistry { */ void register(ResourceLocation id, T value); - /** - * @return whether if there is any other value, ignoring any default value - */ - boolean isEmpty(); - /** * @param value the value * @return the id of the value, if present @@ -38,11 +33,6 @@ public interface PlatformRegistry { */ Optional get(ResourceLocation id); - /** - * @return the default value - */ - T getDefault(); - /** * @return an unmodifiable list of all values */ @@ -50,16 +40,7 @@ public interface PlatformRegistry { /** * Returns the next value in the ordered list. - * If the value is not found, it will return the default value. - * - * @param value the given value - * @return the next value after the given value - */ - T next(T value); - - /** - * Returns the next value in the ordered list. - * If the value is not found, it will the default value. + * If the value is not found, it will return the first value. * If the value is the last value in the ordered list, it will return null. * * @param value the given value diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java index 8c24202b4..b708c7a0b 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java @@ -10,6 +10,7 @@ import com.refinedmods.refinedstorage2.platform.common.detector.DetectorScreen; import com.refinedmods.refinedstorage2.platform.common.exporter.ExporterScreen; import com.refinedmods.refinedstorage2.platform.common.grid.GridContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.grid.NoopGridSynchronizer; import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridContainerMenu; import com.refinedmods.refinedstorage2.platform.common.grid.screen.CraftingGridScreen; import com.refinedmods.refinedstorage2.platform.common.grid.screen.GridScreen; @@ -48,6 +49,13 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; public abstract class AbstractClientModInitializer { + protected static void registerBaseGridSynchronizer() { + PlatformApi.INSTANCE.getGridSynchronizerRegistry().register( + createIdentifier("off"), + NoopGridSynchronizer.INSTANCE + ); + } + protected static void registerScreens(final ScreenRegistration registration) { registration.register(Menus.INSTANCE.getDiskDrive(), DiskDriveScreen::new); registration.register(Menus.INSTANCE.getGrid(), GridScreen::new); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index e1d95c1a6..15419d092 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -98,6 +98,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.SimpleItem; import com.refinedmods.refinedstorage2.platform.common.support.energy.EnergyLootItemFunction; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeContainerBlockEntityImpl; +import com.refinedmods.refinedstorage2.platform.common.support.network.bounditem.InventorySlotReferenceFactory; import com.refinedmods.refinedstorage2.platform.common.support.network.component.PlatformStorageNetworkComponent; import com.refinedmods.refinedstorage2.platform.common.support.resource.FluidResourceFactory; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; @@ -175,12 +176,13 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; public abstract class AbstractModInitializer { + private static final String ITEM_REGISTRY_KEY = "item"; private static final String FLUID_REGISTRY_KEY = "fluid"; protected final void initializePlatformApi() { ((PlatformApiProxy) PlatformApi.INSTANCE).setDelegate(new PlatformApiImpl()); - registerAdditionalStorageTypes(); - registerAdditionalResourceTypes(); + registerStorageTypes(); + registerResourceTypes(); registerAdditionalResourceFactories(); registerDestructorStrategyFactories(); registerConstructorStrategyFactories(); @@ -189,16 +191,25 @@ protected final void initializePlatformApi() { registerNetworkComponents(); registerWirelessTransmitterRangeModifiers(); registerPermissions(); + registerSlotReferenceProviders(); } - private void registerAdditionalStorageTypes() { + private void registerStorageTypes() { + PlatformApi.INSTANCE.getStorageTypeRegistry().register( + createIdentifier(ITEM_REGISTRY_KEY), + StorageTypes.ITEM + ); PlatformApi.INSTANCE.getStorageTypeRegistry().register( createIdentifier(FLUID_REGISTRY_KEY), StorageTypes.FLUID ); } - private void registerAdditionalResourceTypes() { + private void registerResourceTypes() { + PlatformApi.INSTANCE.getResourceTypeRegistry().register( + createIdentifier(ITEM_REGISTRY_KEY), + ResourceTypes.ITEM + ); PlatformApi.INSTANCE.getResourceTypeRegistry().register( createIdentifier(FLUID_REGISTRY_KEY), ResourceTypes.FLUID @@ -260,9 +271,6 @@ private void registerWirelessTransmitterRangeModifiers() { private void registerPermissions() { for (final BuiltinPermission permission : BuiltinPermission.values()) { - if (permission == BuiltinPermission.SECURITY) { - continue; - } PlatformApi.INSTANCE.getPermissionRegistry().register(permission.getId(), permission); } } @@ -774,6 +782,13 @@ protected final void registerRecipeSerializers(final RegistryCallback networkComponentMapFactory = new ComponentMapFactory<>(); private final NetworkBuilder networkBuilder = new NetworkBuilderImpl(new NetworkFactory(networkComponentMapFactory)); - private final PlatformRegistry storageTypeRegistry = - new PlatformRegistryImpl<>(createIdentifier(ITEM_REGISTRY_KEY), StorageTypes.ITEM); - private final PlatformRegistry resourceTypeRegistry = - new PlatformRegistryImpl<>(createIdentifier(ITEM_REGISTRY_KEY), ResourceTypes.ITEM); - private final PlatformRegistry gridSynchronizerRegistry = - new PlatformRegistryImpl<>(createIdentifier("off"), new NoopGridSynchronizer()); + private final PlatformRegistry storageTypeRegistry = new PlatformRegistryImpl<>(); + private final PlatformRegistry resourceTypeRegistry = new PlatformRegistryImpl<>(); + private final PlatformRegistry gridSynchronizerRegistry = new PlatformRegistryImpl<>(); private final PlatformRegistry importerTransferStrategyRegistry = - new PlatformRegistryImpl<>(createIdentifier("noop"), - (level, pos, direction, upgradeState, amountOverride) -> (filter, actor, network) -> false); + new PlatformRegistryImpl<>(); private final PlatformRegistry exporterTransferStrategyRegistry = - new PlatformRegistryImpl<>(createIdentifier("noop"), - (level, pos, direction, upgradeState, amountOverride, fuzzyMode) -> (resource, actor, network) -> false); + new PlatformRegistryImpl<>(); private final UpgradeRegistry upgradeRegistry = new UpgradeRegistryImpl(); private final BuiltinUpgradeDestinations builtinUpgradeDestinations = new BuiltinUpgradeDestinationsImpl(); private final Queue externalStorageProviderFactories = new PriorityQueue<>( @@ -160,15 +148,9 @@ public class PlatformApiImpl implements PlatformApi { new CompositeWirelessTransmitterRangeModifier(); private final EnergyItemHelper energyItemHelper = new EnergyItemHelperImpl(); private final NetworkBoundItemHelper networkBoundItemHelper = new NetworkBoundItemHelperImpl(); - private final PlatformRegistry slotReferenceFactoryRegistry = new PlatformRegistryImpl<>( - createIdentifier("inventory"), - InventorySlotReferenceFactory.INSTANCE - ); + private final PlatformRegistry slotReferenceFactoryRegistry = new PlatformRegistryImpl<>(); private final CompositeSlotReferenceProvider slotReferenceProvider = new CompositeSlotReferenceProvider(); - private final PlatformRegistry permissionRegistry = new PlatformRegistryImpl<>( - BuiltinPermission.SECURITY.getId(), - BuiltinPermission.SECURITY - ); + private final PlatformRegistry permissionRegistry = new PlatformRegistryImpl<>(); @Override public PlatformRegistry getStorageTypeRegistry() { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java index 06b474e93..743a10b61 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java @@ -33,6 +33,7 @@ import com.refinedmods.refinedstorage2.platform.common.grid.strategy.ClientGridScrollingStrategy; import com.refinedmods.refinedstorage2.platform.common.grid.view.CompositeGridResourceFactory; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; import com.refinedmods.refinedstorage2.platform.common.support.stretching.ScreenSizeListener; import com.refinedmods.refinedstorage2.platform.common.util.PacketUtil; import com.refinedmods.refinedstorage2.query.lexer.LexerTokenMappings; @@ -140,7 +141,7 @@ protected AbstractGridContainerMenu( this.grid = grid; this.grid.addWatcher(this, PlayerActor.class); - this.synchronizer = PlatformApi.INSTANCE.getGridSynchronizerRegistry().getDefault(); + this.synchronizer = NoopGridSynchronizer.INSTANCE; initStrategies(); } @@ -322,7 +323,7 @@ private GridSynchronizer loadSynchronizer() { .getGrid() .getSynchronizer() .flatMap(id -> PlatformApi.INSTANCE.getGridSynchronizerRegistry().get(id)) - .orElse(PlatformApi.INSTANCE.getGridSynchronizerRegistry().getDefault()); + .orElse(NoopGridSynchronizer.INSTANCE); } @Nullable @@ -347,20 +348,20 @@ public ResourceType getResourceType() { public void toggleSynchronizer() { final PlatformRegistry registry = PlatformApi.INSTANCE.getGridSynchronizerRegistry(); final Config.GridEntry config = Platform.INSTANCE.getConfig().getGrid(); - final GridSynchronizer newSynchronizer = registry.next(getSynchronizer()); - if (newSynchronizer == registry.getDefault()) { + final GridSynchronizer newSynchronizer = registry.nextOrNullIfLast(getSynchronizer()); + if (newSynchronizer == null) { config.clearSynchronizer(); } else { registry.getId(newSynchronizer).ifPresent(config::setSynchronizer); } - this.synchronizer = newSynchronizer; + this.synchronizer = newSynchronizer == null ? NoopGridSynchronizer.INSTANCE : newSynchronizer; } public void toggleResourceType() { final PlatformRegistry registry = PlatformApi.INSTANCE.getResourceTypeRegistry(); final Config.GridEntry config = Platform.INSTANCE.getConfig().getGrid(); final ResourceType newResourceType = resourceTypeFilter == null - ? registry.getDefault() + ? ResourceTypes.ITEM : registry.nextOrNullIfLast(resourceTypeFilter); if (newResourceType == null) { config.clearResourceType(); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/NoopGridSynchronizer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/NoopGridSynchronizer.java index 825f31698..e69cd08ff 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/NoopGridSynchronizer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/NoopGridSynchronizer.java @@ -8,9 +8,14 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class NoopGridSynchronizer extends AbstractGridSynchronizer { + public static final NoopGridSynchronizer INSTANCE = new NoopGridSynchronizer(); + private static final MutableComponent TITLE = createTranslation("gui", "grid.synchronizer.off"); private static final Component HELP = createTranslation("gui", "grid.synchronizer.off.help"); + private NoopGridSynchronizer() { + } + @Override public MutableComponent getTitle() { return TITLE; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java index dd20dde26..889c89b37 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java @@ -7,12 +7,11 @@ import com.refinedmods.refinedstorage2.api.storage.tracked.TrackedResource; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.grid.GridScrollMode; -import com.refinedmods.refinedstorage2.platform.api.grid.GridSynchronizer; import com.refinedmods.refinedstorage2.platform.api.grid.view.PlatformGridResource; -import com.refinedmods.refinedstorage2.platform.api.support.registry.PlatformRegistry; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.grid.AbstractGridContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.grid.NoopGridSynchronizer; import com.refinedmods.refinedstorage2.platform.common.grid.view.ItemGridResource; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.DisabledSlot; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.PropertyTypes; @@ -102,8 +101,11 @@ protected void init(final int rows) { addSideButton(new AutoSelectedSideButtonWidget(getMenu())); addSideButton(new ResourceTypeSideButtonWidget(getMenu())); - final PlatformRegistry synchronizers = PlatformApi.INSTANCE.getGridSynchronizerRegistry(); - if (!synchronizers.isEmpty()) { + final boolean onlyHasNoopSynchronizer = PlatformApi.INSTANCE.getGridSynchronizerRegistry() + .getAll() + .stream() + .allMatch(synchronizer -> synchronizer == NoopGridSynchronizer.INSTANCE); + if (!onlyHasNoopSynchronizer) { addSideButton(new SynchronizationSideButtonWidget(getMenu())); searchField.addListener(this::trySynchronizeFromGrid); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java index 4a5f0b17f..03c1ed217 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java @@ -21,7 +21,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -abstract class AbstractSecurityCardItem extends Item { +abstract class AbstractSecurityCardItem extends Item { protected AbstractSecurityCardItem(final Properties properties) { super(properties); } @@ -32,13 +32,13 @@ public void appendHoverText(final ItemStack stack, final List lines, final TooltipFlag flag) { super.appendHoverText(stack, level, lines, flag); - final M model = createModel(stack); + final T model = createModel(stack); if (addTooltip(stack, lines, model)) { addPermissions(lines, model); } } - protected boolean addTooltip(final ItemStack stack, final List lines, final M model) { + protected boolean addTooltip(final ItemStack stack, final List lines, final T model) { return true; } @@ -61,13 +61,13 @@ private void addPermissions(final List lines, final SecurityCardModel public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { final ItemStack stack = player.getItemInHand(hand); if (player instanceof ServerPlayer serverPlayer) { - final M model = createModel(stack); - use(hand, serverPlayer, stack, model); + final T model = createModel(stack); + use(hand, serverPlayer, model); } return InteractionResultHolder.consume(stack); } - private void use(final InteractionHand hand, final ServerPlayer player, final ItemStack stack, final M model) { + private void use(final InteractionHand hand, final ServerPlayer player, final T model) { if (player.isCrouching()) { tryClear(player, model); return; @@ -78,15 +78,15 @@ private void use(final InteractionHand hand, final ServerPlayer player, final It )); } - void tryClear(final ServerPlayer player, final M model) { + void tryClear(final ServerPlayer player, final T model) { model.clear(); player.sendSystemMessage(createTranslation("item", "security_card.cleared")); } - abstract M createModel(ItemStack stack); + abstract T createModel(ItemStack stack); abstract AbstractSecurityCardExtendedMenuProvider createMenuProvider( SlotReference slotReference, - M model + T model ); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImpl.java index 2873e2cfc..99e83daef 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImpl.java @@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage2.platform.api.support.registry.PlatformRegistry; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -19,12 +20,7 @@ public class PlatformRegistryImpl implements PlatformRegistry { private final Map idToValueMap = new HashMap<>(); private final Map valueToIdMap = new HashMap<>(); private final List order = new ArrayList<>(); - private final T defaultValue; - - public PlatformRegistryImpl(final ResourceLocation defaultValueId, final T defaultValue) { - this.register(defaultValueId, defaultValue); - this.defaultValue = defaultValue; - } + private final List viewList = Collections.unmodifiableList(order); @Override public void register(final ResourceLocation id, final T value) { @@ -38,11 +34,6 @@ public void register(final ResourceLocation id, final T value) { order.add(value); } - @Override - public boolean isEmpty() { - return order.size() == 1; - } - @Override public Optional getId(final T value) { CoreValidations.validateNotNull(value, VALUE_NOT_PRESENT_ERROR); @@ -55,29 +46,18 @@ public Optional get(final ResourceLocation id) { return Optional.ofNullable(idToValueMap.get(id)); } - @Override - public T getDefault() { - return defaultValue; - } - @Override public List getAll() { - return List.copyOf(order); - } - - @Override - public T next(final T value) { - final T nextValue = nextOrNullIfLast(value); - if (nextValue == null) { - return order.get(0); - } - return nextValue; + return viewList; } @Nullable @Override public T nextOrNullIfLast(final T value) { CoreValidations.validateNotNull(value, VALUE_NOT_PRESENT_ERROR); + if (order.isEmpty()) { + return null; + } final int index = order.indexOf(value); final int nextIndex = index + 1; if (nextIndex >= order.size()) { diff --git a/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/PlatformTestFixtures.java b/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/PlatformTestFixtures.java index 84b25d394..5c12ddd44 100644 --- a/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/PlatformTestFixtures.java +++ b/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/PlatformTestFixtures.java @@ -8,10 +8,11 @@ import net.minecraft.resources.ResourceLocation; public final class PlatformTestFixtures { - public static final PlatformRegistry STORAGE_TYPE_REGISTRY = new PlatformRegistryImpl<>( - new ResourceLocation("item"), - StorageTypes.ITEM - ); + public static final PlatformRegistry STORAGE_TYPE_REGISTRY = new PlatformRegistryImpl<>(); + + static { + STORAGE_TYPE_REGISTRY.register(new ResourceLocation("item"), StorageTypes.ITEM); + } private PlatformTestFixtures() { } diff --git a/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImplTest.java b/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImplTest.java index af72b8a35..fe2acd6c9 100644 --- a/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImplTest.java +++ b/refinedstorage2-platform-common/src/test/java/com/refinedmods/refinedstorage2/platform/common/support/registry/PlatformRegistryImplTest.java @@ -12,31 +12,24 @@ import static org.junit.jupiter.api.Assertions.assertThrows; class PlatformRegistryImplTest { - private static final ResourceLocation A = new ResourceLocation("minecraft:a"); - private static final ResourceLocation B = new ResourceLocation("minecraft:b"); - private static final ResourceLocation C = new ResourceLocation("minecraft:c"); + private static final ResourceLocation A = new ResourceLocation("a"); + private static final ResourceLocation B = new ResourceLocation("b"); + private static final ResourceLocation C = new ResourceLocation("c"); PlatformRegistry sut; @BeforeEach void setUp() { - sut = new PlatformRegistryImpl<>(A, 10); + sut = new PlatformRegistryImpl<>(); } @Test void testDefaults() { // Assert - assertThat(sut.getDefault()).isEqualTo(10); - assertThat(sut.getAll()).containsExactly(10); - assertThat(sut.get(A)).get().isEqualTo(10); - assertThat(sut.get(B)).isEmpty(); - assertThat(sut.getId(10)).get().isEqualTo(A); - assertThat(sut.getId(20)).isEmpty(); - assertThat(sut.next(10)).isEqualTo(10); + assertThat(sut.getAll()).isEmpty(); + assertThat(sut.get(A)).isEmpty(); + assertThat(sut.getId(10)).isEmpty(); assertThat(sut.nextOrNullIfLast(10)).isNull(); - assertThat(sut.next(20)).isEqualTo(10); - assertThat(sut.nextOrNullIfLast(20)).isEqualTo(10); - assertThat(sut.isEmpty()).isTrue(); } @Test @@ -46,25 +39,23 @@ void shouldNotBeAbleToModifyUnderlyingRegistryList() { // Act & assert assertThrows(UnsupportedOperationException.class, () -> list.add(1)); + assertThrows(UnsupportedOperationException.class, () -> list.remove(1)); } @Test void shouldRegisterAndRetrieve() { // Act + sut.register(A, 10); sut.register(B, 20); // Assert - assertThat(sut.getDefault()).isEqualTo(10); assertThat(sut.getAll()).containsExactly(10, 20); assertThat(sut.get(A)).get().isEqualTo(10); assertThat(sut.get(B)).get().isEqualTo(20); assertThat(sut.getId(10)).get().isEqualTo(A); assertThat(sut.getId(20)).get().isEqualTo(B); - assertThat(sut.next(10)).isEqualTo(20); assertThat(sut.nextOrNullIfLast(10)).isEqualTo(20); - assertThat(sut.next(20)).isEqualTo(10); assertThat(sut.nextOrNullIfLast(20)).isNull(); - assertThat(sut.isEmpty()).isFalse(); } @Test @@ -74,7 +65,7 @@ void shouldNotRegisterDuplicateId() { // Act & assert assertThrows(IllegalArgumentException.class, () -> sut.register(B, 20)); - assertThat(sut.getAll()).containsExactly(10, 20); + assertThat(sut.getAll()).containsExactly(20); } @Test @@ -84,7 +75,7 @@ void shouldNotRegisterDuplicateValue() { // Act & assert assertThrows(IllegalArgumentException.class, () -> sut.register(C, 20)); - assertThat(sut.getAll()).containsExactly(10, 20); + assertThat(sut.getAll()).containsExactly(20); } @Test @@ -96,19 +87,9 @@ void testInvalidRegistration() { assertThrows(NullPointerException.class, () -> sut.register(null, null)); } - @Test - @SuppressWarnings("ConstantConditions") - void testInvalidDefaults() { - // Act & assert - assertThrows(NullPointerException.class, () -> new PlatformRegistryImpl<>(null, 20)); - assertThrows(NullPointerException.class, () -> new PlatformRegistryImpl<>(B, null)); - assertThrows(NullPointerException.class, () -> new PlatformRegistryImpl<>(null, null)); - } - @Test @SuppressWarnings("ConstantConditions") void testInvalidNextValues() { - assertThrows(NullPointerException.class, () -> sut.next(null)); assertThrows(NullPointerException.class, () -> sut.nextOrNullIfLast(null)); } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java index db388346e..a61d27f12 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java @@ -385,6 +385,7 @@ private void registerModelPredicates() { } private void registerGridSynchronizers() { + registerBaseGridSynchronizer(); final FabricLoader loader = FabricLoader.getInstance(); if (loader.isModLoaded("roughlyenoughitems")) { registerReiGridSynchronizers(); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java index adc8c3296..a24899b59 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java @@ -112,7 +112,6 @@ public void onInitialize() { registerRecipeSerializers(new DirectRegistryCallback<>(BuiltInRegistries.RECIPE_SERIALIZER)); registerSidedHandlers(); registerTickHandler(); - registerSlotReferenceProviders(); registerWrenchingEvent(); LOGGER.debug("Refined Storage 2 has loaded."); @@ -405,7 +404,9 @@ private void registerTickHandler() { ServerTickEvents.START_SERVER_TICK.register(server -> ServerEventQueue.runQueuedActions()); } - private void registerSlotReferenceProviders() { + @Override + protected void registerSlotReferenceProviders() { + super.registerSlotReferenceProviders(); TrinketsSlotReferenceProvider.create().ifPresent(slotReferenceProvider -> { PlatformApi.INSTANCE.getSlotReferenceFactoryRegistry().register( createIdentifier("trinkets"), diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java index 9190295d6..d0bbe2230 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ClientModInitializer.java @@ -170,6 +170,7 @@ private static void registerBlockEntityRenderer() { } private static void registerGridSynchronizers() { + registerBaseGridSynchronizer(); final ModList list = ModList.get(); // Give priority to REI, as REI requires a JEI compat mod on Forge. // This means that both JEI + REI support would be activated. We only want REI in that case. diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index af65f270d..1c865051d 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -131,7 +131,6 @@ public ModInitializer(final IEventBus eventBus) { registerSounds(eventBus); registerRecipeSerializers(eventBus); registerTickHandler(); - registerSlotReferenceProviders(); if (FMLEnvironment.dist == Dist.CLIENT) { eventBus.addListener(ClientModInitializer::onClientSetup); @@ -355,7 +354,9 @@ private void registerTickHandler() { NeoForge.EVENT_BUS.addListener(this::onServerTick); } + @Override protected void registerSlotReferenceProviders() { + super.registerSlotReferenceProviders(); CuriosSlotReferenceProvider.create().ifPresent(slotReferenceProvider -> { PlatformApi.INSTANCE.getSlotReferenceFactoryRegistry().register( createIdentifier("curios"), From f0da2e040c34e1bcf08220ee28b52163e02c90a1 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 11:43:52 +0200 Subject: [PATCH 39/59] docs: add note about grid view settings that became global to changelog --- CHANGELOG.md | 1 + .../src/main/resources/assets/refinedstorage2/lang/en_us.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f90e9936..9c12c5019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - The binding of a Security Card can now be cleared. - The Security Card tooltip and GUI now show whether the permission has been touched/changed in any way. - A global (fallback) permission set for a network can be defined using the Fallback Security Card instead of using an "unbound" Security Card. +- Smooth scrolling, screen size and max row stretch are no longer Grid-specific settings, but are now global settings. ### Fixed diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index ef681b9e1..afc6b3d08 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -270,6 +270,8 @@ "permission.refinedstorage2.security.description": "Whether the player can manage the security options for a network.", "text.autoconfig.refinedstorage2.title": "Refined Storage 2", "text.autoconfig.refinedstorage2.option.smoothScrolling": "Smooth scrolling", + "text.autoconfig.refinedstorage2.option.screenSize": "Screen size", + "text.autoconfig.refinedstorage2.option.maxRowsStretch": "Maximum amount of rows when screen size is stretched", "text.autoconfig.refinedstorage2.option.grid": "Grid", "text.autoconfig.refinedstorage2.option.grid.largeFont": "Large font", "text.autoconfig.refinedstorage2.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", @@ -281,8 +283,6 @@ "text.autoconfig.refinedstorage2.option.grid.resourceTypeId": "Resource type", "text.autoconfig.refinedstorage2.option.grid.sortingDirection": "Sorting direction", "text.autoconfig.refinedstorage2.option.grid.sortingType": "Sorting type", - "text.autoconfig.refinedstorage2.option.screenSize": "Screen size", - "text.autoconfig.refinedstorage2.option.maxRowsStretch": "Maximum amount of rows when screen size is stretched", "text.autoconfig.refinedstorage2.option.craftingGrid": "Crafting Grid", "text.autoconfig.refinedstorage2.option.craftingGrid.energyUsage": "Energy usage", "text.autoconfig.refinedstorage2.option.craftingGrid.craftingMatrixCloseBehavior": "Crafting matrix close behavior", From 8d6f354f4772af27a4ada5b4608c62e56e9db391 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 12:20:24 +0200 Subject: [PATCH 40/59] refactor: security card client communications should use platform permissions instead of id --- .../grid/AbstractGridContainerMenu.java | 2 +- .../grid/CraftingGridContainerMenu.java | 8 +-- .../common/grid/GridContainerMenu.java | 4 +- .../grid/WirelessGridContainerMenu.java | 4 +- .../AbstractSecurityCardContainerMenu.java | 49 +++++-------- .../security/AbstractSecurityCardScreen.java | 18 +++-- .../AbstractPortableGridContainerMenu.java | 4 +- .../PortableGridBlockContainerMenu.java | 4 +- .../PortableGridItemContainerMenu.java | 4 +- .../support/ClientToServerCommunications.java | 7 +- .../stretching/AbstractStretchingScreen.java | 4 +- .../stretching/ScreenSizeListener.java | 3 +- .../c2s/ClientToServerCommunicationsImpl.java | 16 +++-- .../SecurityCardResetPermissionPacket.java | 2 +- .../c2s/ClientToServerCommunicationsImpl.java | 70 ++++++++----------- .../SecurityCardResetPermissionPacket.java | 2 +- 16 files changed, 92 insertions(+), 109 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java index 743a10b61..589653507 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java @@ -236,7 +236,7 @@ public void removed(final Player playerEntity) { } @Override - public void initSlots(final int playerInventoryY) { + public void onScreenReady(final int playerInventoryY) { resetSlots(); addPlayerInventory(playerInventory, 8, playerInventoryY); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java index 4ef029e92..4ce75a353 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridContainerMenu.java @@ -41,7 +41,7 @@ public CraftingGridContainerMenu(final int syncId, final Inventory playerInvento super(Menus.INSTANCE.getCraftingGrid(), syncId, playerInventory, buf); this.source = new ClientCraftingGridSource(); this.player = playerInventory.player; - initSlots(0); + onScreenReady(0); registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); } @@ -51,7 +51,7 @@ public CraftingGridContainerMenu(final int syncId, final Inventory playerInvento super(Menus.INSTANCE.getCraftingGrid(), syncId, playerInventory, grid); this.source = new CraftingGridSourceImpl(grid); this.player = playerInventory.player; - initSlots(0); + onScreenReady(0); registerProperty(new ServerProperty<>( PropertyTypes.REDSTONE_MODE, grid::getRedstoneMode, @@ -88,8 +88,8 @@ public ItemStack quickMoveStack(final Player actor, final int slotIndex) { } @Override - public void initSlots(final int playerInventoryY) { - super.initSlots(playerInventoryY); + public void onScreenReady(final int playerInventoryY) { + super.onScreenReady(playerInventoryY); craftingMatrixSlots.clear(); for (int y = 0; y < 3; ++y) { for (int x = 0; x < 3; ++x) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java index d3ce3af2e..58270e006 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridContainerMenu.java @@ -12,13 +12,13 @@ public class GridContainerMenu extends AbstractGridContainerMenu { public GridContainerMenu(final int syncId, final Inventory playerInventory, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getGrid(), syncId, playerInventory, buf); - initSlots(0); + onScreenReady(0); registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); } GridContainerMenu(final int syncId, final Inventory playerInventory, final GridBlockEntity grid) { super(Menus.INSTANCE.getGrid(), syncId, playerInventory, grid); - initSlots(0); + onScreenReady(0); registerProperty(new ServerProperty<>( PropertyTypes.REDSTONE_MODE, grid::getRedstoneMode, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java index 33ccc6987..9803393a5 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridContainerMenu.java @@ -12,7 +12,7 @@ public class WirelessGridContainerMenu extends AbstractGridContainerMenu { public WirelessGridContainerMenu(final int syncId, final Inventory playerInventory, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getWirelessGrid(), syncId, playerInventory, buf); this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); - initSlots(0); + onScreenReady(0); } WirelessGridContainerMenu(final int syncId, @@ -21,6 +21,6 @@ public WirelessGridContainerMenu(final int syncId, final Inventory playerInvento final SlotReference slotReference) { super(Menus.INSTANCE.getWirelessGrid(), syncId, playerInventory, grid); this.disabledSlot = slotReference; - initSlots(0); + onScreenReady(0); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java index 272153b45..f9127232f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java @@ -11,7 +11,6 @@ import java.util.List; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; @@ -35,10 +34,7 @@ protected AbstractSecurityCardContainerMenu(final MenuType menuType, final boolean allowed = buf.readBoolean(); final boolean dirty = buf.readBoolean(); PlatformApi.INSTANCE.getPermissionRegistry().get(id).ifPresent(permission -> permissions.add(new Permission( - id, - permission.getName(), - permission.getDescription(), - permission.getOwnerName(), + permission, allowed, dirty ))); @@ -59,7 +55,7 @@ List getPermissions() { } @Override - public void initSlots(final int playerInventoryY) { + public void onScreenReady(final int playerInventoryY) { resetSlots(); addPlayerInventory(playerInventory, 8, playerInventoryY); } @@ -78,46 +74,40 @@ private void setPermission(final ResourceLocation permissionId, final boolean al } } - public void resetPermissionServer(final ResourceLocation permissionId) { + public void resetPermission(final ResourceLocation permissionId) { if (disabledSlot == null) { return; } - disabledSlot.resolve(playerInventory.player).ifPresent(stack -> resetPermissionServer(permissionId, stack)); + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> resetPermission(permissionId, stack)); } - private void resetPermissionServer(final ResourceLocation permissionId, final ItemStack stack) { + private void resetPermission(final ResourceLocation permissionId, final ItemStack stack) { if (stack.getItem() instanceof AbstractSecurityCardItem securityCardItem) { final SecurityCardModel model = securityCardItem.createModel(stack); model.resetPermission(permissionId); } } - Permission changePermission(final ResourceLocation permissionId, final boolean selected) { - Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardPermission(permissionId, selected); - return updatePermissionLocally(permissionId, selected, true); - } - - Permission resetPermission(final ResourceLocation permissionId) { - final PlatformPermission permission = PlatformApi.INSTANCE.getPermissionRegistry() - .get(permissionId) - .orElseThrow(); + Permission resetPermission(final PlatformPermission permission) { final boolean allowed = permission.isAllowedByDefault(); - Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardResetPermission(permissionId); - return updatePermissionLocally(permissionId, allowed, false); + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardResetPermission(permission); + return updatePermissionLocally(permission, allowed, false); + } + + Permission changePermission(final PlatformPermission permission, final boolean selected) { + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardPermission(permission, selected); + return updatePermissionLocally(permission, selected, true); } - private Permission updatePermissionLocally(final ResourceLocation permissionId, + private Permission updatePermissionLocally(final PlatformPermission permission, final boolean allowed, final boolean dirty) { - final Permission localPermission = permissions.stream().filter(p -> p.id().equals(permissionId)) + final Permission localPermission = permissions.stream().filter(p -> p.platformPermission == permission) .findFirst() .orElseThrow(); final int index = permissions.indexOf(localPermission); final Permission updatedLocalPermission = new Permission( - localPermission.id(), - localPermission.name(), - localPermission.description(), - localPermission.ownerName(), + localPermission.platformPermission, allowed, dirty ); @@ -125,11 +115,6 @@ private Permission updatePermissionLocally(final ResourceLocation permissionId, return updatedLocalPermission; } - record Permission(ResourceLocation id, - Component name, - Component description, - Component ownerName, - boolean allowed, - boolean dirty) { + record Permission(PlatformPermission platformPermission, boolean allowed, boolean dirty) { } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java index cdc1d2760..1c5b9ecee 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.common.support.stretching.AbstractStretchingScreen; import com.refinedmods.refinedstorage2.platform.common.support.widget.CustomCheckboxWidget; @@ -85,14 +86,18 @@ private void updatePermission(final AbstractSecurityCardContainerMenu.Permission final Button resetButton, final CustomCheckboxWidget checkbox, final boolean allowed) { - updateCheckboxAndResetButton(checkbox, resetButton, menu.changePermission(menuPermission.id(), allowed)); + updateCheckboxAndResetButton(checkbox, resetButton, menu.changePermission( + menuPermission.platformPermission(), + allowed + )); } private Tooltip getPermissionTooltip(final AbstractSecurityCardContainerMenu.Permission menuPermission) { - final MutableComponent ownerName = menuPermission.ownerName().copy().withStyle( + final PlatformPermission permission = menuPermission.platformPermission(); + final MutableComponent ownerName = permission.getOwnerName().copy().withStyle( Style.EMPTY.withItalic(true).withColor(ChatFormatting.GRAY) ); - final MutableComponent tooltip = menuPermission.description().copy().append("\n").append(ownerName); + final MutableComponent tooltip = permission.getDescription().copy().append("\n").append(ownerName); return Tooltip.create(menuPermission.dirty() ? tooltip.append("\n").append(MODIFIED_TITLE) : tooltip); } @@ -112,7 +117,7 @@ private Button createPermissionResetButton(final AbstractSecurityCardContainerMe private void resetPermission(final AbstractSecurityCardContainerMenu.Permission menuPermission, final CustomCheckboxWidget checkbox, final Button resetButton) { - updateCheckboxAndResetButton(checkbox, resetButton, menu.resetPermission(menuPermission.id())); + updateCheckboxAndResetButton(checkbox, resetButton, menu.resetPermission(menuPermission.platformPermission())); } private void updateCheckboxAndResetButton(final CustomCheckboxWidget checkbox, @@ -125,10 +130,11 @@ private void updateCheckboxAndResetButton(final CustomCheckboxWidget checkbox, } private Component getPermissionName(final AbstractSecurityCardContainerMenu.Permission menuPermission) { + final Component name = menuPermission.platformPermission().getName(); if (!menuPermission.dirty()) { - return menuPermission.name(); + return name; } - return menuPermission.name().copy().append(" (*)").setStyle(Style.EMPTY.withItalic(true)); + return name.copy().append(" (*)").setStyle(Style.EMPTY.withItalic(true)); } private int getPermissionY(final int index) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java index 82dc1c709..814003ce2 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridContainerMenu.java @@ -65,8 +65,8 @@ protected boolean canTransferSlot(final Slot slot) { } @Override - public void initSlots(final int playerInventoryY) { - super.initSlots(playerInventoryY); + public void onScreenReady(final int playerInventoryY) { + super.onScreenReady(playerInventoryY); diskSlot = new ValidatedSlot( diskInventory, 0, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java index 799c8ac19..047058204 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridBlockContainerMenu.java @@ -15,7 +15,7 @@ public PortableGridBlockContainerMenu(final int syncId, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getPortableGridBlock(), syncId, playerInventory, buf); registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); - initSlots(0); + this.onScreenReady(0); } PortableGridBlockContainerMenu(final int syncId, @@ -34,6 +34,6 @@ public PortableGridBlockContainerMenu(final int syncId, portableGrid::getRedstoneMode, portableGrid::setRedstoneMode )); - initSlots(0); + this.onScreenReady(0); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java index c6c58ffb2..32388cb79 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGridItemContainerMenu.java @@ -16,7 +16,7 @@ public PortableGridItemContainerMenu(final int syncId, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getPortableGridItem(), syncId, playerInventory, buf); this.disabledSlot = PlatformApi.INSTANCE.getSlotReference(buf).orElse(null); - initSlots(0); + this.onScreenReady(0); } PortableGridItemContainerMenu(final int syncId, @@ -34,6 +34,6 @@ public PortableGridItemContainerMenu(final int syncId, energyStorage ); this.disabledSlot = slotReference; - initSlots(0); + this.onScreenReady(0); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java index c1d47204b..fd6489b7e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java @@ -3,6 +3,7 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridExtractMode; import com.refinedmods.refinedstorage2.api.grid.operations.GridInsertMode; import com.refinedmods.refinedstorage2.platform.api.grid.GridScrollMode; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.PropertyType; @@ -12,8 +13,6 @@ import java.util.UUID; import javax.annotation.Nullable; -import net.minecraft.resources.ResourceLocation; - public interface ClientToServerCommunications { void sendGridExtract(PlatformResourceKey resource, GridExtractMode mode, boolean cursor); @@ -39,9 +38,9 @@ public interface ClientToServerCommunications { void sendUseNetworkBoundItem(SlotReference slotReference); - void sendSecurityCardPermission(ResourceLocation permissionId, boolean allowed); + void sendSecurityCardPermission(PlatformPermission permission, boolean allowed); - void sendSecurityCardResetPermission(ResourceLocation permissionId); + void sendSecurityCardResetPermission(PlatformPermission permission); void sendSecurityCardBoundPlayer(@Nullable UUID playerId); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java index 8c73972d9..7bbd61d55 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/AbstractStretchingScreen.java @@ -37,7 +37,7 @@ protected void init() { this.imageHeight = TOP_HEIGHT + (ROW_SIZE * visibleRows) + getBottomHeight(); this.inventoryLabelY = imageHeight - INVENTORY_INCLUDING_TITLE_HEIGHT + 4; - getMenu().initSlots(imageHeight - INVENTORY_INCLUDING_TITLE_HEIGHT + 17); + getMenu().onScreenReady(imageHeight - INVENTORY_INCLUDING_TITLE_HEIGHT + 17); super.init(); @@ -66,7 +66,7 @@ protected final int getScrollbarOffset() { } protected void scrollbarChanged(final int rows) { - // empty + // no op } @Override diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java index f26c565bf..275a8bcbf 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/stretching/ScreenSizeListener.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage2.platform.common.support.stretching; +@FunctionalInterface public interface ScreenSizeListener { - void initSlots(int playerInventoryY); + void onScreenReady(int playerInventoryY); } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java index d61df1fc2..3ba6c6123 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java @@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridInsertMode; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.grid.GridScrollMode; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.api.support.resource.ResourceType; @@ -131,19 +132,22 @@ public void sendUseNetworkBoundItem(final SlotReference slotReference) { } @Override - public void sendSecurityCardPermission(final ResourceLocation permissionId, final boolean allowed) { - sendToServer( + public void sendSecurityCardPermission(final PlatformPermission permission, final boolean allowed) { + PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).ifPresent(id -> sendToServer( PacketIds.SECURITY_CARD_PERMISSION, buf -> { - buf.writeResourceLocation(permissionId); + buf.writeResourceLocation(id); buf.writeBoolean(allowed); } - ); + )); } @Override - public void sendSecurityCardResetPermission(final ResourceLocation permissionId) { - sendToServer(PacketIds.SECURITY_CARD_RESET_PERMISSION, buf -> buf.writeResourceLocation(permissionId)); + public void sendSecurityCardResetPermission(final PlatformPermission permission) { + PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).ifPresent(id -> sendToServer( + PacketIds.SECURITY_CARD_RESET_PERMISSION, + buf -> buf.writeResourceLocation(id) + )); } @Override diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java index ded155bf9..de26b2f54 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardResetPermissionPacket.java @@ -19,7 +19,7 @@ public void receive(final MinecraftServer server, final PacketSender responseSender) { final ResourceLocation permissionId = buf.readResourceLocation(); if (player.containerMenu instanceof AbstractSecurityCardContainerMenu securityCardContainerMenu) { - server.execute(() -> securityCardContainerMenu.resetPermissionServer(permissionId)); + server.execute(() -> securityCardContainerMenu.resetPermission(permissionId)); } } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java index 3380b0937..35b2f8b7c 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java @@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridInsertMode; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.grid.GridScrollMode; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.api.support.resource.ResourceType; @@ -16,11 +17,10 @@ import javax.annotation.Nullable; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.network.PacketDistributor; public class ClientToServerCommunicationsImpl implements ClientToServerCommunications { - private void sendPacket(final CustomPacketPayload packet) { + private void sendToServer(final CustomPacketPayload packet) { PacketDistributor.SERVER.noArg().send(packet); } @@ -29,14 +29,9 @@ public void sendGridExtract(final PlatformResourceKey resource, final GridExtractMode mode, final boolean cursor) { final ResourceType resourceType = resource.getResourceType(); - PlatformApi.INSTANCE.getResourceTypeRegistry().getId(resourceType) - .ifPresent(id -> sendPacket(new GridExtractPacket( - resourceType, - id, - resource, - mode, - cursor - ))); + PlatformApi.INSTANCE.getResourceTypeRegistry().getId(resourceType).ifPresent(id -> sendToServer( + new GridExtractPacket(resourceType, id, resource, mode, cursor) + )); } @Override @@ -44,87 +39,80 @@ public void sendGridScroll(final PlatformResourceKey resource, final GridScrollMode mode, final int slotIndex) { final ResourceType resourceType = resource.getResourceType(); - PlatformApi.INSTANCE.getResourceTypeRegistry() - .getId(resourceType) - .ifPresent(id -> sendPacket(new GridScrollPacket( - resourceType, - id, - resource, - mode, - slotIndex - ))); + PlatformApi.INSTANCE.getResourceTypeRegistry().getId(resourceType).ifPresent(id -> sendToServer( + new GridScrollPacket(resourceType, id, resource, mode, slotIndex) + )); } @Override public void sendGridInsert(final GridInsertMode mode, final boolean tryAlternatives) { - sendPacket(new GridInsertPacket(mode == GridInsertMode.SINGLE_RESOURCE, tryAlternatives)); + sendToServer(new GridInsertPacket(mode == GridInsertMode.SINGLE_RESOURCE, tryAlternatives)); } @Override public void sendCraftingGridClear(final boolean toPlayerInventory) { - sendPacket(new CraftingGridClearPacket(toPlayerInventory)); + sendToServer(new CraftingGridClearPacket(toPlayerInventory)); } @Override public void sendCraftingGridRecipeTransfer(final List> recipe) { - sendPacket(new CraftingGridRecipeTransferPacket(recipe)); + sendToServer(new CraftingGridRecipeTransferPacket(recipe)); } @Override public void sendPropertyChange(final PropertyType type, final T value) { - sendPacket(new PropertyChangePacket(type.id(), type.serializer().apply(value))); + sendToServer(new PropertyChangePacket(type.id(), type.serializer().apply(value))); } @Override public void sendStorageInfoRequest(final UUID storageId) { - sendPacket(new StorageInfoRequestPacket(storageId)); + sendToServer(new StorageInfoRequestPacket(storageId)); } @Override public void sendResourceSlotChange(final int slotIndex, final boolean tryAlternatives) { - sendPacket(new ResourceSlotChangePacket(slotIndex, tryAlternatives)); + sendToServer(new ResourceSlotChangePacket(slotIndex, tryAlternatives)); } @Override public void sendResourceFilterSlotChange(final PlatformResourceKey resource, final int slotIndex) { final ResourceType resourceType = resource.getResourceType(); - PlatformApi.INSTANCE.getResourceTypeRegistry().getId(resourceType).ifPresent( - id -> sendPacket(new ResourceFilterSlotChangePacket( - slotIndex, - resource, - resourceType, - id - )) - ); + PlatformApi.INSTANCE.getResourceTypeRegistry().getId(resourceType).ifPresent(id -> sendToServer( + new ResourceFilterSlotChangePacket(slotIndex, resource, resourceType, id) + )); } @Override public void sendResourceSlotAmountChange(final int slotIndex, final long amount) { - sendPacket(new ResourceSlotAmountChangePacket(slotIndex, amount)); + sendToServer(new ResourceSlotAmountChangePacket(slotIndex, amount)); } @Override public void sendSingleAmountChange(final double amount) { - sendPacket(new SingleAmountChangePacket(amount)); + sendToServer(new SingleAmountChangePacket(amount)); } @Override public void sendUseNetworkBoundItem(final SlotReference slotReference) { - sendPacket(new UseNetworkBoundItemPacket(slotReference)); + sendToServer(new UseNetworkBoundItemPacket(slotReference)); } @Override - public void sendSecurityCardPermission(final ResourceLocation permissionId, final boolean allowed) { - sendPacket(new SecurityCardPermissionPacket(permissionId, allowed)); + public void sendSecurityCardPermission(final PlatformPermission permission, final boolean allowed) { + PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).ifPresent(id -> sendToServer( + new SecurityCardPermissionPacket(id, allowed) + )); } @Override - public void sendSecurityCardResetPermission(final ResourceLocation permissionId) { - sendPacket(new SecurityCardResetPermissionPacket(permissionId)); + public void sendSecurityCardResetPermission(final PlatformPermission permission) { + PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).ifPresent(id -> sendToServer( + new SecurityCardResetPermissionPacket(id) + )); } @Override public void sendSecurityCardBoundPlayer(@Nullable final UUID playerId) { - sendPacket(new SecurityCardBoundPlayerPacket(playerId)); + sendToServer(new SecurityCardBoundPlayerPacket(playerId)); } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java index cdd621829..1831a87a1 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardResetPermissionPacket.java @@ -16,7 +16,7 @@ public static SecurityCardResetPermissionPacket decode(final FriendlyByteBuf buf public static void handle(final SecurityCardResetPermissionPacket packet, final PlayPayloadContext ctx) { ctx.player().ifPresent(player -> ctx.workHandler().submitAsync(() -> { if (player.containerMenu instanceof AbstractSecurityCardContainerMenu securityCardContainerMenu) { - securityCardContainerMenu.resetPermissionServer(packet.permissionId); + securityCardContainerMenu.resetPermission(packet.permissionId); } })); } From 3def5dd8144a89e6dd8e13b0f43808a5728ed52c Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 12:39:57 +0200 Subject: [PATCH 41/59] chore: sonar issues --- .../common/AbstractModInitializer.java | 44 +----- .../grid/screen/AbstractGridScreen.java | 24 ++- .../security/AbstractSecurityCardItem.java | 7 +- .../security/AbstractSecurityCardScreen.java | 2 +- .../security/FallbackSecurityCardItem.java | 6 + .../security/PlayerSecurityCardModel.java | 2 +- .../common/security/SecurityCardItem.java | 31 ++-- .../common/security/SecurityCardModel.java | 2 +- .../support/widget/CustomCheckboxWidget.java | 3 +- .../platform/fabric/ModInitializerImpl.java | 145 ++++++++++-------- .../platform/forge/ModInitializer.java | 99 +++++++----- 11 files changed, 189 insertions(+), 176 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index 15419d092..b5b1db776 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -43,7 +43,6 @@ import com.refinedmods.refinedstorage2.platform.common.grid.GridBlockEntity; import com.refinedmods.refinedstorage2.platform.common.grid.GridContainerMenu; import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridContainerMenu; -import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceBlock; import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceBlockEntity; import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceContainerMenu; @@ -57,9 +56,7 @@ import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardContainerMenu; -import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; -import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardItem; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.StorageTypes; @@ -71,7 +68,6 @@ import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.AbstractPortableGridBlockEntity; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlock; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockContainerMenu; -import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockItem; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridItemContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridLootItemFunction; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridType; @@ -137,7 +133,6 @@ import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CRAFTING_GRID; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CREATIVE_CONTROLLER; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CREATIVE_PORTABLE_GRID; -import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CREATIVE_WIRELESS_GRID; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.DESTRUCTION_CORE; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.DESTRUCTOR; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.DETECTOR; @@ -324,16 +319,7 @@ protected final void registerBlocks( ))); } - protected final void registerItems( - final RegistryCallback callback, - final Supplier regulatorUpgradeItemSupplier, - final Supplier wirelessGridItemSupplier, - final Supplier creativeWirelessGridItemSupplier, - final Supplier portableGridBlockItemSupplier, - final Supplier creativePortableGridBlockItemSupplier, - final Supplier securityCardItemSupplier, - final Supplier fallbackSecurityCardItemSupplier - ) { + protected final void registerItems(final RegistryCallback callback) { registerSimpleItems(callback); Blocks.INSTANCE.getGrid().registerItems(callback); Blocks.INSTANCE.getCraftingGrid().registerItems(callback); @@ -350,23 +336,7 @@ protected final void registerItems( Blocks.INSTANCE.getNetworkReceiver().registerItems(callback, Items.INSTANCE::addNetworkReceiver); Blocks.INSTANCE.getNetworkTransmitter().registerItems(callback, Items.INSTANCE::addNetworkTransmitter); registerStorageItems(callback); - registerUpgrades(callback, regulatorUpgradeItemSupplier); - Items.INSTANCE.setWirelessGrid(callback.register(WIRELESS_GRID, wirelessGridItemSupplier)); - Items.INSTANCE.setCreativeWirelessGrid(callback.register( - CREATIVE_WIRELESS_GRID, - creativeWirelessGridItemSupplier - )); - callback.register(STORAGE_MONITOR, () -> new SimpleBlockItem(Blocks.INSTANCE.getStorageMonitor())); - Items.INSTANCE.setPortableGrid(callback.register(PORTABLE_GRID, portableGridBlockItemSupplier)); - Items.INSTANCE.setCreativePortableGrid(callback.register( - CREATIVE_PORTABLE_GRID, - creativePortableGridBlockItemSupplier - )); - Items.INSTANCE.setSecurityCard(callback.register(SECURITY_CARD, securityCardItemSupplier)); - Items.INSTANCE.setFallbackSecurityCard(callback.register( - FALLBACK_SECURITY_CARD, - fallbackSecurityCardItemSupplier - )); + registerUpgrades(callback); } private void registerSimpleItems(final RegistryCallback callback) { @@ -381,6 +351,7 @@ private void registerSimpleItems(final RegistryCallback callback) { Items.INSTANCE.setWrench(callback.register(WRENCH, WrenchItem::new)); Items.INSTANCE.setStorageHousing(callback.register(STORAGE_HOUSING, SimpleItem::new)); callback.register(MACHINE_CASING, () -> new SimpleBlockItem(Blocks.INSTANCE.getMachineCasing())); + callback.register(STORAGE_MONITOR, () -> new SimpleBlockItem(Blocks.INSTANCE.getStorageMonitor())); callback.register(INTERFACE, () -> Blocks.INSTANCE.getInterface().createBlockItem()); Items.INSTANCE.setConstructionCore(callback.register(CONSTRUCTION_CORE, SimpleItem::new)); Items.INSTANCE.setDestructionCore(callback.register(DESTRUCTION_CORE, SimpleItem::new)); @@ -443,10 +414,7 @@ private void registerFluidStorageItems(final RegistryCallback callback, ); } - private void registerUpgrades( - final RegistryCallback callback, - final Supplier regulatorUpgradeItemSupplier - ) { + private void registerUpgrades(final RegistryCallback callback) { Items.INSTANCE.setUpgrade(callback.register( ContentIds.UPGRADE, SimpleItem::new @@ -493,10 +461,6 @@ private void registerUpgrades( ) ); Items.INSTANCE.setSilkTouchUpgrade(silkTouchUpgrade); - Items.INSTANCE.setRegulatorUpgrade(callback.register( - ContentIds.REGULATOR_UPGRADE, - regulatorUpgradeItemSupplier - )); Items.INSTANCE.setRangeUpgrade(callback.register( ContentIds.RANGE_UPGRADE, () -> new RangeUpgradeItem(PlatformApi.INSTANCE.getUpgradeRegistry(), false) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java index 889c89b37..65910f8ac 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/screen/AbstractGridScreen.java @@ -178,25 +178,23 @@ protected void renderRows(final GuiGraphics graphics, final int mouseY) { currentGridSlotIndex = -1; for (int row = 0; row < Math.max(totalRows, rows); ++row) { - renderRow(graphics, mouseX, mouseY, x, y, topHeight, row, rows); + final int rowX = x + 7; + final int rowY = y + topHeight + (row * ROW_SIZE) - getScrollbarOffset(); + final boolean isOutOfFrame = (rowY < y + topHeight - ROW_SIZE) + || (rowY > y + topHeight + (ROW_SIZE * rows)); + if (isOutOfFrame) { + continue; + } + renderRow(graphics, mouseX, mouseY, rowX, rowY, row); } } private void renderRow(final GuiGraphics graphics, final int mouseX, final int mouseY, - final int x, - final int y, - final int topHeight, - final int row, - final int visibleRows) { - final int rowX = x + 7; - final int rowY = y + topHeight + (row * ROW_SIZE) - getScrollbarOffset(); - final boolean isOutOfFrame = (rowY < y + topHeight - ROW_SIZE) - || (rowY > y + topHeight + (ROW_SIZE * visibleRows)); - if (isOutOfFrame) { - return; - } + final int rowX, + final int rowY, + final int row) { graphics.blit(getTexture(), rowX, rowY, 0, 238, 162, ROW_SIZE); for (int column = 0; column < COLUMNS; ++column) { renderCell(graphics, mouseX, mouseY, rowX, rowY, (row * COLUMNS) + column, column); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java index 03c1ed217..509c158b1 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java @@ -33,14 +33,13 @@ public void appendHoverText(final ItemStack stack, final TooltipFlag flag) { super.appendHoverText(stack, level, lines, flag); final T model = createModel(stack); - if (addTooltip(stack, lines, model)) { + addTooltip(lines, model); + if (model.isActive()) { addPermissions(lines, model); } } - protected boolean addTooltip(final ItemStack stack, final List lines, final T model) { - return true; - } + abstract void addTooltip(List lines, T model); private void addPermissions(final List lines, final SecurityCardModel model) { PlatformApi.INSTANCE.getPermissionRegistry().getAll().forEach(permission -> { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java index 1c5b9ecee..84d8e2b78 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardScreen.java @@ -32,7 +32,7 @@ public abstract class AbstractSecurityCardScreen permissions = new ArrayList<>(); - public AbstractSecurityCardScreen(final T menu, final Inventory playerInventory, final Component text) { + protected AbstractSecurityCardScreen(final T menu, final Inventory playerInventory, final Component text) { super(menu, playerInventory, text); this.inventoryLabelY = 97; this.imageWidth = 193; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java index 0fa8b8460..4bdd4a680 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java @@ -3,6 +3,7 @@ import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import java.util.List; import java.util.Optional; import net.minecraft.network.chat.Component; @@ -19,6 +20,11 @@ public FallbackSecurityCardItem() { super(new Item.Properties().stacksTo(1)); } + @Override + void addTooltip(final List lines, final SecurityCardModel model) { + // no op + } + @Override SecurityCardModel createModel(final ItemStack stack) { return new SecurityCardModel(stack); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java index ffc0c8279..606b3ab7b 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java @@ -42,7 +42,7 @@ void setBoundPlayer(@Nullable final ServerPlayer player) { @Override boolean isActive() { - return super.isActive() && isActive(stack); + return isActive(stack); } static boolean isActive(final ItemStack stack) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java index c10b17af0..3347e5c5a 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java @@ -23,6 +23,20 @@ public SecurityCardItem() { super(new Item.Properties().stacksTo(1)); } + @Override + void addTooltip(final List lines, final PlayerSecurityCardModel model) { + final String boundPlayerName = model.getBoundPlayerName(); + if (boundPlayerName == null) { + lines.add(createTranslation("item", "security_card.unbound").withStyle(ChatFormatting.GRAY)); + return; + } + lines.add(createTranslation( + "item", + "security_card.bound", + Component.literal(boundPlayerName).withStyle(ChatFormatting.YELLOW) + ).withStyle(ChatFormatting.GRAY)); + } + @Override void tryClear(final ServerPlayer player, final PlayerSecurityCardModel model) { if (model.isCleared()) { @@ -41,23 +55,6 @@ private void bind(final ServerPlayer player, final PlayerSecurityCardModel model )); } - @Override - protected boolean addTooltip(final ItemStack stack, - final List lines, - final PlayerSecurityCardModel model) { - final String boundPlayerName = model.getBoundPlayerName(); - if (boundPlayerName == null) { - lines.add(createTranslation("item", "security_card.unbound").withStyle(ChatFormatting.GRAY)); - return false; - } - lines.add(createTranslation( - "item", - "security_card.bound", - Component.literal(boundPlayerName).withStyle(ChatFormatting.YELLOW) - ).withStyle(ChatFormatting.GRAY)); - return true; - } - @Override public Optional getTooltipImage(final ItemStack stack) { return Optional.of(new HelpTooltipComponent(isActive(stack) ? BOUND_HELP : UNBOUND_HELP)); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java index 8b6c09ba0..37d24223d 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java @@ -50,7 +50,7 @@ void resetPermission(final ResourceLocation permissionId) { } boolean isActive() { - return stack.getTag() != null && stack.getTag().contains(TAG_PERMISSIONS); + return true; } boolean isCleared() { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java index ed1032afb..66d8b8fa5 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/widget/CustomCheckboxWidget.java @@ -12,7 +12,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -// A custom checkbox so we can change the font color. +// A custom checkbox so that we can change the font color. public class CustomCheckboxWidget extends AbstractButton { private static final ResourceLocation CHECKBOX_SELECTED_HIGHLIGHTED_SPRITE = new ResourceLocation( "widget/checkbox_selected_highlighted" @@ -66,6 +66,7 @@ public void updateWidgetNarration(final NarrationElementOutput output) { } } + @Override public void renderWidget(final GuiGraphics graphics, final int mouseX, final int mouseY, final float partialTicks) { final Minecraft minecraft = Minecraft.getInstance(); RenderSystem.enableDepthTest(); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java index a24899b59..bc77c1b31 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java @@ -11,6 +11,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.DirectRegistryCallback; import com.refinedmods.refinedstorage2.platform.common.content.Items; import com.refinedmods.refinedstorage2.platform.common.content.MenuTypeFactory; +import com.refinedmods.refinedstorage2.platform.common.content.RegistryCallback; import com.refinedmods.refinedstorage2.platform.common.grid.WirelessGridItem; import com.refinedmods.refinedstorage2.platform.common.iface.InterfaceBlockEntity; import com.refinedmods.refinedstorage2.platform.common.iface.InterfacePlatformExternalStorageProviderFactory; @@ -80,6 +81,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -89,6 +91,13 @@ import org.slf4j.LoggerFactory; import team.reborn.energy.api.EnergyStorage; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CREATIVE_PORTABLE_GRID; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CREATIVE_WIRELESS_GRID; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.FALLBACK_SECURITY_CARD; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.PORTABLE_GRID; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.REGULATOR_UPGRADE; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.SECURITY_CARD; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.WIRELESS_GRID; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; public class ModInitializerImpl extends AbstractModInitializer implements ModInitializer { @@ -199,26 +208,56 @@ private void registerContent() { (pos, state) -> new FabricPortableGridBlockEntity(PortableGridType.NORMAL, pos, state), (pos, state) -> new FabricPortableGridBlockEntity(PortableGridType.CREATIVE, pos, state) ); - registerItems( - new DirectRegistryCallback<>(BuiltInRegistries.ITEM), - () -> new RegulatorUpgradeItem(PlatformApi.INSTANCE.getUpgradeRegistry()) { - @Override - public boolean allowNbtUpdateAnimation(final Player player, - final InteractionHand hand, - final ItemStack oldStack, - final ItemStack newStack) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); - } - }, - () -> new WirelessGridItem() { + final DirectRegistryCallback itemRegistryCallback = new DirectRegistryCallback<>(BuiltInRegistries.ITEM); + registerItems(itemRegistryCallback); + registerCustomItems(itemRegistryCallback); + registerUpgradeMappings(); + registerCreativeModeTab(); + registerBlockEntities( + new DirectRegistryCallback<>(BuiltInRegistries.BLOCK_ENTITY_TYPE), + new BlockEntityTypeFactory() { @Override - public boolean allowNbtUpdateAnimation(final Player player, - final InteractionHand hand, - final ItemStack oldStack, - final ItemStack newStack) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + public BlockEntityType create(final BlockEntitySupplier factory, + final Block... allowedBlocks) { + return new BlockEntityType<>(factory::create, new HashSet<>(Arrays.asList(allowedBlocks)), null); } }, + FabricDiskDriveBlockEntity::new, + (pos, state) -> new FabricPortableGridBlockEntity(PortableGridType.NORMAL, pos, state), + (pos, state) -> new FabricPortableGridBlockEntity(PortableGridType.CREATIVE, pos, state) + ); + registerMenus(new DirectRegistryCallback<>(BuiltInRegistries.MENU), new MenuTypeFactory() { + @Override + public MenuType create(final MenuSupplier supplier) { + return new ExtendedScreenHandlerType<>(supplier::create); + } + }); + registerLootFunctions(new DirectRegistryCallback<>(BuiltInRegistries.LOOT_FUNCTION_TYPE)); + } + + private void registerCustomItems(final RegistryCallback callback) { + Items.INSTANCE.setRegulatorUpgrade(callback.register(REGULATOR_UPGRADE, () -> new RegulatorUpgradeItem( + PlatformApi.INSTANCE.getUpgradeRegistry() + ) { + @Override + public boolean allowNbtUpdateAnimation(final Player player, + final InteractionHand hand, + final ItemStack oldStack, + final ItemStack newStack) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setWirelessGrid(callback.register(WIRELESS_GRID, () -> new WirelessGridItem() { + @Override + public boolean allowNbtUpdateAnimation(final Player player, + final InteractionHand hand, + final ItemStack oldStack, + final ItemStack newStack) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setCreativeWirelessGrid(callback.register( + CREATIVE_WIRELESS_GRID, () -> new WirelessGridItem() { @Override public boolean allowNbtUpdateAnimation(final Player player, @@ -227,16 +266,21 @@ public boolean allowNbtUpdateAnimation(final Player player, final ItemStack newStack) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } - }, - () -> new PortableGridBlockItem(Blocks.INSTANCE.getPortableGrid(), PortableGridType.NORMAL) { - @Override - public boolean allowNbtUpdateAnimation(final Player player, - final InteractionHand hand, - final ItemStack oldStack, - final ItemStack newStack) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); - } - }, + } + )); + Items.INSTANCE.setPortableGrid(callback.register(PORTABLE_GRID, () -> new PortableGridBlockItem( + Blocks.INSTANCE.getPortableGrid(), PortableGridType.NORMAL + ) { + @Override + public boolean allowNbtUpdateAnimation(final Player player, + final InteractionHand hand, + final ItemStack oldStack, + final ItemStack newStack) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setCreativePortableGrid(callback.register( + CREATIVE_PORTABLE_GRID, () -> new PortableGridBlockItem(Blocks.INSTANCE.getCreativePortableGrid(), PortableGridType.CREATIVE) { @Override public boolean allowNbtUpdateAnimation(final Player player, @@ -245,16 +289,19 @@ public boolean allowNbtUpdateAnimation(final Player player, final ItemStack newStack) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } - }, - () -> new SecurityCardItem() { - @Override - public boolean allowNbtUpdateAnimation(final Player player, - final InteractionHand hand, - final ItemStack oldStack, - final ItemStack newStack) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); - } - }, + } + )); + Items.INSTANCE.setSecurityCard(callback.register(SECURITY_CARD, () -> new SecurityCardItem() { + @Override + public boolean allowNbtUpdateAnimation(final Player player, + final InteractionHand hand, + final ItemStack oldStack, + final ItemStack newStack) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setFallbackSecurityCard(callback.register( + FALLBACK_SECURITY_CARD, () -> new FallbackSecurityCardItem() { @Override public boolean allowNbtUpdateAnimation(final Player player, @@ -264,29 +311,7 @@ public boolean allowNbtUpdateAnimation(final Player player, return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } } - ); - registerUpgradeMappings(); - registerCreativeModeTab(); - registerBlockEntities( - new DirectRegistryCallback<>(BuiltInRegistries.BLOCK_ENTITY_TYPE), - new BlockEntityTypeFactory() { - @Override - public BlockEntityType create(final BlockEntitySupplier factory, - final Block... allowedBlocks) { - return new BlockEntityType<>(factory::create, new HashSet<>(Arrays.asList(allowedBlocks)), null); - } - }, - FabricDiskDriveBlockEntity::new, - (pos, state) -> new FabricPortableGridBlockEntity(PortableGridType.NORMAL, pos, state), - (pos, state) -> new FabricPortableGridBlockEntity(PortableGridType.CREATIVE, pos, state) - ); - registerMenus(new DirectRegistryCallback<>(BuiltInRegistries.MENU), new MenuTypeFactory() { - @Override - public MenuType create(final MenuSupplier supplier) { - return new ExtendedScreenHandlerType<>(supplier::create); - } - }); - registerLootFunctions(new DirectRegistryCallback<>(BuiltInRegistries.LOOT_FUNCTION_TYPE)); + )); } private void registerCreativeModeTab() { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index 1c865051d..79dade470 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -100,6 +100,13 @@ import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.RegisterEvent; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CREATIVE_PORTABLE_GRID; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.CREATIVE_WIRELESS_GRID; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.FALLBACK_SECURITY_CARD; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.PORTABLE_GRID; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.REGULATOR_UPGRADE; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.SECURITY_CARD; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.WIRELESS_GRID; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.MOD_ID; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; @@ -208,24 +215,33 @@ private void registerBlocks(final IEventBus eventBus) { } private void registerItems(final IEventBus eventBus) { - registerItems( - new ForgeRegistryCallback<>(itemRegistry), - () -> new RegulatorUpgradeItem(PlatformApi.INSTANCE.getUpgradeRegistry()) { - @Override - public boolean shouldCauseReequipAnimation(final ItemStack oldStack, - final ItemStack newStack, - final boolean slotChanged) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); - } - }, - () -> new WirelessGridItem() { - @Override - public boolean shouldCauseReequipAnimation(final ItemStack oldStack, - final ItemStack newStack, - final boolean slotChanged) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); - } - }, + final RegistryCallback callback = new ForgeRegistryCallback<>(itemRegistry); + registerItems(callback); + registerCustomItems(callback); + itemRegistry.register(eventBus); + } + + private void registerCustomItems(final RegistryCallback callback) { + Items.INSTANCE.setRegulatorUpgrade(callback.register(REGULATOR_UPGRADE, () -> new RegulatorUpgradeItem( + PlatformApi.INSTANCE.getUpgradeRegistry() + ) { + @Override + public boolean shouldCauseReequipAnimation(final ItemStack oldStack, + final ItemStack newStack, + final boolean slotChanged) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setWirelessGrid(callback.register(WIRELESS_GRID, () -> new WirelessGridItem() { + @Override + public boolean shouldCauseReequipAnimation(final ItemStack oldStack, + final ItemStack newStack, + final boolean slotChanged) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setCreativeWirelessGrid(callback.register( + CREATIVE_WIRELESS_GRID, () -> new WirelessGridItem() { @Override public boolean shouldCauseReequipAnimation(final ItemStack oldStack, @@ -233,15 +249,20 @@ public boolean shouldCauseReequipAnimation(final ItemStack oldStack, final boolean slotChanged) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } - }, - () -> new PortableGridBlockItem(Blocks.INSTANCE.getPortableGrid(), PortableGridType.NORMAL) { - @Override - public boolean shouldCauseReequipAnimation(final ItemStack oldStack, - final ItemStack newStack, - final boolean slotChanged) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); - } - }, + } + )); + Items.INSTANCE.setPortableGrid(callback.register(PORTABLE_GRID, () -> new PortableGridBlockItem( + Blocks.INSTANCE.getPortableGrid(), PortableGridType.NORMAL + ) { + @Override + public boolean shouldCauseReequipAnimation(final ItemStack oldStack, + final ItemStack newStack, + final boolean slotChanged) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setCreativePortableGrid(callback.register( + CREATIVE_PORTABLE_GRID, () -> new PortableGridBlockItem(Blocks.INSTANCE.getCreativePortableGrid(), PortableGridType.CREATIVE) { @Override public boolean shouldCauseReequipAnimation(final ItemStack oldStack, @@ -249,15 +270,18 @@ public boolean shouldCauseReequipAnimation(final ItemStack oldStack, final boolean slotChanged) { return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } - }, - () -> new SecurityCardItem() { - @Override - public boolean shouldCauseReequipAnimation(final ItemStack oldStack, - final ItemStack newStack, - final boolean slotChanged) { - return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); - } - }, + } + )); + Items.INSTANCE.setSecurityCard(callback.register(SECURITY_CARD, () -> new SecurityCardItem() { + @Override + public boolean shouldCauseReequipAnimation(final ItemStack oldStack, + final ItemStack newStack, + final boolean slotChanged) { + return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); + } + })); + Items.INSTANCE.setFallbackSecurityCard(callback.register( + FALLBACK_SECURITY_CARD, () -> new FallbackSecurityCardItem() { @Override public boolean shouldCauseReequipAnimation(final ItemStack oldStack, @@ -266,8 +290,7 @@ public boolean shouldCauseReequipAnimation(final ItemStack oldStack, return AbstractModInitializer.allowNbtUpdateAnimation(oldStack, newStack); } } - ); - itemRegistry.register(eventBus); + )); } private void registerBlockEntities(final IEventBus eventBus) { From 4ae1b45cb284eef4879b204a7cb6026eacd2efe3 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 15:47:39 +0200 Subject: [PATCH 42/59] fix: security card not updating while gui is open because slots were not present on the server --- .../common/security/AbstractSecurityCardContainerMenu.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java index f9127232f..9f1507add 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java @@ -48,6 +48,7 @@ protected AbstractSecurityCardContainerMenu(final MenuType menuType, super(menuType, syncId); this.playerInventory = playerInventory; this.disabledSlot = disabledSlot; + onScreenReady(0); } List getPermissions() { @@ -93,7 +94,7 @@ Permission resetPermission(final PlatformPermission permission) { Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardResetPermission(permission); return updatePermissionLocally(permission, allowed, false); } - + Permission changePermission(final PlatformPermission permission, final boolean selected) { Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardPermission(permission, selected); return updatePermissionLocally(permission, selected, true); From 7975d1371c4a740cd4c0241fb228e2c76e23902f Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 1 Apr 2024 19:29:11 +0200 Subject: [PATCH 43/59] feat: security manager block Also fixes an issue where the datagen for loot tables was broken. --- CHANGELOG.md | 1 + .../SecurityNetworkComponentImpl.java | 2 + .../blockstates/black_security_manager.json | 110 ++++++++++++++++++ .../blockstates/blue_security_manager.json | 110 ++++++++++++++++++ .../blockstates/brown_security_manager.json | 110 ++++++++++++++++++ .../blockstates/cyan_security_manager.json | 110 ++++++++++++++++++ .../blockstates/gray_security_manager.json | 110 ++++++++++++++++++ .../blockstates/green_security_manager.json | 110 ++++++++++++++++++ .../light_gray_security_manager.json | 110 ++++++++++++++++++ .../blockstates/lime_security_manager.json | 110 ++++++++++++++++++ .../blockstates/magenta_security_manager.json | 110 ++++++++++++++++++ .../blockstates/orange_security_manager.json | 110 ++++++++++++++++++ .../blockstates/pink_security_manager.json | 110 ++++++++++++++++++ .../blockstates/purple_security_manager.json | 110 ++++++++++++++++++ .../blockstates/red_security_manager.json | 110 ++++++++++++++++++ .../blockstates/security_manager.json | 110 ++++++++++++++++++ .../blockstates/white_security_manager.json | 110 ++++++++++++++++++ .../blockstates/yellow_security_manager.json | 110 ++++++++++++++++++ .../models/block/security_manager/black.json | 18 +++ .../models/block/security_manager/blue.json | 18 +++ .../models/block/security_manager/brown.json | 18 +++ .../models/block/security_manager/cyan.json | 18 +++ .../models/block/security_manager/gray.json | 18 +++ .../models/block/security_manager/green.json | 18 +++ .../block/security_manager/inactive.json | 18 +++ .../block/security_manager/light_blue.json | 18 +++ .../block/security_manager/light_gray.json | 18 +++ .../models/block/security_manager/lime.json | 18 +++ .../block/security_manager/magenta.json | 18 +++ .../models/block/security_manager/orange.json | 18 +++ .../models/block/security_manager/pink.json | 18 +++ .../models/block/security_manager/purple.json | 18 +++ .../models/block/security_manager/red.json | 18 +++ .../models/block/security_manager/white.json | 18 +++ .../models/block/security_manager/yellow.json | 18 +++ .../models/item/black_security_manager.json | 3 + .../models/item/blue_security_manager.json | 3 + .../models/item/brown_security_manager.json | 3 + .../models/item/cyan_security_manager.json | 3 + .../models/item/gray_security_manager.json | 3 + .../models/item/green_security_manager.json | 3 + .../item/light_gray_security_manager.json | 3 + .../models/item/lime_security_manager.json | 3 + .../models/item/magenta_security_manager.json | 3 + .../models/item/orange_security_manager.json | 3 + .../models/item/pink_security_manager.json | 3 + .../models/item/purple_security_manager.json | 3 + .../models/item/red_security_manager.json | 3 + .../models/item/security_manager.json | 3 + .../models/item/white_security_manager.json | 3 + .../models/item/yellow_security_manager.json | 3 + .../recipes/misc/coloring/black_cable.json | 7 +- .../misc/coloring/black_constructor.json | 7 +- .../misc/coloring/black_controller.json | 7 +- .../misc/coloring/black_crafting_grid.json | 7 +- .../misc/coloring/black_destructor.json | 7 +- .../recipes/misc/coloring/black_detector.json | 7 +- .../recipes/misc/coloring/black_exporter.json | 7 +- .../misc/coloring/black_external_storage.json | 7 +- .../recipes/misc/coloring/black_grid.json | 7 +- .../recipes/misc/coloring/black_importer.json | 7 +- .../misc/coloring/black_network_receiver.json | 7 +- .../coloring/black_network_transmitter.json | 7 +- .../misc/coloring/black_security_manager.json | 32 +++++ .../coloring/black_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/blue_cable.json | 7 +- .../misc/coloring/blue_constructor.json | 7 +- .../misc/coloring/blue_controller.json | 7 +- .../misc/coloring/blue_crafting_grid.json | 7 +- .../misc/coloring/blue_destructor.json | 7 +- .../recipes/misc/coloring/blue_detector.json | 7 +- .../recipes/misc/coloring/blue_exporter.json | 7 +- .../misc/coloring/blue_external_storage.json | 7 +- .../recipes/misc/coloring/blue_grid.json | 7 +- .../recipes/misc/coloring/blue_importer.json | 7 +- .../misc/coloring/blue_network_receiver.json | 7 +- .../coloring/blue_network_transmitter.json | 7 +- .../misc/coloring/blue_security_manager.json | 32 +++++ .../coloring/blue_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/brown_cable.json | 7 +- .../misc/coloring/brown_constructor.json | 7 +- .../misc/coloring/brown_controller.json | 7 +- .../misc/coloring/brown_crafting_grid.json | 7 +- .../misc/coloring/brown_destructor.json | 7 +- .../recipes/misc/coloring/brown_detector.json | 7 +- .../recipes/misc/coloring/brown_exporter.json | 7 +- .../misc/coloring/brown_external_storage.json | 7 +- .../recipes/misc/coloring/brown_grid.json | 7 +- .../recipes/misc/coloring/brown_importer.json | 7 +- .../misc/coloring/brown_network_receiver.json | 7 +- .../coloring/brown_network_transmitter.json | 7 +- .../misc/coloring/brown_security_manager.json | 32 +++++ .../coloring/brown_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/cyan_cable.json | 7 +- .../misc/coloring/cyan_constructor.json | 7 +- .../misc/coloring/cyan_controller.json | 7 +- .../misc/coloring/cyan_crafting_grid.json | 7 +- .../misc/coloring/cyan_destructor.json | 7 +- .../recipes/misc/coloring/cyan_detector.json | 7 +- .../recipes/misc/coloring/cyan_exporter.json | 7 +- .../misc/coloring/cyan_external_storage.json | 7 +- .../recipes/misc/coloring/cyan_grid.json | 7 +- .../recipes/misc/coloring/cyan_importer.json | 7 +- .../misc/coloring/cyan_network_receiver.json | 7 +- .../coloring/cyan_network_transmitter.json | 7 +- .../misc/coloring/cyan_security_manager.json | 32 +++++ .../coloring/cyan_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/gray_cable.json | 7 +- .../misc/coloring/gray_constructor.json | 7 +- .../misc/coloring/gray_controller.json | 7 +- .../misc/coloring/gray_crafting_grid.json | 7 +- .../misc/coloring/gray_destructor.json | 7 +- .../recipes/misc/coloring/gray_detector.json | 7 +- .../recipes/misc/coloring/gray_exporter.json | 7 +- .../misc/coloring/gray_external_storage.json | 7 +- .../recipes/misc/coloring/gray_grid.json | 7 +- .../recipes/misc/coloring/gray_importer.json | 7 +- .../misc/coloring/gray_network_receiver.json | 7 +- .../coloring/gray_network_transmitter.json | 7 +- .../misc/coloring/gray_security_manager.json | 32 +++++ .../coloring/gray_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/green_cable.json | 7 +- .../misc/coloring/green_constructor.json | 7 +- .../misc/coloring/green_controller.json | 7 +- .../misc/coloring/green_crafting_grid.json | 7 +- .../misc/coloring/green_destructor.json | 7 +- .../recipes/misc/coloring/green_detector.json | 7 +- .../recipes/misc/coloring/green_exporter.json | 7 +- .../misc/coloring/green_external_storage.json | 7 +- .../recipes/misc/coloring/green_grid.json | 7 +- .../recipes/misc/coloring/green_importer.json | 7 +- .../misc/coloring/green_network_receiver.json | 7 +- .../coloring/green_network_transmitter.json | 7 +- .../misc/coloring/green_security_manager.json | 32 +++++ .../coloring/green_wireless_transmitter.json | 7 +- .../misc/coloring/light_blue_cable.json | 7 +- .../misc/coloring/light_blue_constructor.json | 7 +- .../misc/coloring/light_blue_controller.json | 7 +- .../coloring/light_blue_crafting_grid.json | 7 +- .../misc/coloring/light_blue_destructor.json | 7 +- .../misc/coloring/light_blue_detector.json | 7 +- .../misc/coloring/light_blue_exporter.json | 7 +- .../coloring/light_blue_external_storage.json | 7 +- .../misc/coloring/light_blue_grid.json | 7 +- .../misc/coloring/light_blue_importer.json | 7 +- .../coloring/light_blue_network_receiver.json | 7 +- .../light_blue_network_transmitter.json | 7 +- .../coloring/light_blue_security_manager.json | 32 +++++ .../light_blue_wireless_transmitter.json | 7 +- .../misc/coloring/light_gray_cable.json | 7 +- .../misc/coloring/light_gray_constructor.json | 7 +- .../misc/coloring/light_gray_controller.json | 7 +- .../coloring/light_gray_crafting_grid.json | 7 +- .../misc/coloring/light_gray_destructor.json | 7 +- .../misc/coloring/light_gray_detector.json | 7 +- .../misc/coloring/light_gray_exporter.json | 7 +- .../coloring/light_gray_external_storage.json | 7 +- .../misc/coloring/light_gray_grid.json | 7 +- .../misc/coloring/light_gray_importer.json | 7 +- .../coloring/light_gray_network_receiver.json | 7 +- .../light_gray_network_transmitter.json | 7 +- .../coloring/light_gray_security_manager.json | 32 +++++ .../light_gray_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/lime_cable.json | 7 +- .../misc/coloring/lime_constructor.json | 7 +- .../misc/coloring/lime_controller.json | 7 +- .../misc/coloring/lime_crafting_grid.json | 7 +- .../misc/coloring/lime_destructor.json | 7 +- .../recipes/misc/coloring/lime_detector.json | 7 +- .../recipes/misc/coloring/lime_exporter.json | 7 +- .../misc/coloring/lime_external_storage.json | 7 +- .../recipes/misc/coloring/lime_grid.json | 7 +- .../recipes/misc/coloring/lime_importer.json | 7 +- .../misc/coloring/lime_network_receiver.json | 7 +- .../coloring/lime_network_transmitter.json | 7 +- .../misc/coloring/lime_security_manager.json | 32 +++++ .../coloring/lime_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/magenta_cable.json | 7 +- .../misc/coloring/magenta_constructor.json | 7 +- .../misc/coloring/magenta_controller.json | 7 +- .../misc/coloring/magenta_crafting_grid.json | 7 +- .../misc/coloring/magenta_destructor.json | 7 +- .../misc/coloring/magenta_detector.json | 7 +- .../misc/coloring/magenta_exporter.json | 7 +- .../coloring/magenta_external_storage.json | 7 +- .../recipes/misc/coloring/magenta_grid.json | 7 +- .../misc/coloring/magenta_importer.json | 7 +- .../coloring/magenta_network_receiver.json | 7 +- .../coloring/magenta_network_transmitter.json | 7 +- .../coloring/magenta_security_manager.json | 32 +++++ .../magenta_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/orange_cable.json | 7 +- .../misc/coloring/orange_constructor.json | 7 +- .../misc/coloring/orange_controller.json | 7 +- .../misc/coloring/orange_crafting_grid.json | 7 +- .../misc/coloring/orange_destructor.json | 7 +- .../misc/coloring/orange_detector.json | 7 +- .../misc/coloring/orange_exporter.json | 7 +- .../coloring/orange_external_storage.json | 7 +- .../recipes/misc/coloring/orange_grid.json | 7 +- .../misc/coloring/orange_importer.json | 7 +- .../coloring/orange_network_receiver.json | 7 +- .../coloring/orange_network_transmitter.json | 7 +- .../coloring/orange_security_manager.json | 32 +++++ .../coloring/orange_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/pink_cable.json | 7 +- .../misc/coloring/pink_constructor.json | 7 +- .../misc/coloring/pink_controller.json | 7 +- .../misc/coloring/pink_crafting_grid.json | 7 +- .../misc/coloring/pink_destructor.json | 7 +- .../recipes/misc/coloring/pink_detector.json | 7 +- .../recipes/misc/coloring/pink_exporter.json | 7 +- .../misc/coloring/pink_external_storage.json | 7 +- .../recipes/misc/coloring/pink_grid.json | 7 +- .../recipes/misc/coloring/pink_importer.json | 7 +- .../misc/coloring/pink_network_receiver.json | 7 +- .../coloring/pink_network_transmitter.json | 7 +- .../misc/coloring/pink_security_manager.json | 32 +++++ .../coloring/pink_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/purple_cable.json | 7 +- .../misc/coloring/purple_constructor.json | 7 +- .../misc/coloring/purple_controller.json | 7 +- .../misc/coloring/purple_crafting_grid.json | 7 +- .../misc/coloring/purple_destructor.json | 7 +- .../misc/coloring/purple_detector.json | 7 +- .../misc/coloring/purple_exporter.json | 7 +- .../coloring/purple_external_storage.json | 7 +- .../recipes/misc/coloring/purple_grid.json | 7 +- .../misc/coloring/purple_importer.json | 7 +- .../coloring/purple_network_receiver.json | 7 +- .../coloring/purple_network_transmitter.json | 7 +- .../coloring/purple_security_manager.json | 32 +++++ .../coloring/purple_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/red_cable.json | 7 +- .../misc/coloring/red_constructor.json | 7 +- .../recipes/misc/coloring/red_controller.json | 7 +- .../misc/coloring/red_crafting_grid.json | 7 +- .../recipes/misc/coloring/red_destructor.json | 7 +- .../recipes/misc/coloring/red_detector.json | 7 +- .../recipes/misc/coloring/red_exporter.json | 7 +- .../misc/coloring/red_external_storage.json | 7 +- .../recipes/misc/coloring/red_grid.json | 7 +- .../recipes/misc/coloring/red_importer.json | 7 +- .../misc/coloring/red_network_receiver.json | 7 +- .../coloring/red_network_transmitter.json | 7 +- .../misc/coloring/red_security_manager.json | 32 +++++ .../coloring/red_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/white_cable.json | 7 +- .../misc/coloring/white_constructor.json | 7 +- .../misc/coloring/white_controller.json | 7 +- .../misc/coloring/white_crafting_grid.json | 7 +- .../misc/coloring/white_destructor.json | 7 +- .../recipes/misc/coloring/white_detector.json | 7 +- .../recipes/misc/coloring/white_exporter.json | 7 +- .../misc/coloring/white_external_storage.json | 7 +- .../recipes/misc/coloring/white_grid.json | 7 +- .../recipes/misc/coloring/white_importer.json | 7 +- .../misc/coloring/white_network_receiver.json | 7 +- .../coloring/white_network_transmitter.json | 7 +- .../misc/coloring/white_security_manager.json | 32 +++++ .../coloring/white_wireless_transmitter.json | 7 +- .../recipes/misc/coloring/yellow_cable.json | 7 +- .../misc/coloring/yellow_constructor.json | 7 +- .../misc/coloring/yellow_controller.json | 7 +- .../misc/coloring/yellow_crafting_grid.json | 7 +- .../misc/coloring/yellow_destructor.json | 7 +- .../misc/coloring/yellow_detector.json | 7 +- .../misc/coloring/yellow_exporter.json | 7 +- .../coloring/yellow_external_storage.json | 7 +- .../recipes/misc/coloring/yellow_grid.json | 7 +- .../misc/coloring/yellow_importer.json | 7 +- .../coloring/yellow_network_receiver.json | 7 +- .../coloring/yellow_network_transmitter.json | 7 +- .../coloring/yellow_security_manager.json | 32 +++++ .../coloring/yellow_wireless_transmitter.json | 7 +- .../loot_tables/blocks/black_cable.json | 1 + .../loot_tables/blocks/black_constructor.json | 1 + .../loot_tables/blocks/black_controller.json | 1 + .../blocks/black_crafting_grid.json | 1 + .../blocks/black_creative_controller.json | 1 + .../loot_tables/blocks/black_destructor.json | 1 + .../loot_tables/blocks/black_detector.json | 1 + .../loot_tables/blocks/black_grid.json | 1 + .../blocks/black_network_receiver.json | 1 + .../blocks/black_network_transmitter.json | 1 + .../blocks/black_security_manager.json | 21 ++++ .../blocks/black_wireless_transmitter.json | 1 + .../loot_tables/blocks/blue_cable.json | 1 + .../loot_tables/blocks/blue_constructor.json | 1 + .../loot_tables/blocks/blue_controller.json | 1 + .../blocks/blue_crafting_grid.json | 1 + .../blocks/blue_creative_controller.json | 1 + .../loot_tables/blocks/blue_destructor.json | 1 + .../loot_tables/blocks/blue_detector.json | 1 + .../loot_tables/blocks/blue_grid.json | 1 + .../blocks/blue_network_receiver.json | 1 + .../blocks/blue_network_transmitter.json | 1 + .../blocks/blue_security_manager.json | 21 ++++ .../blocks/blue_wireless_transmitter.json | 1 + .../loot_tables/blocks/brown_cable.json | 1 + .../loot_tables/blocks/brown_constructor.json | 1 + .../loot_tables/blocks/brown_controller.json | 1 + .../blocks/brown_crafting_grid.json | 1 + .../blocks/brown_creative_controller.json | 1 + .../loot_tables/blocks/brown_destructor.json | 1 + .../loot_tables/blocks/brown_detector.json | 1 + .../loot_tables/blocks/brown_grid.json | 1 + .../blocks/brown_network_receiver.json | 1 + .../blocks/brown_network_transmitter.json | 1 + .../blocks/brown_security_manager.json | 21 ++++ .../blocks/brown_wireless_transmitter.json | 1 + .../loot_tables/blocks/cable.json | 1 + .../loot_tables/blocks/constructor.json | 1 + .../loot_tables/blocks/controller.json | 1 + .../loot_tables/blocks/crafting_grid.json | 1 + .../blocks/creative_controller.json | 1 + .../loot_tables/blocks/cyan_cable.json | 1 + .../loot_tables/blocks/cyan_constructor.json | 1 + .../loot_tables/blocks/cyan_controller.json | 1 + .../blocks/cyan_crafting_grid.json | 1 + .../blocks/cyan_creative_controller.json | 1 + .../loot_tables/blocks/cyan_destructor.json | 1 + .../loot_tables/blocks/cyan_detector.json | 1 + .../loot_tables/blocks/cyan_grid.json | 1 + .../blocks/cyan_network_receiver.json | 1 + .../blocks/cyan_network_transmitter.json | 1 + .../blocks/cyan_security_manager.json | 21 ++++ .../blocks/cyan_wireless_transmitter.json | 1 + .../loot_tables/blocks/destructor.json | 1 + .../loot_tables/blocks/detector.json | 1 + .../loot_tables/blocks/gray_controller.json | 1 + .../blocks/gray_crafting_grid.json | 1 + .../blocks/gray_creative_controller.json | 1 + .../loot_tables/blocks/gray_detector.json | 1 + .../loot_tables/blocks/gray_grid.json | 1 + .../blocks/gray_network_receiver.json | 1 + .../blocks/gray_network_transmitter.json | 1 + .../blocks/gray_security_manager.json | 21 ++++ .../blocks/gray_wireless_transmitter.json | 1 + .../loot_tables/blocks/green_cable.json | 1 + .../loot_tables/blocks/green_constructor.json | 1 + .../loot_tables/blocks/green_controller.json | 1 + .../blocks/green_crafting_grid.json | 1 + .../blocks/green_creative_controller.json | 1 + .../loot_tables/blocks/green_destructor.json | 1 + .../loot_tables/blocks/green_detector.json | 1 + .../loot_tables/blocks/green_grid.json | 1 + .../blocks/green_network_receiver.json | 1 + .../blocks/green_network_transmitter.json | 1 + .../blocks/green_security_manager.json | 21 ++++ .../blocks/green_wireless_transmitter.json | 1 + .../loot_tables/blocks/grid.json | 1 + .../loot_tables/blocks/light_blue_cable.json | 1 + .../blocks/light_blue_constructor.json | 1 + .../blocks/light_blue_destructor.json | 1 + .../loot_tables/blocks/light_gray_cable.json | 1 + .../blocks/light_gray_constructor.json | 1 + .../blocks/light_gray_controller.json | 1 + .../blocks/light_gray_crafting_grid.json | 1 + .../light_gray_creative_controller.json | 1 + .../blocks/light_gray_destructor.json | 1 + .../blocks/light_gray_detector.json | 1 + .../loot_tables/blocks/light_gray_grid.json | 1 + .../blocks/light_gray_network_receiver.json | 1 + .../light_gray_network_transmitter.json | 1 + .../blocks/light_gray_security_manager.json | 21 ++++ .../light_gray_wireless_transmitter.json | 1 + .../loot_tables/blocks/lime_cable.json | 1 + .../loot_tables/blocks/lime_constructor.json | 1 + .../loot_tables/blocks/lime_controller.json | 1 + .../blocks/lime_crafting_grid.json | 1 + .../blocks/lime_creative_controller.json | 1 + .../loot_tables/blocks/lime_destructor.json | 1 + .../loot_tables/blocks/lime_detector.json | 1 + .../loot_tables/blocks/lime_grid.json | 1 + .../blocks/lime_network_receiver.json | 1 + .../blocks/lime_network_transmitter.json | 1 + .../blocks/lime_security_manager.json | 21 ++++ .../blocks/lime_wireless_transmitter.json | 1 + .../loot_tables/blocks/magenta_cable.json | 1 + .../blocks/magenta_constructor.json | 1 + .../blocks/magenta_controller.json | 1 + .../blocks/magenta_crafting_grid.json | 1 + .../blocks/magenta_creative_controller.json | 1 + .../blocks/magenta_destructor.json | 1 + .../loot_tables/blocks/magenta_detector.json | 1 + .../loot_tables/blocks/magenta_grid.json | 1 + .../blocks/magenta_network_receiver.json | 1 + .../blocks/magenta_network_transmitter.json | 1 + .../blocks/magenta_security_manager.json | 21 ++++ .../blocks/magenta_wireless_transmitter.json | 1 + .../loot_tables/blocks/network_receiver.json | 1 + .../blocks/network_transmitter.json | 1 + .../loot_tables/blocks/orange_cable.json | 1 + .../blocks/orange_constructor.json | 1 + .../loot_tables/blocks/orange_controller.json | 1 + .../blocks/orange_crafting_grid.json | 1 + .../blocks/orange_creative_controller.json | 1 + .../loot_tables/blocks/orange_destructor.json | 1 + .../loot_tables/blocks/orange_detector.json | 1 + .../loot_tables/blocks/orange_grid.json | 1 + .../blocks/orange_network_receiver.json | 1 + .../blocks/orange_network_transmitter.json | 1 + .../blocks/orange_security_manager.json | 21 ++++ .../blocks/orange_wireless_transmitter.json | 1 + .../loot_tables/blocks/pink_cable.json | 1 + .../loot_tables/blocks/pink_constructor.json | 1 + .../loot_tables/blocks/pink_controller.json | 1 + .../blocks/pink_crafting_grid.json | 1 + .../blocks/pink_creative_controller.json | 1 + .../loot_tables/blocks/pink_destructor.json | 1 + .../loot_tables/blocks/pink_detector.json | 1 + .../loot_tables/blocks/pink_grid.json | 1 + .../blocks/pink_network_receiver.json | 1 + .../blocks/pink_network_transmitter.json | 1 + .../blocks/pink_security_manager.json | 21 ++++ .../blocks/pink_wireless_transmitter.json | 1 + .../loot_tables/blocks/purple_cable.json | 1 + .../blocks/purple_constructor.json | 1 + .../loot_tables/blocks/purple_controller.json | 1 + .../blocks/purple_crafting_grid.json | 1 + .../blocks/purple_creative_controller.json | 1 + .../loot_tables/blocks/purple_destructor.json | 1 + .../loot_tables/blocks/purple_detector.json | 1 + .../loot_tables/blocks/purple_grid.json | 1 + .../blocks/purple_network_receiver.json | 1 + .../blocks/purple_network_transmitter.json | 1 + .../blocks/purple_security_manager.json | 21 ++++ .../blocks/purple_wireless_transmitter.json | 1 + .../loot_tables/blocks/red_cable.json | 1 + .../loot_tables/blocks/red_constructor.json | 1 + .../loot_tables/blocks/red_controller.json | 1 + .../loot_tables/blocks/red_crafting_grid.json | 1 + .../blocks/red_creative_controller.json | 1 + .../loot_tables/blocks/red_destructor.json | 1 + .../loot_tables/blocks/red_detector.json | 1 + .../loot_tables/blocks/red_grid.json | 1 + .../blocks/red_network_receiver.json | 1 + .../blocks/red_network_transmitter.json | 1 + .../blocks/red_security_manager.json | 21 ++++ .../blocks/red_wireless_transmitter.json | 1 + .../loot_tables/blocks/security_manager.json | 21 ++++ .../loot_tables/blocks/white_cable.json | 1 + .../loot_tables/blocks/white_constructor.json | 1 + .../loot_tables/blocks/white_controller.json | 1 + .../blocks/white_crafting_grid.json | 1 + .../blocks/white_creative_controller.json | 1 + .../loot_tables/blocks/white_destructor.json | 1 + .../loot_tables/blocks/white_detector.json | 1 + .../loot_tables/blocks/white_grid.json | 1 + .../blocks/white_network_receiver.json | 1 + .../blocks/white_network_transmitter.json | 1 + .../blocks/white_security_manager.json | 21 ++++ .../blocks/white_wireless_transmitter.json | 1 + .../blocks/wireless_transmitter.json | 1 + .../loot_tables/blocks/yellow_cable.json | 1 + .../blocks/yellow_constructor.json | 1 + .../loot_tables/blocks/yellow_controller.json | 1 + .../blocks/yellow_crafting_grid.json | 1 + .../blocks/yellow_creative_controller.json | 1 + .../loot_tables/blocks/yellow_destructor.json | 1 + .../loot_tables/blocks/yellow_detector.json | 1 + .../loot_tables/blocks/yellow_grid.json | 1 + .../blocks/yellow_network_receiver.json | 1 + .../blocks/yellow_network_transmitter.json | 1 + .../blocks/yellow_security_manager.json | 21 ++++ .../blocks/yellow_wireless_transmitter.json | 1 + .../coloring/black_security_manager.json | 15 +++ .../coloring/blue_security_manager.json | 15 +++ .../coloring/brown_security_manager.json | 15 +++ .../coloring/cyan_security_manager.json | 15 +++ .../coloring/gray_security_manager.json | 15 +++ .../coloring/green_security_manager.json | 15 +++ .../coloring/light_blue_security_manager.json | 15 +++ .../coloring/light_gray_security_manager.json | 15 +++ .../coloring/lime_security_manager.json | 15 +++ .../coloring/magenta_security_manager.json | 15 +++ .../coloring/orange_security_manager.json | 15 +++ .../coloring/pink_security_manager.json | 15 +++ .../coloring/purple_security_manager.json | 15 +++ .../coloring/red_security_manager.json | 15 +++ .../coloring/white_security_manager.json | 15 +++ .../coloring/yellow_security_manager.json | 15 +++ .../tags/items/security_managers.json | 20 ++++ .../common/AbstractModInitializer.java | 11 ++ .../platform/common/Config.java | 16 +-- .../common/content/BlockEntities.java | 11 ++ .../platform/common/content/Blocks.java | 11 ++ .../platform/common/content/ContentIds.java | 1 + .../platform/common/content/ContentNames.java | 1 + .../common/content/CreativeModeTabItems.java | 1 + .../common/content/DefaultEnergyUsage.java | 1 + .../platform/common/content/Items.java | 9 ++ .../platform/common/content/Tags.java | 1 + .../CreativeControllerBlockItem.java | 5 +- .../platform/common/grid/GridBlock.java | 1 - .../common/networking/NetworkCardItem.java | 1 + .../common/security/SecurityManagerBlock.java | 101 ++++++++++++++++ .../security/SecurityManagerBlockEntity.java | 20 ++++ .../assets/refinedstorage2/lang/en_us.json | 16 ++- .../refinedstorage2/models/block/cutout.json | 82 +++++++++++++ .../models/block/emissive_cutout.json | 106 +++++++++++++++++ .../textures/block/security_manager/back.png | Bin 0 -> 540 bytes .../security_manager/cutouts/back/black.png | Bin 0 -> 3047 bytes .../security_manager/cutouts/back/blue.png | Bin 0 -> 3057 bytes .../security_manager/cutouts/back/brown.png | Bin 0 -> 3072 bytes .../security_manager/cutouts/back/cyan.png | Bin 0 -> 3088 bytes .../security_manager/cutouts/back/gray.png | Bin 0 -> 3062 bytes .../security_manager/cutouts/back/green.png | Bin 0 -> 3070 bytes .../cutouts/back/inactive.png | Bin 0 -> 242 bytes .../cutouts/back/light_blue.png | Bin 0 -> 380 bytes .../cutouts/back/light_gray.png | Bin 0 -> 3038 bytes .../security_manager/cutouts/back/lime.png | Bin 0 -> 3066 bytes .../security_manager/cutouts/back/magenta.png | Bin 0 -> 3047 bytes .../security_manager/cutouts/back/orange.png | Bin 0 -> 3023 bytes .../security_manager/cutouts/back/pink.png | Bin 0 -> 2994 bytes .../security_manager/cutouts/back/purple.png | Bin 0 -> 3069 bytes .../security_manager/cutouts/back/red.png | Bin 0 -> 3036 bytes .../security_manager/cutouts/back/white.png | Bin 0 -> 3008 bytes .../security_manager/cutouts/back/yellow.png | Bin 0 -> 3031 bytes .../security_manager/cutouts/front/black.png | Bin 0 -> 2975 bytes .../security_manager/cutouts/front/blue.png | Bin 0 -> 2985 bytes .../security_manager/cutouts/front/brown.png | Bin 0 -> 2996 bytes .../security_manager/cutouts/front/cyan.png | Bin 0 -> 3008 bytes .../security_manager/cutouts/front/gray.png | Bin 0 -> 2980 bytes .../security_manager/cutouts/front/green.png | Bin 0 -> 2997 bytes .../cutouts/front/inactive.png | Bin 0 -> 227 bytes .../cutouts/front/light_blue.png | Bin 0 -> 331 bytes .../cutouts/front/light_gray.png | Bin 0 -> 2961 bytes .../security_manager/cutouts/front/lime.png | Bin 0 -> 2990 bytes .../cutouts/front/magenta.png | Bin 0 -> 2975 bytes .../security_manager/cutouts/front/orange.png | Bin 0 -> 2962 bytes .../security_manager/cutouts/front/pink.png | Bin 0 -> 2940 bytes .../security_manager/cutouts/front/purple.png | Bin 0 -> 2992 bytes .../security_manager/cutouts/front/red.png | Bin 0 -> 2963 bytes .../security_manager/cutouts/front/white.png | Bin 0 -> 2948 bytes .../security_manager/cutouts/front/yellow.png | Bin 0 -> 2964 bytes .../security_manager/cutouts/left/black.png | Bin 0 -> 3043 bytes .../security_manager/cutouts/left/blue.png | Bin 0 -> 3058 bytes .../security_manager/cutouts/left/brown.png | Bin 0 -> 3064 bytes .../security_manager/cutouts/left/cyan.png | Bin 0 -> 3075 bytes .../security_manager/cutouts/left/gray.png | Bin 0 -> 3039 bytes .../security_manager/cutouts/left/green.png | Bin 0 -> 3052 bytes .../cutouts/left/inactive.png | Bin 0 -> 241 bytes .../cutouts/left/light_blue.png | Bin 0 -> 361 bytes .../cutouts/left/light_gray.png | Bin 0 -> 3026 bytes .../security_manager/cutouts/left/lime.png | Bin 0 -> 3057 bytes .../security_manager/cutouts/left/magenta.png | Bin 0 -> 3031 bytes .../security_manager/cutouts/left/orange.png | Bin 0 -> 3011 bytes .../security_manager/cutouts/left/pink.png | Bin 0 -> 2987 bytes .../security_manager/cutouts/left/purple.png | Bin 0 -> 3062 bytes .../security_manager/cutouts/left/red.png | Bin 0 -> 3037 bytes .../security_manager/cutouts/left/white.png | Bin 0 -> 3011 bytes .../security_manager/cutouts/left/yellow.png | Bin 0 -> 3035 bytes .../security_manager/cutouts/right/black.png | Bin 0 -> 3035 bytes .../security_manager/cutouts/right/blue.png | Bin 0 -> 3055 bytes .../security_manager/cutouts/right/brown.png | Bin 0 -> 3056 bytes .../security_manager/cutouts/right/cyan.png | Bin 0 -> 3069 bytes .../security_manager/cutouts/right/gray.png | Bin 0 -> 3041 bytes .../security_manager/cutouts/right/green.png | Bin 0 -> 3058 bytes .../cutouts/right/inactive.png | Bin 0 -> 239 bytes .../cutouts/right/light_blue.png | Bin 0 -> 354 bytes .../cutouts/right/light_gray.png | Bin 0 -> 3011 bytes .../security_manager/cutouts/right/lime.png | Bin 0 -> 3050 bytes .../cutouts/right/magenta.png | Bin 0 -> 3050 bytes .../security_manager/cutouts/right/orange.png | Bin 0 -> 3030 bytes .../security_manager/cutouts/right/pink.png | Bin 0 -> 3005 bytes .../security_manager/cutouts/right/purple.png | Bin 0 -> 3057 bytes .../security_manager/cutouts/right/red.png | Bin 0 -> 3040 bytes .../security_manager/cutouts/right/white.png | Bin 0 -> 3019 bytes .../security_manager/cutouts/right/yellow.png | Bin 0 -> 3041 bytes .../security_manager/cutouts/top/black.png | Bin 0 -> 3085 bytes .../security_manager/cutouts/top/blue.png | Bin 0 -> 3106 bytes .../security_manager/cutouts/top/brown.png | Bin 0 -> 3107 bytes .../security_manager/cutouts/top/cyan.png | Bin 0 -> 3142 bytes .../security_manager/cutouts/top/gray.png | Bin 0 -> 3112 bytes .../security_manager/cutouts/top/green.png | Bin 0 -> 3128 bytes .../security_manager/cutouts/top/inactive.png | Bin 0 -> 297 bytes .../cutouts/top/light_blue.png | Bin 0 -> 575 bytes .../cutouts/top/light_gray.png | Bin 0 -> 3057 bytes .../security_manager/cutouts/top/lime.png | Bin 0 -> 3122 bytes .../security_manager/cutouts/top/magenta.png | Bin 0 -> 3108 bytes .../security_manager/cutouts/top/orange.png | Bin 0 -> 3056 bytes .../security_manager/cutouts/top/pink.png | Bin 0 -> 3008 bytes .../security_manager/cutouts/top/purple.png | Bin 0 -> 3133 bytes .../security_manager/cutouts/top/red.png | Bin 0 -> 3074 bytes .../security_manager/cutouts/top/white.png | Bin 0 -> 3015 bytes .../security_manager/cutouts/top/yellow.png | Bin 0 -> 3080 bytes .../textures/block/security_manager/front.png | Bin 0 -> 498 bytes .../textures/block/security_manager/left.png | Bin 0 -> 551 bytes .../textures/block/security_manager/right.png | Bin 0 -> 574 bytes .../textures/block/security_manager/top.png | Bin 0 -> 495 bytes .../refinedstorage2/advancements/root.json | 2 +- .../advancements/security.json | 32 +++++ .../recipes/security_manager.json | 28 +++++ .../fabric/ClientModInitializerImpl.java | 28 +++++ .../platform/fabric/ConfigImpl.java | 26 +++-- .../rei/RefinedStorageREIClientPlugin.java | 6 + .../support/render/EmissiveBakedModel.java | 5 +- .../support/render/EmissiveModelRegistry.java | 8 +- .../support/render/EmissiveTransform.java | 10 +- .../platform/forge/ConfigImpl.java | 49 +++++--- .../forge/datagen/BlockModelProviderImpl.java | 69 ++++++++++- .../forge/datagen/BlockStateProviderImpl.java | 20 ++++ .../forge/datagen/ItemModelProviderImpl.java | 9 ++ .../forge/datagen/loot/BlockDropProvider.java | 2 + .../datagen/loot/LootTableProviderImpl.java | 8 +- .../recipe/RecoloringRecipeProvider.java | 3 + .../datagen/tag/ItemTagsProviderImpl.java | 5 + .../rei/RefinedStorageREIClientPlugin.java | 6 + 610 files changed, 4678 insertions(+), 890 deletions(-) create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/black.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/blue.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/brown.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/cyan.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/gray.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/green.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/inactive.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_blue.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_gray.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/lime.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/magenta.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/orange.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/pink.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/purple.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/red.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/white.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/yellow.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/black_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/blue_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/brown_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/cyan_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/green_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/light_gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/lime_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/magenta_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/orange_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/pink_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/purple_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/red_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/white_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/yellow_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/black_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/blue_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/brown_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/cyan_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/green_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_blue_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_gray_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/lime_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/magenta_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/orange_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/pink_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/purple_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/red_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/white_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/yellow_security_manager.json create mode 100644 refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/tags/items/security_managers.json create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/cutout.json create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/emissive_cutout.json create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/back.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/black.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/brown.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/cyan.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/green.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/inactive.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/light_blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/light_gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/lime.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/magenta.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/orange.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/pink.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/purple.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/red.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/white.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/yellow.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/black.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/brown.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/cyan.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/green.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/inactive.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/light_blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/light_gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/lime.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/magenta.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/orange.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/pink.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/purple.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/red.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/white.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/yellow.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/black.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/brown.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/cyan.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/green.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/inactive.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/light_blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/light_gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/lime.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/magenta.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/orange.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/pink.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/purple.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/red.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/white.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/yellow.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/black.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/brown.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/cyan.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/green.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/inactive.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/light_blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/light_gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/lime.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/magenta.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/orange.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/pink.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/purple.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/red.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/white.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/yellow.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/black.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/brown.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/cyan.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/green.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/inactive.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/light_blue.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/light_gray.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/lime.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/magenta.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/orange.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/pink.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/purple.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/red.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/white.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/yellow.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/front.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/left.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/right.png create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/top.png create mode 100644 refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/advancements/security.json create mode 100644 refinedstorage2-platform-common/src/main/resources/data/refinedstorage2/recipes/security_manager.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c12c5019..51890fbfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Security Card - Fallback Security Card +- Security Manager ### Changed diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java index ea7f962e7..d5f915e16 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -15,6 +15,7 @@ public class SecurityNetworkComponentImpl implements SecurityNetworkComponent { @Override public void onContainerAdded(final NetworkNodeContainer container) { + // TODO: use getNode if (container instanceof SecurityDecisionProvider provider) { providers.add(provider); } @@ -22,6 +23,7 @@ public void onContainerAdded(final NetworkNodeContainer container) { @Override public void onContainerRemoved(final NetworkNodeContainer container) { + // TODO: use getNode if (container instanceof SecurityDecisionProvider provider) { providers.remove(provider); } diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json new file mode 100644 index 000000000..5a317adc1 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/black", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/black", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/black", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/black", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/black", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/black" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/black", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/black", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/black", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/black", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/black", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/black", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json new file mode 100644 index 000000000..e097c4e27 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/blue", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/blue", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/blue", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/blue", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/blue", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/blue" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/blue", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/blue", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/blue", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/blue", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/blue", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/blue", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json new file mode 100644 index 000000000..782b43dfa --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/brown", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/brown", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/brown", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/brown", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/brown", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/brown" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/brown", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/brown", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/brown", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/brown", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/brown", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/brown", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json new file mode 100644 index 000000000..ccbab024f --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/cyan", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/cyan" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/cyan", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/cyan", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/cyan", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json new file mode 100644 index 000000000..0bced5e96 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/gray", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/gray", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/gray", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/gray", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/gray", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/gray" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/gray", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/gray", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/gray", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/gray", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/gray", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/gray", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json new file mode 100644 index 000000000..c0c4b2ee3 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/green", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/green", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/green", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/green", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/green", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/green" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/green", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/green", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/green", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/green", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/green", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/green", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json new file mode 100644 index 000000000..54b93ccf8 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/light_gray", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/light_gray" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/light_gray", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/light_gray", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/light_gray", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json new file mode 100644 index 000000000..f65e5d902 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/lime", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/lime", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/lime", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/lime", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/lime", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/lime" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/lime", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/lime", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/lime", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/lime", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/lime", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/lime", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json new file mode 100644 index 000000000..92ad88871 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/magenta", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/magenta" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/magenta", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/magenta", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/magenta", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json new file mode 100644 index 000000000..4450ef516 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/orange", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/orange", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/orange", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/orange", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/orange", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/orange" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/orange", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/orange", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/orange", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/orange", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/orange", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/orange", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json new file mode 100644 index 000000000..d33e77fec --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/pink", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/pink", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/pink", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/pink", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/pink", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/pink" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/pink", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/pink", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/pink", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/pink", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/pink", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/pink", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json new file mode 100644 index 000000000..bc0e84f00 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/purple", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/purple", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/purple", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/purple", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/purple", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/purple" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/purple", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/purple", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/purple", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/purple", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/purple", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/purple", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json new file mode 100644 index 000000000..724a669a7 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/red", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/red", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/red", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/red", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/red", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/red" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/red", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/red", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/red", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/red", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/red", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/red", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json new file mode 100644 index 000000000..8f3d5a73a --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/light_blue", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/light_blue" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/light_blue", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/light_blue", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/light_blue", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json new file mode 100644 index 000000000..5c1131a54 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/white", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/white", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/white", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/white", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/white", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/white" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/white", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/white", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/white", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/white", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/white", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/white", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json new file mode 100644 index 000000000..47fe1e882 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json @@ -0,0 +1,110 @@ +{ + "variants": { + "active=false,direction=down_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": -90 + }, + "active=false,direction=down_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90 + }, + "active=false,direction=down_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 180 + }, + "active=false,direction=down_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": 90, + "y": 90 + }, + "active=false,direction=east": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 90 + }, + "active=false,direction=north": { + "model": "refinedstorage2:block/security_manager/inactive" + }, + "active=false,direction=south": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 180 + }, + "active=false,direction=up_east": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": -90 + }, + "active=false,direction=up_north": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 180 + }, + "active=false,direction=up_south": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90 + }, + "active=false,direction=up_west": { + "model": "refinedstorage2:block/security_manager/inactive", + "x": -90, + "y": 90 + }, + "active=false,direction=west": { + "model": "refinedstorage2:block/security_manager/inactive", + "y": 270 + }, + "active=true,direction=down_east": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": 90, + "y": -90 + }, + "active=true,direction=down_north": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": 90 + }, + "active=true,direction=down_south": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": 90, + "y": 180 + }, + "active=true,direction=down_west": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": 90, + "y": 90 + }, + "active=true,direction=east": { + "model": "refinedstorage2:block/security_manager/yellow", + "y": 90 + }, + "active=true,direction=north": { + "model": "refinedstorage2:block/security_manager/yellow" + }, + "active=true,direction=south": { + "model": "refinedstorage2:block/security_manager/yellow", + "y": 180 + }, + "active=true,direction=up_east": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": -90, + "y": -90 + }, + "active=true,direction=up_north": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": -90, + "y": 180 + }, + "active=true,direction=up_south": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": -90 + }, + "active=true,direction=up_west": { + "model": "refinedstorage2:block/security_manager/yellow", + "x": -90, + "y": 90 + }, + "active=true,direction=west": { + "model": "refinedstorage2:block/security_manager/yellow", + "y": 270 + } + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/black.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/black.json new file mode 100644 index 000000000..f0e16728a --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/black.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/black", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/black", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/black", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/black", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/black", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/blue.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/blue.json new file mode 100644 index 000000000..84c0ea549 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/blue.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/blue", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/blue", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/blue", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/blue", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/blue", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/brown.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/brown.json new file mode 100644 index 000000000..77150c297 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/brown.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/brown", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/brown", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/brown", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/brown", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/brown", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/cyan.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/cyan.json new file mode 100644 index 000000000..476b8ebc1 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/cyan.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/cyan", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/cyan", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/cyan", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/cyan", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/cyan", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/gray.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/gray.json new file mode 100644 index 000000000..6d098c4e4 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/gray.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/gray", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/gray", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/gray", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/gray", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/gray", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/green.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/green.json new file mode 100644 index 000000000..408f308b8 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/green.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/green", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/green", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/green", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/green", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/green", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/inactive.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/inactive.json new file mode 100644 index 000000000..6ae233e27 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/inactive.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/inactive", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/inactive", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/inactive", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/inactive", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/inactive", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_blue.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_blue.json new file mode 100644 index 000000000..f8a18ecf9 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_blue.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/light_blue", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/light_blue", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/light_blue", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/light_blue", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/light_blue", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_gray.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_gray.json new file mode 100644 index 000000000..03840489f --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/light_gray.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/light_gray", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/light_gray", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/light_gray", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/light_gray", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/light_gray", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/lime.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/lime.json new file mode 100644 index 000000000..dedd0d204 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/lime.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/lime", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/lime", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/lime", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/lime", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/lime", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/magenta.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/magenta.json new file mode 100644 index 000000000..ed56a5d31 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/magenta.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/magenta", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/magenta", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/magenta", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/magenta", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/magenta", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/orange.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/orange.json new file mode 100644 index 000000000..42d6d1cb4 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/orange.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/orange", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/orange", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/orange", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/orange", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/orange", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/pink.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/pink.json new file mode 100644 index 000000000..5b26e7557 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/pink.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/pink", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/pink", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/pink", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/pink", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/pink", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/purple.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/purple.json new file mode 100644 index 000000000..d079f109b --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/purple.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/purple", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/purple", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/purple", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/purple", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/purple", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/red.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/red.json new file mode 100644 index 000000000..3eb01cbbc --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/red.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/red", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/red", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/red", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/red", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/red", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/white.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/white.json new file mode 100644 index 000000000..9db7a41bb --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/white.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/white", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/white", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/white", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/white", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/white", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/yellow.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/yellow.json new file mode 100644 index 000000000..d82bec405 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/block/security_manager/yellow.json @@ -0,0 +1,18 @@ +{ + "parent": "refinedstorage2:block/emissive_cutout", + "textures": { + "cutout_down": "refinedstorage2:block/bottom", + "cutout_east": "refinedstorage2:block/security_manager/cutouts/right/yellow", + "cutout_north": "refinedstorage2:block/security_manager/cutouts/front/yellow", + "cutout_south": "refinedstorage2:block/security_manager/cutouts/back/yellow", + "cutout_up": "refinedstorage2:block/security_manager/cutouts/top/yellow", + "cutout_west": "refinedstorage2:block/security_manager/cutouts/left/yellow", + "down": "refinedstorage2:block/bottom", + "east": "refinedstorage2:block/security_manager/right", + "north": "refinedstorage2:block/security_manager/front", + "particle": "refinedstorage2:block/security_manager/back", + "south": "refinedstorage2:block/security_manager/back", + "up": "refinedstorage2:block/security_manager/top", + "west": "refinedstorage2:block/security_manager/left" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/black_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/black_security_manager.json new file mode 100644 index 000000000..ee13ead75 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/black_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/black" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/blue_security_manager.json new file mode 100644 index 000000000..5b2b172fd --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/blue_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/blue" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/brown_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/brown_security_manager.json new file mode 100644 index 000000000..e4d259faf --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/brown_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/brown" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/cyan_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/cyan_security_manager.json new file mode 100644 index 000000000..d4ac29b94 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/cyan_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/cyan" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/gray_security_manager.json new file mode 100644 index 000000000..f82d44b8a --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/gray_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/gray" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/green_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/green_security_manager.json new file mode 100644 index 000000000..922448244 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/green_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/green" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/light_gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/light_gray_security_manager.json new file mode 100644 index 000000000..3ca73b68d --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/light_gray_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/light_gray" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/lime_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/lime_security_manager.json new file mode 100644 index 000000000..d9a5821ab --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/lime_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/lime" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/magenta_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/magenta_security_manager.json new file mode 100644 index 000000000..b3b6dbfc0 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/magenta_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/magenta" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/orange_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/orange_security_manager.json new file mode 100644 index 000000000..40e80c498 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/orange_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/orange" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/pink_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/pink_security_manager.json new file mode 100644 index 000000000..94f2729d4 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/pink_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/pink" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/purple_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/purple_security_manager.json new file mode 100644 index 000000000..d36ab505b --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/purple_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/purple" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/red_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/red_security_manager.json new file mode 100644 index 000000000..256ec88fc --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/red_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/red" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/security_manager.json new file mode 100644 index 000000000..6d3285847 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/light_blue" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/white_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/white_security_manager.json new file mode 100644 index 000000000..6edd61a27 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/white_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/white" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/yellow_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/yellow_security_manager.json new file mode 100644 index 000000000..e1e4c506f --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/models/item/yellow_security_manager.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage2:block/security_manager/yellow" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_cable.json index c2ce00c55..d3db991f0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_constructor.json index 5448c581a..1dd5e8d4b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_controller.json index 40cc99ade..9c61d03da 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_crafting_grid.json index c249a8d00..f63aa8ac7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_destructor.json index 7aa16bd69..084f62c1f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_detector.json index fcd3f2add..647cf0300 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_exporter.json index 8cfac38f6..19461a32b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_external_storage.json index 7a03921a0..b63faf1bc 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_grid.json index 626db107e..dc32ec5e7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_importer.json index 1e5a0ac56..e1e5f246c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_receiver.json index c7b33755b..a25c7205b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_transmitter.json index d62881c05..b31d9bcc2 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_security_manager.json new file mode 100644 index 000000000..1c8eadbfb --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/black_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/black_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_wireless_transmitter.json index 2f85c7a7c..75467defa 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/black_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/black_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_cable.json index da93a6f48..d6ab78505 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_constructor.json index a6e0a1e87..7f14346e2 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_controller.json index aed107af8..eed4ee1ef 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_crafting_grid.json index a87c376f0..7d5bc773a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_destructor.json index 099e7ab5e..10284b92a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_detector.json index 47fd21589..c46103976 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_exporter.json index 5dbb32bca..3293b363d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_external_storage.json index 16629ca31..021e6300b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_grid.json index fcda6e7c9..c43c0b299 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_importer.json index 6abba04c2..6ed2abe77 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_receiver.json index 22f8c8709..79acce956 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_transmitter.json index 5fb93f8d0..d692e772c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_security_manager.json new file mode 100644 index 000000000..160bfa32b --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/blue_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/blue_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_wireless_transmitter.json index c26a239fa..0297bb91c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/blue_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/blue_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_cable.json index 4bcfb0045..36eb6d6ff 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_constructor.json index 6de0eeaba..1826b2c6d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_controller.json index 76c1980e9..153a130df 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_crafting_grid.json index a6af02fd1..85633ff2d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_destructor.json index 0d6e4eb47..23445c672 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_detector.json index 55c0146d0..a3badbb5e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_exporter.json index d976e742c..a376591e8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_external_storage.json index dafedb20b..f32dd9ca8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_grid.json index 5efdf67ae..b0030066e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_importer.json index acc0ad356..4314c14e9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_receiver.json index 2dcce70a1..194e86e3a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_transmitter.json index f8472f93e..88736f539 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_security_manager.json new file mode 100644 index 000000000..1b680cccb --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/brown_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/brown_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_wireless_transmitter.json index 9147d3182..163ff2101 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/brown_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/brown_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_cable.json index 4b87be60f..0302bfb36 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_constructor.json index b0f8d2840..d1ae5f9ea 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_controller.json index b516088e3..db27f5170 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_crafting_grid.json index f418314d8..26cfd294c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_destructor.json index cd9a0d923..6067674d3 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_detector.json index c01a89630..1e09263e9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_exporter.json index fceb13585..60ab95120 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_external_storage.json index 917a4a793..92c1398d8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_grid.json index c3e274f6f..b091dacfa 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_importer.json index 9b7ce2f8c..8878b3d27 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_receiver.json index 5579db0c2..5816a373b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_transmitter.json index 212262dfe..1d4f20b4c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_security_manager.json new file mode 100644 index 000000000..dc3fa7712 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/cyan_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/cyan_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_wireless_transmitter.json index 5b6e8dcee..fef581b84 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/cyan_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/cyan_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_cable.json index d3eb34203..70d872141 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_constructor.json index 2b48ccf56..1ec85077d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_controller.json index 09fed3c44..4239623f9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_crafting_grid.json index 42d9c32c7..58e0adb2c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_destructor.json index a1395f1fb..74d9347fb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_detector.json index 4250150d0..7040db113 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_exporter.json index 97b52adcb..de6223b7d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_external_storage.json index c6e82bd27..1050b7fe6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_grid.json index 56ad56deb..1c5ccba36 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_importer.json index 8650088ef..2c8c3581f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_receiver.json index f91f93326..0de56015d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_transmitter.json index 003794319..5de9bb735 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_security_manager.json new file mode 100644 index 000000000..8dfa953ea --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/gray_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/gray_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_wireless_transmitter.json index 81b0f4c6f..2a6d0da6b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/gray_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/gray_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_cable.json index e956c509c..24be1c12e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_constructor.json index e5eec7a04..d3f92385d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_controller.json index 2a728a3e5..9439a48be 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_crafting_grid.json index 0ab2309dc..691ede3dd 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_destructor.json index 3e1f21c65..82e6917cf 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_detector.json index e4d1d6ec0..c19a599cb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_exporter.json index d0d052e40..3625522a6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_external_storage.json index e8b90603e..d1f361f81 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_grid.json index 11d739cd4..b8f0def56 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_importer.json index e1c605460..6c45f05f1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_receiver.json index 4213a221a..0aac86085 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_transmitter.json index 5944c16a4..e1c1680dc 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_security_manager.json new file mode 100644 index 000000000..da323c613 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/green_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/green_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_wireless_transmitter.json index b4e0ca28e..49164ba8b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/green_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/green_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_cable.json index 8f5bcbcf2..ed91eb4d0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_constructor.json index 540f5e7c3..3396ea2b1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_controller.json index 57138ee09..afc6b1b15 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_crafting_grid.json index a7fe68329..4d8a692d6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_destructor.json index ee5d6913a..071729d51 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_detector.json index bda7c908f..3a7b78639 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_exporter.json index e458a4fb7..4a255bab4 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_external_storage.json index abc3c0138..49a924928 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_grid.json index a545faeb4..610baf8c0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_importer.json index 860b58deb..13a4bc3da 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_receiver.json index d1053d126..00638c4ac 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_transmitter.json index f194d254d..0ba8c5ccb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_security_manager.json new file mode 100644 index 000000000..509373708 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/light_blue_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/light_blue_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_wireless_transmitter.json index c7b4ed99b..0750362c6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_blue_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_blue_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_cable.json index 666af33e4..f2a2ddc6a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_constructor.json index 782ab7ae5..b40e6a001 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_controller.json index 6060e0ed1..2a0344eb4 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_crafting_grid.json index db2fc8eba..1fc9ad612 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_destructor.json index 5d33992c5..f2a798a2d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_detector.json index be4f81bb3..4d554feca 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_exporter.json index e4f023aa1..baa2b23aa 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_external_storage.json index 974296c55..7b9b00cb3 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_grid.json index 2dfa51383..8a5d3f4d4 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_importer.json index 91cf433aa..1229fb09e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_receiver.json index 3ddba8f5d..edc0cafe1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_transmitter.json index 691df5431..81ee89e5f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_security_manager.json new file mode 100644 index 000000000..be6a18ddb --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/light_gray_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/light_gray_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_wireless_transmitter.json index 5909bc045..bf5c05053 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/light_gray_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/light_gray_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_cable.json index c7e42d10f..f036152b7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_constructor.json index ea634b284..af59234ad 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_controller.json index 91d54260d..98a0b48c6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_crafting_grid.json index 0a081c894..e8d644c80 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_destructor.json index 0ef8da2b0..7000778a6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_detector.json index 588d61bf7..059a9cec8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_exporter.json index 491635053..3a080ef54 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_external_storage.json index d6f916e86..5251287c0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_grid.json index 1af9a55ef..3b644ae8e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_importer.json index 24b9b3c10..c18d8d042 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_receiver.json index 4304825b5..13226fa91 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_transmitter.json index 27e675c29..8186b4d10 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_security_manager.json new file mode 100644 index 000000000..727c71661 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/lime_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/lime_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_wireless_transmitter.json index 73ca47661..6268dc123 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/lime_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/lime_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_cable.json index b94c91b41..fabef1c76 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_constructor.json index b88bbea84..1303f9eba 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_controller.json index 1b91de63e..45b19c436 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_crafting_grid.json index 4a3cafa31..e553a097e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_destructor.json index 0b7c84f10..1285cc6ce 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_detector.json index b5c9feb2c..62d44798d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_exporter.json index ee06fd332..400335a10 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_external_storage.json index 87f47602b..19ffa164c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_grid.json index 66d028bea..a9e38b2d0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_importer.json index 730c32126..bf6e0a693 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_receiver.json index 6eac125ee..186fdc0e1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_transmitter.json index 6cdba8303..99be2e932 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_security_manager.json new file mode 100644 index 000000000..4a1a0ae89 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/magenta_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/magenta_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_wireless_transmitter.json index c75ed2bcc..fea49c827 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/magenta_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/magenta_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_cable.json index 72945e042..0285255cb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_constructor.json index 61f00552c..32c8ad26c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_controller.json index 1263fd5d9..49c981231 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_crafting_grid.json index fe6ca6b0f..e3539cf72 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_destructor.json index 6cd444479..f5f2a7aa2 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_detector.json index 748706779..0e74d3dc6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_exporter.json index 1a90e567a..b75722db9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_external_storage.json index c7d77e64b..231a43c1a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_grid.json index c0e03af1f..851c33b29 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_importer.json index ae1217e7f..7a61d79f6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_receiver.json index a68106768..b431a22cb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_transmitter.json index bcf7a5a24..b5c9fee67 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_security_manager.json new file mode 100644 index 000000000..f53c67264 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/orange_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/orange_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_wireless_transmitter.json index 490111439..cf0d51e26 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/orange_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/orange_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_cable.json index d30654bfd..075f77bf9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_constructor.json index 38a138e1a..77a35f5e0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_controller.json index 2f9317058..ddcf2b74b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_crafting_grid.json index 0ffcfbb5f..55eafcb5a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_destructor.json index 9ff581aab..c0d6b97e1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_detector.json index 77f463847..bb09f83da 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_exporter.json index 789ab4f22..9b15831dc 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_external_storage.json index 99aae73ee..b8992ae5d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_grid.json index 267a3e7a1..ba5e6b45c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_importer.json index 88bd9162f..7d6ae0423 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_receiver.json index 3d4551d03..7f409edd2 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_transmitter.json index cbb5dbab7..2a182295a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_security_manager.json new file mode 100644 index 000000000..dc4adf64e --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/pink_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/pink_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_wireless_transmitter.json index 9b36d5e85..74e50c3f3 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/pink_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/pink_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_cable.json index 02a4a193a..c3f5c4b7c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_constructor.json index b67f655dc..6491e37b5 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_controller.json index a6117bf26..3b99479f9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_crafting_grid.json index 41d2a0d9f..6131d8467 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_destructor.json index de5af634c..1adb6c96a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_detector.json index 64af6ac2e..9bef13044 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_exporter.json index 8f7c72887..97ed5f52b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_external_storage.json index 9289c8dfa..5129f4a43 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_grid.json index 4e5ea53f3..0daf73dc0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_importer.json index 60b172977..32b71ef30 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_receiver.json index cf37cb575..53cb7df95 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_transmitter.json index aba85fa45..9babbd664 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_security_manager.json new file mode 100644 index 000000000..8fb8d9831 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/purple_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/purple_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_wireless_transmitter.json index 7fbd3a1fa..e82d0ed5d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/purple_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/purple_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_cable.json index 5f287b2cc..ebdc8bc40 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_constructor.json index ee73bce20..06d07941c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_controller.json index 5f680cce5..dac1b12d5 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_crafting_grid.json index 0adc4a01e..2de8f3d60 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_destructor.json index 711816674..47d2b537c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_detector.json index 98253ce6f..88044470f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_exporter.json index 7ae723b27..b1bda95f9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_external_storage.json index 02809c018..ca6b06064 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_grid.json index 86e8e50cb..20c87df16 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_importer.json index e32ce9456..34b68501b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_receiver.json index 7a0d917dd..e19c1aca1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_transmitter.json index 178e31944..04ca13c8a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_security_manager.json new file mode 100644 index 000000000..91eb31661 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/red_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/red_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_wireless_transmitter.json index fcd5ba77d..01070f18d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/red_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/red_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_cable.json index 0ba766635..a7b1b118a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_constructor.json index bc6e21f0d..ed20df42f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_controller.json index 118fd3bf5..4801f1d09 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_crafting_grid.json index 9ecb9b6dd..86d8d6d4f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_destructor.json index 51ad4bbcf..1b16d153f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_detector.json index 33a26237b..cbcba7a1d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_exporter.json index 27ed7a5b8..44ced3052 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_external_storage.json index d7243cd7b..ef91d74df 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_grid.json index c034d5c54..946abadf9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_importer.json index 33ab1737e..4c4b35fac 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_receiver.json index c0d7cf997..d1630ef19 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_transmitter.json index e173f3582..36b49b2ae 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_security_manager.json new file mode 100644 index 000000000..cb8ea3ca4 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/white_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/white_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_wireless_transmitter.json index dac38efab..0ae9fd1ec 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/white_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/white_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_cable.json index dc8637946..f725523f7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_cable.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_cables", - "has_the_recipe" + "has_the_recipe", + "has_cables" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_cable" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_constructor.json index 49fad2a85..93ddb72fa 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_constructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_constructors", - "has_the_recipe" + "has_the_recipe", + "has_constructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_constructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_controller.json index fea864e44..dc7fc6e3f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_controller.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_controllers", - "has_the_recipe" + "has_the_recipe", + "has_controllers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_crafting_grid.json index 7ad62c552..793f0105a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_crafting_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_crafting_grids", - "has_the_recipe" + "has_the_recipe", + "has_crafting_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_crafting_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_destructor.json index e700d3ff1..0a1688f8e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_destructor.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_destructors", - "has_the_recipe" + "has_the_recipe", + "has_destructors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_destructor" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_detector.json index 4bce6d300..ea594146f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_detector.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_detectors", - "has_the_recipe" + "has_the_recipe", + "has_detectors" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_exporter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_exporter.json index aef2ee98d..50b5808ed 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_exporter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_exporter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_exporters", - "has_the_recipe" + "has_the_recipe", + "has_exporters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_exporter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_external_storage.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_external_storage.json index 57927b01a..fa82da1df 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_external_storage.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_external_storage.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_external_storages", - "has_the_recipe" + "has_the_recipe", + "has_external_storages" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_external_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_grid.json index 6fae68308..e1ffee07d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_grid.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_grids", - "has_the_recipe" + "has_the_recipe", + "has_grids" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_grid" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_importer.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_importer.json index b24d50eeb..38e632731 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_importer.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_importer.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_importers", - "has_the_recipe" + "has_the_recipe", + "has_importers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_importer" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_receiver.json index 28300c863..9ef41ddc1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_receiver.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_receivers", - "has_the_recipe" + "has_the_recipe", + "has_network_receivers" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_network_receiver" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_transmitter.json index 68a1b2078..503197c8b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_network_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_network_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_network_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_network_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_security_manager.json new file mode 100644 index 000000000..3a3b93a86 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_security_manager.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_security_managers": { + "conditions": { + "items": [ + { + "tag": "refinedstorage2:security_managers" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "refinedstorage2:coloring/yellow_security_manager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_security_managers" + ] + ], + "rewards": { + "recipes": [ + "refinedstorage2:coloring/yellow_security_manager" + ] + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_wireless_transmitter.json index 7441aac81..ced350d20 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/advancements/recipes/misc/coloring/yellow_wireless_transmitter.json @@ -20,14 +20,13 @@ }, "requirements": [ [ - "has_wireless_transmitters", - "has_the_recipe" + "has_the_recipe", + "has_wireless_transmitters" ] ], "rewards": { "recipes": [ "refinedstorage2:coloring/yellow_wireless_transmitter" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_cable.json index e2cfdf303..eff94e73f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_constructor.json index 52234d1e6..753922d66 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_controller.json index c3b8bf3b0..01bc58310 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_crafting_grid.json index 15dce14b8..4a80bf7d7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_creative_controller.json index 796ee92a0..d43a40079 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_destructor.json index 2e74ccb8f..3ac5fd96a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_detector.json index ec453b08b..55dca85cf 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_grid.json index 7b3915599..b74138620 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_receiver.json index 0ffff7793..2a5a00d4e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_transmitter.json index f925deda4..2ce2581b7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_security_manager.json new file mode 100644 index 000000000..4fd9781dd --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:black_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/black_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_wireless_transmitter.json index aac4414b8..71b4c8adb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/black_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_cable.json index 8e60be672..563325194 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_constructor.json index 7337fb0ac..388e5bdc0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_controller.json index 0bbd4161a..390df51b6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_crafting_grid.json index 52b199ebb..1750a90b1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_creative_controller.json index f95ab87ed..64cf2a64e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_destructor.json index 79f923813..e1005c998 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_detector.json index ad0a77e16..acef0289b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_grid.json index ec94cd31f..be447f5c9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_receiver.json index dd9a16080..7f7f55aaf 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_transmitter.json index 44656ecfa..4b6d5871a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_security_manager.json new file mode 100644 index 000000000..c6b69b0e3 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:blue_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/blue_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_wireless_transmitter.json index 700a5b4d5..376e0aa4b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/blue_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_cable.json index c0de48a91..0100a7b2c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_constructor.json index cb5beced7..9c07417e5 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_controller.json index 6f7131de0..b01b69478 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_crafting_grid.json index 544eef0d5..ce03dd013 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_creative_controller.json index 7390d4919..06c1cd897 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_destructor.json index d3f32fd39..28591c9e7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_detector.json index 4dcf4fb8f..ceb90498a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_grid.json index 18ad70cc3..a5573be2e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_receiver.json index 126e8020a..4968b9168 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_transmitter.json index 4e548e328..3196e10e6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_security_manager.json new file mode 100644 index 000000000..316fbf1f7 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:brown_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/brown_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_wireless_transmitter.json index 999709155..e8deea0e8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/brown_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cable.json index bc75140b7..b1be9e0da 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/constructor.json index c828c3788..7c2b6d059 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/controller.json index af54b8c3a..c90360d3b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/crafting_grid.json index 64f93b407..c96954927 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/creative_controller.json index dd6f3550e..e4657e54b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_cable.json index 478b80a7d..339b1c487 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_constructor.json index cb8fdf17f..8d0b3bd0a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_controller.json index d892078dc..d67a53588 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_crafting_grid.json index e16bfd020..ed3650356 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_creative_controller.json index 538f397d0..c67540990 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_destructor.json index 372aae582..a78b7a597 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_detector.json index 321be8bf1..aae8bcf1e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_grid.json index 4a05ed59f..f4ef95783 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_receiver.json index 09b99f3ff..336cfb96a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_transmitter.json index f92f09225..b0ad4ad1f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_security_manager.json new file mode 100644 index 000000000..6e3cd9ddf --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:cyan_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/cyan_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_wireless_transmitter.json index bc519e8f2..ffa5b37d4 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/cyan_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/destructor.json index 66aea6788..daed8dffa 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/detector.json index 505644a67..e49d218e0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_controller.json index 56b7bec33..023383749 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_crafting_grid.json index af754251c..ef824f9e8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_creative_controller.json index c905f2260..0efaad58a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_detector.json index 066c3ee66..e42e98f0d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_grid.json index 7667ffc26..093482b2c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_receiver.json index 0b6fa43d1..391a6546c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_transmitter.json index b4ad2b8f3..496d28ea7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_security_manager.json new file mode 100644 index 000000000..d90110b34 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:gray_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/gray_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_wireless_transmitter.json index 57a970c1b..663c4db65 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/gray_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_cable.json index cddce171f..1b14dae94 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_constructor.json index 73b3c1a9f..1d25fc4b6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_controller.json index c09b4bceb..083a51bc7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_crafting_grid.json index 7386f9e02..a806a35b6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_creative_controller.json index 57082d5a1..a76bf9664 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_destructor.json index b8761d8ec..cd2d9f2f3 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_detector.json index ae5a4b356..bc173e80a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_grid.json index c64bc912b..23f41e9cc 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_receiver.json index db633f063..439eb4a2d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_transmitter.json index 954149bde..8a9a96cdc 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_security_manager.json new file mode 100644 index 000000000..b63db65e0 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:green_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/green_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_wireless_transmitter.json index fcdf20e4f..4c1dfaff6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/green_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/grid.json index ed2c54f9c..20c0277bb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_cable.json index e938f9347..7491212a7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_constructor.json index 65c0f40a0..32bbf6e2f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_destructor.json index a0d3a4f89..49af40ee0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_blue_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_cable.json index 12085e27a..91b44a8db 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_constructor.json index 239a790f8..156bcec4c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_controller.json index 516f38265..28742125c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_crafting_grid.json index 5807a3694..4aad99ac8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_creative_controller.json index 3758999fb..e8b44c91a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_destructor.json index a7db33903..72bbe173d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_detector.json index 4fe040506..99971e977 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_grid.json index 08b41c906..cba39f571 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_receiver.json index 3e81cc321..fffe0d175 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_transmitter.json index 48e4801ea..7c7b2060e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_security_manager.json new file mode 100644 index 000000000..ebf2714e3 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:light_gray_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/light_gray_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_wireless_transmitter.json index 63a18bdc3..05dcfb99a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/light_gray_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_cable.json index b801d3d03..e5ba63283 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_constructor.json index 6a2ba44be..5cbc5a8bb 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_controller.json index 5a14808ad..def85bb51 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_crafting_grid.json index 5d9304d3f..3119b1de4 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_creative_controller.json index 54c894202..abda659ee 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_destructor.json index ad178ca74..35204ed7f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_detector.json index 808d8d8b0..4ced33fd0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_grid.json index 78b70f199..f617cf60a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_receiver.json index 7e2244265..a77be133b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_transmitter.json index eed497cfa..3003ee5ca 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_security_manager.json new file mode 100644 index 000000000..99a7b4554 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:lime_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/lime_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_wireless_transmitter.json index 49c297dc6..e661ef3b1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/lime_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_cable.json index c17cc4dae..a9925716d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_constructor.json index cf1d4b808..e03d2e406 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_controller.json index 1e6f015e8..d2d6e9785 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_crafting_grid.json index 5919d0f2a..8ec7cedb1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_creative_controller.json index 29fd85f5b..fb9cfcd94 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_destructor.json index 6a1aacd9a..8e461396e 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_detector.json index f1be4a1ab..0dc9901a6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_grid.json index 7a60d4239..2e8e1464d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_receiver.json index eda8e2384..176a955c1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_transmitter.json index 15777c802..782b74e49 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_security_manager.json new file mode 100644 index 000000000..3c90dc9c2 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:magenta_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/magenta_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_wireless_transmitter.json index 5694135d2..a63f5a601 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/magenta_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_receiver.json index 34a5d8900..47358ed7a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_transmitter.json index 80d86c15b..df0825083 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_cable.json index f8a86ba33..5910707d0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_constructor.json index 054d147b3..22d46c36f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_controller.json index af69c7994..48cc35100 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_crafting_grid.json index 185bb57e6..c9321c88d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_creative_controller.json index c3f2ef813..d027af4b9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_destructor.json index b11ad2b40..19a0e2596 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_detector.json index 53503f347..db1e1ed96 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_grid.json index 44634b606..b011aaecd 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_receiver.json index f61f350bd..98722f49f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_transmitter.json index 5bab22f68..4c3beee56 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_security_manager.json new file mode 100644 index 000000000..326088094 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:orange_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/orange_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_wireless_transmitter.json index 86becf6e7..e3ef20fc5 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/orange_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_cable.json index ef42b7fbd..31d0a4961 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_constructor.json index 133ee2c9d..690f0268f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_controller.json index 4b750c25b..af41cdaa9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_crafting_grid.json index 6a5a11f7a..703b20845 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_creative_controller.json index e8957e2d3..7ab6dbfc7 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_destructor.json index d0123f4cf..40e00870c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_detector.json index ddaffe7b7..895fca408 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_grid.json index 7aca478b3..f39fc6644 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_receiver.json index 962eea8de..30297ee72 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_transmitter.json index 70c0580c8..46de8d798 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_security_manager.json new file mode 100644 index 000000000..e2ff9bf92 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:pink_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/pink_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_wireless_transmitter.json index 162626eaa..da03da537 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/pink_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_cable.json index 8eb0d07c2..f96f27896 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_constructor.json index 3e3d8d945..322f8ee65 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_controller.json index cca450e42..8686b8aae 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_crafting_grid.json index a229fb325..e2d0b1a01 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_creative_controller.json index d3859283a..dc8360927 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_destructor.json index 8c39f9ffb..5112e726d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_detector.json index 9b1540893..bbaa5a9cc 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_grid.json index 3531b1eeb..7107b2627 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_receiver.json index 59612d49b..ac5c1f0e2 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_transmitter.json index 71e632a40..7fb4dd113 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_security_manager.json new file mode 100644 index 000000000..6975ab4da --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:purple_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/purple_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_wireless_transmitter.json index a39f427aa..f3674203f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/purple_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_cable.json index c47ac0e54..4c23ac676 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_constructor.json index 0a103c014..90122e7c5 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_controller.json index bdd81d2d7..0b9348890 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_crafting_grid.json index 23c3ede51..7246dc446 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_creative_controller.json index 1c47f0137..fc039287a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_destructor.json index 61642d00e..e4a8e5050 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_detector.json index 73081eb78..d394bd026 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_grid.json index 0457f182a..c894a3ca4 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_receiver.json index 9019cb58b..fc732590f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_transmitter.json index d891359c3..2d253ea54 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_security_manager.json new file mode 100644 index 000000000..989b85699 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:red_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/red_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_wireless_transmitter.json index aaaee6423..a2ebfb507 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/red_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/security_manager.json new file mode 100644 index 000000000..b98b0b671 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_cable.json index a7668c676..a748edeac 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_constructor.json index bf11acf4f..5b6a1c86d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_controller.json index 682dd8150..04ae38487 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_crafting_grid.json index 7e0b47cec..6ae9c631a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_creative_controller.json index 0950b095b..927a4cd6c 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_destructor.json index 5f53b01d4..ad803f531 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_detector.json index 04695cf34..d149876b4 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_grid.json index e9e0b79fb..edfd2aba3 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_receiver.json index cccc597dc..beab19808 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_transmitter.json index 4c1bdc48a..b3407b6b8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_security_manager.json new file mode 100644 index 000000000..1bb6ac5e7 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:white_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/white_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_wireless_transmitter.json index 0ef3b6fb2..d3cc6214a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/white_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/wireless_transmitter.json index 193747431..f86b96a1a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_cable.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_cable.json index 6dd9e5b74..ccebb6c10 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_cable.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_cable.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_constructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_constructor.json index 0003bab4f..72570910d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_constructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_constructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_controller.json index 3497684bf..351b5d8e1 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "functions": [ { "function": "refinedstorage2:energy" diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_crafting_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_crafting_grid.json index 2336129d9..450c5b703 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_crafting_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_crafting_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_creative_controller.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_creative_controller.json index cbd6769a0..2ee3240be 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_creative_controller.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_creative_controller.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_destructor.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_destructor.json index a6fd2e5a3..cc5abe315 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_destructor.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_destructor.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_detector.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_detector.json index c93c8db28..a0cea357f 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_detector.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_detector.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_grid.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_grid.json index 5e966b46e..4a2960442 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_grid.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_grid.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_receiver.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_receiver.json index 9aa605850..5dd21ad2a 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_receiver.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_receiver.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_transmitter.json index 14549c329..b92dc2c60 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_network_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_security_manager.json new file mode 100644 index 000000000..47f43dbc6 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_security_manager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage2:yellow_security_manager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "refinedstorage2:blocks/yellow_security_manager" +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_wireless_transmitter.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_wireless_transmitter.json index a977b9fbb..74fe8195b 100644 --- a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_wireless_transmitter.json +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/loot_tables/blocks/yellow_wireless_transmitter.json @@ -1,4 +1,5 @@ { + "type": "minecraft:block", "pools": [ { "bonus_rolls": 0.0, diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/black_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/black_security_manager.json new file mode 100644 index 000000000..82f2b3780 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/black_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:black_dye" + } + ], + "result": { + "item": "refinedstorage2:black_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/blue_security_manager.json new file mode 100644 index 000000000..c5416e72f --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/blue_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:blue_dye" + } + ], + "result": { + "item": "refinedstorage2:blue_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/brown_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/brown_security_manager.json new file mode 100644 index 000000000..287036f5a --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/brown_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:brown_dye" + } + ], + "result": { + "item": "refinedstorage2:brown_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/cyan_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/cyan_security_manager.json new file mode 100644 index 000000000..8f3dd7cc5 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/cyan_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:cyan_dye" + } + ], + "result": { + "item": "refinedstorage2:cyan_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/gray_security_manager.json new file mode 100644 index 000000000..f5926ad95 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/gray_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:gray_dye" + } + ], + "result": { + "item": "refinedstorage2:gray_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/green_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/green_security_manager.json new file mode 100644 index 000000000..5e9f5db34 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/green_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:green_dye" + } + ], + "result": { + "item": "refinedstorage2:green_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_blue_security_manager.json new file mode 100644 index 000000000..d9026e427 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_blue_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:light_blue_dye" + } + ], + "result": { + "item": "refinedstorage2:security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_gray_security_manager.json new file mode 100644 index 000000000..8d044e90f --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/light_gray_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:light_gray_dye" + } + ], + "result": { + "item": "refinedstorage2:light_gray_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/lime_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/lime_security_manager.json new file mode 100644 index 000000000..b66210948 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/lime_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:lime_dye" + } + ], + "result": { + "item": "refinedstorage2:lime_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/magenta_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/magenta_security_manager.json new file mode 100644 index 000000000..29a1ef8de --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/magenta_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:magenta_dye" + } + ], + "result": { + "item": "refinedstorage2:magenta_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/orange_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/orange_security_manager.json new file mode 100644 index 000000000..1d1d32708 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/orange_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:orange_dye" + } + ], + "result": { + "item": "refinedstorage2:orange_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/pink_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/pink_security_manager.json new file mode 100644 index 000000000..0730360e5 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/pink_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:pink_dye" + } + ], + "result": { + "item": "refinedstorage2:pink_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/purple_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/purple_security_manager.json new file mode 100644 index 000000000..014bf959a --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/purple_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:purple_dye" + } + ], + "result": { + "item": "refinedstorage2:purple_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/red_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/red_security_manager.json new file mode 100644 index 000000000..5183299ab --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/red_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:red_dye" + } + ], + "result": { + "item": "refinedstorage2:red_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/white_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/white_security_manager.json new file mode 100644 index 000000000..c84fd7abc --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/white_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "refinedstorage2:white_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/yellow_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/yellow_security_manager.json new file mode 100644 index 000000000..c6a01a55f --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/recipes/coloring/yellow_security_manager.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "refinedstorage2:security_managers" + }, + { + "item": "minecraft:yellow_dye" + } + ], + "result": { + "item": "refinedstorage2:yellow_security_manager" + } +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/tags/items/security_managers.json b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/tags/items/security_managers.json new file mode 100644 index 000000000..1ad2bddc6 --- /dev/null +++ b/refinedstorage2-platform-common/src/generated/resources/data/refinedstorage2/tags/items/security_managers.json @@ -0,0 +1,20 @@ +{ + "values": [ + "refinedstorage2:white_security_manager", + "refinedstorage2:orange_security_manager", + "refinedstorage2:magenta_security_manager", + "refinedstorage2:security_manager", + "refinedstorage2:yellow_security_manager", + "refinedstorage2:lime_security_manager", + "refinedstorage2:pink_security_manager", + "refinedstorage2:gray_security_manager", + "refinedstorage2:light_gray_security_manager", + "refinedstorage2:cyan_security_manager", + "refinedstorage2:purple_security_manager", + "refinedstorage2:blue_security_manager", + "refinedstorage2:brown_security_manager", + "refinedstorage2:green_security_manager", + "refinedstorage2:red_security_manager", + "refinedstorage2:black_security_manager" + ] +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index b5b1db776..ddde33609 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -57,6 +57,7 @@ import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.StorageTypes; @@ -154,6 +155,7 @@ import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.QUARTZ_ENRICHED_IRON_BLOCK; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.REGULATOR_UPGRADE; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.SECURITY_CARD; +import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.SECURITY_MANAGER; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.SILICON; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.STORAGE_BLOCK; import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.STORAGE_HOUSING; @@ -317,6 +319,7 @@ protected final void registerBlocks( PortableGridType.CREATIVE, creativePortableGridBlockEntityFactory ))); + Blocks.INSTANCE.getSecurityManager().registerBlocks(callback); } protected final void registerItems(final RegistryCallback callback) { @@ -335,6 +338,7 @@ protected final void registerItems(final RegistryCallback callback) { Blocks.INSTANCE.getWirelessTransmitter().registerItems(callback, Items.INSTANCE::addWirelessTransmitter); Blocks.INSTANCE.getNetworkReceiver().registerItems(callback, Items.INSTANCE::addNetworkReceiver); Blocks.INSTANCE.getNetworkTransmitter().registerItems(callback, Items.INSTANCE::addNetworkTransmitter); + Blocks.INSTANCE.getSecurityManager().registerItems(callback, Items.INSTANCE::addSecurityManager); registerStorageItems(callback); registerUpgrades(callback); } @@ -623,6 +627,13 @@ protected final void registerBlockEntities( Blocks.INSTANCE.getCreativePortableGrid() ) )); + BlockEntities.INSTANCE.setSecurityManager(callback.register( + SECURITY_MANAGER, + () -> typeFactory.create( + SecurityManagerBlockEntity::new, + Blocks.INSTANCE.getSecurityManager().toArray() + ) + )); } protected final void registerMenus(final RegistryCallback> callback, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java index d8ddad985..1993d55b6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java @@ -10,6 +10,14 @@ import net.minecraft.resources.ResourceLocation; public interface Config { + ScreenSize getScreenSize(); + + void setScreenSize(ScreenSize size); + + boolean isSmoothScrolling(); + + int getMaxRowsStretch(); + GridEntry getGrid(); CraftingGridEntry getCraftingGrid(); @@ -52,13 +60,7 @@ public interface Config { PortableGridEntry getPortableGrid(); - boolean isSmoothScrolling(); - - ScreenSize getScreenSize(); - - void setScreenSize(ScreenSize size); - - int getMaxRowsStretch(); + SimpleEnergyUsageEntry getSecurityManager(); interface SimpleEnergyUsageEntry { long getEnergyUsage(); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/BlockEntities.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/BlockEntities.java index 4fdfd24b0..3868df5bb 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/BlockEntities.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/BlockEntities.java @@ -12,6 +12,7 @@ import com.refinedmods.refinedstorage2.platform.common.importer.ImporterBlockEntity; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkReceiverBlockEntity; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterBlockEntity; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.AbstractDiskDriveBlockEntity; @@ -77,6 +78,8 @@ public final class BlockEntities { private Supplier> portableGrid; @Nullable private Supplier> creativePortableGrid; + @Nullable + private Supplier> securityManager; private BlockEntities() { } @@ -252,4 +255,12 @@ public BlockEntityType getCreativePortableGrid( public void setCreativePortableGrid(final Supplier> supplier) { this.creativePortableGrid = supplier; } + + public BlockEntityType getSecurityManager() { + return requireNonNull(securityManager).get(); + } + + public void setSecurityManager(final Supplier> supplier) { + this.securityManager = supplier; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java index b13f8e159..e48858a26 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java @@ -17,6 +17,7 @@ import com.refinedmods.refinedstorage2.platform.common.networking.CableBlock; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkReceiverBlock; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterBlock; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerBlock; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.DiskDriveBlock; @@ -137,6 +138,12 @@ public final class Blocks { ContentNames.NETWORK_TRANSMITTER, COLOR ); + private final BlockColorMap securityManager = new BlockColorMap<>( + SecurityManagerBlock::new, + ContentIds.SECURITY_MANAGER, + ContentNames.SECURITY_MANAGER, + COLOR + ); @Nullable private Supplier quartzEnrichedIronBlock; @@ -290,4 +297,8 @@ public PortableGridBlock getCreativePortableGrid() { public void setCreativePortableGrid(final Supplier supplier) { this.creativePortableGrid = supplier; } + + public BlockColorMap getSecurityManager() { + return securityManager; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java index 0955232ba..c1898295d 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentIds.java @@ -56,6 +56,7 @@ public final class ContentIds { public static final ResourceLocation CREATIVE_PORTABLE_GRID = createIdentifier("creative_portable_grid"); public static final ResourceLocation SECURITY_CARD = createIdentifier("security_card"); public static final ResourceLocation FALLBACK_SECURITY_CARD = createIdentifier("fallback_security_card"); + public static final ResourceLocation SECURITY_MANAGER = createIdentifier("security_manager"); private ContentIds() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java index 7cfa030b9..9a6ea25f5 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/ContentNames.java @@ -31,6 +31,7 @@ public final class ContentNames { public static final MutableComponent PORTABLE_GRID = name("portable_grid"); public static final MutableComponent SECURITY_CARD = createTranslation("item", "security_card"); public static final MutableComponent FALLBACK_SECURITY_CARD = createTranslation("item", "fallback_security_card"); + public static final MutableComponent SECURITY_MANAGER = name("security_manager"); private ContentNames() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java index c5bb5336a..fd43e703b 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/CreativeModeTabItems.java @@ -53,6 +53,7 @@ private static void appendBlocks(final Consumer consumer) { itemConsumer.accept(Blocks.INSTANCE.getStorageMonitor()); Items.INSTANCE.getNetworkTransmitters().stream().map(Supplier::get).forEach(itemConsumer); Items.INSTANCE.getNetworkReceivers().stream().map(Supplier::get).forEach(itemConsumer); + Items.INSTANCE.getSecurityManagers().stream().map(Supplier::get).forEach(itemConsumer); } private static void appendBlockColors(final Consumer consumer, final BlockColorMap map) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java index bdbd5caf9..e0e9fbf16 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java @@ -16,6 +16,7 @@ public final class DefaultEnergyUsage { public static final long STORAGE_MONITOR = 4; public static final long NETWORK_RECEIVER = 8; public static final long NETWORK_TRANSMITTER = 32; + public static final long SECURITY_MANAGER = 16; public static final long CONTROLLER_CAPACITY = 1000; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java index bd99e3a14..b95e19a91 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java @@ -47,6 +47,7 @@ public final class Items { private final List> allWirelessTransmitters = new ArrayList<>(); private final List> allNetworkReceivers = new ArrayList<>(); private final List> allNetworkTransmitters = new ArrayList<>(); + private final List> allSecurityManagers = new ArrayList<>(); @Nullable private Supplier quartzEnrichedIron; @Nullable @@ -398,6 +399,14 @@ public List> getNetworkTransmitters() { return Collections.unmodifiableList(allNetworkTransmitters); } + public void addSecurityManager(final Supplier supplier) { + allSecurityManagers.add(supplier); + } + + public List> getSecurityManagers() { + return Collections.unmodifiableList(allSecurityManagers); + } + public Item getNetworkCard() { return requireNonNull(networkCard).get(); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Tags.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Tags.java index be33cae1e..c46aeeb72 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Tags.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Tags.java @@ -23,6 +23,7 @@ public final class Tags { public static final TagKey WIRELESS_TRANSMITTERS = createTag("wireless_transmitters"); public static final TagKey NETWORK_RECEIVERS = createTag("network_receivers"); public static final TagKey NETWORK_TRANSMITTERS = createTag("network_transmitters"); + public static final TagKey SECURITY_MANAGERS = createTag("security_managers"); private Tags() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java index 026576d86..7a8d67dce 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java @@ -3,13 +3,16 @@ import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class CreativeControllerBlockItem extends NamedBlockItem { + private static final MutableComponent HELP = createTranslation("item", "creative_controller.help"); + CreativeControllerBlockItem(final Block block, final Component name) { - super(block, new Item.Properties().stacksTo(1), name, createTranslation("item", "creative_controller.help")); + super(block, new Item.Properties().stacksTo(1), name, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java index d33ef786e..d928f622a 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java @@ -35,7 +35,6 @@ public GridBlock(final DyeColor color, final MutableComponent name) { super(name, color); } - @Override public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getGrid(); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java index 880c9702f..d21515a49 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java @@ -30,6 +30,7 @@ import static com.refinedmods.refinedstorage2.platform.common.networking.NetworkReceiverKey.getDimensionName; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; +// TODO: energy usage per card in the security manager. public class NetworkCardItem extends Item { private static final MutableComponent UNBOUND_HELP = createTranslation("item", "network_card.unbound_help"); private static final MutableComponent BOUND_HELP = createTranslation("item", "network_card.bound_help"); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java new file mode 100644 index 000000000..7fd137575 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java @@ -0,0 +1,101 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.common.content.BlockColorMap; +import com.refinedmods.refinedstorage2.platform.common.content.BlockConstants; +import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; +import com.refinedmods.refinedstorage2.platform.common.content.Blocks; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; +import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; +import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirection; +import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirectionType; +import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionType; +import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; + +import javax.annotation.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public class SecurityManagerBlock extends AbstractDirectionalBlock + implements ColorableBlock, BlockItemProvider, EntityBlock { + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + + private static final MutableComponent HELP = createTranslation("block", "security_manager.help"); + private static final AbstractBlockEntityTicker TICKER = + new NetworkNodeBlockEntityTicker<>(BlockEntities.INSTANCE::getSecurityManager, ACTIVE); + + private final DyeColor color; + private final MutableComponent name; + + public SecurityManagerBlock(final DyeColor color, final MutableComponent name) { + super(BlockConstants.PROPERTIES); + this.color = color; + this.name = name; + } + + @Override + protected BlockState getDefaultState() { + return super.getDefaultState().setValue(ACTIVE, false); + } + + @Override + protected void createBlockStateDefinition(final StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE); + } + + @Override + protected DirectionType getDirectionType() { + return BiDirectionType.INSTANCE; + } + + @Override + public BlockColorMap getBlockColorMap() { + return Blocks.INSTANCE.getSecurityManager(); + } + + @Override + public DyeColor getColor() { + return color; + } + + @Override + public MutableComponent getName() { + return name; + } + + @Override + public NamedBlockItem createBlockItem() { + return new NamedBlockItem(this, new Item.Properties(), getName(), HELP); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(final BlockPos pos, final BlockState state) { + return new SecurityManagerBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(final Level level, + final BlockState blockState, + final BlockEntityType type) { + return TICKER.get(level, type); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java new file mode 100644 index 000000000..f477aea81 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -0,0 +1,20 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage2.platform.common.Platform; +import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; +import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; + +public class SecurityManagerBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity { + public SecurityManagerBlockEntity(final BlockPos pos, final BlockState state) { + super( + BlockEntities.INSTANCE.getSecurityManager(), + pos, + state, + new SimpleNetworkNode(Platform.INSTANCE.getConfig().getSecurityManager().getEnergyUsage()) + ); + } +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index afc6b3d08..55292d942 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -32,6 +32,8 @@ "block.refinedstorage2.network_transmitter": "Network Transmitter", "block.refinedstorage2.portable_grid": "Portable Grid", "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", + "block.refinedstorage2.security_manager": "Security Manager", + "block.refinedstorage2.security_manager.help": "Used to store Security Cards and (optionally) a Fallback Security Card for a storage network.", "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", "gui.refinedstorage2.disk_drive.disks": "Disks", "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", @@ -349,7 +351,9 @@ "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", - "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a network to provide your network with energy", + "text.autoconfig.refinedstorage2.option.securityManager": "Security Manager", + "text.autoconfig.refinedstorage2.option.securityManager.energyUsage": "Energy usage", + "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a storage network to provide your network with energy", "advancements.refinedstorage2.connecting": "Connecting", "advancements.refinedstorage2.connecting.description": "Use Cable to connect devices with each other, or place devices against each other", "advancements.refinedstorage2.drives": "Drives", @@ -373,17 +377,19 @@ "advancements.refinedstorage2.storing_externally": "Storing externally", "advancements.refinedstorage2.storing_externally.description": "Use an External Storage to provide the network with storage from an external block like a chest", "advancements.refinedstorage2.detecting": "Detecting", - "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the network", + "advancements.refinedstorage2.detecting.description": "Use redstone to check resources stored in the storage network", "advancements.refinedstorage2.construction": "Construction", "advancements.refinedstorage2.construction.description": "Get blocks from the storage network into the world with a Constructor", "advancements.refinedstorage2.destruction": "Destruction", "advancements.refinedstorage2.destruction.description": "Get blocks from in the world into the storage network with a Destructor", "advancements.refinedstorage2.wireless": "Wireless", - "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid.", + "advancements.refinedstorage2.wireless.description": "Access your resources wirelessly with a Wireless Grid", "advancements.refinedstorage2.better_than_a_barrel": "Better than a barrel", "advancements.refinedstorage2.better_than_a_barrel.description": "Craft a Storage Monitor to view, insert or extract resources in a storage network", "advancements.refinedstorage2.no_cables_required": "No cables required", - "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your network without using cables by using a Network Transmitter, Network Receiver and Network Card", + "advancements.refinedstorage2.no_cables_required.description": "Add extra components to your storage network without using cables by using a Network Transmitter, Network Receiver and Network Card", "advancements.refinedstorage2.portable_storage": "Portable storage", - "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network" + "advancements.refinedstorage2.portable_storage.description": "Craft a Portable Grid to access the content of disks without requiring a storage network", + "advancements.refinedstorage2.security": "Security", + "advancements.refinedstorage2.security.description": "Secure your storage network with a Security Manager and a Security Card" } diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/cutout.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/cutout.json new file mode 100644 index 000000000..f6cf9f51a --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/cutout.json @@ -0,0 +1,82 @@ +{ + "render_type": "cutout", + "parent": "block/cube", + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "faces": { + "down": { + "texture": "#down", + "cullface": "down" + }, + "up": { + "texture": "#up", + "cullface": "up" + }, + "north": { + "texture": "#north", + "cullface": "north" + }, + "south": { + "texture": "#south", + "cullface": "south" + }, + "west": { + "texture": "#west", + "cullface": "west" + }, + "east": { + "texture": "#east", + "cullface": "east" + } + } + }, + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "faces": { + "up": { + "texture": "#cutout_up", + "cullface": "up" + }, + "down": { + "texture": "#cutout_down", + "cullface": "down" + }, + "north": { + "texture": "#cutout_north", + "cullface": "north" + }, + "south": { + "texture": "#cutout_south", + "cullface": "south" + }, + "west": { + "texture": "#cutout_west", + "cullface": "west" + }, + "east": { + "texture": "#cutout_east", + "cullface": "east" + } + } + } + ] +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/emissive_cutout.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/emissive_cutout.json new file mode 100644 index 000000000..418944f69 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/models/block/emissive_cutout.json @@ -0,0 +1,106 @@ +{ + "render_type": "cutout", + "parent": "block/cube", + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "faces": { + "down": { + "texture": "#down", + "cullface": "down" + }, + "up": { + "texture": "#up", + "cullface": "up" + }, + "north": { + "texture": "#north", + "cullface": "north" + }, + "south": { + "texture": "#south", + "cullface": "south" + }, + "west": { + "texture": "#west", + "cullface": "west" + }, + "east": { + "texture": "#east", + "cullface": "east" + } + } + }, + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "faces": { + "up": { + "texture": "#cutout_up", + "cullface": "up", + "neoforge_data": { + "block_light": 15, + "sky_light": 15 + } + }, + "down": { + "texture": "#cutout_down", + "cullface": "down", + "neoforge_data": { + "block_light": 15, + "sky_light": 15 + } + }, + "north": { + "texture": "#cutout_north", + "cullface": "north", + "neoforge_data": { + "block_light": 15, + "sky_light": 15 + } + }, + "south": { + "texture": "#cutout_south", + "cullface": "south", + "neoforge_data": { + "block_light": 15, + "sky_light": 15 + } + }, + "west": { + "texture": "#cutout_west", + "cullface": "west", + "neoforge_data": { + "block_light": 15, + "sky_light": 15 + } + }, + "east": { + "texture": "#cutout_east", + "cullface": "east", + "neoforge_data": { + "block_light": 15, + "sky_light": 15 + } + } + } + } + ] +} \ No newline at end of file diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/back.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/back.png new file mode 100644 index 0000000000000000000000000000000000000000..1b87bf05b477dc037fe36a9e87b7ff35c23db8b8 GIT binary patch literal 540 zcmV+%0^|LOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00E3iL_t(IPnA;JssUjb{og{AT!=8DB&R6J zjOG-7rTwsAh6 zaXcPzI-PJh90YOz6PdPJtt5q&Fqu4^P6gxfSTLW@<^BCnyWNH=6bfjyS|G<_F=(3R zAel@GQmK@KXf!I`dcBTBA^}w@l_Z%Q2n6u^s5i>xG6=Uu551jEM?zGkQjv1W@p#-x z;>T~yD(M{#hw`p!wVL!s4uwLVG-`xf3kHLt@c_0bEwBQz-wNpEdeiCj>wxuoEn+wv z_M|nNO*9$}k46u@T%jCLtyX0%WWQUWmzOG&$-FAy%_B!55l@<77$DplJ@j_FU1YOa zZwvpK!Pgc(XTS@l>$*py=g$`W&VXL0g<`QNJ0*Y4z%)$|ZjBy#d3zb6^7%Y+xg5xT eXF%^u)9?dTNBDxm$Omiy0000D3d3{iB$OpjOcsB_`Hjj3mUw*nk*9n#dz4&fKf5w6wv;Ci|N2 zH{ato-}lXIsjYc@R@wYAhGAw^SH8KiY~kXFH4i0?y4Z?>E%F!T z+Je9}1R;~jgfeo-@md9->$)IHf+X<-!Ta5I0JFU9FDz<^Vc+yDH?SO=r5a(v=?tPA z@iZSo+AXQI{Q^ydFd++F0fa;vQVxjB63*@PQaR(u6mSZsu^spX3rbkRQaoOQkE%AE zE}{LPvWs|Bh;3A~-_Y%1p$_{_r)T2IE@E+E(J?=$!$Z_eU^;=9CcAA;;P`FM7$lU$ zBd7?h%%A?BfRl9~txa5z}!MZEz4gTN$l1lU1VvU^-8GL59; zr6E~3D-Bz*;M%P@Yw@^IZTkVVOUh;Wg!EbVMWx#IuE3<#3#dw&g(!&ya`lA z)kLUjrc|6CbIeYfRCIp6zK~-Q9i`PUA_z+w)MPSU2D}e`P7n@<>{d7_$BR3Na4vH! zU2TJ?C$2(TUr`Pe1{-OrraJS3VM!#H0O+$IZyHBFBwlS>gknMs%@-qQzn-)%;((^A zG6^y_UTbA>sxf8}*8IF9+HgtJND1v^v_g$4%O^S4UFbFSxTEluve;Zv8qmy#VAAZw zh${?Rqb%^msLZR)v|&QlO|mu*^POanfgUbzB@B;S6~b7~`>^Zgu7j`wM4(|lsmmI# zVnyT=vKr>Kh;AlCS;82Ei=p4>x@-W&kmOsh3EZs*laP=MbtLi# zVwE>lQfM$D>%1aiJpm#KNkk+|Z(N5_8^V7ajOo~2*c+BuF7zPTNU`TfxuoZ$S?Ibc z%gj}m&}E~-{!}VRHgMRX_A@4F2z%DB92jn;_1OVp_3L=$I2Tb+fVK; zZ|{5b?o9(Hrd2dne_y|U_MN>~m!A9P$n{0d2lYiKHa`7wXytcj(+9RIo7Z05@#&8} z7r?=tu{{@?kNr7!T4wp?AI|r5T-(4-f4BMA3}#VvU;lx=b9<4tO~owQPHHp!@u#-Y5F6?i(2F`TVuy*o&K%s>%k9uT9lPjm>pm2@2}cgSGMxN z{PL4*yne+~o1T5=CGqyD%)#E%7cMRN>MrK+gRdMpb7kh%bI*Od&v|b*J&IRX*2E4! H*0S+0^hNR? literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..bbcc81641c5cebb911fd0e315acd23e34df2a1b3 GIT binary patch literal 3057 zcmcImdu-KI7%!8|jfX)t1rcK@1{CdWPha=8?n1^cxDoE0+XXg2<+MG$E4#Pt+HSj> zB49+KKq5f|QR9QiA4G(xF)C4`G0_NW$P|c3@DT`#5eWYoP*3k`n`~@BY0}sEe&>7q z&i8%iJk?Nt-}o_8#t;NCzOFXbh~E=}yQ~yHZ@=(2#IJIvw#6feu@%8RirDeuWP%ve zZYG-j=J-NIv(q7{+bRlW(hf!wMAe*(1GP5flPXG@R+Kus|6__Y^(eJOjI(j42DO^C zJuYhMsZVGcAk`9B&|N zY!{JIh@~}_<;buc0+Jv|>^&sMaxBA&4B%)WDXgG?Fqyw7Y|YgTr7<=?ZwvoLsaD^2 z6o%>Q>I!x7A=^zdK$c~Os7DeP%3 zgtSvsYk7H^FkwsvIt&Q0K}cDkt`%`khnvb8*EI&EP#Rgjhq0iD#Vp0+Mfjj<)9E7G z^XGM9kMgk%iuMxS4q_USXLq<7n%9XfPA@p-`HiTLnh{LL@Zw~r)%I<#)gFR`qIdum zzG)0$Fpvy@qKr8NG>{abj#A?y=-Y0>wo`@NX(;$cav;Q!cP=q4-R|=43IfkhKr!f} zC>10U%|>XRO>msT0!0LOv-pF}LE|_zb?C$XV3}s+1ON&vDu5jTwsq6!9u}%=iebBH zh!@UG!z5xHE19(xk1KVS=R-?Fb+IUgT@9J0uBb2~qA(w!BRW!Pof9A}vw}cJB!LH- zB#3&LE6k7CT1Svn!Tel(>9&S-6jwtr3?!*6h|ppr0%;>6$TY44gEmydFk}QZ9fE?k z`&|>4I861|8hE8+jRuNHyr!!(uZIzKO#rkE)ZiiNGA{r=tYQxP?AF*R+l|{g=A5U< zV6_#j9=i&I`ifH6Xm+qUNYzwFZZOQT_+mit%*$Jbk@txgSth0!QxoKilC|H2TNidf z5=CCjk2jbZlxmKdm^Clwh}2)wGEfq9vYwyPCkvaXP|Ihbb~eiw96brLf?Y*jErIq$*FE4vQD0$_oJXhY^D zT0{a%tGpPdrHHJlEYBeX!iCT;cb!*&pm2PlhOWl-Jgr(Qw2}yKLJW2F!LWkP835sa zz#9_Hh6SC5Dhp{H85$5}U1BwPuwVvl2-i3m&9*v`+b^*k=t8`aBG-#jhHIxu=r}1; z%T^cDY3cd>saTMtZL*9Mq> zcZl47EXU;hU~RG+uQFIK7-)ssW5~OW5H+f6o`L{=SXDXx^?j>asBJ>?k9**GwNd1iO8m} zwj8K0sjiHj`FcZX>8@6ie ztJ<{qiSw%-KK#RV`%abryyhpk<=#oxcSrYJSoLH&KGPYy^`^4z)eG&i-eoH<{c+|* z`Kgzmdu;N)L*^;-Sn`o^{<;>0nR#yaN6lM4-60$)Jz|#-^$i!_Dyg2hx?%aN-|snT z&f2|s!^XOc57fW%+6PYc9cO#(T}?M0S^M;FCr9txzy0vR)3fa7XRJ^bM7pOwTXFiA zT4KfKgWITSYZsTjGiyTSxId3iTD)}8=%t_7iP6OG`usMdc76Gp-mMEzZ^vIHlRoS@ Ve{#-kox!2JZeD%t&ABTc{|BWW@d5w< literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/brown.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/brown.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb5241bae85183dc52a398eb6d7e09bb5456a16 GIT binary patch literal 3072 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 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..a45937171aaafec603aff07bc0a8c0329844786e GIT binary patch literal 3062 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 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/light_blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..9327df7da204ef99c30934da740c6d995f17dd1a GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^ir#p-IEGmGC;#~W-`-VXwSp!bJ0D0tdF?-MyZoQ|r5`OPa0|ZP_v2ap z)6VPv=a$WB?mlS1)h^Sc_+Vqz`~SC$&;MV)mb`2X_AQeL1XFBxujt$qFPw0h{FqX`nN z&V0uNCX{{otv~tN$M|K*=0LX!zp?%mZ;*bjKJa@A*c6ZB|0Nl`R6ZWfDP>y*^f!a2 LtDnm{r-UW|PBEbT literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/light_gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..66d439cb25507c96721f3bb9814fd37ef876cb09 GIT binary patch literal 3038 zcmcgu3v3ic7~UpYrKAan5`2YqF#_7XeckTuE73^B$KLsU?r1OZ7@)JP&BVAK%A2ay;g4WibWd$rY;Hu%_NU-N(S zzvlb@nf1+0^Qx=vsG=yUy0IbAg5TrFeRCy#PQKI!@N10Muq2?Uu@lH$LG5^c5=B+5 zv{P+iTXMc`x|s-ou7M)CjEB(_RXZ!^0doZkX#=&}PMo=T;2=ZWFwQKNlYG*vM;&%U zkB?e=no?%Z3R8p3teJFePR9x|Cmyo;@T|%6A|2Brf)b4?d<`w~BG2(MCy1<|=zLTcVs!Chur(iAdP`z%(H8!TGaX^* z=^U5MW+PcC;`;5JplKS%i<~I37{LbJP6%?W6HF;-NT9&)kltE4yV60Ha;w&YTW%!V4Gnq0v z2!wTGX)gIji$X-Cr!BS}=w^fIB=F({lmH=$ zGlWPiud))K5=EUCbXjs! z8KwCN*X$&uBJ&IN1zi*CD6fVNVu%-E6tIRYK$e%IkkwF3VAYr*S(bo!%Z!z@E%0qz z;vhXxEAa|qjTTZB$%FMFlBl;2iebt#{L|pL8M4xx~<9wRNl> zy9!8s#TlVE*hZ+D?ko((L>^z9K%PbUk`d(n;zf>)Q!Fwx;ftQP--=roc0iG3NiL2z z+c}hOOV~JTLBSDapk&El3F%~{LiGkaz?|zY_L^3-viOy@>3mV@z$}Dd5_TfU6o>60 z7I<{2EU3+PAe^jgu(kjTTr121AJw(v43Ah9+;GkZpzGSM3$duc3kqT_O~TwnQJys< zImRlgW*WRCA|zlo4d=R~3sGH^N;Pynt`~Ki9l&WvcoX87>kmdorUZbcu&O2_779^~ zRe42VE!i@n22=$(idpmbV1{f6|8X#;>vSQ10I@va1H6$UKZrAy?`CM=d1>3sR~Ogi zz~cT?E=W3b>HhXJY|QOM+6 zvNrjRS0AbujFy9VC)ROmAEDVpK{FL2CbK|O3>NbjmnV=l7D$#T$%-PI79fl!+T4HI z>~~4zB2XgHz=xNLSv#XrEWUD_0X$pn#Zl{ zTe$I-wc$2)*V^w|f4MMo-cz^MO{==^$oPd94j!oQop^Gr^Ha^NZ$Iv^Xqp#Q8(_hy|3-t`tI$UpRW06GkVrKcJ}9sm6_9@zm;*6J9kc8chB9& zz*oIzD>ojUy<>OXiRg}pY*njAp|5D3_OILoAH$8dmv3;jAXO{0fJ%$RG_HH=Zxpe=Y8IGsk vwf(%dtwm2xKe}t$_TAq literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/lime.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/lime.png new file mode 100644 index 0000000000000000000000000000000000000000..95b7f689227790df08cab56ef88eba4f712e99ec GIT binary patch literal 3066 zcmcImYitx%6yE+2d9+v~gqO%~F z6Oo{hAdg@w7(fU{QH;?aknl$%6%m36CW;UfO^li-sAw!kg+#owueQ?C24$0-xpU8V z&*Qu2oO?Id*DWa9frECqHredV00){u`uI6Z7uQ%6*Zeyl>FtLV4FsBDDMnNPuP_pk|B=|5s~bu~Y;oQe{)&<< zzV9eB-ObX&tZio2oc90Cy}VjVzIsffYLR7BM@%1~KDV1X*A5wW0c zg=^vxhpGNr1Fv+f(LfQA({z>MbO})roo6VSQGMKez`N?FEs;Rczq{IUJqnY5Dm#-d1-X~sZnV4dhB!YZVvi2Ks>%tC* zg1`y+`Fb;hQpuQ!S@Uv^;PA66vXa#UB|#?(DpaX4J)Co$`CikATJxinNo0#sfm$vE zEyzxUHz+r44zj@`qcXR?qXl8IZjrS)m}eV)2Xs+oGiG?$s-TB*-h=J8cAb%U1~4L` z44D%t0r7xRIYFYth^(oAV-aGcLg+WU&M6G9uw0?wZpZaJty&ATnh`#PX!7=hiRcl* zFhqQ$Fp#GtnU`>BKs^|VfYo?a=Z(RF8MGnX;b1h|YDaFr#B!hu@j;4QFG?D&ohG2; zq)aVaU39yp=g+5NK@z@A^tGQMNz;*Q_RE3(R*EhV|D(NOGj3$v@aAH*U#Tt#oGVBlj+SIXSLk z+^L@*TBF93?|%E@^(%i_*8UwQNHqWIwZ}`r(;JSQN?+KwGO}vw#eMrjJ@0ot|H`Ea z@r6B?>KfNg4=uWK_XqaZ7k=04W~`UzO)kGO@wbXMtjoRkH!b^;`fhjppgMcYl#dsg zSD)gqy=P3K_Z^#7dVcoB`CG16FL{0XPAU1=M_}t~r$=qyxodyJ51mVooM~?g^@xq9 zN4-V7I`{aRa~I4<&xoI=POd7SHSN56H1^<{%0pj#wq(vOcwpC&?lMbx;H%BwJZE0! zOa4^${CcjpyKMZj>XP+;%=vWd`o!TWiNm|~XL`Sv7L;!KY5UH)AGc53yRPTWqtmz@ d)yH}#WuAPN>b&QL-NEg=wz@9%_QOwX_y<<}_7(sD literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/magenta.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..a6de6b0776fb707dd41be6f67ac8ddf8c186c174 GIT binary patch literal 3047 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 CaMqjv literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/purple.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/purple.png new file mode 100644 index 0000000000000000000000000000000000000000..41f2a7d49c25d6e08fc0ce325b6e41ee92f55287 GIT binary patch literal 3069 zcmcImYi!k29PdP655W;p5r}j}P+-07>FeG$yDVdOur1!XY!?{=jHm7CR(J1h*LHVz zAbwCZfyB4?L5;-t_#j5jc$thiR3IV>CO*(em}2517)U^kABcE*U)yA33rdr==kYuL z$M5|A|8urBH?5jcI=7S{h#3v_krwBz)kVmSh!%T*$a|44EY3gBWjTmL4b}i~O z>o+>6bz@UZ+t{VaI#s=#tV%0bKmvJ?Oef+=S4oGdj9dk`{b7b8GZ3#UOx5@b$+l=S zS!+3nlmaZRu`EXhU9$-6g)`xdkW! zJrt(=K%&_Y&9gC%Q&^ygU>S=WY!({Dp{YX;js(jzE5`s(*dWG_0$aLi^i2rWHN~); z1jHL>CSV6*>|{qqTQsUPBwY_CHPjFZQ`ppiY3hn-1bIOfIhxl%kOoi?X_Yqstx1N! z8&DTH4&~QJEUm{6Dt~=8zjRB(G77t)sG`8?JkR6hK&NF^z#k(d(FO!Or-nEl@M>P# zJ&uV}9L7gV^{vveL<5B+Uei^Y*Mo=-=>ni-p!y$Cmw5s3K^1d2thd&RTTax{G3Pu* z`n#=Q@z_-8=U12lxxqF+RO3C_!63)thXMXKH@|j*`Qho+NfT4dQKTO)N=APxE?w9F zNfdc8H{NWfQM@f;V%FTOA=1d1wWDYJO6F&%Qg6CA=K6BArWJMPT5*%iB&7nitP7eS zok*v0!{!(pJUJ?}VtYFgChH1On}xZS;q^iX)pTHnC(H_FJmX!My0YmYC;%2nh&E(i zqD3UII5x!~Ern!FWqA%E5X`%Nx#_$D1cl@CIdnCq=V;YBVX_0^Lx`cS-Wg301x+<% zS_>J1?~F!=I1#6Y${G-{8t%wrIWuNKxW>+CRx*X05rJhx2jYViIc}IT94kRW+m4%B zCcBtaQqP@Fg@hzMiySUL5vvN4EHVg;A>35vZAWKB|oA`N9pr2#Jevekt$t&w8X{$(=P* zisx?oYX8x}dDk!4aLcY~C*Jru*1l)=$ImQ3be3$ASia9ZG^@S)wQo+fZXn1VpDdpD z-qXi-cY2E}w@cRS+islhEv)|b0I2-cE#CLzved16?%4VI_jB&;{{UWi{-KjU=pnlTr|;s%9r1U;E|Mt!bJMn2u|+8Lse(1PprB@ eKY8wA$uGezb%RH?Kj&Z28|s=OZ?Cxj;eP-@ck&DX literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/red.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/red.png new file mode 100644 index 0000000000000000000000000000000000000000..b244f44e0ae096e26135a6bcf8264de0c43127a7 GIT binary patch literal 3036 zcmcImdu$X%7+*{zJO#AIVgsyeVxY3OJNvxd^g!qpTkvWr6-u?*x!Kuv?cMHmciX#S zLJUnb#SlzDBg6zXQIwdP7=<84qX0W%(=+uO1BRJ-7k#HNyI-wj zm>E4zOKaGgc*I0rIsz>(i6gmmhM*ayW_d0HQ8y0RB<^(F7ZsJ5EGeN z+~w47^6|P&jV)+XH!>`4`7*X9XA%Kv96~miPPu`Zi*b3mCh5~*fn)QKusg=BpbFX6 zL=#)<`IyxrB9BB-Vs#?|G)2+GrK}`Mq9CdQka(b(qGAG_Ej}F4=3BPe9A8z`MgC%3 zR~TkYLC9vak*pl?{7wNFh9QWOAW1wy@Ik*D!W{1g_m?EZae#a$6FQ#DQi(9>^@cHy zSXyu)ohgfTgCb3YFd+vs0*Hvzr999=Wn8A$Pvwr8EGT0MONm4oKBm}o zx{MCOx;|o2(YG4*hrf`q08LpTy_@S@QIfGI{zc{JFw9J_x)sD(`1 z^V5)QoRfx~Sjf1Yd2NY=+295tbP;Zd$2ekY#BnUs7G)J0BH#@RSUj*4n>Q3I%G**@ z(F_qqRVPTuQi`F}+AD>Vj@3CWnx~-MlllB1tw$3m#x4 z$*UG=4BbG)BR#64sG@4>n9ht@5N@$E$aDL!KO(R)(1+w8#eNXuY~M?>Fq26+D4$(I zpKBG*r*cBFp~nuFpK(dEuyumJ-Nw;93^Qe3LwrR`blX=uK3jeG zp^CaIYot38^;O5eUO)GqEt{X)^V9Q-E2^8F*I($^txQJ`9Q=8ua%9>!(G!PH9=g;s z|GvQ`U+((t+EcTxZr-x@%+?K`Y~OVW?!dP(Iz0AKy65fc8u!32ml@`L;e>adKlQ`O z7}L3a?!3srvvby-J`*ged*a%%moChzuBv=-XZzZYb4YNmWe4^-KR&bYy@A)(9D00d zW%ZF$`xof1930wt_Kgqrqstf8GUq>^|FXsof-qj${r#KmPbbz$!2XUs+tzmHAXxCH zxTHz@DS;4*l_D#f7N{;9{m@_gmZXP{qa7+p22zF8LiF-|=Dl ox5wKS?%R5KX;tO1(^vkweSYJ>oO8MMtMvZeP}dkATG_GXAN^+LLI3~& literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/white.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/white.png new file mode 100644 index 0000000000000000000000000000000000000000..7e600d051008368372a6dcabe0e19dd938ba7a3b GIT binary patch literal 3008 zcmcImTWl0n7#<`+L`iCVsh7mbU?K!&XU<%9XGRvR-C{Smr725jNf2hvIn$2aote%| zyITxM5EKPB5b%abzz1R?5);rwNi2ybJ`khE7)hGogAb4pE)l8^nACIj)~&R(LD^(y z&Yb@{|K&UX|DW?lXUFpk7d*CrVVH&K_EZ;nH_`w6dF1)zjd7E_9`M_HLWX(p5&ECQ z96H?0Fbf8pYupdXPg?k-0$z3}$!m$oYa_iNM znDJY2pVPi2z-za3WZ{;6s3UIW3U+zXAPVw0GTCB2=Y~cx$(8jQWK5?8jx9r?{v_8z z4YJ*tPPWwxFdL7FJQPKVP3SQYSCqK8jFm)56hu`35)a~rs2Cu@R(~9^79iW`O0BBe zB40_aFN%Ca5DJAttRTm{pjQC8t_z|hND@yFd^qezW|4QpMKuj69KyiyBgb=Ds?oH( z!6?ZQPb(qh{kmE=tkOgX6N;uUfS5=_DgzO$VC#adlassa}_WQiZ3;Voj zNT`b^Q4u-zGzO_;5)>DmX`ob6hx$fqfX&DYvYwZ#LrF{md&seeXM`eX z*j|t~$;LT(vlk1#+grAl$rx!jj7%5ebSlXaS7VNY3{BUu1+mVXmJE0xD;60ck++Z% zmt_DFmaW&;r#v`FlZvjd)EDv~(NW(G!_t5v=~$)OAg?79k=J#o@QS6$qNZs!(ojv? zn!q6?Zsr=bQm+uvXk#rdLuBzXN?=|?3gC5M(T9q3SpjmwA{~zwB$50CK%Z54&kXVj@jBNb6iXaS^TjCJUrSmSaUia$ zvRa+*bc#6FopK0kVa1VnqoilDgmyAop+>tClAIf^_L{YLpgPJqY`G{66IMciG&?b& zv@-2XvB9&Wva-I=hY4AC$l3}l^z5i$2Dqh{Fg#;b2-7(qnnQPX9V8SWf;i@FU5@iA zCfQ`kYJ!hzIC|dtLWa84_;%cUNGAnBqy;!TKf#m9swQ3tpsWIdfeiHO3Tw!$w?yHlB~w#Dzr_S z(NvrFUzi0`WUe0+HW!T{l*Eb#SAz_t@uuwy*yA;E{_1qhGu{7w$cA`OQ-HNAFh-?vKU{tu3)4|dJ}=K6)BC;PvCQF!UoADqJ%-_MU;c>Jj} z$9$F_eRR*YTi3UaUpTsK_0Y!ea8Kzp?m7Qg^22b`ygzO}GcsrU=qu0dKYR8QddE(; Lb)-%{w|U1ugb(F9 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/yellow.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/back/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..631071c7d14603c31682bc40aef9fd01ae917125 GIT binary patch literal 3031 zcmcImdu-KI7%vzRH#RX~GUX4Nq6x(H_I2CaHeBZ19d5ci=eWpbd~n)xx;4AE?b_bm zJ0e0xq7pTcOhp#{0SqF_qDD!SKahxkAwY0Jd?iaHK8OU2L=hk0>3waJjV&lm+MdVn ze2?GxzVDp%EzS2;l-*HA5JW{|L#!45X9w@h8TdQ@{AGZDH#-gO9zm4P3EpYMz~(A~ zDC;&8ZGKz4N!9IC2tZpyp=`>*Xo6T=lXZaJg?v&&9i|nf&h6PtktU2%E5tY(cj{25 z*|5q*%T_ff^i^HD0;!rMack9Sk!RnS=OUQK~jjNVdgW z$U56aq!eOlon?74qJ%gp9G2K>l4p6AVMT`HX--nvu*yZq!b4$gE;Q8E*wTV7+>273 zzVE0ElgVU486jl59So-^3d8aY&(jz|d%czqvb5zbC`yPSPj^knH*JdyBm&J&`%wy8 zns*`Pl*C$IfhJ5ClLZdLh1kHQ91!XyoRfBwIpt7iP!gq(<$D;*m9Utlc)SE3S8OU( zLVJFF54Nb_+qh^i(d!_l6?t~r)lq#9*0`W(nCG{m5o)He9K%bCole`gy-s@q5=zr! zsPIi=0)@fM7%0k`6F`HR64X)aTm*dEP1ts_7&|RR+en@Z@#Ml4rUmVcw)idcH=h0oC_2g z?6!)hBRq>Ah6}!h`SwZXN2ZrsCZ?FD$RJ+Soc?9FbYTM| zQ53|&c#D}u$+nn@S@ZISVE1z?ax?8?XM#!=WT@I;dN}5K3$MpdBCYei073g^v z^dLGBqzc34I2$}QD)VA9od}b4m8i|bJlpUyz(utknBhsYf|OlAqVyJ6(hKG{O z;}eD!1X-iQ_@RM_SURF8hR8`8Gz4QjXT~iE*V!4}wtA2|DzF^j0(_7n*NakyYo|!y zI7w5_Wf#+9!NU1eN=VYT$&vCiA!!h~=BOALt)*lF`9JELG~%XK4X;d=>%2)!a6!nI z0p{NoBHxeYnOqv|P43`T$EyWXjX``8tGKjJQtTn8=#mz}M~5P5G$#h>2}Fekg24-- zB#F8Kf`|^J+5ffJ2QieRVbr~;ID{`_L9=uV#GTST5?MHJU3^Qtbck;!h-tGLW3>tS zg(LmPt-gC^*PkP%_r0<5#8;Qrp1!>1fv;F@2i(H@p|4}7+Nd^^YfJ{rptl>l?-X(-nUmpV|A)9OBjCqhDNzCYGP-{=0f_B|+Y_eDw{V z48Bypng|V&P5q1JKb-k(@r5_<>WBBAOdo6R*|+xHnuTY!RDTIC4p%&X@wIb*HVy6H zzU!6pr)xhN{OOsBC)eD0psGr*KK#orV(kwfd^{sP)EcWgxFP=Bwr3BX+K?WqoY(Yi zL&H|{k;4PKZ#&q{uHOdMr5%h8` wN9NtKbL-~^wwtLPI|tey-+cR__lGZ*e_z{I*0`zi<>2bwSl=8Qymw{aKaLXeNB{r; literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/black.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/black.png new file mode 100644 index 0000000000000000000000000000000000000000..4d55ab4fdc389edb36b79bb972e24301d3924101 GIT binary patch literal 2975 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 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/cyan.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..bd17fda7e1faa7e55bfa25d7b8fd42988c3d1f5d GIT binary patch literal 3008 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 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/green.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/green.png new file mode 100644 index 0000000000000000000000000000000000000000..565c2f7c229dfc73a23ee3808b833638c4ca064c GIT binary patch literal 2997 zcmcImTWl0n7#`Frmw;Fx5lF=?kVa3^TK%-RdUq+4P=zJ9*ys+uxA9rUmUABZiqVhu%||J+IGa znCV-+Og7G@*O?A3C7_FKlqi=1f@YXy%gX_DdQi;TDDU|x?(+L5IM#Dh+y*r*rh_(A z@Y=V9X#KX%jI*uBFqwKP>NfeY&4B2w2=tpKb#Z~m0L#R9h-F z&{4dqk9bszZA^5O83>TjjUwC|I%riNvADSISQK}oVQMBZoxmHDg946mRKVkq&=8NJ zBKC6Q7^IR>P*nEDfl^5W8klV%f-w#=7#Hig(^dD4l|Vvbmu&ES7xzaG(ZFjHkOgCu z;%FlAqRz`=Mv_bsm?~%y$%j~lrb%kLFoq++1}_>J08Aj6iZKd|T`xBBxzsD9YqI0oyzC|sue;PMVAF@{8nOc9q)j*+w%dk_I80-ga4vH!U2T)7 zC$2(TUnvgM2D3C(i@nvsq$H9{0Q6atZ=66rEPlfG2*nb|(tI&1_ScivMI6vnRaR@` zU0xX#vzA9#i>i)jBPAP0OK2yf6>7G75y`oMTCZ7;w${Fi9$P6&6FSup9GacT)1ju?##q6O*${4WFb?+nP&gv70vJNFk)kk4ak&teSQrFF?G(C53g z{i#uqY>e6A_A@SNE(*O7IWW>n!v*$#v^QbKO|BbWTP!zukpy}`sI~#&-yNd*Z&jIG zP1mNf@tR}xg30C}*@;ck+9zoCE-)O;PO3aKG@A!1El;Q#Jd|^itZJI-0gdLc@r2Q+;o#<#=`<%6B?!o4}r!Flv?O3~W@vr-j+_F13|6tRm zokwy0*pZdZn;*XTNu{V3@o?i~XbH`_c zw|&5TefrX@r|ym3J9*@p1?Rr7K1^SD?UQqtW_^m!+`?RqHuT(YJ#bg1SzV+sAAjF+ zHZeET4E3L9FvaL>>1xxJ3(U74&D;OuBbTQfcp>}M;Grgt9;`c7by{z&-17WCU3k=A literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/inactive.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..9538a69d36e3c3830b449323c90c871d1c2fa56d GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJtM=93Yk-Zih?~|978PppI)%!J7B=!5-8vD^xyJ19ZZ^hmwRHD{czgDwUHslHL!D$ zkgIB!m&jBNt-uhe2k$yKuH+aShvdKB_H+s3%+7b&rIFFwb=7%)+~waOm+W?Rvr9yl Q0?>E{Pgg&ebxsLQ0Gk0wWdHyG literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/light_blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f69f2c2e0537a25ff05a389b70b997d3ccefe7a5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^igtUtIEGmGC;#~W-`-VXwSp#2?0jHZ^~wJWbi@B&pIguS#OX-d{l7o# zGtU40FJ`>`(9r~mR%gCr0tT8df4txK;=%td&fgniIwIaoJpR8_Z0?`+amKuQY=<>u ziVWHsVp5LP-~D#=e{5JRbCF__mBY5A*Sr3I@|;>=DB<>SLbD;u64}51PA@6_GyUZa vkX0XimfErluIA$*%;b8Kde}M{?!_wHyAu!{an^LB{Ts5YZ`+Z literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/light_gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..3238c7e9f043a88a2cc5b80c549f3080ad0a6175 GIT binary patch literal 2961 zcmcgudx#ZP7{7wVx+(=>R1^(ksHx}9IrF-A25-9VUEKxmZCkIoD^#ADIkR{0-Z|sU z?B2UeNQjB~`X`85%ax#i3c@6b3^z;YpI%U4P+&!b5`=<*e?^^hUwb!q-NhaQ^E%(} ze2?GxzVDnD`}13ucRtveNFwQRx@HvugSjoup|mKNW3Q_c5#Ek zV6I>2rXdmZBm_2uvXC;8NLN)It`}q|LkVgUk^$09sG2AxG%k@@3mw-S$Zl!aVt*O2 z7{`GrNtH?^Sy7TS9F~w_7!s5vSq2ONqA@?lRp3V}n;NntvO_P3J?aZwBev*BoDrF) z^$^NIORXO@Xkvs(RUAkt33*60pkudi!AMxD8Fy@nlt`KQam28wg=H+|axM6*YRlyo zI*NNnnMaM-W<^JZv4BVeB%&jsO?pO|#g$FRqIiHzQ?r2S4Bna?6lqMOBAtVTmUspg zvFFZVkV|GjN!6PJ$|WsmV0MQD$22TZT59G_f73TXMoC#%v(xh(T8SRxfj1_QERIP= zk zSH{Cc3jE=kwOr2Z^P?F1HtEY|MCNMJ^Bhx6rBb@CV&E#o0z^>>u;jD>9ArDHoYpN_ zM$P$IYLD=w;`8hEX@iO^#u zj!W%YxmOO;=#sRq*p3AhCq+QoQ4uhZ#UGkuC@NA?7UOW*ZZ|E_Fh?E6In&Qq+hppQ ztC-hUMr0w>1_ybnmPYD>DH*a$Lj2i~56vT=7Vq#qMzJgkJYUS3{q3xEF$Z)_Q?$l- zzgH!t!K}wvi|UT(?UJFH65h#pg_^xy#By$|(QCGoy^XJuC)A44#CAOdn`b9+#Ky2U z%K|Tq%DUQ0kub7uleKkNMBTW8L((O=UZ*^TUk!s3Hvxe@(^#-kW5&Of0Z9SjDa2HmZa;I9=8({9%Yk+)Ef<7;(cZinx3F&bzb}%+4+!-(ApN~V)c><}Cb#gl zscpRGY`tKiImmWmlePAFn!SSzTenggz=m!Cr1A2^ngOul%8I7zn(bnq(Oet-r_G+{ zP>qJRb5nDO9me=)>lDa-TIWdOv$_r0DRJY_<^Al0`DtIatB^kS+e_~rKDcSwfz{)O zzxZTg_37(F&ymTV{?kw1cjW1=GcTO_Aipo4UV36(@|R8S)P)0u6?E0u*+1y@t;?qN zb(X(ht6bc5WbEXU#INU`y7JKGj^f0@ecGDC`>msg&@;P!xVbnn^m1nM$MfGl+V|f2 z&)$CH(yq+$?(;X_|L$_fE3bZeBir%Q*Ox}#RC6DH{?+22({CLrp1d;YohzTnfAjmc z{v9h8U6{HyDL-KEK03DQ>bd;u(OPlm#G$Ka)|<;N9((@s)Q!}`$Df_Nd&Tav{LtLj Mlh3}hdH4Rm0FUFyP5=M^ literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/lime.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/lime.png new file mode 100644 index 0000000000000000000000000000000000000000..caaa6c2abd3bc8eee447907b38493f3e4fd99383 GIT binary patch literal 2990 zcmcguUu+ab7+-w=gpepjsT#s&s{-oY?(E*~-EKIc+_kpI)!Lr4pfSwO%-wBzx4Z0a zd)KNFA;$0knlz@y5TicHiv*1(LKGT_Jg5%@6CWT-^uff2G_e}=1)RBmy-G_P{Iki< z&d&Fn@B8MP-}lWN>g{=a^~(EJavZn1yDQa4zjv~C#WLD%n7Iz==MJxHcffJ0TG)FV z_tw!?j$66U&J2cw>76EWixG%ji$uyrkD@tl%hs|7(GUrFi{xx4Axxh-E$}u@2m@ML zPJ2m`x4XuC(m&RdL1RP6z{1wY_$_6VDkzc=^5tT|3CwarsOU9mpAAa_Ux9=}389@C zeOf+Cp8F~_k$ZSa!AVv+GH|!TG#xaseffR`o1{4b#SQ@2tx&fb8 zZL!!u2Vutu^{BSCdC@^;)FVlW(V>8<<5DI6V+3f@&bP(xIB?Rhf#I~`iWMc>+*$@>?v&1Nls-mUKSX83W z!bs7Gj;r3%`6(9-Gg7hn)%?OPqB*A0y}MAza_wz9E? zwkLg?rZ_A#Yh_+xsxeFAx{9zRsyIef;3yCcV6jHSh8hKG%%XZ`?IzuV>!)2zW3CE3 z+ijDor>;VlUkL%!1_v2c3&YjHm?G0h0<5jccP}EJ6+i9RG{lO)GrpJ=`~9?ZQ3rHQ zQ?=T7uU#gE!IVv-7E~S4nV(cVX zs14imZ1B=TSyfxg6B?|Wu(k>d+-z8aK55U<2rrry(n8J$aOCE$gIE;EKqq3>P<2rw zQCYN9Ehg%516i`F5CUTLrQhhfYJ#Y#sP!DW71wKFMS1At2t9-(;no*JEP`V|H$+3G zY>pF_8VaGAl9h>p4a0(%vh>D%n71JO$BRL(GeZ0(VtLSq^dKdEkPx!ITjZhV6>L<= zE@{NUwezWwkbLO!v*l;OpkdCqXW5lq+T_I_$H!kd s7fvVloVblVv8P@a!UI{!tCzs-O{_AWp~@V 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 Ob7y;3=8gNe?)(dk)65D0 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/pink.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/pink.png new file mode 100644 index 0000000000000000000000000000000000000000..789bf613befae4def8545260e7bc89f4ddd92d2d GIT binary patch literal 2940 zcmcImZD<@t7(Uw~ZAu{0KPpI$g2OV57f(kAGoAw6x12%VdmP1f%1Y* z-j8RV_np~4JhY{|>-Mf(F4sLcP#j_ZJ^Z`$X7;=C(iO=5mPG?Ql3Z^23jVz*cjSdz zbGfeFet9$_QF}*WV+otGmoVm84LpSA#Hd>jkl4*JaOqSQdo_B;8dIH*$x< zXlYpJqcIW8ydoh*Q3cD%15?*cWv!qpsv;|f3{(l2uA;lZ5?UXTd5f{>Ole%EG-zvQxE-6Ig1joM-tLE(){?t;;;jXw2vbrJ zxsW8qmNccTs;&ZD1Kh2!2c-!uF==9$!cMRwDNY#x7ig|(&j3^GdsFj5F>*Z`S0URt zzY52Q9ED>IZ>5qu7$zwU5g9BNL>6k^_pz%RrcMCXB^wb#(y$IB$JAL(AcAbHTDGBU z?e#^9Cb+2h`euD$ikOXTH(XpH#5Mr4;b^9$I?NEXELAcsf>aMcPtonRwXLzwN*o5A zR(VvIS@ei)Y6w?YKo*hgMpU4}%mM>DnhrFp!Z@7v+eZT$mndeOvuOElyUaWb74rHj zh@dq%%B31iGzTqJVILXr-`4z&dFH35?+<-Ou__8&FK)yCHrBdW0H$GRMr(Z7uajW3 z=rh)mW*}zg%#N8eyp!O|3YqpWyt*5{j8b#?s)Jy?!brLMLhW%MKcwtmF z&DO>VBkLNfZNd`jr8O9njbn`Ad8j}L@D;kI47-5HyEM9*ykU&GXi76?HgC)yj$=If;NfD|Jv-ih8i?<+?(1% z>@vn5vs)m0$?lOPWOW;}TjG)Tx4zA8n8yZ-8_V`nKRyGxPHpJvzp{0a_<(svJ6{(+ z|L*bN&DW3jymI1}L#NLCaQw;2$NRecwO_~Qr`}ut>8)QJe75_---{nvGJJXYXYYKN ze4-s#e0Y`Iy`{L}_cgyg_~@N)J-q*q6FY;IN1y)l+b@?c8P1n4^gp*O+%WK!X{@dq zhc>-bKm5?>niYG`2^V|IM|Yq7VBhl7eSZZ9r8ms)PdtC`ujhWbeBidzrN??-{pk3~ kMMFKcm-jyL;-x!Q{k;9+v2)*?<@e*k{-NS)n|AK|2dR9%!vFvP literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/purple.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/purple.png new file mode 100644 index 0000000000000000000000000000000000000000..6ceb953fd4d024aba056c17bf7ac2978abb55400 GIT binary patch literal 2992 zcmcImeTWrR6n~b4x+;ZYWs$>JnbdtVcRt@tJ{Nc2+HU%6+kN6L_{ZLvxwCKB_h!bK z*?n&pv@lkR{0b37q@Zj=qv(&IKMIXX#2`%!B8v>lzBaK4DQdy)eP8=FciqKuV7~78 z-E)5D+;h&o&$VxOY{9&x^J1~sg0|LF2YKI4?>V=T=d$0gBJ!H+w|0lISi>TE&x##9 zbXP1kZ;O-Zin`M4b<@kok>wdUUd;Oh9gD4MEc(do!x3ZPUdK(cm)||kGLDsGH_2%} z?Kk7B(>fI3&Y=w%bEwbMEVgkqv#O{Q1$i7HrkKyUpE~w@eP_a2~r+NU*SmB~ePJYw$_c z=JPdl7_|%#Mit*CMTeO|A9Ecz^!fu6w+s-A%d5n~r~{9OW(Ly>3xTy&;@Qb`T!>&*d1kr!k1~3Il0SU#Hfn^Db zh;1XGNr~$GlxOzSq@wf7^<{Y`(NS9sJ)y{wp&|tsq6Ps{B^zjp#RJvGqJj)T(#*2& zgv}FyLrNUw>a|i<7G;GKifCE}5G@shge5_sL4!VIOA{q1ss_TSCWO5!7iGrx&HE?D)8juAbnQk-P6d&#T#9Rgjir1nlF0EekW;Ngn%N; zqFfnocZxXIm2ybb!ZH!1UeY~LLOU6)P`%X&NzM&cdQB(ZQu)d`OsOb!WR_hpX?9|Z ztqePpE%1y&Syo%fViK(DWNjH1dUjMm0bbKfB0OzXa8r>F(ZKboLsf!2R4}kLQ2{cR zc#>DL3Y3Iq8oVfA4ArXZ*HR}1B3qVOwS#_L0w|`C_rQ*#X*>4?ZC@3$oF%OS*k8> zz_lv-Q>`GG$YaLa&y+#4aNyMCK)sb31?GRWH*LnvtQ%fiEH`yQe13;OUCz3UQL|Y)ciXxjfq8UxK zdH=Q9(;O;=q3+yN9U_M@`dK>#lAqc+61${s19D1y{-ZB8krU>{w$z$TV%Md8jeQ@q zFFtW**V&%MCuaZr*+|RS!riC0t!Ui;%DSJv%ih`WNqf_<0@}tFE&KDW7hRA4bbj}} zLnm+j)+9{_=4XHPqdba-qk-OUS literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/red.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/red.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed7617953c0f5c85b3f6e729dc841666abd5948 GIT binary patch literal 2963 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 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/yellow.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/front/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e5bd587285bd228dede4344ee87eabcad07ff1 GIT binary patch literal 2964 zcmcguS&S4#7#@@uz@QK{A!wv+Akj!oSM}WuBdj~XE@5!9JIbODQe9m=+cMMLbocJg z5~2oqP~$;{j{Ods`s z^&emT|6lb=*SgiSXU(6L$z*1CcI3O+a}NK{xP#pnTpYpdF*EAekYqA<-oyXXGVku3 zm&wf9>=%2}-ojd&gq19ILx*Oom58A;nPtnX5hj~xDmb*{2RZS=*WZbP@8-nyS^*ZK zcG~B6Y>8>lmUTt4WfQSnartAyvZ~D#RA`EYYNZ?`b~Pu~^xEv54@;s@gQS~sVjDLo z^cK2=_AsV`o`rxwC<}&_MY^i$aETy88A?!-kPMJ+L)Aux(6~fqEp|P-JHM)7i+$z9 zzBG+&Ng5m+%nmBqFfK{RvMdS8k}Ly;0Lf60;wlJ|g-s24nvmF!Qa=m?t`R$7f0`4S zr}YpjQA=%*G-zUkNmU$4C<}Q=HK0pcxTrra*NnSFqGej4L7FfuYGD~mg+dEHuG&ha zg-+6y1I(jFY~!Mn;!s4TZkmMsF`+95n8k%n$C9+0j#4v)=?vbQ9QB21nDm7ckkAre zLq+O)6By)@YoN61PXOhT7BsTkV~W!-E{0*bnLAxg-vk+DW#QrVe&B|K$s;`Q#sr$j zDb0yIkpMJ-0*kV2Lu6~{QOI6k9a>EaZR1zP}GMTBhjyAB+>zBe=})FrkT#udyK z&adDSm7<_jvsNhBok5b~fY8o-PGqiTec!cJ(|}mVCeU4z0<5YAFg<7i)6fu7AXH4O zHs|L<($ABM&#%{)8xp3YwHmewJKefW>4s_OO>IxaJ}Yrt z9;=mm$@=@`VfzK$GMSjDx zaTa)LRMyoF_EARGO|rHQOF}Ol#4&9vF@`6t3TYze6FhKp*O8$jh;#}(OVNQwRR|nK zGk|Vd#DR)TDKeU&-{`txBh{9bX2IQx>kV2-9}Y^CZ9%l-4gN{rD6cg#dq^b!l z=%~P>gqWU+bx&qlc;h;Z+YtWaU`QAY(0EK@ML5Q6Bc*YY6TLXB2snz$KB-lgG!VFr z{i#)uLK+IA?Po<pIgha$u~LmJ7naXm8Stn_4&g-xo>Z2ZVYXkgo3#_3wP0$yI!9 zY8$UTUN4wx4ziutX03gaX73`4=#HTQZ0Qa_8ZS?*SpX}ZtY|uG`5xvO&9#O9wAu3< zs?jj!+|(RmhcW)zIt8+i);W>}tZrj=O8ji!y~FH;`D16kt!Tdf`&)e zv@rcr2dw;_eHJFYe8sz5TcSyS`E9y}5et$6Y6%TKb-JTjuE2OS`-NS}}J| z^5rM{4!&JD@%bNndQRWfcK*PQ?U(nQ+&W`;(ai4B)tT8-_mkp$^5BUpmlq5jd-eHk zXPs=O>(r$WmK;1c{ouI|cW->bMADk0`zlYr_S4=2)n(5voi6{m>%#G$HxA#ucEsW5 O=FXMt@}EAwaogWsDay+L literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/black.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/black.png new file mode 100644 index 0000000000000000000000000000000000000000..c2346502991ddae10d83d437ded9eac0bc63b5e4 GIT binary patch literal 3043 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 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..bee22fd5604a28212321c6db62aee65976372662 GIT binary patch literal 3039 zcmcImTWl0n7@j6-yj%|37C(TkD1eb8nkVQPhH#=42Yb>&bodP562H=w*msbNuFxkfP=-B6l72#?Y-4 zHFv9>$wt}KeY)W}F=%=@6e~JDMpIP7nxYSl9u(0z)MdK~=KL35Gqi0cm`!quPx(!# z+io5RQ2Rh@#u(@^G?Q6#58Y7Iu>uE0kS;oTH`I#>rleQL-(;9$=n^FANidDXAe~LM z(M?`}XeGw82G0w$s>OgJNeaK37I=Z@c$otN3lyD~bfD6ei^0|c)6&z)^%YzAFTr$2 zk*{-Hp-_kw#F!U!aX`~Fju$vVU@?LX``ri@SvOo>)sRG?5!ilYdoE2h!kpI|B^c~! zIRwYAsdd8&O_(sQ2z?I3coI?xXc{$~-y7sh#!Z7mdE_8B3NaScu$ZM(ss^7@t>e_t zVYIFfdsK;SN_3d%_Ys#yq1PK2Xk8z+xV-9E7^TrTHM5wG;kC(rw-J$5HSr`W zBHNnAAdyUhqM|(wlt^k&UvCN!jJzP@dHHJYv{ikh1rQVHm78qW^a|lB5_n|-O2P;w z7?MaVA7@2ABM3SVbQ#>m;}5 zFP!bbF2wn6SIJr`rMI|Y1YHBQBohpFHD=qU4ou#VOjThmC@QSVOBM^`NMm!d2;!zB zN~$JQ=O;a*mn0RLU#>6HGq8@@YUn~-MV2g@EYGU~D*y?xnyln70j7eBOA}-yRkht8 z*to=Dexg?5m5DW4D6WWxi6@#WVzD29)j*CsWK$C*AgVdc;kexsBNeJQ+ab=m{z|WDM_Vgjd7Ca3r4Eg92nNYcWHOau zdx`~~9hGIZg>Hn&x=PlTVWDS51sI^lF3j+ZRl!Z?dhqsQCNw4|9RuqWieL@PBH=>O5)%o#VUZg^#}T<1mN$N{0;2DpEBi1L53 z%;b8qHl>YMpQ;zkHV5%etmD=`L$f!5W+*vTW}${#JdjCwLRn*>XbGaMD6(NelF>w) z_g|Ym$)OSr6V6T5A$%AkpS4pU{;8cKk&Ej#z^BA#l6P#OsJg{1$;M3lg%i8>K6m)u z`ll~<>^#h@d@bh;UYIkOx1BS0Uwrt(bpG7V70v0Vo^ThYcenKoKh$t!$sc*Q^G)x^ zZC^dPIcGhZ{`uWgm+?k+$k1|Q{_|j)_}kc9Kb({A+Vkb13q^C)oiF_o@0S*BKNGZk|6sN! zacp#m>fD<>zVu}8iN^Xr-23m`M+`wr%)jrU$?1PVv?t9N(IlpPQt$Xk6 zw|dwO8-IO&;lje^Z(coyPLKHUdTRcWktO1;mv2cQ-BEY&()vA%SF{YCu(rovoI|+> omTviE(`U}SkL804{&pU#`&}+vTz2TtNpb{lS=X8zUfVhN52p0&@Bjb+ literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/green.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/green.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5e56050ea808658738bc34671c12225a16863e GIT binary patch literal 3052 zcmcguZEO@p7`_5QZLL5`072ujm;%AM{ocD>dSK}lTJ_peYPbqNn4O(#H@(|kcDKDN zMx_uEi6I0C*x*NqF(hcHiNRnjLK-ECQll6Zqw)h|)R=%M27XBD?0vPBmNxit$?eY0 z`^@|C%=^AGJDVETl$Xvg4Fm$^^>xu^@}BAc@0?Da5Bxp^$?Gn=uGI|$$}0SSN#Nj% z^8$g=%|=Vyi^m>Qk(CNU-O_L{ld=gq5U5(2u_5Zf9;M+n!;H|E`%lr7p-1TTQjCq+ zHMrfV+v4DLTN+x>mJX!o^vV@fRYoNWQrLr3CY3Z@H4~w;dQ~#^rx}{cLcER$UF{pB z;;|;G#&R$v2U&nvmZw5WkdsAGW*?$>mS-7OVmKafvdW4o7oze%npku6gxVZkowr54 zB6Pdw*($@N)9GMZ2wF}X!zqfwusp-_fFOX|ZF(>ROm|U1LlnEnF>KGUOv={?HLKH$ z(8SYR2r0X$)^zhU5yF@Zv>7hQ`XOb3Ix6DqPA8c)t|JB~aSEHBOR!uKOIV7(zDYwp!z0=vhvSWhD!_(^T+{;<+GCEm?1vx|Md9`hn*c z;3)KPg!U5&uwfvuEj+KXoGNk4STbO9&=^Tg9eQviSOKik!f`6W^U5f&r5lOv386Yt z6PA;LWaEq!Y{QIgwq>owVrsqVdeB6;J{qBkt3kuiRTk+Arztvsm=6I(7ZHF7Aq;dr z#LFzwB#q|_>!TLx^pnb8pQ|t3LPSS#H&j*=xkOmgfCME7G)~k&Se6xlc%A6MVT8D% zwnoPwB@UA#wfbJ^L}LPnWdZ3L5cCiRVO`_^@zQ@tx*~|25Yh;T!**+|q~*jcop3JD zl)u|5QBPcjetkt~E2y1T65qYGfb+p9qWPXLJb%slFt~=jr*5S?hQPQBYMX5rR3jz7r ziFGMx{WYAVO22WIq$-*Tf5GMM2_WT3=)bU z0||>P&;%(2$<_YeWDj0-tX?qL93&^PN?Q8_&0gmeBx@lFKt+y*_>RuFCV94vM>! z<7G#i`uRM12wV@q7Cxg?zUpS*7())7H^ZkuewtjqR|JlaM zeTk`ot5?`>dLO>GN4z-Dy1OxWkNm`pqi=BYW-KT>{MGKkY0r6QzC3y6;)%sC-Pp5f zLww^8D@*tPc1M3-b#3!2b&nj`aeP+E)(c;+eRlRX@ofC_o$sPGUG7sa{DKFK-nS~= zK3UUwx;N6c?67<8?()9N$0|-Vpy1xUgMGpNSv^0l9r*0V`sD-g)5U=$rpVHGM^FQfO>vzmp?%&7j MYa60{t2S->3oYdHcK`qY literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/inactive.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..e8efb48af393a14bf002fd8a3a56ae863193698b GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJtM=93Yk-ZiV{6t978PppI&g}Vo>C0eVC`{`s}a&&o;Ie&HKlq&OLJebJvCSfT)yl z#+e0%$}ED7xAS>=B^9?^3&^g0YuKO;JG%ydU%~03WyTvo9%Arx^>bP0l+XkK;jmMU literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/light_blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2716a62454935fd933c279ff7e01239b64ad4c4b GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^if($kIEGmGC;#~W-`-VXwSp!bJ0D0tdF?-MyZoQ|r5`OPbZfQqCX1@D zCUaD*x%Yejw=tBDTd%pgme|e+yiPjFz rZ?b>&XBa=ii%_6S8mnVp?&H{9)RclUZ% z3`#(a68L3|VhHFDH6cbLQAjWbBq02-L{d$S7#kB3Nr)m|!0-!a?yIe|v_aWqzvg}B z{dnem-M5{5Lg*-3PnjRBWSyuUGTI5BZ;}uR2SwS^;*$_0kaxvIiVA)1ja&5&H{!1`@ zQREvOm(S;8c`4=vy_}%yI>(EgD6$yAhJ$Vd3alG0t7=H15C)DPIi5=sjllGBQG&sq zmP5$;HMMS7p$QYl6@bqPF`k4}0$Q+!^K(I_WZZ%r%AhQAqYz_-8WyvZO4Z<#s?BC= z=rC#>z#dg%n-m?U2YtkKq0q|(5Va0qi_5Bxg;5t8qhKiQq0+AP_Jug$uozALnv?#Rcxr$y1=1w#=Y=kW($hNf_8S|9@B!8*(9X+baq#o*NmV9#>w!D*ouG;A-( z0=#fe7W5*{cY90LQYoX|4I|(})SgT**wvWhScYao7{`gv+KR5SCX(Z<$;aa?k_1VE z8m}mlRh^&oV2&genP09i%Y#@)Z8Z$hl5AB_1QsDxXDvn6SO8^(MUdAmSwnFR3RP|E z0tc5k$c)!Yyt1%H8^u)#S|%%58e-#?EU>y@l80jHl8jw5F^6MzTfB@Hq&y3AE-^G& zZ3C;vt^!hD2?iT24fc>!&E(31n#kje6Ueh7-#CqYOuXK8FvTK6lYB8s_PcTG!VajI zGNm%!=@d|=C+T3;!m=akc*(|z64J>?g&J*6h;weR(rda=f8{IV(50d@04#?9Np>Q< zK;>a)k_Da_mF4;QK7`4-P1crSp=U>V5TMn)nBi%wf}6_u5DeVjbwQH_UQiKh>ypYU zNak5nQZ!bL>(JyS5g|dVhJLH-k|D^3C{=6dPF%0h3j2WDi|{7IF?Sw}qKE>Bt8o_S z0I<9$o47O-k=60AqVSd!x6ow4Oxh6caxljg8-LA(@7ius;MbBqg9g?6jGi*(ODqbqNJ#*0&PGt znrQR>YqKXgRH9+rxv4sY4`bxBb_&ElwR0qLaoq;^lvw|K+ZKwdo7xNG~dpS3|>CvI$o+H`p^}@=txy@}& zBMpE2{lr7CaP-1gN3RxdTs+)7(hz%lLEQ;{;T56&5&D%L?d;(_myg+SPgeTIAC@;Y go<6zb$Vi!H_|cV_OiLw9GUGt=E| z0b?*~R8XSPL<-Twzz?J+Vy4A=T9dHqO7JmUXS0mhWFGd__?tEI>fJOZuMrLAZFYa-V=zu`{ohE z^foKm6f`C7QFSLBfrg`@NG|PSG(nWF$+=K(MFFXyX3LIIS9*_8q-DgYMlr!8+)C79 zRd;%*p|durced(^L9JO$mgiKgAdLb@=F%zKS938cuUEz2;V?~+c}UP2qbfp!WK*J! ztaLm?N)ZO=48xJK5@97lkeHPu$8ZeIh&0OqR#F*3Wo5E>QP`Sim}-4|UC|c)i%~5> z;Hos8&1NH6KH_-IG^;2I&2Tiw0gM2ChaJEiu>C~?8sf;;J9WJ8lk?*v7I;zTGi;D&v^MiUcn3{1+$MDi*x5Wt@zr`6P2_^Bc zR0NheiosAa42p8rD9}(+g1Ty@hhX4%NykYIaHnp-HGf9q98CDh96%77h3eW_mrU3&u6s!P7NwTbp@xpMhV_0U#m{3DkO~*?^ zyl_?;HY3`#oAcHZ3AM)d18D20CLW`(s}ajGRDm-&QQ>s}Wkm!K3KGybUIdb%Kt`5i z$g|48{J5jHholPU7wXG!bgZMa8Y*jQ3|1%s6Db;C4Iv7mX4C`_@tmT|jG(ddfVK^u zg-aZ!hH4GHGO$JyMI~N0G{74&0#QR?fx>FxLo^g#V0l@?IUKZG>7*Pl;TSmQJVl19 ztzz}qRT$P+jADy}O(9iN?S(;^WAH_@;j<{;JcfKwyveq3iaCl5`J(3SH{jNV9gswk z7mMR{Rt}|_;ug-DUvNYkD%m_-5_Yn%Le*-^$DHdZ_L>INR{Tm?WWFd>s24)eLv|vA zDh^vCEb#bJSx}p8K{#1AU~K{BJ7$oD9;#@@86LAL=+T__VdloJv$DW4tb~B6@DdP_ zzyOUGWgtZrU1N9-p^#0Zxz4MspmO{`!Tl50i@Nm|Xg4Fg3DML|1cMY2G8zXAi9vYF z5jdd9Py{+OOx=KzCX1N5e-CEFhVUN;qdRs6c|(ZhLJ#7N6nTD(GCe0vLf1`MdcL~o zjBOP6r&2+ZfkO_qpHY)$AkP}YfuUAPE|CACy)hX#zHa!xFA^Od5DIO8{%eOQ{KpHK zToILjLIf!>+6}R>=n!Uj)dPrLU6$v+cF)U9gDgg2(-a#Zu)J+&NI@IRe zY_ktJluyHubJM^OK8%H*rBfjODV-ycjqBFKr^E?AFP}{i6PDD(E0WROA3eKf!^DcY zCokM>>W7T9s()MG(#1!fKHT%b^{0qc>9>2^rQhdlU;6l~70ZZ+`x|zg-`exgEP{OJ zxxVbB?^74|%-&M*^|=T<4_@v+Cr|yfy63>LBj0vkCwe|VpR2z8ps;b_xwg9&ys%^c z_WS$Lfj!Opw$Hy?-*sV?GVS@b(RJfJRj1Ry!XVMd|UfglK>zdGYq2=|J#MQlv z&n_Z2$`ee!F@}D~77u%wZ@1~=TM_*cZ^vB&ZC+f5QI7Ab#WV+v2{o9%FP+n72 L8-H!>mYshBrhoE? literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/magenta.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..46a68819c0dd66018ed5f2bc92a1d3cdb0004002 GIT binary patch literal 3031 zcmcgud2AF_7+;9t6jOpE1%gZm6D2r1*UkxRE!|?PZYkRZT1?b8GjG}nyED_7X?NQo zQAtFD#4|`L1Y%MWMGeMyrI8AnMq>cc)IT)QY7Inb#N!_lQG9Q&Zl$FS9+S-VzTf+f z-}}Dry~mpx?_4l%>AX-Vw4k9rmO$?ce9xJMo-2O44A5(?Ti@!3Lh~2ldq${te`P2% zufs~V1TFD5&&h7M4Ipc;-!xT(IJMa;fEnyK$@puV7q1tr1 zg!Y5FF62=mwh7UGvfG7p0{Tv;r^C7~WN~HDF+WJaF>0nU9l=YJ-F7E%{B~y&5=!E6 zR0Nhei9swG2ZdQ{5-66Gpsrf$K@d1z(s5G7+-WNMMsRGHBW~Sd*@lzxSK+`56JQJk zFiPS?q8ORtnIy-l466$4Y6g8Ud1xG^rU3#_4pt~eNwTcU@hTS?2X+k0?4A;8=&I>> zX@C~aN`p2?yLMa7T0E{c*nR+P9X7nr#jp{X0*a|nG9!ta zEJQ?2GmGZKEm>nhBzFvTkE78FYXwKbDkvd zYO6>+auwkEijr($umz`Tsxv<*aSXa>7C#H})+yv;;!U=NDCS54=Zl)N-;7!pazGRW z9tD{jZ?dv5)e^H1YkuAlv0TzRUV=Lru28k!@=?xp7kW)I>?nMtEFxEwD$w&G=r}u} zK^BIs2^M&IROZ!Y+94wADp{L{`HmT6fCp>Z5W`be1wEPbKIpo->#P)E8CHapsqi8t zzz9QWydY7ctmqoUa}cspG4v~4=T$a>%BWaF*W!ACR=pkAZ4hljG2<^ZeUWHIKuyL9`RAsI^bg>of3boI`CmAG~@b)SWQyibMl$f zjVJD?7#vuYZf!a9R@Kt)KHfR|1O4Y4jx~O>D>Hm{b!B~|hkfab!wdGkI=Z#eS!OI+ zx^woqizg3Wke;nF2ib3z5B)*Uy7>Ev)Y@|!gGcYH82;fsBJ@uGfiJiB9J!c#SzLYg-P++x$DNU7?~^^vPxZe2G(LJa)HTLlTlc^te*vUZ>|p=^ literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/orange.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/orange.png new file mode 100644 index 0000000000000000000000000000000000000000..55b86c156af4ed0f7645bc39f7245051755b25a7 GIT binary patch literal 3011 zcmcguYit!o6uu-?p`@V^7224vT@)d9@6JB&-IYtNy~S3&wU#Ti{4mV!%xzch-C1_G zy|)d<*n}StA86tOBmPi~M${1SkFTInQxc)UA4C&l43Qsb0w%m9B|&HItF5-Q!N(>$ zJ3Hr_bIzRk&Y9WS-F1ImZDVaD5~=I#NcPZgJ$o14NZS?X|A6$f$m{3}B9X;Q*}EX} z>TAm*k=kuex;N}iJ!IM>7lnveI9kYg6dj4IZ7F!r-ikxc!u^h$;D7t%FwZ$C!Ee%1 zAmz2;0jFcc#~Vhv()P$!+dzEFI&N*jqzZC4gj^w)bpx}I;EQ@q+GoQe&lMrz)&$?m z4064xZmx~^nA4*`umO;{m=Tq9Rnlq9KU`+jqRsAuh)>LW>NB z37&ddT0+jNs&#{Mm}tPn0`x>F3fPj0Kx9{O-k_f?8b`K>vp9#{FrZkeiltFXrK<25 z)#h?lbP%==QIE=Nn-LwPhdnIz;D8MJHf|rH7FSjr3&I{e8Jc-ar|{}zZ-9g(7$CC* zp(>shiqOf-VvtFuL2<#E12}86OyfPr@P`CCreS8TfNC~5y=N@*uu*b za1w?%!80NWATB5%Ez2g5Oij8Q&<-d;QVR z@#SG>h7F!yC`)Sd1DFQu8mukB0+I>y(8sO)G{SRcg*cn@0UWxv>rzaWfTUv~V<@_y zVHF6LqQwL~ZrB!3WQ--srrBIqOi49mrIJI}<9b=QJpkQ)Ob;QEzy8G_MFSYcfDn(V zNU)KL1q)j-!B!2`pn0KUOj+~y#mra`{^P~i#2v!^6k>VMhx8!DevsfZKFM*=^RkXz z%r0@rMdkCUnvh&bxXJP}YtRt(ohclcYNhG|_b=L;lX3H_hX4B}iR^+gG_KZWtFig2ORfgzgjCHHGK>Aa?M`D-etxs=>O+)Z&dc(ZjnQTqRpE>qIqU+0h z>vtU9xpxIZZ#C7OThMd-5&zEdEoXPXzJFh9N5?M%t4}vK){Y&#xx+j9=7C%8daP!> z`^vd9KRof%(Pul~c<`e6=|8CXgalI`RBQjLoLt!eEA4D*0f5wB1s>w zyL3;@g>JCpi<+0tlZB0!#%spw^TxTc(-%fR3%2i==znMXSYPAYH?({;)bQTH&EK4T zcjKo^Up~_G{T)Zvs!#v=;Ynkn`S>cQ73=~p9!Nc&yE1xl0_@sce`;~M`T1qH?`xPS zwC^9gt>z>?K|WenzoTx|iSMpHuzUR5iAA?MdpGVoeWn5b9)0T2O;5frHq_bK&AIkA QcFpc=?@E4f-w7}J-oYJa4oZXqb+w^XC+1>W8 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 I*|2x$AC{%x8~^|S literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/yellow.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/left/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..442bca7262d5bdee8e2a2c500b3b2bbe571b75ec GIT binary patch literal 3035 zcmcguTWl3Y7(O+CfWg!NUI>wOF`#*PgSx-QBjQ zHTcj778OK`C>0VU5)%zIkw^>})Mzk<7#;{JFJMr3Fa{rp5`sZz&aJJqw86_Jdz<;@ z|Nr^s`~R68jSWxEnmKP~EEbzpUzcpc?@Dq{pN5|cuKfw|YldI9A&kZDn@#SD*x>$$ zW3ibXPD^Xlnp&fqUN#Ob&p`29*2m~rY)MVdhh{s9CH_pCySyCswp1ufCUoE@eC*HK-4*fDqb}97Ff34lw4Kxh5r(C zTNL>^%XW8n$Ge5N7o=HE(=-mA{L?Hbw&vq zM_QOd)-RiN!y-+XFg6E$mWu;2r999w%Q(L?$mE?{CW|sCi`*#0Sgwr4ETvLq_?Tw1 z*)lqeR(9ctigOzi9k%rNh;2fl*BO{-Wf%6iuoPGrHKAc@CNUht%Y*$kFY>}RZyXZJ z-J__89D5vxq-PWq<(zS#q^At^_1XZz$O~FLFH_P^V<|R@=i)q7wcc?puRDB#OuRS% zC1HdTG!YU5R7LCb zy&wzm!Z}%(My&6q^WIV^z1|HY=$fcLnV@l~amTTAO%XKJvTa5Ng2l*+s4-B~RK~D* z8Sy{_0%w-SCq1*1h>DCaI;|%hUEKLwOK`}6g!+vYMj2EOl3v({e z6j^N@o5!I-l3xj$D>k+gsb)G0jS3I&#d73X?B6g!|8VzO*TEF?G)45H=lwV1(uD(% zB}tHq?TtlsYsEQ!t4- zkwq7qoiP@8a#R+~cDEr+)*Vz^fQ6nNb;AHHPh*BB%nEkA;6vDT=g>JtfS=UXWy2GHpl{ zO{{tUwAd33{rfsrYl{xtdT5$aRlPUdb>`jOLoa=jTNukd*9&esgO4h)WhXw=E3aN%fUA$O zZ2yaY+ASaXr)oJvu5dB@8ao>zVnx-RxJCj^Cmy_QYOrbW^m|vT+3I`R@4vONX3n0TS3l+l(&YGEzp^1Yv|>x&U&it2I{*Lx literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/black.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/black.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2c707682f994387d0eb5f3a0c6485a4c270b5e GIT binary patch literal 3035 zcmcImZEO@p7~cNCV3DMV35}SrE|A#B-tO$@?aE0@uh2GLsijJ*pw7_ zwF!}6jGCy4F@XdL;Rlj{#2?0zs03^je_0?Q5s5JpO)Bw&Vo1ao4bI$GTWM*7vdPZQ z&OGyeJoCQq%xm3U8yD9W39kc&H zBg541bb9-uzSI*Y^71igdlrrr^FBc{%-VHDAEF&NVlA9;+ypoA$!U&t>;$((O^GSL z6=$9H;Q((Q?&?LuJCI>>>mFy<7EK}`k0Zzy^Eo#(iwUkI*Cc&9EO2ZI675KEEmR@f zm+EF)y#TXXOyrR$N~~_gfTk##xQ3NPNfbm?01^*0Q&dc#vz3P<+5$Um_9Qn{bdkRV zmyIId6of*d5G%+rFUSbMFbqMI1WDovf)9t>2o`xaTv?Tn#32eCKXN>mr4pg#4MYi! zSXy==@7Kh-VTC3_m{5ei0AeC_sRXo94d)L8xsq}l2{?!I*o{Jh1vM;TDV3_hXB3;y z*U(|qHb^Y0_%>cv4(1Sy7AV9cnkZ4?4H7tyJ@FX?!SWe)z#eUX{yfEv{LPBkN z8WoX~o<$*@nFhs0XBH@(sX=|SHNY_Pf?m(dRb!{SY8xwon8ZG^#c^$~5H?ZAD+_QE zMmWLIK;p$XFN?jBWQxF4!J{JSh-GMsgr*H6I2CO0qR|V0DXFHcOaptilOCEAY9ll4 z1$js|&dI|J7JN5T(w0h@9c~yw7vYX%f+MEJ9LF{_13?YO0dFaW%*SoT;tfa|MU~^& zN^2U{g9nmA%Pi3HlHwjnD()-A%}q~2C9=LIRxCY;M0OLyBO z;)$t{=2wCPmBBt5s=0ykpe~8z5ddu~^Zj$oPfkDOI)q}0V`;pYCH|J}ib-5q zva0i1+(4EnOBe&a>iVsw%O+4vNv`J5otR#s6=k8D!Q>DUxI1@76fL0Ya?k;hJ!pIJ$>ao|jefvH+*Cb0jbzBwaqe%0{SWVy?mB+v^&xeN&Zt`Oz_WSPkg zbZ<%ruQ^jKm~RY{lh`DseU4&p0|RN6PD0qwEFP#dJ)vswP)&8-Ya4D@J#zU-LESq3ZK3gMgN)uh z-hbgHcNu1rPugc+`Rp-Mj{aK3vzl?cx_GegFFAg@9{Z@cGU!TN*ySv8#A+BXekE{DU=b{b-0+ e>c;*)yRPeOanaSfgY^2&bhLFP-(Ua2o__#780x_Q literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..98c4611b39cbeb73a8bc21f6d6f6433487c0d2a6 GIT binary patch literal 3055 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 H+g|tw?q}>< literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/cyan.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..f660428b6bc588de3681e6fecbe1554371326eb1 GIT binary patch literal 3069 zcmcguYitx%6ds<@k|q?8hrGsts0gz&cV4?YVZoLyw#02qSwdIEaA)RDJ9KwuIy3EV z3qes({Glc`F~NY(5CZXmN!9QQa(jZm`whos3&$z zr>L?vE7=q@C2m)BCli8(qoGhP<6<;LEnb>)q27uDT0_m29bmBb<4 zlxU!rIUb^w5YOs7FVNv=2q==I@QY}H7kG}BIUuk=QF%!PVY>KZus6>z)yDYpqA&aw zV_Jg1RXHx3&4#jK$nlyv5RFDTUf=|Q#R%5#v;&x9ZGT>`g*ftc&vFCHv1wuvYEF9) zV=&V~2pP9z*7l2O!U^MY(B(jgCn4p5hF-$C?OrO!%H8#El%M0EzS^0 zC`}JYMPQjjI3zOzpeSbz0VOjfsH-mX5DXkI={V_L?KJdqqXiHW=$qGAw&7&`1tjp| z2Ph5$6k~{xSU$pvd{Pip9;h-{$m0jT08LKsL1z)`Z63H+bFGusw=z}hLC5aum)K@BJnJgAz&diWI;ii z&I7rZO}%H~5{K#jRtYPEutE_<)D4XljWA*(h6LCs(8xtLqM`)Eu!dRn`CaCu9WUV+ zIOifmlhszSc}x|O`ie22IM_s_nr<%)h6Nt~I6$t&`P4A;ebcLL3#V9MXrdQ2?|&6; zU6_C(%OVakKi**FP`W8@;jH-uB1-?6)W8|i$w-B&HI|Px*IDc}t593JAPYTI*^DzhY*lbWk@sQ8m8pZU1bCnz z){Ke@D>FA4~OaBt|BQx{brse;&BLsvt+m{z?7+RX@WLL77T!AP2- z0TanA5^-q=rX*oqL);sHBq1Cmt~IQt%hzGhhVUN;qdRs7^7;wOg&xEkDf0XnV|q@8 zhOV2o^n7)39kx;2pGpNu2M*oWeuhk%fjq092Ksv`QK0`tf5R$nWZm$8UnGtk5DIO8 z`+J8dyvGZfTu#;|zwxSr^@5RV5bwk)ZtcS~djmvuMGMO;j4B!nWKy0`##@JI3Zkqi zvTj16XkyLzr_G*dD4&LY=ce8vd>A8-rBfh&DV-ycjqBFKr$qC&$XgUON~n!jCL<5O z-`%s~NW+x3d%BgQrygf&&(FQ(%&9bJ3M<*KPY=YMHCk=?XoLkNf;)vQ>3i5vaOdk?_rUvHe6q^Mno);_Xv z?u8?h)!oN_ZGH2N?`vk1op|lwbKh-PIA-dEb9-lBcs0EL=RZ!3ySJxe(cXL74n0OI zM?cuP@7e28trxb9+cRf>6Wcngb5q*V#(FQ`y7?Q%z3Xgw=<~7EjCOYWy3=CnT{F_N zcG?%-o$`}gZ>Zm33YCXf?*44e7VFa~Umo+Hnx9&JcxC;K`%WL26>%0#J6RoOG{?Bu zdTz<~r$1gliQ3X#e-?;)(Cqc8M=OqwzWew~kpro%cYOFv%gnLVX3;z|=g7<^s&3Qb d1-mXCKU1+iJHF!ET{bzO*H+iXU#wbp-(TtJ^t=E7 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..579398934d4b87bad17bb437d54b5698dc18e681 GIT binary patch literal 3041 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 N?XtQ^&(d|B{{TR3_~HNn literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/inactive.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..8648202ac603e5c348c7944b9b091319206ea30d GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJtM=93Yk-ZisC(8978PppI)%$Vo>C1Nz4~yl6qf%DpH5dtp8Zf&ZF&T@|F1*=1=+P zCYcW+lm!`&TAN#)l31ywac}3viHD-N)7pwRowY37BMsu-lNPyMDG6r2|Htr{F(mzT Ve!14?A3&=ZJYD@<);T3K0RRe#Pq_d9 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/light_blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..88e6db32ce09a5a75fbbb8a63e6af3a5107e4b7c GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^iY|G&IEGmGC;#~W-`-VXwSp!RwtBbk$FusUo!9@*Et|t!6!!LD*nI!=$W+zh7xWM zCo~(f_;^|U+pTZ)!~X3BTLp0?vFaxu>*umdKI;Vst0INHVM*si- literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/light_gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..f574a924ed4c323be2c7f21cd29943dcf05f0002 GIT binary patch literal 3011 zcmcImYiJxr9Nz|&npz3OO3@FlTj&G3x3lj@du@|kYJy%H($gkjp|iWQmnFB4>~3DQZzOc^6Ro4=$ys z#sN3ilk{XCHmtx)K|3%}s^oxc5 zN&67CsOsB{=r}hVBCZ?7!C+*e_93isSGna6SruP+Y!f+UFhf?0x4pPm+q z#C2v-NM@!%QOTVJN@nWN&}fSgOoAvE1ce%Rx@xx30-qA-m0Mlk4vO(A;&^od%D@Dr z8A2o$Xsifwf?xpNkogAy?tlt3i>YbD1WpC(EYNd2ZwQhh=+nS~?K;DALT$@%g2;n- z<6IBs5f}RTvbJp2==9?R`WEWUq#0~#%5`l+0-7S3DqvO97FeW8I%`4|6JNG%-I5(u z7Aw}`^_jpLB%~tiEBR#y7M4-p4MT$nD4GUYO~nloB*5yjCbNPhN{;LZ4pN+&HJc+B zr#LK3l}fC#u|x-HifGv;E7~ezHCy6Yoi|A%+qx+6qH1ERCiS)jg&@iXHjcT-&}6p_ zEFPN*Nq(gnzB<@Ls9G4T45|Xa566?XI^R3T{N(f_zKcUFFf`$dQP#f&mo998BFmy& z9q)2WsL+#fan$09Al93EGI@}m@Zn#=&wxEG(ui(<wsqzEI_lE)FAGb^~+jE~{a^-bqhi3hxbSVtEXRz{dj zrYNhdqUn|iL;)dQt+{@!>7v2o91?3ebR(u$!)oIxl=eWRZHCj`hV0nC*$T<4X;g>o4iRJxgb=^0Qc_-QTfkQ zBDs<5P5Iz8W~v4A%HY)XyUq1{J8Pkw}0+$UC5kmUiE^1 z^;zndlP`@OS-YaMfuc@bKHSvs=c%W)ediA?SbyYL|CRAehnKvy^6Z6+Bm2j;jb3W~ zb>#6!M<)(7zk6}-Yv|31;Sbn5+CK8`9clXgmNEBb)Vsa+?w^*lw@_5F?evPJyBFa8 zg+X-S2kn!~Ywr9k+-Js$0NR1wA^-pY literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/lime.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/lime.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fb7ea4b47621c8e73293d80ba1988a42f09b4a GIT binary patch literal 3050 zcmcImTWl0n7#^@OTtd=FLWoEh2DvEC&V6=gWQ))(w93|67HE|qXU{pa9lAR+%uKu6 z!h-=5pu_~V2|+Q zZ|D2}bM`dUubwgO!D$pl&8Vx5HIjE_a8J3PJm(GG0^~K-scrTsYWmFJotsm3j4 zZKsRZcGf3gXDieYv%HF4meYxX4E6z?%cLz&&qbNMUY&dg!yH5BA%1I=SrHhdo8k?0 zwe4bB4e>1Gd65olAwiX8m4A#Dd6DOMg%d*6G<4C0}dyI_#mV_5WzCeX>-$g;|Ov%jWgKtJ%Sa=Sdyi9ybK>zZ6;Gj zdwxwj@u(QvsAw)X}S541C*7*mk%GUu7*q#>5`h1B_3&P1Zq5+G-Q#Ds9J;-P()N! z1Rzig-jew-8@2_c3g#E;3)zt9D6fW|l!c@Mj4&%iNbw+5R#**dkc|*+ieeZ@j=+*P zPrD{5agZLaHSh`%jRuaW5=2Q>LSam1%L1zj$>5mm-Q ziXth+@dh)8(@imxWX&r$q7IidkCX(RET~Yu*7OMHI*Pq!E#6xEN}F`PD0Kh}A;5s0 z7%|0RbCd<1SSkx@vn`k;>kh0fz&zXVv%tkGQY6FURs}bf^B!owv+F`w7I;C$tf5IN zt6-TBR8qpM8qr{qmqd((a4GcLU6*u0)rU&C`Z^NAoUS3_@tp}0FhoXS}>zFgnJwew5@jR4kMNWTtGHb?0QkgaP15Y94BqU ze06c{7Ao#f<$|Prn;vREVoaTzzUZg_jK+~Y;!f&)UK4RHVN z5QYC(A(N|uwaIV1`e?miq8ubUu})h1IL#gj8dQ^Eg$0_LWCbNCPoQWlkPJ~$R8@fn z2pAn`v;S+e4>*)h!?1HxX^0%gg3t0Pko=U-k=P=2>ylIA;I}O*MNOJl7h92tymaZ+ zPwFo`QTbwOE`%^PrE+27^M!LCnEQ6mn>|0(93K>YfA{2X=If7kb5UIli@s;~S5R-9ShKC- z=+7S=@9aG=@W-z&hp$yVSKV{v+3Jg(-1V9xhZgK>K0CPd*z)W%N2>UEa2l_xsgL!p H+`Qu-7YOu; literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/magenta.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..fe70ad63c94f7639aacee241e6258ba73535009a GIT binary patch literal 3050 zcmcImYitx%6dqzUSW;7iKY#=n1{93U&fIzJ&V(&O7i^7N>e7bdFYe5}(@wfOGtA6x zw>6Lmgh0?hh(c;g2nLK%9w9OM0}T|78V!mi%EOS57>pu@M-lyD#XI|ID=lqMHrbgw z_k8y}zI)EOcWYDQbJbNdswj%8Zm3VB$h#)|Pkw|vXAj(g<>O32uSUkP|L@ zGsM$k2pPAc*7i#@5yH4UbU6^=!;lI2@Q`t9K01<&+u*$NL)9F7Q23}f# z6EMJWCQKxjkFg@(EC?D8G#Na@lL23ZCP``{7{K9RmF3lD05nn5BxMBHL6+GyE)*G> z>3A7PHqOexHq5zpTftf~sWsSs0Br*|B;pKlHDXyv6Qf8~kxGg{R(Mv`C4-FtSz>iT zfxM`SNaSI8eZn!aVN!+bi}i&ZgXpO2hNjCv1d55-7)FRirev})RaRIb1|&(1#dH}; zWo;`wiX3z;eyrhjVJZ@ERV>$1`+`U}~Q3>!s!K|r@ z3M*rYXLV7IvPw)fbY2uN2GMfpce^fXK+*)UTtoNcdWlw}9olV}96}s(|G}Ur5TIcS zY!t{cYY39U>M|LbSOh9EfFz*UXu*uy5FT(ahGXZjH!QJS=s|LjV$Y8=rsrg6=(=gk zC{!1hvr*}MsuUz0IP_5a8Iv@GJ!@DF47XBof&L%ujhk^3>xOq1%LCpdF1#QV+W`0P z4pID06q#He?oHv~)kfb3)vk!BqK*O+mQ+bM9#=>Fc7DzrS_egA$y7kB{@x>qUDTnF$+I<|9Z&X4IaUIH{z1>$zvT#>zdrM3ZP%WUHhx(93SCvjOzx|hI^+Dgi%(5o z5!rXNx__I0VenkfwW#>jmdQVCI@)sk_<}Wus^GLM11(QbRO4X$rSIjPZ=Lx4;_I1( zryKv;diK`F!P}3uo;kU23qOTfw|Cae{u^lNLualYeD%=b8@F%5J=3X6KmDzXeP>hO ze(}LCpJua{2R5#|klnoh%DZ)^d-}dUVID{=c%%QqnU_yeCzNAzf2~1Fcl1r`>g|Z` z-u{j~_kLTxciY1sU+!Am*KuA>-@R3e6Dx>hR_4uJt7&nRjf$)YI3dl??`kb@G3cz|RLiW*Xw%EeM^zG-RgsWlZ_^e@R~ z!qC$=u23k%3qsuWdpM-3DhGLv=K)24px+5`5jer(Q4J{)7{2X=w(BsFMy$K}Fv(I+ z%OT{vs#+(gq=_bsD`JmBaTtYE0-8n@=jHuu$+&57BujF{2?L5nRV>X?I$ecNsy3Ia zqJyxhk9t&zZBlg5+3yjqodj;)H%L<-wYYfHu^?9p431R-_|(vnKD)YZ6co0^O)T~u@xs64cQB#Rg%pp1ZJT9POz zvLs6S==_vxNFV}%o)Ao;NM-_w%BZ#n ze4Cay&W_g_d1X?K7D>p0Vd_9I6#^2bh=7Xp=pmV^ARVPas zf>arAvx_9#m9lBpg0ds>c*%x|lBknK6{D7%5_0QqQ+Ni=)bsL(QRa~(?jSc#IaWqjGWL_2qi#>VbO?0 z1?W0b0Mr#rA-n~38BZ3>qz&O32V=NSAMwW#%fmjV8!7RFBy0I@j=`RnwT)7Baea=xHamqg**>nEhG$L?IZEPr|PEa$;r2A@22Ja<0Puy%9(;lacwuUyQp+;`%Up9&|J zUVh^6EkA!e_k#WP$kAK34SsRDwmW!r$#TOx`0dTHbJmC7ANcBGY(EIS!v{Xd55F^V z_xA3=1-;kr8-8sqe2xbLU3l5!@{3J%Hy%msIZK>B=6}@OcKb_Arda&%!T%$9sPU1Qx^W1!jCQ7lfSR->GPT2H*JN%{j0^ZyU!fG f>;1nzf7FyM?=*Wp~@V z)N@7M`NNuqJj8_0sn%(c=!k!N#tRC#b^j(Oh|mq+^em$v_aWqU-SLu zd;I46zL}jJYgWyS&WlDOk(upnsZRQy#qOqQ^m*TvzY%@S@Y=eANaVJ=*nLanwS99V zk?3|O(-n55R~r^7#*j@+94i++ijG865&Q4m!DN&sqxs2DKL)h?b|^X;tBnOa%1MgNj~ zJ`6oW5K5&|tR%;XpA(?2>w+i=k_0FM1buFZ%D@d4)HS4VVEK+0I>hCeMr4wnFv(L- zt05GxeM&PZOJRPW7|ZHmG{) zDq{7O}l0s`pw<;k>>|Jv+X z4pnFvac-&)(Zd+~Y@7n=PvabkU0Sz3Jtf}RG-Ve(VgA~lTAoP^o!ouo;VF;K+Ht!3 zS)Si}{J^mX&Ndz0IYjoDUwwGFyKqR<=FC5HwrK|c!nxDt$^Mgbhu+%$?&Hs2z54x$ zxt|yt_P_F{5dCe=J?q!^T)Oya$L?>Rxj5C~XXkbdEO~k1siDXI*u3wM{akJcGJ7vWp~@V zA_*v%2nwQxAkr9;qJI#rQGya0BoRq4iZN*XN1}kyLexMI2m~X}+^em$w86(F`|L421GZ*)FH z5T$FaL}Snxe_Yj_R0tT321A*Yi_ioydv3-BdMgY_4K`bLl)Bh+lp-x7N-Y=TY}~Da zEmqAs4=!6*m(bU>>WV?lokPyfsK`JH27t_@lD4mAqEyzdioS6(Ly=iX&>E%YV~1p8 zyq>IbJV;6*meyI8CuJqXN#U@>&Lnx3XBk#xIG*Mtl?|($Oy(~NdGicYZHO(*`$B(F zswD_qm0{B9bSN!^9Iu(-6h&cJp5b{KA!xtD4nT&s{mO!c81!||as$h;No)~lPFoPA z5YyZgQf|?#?dQXU0>)&3%WxqUPbmvD^din}^O9NThR(nwOhG&F5tb`rQIz8GB79J@ zsZ>dz`z%qw$hI>XRo(u8hqsuMZaMJz^Jn{Sh z7y|)}Qdmed8=(a@!SgE1sUr6ni$2&KG>)WcfB^IdD>SPlI8GG=l~V?Q9m6s^hJ_ls zYC2vDpoOzipcyi*-JJCnkE^w|9{^j2wXrCLsD>=dP$h#CAT)GZlYvCbN|>b;nUBz# zu1T^CO$dw}TQolA=xtb3cziCu3`a*cimRbYVNF6qSXzd%NQdRHK}R%Gqy-(af+^~n zW=0BZp71P`;vm`IDrRLMizbXnf^KNEV91b;7-5c9I1N8ULlMH9AZv(KpWiAc>3DI+ zKrt6660f$3%p!xoqs+7DVmSQF_csmG-`D-5ZJ`kJ6p8hsX8kWi zr3(>|L{Sj)?e$g$CL3cGikhDzBK7ZS8rXv?8O~6(#`2NoI`Xw<8C;wHN?K$#DOI57 zrl4bWLW9aTTZ1g{$U>Pjn{I(9Sa(ou4(2;%kOm%{-;5$WY*sKsk@rFSovCwjm}5B! z(xxIvv@r8vD=~7PgpMS0NO~Q=SL~i zb5bO5-K3>wvx{lBjr{&pOh__t$iDJ3WY7%gS^YH7-%F7K`7in#R&gV%hX4B_G5COx zD+A2mD@5);mW$*bN*?u#~R9pq2IZw(1Z?S__KHlL_fuIB(zc9dgzo`U3+Q@L6l6djm=L) zww-+KXWy3i!GjaZ%N{vYcKU@L>d=KxcAc-fUe-}QZNU_3;-@<+HuUV+ zOD=u2CEhS=`jPIb`<7N3Kdw5t{);2M_a7@0x)#sadHB|GA|<)2mUma&oJDNx{^`=n zH_xiq-cNtuwR-IO)F1DB{Z-e+FH7b={qThcc3c_j9c^_knXS8fzgcniv(hmK0wQwd zy+7?sm*@Qap?&$=b6fXaRew3nP0n<_=xuuH-MUw5CTvNVi(al8wej%&T@@MYMEQ(g z!!v7Fir>wATY1K6w9mXg8P0xw*Ji$FN#&_YleSwsD?0D_XzJF@y<*j=aceg4=MMDV z^fvwWmN;r-WY3A0N

&J=xV{yJuEkK7Rh$(G!-eAhnM>uHLwAHL`p6|8Qe;r`<8{ U^W9so;X`?CbzQ7`!J6m(0v#~=Q~&?~ literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/red.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/red.png new file mode 100644 index 0000000000000000000000000000000000000000..754efbd8afcbfd1f97be50cf43205051c8fb1282 GIT binary patch literal 3040 zcmcImYitx%6dpo?1wtTz2K9&IfJ&9wnLDrD8M_JABjH%)C2`Z5)n*_kMM{O{%ECXny4|xpixPP;=TK7k(M?plg#U$ z@1DnZ&pG$@H8!lCGwZfl6h+OcuS+!H_dIe}%)rk(e!T+mYo=GXA)u()3&=f@*&M|GZARII*Q~n9!67C)ry=4jdm2$I%>6@IP>$d;|y(^ab~@o-2yxSy`dX;?u9g^~4Vk*pYT{Z<;KCkQM?utB#I!W`=ai%S|3C@_563vJh-iAJcqonf58 zo)$vLcxAOtP^1YH#^s>Lfe24R$^%WKjPpAEbl$jWa43y3$O!|C1!XK|DVZ$8$5orj zl+i(0+l4(U#x^cGNOgONYeIqB=^LoF3tL=Vax4g&&?q%in2zD)$zGcqxeMuciRdL{XE~tH7>lTiugFO+&L> zKLhc?*%{c1IL~R#TT3RjdM5~>W1#v(oWZU}Y}?dg0)SD|ge-(oltoBFtg0&_t3!cD zNR$*M8Y|6DxJD;QDl)%NU#4qd9p%-~RXjs#S;` zd$ZQJaf!q9Sgph>6Kk|kOc4!JXGJrL*qA8+Rs}kF$fhbvK#b~GuRH|_dK*TkHQ z3{6&>sK>5CQeSZf6bGA0s-`;&gHeIU7YE3*DBm!Nd{q3fV`GX1h9>!<VjDaJ7VVGE$*hogLtu>n`@1b*Q8GmA2`8QEJdAgkX^D zL?%-lw#QlEsZm)_n{7jwtm|ZL0T#Gcn1w#7Zp92wS{2+x&IhpT`mTeh1bCnz)>1`< zm661=x+q6kC8ioWFA4~OXesn-T^BVVX@Xd)p?~9gkyfJ(I;{wALLBq&gAr93nUZL- zGA{zWuSk%MNs`VADwK6WhZ2r)ykN#{2sbzw!*#llKPIs}=tI1bB0q>TmhWb0=y_?| z$X6HF<(S3&sa%kB=+dL@XF}3UQDAZvS)2UEtBuzSrkaCzC)RLlpQPEFKs6LSDzi{kbQZ{@JfW*G`6+>hV5Oi|Nru1{2_Vo#rL z0u3KMFt7jc=6-Kv$)En+FPFK z1A{YHwLF+)z(B{QfjWBIp7VnTB*<%a7sog_ud42!g?B>_b zt>3@=#E(6v&%QczzU8|khxZ*gG*Xp3cICvTi_?WQj}PzNE#=SP^|cL&H&;Hk?Qczq B_2d8m literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/white.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/white.png new file mode 100644 index 0000000000000000000000000000000000000000..7929cbddc8fe61d9ca49e89834b48914bdf52e94 GIT binary patch literal 3019 zcmcguZEO@p7+yjp2sR;s9|Rg%7orfmw_mrrw;K*pdXyG>P}^c#`Eqt3z%-iKOw??h$dJ}rt7(kwdW4WwP&yE~!5bh-qe z)ND3eLWj}%Zo;TIw@J}qbFYtuMjU!w0mSROiO1!m#KNc%kA-Fi!wI}J*zfQnFYNH9 z2tuiQLMS4~p28vRnE=H(X9_6oDM5X+I=~?Ef@aUljB2N0lp8BcF_~T2;<(7`30KjH z7YE=Jh;WjlLgK{)uZYdEY>JYpN{@@=Lo7hkM4AXhU_991MWb1gOqr-onE>{XWA{!A zMbNapAPdOCIa$z-1>bGYdrPOyIya1f3vpd4$q}kC$3dowU?OfP5)UOJRj9>9-U7PL zBVAX3C}T;K3T(;vln1-0sOb1YejyJM8>Q7SH48%}9#?oem{;w1g1023@|tFAdV<)q zL^#T3bKsB^2bu9!DJw)Q+Bl&p5Lvu}bj&AET;dJMq7M}rN?cNOi?AB=TkU1MAnhR% zbA@B+YMaD7p$cezB{`|s*h;0E=_)kpvPdpLqR(P~+cf=S-CJCTgjnWSsuwfwzloGC zLO@ehMJ={BI60hYO*tfLVS$J?zNc+s53OW0L(N(zB%13j)|w`~tN4|1*nCo&02ZbI zsX8&@ip|a>3p}$>7R>f^U=pl*sI~wLJv-_F0j_E%5uP?HgsI4fp!?p`B|T2$r(xbU z6pdFg)uy8Ayp}MaB`Pw;l0G{1yQwRt6gTBk4&4v+Vpw4ZaN9B2gaq#XCzFtnh3q)u zMQF*qMRpqAg0jKOBFPMdG&x}r)!e-flNN;kcrws)yKyj1SUv~<*+_8^COJFsvMliZ zj05x8C3L%}xIdK=l8roeto%$FG=u|ZoCd~wDN$hmMSs&OZf4c+e_tel9uNv;K=^xw zDEy}ik*uL>lizsF$!ft&HAr@1la%&pianAHs9Czo14FZTNzHE^s=))rmK9agRA>XL zXll*-r^TLXC?AG#=cdsnau}nZrBfjJDV-y+OY$}#r^M4sTh}qnET%41)tu%%+F9&5Sw=#GoCYk%AM{pO2r?adA!dQES7`-ek)BTqDb{Q1p+&ZpT^D7VBT)nyet9_N94Y%xVY1*=-=IY?VUw>M&WZTl6FAuEhJSn9Y zGG~u|d3)*A!9N$xVLrWaE9)h%oExd!_nr7qe|UJs&%F;X8v^D1T@O4`_RAj!!Qz(& zj&O{>{W5oE?vK4TcZHo>|MY^gXHPu##f@9_?3*j>PtH`a#n7H3*N?uM-TLi& z{o5~pIB;$7)HlE1R;nt7%9x>D+wk?>%g&9gT^LVaxFEiB>FYO~lf4xip4!+}cB$gl byU#Io=XVdE&y{ba$L+fHn^LFNJ@dj};z;9F literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/yellow.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/right/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d4a4539e45a226d0e52165d526a4369f32039d GIT binary patch literal 3041 zcmcguYitx%6dp)@fHu((Xi<>K@CO33Gk0d^3CqK7VN2Lr$^tEjcz5PbJ9g*6%(T0U z5fc=m5D02Sp(KJtV`8Wz!Y?IgW9koSj6oqrgdfFVLevt1i3y5#_SIHe+W4AeUiWmRyD_pK;22BNX~LGnjjW0&ACwPKmnOXZKfTge);GOMVfky+8`v^q+5sD z&BQhjt=-m`(zbPIicT$ELN3m!Sb>ECNan1J?W?&MRnV*A?{Ju*$O0tjh*8T!gJesx ziL7%xM2ZoX)>xJ!B_#sHXjEhuk{rvi3@b2zqk*WhQ58sJ>7uYTPdC)&_==J({1>Cz zgTPf8CY#MhvV6qx+8CfH3d3>?$I%!;`*}NnIokH;mNmqYuX&~$n2t?`8e!V$3}O`a zv>1ZrR@B;li6%@KlY=e;B5W8^0jO&goZIPT3dVJfK^bHrJMb|URIr$(WU>MuRjp-J z(0)+gg*__8HY(ar}td`byb%o9cogPjsl*i`E*pLp)3PhOiRFk z2Fn31U7jCzw9YW8!uiGe(j5)!sH}#{axyRKib2b~fa^+$^0WdaiI$O+mK9!6AmYl} zp72au;xIE@Yv`4ZH5y13c}-8#ye=VH)}w${KstN~y24{ur8MSn$ZnmJalE9XW6pVs z3|Cvl>anXZtgjdaN`oz7s%AQigA&K$ivi)YBySx@J|tdeo0wu8Oqeff!Tws@y08PH zAn-zIyvfX=OiSFvtocPp#Nm?Gk&>{Jg%zqMOdsc5zSL{hqOGN`j7b)XQiWPE1TD-? zq*J9~bCd<17?nk}*>;4%0o0D#w>==?p%ja8^V7ajON%~$QzbeF7zPYNRj8qD8q9s61r~2 z)C$$bblG}of2tHD893xn`x%oo9eL)k92jn;;sW_E+8a0HCe{uA_eEmD146M4Fn{e3 z#s7Gb$ra(+6gFOUv|cdL9K<`Zid*|Q&0YtJhPMfUhKiV`fe@A_6cifr2FDAcC};)@ zGdk4f{L^M1=1_r#Vdtju5I&5BpOsS}{;8ZJk&Wxt!>7djq(%6sI%!5je0fUV+yCnF z#@=PMJ1=kP*tBuRj%9;YFXmAH@#0=uK{j|8V&0-YJ^iV;V$-=fVI5+BYQ`0BM=&z!IhEx9<8{v&Z^ z@Zy>mzVEX(SKs&K@#zP?m__`0_R8R+bKY9{c`rd+76M_*s=YC1w_-jZ+aFU|77KY!R{$f yUB2|&>qcr-cl4d;xrJ9Vk8P?tKkL@1?Zm;=+xI1E`(FtU;SKeT@t((@-ti~i2JZL( literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/black.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/black.png new file mode 100644 index 0000000000000000000000000000000000000000..8289cb44c09f15a7491d8a407c8602bdfb057a3f GIT binary patch literal 3085 zcmcguZEO@p7(NIrS=2bLf)Fs8R1-oQe@WzzL8%0cXoUnZ5d#S+2`Y#YVoLl2(J20*ID2=!w%XDLKQ`H~ znP=YjnRlM|o!Q^m@Z5s3Wo3atU_q=t+C<(9{kx=?JXijDACgz8UEl5o0*@~C?|Fg2 zca{bMWjl?QHm@!If{LtE5NcKe2Qw*~paX%b4H+Av9oVB1xWh0b^zBbi)0Ck_=&e$m zi`zB0)2Q!taC2`%3+mm06ph~SELD|JiGdXMAeBiaO;^oC=&W6peEZETO=Th8jtE`t zJEYp;jZ}^0U`h^h4B|MR3MoM#i=xauL-8EXv7E#Lo&mDTi7E(D`HLpr98Fi7qIG#+ z?Iw)!bDI|Jw)EJTZNjeAS= z;`sqM3OyX5eIYSim=U-Zo>w`bN?;vFKDZn-PNbsH1GBc-k@Xgjt1;8{powrS8lef*pkZjL&glw7a+r~1CBf)OD8UIl#(-#ZChCF;M3pb((8EyA+eV$x?7(CbV(EvUOc)~| zaR4y@=?O;RMS)2mIl+h=7Y1Q56qZGj8h@Y6v<2Zmo(!_gZtP4FmJJ<9Hd5@k5n6Yw z6a{TNX`pO&vE8PY-=7KzNqH7EQGR9&nuZ-?k_IMwDNvyPMSrs@Zf@1^e_tflKOp4F z0Q=Vpk^7J4B3b9JO?Kl|r>g~X)gal4RZ`k#DfSvrh=4;90~MlUAo=MDC53^4&I^(( zOUN(wIX2cmE%v^KvSFBXZW?bQhcW-Na0(xh}N!~i-l(_E`?uS5N-lkZzx+VO^ zxwnTK&Td?|=k$r8_s%p|RL7R}shu15qZ{8m_F-|+YipL=d4A~T`tn+irW*r`DqkLY z|LUcWE04x*gv$D)dyf~dU-|mT2vSCG{nmRs5(|&^M_XG1*REgxc1uy|FP~9wqP=G; zUR+X93u6451N3>P?&`_q^M40l96!D|mPn_|7cR=&zH@!#By+Ln;Mc3~-YvgcI{0P( zk;SWa_Vrb_GVMpVytHlGkHZ~RD{c-D>3f>oXMcij^!R+JEC zr^eK(eFMWkT|U-Ul`01%Mf&mOtNL;CN6GWvVDrJ%Z>>F0G3E$EFyZ`_I literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..d932cea43e05503908bce32710c815db1a5118b9 GIT binary patch literal 3106 zcmcImYitx%6ka05wg@!JD+F;I5`&i6dC%;OETwi^T6CedtF#8OcV_PHj@_LZW~S|y zR}6@u5dJ_EDM})U;14y1L;@;M0mXy`7s0b3!3f|clMOxaRY_c5jEAJI`l5_{)NNP^S<*}0eTf#)s2qNH~b#&Kg8Gh%6Olz zc!3^ia2vvp$*P(31I<*RKb5o)+UJ{Ama>4_3|<G2IB_zrMd0$8;@-&*j5Z*s6eW zy?UVy>le$_>HR=GNgis+6*dH}X-7;mk;|RhoNpLI`x$J?T;0&jHs?Vv@azH@ z0xk^VULp}xfMBTz!^jjZ^K>bN22=(bMyaU*7xV^81SLgiO6ED4eqEmW}^XGpaMJrqAEwQ0Zt$SDx?WX zV>y~tctsV3-1?BIws=Y9tem7(Z2td!$Ejv^G67YQLCsS3q15Yl2U^c!7gWtx*2HdjNp;(C@=H4cmzM28TG-+C}A zN2>~;(P;xziBLooOaQQe;6=!(q9}5_qVyF^pAF$Q2cw!sE3|thmIZ8p4pL}4K|E@k zNeoz4LRZt(MYbAR_I%10B<7mfwf565X&SWkUOCX)O5O$Rf3!DX#tp6;-dHTRd6P)* zf{n@1G-d_(5e zgvujxWODX^M^96&Ihqw7q#=!&d^ ahkdvFEoO4_fiCYBUsE|d^!6i7%l-jZf)X$Q literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/brown.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/brown.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a8d1560e175189f0a1a16fb37dd536e4db1d20 GIT binary patch literal 3107 zcmcgud2AF_7+(+#EvX0mgNB63U=%`U=bqUaSZdpCX_YN)S!jz&dHd#Vcj)fSGBa(r zHC`AwL^O&aCm@R($-_x;{? z{NDF{?`^8CT3nESL%zr3DX6Rn)Z+KG?mhJ?{G2^_0pM3&qN2g}c&5#8?@6AgcFy#8 z^4IF2dZ#|PM1^MD3p6u~yvcY1qdlI5Macw!&B!6bs7W{cLNJ7{AWStmff{9WT z)hjwIw5+2l1Us6cqLD?5h=oZND~KZp5XpGVu+^lWOzBnew>wOeL<-_G`^jS0AWT5G1CM;24gf8Ifi=ij`DGP+6JCTqL$;X%V$HP@b`c|NLas zaS|#`x3#r-+jy^OHPNi1C^W;-97kaUWw#p+NK%G9C#xZVY-s5TM>h?^)d<37i{mG; zr|A&liJV%)&d`Jjqmv*(vtGsxDFxJE4wq=LVkzSqq)`mTk>S`F%jU3{rC=}zA60EU zoAB0HbKA50n=#HpzP2Mh-*6r+S#1|wBL904{pJ<>idRD){7 zwBi6SoE`^Fh)x(yDQm%?T4~r0Fd(W7_(|-lSJyRF=0pv!EKkW2@=*d57z#)LQJhbb zBSKh$3L|9a2Ta)FCY3usU0<3Bv5wqos6Gk$c#dT#g$whP=EK^;G7BgOL4*-}VMT)= zt8J;J;}Qq4;aXjnB%<#BXL67CU4O%blIx7n-!%B#X zD7-|8$jv5Rlqt!lz%ave2(fZD^ow2RRaQ_rK3hYV<9dcx7zIWX!kZ9HUVbp50-*#& zh7$Qm1V-JT8rk*J0F#@E->QO`{cA!xAe2EPyvsWZ8Z)VwrIQ zBoZ+lrmBl>HMGqBlq*QWF^Qq}GbU*ovh-m&Fx*Pc1>#?{H*UsFtQ-FCi$uEzgmfFA z|K1_e|A91<63>oc%@Kp+SFUJY^kfY%4ppi1I=5auh#oz*vAW+3?=AkM^P6`&lmjb3_~_}D z4R6l{oq?JqKOH+Pc+ae#;gq1Blh5Sy56;;2)pe)4Q0uc*GmG!}@Q+;s`+P5U&A)M0 z@swHj8~e7eI;WLHTMD1AJJ*=pvzn@3zOnA$FRce)-bchc17dz*XyL(z>% literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/cyan.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..ddee835b76fe22bcaf33f38374418682184f08d7 GIT binary patch literal 3142 zcmcImYitx%6kbZ@QKTV=U>kzNKtzMH^Pb%qyVlYLT6Ced3vC6G-krJAj_l4%XQu5I z6=MS?Z3GQQNI|J4njkSGqBJcAFbF^VqlKWzqhJEs#F&x*Vu(V$v#++&(gtOcdEN8f z^Z4#L=ib(`mCL8+;1<( zo}79uT;)`SUXWxX<^_rof!=t`L}-tvpfGL%c>{E?2&~og0DkqWqd2B10lbnAQ6aM! z)@dahEm*N}Wmw+0K^7If@L8-NE+GXm=m0Dpi|V!%58w&C68d(BNgPW+oDBiI$Tf&n zh03sE!-AOLr3jg#7|bVnX@TPe>S>Ij7>cBLl4b~6kSI=~eOT(kku^(ErSjmilr8iZ z!0Q~xlt{9vsma^KdJU_Vq(xCADTZVi0wD;yS$9C3(Cr0j4MAwjmS#Gdp<}K_5HT8@ z0FFFOh7dC|YIQqB6C#X^1Cyk^lp9h4sK^Z6Mnv1;W)qU-&^8(@87^%^78j%)vz>A{NX@H5K51p%w7O;aRFi1<{$AQR9ZQ3y`u{6s`x zB7`FP{5}DQ48w5g`9VW&aFfcNpR6y%kdcneYDhekDUo9Qgc{)h0R;{cq6kGo_A3nS zhdiyyYFgVWOG70NqC>U1UMWbU3jG2rD-nWKe30-f98HLH#C`CJ$Z|C6iy#gM?G_tR z!wMM+;+(}XceN#?9=QtK`U>E5YOu;p)o4R<(8o~dB5C)Tl2?x*9~7_FHAFFkV{X1k z3HueObs+}?o@e>gc$pT5(W;<^ShJIk2ty^+!zFGfb1PIT(QK4+&8c2f0qav=Q4LEJ zr3B<;2(p`mFH~gxQAbGyw}1)gp$+tO{~8=WWn?MsJ#x9hA#a}vX*Yv_JlPthvZ0lgNYO^C$r zKNwk&*<@8vfFl%&lLoW!B>#g+CYQNulh}Brk$S;+a}e#s5^C*ZG<$^>Wwd+n1Q3M?LGx~T0$wBl zt1>Jv2)wK>PN<{MTmh=1_u$A?K#_5IT&xpP5r2`pKLlp^oa-LZ`&Tk9Kx=JQH3i z4Hkv{TTi@uc*Qy}8aMhgX zsS^Eb>B_v8pQd!b6+H8M|E=%Z+hxvPzWw9M zFDEO{G=50k{CQv9wl_WM=IfKNS1(oXyqMj8y7KuOTOa;>ZT_OXd@OI?#|O$5&YN3v z^>)FIzV(FFd;Ho?qhGyIICo-`*~8V$|7P_`ZpNlPcKPj|-I#Ik(<6Jb?9M#}_}_=H zfnKHWgv=@7*&X04k^M!-w)NYyOCt;0-YMx>(+0)-too0h`?2ea^ZI47XlJXQyRT#+ zmX+JTZTA~_)t6^Z>&@)&8nyw(MmW8=d~Yy3U>tmPT%#nN6>Lc`jk@<}yL@$hUgal8UOIMa?Uc5I z-{-a*uRJuHxp26GU1W6Ls_!BK5B1L+7-+xavCnst+ZVhYc2D}HOIHT>FR5wy2e~UD Aj{pDw literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..9acbaaf814af9f2957d4bed064e9ca7352f9f1b8 GIT binary patch literal 3112 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 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/light_blue.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e32a0a53d0fff1b62cf554bffa5ac1a05fae12 GIT binary patch literal 575 zcmV-F0>J%=P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00FN_L_t(IPo}0k6vUwrKd2S8RM4UBE)EJ+6kNO2$)PohC>3IYqKQrK)rjq&L#c?>_>tTs_p6C* zjmhxycsC(8GR1U zdF_wVvJ=9w8WB+&K&O;o#k^)}UuRcMF}bJl_N$36dd1+kByK&$v-MLEwE^_W20aHR zW8afZ?CI9 z=U7DT0H4okmle9?7`<}b8gAQ+&@3rD^{LjG6Y$)3hBFZ6g%qP_J4Uyp;}nZ^1R~UJ zsMc`Br?80H0305bB{NM&Kw&MBX4%Lf|IQ#?rm0@Jz@`1AWIo3Z9xwl-X8nxDRgDI( zMx$4u+LPds`+};)umvgpn4>}El4doi7fsy1(#YcF+w<0|T|DAL{0~LbhazeNC|@|C zO#HEYKFUK^oYFaiVwb{$S%sn*gTnVJh3|fds14vg%4+7LtmeOqf*ZD~108!0HE#d_ N002ovPDHLkV1m=@13Ul# literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/light_gray.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..7604f549e114447bbd3b31d453771039e3a54526 GIT binary patch literal 3057 zcmcguZEO@p7(NX0QA!}i#9~C3EioYM?f35Oh6AxzXqBtAw4n{6&hF0k*52(dyW8Hi z_yfsBAyzbypd}#k2ecss;Rgyfs2EYH0#RZx62lKPMw5mZg25kk=Dyl$OB?*S$zCM)aPG|1+kc=Yziu0rZ;b*0%bg(5!j*KP9wh zZ)GS{w#jO030mT7RozL2f#GN{oJqL|9SSX9nQ?*M4g*4iZI&G+2Tz?Q3CoC*>%}+| zcdKE-s_pjRy6*ZWy}Mmk407cPVtGbI22wBpL?)HAeKiv$b9PnK#@#eY2x}r=EIKHMze~d&|GM{1Q@b$*k=cXhMY18Q{`vn88cR0S&!`b343b&bgt}FbPx84t#`VOIXBGJYIs2 zX*QKAq5Yty6Gc>5+n8v-smq0QBlMjPPlq*~$YWJ8Fh6L7!_-V-I)axby9p<7{DdZQZ}GTVXZr!LbyydRk|@-$Wf`i>83NB3JSB>ZLMe(MQ5vs9 z3K*=+09K9wQ7X=lIeG^c6`r5ZFT>H1jnZzYEEG&xkBF4QOB|&@fun#4AjJb7aiQ_D z$;m})Pk0teagZEo6-Q+tizbXnyl!X|Z^)2}7y?TvtcD+=q3{CB%NpWv*l)FybiBA@ zAkKM`z`Ly?^C(n+^D9cSh0Yc%)nrG$Q|1`-qgnhcjJHlOK0MrPTZm$gB(Pr8od0#G zbfEwwQRKx!e}k2Q$(ERfSo8CNATo0^awDyyM{p&>8LHM=KGIxQq1LQ}n+mO@MdXrF z1$ur7I#wq%$U?U@#s*K0%DmZh0wS_*quM;ocg!FSJh-Y2F+5>b(BlQ~gU;KB&dLJI zuo9$9BqvIQ0)wASx8#O^z2O zNz_e%6^*Sq|Fqa+4drMUac?Siq01O%Ct8`-y`?+DB)`s$((Z$I37wf~T{=XL(%(9qib-#mWw VskyV8Q}|L|S5qH5^60Z${{-P-`gZ^T literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/lime.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/lime.png new file mode 100644 index 0000000000000000000000000000000000000000..6b34177e7a9b6ea0d0af5a4a88fad8f3b68546a8 GIT binary patch literal 3122 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 VZ6`kd5#Pz18kR=iy8Dqee*y3W@Lm7_ literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/pink.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/pink.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d2dbde8c4cd5e79a3b6c0d7f63ac1fbacd2552 GIT binary patch literal 3008 zcmcImZEO@p7(PNuS`Z~-2%0FH2}u(YA&U5;5;6G0)C5fwi8ym#ZMCHh$|n0Y z?=$b$JnuX6O1AT{rHda}9E-)4cC@Fv*n1hj8yB(Xs%tk9do}s(Tf>=ojOcs7lf3O+-}V(ZqIe1r#RB-pgiaZ}>Nr>8{0At`Z-o{=+t z3+;E>M*`YC(%FMY2CzxQ^^XecN)}U4pb-*Eg}fVDrIc9KYq4)WEQvxH5)GupW^PdE z&18iZFQ9@EmjRY#MM#)&XlR-tKO!iyB1^I^K?Oj=k~Iq^gz6|#*1p)3;HBznx-TxlA-{H0O7D3p%QSz)in)i8sfn5Bgb zrOO*L67II|8?18eS8RV(+3FpW8yG*nD%rYAu`l4uZ^(B==Fn5qVuPL{(-yDeVc3o;&IIafu2ueQb1 zGglF>uapR@gT0)p`N7IyLXp`eLH?}Dx6UD-6mNDNmSRN|IA5%?{chH}m;;8ct9o@j z>y&7|H|?;jg%wAPsgkYJCA^dI3bopuka2Ff+H1P$_Uc#O5z0krAzTRob9Pc9R)?J# z7I=QCtf(#aQ?0f|;=)+~Hub=MK?e3bA|?AhwaxAWVt5z$*yI_wx=eSC=&8lIs3c zFGwNsgvs_ZYtje}oGBcbYNhUi@ITs{lX3IwhW}>V9bP1f9}p^SK>BBgsQjlZnQY^0 zQ{H&3nR>x|ImmWmi?#MSnmvIgHtd8BkZG{}L+9m*bQ2&or>MGN=s1Tsqq#Qkzczc$ zp>i6goSSMx>@dbZ>!(2WQ$I&im(^{+PKlSUEc$|-Fn{YvH}@o8y|91m@rBLHcAYx7 zd;R#r(y!z9H0{}Yx#jn7-#Wi{_YXggB^uk#U)(r+bwP2t@zCWnJCFQiA36HTo39rP z(|P;r7n?u40L~WR{ohRNSQLz1J36voyDI2SKktd&IQN>^*>LIb+EIJklBTmC?fT{Y z(eeBZyMOen(=Ruj6f*bTHy&G;cz(y-4dDBCwy6uBTC=I4?etyQeb+DU8+gV&vE@Kk zy3srM?hAcqM$azOSFDW0=n-v&wVY&EANn(X9elQPV(D|^Uyf{VKK8_e`E#R<5m<9L zY<;?M+mpxspu7LlzH9hk)rPSX$K#ue^t~%LZyq?gVB#45`19@+!~Bfh(b}0lzTw%I F{sv}O;0gc$ literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/purple.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/purple.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c6b313af92b70cc16ee7c7d2b99d3eefc4012f GIT binary patch literal 3133 zcmcImYitx%6kZ5WC=XE}L4#p3fE00d-m^Oc3zlwa8`#pc1&V_9&dlBJ*xi|7X4-Bm zktmN)O_7bF)DR^^Q(^>un1B(KpeSe%f2f!M!6HbFMiB@pL<-*7S6gXmgEHBj$35RY zkMEvy?rknBEgGBqNUq1@8Cy~uEJx4r?tkP6bf0?lHb9S2X7LK!;~71{{SWcHwSBV3 zle=20ta7SCizUT~d4X!k&>N4L2<`FAogX)WQVShShBcZVz%Ly*gkzc-z?btODr6SG zh*sQW!HTBRN~Nh*5mkKtJZx@ULJDHg0a!d1)om#rz>|6<^zIImIF^JswE;ZeHHcM( z%CG{%f|%f?2!)~;%qMzjf#U?~35=l_illgwW(Zo4C{Ch%So*?|HA@Xk<-vt%Tj(o* zM;ynLNV1`!!P~%k4XcKvMNuRvhGZB5AqcxscR-xb?P(beL1-(MW;&XoW3EOZ8+A?q zN1moah?!Znx}By85k|&=Nzz`*4Jip!l`PJzv!Y4kszSmjj6vP85thzk5lf*^7T%}Y zSS*XSox*zLQ98Ch(RO8{3CVJ38+Dcf3+s`^X&J|CryO=uGl=O3o}Fw)49Bn|Mn5EE z#l5I-v~WKLT}dw}jBEWsT}c*dN(B}Kj$u_AMl_QjRt#`8+dvG z3<3uRa5s?%%1^LVCBsM*E%Eeh3cXM%Xb7dI3LMZAEE1GhNmCLpNL+8Qp=#mA0imiQ zg$*kP(86gkPyJ3m!ls-Ykq+0~E)4nW?|KmtM_6Jf|P1n?o{VO~}k6;gtq z6*AhESQ;vE5bdee^-4t=!_Y6ViYgPV>Vt$|$H!f zDO!L;SY!o)ha5%7Ebk)(zo^I*%Ror`GNIq;IxEqf#ITuyyBF8fv?>vx*Fdxhk@&p_ z;}e0bgjGO5KgSc4jDi6a6bONlDL{(~WFgmAFnuFJQH@vf0?(-s% z?g1gy2FQPRh}3s5#pFVFZITNkK=hG4M?xLdt%XjB-`Zb|^mv9? zCBghkf6EuI(X|y|;>LIEOR)vVac9E&E#Hs-ZAT>d%KE1YSKXXc>fJo}ULsHGh{kXKCl5$z@Z>`n_w* zeo1_|Xm@MJrY#R`_U~FW=KSThu}>Fc)wOMl4n(YLH*$9$JluLPe{KBjWuG4DDtUDm zS5$qpV9k%W^WLn|_a&a()ZW~lnBI2fSZCRl3sc{SR)?&Ax2%T}J9 zSM=ABmUE9^D;Z|&J-9ppFT9axO@PG}A!26y-Nd9RU(Q-`=uGQ_$2a`CY5GxW%$A3T zuKaAqxbv@{>KJvglxjb@Yu)&+bHn$1Qg!ZPWb0{?EN@h6&%Af#ddGybA6y!}V- yM~7^kx&9dO`HZh8Zd>!bIy&cO%dOjN*RY@V?^_$&(RRu`;FlDZ2KOwee(4_>{Upr* literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/red.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/red.png new file mode 100644 index 0000000000000000000000000000000000000000..541da8dedeba6a1ad24a6837174e381621de3fb1 GIT binary patch literal 3074 zcmcImYitxn9A7}Nw30v}74QS=QUQg%eed2b98K+&_6%2!at*DYnBAT2t-ae_cDHv| zObnoihJX+J0EmVJi9uB2`#}@MXs`*$2aO3v1vE%vVh{--_`=zHwUw4OD4Xo;?96Ze zkKg?N|CuKfZ7tKP=T>7FHZ9f~ZAahf!CN&2wev1r1L!l=Y3=ebtY&8LPQdo;osD7D z>&;}R-x*)2Xm%z9bX$d?e8xd&3|rQacYxLdeO!gzrWGMB9QlaAO+7-a72~eDftLdkgK46Fia760pj;Wh{ix6-WgBe zO|}bhF+`IZO|!TphZvFPMS2O&(kxBU0>!W-BPuknFcMyR2&B!`4W&K0qNEG`MTnH| zI|@bRa=B2B3)yZr#mKTu(JaNXBtnp0pXGx*X?gR@5~9%4T+{JQ+rk5hK(%}Q2!Sju zx{z@yVlA&k6C#Yt1BYTlbl_3}sB0CR)9a=S%5{x`X_$eQ?;$Kx!6KI8@d|uIv6)N- z?fK1FWKqet5z$_<&w*4s^z2?&gUwl_aemn_&u@o=)Qn>}f>#zhDciTblsyUwmFZzr z_@*(6!eC|?6z0uQputQ9>L^Vv1itMiZ983#okZC-oMl2RzG$s!>2}V$H*mbP07iii zBSa8LBpoI>I?1vM%_su1m_{AC2#urA)PWC%f@PAHlMJm0lETx&z_xB0ePcp(O)+dY z1JK5q8PE+W$LcOX2Rj|I8U%IU!8I|2oB$-zk0|FALxT)VGFoJb0g zM`6hc5-EmdO{F;&LPjdPe!c0O!te^qm2>E3OfS)@rGV89(IG?;H}4F~s=8|EC^f<& zLjr*hlPWDqq@i-MEON9i8(<`7Ml1-o*cr{Xvd|q8SPpOjI!K}GMF_*SGdOUZw5b)c zi^^Jh>3pgrB<|bzVEGx9G#$F;kQf-MrD6j9Kk6GZ;>K4EuTPd+yh&7WK`531>faTj z_#Z7Yxgyw`!ojPIR13x%gXknyP-!2d*z1g}iK--!Ko(V!5rXstf=mL=U^zh)1+5s- zfi(NS7W*KE3N#G4H;RGQ9n>oo}>F zTs^({WdA)+r_64AV%MyzlWS%!y{qB&>bbR@*{k(6Jxk*&U!7e0$-Jsf?{VU`&G?pG z`6JT65!rio2KVFB??3v;wdO|auZy!De>Zt<(G@}D`sYkJ-rutE(Ah+`c6MS_ZS@zc zf4=_y|b{i%kd+5xrgwuPG~MIVDJ&U6gO$CkxEnDbP_RI&cS1t+kX zr}muq(%-gjKeq3i3zxpOyt?M9eW(6D{94`R`m+a4{n@u=Yx@9J-T3iCFB-(!<24=D z!kypMzEHLOC?@Q$JNDHNyDo))Vq=LjMC{i;>c78p+k)Nw9qk=U7E4^+E8oUne)Fv} e($#C)@7ST1!|mrb{k9{xrN^4vqOae-Zu39Tg83Ez literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/white.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/white.png new file mode 100644 index 0000000000000000000000000000000000000000..4d070a9bf209b2021a11e93d1537db19cf0a6cd1 GIT binary patch literal 3015 zcmcguYitx%6drsa4-pX)5J()SApvxD?!0#2<^B9I%(44kf$@^Y<&zVi04_>DS}WJ zPY6ZqI#U>=k_k{;a;Jb&NgW!PjUk4yA7*{OP~%QZ%{NvO6B4^>o9o$rZ?u{&ygC6} zFvcm45{U;%UItl7GJ$BS;=_P^fC@B2sAr70pzV6TrUhI(^eZZDcxr zScGKb+#<|lA@K5LYnhDM>_sv35N@_o9C0<_y0)q5iY7wI;1xqvcrm9)JXB?wSFs}* zj-(s9tk>pSKI*2VqVp^HW&4QesPBfEOiD=&B9Yg1sPKla=zLDL0q^L#;UHCmKvrtn z9uHlT;;=AYEA`4I8XcU}WMt=f+14?iv=xyz#2kI7wjnE`tmjA!$Lu!x1wYLAHi@~+ zv2?dhqMo=4X?~?Ru{zj6saoi+4C)dfmmtz-Rla>1`Ixxfb4iFLj-`At%l6wy=^_qj zsw%71@fNp)3mukAq83#g(Z)-*Pn6I~Ml;k*yAk1BU$xe>;hoj5g3FeZ(uAn81Vq`1 zZLT`(PO`x>3uQ%ZZzm?fx(RD5u*i4fUKrwyc@p7ivqG54`3Uyh+;ve`L?CLIcMMr0 zj8p(&ldAJt(m**NOBjoUn^U2+2W;!zjf$pT6HsV9KCUJXz!eXpZ9+DcKiH+HtmeVH9fK7*XzHnStO4hIk&6*k0rZ5y#!Zm zX=}gd<^1_G!_RazSsy%|xO)6Hx#8H0(Y~`kS>JXiFa9zzdK4|4o$Y@9jzt%qJ9#_! zT4n~nR5Al=PJCCCPc7fjKKG#=&Win8o_%j%&8{DibLsn`yPVCd?_6}@N{Qv(A6|9r zoxww`>yBK1bjg9tiQ)74h0LZoOzHBKk;R+X)2|F3Y(3A6-2cs!Ul^lDNBch+8hrEJ zl_!pGu$I0wOKv!we(k`a`z~I4Kz?d;XwUF6Bfncs>`z;t8$NUO#`?1h;ai74UjD*J QBW<;to3>g*n|AE^6A;+k7ytkO literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/yellow.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/cutouts/top/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..76db07352bfed0ed1582a51b94ae5875ca3b8b10 GIT binary patch literal 3080 zcmcImeQXp(6u%;n79qA^qA?iPg+D;p+u7aQz1yV+w7r%Vxl-DbmKddTv$O5W-R`ox zZLdHShzca40`UVPB+4IPG=@Y=1x!GLC>Bsq@jJpFM${mQtwKT~&fZsBX=#J9$$riI z&3nK1=DjzwsjhaxqzU&-@cDd`YN{jkCt)e0o5^t`!LX-XjqlGue*Dw!}GB^9RAdKL2R4YM?rhPW%jbeU(6 zYKqoT6{d|T$qyI=08a&FKPLqO5|~Z#fCnrPS&nBoNdWCajGJw4 zm?lg!E+nnITEoePi3E&IL5t=5z;h`LR8byhwb_ZZaTT#Rfs@#99fIZZSQ4dZG!GwA zZ8DihJ8oq=VU+c4NVF5{v@lzb9kb0wxU!vCoR%Zzxb?U{G^3bK;Q7f`tLd6ft2s;% z^5Q|EaCL1MgPvp%6sPoIpq?ZTwUi1QL)WxprkTj)PF;>0#dCh1n$f5ms@dVp^c>Gl zz!B);FzqE0144`dVmz+^P7%3TfP8=qG)huag)STjmKh+&IG~7v0z!kprmAb5BSKZA zXr`TnWa0EAY{9H$w4|*?qe_k8xX?hjCK9FzRllyQip&Wi9>pP{DM2QH1DFZP05DkQ zWhnBz3Zx8MGCyLXHZQ5X`I-7sO+<9$S3{B2kjhI)W~2~S8Gr(DMwUg6!J#0C<9HlF zEaliNwslhCFfmZ8$4Vs{H5`%zq{bOR4H80XfMaAX?ma|R76P0Qj1yMmmdsQ53}Nc%7cYiKd87qUL0X5cktF(voF^C0-}1u;mHOGa@Z@ECK!oa@(97Zfg_@ItPJZiad`tf&k02!zv$Y{h3O_DJXg7Q$#4A~HFu`|dt+Oa(#u`FmqvXNrj3DcTw zCMjrH2_2=Yi)}a5?EaK5NXj*-{`NC$&{S;e19D)Xl{^LNf3!DZ#*MBUUSBM?c#&A| zfRJee?7uri=0B2&WR5W$zsuzql2gy#Xkk&pzvsXD8N%5e_Kv{}2oamJ&6lDeq z8ZU^FBq9xZ8SQB^|7)}Nawr{!0q3UN5IKx_pZQZD`N^Lnu|ewACa1)W&Ve&NUqQGg zQWgts{%~7Q?U=IS%EgzT+4tGF4<_ExeXJM-jy)$VDR^pmY!i1n(sbp@liPne=&vfd z^O234x_(>u>)8X{hjvb1I`i48mygv@N6L>Zs;&aldhCO9zUnC| z2WQ;1Yd8Oi{+PXc#+a^ei!@sA+h;;e&SNQ2G8G{x^&^44W)-C>f)zAj$OFrqdf&X|Jr!GuW$AGH&!;D x;=UXI)5-bYtllG+zUw?V?(v3e*S0@e(DVN5$6hVE&GydfHI=oIx5}H>{{y^)2mk;8 literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/front.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/front.png new file mode 100644 index 0000000000000000000000000000000000000000..019b77189478c9ba7aef91d2f2a30be1c244c0aa GIT binary patch literal 498 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00Cl2L_t(IPu)_@s)Aq?^hKgYB$=TQVI>6- zR`d!{3jNxTM)WR0yV|yiYSRPwUUTo9C^Wjz`U=C~IG<7%jJU8>4f9) zi2Z(#!{LD4ZYPi*a3ZIzRx6ppB%Dm1&1QnhWFnZ)=koqM)9dx16pKaF>vfP-RYg9Z zf5EnGL0rpbv*N8*tH|YY_zxXemW58I12Xs1b^QfR(**GjGMS8c8;!=JgG!}>AP7KC zrBe8PlqVd=L9^LRX!Ov__=Q3NO08CtNaSx5(91#%!+0cM>*RDgotV~cw?V`;dg$%< z`!G#2xkCINFu^BgN_s!8@ZJH-ZM9knjh;VO__hOjUn`W$WsF86kl#D#cDo?r8a?## o&TxoQDwX7JlfUhN-iM~+2SFbVtlnvJEdT%j07*qoM6N<$f=C0~ng9R* literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/left.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/left.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc4717362b7512ad4bff3c5d58aaf7196dbb5a0 GIT binary patch literal 551 zcmV+?0@(eDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00EatL_t(IPmNMZs=`nZe76t;aUqHtQ4n!L zL4pHbK^(w&7V$0tce*s2IBYzC_bPw27!&bB0!5L2mDkmkR_pZ|o6QE(=@jGf7>mUM ztZlbj%;$3qheP!HeK{j{IvsSoT|uwcgWBzOxL&Wg-|x8HZo-epL)fw`TrL-writV6 zi2Z(#!{GqKFa&Y|JF?qyxs)z+!p`K$WFi=iMuORFChzZWTCEmTHk(DG(EvFd4nxy4 z8?jhS5Rb=gP?JulQ79A;jYgsJ`Mh){`+Pq9J?agLQmK?=^3I7)Xx+}BSS-o`ITDH3 zo#=qfnlq>K`Ha))^vR%HF3W6Wzu)h2z#8p3b7BT`Y-d30bU^;);G09CkmOaVR6ZH3 zRx7z65D2&&RI63!y6&n`LoMwm5(%hMsU#N3Uj70dP|KxCCX+7*Oqm=E23_6i^*RV= zjT&m(?Y8_O*9cxRpi63hj_{oU7pzvRxoXt>JA&5?sI^DP<#HGd1|WZD&}=qAIBV2U p%Uxg-mC0meS;$^9p!QYM@C5Eh|E?oOCXE09002ovPDHLkV1lj+>8k($ literal 0 HcmV?d00001 diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/right.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/block/security_manager/right.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8e1f3be055b75f74023870b9b5f44054367999 GIT binary patch literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00FK^L_t(IPmNOBszFf{U4J1D@*u(%CAmdO zF8PJ+R_>R*N&ZE7J0w1;Lf04ucKP6I(p=M zweV{OPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00Cb~L_t(IPo0uo%KT2u&!sW-Z_b{X{mpq3rBVr%N(I$w70qT7 ztyT-|b{m~ehwVnAfqK2pwq;qYTCK)=E|-JocDuOW@2uzZ$s+rDy&?z#TrL-!PA41= z2i9`A#B4UhVzH2bUa!YLL?RI+5{a)wcRkNTKA)En(5rOtx5PK1yYu-Rg+c*>a{UD` z8jU2twr#v#FJ*x5`!WTp?&Iku?N z$Kz2M(C_z=&1Pi^=kxg|Kq{4jD3{ATVXA=fc#L>F4pA%?v0ks00h`SRu~-a(D(Ske z@+j|iI~f60(s3LNheHmFW}L>9`b;+YNR!EgA6l(e*zfn)Znua=qYzYxbUMu~`N%K~ l7Wp+z blockMap) { @@ -160,6 +161,12 @@ private void registerEmissiveModels() { Blocks.INSTANCE.getNetworkTransmitter().forEach( (color, id, block) -> registerEmissiveNetworkTransmitterModels(color, id) ); + Blocks.INSTANCE.getGrid().forEach( + (color, id, block) -> registerEmissiveGridModels(color, id) + ); + Blocks.INSTANCE.getSecurityManager().forEach( + (color, id, block) -> registerEmissiveSecurityManagerModels(color, id) + ); } private void registerEmissiveControllerModels(final DyeColor color) { @@ -269,6 +276,27 @@ private void registerEmissiveNetworkTransmitterModels(final DyeColor color, fina ); } + private void registerEmissiveSecurityManagerModels(final DyeColor color, final ResourceLocation id) { + // Block + EmissiveModelRegistry.INSTANCE.register( + createIdentifier("block/security_manager/" + color.getName()), + createIdentifier("block/security_manager/cutouts/back/" + color.getName()), + createIdentifier("block/security_manager/cutouts/front/" + color.getName()), + createIdentifier("block/security_manager/cutouts/left/" + color.getName()), + createIdentifier("block/security_manager/cutouts/right/" + color.getName()), + createIdentifier("block/security_manager/cutouts/top/" + color.getName()) + ); + // Item + EmissiveModelRegistry.INSTANCE.register( + id, + createIdentifier("block/security_manager/cutouts/back/" + color.getName()), + createIdentifier("block/security_manager/cutouts/front/" + color.getName()), + createIdentifier("block/security_manager/cutouts/left/" + color.getName()), + createIdentifier("block/security_manager/cutouts/right/" + color.getName()), + createIdentifier("block/security_manager/cutouts/top/" + color.getName()) + ); + } + private void registerPackets() { ClientPlayNetworking.registerGlobalReceiver(PacketIds.STORAGE_INFO_RESPONSE, new StorageInfoResponsePacket()); ClientPlayNetworking.registerGlobalReceiver(PacketIds.GRID_UPDATE, new GridUpdatePacket()); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java index fa56b64fa..9866edefb 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java @@ -17,6 +17,13 @@ @Config(name = IdentifierUtil.MOD_ID) public class ConfigImpl implements ConfigData, com.refinedmods.refinedstorage2.platform.common.Config { + private ScreenSize screenSize = ScreenSize.STRETCH; + + private boolean smoothScrolling = true; + + @ConfigEntry.BoundedDiscrete(min = 3L, max = 256) + private int maxRowsStretch = 256; + @ConfigEntry.Gui.CollapsibleObject private GridEntryImpl grid = new GridEntryImpl(); @@ -88,12 +95,10 @@ public class ConfigImpl implements ConfigData, com.refinedmods.refinedstorage2.p @ConfigEntry.Gui.CollapsibleObject private PortableGridEntryImpl portableGrid = new PortableGridEntryImpl(); - private boolean smoothScrolling = true; - - private ScreenSize screenSize = ScreenSize.STRETCH; - - @ConfigEntry.BoundedDiscrete(min = 3L, max = 256) - private int maxRowsStretch = 256; + @ConfigEntry.Gui.CollapsibleObject + private SimpleEnergyUsageEntryImpl securityManager = new SimpleEnergyUsageEntryImpl( + DefaultEnergyUsage.SECURITY_MANAGER + ); public static ConfigImpl get() { return AutoConfig.getConfigHolder(ConfigImpl.class).getConfig(); @@ -110,6 +115,11 @@ public void setScreenSize(final ScreenSize screenSize) { AutoConfig.getConfigHolder(ConfigImpl.class).save(); } + @Override + public boolean isSmoothScrolling() { + return smoothScrolling; + } + @Override public int getMaxRowsStretch() { return maxRowsStretch; @@ -221,8 +231,8 @@ public PortableGridEntry getPortableGrid() { } @Override - public boolean isSmoothScrolling() { - return smoothScrolling; + public SimpleEnergyUsageEntry getSecurityManager() { + return securityManager; } private static class GridEntryImpl implements GridEntry { diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/recipemod/rei/RefinedStorageREIClientPlugin.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/recipemod/rei/RefinedStorageREIClientPlugin.java index 466e8260d..3369fe363 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/recipemod/rei/RefinedStorageREIClientPlugin.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/recipemod/rei/RefinedStorageREIClientPlugin.java @@ -95,6 +95,12 @@ public void registerCollapsibleEntries(final CollapsibleEntryRegistry registry) ContentIds.NETWORK_TRANSMITTER, Tags.NETWORK_TRANSMITTERS ); + groupItems( + registry, + Blocks.INSTANCE.getSecurityManager(), + ContentIds.SECURITY_MANAGER, + Tags.SECURITY_MANAGERS + ); } @Override diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveBakedModel.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveBakedModel.java index ee1845579..4e336d905 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveBakedModel.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveBakedModel.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage2.platform.fabric.support.render; +import java.util.Set; import java.util.function.Supplier; import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; @@ -15,9 +16,9 @@ class EmissiveBakedModel extends ForwardingBakedModel { private final EmissiveTransform transform; - EmissiveBakedModel(final BakedModel wrapped, final ResourceLocation emissiveSprite) { + EmissiveBakedModel(final BakedModel wrapped, final Set emissiveSprites) { this.wrapped = wrapped; - this.transform = new EmissiveTransform(emissiveSprite); + this.transform = new EmissiveTransform(emissiveSprites); } @Override diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveModelRegistry.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveModelRegistry.java index 1087b13ae..8350779ba 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveModelRegistry.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveModelRegistry.java @@ -1,6 +1,8 @@ package com.refinedmods.refinedstorage2.platform.fabric.support.render; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.function.Function; import javax.annotation.Nullable; @@ -38,7 +40,9 @@ public BakedModel makeEmissive(final ResourceLocation model, final BakedModel ba } public void register(final ResourceLocation location, - final ResourceLocation spriteLocation) { - factories.put(location, bakedModel -> new EmissiveBakedModel(bakedModel, spriteLocation)); + final ResourceLocation... spriteLocations) { + factories.put(location, bakedModel -> new EmissiveBakedModel(bakedModel, new HashSet<>( + Arrays.asList(spriteLocations) + ))); } } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveTransform.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveTransform.java index 69a7cad1e..c87fc09b0 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveTransform.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/support/render/EmissiveTransform.java @@ -1,5 +1,7 @@ package com.refinedmods.refinedstorage2.platform.fabric.support.render; +import java.util.Set; + import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.model.SpriteFinder; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; @@ -10,10 +12,10 @@ import net.minecraft.resources.ResourceLocation; class EmissiveTransform implements RenderContext.QuadTransform { - private final ResourceLocation emissiveSprite; + private final Set emissiveSprites; - EmissiveTransform(final ResourceLocation emissiveSprite) { - this.emissiveSprite = emissiveSprite; + EmissiveTransform(final Set emissiveSprites) { + this.emissiveSprites = emissiveSprites; } @Override @@ -31,7 +33,7 @@ private void doTransform(final MutableQuadView quad) { if (sprite == null) { return; } - if (!emissiveSprite.equals(sprite.contents().name())) { + if (!emissiveSprites.contains(sprite.contents().name())) { return; } applyLightmap(quad); diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java index 202a56c63..d653f97af 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java @@ -19,6 +19,9 @@ public class ConfigImpl implements Config { private final ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); private final ModConfigSpec spec; + private final ModConfigSpec.EnumValue screenSize; + private final ModConfigSpec.BooleanValue smoothScrolling; + private final ModConfigSpec.IntValue maxRowsStretch; private final SimpleEnergyUsageEntry cable; private final ControllerEntry controller; private final DiskDriveEntry diskDrive; @@ -40,11 +43,18 @@ public class ConfigImpl implements Config { private final SimpleEnergyUsageEntry networkReceiver; private final SimpleEnergyUsageEntry networkTransmitter; private final PortableGridEntry portableGrid; - private final ModConfigSpec.BooleanValue smoothScrolling; - private final ModConfigSpec.EnumValue screenSize; - private final ModConfigSpec.IntValue maxRowsStretch; + private final SimpleEnergyUsageEntry securityManager; public ConfigImpl() { + screenSize = builder + .comment("The screen size") + .defineEnum("screenSize", ScreenSize.STRETCH); + smoothScrolling = builder + .comment("Whether scrollbars should use smooth scrolling") + .define("smoothScrolling", true); + maxRowsStretch = builder + .comment("The maximum amount of rows that can be displayed when the screen size is stretched") + .defineInRange("maxRowsStretch", 256, 3, 256); cable = new SimpleEnergyUsageEntryImpl("cable", "Cable", DefaultEnergyUsage.CABLE); controller = new ControllerEntryImpl(); diskDrive = new DiskDriveEntryImpl(); @@ -82,15 +92,11 @@ public ConfigImpl() { DefaultEnergyUsage.NETWORK_TRANSMITTER ); portableGrid = new PortableGridEntryImpl(); - smoothScrolling = builder - .comment("Whether scrollbars should use smooth scrolling") - .define("smoothScrolling", true); - screenSize = builder - .comment("The screen size") - .defineEnum("screenSize", ScreenSize.STRETCH); - maxRowsStretch = builder - .comment("The maximum amount of rows that can be displayed when the screen size is stretched") - .defineInRange("maxRowsStretch", 256, 3, 256); + securityManager = new SimpleEnergyUsageEntryImpl( + "securityManager", + "Security Manager", + DefaultEnergyUsage.SECURITY_MANAGER + ); spec = builder.build(); } @@ -103,6 +109,16 @@ public ScreenSize getScreenSize() { return screenSize.get(); } + @Override + public boolean isSmoothScrolling() { + return smoothScrolling.get(); + } + + @Override + public int getMaxRowsStretch() { + return maxRowsStretch.get(); + } + @Override public void setScreenSize(final ScreenSize screenSize) { this.screenSize.set(screenSize); @@ -214,13 +230,8 @@ public PortableGridEntry getPortableGrid() { } @Override - public boolean isSmoothScrolling() { - return smoothScrolling.get(); - } - - @Override - public int getMaxRowsStretch() { - return maxRowsStretch.get(); + public SimpleEnergyUsageEntry getSecurityManager() { + return securityManager; } private class SimpleEnergyUsageEntryImpl implements SimpleEnergyUsageEntry { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java index b9cffaf10..fbea17c15 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java @@ -17,10 +17,15 @@ public class BlockModelProviderImpl extends BlockModelProvider { private static final String CUTOUT_TEXTURE = "cutout"; private static final String BLOCK_PREFIX = "block"; + private static final ResourceLocation EMISSIVE_CUTOUT = createIdentifier("block/emissive_cutout"); private static final ResourceLocation EMISSIVE_ALL_CUTOUT = createIdentifier("block/emissive_all_cutout"); private static final ResourceLocation EMISSIVE_NORTH_CUTOUT = createIdentifier("block/emissive_north_cutout"); - private static final ResourceLocation NORTH_CUTOUT = createIdentifier("block/north_cutout"); + + private static final ResourceLocation CUTOUT = createIdentifier("block/cutout"); private static final ResourceLocation ALL_CUTOUT = createIdentifier("block/all_cutout"); + private static final ResourceLocation NORTH_CUTOUT = createIdentifier("block/north_cutout"); + + private static final ResourceLocation BOTTOM_TEXTURE = createIdentifier("block/bottom"); public BlockModelProviderImpl(final PackOutput output, final ExistingFileHelper existingFileHelper) { super(output, MOD_ID, existingFileHelper); @@ -36,6 +41,7 @@ protected void registerModels() { registerWirelessTransmitters(); registerNetworkReceivers(); registerNetworkTransmitters(); + registerSecurityManagers(); } private void registerCables() { @@ -82,7 +88,6 @@ private void registerGrids(final String name, final ResourceLocation back = createIdentifier(BLOCK_PREFIX + "/" + name + "/back"); final ResourceLocation front = createIdentifier(BLOCK_PREFIX + "/" + name + "/front"); final ResourceLocation top = createIdentifier(BLOCK_PREFIX + "/" + name + "/top"); - final ResourceLocation bottom = createIdentifier("block/bottom"); withExistingParent(BLOCK_PREFIX + "/" + name + "/" + variantName, baseModel) .texture(PARTICLE_TEXTURE, right) .texture("north", front) @@ -90,7 +95,7 @@ private void registerGrids(final String name, .texture("south", back) .texture("west", left) .texture("up", top) - .texture("down", bottom) + .texture("down", BOTTOM_TEXTURE) .texture(CUTOUT_TEXTURE, cutout); } @@ -155,4 +160,62 @@ private void registerNetworkTransmitters() { .texture("all", baseTexture) .texture(CUTOUT_TEXTURE, createIdentifier("block/network_transmitter/cutouts/error")); } + + private void registerSecurityManagers() { + final ResourceLocation back = createIdentifier("block/security_manager/back"); + final ResourceLocation front = createIdentifier("block/security_manager/front"); + final ResourceLocation left = createIdentifier("block/security_manager/left"); + final ResourceLocation right = createIdentifier("block/security_manager/right"); + final ResourceLocation top = createIdentifier("block/security_manager/top"); + Blocks.INSTANCE.getNetworkTransmitter().forEach((color, id, receiver) -> { + final ResourceLocation cutoutBack = createIdentifier( + "block/security_manager/cutouts/back/" + color.getName() + ); + final ResourceLocation cutoutFront = createIdentifier( + "block/security_manager/cutouts/front/" + color.getName() + ); + final ResourceLocation cutoutLeft = createIdentifier( + "block/security_manager/cutouts/left/" + color.getName() + ); + final ResourceLocation cutoutRight = createIdentifier( + "block/security_manager/cutouts/right/" + color.getName() + ); + final ResourceLocation cutoutTop = createIdentifier( + "block/security_manager/cutouts/top/" + color.getName() + ); + withExistingParent("block/security_manager/" + color.getName(), EMISSIVE_CUTOUT) + .texture(PARTICLE_TEXTURE, back) + .texture("north", front) + .texture("east", right) + .texture("south", back) + .texture("west", left) + .texture("up", top) + .texture("down", BOTTOM_TEXTURE) + .texture("cutout_north", cutoutFront) + .texture("cutout_east", cutoutRight) + .texture("cutout_south", cutoutBack) + .texture("cutout_west", cutoutLeft) + .texture("cutout_up", cutoutTop) + .texture("cutout_down", BOTTOM_TEXTURE); + }); + final ResourceLocation cutoutBack = createIdentifier("block/security_manager/cutouts/back/inactive"); + final ResourceLocation cutoutFront = createIdentifier("block/security_manager/cutouts/front/inactive"); + final ResourceLocation cutoutLeft = createIdentifier("block/security_manager/cutouts/left/inactive"); + final ResourceLocation cutoutRight = createIdentifier("block/security_manager/cutouts/right/inactive"); + final ResourceLocation cutoutTop = createIdentifier("block/security_manager/cutouts/top/inactive"); + withExistingParent("block/security_manager/inactive", CUTOUT) + .texture(PARTICLE_TEXTURE, back) + .texture("north", front) + .texture("east", right) + .texture("south", back) + .texture("west", left) + .texture("up", top) + .texture("down", BOTTOM_TEXTURE) + .texture("cutout_north", cutoutFront) + .texture("cutout_east", cutoutRight) + .texture("cutout_south", cutoutBack) + .texture("cutout_west", cutoutLeft) + .texture("cutout_up", cutoutTop) + .texture("cutout_down", BOTTOM_TEXTURE); + } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java index 100f823a4..f9ed517ce 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java @@ -9,6 +9,7 @@ import com.refinedmods.refinedstorage2.platform.common.grid.AbstractGridBlock; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkReceiverBlock; import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterBlock; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerBlock; import com.refinedmods.refinedstorage2.platform.common.support.CableBlockSupport; import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirection; import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirectionType; @@ -68,6 +69,7 @@ protected void registerStatesAndModels() { registerConstructorDestructors(Blocks.INSTANCE.getDestructor(), "destructor"); registerNetworkReceivers(); registerNetworkTransmitters(); + registerSecurityManagers(); } private void registerCables() { @@ -301,6 +303,24 @@ private void registerNetworkTransmitters() { }); } + private void registerSecurityManagers() { + final ModelFile inactive = modelFile(createIdentifier("block/security_manager/inactive")); + Blocks.INSTANCE.getSecurityManager().forEach((color, id, block) -> { + final ModelFile active = modelFile(createIdentifier("block/security_manager/" + color.getName())); + final var builder = getVariantBuilder(block.get()); + builder.forAllStates(blockState -> { + final ConfiguredModel.Builder model = ConfiguredModel.builder(); + if (Boolean.TRUE.equals(blockState.getValue(SecurityManagerBlock.ACTIVE))) { + model.modelFile(active); + } else { + model.modelFile(inactive); + } + addRotation(model, blockState.getValue(BiDirectionType.INSTANCE.getProperty())); + return model.build(); + }); + }); + } + private void addRotation(final ConfiguredModel.Builder model, final Direction direction) { final int rotationX; if (direction.getAxis() == Direction.Axis.Y) { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/ItemModelProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/ItemModelProviderImpl.java index 0b0c4cc54..07fc36159 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/ItemModelProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/ItemModelProviderImpl.java @@ -46,6 +46,7 @@ protected void registerModels() { registerWirelessTransmitters(); registerNetworkReceivers(); registerNetworkTransmitters(); + registerSecurityManagers(); } private void registerCables() { @@ -177,6 +178,14 @@ private void registerNetworkTransmitters() { )); } + private void registerSecurityManagers() { + final var blocks = Blocks.INSTANCE.getSecurityManager(); + blocks.forEach((color, id, block) -> withExistingParent( + id.getPath(), + createIdentifier("block/security_manager/" + color.getName()) + )); + } + private ModelFile modelFile(final ResourceLocation location) { return new ModelFile.ExistingModelFile(location, existingFileHelper); } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/BlockDropProvider.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/BlockDropProvider.java index f561592a7..b0a25b484 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/BlockDropProvider.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/BlockDropProvider.java @@ -32,6 +32,7 @@ protected void generate() { Blocks.INSTANCE.getWirelessTransmitter().forEach((color, id, block) -> dropSelf(block.get())); Blocks.INSTANCE.getNetworkReceiver().forEach((color, id, block) -> dropSelf(block.get())); Blocks.INSTANCE.getNetworkTransmitter().forEach((color, id, block) -> dropSelf(block.get())); + Blocks.INSTANCE.getSecurityManager().forEach((color, id, block) -> dropSelf(block.get())); } @Override @@ -48,6 +49,7 @@ protected Iterable getKnownBlocks() { blocks.addAll(Blocks.INSTANCE.getWirelessTransmitter().values()); blocks.addAll(Blocks.INSTANCE.getNetworkReceiver().values()); blocks.addAll(Blocks.INSTANCE.getNetworkTransmitter().values()); + blocks.addAll(Blocks.INSTANCE.getSecurityManager().values()); return blocks; } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/LootTableProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/LootTableProviderImpl.java index b7ad4842d..6db6ee1c8 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/LootTableProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/loot/LootTableProviderImpl.java @@ -5,15 +5,13 @@ import net.minecraft.data.PackOutput; import net.minecraft.data.loot.LootTableProvider; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet; - -import static net.minecraft.world.level.storage.loot.parameters.LootContextParams.EXPLOSION_RADIUS; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; public class LootTableProviderImpl extends LootTableProvider { public LootTableProviderImpl(final PackOutput output) { super(output, Set.of(), List.of(new SubProviderEntry( BlockDropProvider::new, - LootContextParamSet.builder().required(EXPLOSION_RADIUS).build()) - )); + LootContextParamSets.BLOCK + ))); } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/recipe/RecoloringRecipeProvider.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/recipe/RecoloringRecipeProvider.java index 60ca48254..65e8bbb32 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/recipe/RecoloringRecipeProvider.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/recipe/RecoloringRecipeProvider.java @@ -62,6 +62,9 @@ protected void buildRecipes(final RecipeOutput output) { Blocks.INSTANCE.getNetworkTransmitter().forEach((color, id, block) -> recipe(Tags.NETWORK_TRANSMITTERS, block.get().asItem(), color) .save(output, recipeId(color, "network_transmitter"))); + Blocks.INSTANCE.getSecurityManager().forEach((color, id, block) -> + recipe(Tags.SECURITY_MANAGERS, block.get().asItem(), color) + .save(output, recipeId(color, "security_manager"))); } private ResourceLocation recipeId(final DyeColor color, final String suffix) { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java index aec3ad664..d3df12ac6 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java @@ -34,6 +34,7 @@ import static com.refinedmods.refinedstorage2.platform.common.content.Tags.IMPORTERS; import static com.refinedmods.refinedstorage2.platform.common.content.Tags.NETWORK_RECEIVERS; import static com.refinedmods.refinedstorage2.platform.common.content.Tags.NETWORK_TRANSMITTERS; +import static com.refinedmods.refinedstorage2.platform.common.content.Tags.SECURITY_MANAGERS; import static com.refinedmods.refinedstorage2.platform.common.content.Tags.STORAGE_DISKS; import static com.refinedmods.refinedstorage2.platform.common.content.Tags.WIRELESS_TRANSMITTERS; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.MOD_ID; @@ -110,6 +111,10 @@ protected void addTags(final HolderLookup.Provider provider) { Blocks.INSTANCE.getNetworkTransmitter().values().stream() .map(block -> (Supplier) block::asItem) .toList()); + addAllToTag(SECURITY_MANAGERS, + Blocks.INSTANCE.getSecurityManager().values().stream() + .map(block -> (Supplier) block::asItem) + .toList()); } private void addAllToTag(final TagKey t, final Collection> items) { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/recipemod/rei/RefinedStorageREIClientPlugin.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/recipemod/rei/RefinedStorageREIClientPlugin.java index 1e73e5325..37064bfa7 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/recipemod/rei/RefinedStorageREIClientPlugin.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/recipemod/rei/RefinedStorageREIClientPlugin.java @@ -93,6 +93,12 @@ public void registerCollapsibleEntries(final CollapsibleEntryRegistry registry) ContentIds.NETWORK_TRANSMITTER, Tags.NETWORK_TRANSMITTERS ); + groupItems( + registry, + Blocks.INSTANCE.getSecurityManager(), + ContentIds.SECURITY_MANAGER, + Tags.SECURITY_MANAGERS + ); } @Override From 96f67d13c75ac375655a96defba61c6b029e9ea0 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Tue, 2 Apr 2024 11:40:26 +0200 Subject: [PATCH 44/59] feat: security network component logic and security card api --- CHANGELOG.md | 2 +- .../security/SecurityDecisionProvider.java | 9 ++ .../security/SecurityNetworkComponent.java | 5 + .../api/network/security/SecurityPolicy.java | 15 +++ ...urityDecisionProviderProxyNetworkNode.java | 27 ++++ .../impl/node/security/package-info.java | 7 + .../SecurityDecisionProviderImpl.java | 28 ++++ .../SecurityNetworkComponentImpl.java | 24 ++-- .../SecurityNetworkComponentImplTest.java | 105 ++++++++++++--- .../platform/api/PlatformApi.java | 7 + .../platform/api/PlatformApiProxy.java | 13 ++ .../api/security/PlatformPermission.java | 15 +++ .../security/SecurityPolicyContainerItem.java | 31 +++++ .../platform/common/PlatformApiImpl.java | 18 +++ .../AbstractSecurityCardContainerMenu.java | 18 ++- ...tractSecurityCardExtendedMenuProvider.java | 18 ++- .../security/AbstractSecurityCardItem.java | 123 ++++++++++++++---- ...lbackSecurityCardExtendedMenuProvider.java | 12 +- .../security/FallbackSecurityCardItem.java | 28 ++-- .../common/security/PlayerSecurityActor.java | 13 ++ .../security/PlayerSecurityCardModel.java | 53 -------- .../security/SecurityCardContainerMenu.java | 27 ++-- .../SecurityCardExtendedMenuProvider.java | 26 ++-- .../common/security/SecurityCardItem.java | 106 ++++++++++----- .../SecurityCardItemPropertyFunction.java | 2 +- .../common/security/SecurityCardModel.java | 63 --------- .../common/security/SecurityCardScreen.java | 33 +---- .../support/ClientToServerCommunications.java | 3 +- .../assets/refinedstorage2/lang/en_us.json | 3 +- .../c2s/ClientToServerCommunicationsImpl.java | 10 +- .../c2s/SecurityCardBoundPlayerPacket.java | 3 +- .../c2s/ClientToServerCommunicationsImpl.java | 3 +- .../c2s/SecurityCardBoundPlayerPacket.java | 10 +- 33 files changed, 547 insertions(+), 313 deletions(-) create mode 100644 refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityPolicy.java create mode 100644 refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java create mode 100644 refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/package-info.java create mode 100644 refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java create mode 100644 refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java delete mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java delete mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 51890fbfb..865f5c5cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - The Security Card can be bound to other (currently online) players via its GUI. - The binding of a Security Card can now be cleared. - The Security Card tooltip and GUI now show whether the permission has been touched/changed in any way. -- A global (fallback) permission set for a network can be defined using the Fallback Security Card instead of using an "unbound" Security Card. +- A global (fallback) permission set for a network can be defined using the Fallback Security Card (instead of using an "unbound" Security Card). - Smooth scrolling, screen size and max row stretch are no longer Grid-specific settings, but are now global settings. ### Fixed diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java index effdbe7cc..cf1ae3957 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java @@ -5,5 +5,14 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") @FunctionalInterface public interface SecurityDecisionProvider { + /** + * Returns the {@link SecurityDecision} for the given {@link Permission} and {@link SecurityActor}. + * If there is no {@link SecurityPolicy} for the given {@link SecurityActor}, the decision should + * be {@link SecurityDecision#PASS}. + * + * @param permission the permission + * @param actor the actor + * @return the security decision + */ SecurityDecision isAllowed(Permission permission, SecurityActor actor); } diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java index fcda6ad8c..2b518334c 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java @@ -7,5 +7,10 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") @FunctionalInterface public interface SecurityNetworkComponent extends NetworkComponent { + /** + * @param permission the permission + * @param actor the actor + * @return true if the actor is allowed to perform the action, false otherwise + */ boolean isAllowed(Permission permission, SecurityActor actor); } diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityPolicy.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityPolicy.java new file mode 100644 index 000000000..fce560a79 --- /dev/null +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityPolicy.java @@ -0,0 +1,15 @@ +package com.refinedmods.refinedstorage2.api.network.security; + +import java.util.Collections; +import java.util.Set; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public record SecurityPolicy(Set allowedPermissions) { + public static final SecurityPolicy EMPTY = new SecurityPolicy(Collections.emptySet()); + + public boolean isAllowed(final Permission permission) { + return allowedPermissions.contains(permission); + } +} diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java new file mode 100644 index 000000000..8db409f9f --- /dev/null +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java @@ -0,0 +1,27 @@ +package com.refinedmods.refinedstorage2.api.network.impl.node.security; + +import com.refinedmods.refinedstorage2.api.network.impl.storage.AbstractNetworkNode; +import com.refinedmods.refinedstorage2.api.network.security.Permission; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; + +public class SecurityDecisionProviderProxyNetworkNode extends AbstractNetworkNode implements SecurityDecisionProvider { + private final long energyUsage; + private final SecurityDecisionProvider delegate; + + public SecurityDecisionProviderProxyNetworkNode(final long energyUsage, final SecurityDecisionProvider delegate) { + this.energyUsage = energyUsage; + this.delegate = delegate; + } + + @Override + public long getEnergyUsage() { + return energyUsage; + } + + @Override + public SecurityDecision isAllowed(final Permission permission, final SecurityActor actor) { + return delegate.isAllowed(permission, actor); + } +} diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/package-info.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/package-info.java new file mode 100644 index 000000000..777320ebd --- /dev/null +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@FieldsAndMethodsAreNonnullByDefault +package com.refinedmods.refinedstorage2.api.network.impl.node.security; + +import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java new file mode 100644 index 000000000..ae3ee988a --- /dev/null +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java @@ -0,0 +1,28 @@ +package com.refinedmods.refinedstorage2.api.network.impl.security; + +import com.refinedmods.refinedstorage2.api.network.security.Permission; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; + +import java.util.HashMap; +import java.util.Map; + +public class SecurityDecisionProviderImpl implements SecurityDecisionProvider { + private final Map policyByActor = new HashMap<>(); + + public SecurityDecisionProviderImpl setPolicy(final SecurityActor actor, final SecurityPolicy policy) { + policyByActor.put(actor, policy); + return this; + } + + @Override + public SecurityDecision isAllowed(final Permission permission, final SecurityActor actor) { + final SecurityPolicy policy = policyByActor.get(actor); + if (policy == null) { + return SecurityDecision.PASS; + } + return policy.isAllowed(permission) ? SecurityDecision.ALLOW : SecurityDecision.DENY; + } +} diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java index d5f915e16..3a935dacd 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -1,30 +1,35 @@ package com.refinedmods.refinedstorage2.api.network.impl.security; +import com.refinedmods.refinedstorage2.api.core.CoreValidations; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import com.refinedmods.refinedstorage2.api.network.security.Permission; import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; public class SecurityNetworkComponentImpl implements SecurityNetworkComponent { - private final Set providers = new HashSet<>(); + private final Set providers = new LinkedHashSet<>(); + private final SecurityPolicy defaultPolicy; + + public SecurityNetworkComponentImpl(final SecurityPolicy defaultPolicy) { + this.defaultPolicy = defaultPolicy; + } @Override public void onContainerAdded(final NetworkNodeContainer container) { - // TODO: use getNode - if (container instanceof SecurityDecisionProvider provider) { + if (container.getNode() instanceof SecurityDecisionProvider provider) { providers.add(provider); } } @Override public void onContainerRemoved(final NetworkNodeContainer container) { - // TODO: use getNode - if (container instanceof SecurityDecisionProvider provider) { + if (container.getNode() instanceof SecurityDecisionProvider provider) { providers.remove(provider); } } @@ -32,13 +37,16 @@ public void onContainerRemoved(final NetworkNodeContainer container) { @Override public boolean isAllowed(final Permission permission, final SecurityActor actor) { for (final SecurityDecisionProvider provider : providers) { - final SecurityDecision decision = provider.isAllowed(permission, actor); + final SecurityDecision decision = CoreValidations.validateNotNull( + provider.isAllowed(permission, actor), + "Security decision provider must not return null" + ); if (decision == SecurityDecision.DENY) { return false; } else if (decision == SecurityDecision.ALLOW) { return true; } } - return true; + return defaultPolicy.isAllowed(permission); } } diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java index 198fa3115..0cbfe99da 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java @@ -1,12 +1,13 @@ package com.refinedmods.refinedstorage2.api.network.impl.security; +import com.refinedmods.refinedstorage2.api.network.impl.node.security.SecurityDecisionProviderProxyNetworkNode; import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; -import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; import com.refinedmods.refinedstorage2.api.network.security.Permission; import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; -import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; -import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; + +import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -15,38 +16,100 @@ class SecurityNetworkComponentImplTest { SecurityNetworkComponent sut; + SecurityDecisionProviderImpl securityDecisionProvider; @BeforeEach void setUp() { - sut = new SecurityNetworkComponentImpl(); + sut = new SecurityNetworkComponentImpl(policy(TestPermissions.ALLOW_BY_DEFAULT)); + securityDecisionProvider = new SecurityDecisionProviderImpl(); + } + + @Test + void shouldUseDefaultPolicyIfNoSecurityDecisionProvidersArePresent() { + // Act & assert + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + } + + @Test + void shouldUseDefaultPolicyIfANotConfiguredSecurityDecisionProviderIsPresent() { + // Arrange + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + + // Act & assert + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + } + + @Test + void shouldUseDefaultPolicyIfAConfiguredSecurityDecisionProviderIsPresentForAnotherActor() { + // Arrange + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); + + // Act & assert + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); } @Test - void everythingIsAllowedByDefault() { + void shouldDenyPermissionIfAConfiguredSecurityDecisionProviderIsPresentForTheActor() { + // Arrange + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); + // Act & assert - sut.onContainerAdded(new TestContainer()); - assertThat(sut.isAllowed(TestPermissions.A, TestActors.X)).isTrue(); - assertThat(sut.isAllowed(TestPermissions.B, TestActors.Y)).isFalse(); - sut.onContainerRemoved(new TestContainer()); + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isTrue(); + } + + @Test + void shouldUseFirstSecurityDecisionProviderThatIsConfiguredForActor() { + // Arrange + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setPolicy(TestActors.A, policy(TestPermissions.OTHER2)))); + + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + securityDecisionProvider.setPolicy(TestActors.A, policy(TestPermissions.ALLOW_BY_DEFAULT)); // will be ignored + securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); + + // Act & assert + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isTrue(); + + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); + } + + @Test + void shouldRemoveSecurityDecisionProvider() { + // Arrange + final NetworkNode node = new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider); + sut.onContainerAdded(() -> node); + securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); + + // Act + sut.onContainerRemoved(() -> node); + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setPolicy(TestActors.B, policy(TestPermissions.OTHER2)))); + + // Assert + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isTrue(); } enum TestPermissions implements Permission { - A, B + ALLOW_BY_DEFAULT, OTHER, OTHER2 } enum TestActors implements SecurityActor { - X, Y + A, B } - private static class TestContainer implements SecurityDecisionProvider, NetworkNodeContainer { - @Override - public SecurityDecision isAllowed(final Permission permission, final SecurityActor actor) { - return permission == TestPermissions.A ? SecurityDecision.ALLOW : SecurityDecision.DENY; - } - - @Override - public NetworkNode getNode() { - throw new RuntimeException(); - } + private SecurityPolicy policy(final Permission... permissions) { + return new SecurityPolicy(Set.of(permissions)); } } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java index f75dbef1d..36c2fce65 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java @@ -4,6 +4,8 @@ import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.ConstructorStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.DestructorStrategyFactory; @@ -47,6 +49,7 @@ import java.util.Set; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -183,4 +186,8 @@ EnergyStorage asBlockItemEnergyStorage( BuiltinPermissions getBuiltinPermissions(); PlatformRegistry getPermissionRegistry(); + + SecurityPolicy createDefaultSecurityPolicy(); + + SecurityActor createPlayerSecurityActor(ServerPlayer player); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java index 59603d009..f4efc398f 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java @@ -4,6 +4,8 @@ import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.ConstructorStrategyFactory; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.DestructorStrategyFactory; @@ -48,6 +50,7 @@ import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -363,6 +366,16 @@ public PlatformRegistry getPermissionRegistry() { return ensureLoaded().getPermissionRegistry(); } + @Override + public SecurityPolicy createDefaultSecurityPolicy() { + return ensureLoaded().createDefaultSecurityPolicy(); + } + + @Override + public SecurityActor createPlayerSecurityActor(final ServerPlayer player) { + return ensureLoaded().createPlayerSecurityActor(player); + } + private PlatformApi ensureLoaded() { if (delegate == null) { throw new IllegalStateException("Platform API not loaded yet"); diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java index d93d77ef0..1f505b106 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformPermission.java @@ -7,11 +7,26 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") public interface PlatformPermission extends Permission { + /** + * @return the permission name + */ Component getName(); + /** + * @return a short description of the permission + */ Component getDescription(); + /** + * @return the name of the mod that adds this permission + */ Component getOwnerName(); + /** + * Determines whether this permission is allowed by default, when it is not configured (yet) + * in a Security Card. + * + * @return true if this permission is allowed by default, false otherwise + */ boolean isAllowedByDefault(); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java new file mode 100644 index 000000000..1a6aff87e --- /dev/null +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java @@ -0,0 +1,31 @@ +package com.refinedmods.refinedstorage2.platform.api.security; + +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; + +import java.util.Optional; + +import net.minecraft.world.item.ItemStack; +import org.apiguardian.api.API; + +/** + * Represents an item that can contain a {@link SecurityPolicy}. Typically, a Security Card. + */ +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +public interface SecurityPolicyContainerItem { + boolean isValid(ItemStack stack); + + Optional getActor(ItemStack stack); + + /** + * Returns a {@link SecurityPolicy} containing all the permissions that this {@link SecurityPolicyContainerItem} + * permits. + * It is important to have all the relevant permissions in the {@link SecurityPolicy}, + * even the ones that are "allowed by default" via {@link PlatformPermission#isAllowedByDefault()}. + * If not, even a permission that is allowed by default will not be allowed. + * + * @param stack the stack + * @return the policy, if present + */ + Optional getPolicy(ItemStack stack); +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index b0e3a5477..5dabb004e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -7,6 +7,8 @@ import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; import com.refinedmods.refinedstorage2.api.network.impl.NetworkBuilderImpl; import com.refinedmods.refinedstorage2.api.network.impl.NetworkFactory; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.ConstructorStrategyFactory; @@ -54,6 +56,7 @@ import com.refinedmods.refinedstorage2.platform.common.grid.strategy.CompositeGridScrollingStrategy; import com.refinedmods.refinedstorage2.platform.common.recipemod.CompositeIngredientConverter; import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; +import com.refinedmods.refinedstorage2.platform.common.security.PlayerSecurityActor; import com.refinedmods.refinedstorage2.platform.common.storage.ClientStorageRepository; import com.refinedmods.refinedstorage2.platform.common.storage.StorageContainerItemHelperImpl; import com.refinedmods.refinedstorage2.platform.common.storage.StorageRepositoryImpl; @@ -88,11 +91,13 @@ import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; +import java.util.stream.Collectors; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -519,4 +524,17 @@ public BuiltinPermissions getBuiltinPermissions() { public PlatformRegistry getPermissionRegistry() { return permissionRegistry; } + + @Override + public SecurityPolicy createDefaultSecurityPolicy() { + return new SecurityPolicy(permissionRegistry.getAll() + .stream() + .filter(PlatformPermission::isAllowedByDefault) + .collect(Collectors.toSet())); + } + + @Override + public SecurityActor createPlayerSecurityActor(final ServerPlayer player) { + return PlayerSecurityActor.of(player); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java index 9f1507add..a99097ed2 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardContainerMenu.java @@ -65,13 +65,12 @@ public void setPermission(final ResourceLocation permissionId, final boolean all if (disabledSlot == null) { return; } - disabledSlot.resolve(playerInventory.player).ifPresent(stack -> setPermission(permissionId, allowed, stack)); + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> setPermission(stack, permissionId, allowed)); } - private void setPermission(final ResourceLocation permissionId, final boolean allowed, final ItemStack stack) { - if (stack.getItem() instanceof AbstractSecurityCardItem securityCardItem) { - final SecurityCardModel model = securityCardItem.createModel(stack); - model.setPermission(permissionId, allowed); + private void setPermission(final ItemStack stack, final ResourceLocation permissionId, final boolean allowed) { + if (stack.getItem() instanceof AbstractSecurityCardItem securityCardItem) { + securityCardItem.setPermission(stack, permissionId, allowed); } } @@ -79,13 +78,12 @@ public void resetPermission(final ResourceLocation permissionId) { if (disabledSlot == null) { return; } - disabledSlot.resolve(playerInventory.player).ifPresent(stack -> resetPermission(permissionId, stack)); + disabledSlot.resolve(playerInventory.player).ifPresent(stack -> resetPermission(stack, permissionId)); } - private void resetPermission(final ResourceLocation permissionId, final ItemStack stack) { - if (stack.getItem() instanceof AbstractSecurityCardItem securityCardItem) { - final SecurityCardModel model = securityCardItem.createModel(stack); - model.resetPermission(permissionId); + private void resetPermission(final ItemStack stack, final ResourceLocation permissionId) { + if (stack.getItem() instanceof AbstractSecurityCardItem securityCardItem) { + securityCardItem.resetPermission(stack, permissionId); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java index 6b0540a82..92247cfc1 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardExtendedMenuProvider.java @@ -1,11 +1,13 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; import java.util.List; +import java.util.Set; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; @@ -13,24 +15,28 @@ abstract class AbstractSecurityCardExtendedMenuProvider implements ExtendedMenuProvider { private final SlotReference slotReference; - private final SecurityCardModel model; + private final SecurityPolicy securityPolicy; + private final Set dirtyPermissions; - AbstractSecurityCardExtendedMenuProvider(final SlotReference slotReference, final SecurityCardModel model) { + AbstractSecurityCardExtendedMenuProvider(final SlotReference slotReference, + final SecurityPolicy securityPolicy, + final Set dirtyPermissions) { this.slotReference = slotReference; - this.model = model; + this.securityPolicy = securityPolicy; + this.dirtyPermissions = dirtyPermissions; } @Override public void writeScreenOpeningData(final ServerPlayer player, final FriendlyByteBuf buf) { PlatformApi.INSTANCE.writeSlotReference(slotReference, buf); - + final List permissions = PlatformApi.INSTANCE.getPermissionRegistry().getAll(); buf.writeInt(permissions.size()); for (final PlatformPermission permission : permissions) { final ResourceLocation id = PlatformApi.INSTANCE.getPermissionRegistry().getId(permission).orElseThrow(); buf.writeResourceLocation(id); - buf.writeBoolean(model.isAllowed(permission)); - buf.writeBoolean(model.isDirty(permission)); + buf.writeBoolean(securityPolicy.isAllowed(permission)); + buf.writeBoolean(dirtyPermissions.contains(permission)); } } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java index 509c158b1..beef7bf88 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/AbstractSecurityCardItem.java @@ -1,15 +1,26 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.api.network.security.Permission; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; +import com.refinedmods.refinedstorage2.platform.api.security.SecurityPolicyContainerItem; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.common.Platform; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Nullable; import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; @@ -21,7 +32,9 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -abstract class AbstractSecurityCardItem extends Item { +abstract class AbstractSecurityCardItem extends Item implements SecurityPolicyContainerItem { + private static final String TAG_PERMISSIONS = "permissions"; + protected AbstractSecurityCardItem(final Properties properties) { super(properties); } @@ -32,19 +45,16 @@ public void appendHoverText(final ItemStack stack, final List lines, final TooltipFlag flag) { super.appendHoverText(stack, level, lines, flag); - final T model = createModel(stack); - addTooltip(lines, model); - if (model.isActive()) { - addPermissions(lines, model); - } + getPolicy(stack).ifPresent(policy -> appendHoverText(lines, policy, getDirtyPermissions(stack))); } - abstract void addTooltip(List lines, T model); - - private void addPermissions(final List lines, final SecurityCardModel model) { - PlatformApi.INSTANCE.getPermissionRegistry().getAll().forEach(permission -> { - final boolean allowed = model.isAllowed(permission); - final boolean dirty = model.isDirty(permission); + private void appendHoverText(final List lines, + final SecurityPolicy policy, + final Set dirtyPermissions) { + final List allPermissions = PlatformApi.INSTANCE.getPermissionRegistry().getAll(); + allPermissions.forEach(permission -> { + final boolean allowed = policy.isAllowed(permission); + final boolean dirty = dirtyPermissions.contains(permission); final Style style = Style.EMPTY .withColor(allowed ? ChatFormatting.GREEN : ChatFormatting.RED) .withItalic(dirty); @@ -60,32 +70,89 @@ private void addPermissions(final List lines, final SecurityCardModel public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { final ItemStack stack = player.getItemInHand(hand); if (player instanceof ServerPlayer serverPlayer) { - final T model = createModel(stack); - use(hand, serverPlayer, model); + doUse(hand, serverPlayer, stack); } return InteractionResultHolder.consume(stack); } - private void use(final InteractionHand hand, final ServerPlayer player, final T model) { + private void doUse(final InteractionHand hand, final ServerPlayer player, final ItemStack stack) { if (player.isCrouching()) { - tryClear(player, model); + clearConfiguration(player, stack); return; } - Platform.INSTANCE.getMenuOpener().openMenu(player, createMenuProvider( - PlatformApi.INSTANCE.createInventorySlotReference(player, hand), - model - )); + getPolicy(stack).ifPresent(policy -> { + final Set dirtyPermissions = getDirtyPermissions(stack); + Platform.INSTANCE.getMenuOpener().openMenu(player, createMenuProvider( + PlatformApi.INSTANCE.createInventorySlotReference(player, hand), + policy, + dirtyPermissions, + stack + )); + }); } - void tryClear(final ServerPlayer player, final T model) { - model.clear(); - player.sendSystemMessage(createTranslation("item", "security_card.cleared")); + private void clearConfiguration(final ServerPlayer player, final ItemStack stack) { + stack.setTag(null); + player.sendSystemMessage(createTranslation("item", "security_card.cleared_configuration")); } - abstract T createModel(ItemStack stack); + abstract AbstractSecurityCardExtendedMenuProvider createMenuProvider(SlotReference slotReference, + SecurityPolicy policy, + Set dirtyPermissions, + ItemStack stack); - abstract AbstractSecurityCardExtendedMenuProvider createMenuProvider( - SlotReference slotReference, - T model - ); + @Override + public Optional getPolicy(final ItemStack stack) { + if (!isValid(stack)) { + return Optional.empty(); + } + if (stack.getTag() == null || !stack.getTag().contains(TAG_PERMISSIONS)) { + return Optional.of(PlatformApi.INSTANCE.createDefaultSecurityPolicy()); + } + final CompoundTag permissionsTag = stack.getTag().getCompound(TAG_PERMISSIONS); + return Optional.of(createPolicy(permissionsTag)); + } + + private SecurityPolicy createPolicy(final CompoundTag permissionsTag) { + final Set allowedPermissions = new HashSet<>(); + for (final PlatformPermission permission : PlatformApi.INSTANCE.getPermissionRegistry().getAll()) { + final ResourceLocation permissionId = PlatformApi.INSTANCE.getPermissionRegistry() + .getId(permission) + .orElseThrow(); + final boolean dirty = permissionsTag.contains(permissionId.toString()); + final boolean didExplicitlyAllow = dirty && permissionsTag.getBoolean(permissionId.toString()); + final boolean isAllowedByDefault = !dirty && permission.isAllowedByDefault(); + if (didExplicitlyAllow || isAllowedByDefault) { + allowedPermissions.add(permission); + } + } + return new SecurityPolicy(allowedPermissions); + } + + @Override + public boolean isValid(final ItemStack stack) { + return true; + } + + Set getDirtyPermissions(final ItemStack stack) { + if (stack.getTag() == null || !stack.getTag().contains(TAG_PERMISSIONS)) { + return Collections.emptySet(); + } + final CompoundTag permissionsTag = stack.getTag().getCompound(TAG_PERMISSIONS); + return permissionsTag.getAllKeys() + .stream() + .map(ResourceLocation::new) + .flatMap(id -> PlatformApi.INSTANCE.getPermissionRegistry().get(id).stream()) + .collect(Collectors.toSet()); + } + + void setPermission(final ItemStack stack, final ResourceLocation permissionId, final boolean allowed) { + final CompoundTag permissionsTag = stack.getOrCreateTagElement(TAG_PERMISSIONS); + permissionsTag.putBoolean(permissionId.toString(), allowed); + } + + void resetPermission(final ItemStack stack, final ResourceLocation permissionId) { + final CompoundTag permissionsTag = stack.getOrCreateTagElement(TAG_PERMISSIONS); + permissionsTag.remove(permissionId.toString()); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java index f631beb08..4d7914689 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardExtendedMenuProvider.java @@ -1,8 +1,11 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; +import java.util.Set; import javax.annotation.Nullable; import net.minecraft.network.chat.Component; @@ -13,9 +16,12 @@ class FallbackSecurityCardExtendedMenuProvider extends AbstractSecurityCardExtendedMenuProvider { private final SlotReference slotReference; - FallbackSecurityCardExtendedMenuProvider(final SlotReference slotReference, final SecurityCardModel model) { - super(slotReference, model); - this.slotReference = slotReference; + FallbackSecurityCardExtendedMenuProvider(final SlotReference slotReference, + final SecurityPolicy securityPolicy, + final Set dirtyPermissions, + final SlotReference slotReference1) { + super(slotReference, securityPolicy, dirtyPermissions); + this.slotReference = slotReference1; } @Override diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java index 4bdd4a680..cb7f3771a 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java @@ -1,10 +1,13 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; -import java.util.List; import java.util.Optional; +import java.util.Set; import net.minecraft.network.chat.Component; import net.minecraft.world.inventory.tooltip.TooltipComponent; @@ -13,31 +16,28 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -public class FallbackSecurityCardItem extends AbstractSecurityCardItem { +public class FallbackSecurityCardItem extends AbstractSecurityCardItem { private static final Component HELP = createTranslation("item", "fallback_security_card.help"); public FallbackSecurityCardItem() { super(new Item.Properties().stacksTo(1)); } - @Override - void addTooltip(final List lines, final SecurityCardModel model) { - // no op - } - - @Override - SecurityCardModel createModel(final ItemStack stack) { - return new SecurityCardModel(stack); - } - @Override AbstractSecurityCardExtendedMenuProvider createMenuProvider(final SlotReference slotReference, - final SecurityCardModel model) { - return new FallbackSecurityCardExtendedMenuProvider(slotReference, model); + final SecurityPolicy policy, + final Set dirtyPermissions, + final ItemStack stack) { + return new FallbackSecurityCardExtendedMenuProvider(slotReference, policy, dirtyPermissions, slotReference); } @Override public Optional getTooltipImage(final ItemStack stack) { return Optional.of(new HelpTooltipComponent(HELP)); } + + @Override + public Optional getActor(final ItemStack stack) { + return Optional.empty(); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java new file mode 100644 index 000000000..6afe9c920 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java @@ -0,0 +1,13 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; + +import java.util.UUID; + +import net.minecraft.server.level.ServerPlayer; + +public record PlayerSecurityActor(UUID playerId) implements SecurityActor { + public static PlayerSecurityActor of(final ServerPlayer player) { + return new PlayerSecurityActor(player.getGameProfile().getId()); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java deleted file mode 100644 index 606b3ab7b..000000000 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityCardModel.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.refinedmods.refinedstorage2.platform.common.security; - -import java.util.UUID; -import javax.annotation.Nullable; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; - -class PlayerSecurityCardModel extends SecurityCardModel { - private static final String TAG_BOUND_PLAYER_ID = "bid"; - private static final String TAG_BOUND_PLAYER_NAME = "bname"; - - PlayerSecurityCardModel(final ItemStack stack) { - super(stack); - } - - @Nullable - UUID getBoundPlayerId() { - return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_ID)) - ? null - : stack.getTag().getUUID(TAG_BOUND_PLAYER_ID); - } - - @Nullable - String getBoundPlayerName() { - return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_NAME)) - ? null - : stack.getTag().getString(TAG_BOUND_PLAYER_NAME); - } - - void setBoundPlayer(@Nullable final ServerPlayer player) { - final CompoundTag tag = stack.getOrCreateTag(); - if (player == null) { - tag.remove(TAG_BOUND_PLAYER_ID); - tag.remove(TAG_BOUND_PLAYER_NAME); - return; - } - tag.putUUID(TAG_BOUND_PLAYER_ID, player.getGameProfile().getId()); - tag.putString(TAG_BOUND_PLAYER_NAME, player.getGameProfile().getName()); - } - - @Override - boolean isActive() { - return isActive(stack); - } - - static boolean isActive(final ItemStack stack) { - return stack.getTag() != null - && stack.getTag().contains(TAG_BOUND_PLAYER_ID) - && stack.getTag().contains(TAG_BOUND_PLAYER_NAME); - } -} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java index 9e5177c04..6118bc260 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardContainerMenu.java @@ -8,7 +8,6 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.MinecraftServer; @@ -18,17 +17,13 @@ public class SecurityCardContainerMenu extends AbstractSecurityCardContainerMenu implements ScreenSizeListener { private final List players = new ArrayList<>(); - - @Nullable private Player boundTo; public SecurityCardContainerMenu(final int syncId, final Inventory playerInventory, final FriendlyByteBuf buf) { super(Menus.INSTANCE.getSecurityCard(), syncId, playerInventory, buf); - if (buf.readBoolean()) { - this.boundTo = new Player(buf.readUUID(), buf.readUtf()); - } + this.boundTo = new Player(buf.readUUID(), buf.readUtf()); final int amountOfPlayers = buf.readInt(); for (int i = 0; i < amountOfPlayers; ++i) { final UUID id = buf.readUUID(); @@ -39,36 +34,36 @@ public SecurityCardContainerMenu(final int syncId, SecurityCardContainerMenu(final int syncId, final Inventory playerInventory, final SlotReference disabledSlot) { super(Menus.INSTANCE.getSecurityCard(), syncId, playerInventory, disabledSlot); + this.boundTo = new Player(UUID.randomUUID(), ""); } List getPlayers() { return players; } - @Nullable Player getBoundTo() { return boundTo; } - public void setBoundPlayer(final MinecraftServer server, @Nullable final UUID playerId) { + public void setBoundPlayer(final MinecraftServer server, final UUID playerId) { if (disabledSlot == null) { return; } disabledSlot.resolve(playerInventory.player).ifPresent(stack -> setBoundPlayer(server, playerId, stack)); } - private void setBoundPlayer(final MinecraftServer server, @Nullable final UUID playerId, final ItemStack stack) { + private void setBoundPlayer(final MinecraftServer server, final UUID playerId, final ItemStack stack) { if (stack.getItem() instanceof SecurityCardItem securityCardItem) { - final ServerPlayer player = playerId == null ? null : server.getPlayerList().getPlayer(playerId); - final PlayerSecurityCardModel model = securityCardItem.createModel(stack); - model.setBoundPlayer(player); + final ServerPlayer player = server.getPlayerList().getPlayer(playerId); + if (player == null) { + return; + } + securityCardItem.setBoundPlayer(player, stack); } } - void changeBoundPlayer(@Nullable final Player player) { - Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardBoundPlayer( - player == null ? null : player.id() - ); + void changeBoundPlayer(final Player player) { + Platform.INSTANCE.getClientToServerCommunications().sendSecurityCardBoundPlayer(player.id()); this.boundTo = player; } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java index 2c60c85b1..4f5cbc6c2 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardExtendedMenuProvider.java @@ -1,10 +1,14 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.UUID; import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; @@ -16,24 +20,26 @@ class SecurityCardExtendedMenuProvider extends AbstractSecurityCardExtendedMenuProvider { private final SlotReference slotReference; - private final PlayerSecurityCardModel playerModel; + private final UUID boundPlayerId; + private final String boundPlayerName; - SecurityCardExtendedMenuProvider(final SlotReference slotReference, final PlayerSecurityCardModel model) { - super(slotReference, model); + SecurityCardExtendedMenuProvider(final SlotReference slotReference, + final SecurityPolicy securityPolicy, + final Set dirtyPermissions, + final UUID boundPlayerId, + final String boundPlayerName) { + super(slotReference, securityPolicy, dirtyPermissions); this.slotReference = slotReference; - this.playerModel = model; + this.boundPlayerId = boundPlayerId; + this.boundPlayerName = boundPlayerName; } @Override public void writeScreenOpeningData(final ServerPlayer player, final FriendlyByteBuf buf) { super.writeScreenOpeningData(player, buf); - final boolean bound = playerModel.getBoundPlayerId() != null && playerModel.getBoundPlayerName() != null; - buf.writeBoolean(bound); - if (bound) { - buf.writeUUID(playerModel.getBoundPlayerId()); - buf.writeUtf(playerModel.getBoundPlayerName()); - } + buf.writeUUID(boundPlayerId); + buf.writeUtf(boundPlayerName); final List players = player.getServer() == null ? Collections.emptyList() diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java index 3347e5c5a..5d568feae 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java @@ -1,21 +1,37 @@ package com.refinedmods.refinedstorage2.platform.common.security; +import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import javax.annotation.Nullable; import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; +import static java.util.Objects.requireNonNull; + +public class SecurityCardItem extends AbstractSecurityCardItem { + private static final String TAG_BOUND_PLAYER_ID = "bid"; + private static final String TAG_BOUND_PLAYER_NAME = "bname"; -public class SecurityCardItem extends AbstractSecurityCardItem { private static final Component UNBOUND_HELP = createTranslation("item", "security_card.unbound.help"); private static final Component BOUND_HELP = createTranslation("item", "security_card.bound.help"); @@ -24,54 +40,84 @@ public SecurityCardItem() { } @Override - void addTooltip(final List lines, final PlayerSecurityCardModel model) { - final String boundPlayerName = model.getBoundPlayerName(); + public void appendHoverText(final ItemStack stack, + @Nullable final Level level, + final List lines, + final TooltipFlag flag) { + final String boundPlayerName = getBoundPlayerName(stack); if (boundPlayerName == null) { lines.add(createTranslation("item", "security_card.unbound").withStyle(ChatFormatting.GRAY)); - return; + } else { + lines.add(createTranslation( + "item", + "security_card.bound", + Component.literal(boundPlayerName).withStyle(ChatFormatting.YELLOW) + ).withStyle(ChatFormatting.GRAY)); } - lines.add(createTranslation( - "item", - "security_card.bound", - Component.literal(boundPlayerName).withStyle(ChatFormatting.YELLOW) - ).withStyle(ChatFormatting.GRAY)); + super.appendHoverText(stack, level, lines, flag); } @Override - void tryClear(final ServerPlayer player, final PlayerSecurityCardModel model) { - if (model.isCleared()) { - bind(player, model); - return; + public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { + final ItemStack stack = player.getItemInHand(hand); + if (player instanceof ServerPlayer serverPlayer && !stack.hasTag()) { + setBoundPlayer(serverPlayer, stack); } - super.tryClear(player, model); + return super.use(level, player, hand); } - private void bind(final ServerPlayer player, final PlayerSecurityCardModel model) { - model.setBoundPlayer(player); - player.sendSystemMessage(createTranslation( - "item", - "security_card.bound", - Component.literal(player.getGameProfile().getName()).withStyle(ChatFormatting.YELLOW) - )); + @Override + public Optional getTooltipImage(final ItemStack stack) { + return Optional.of(new HelpTooltipComponent(isValid(stack) ? BOUND_HELP : UNBOUND_HELP)); } @Override - public Optional getTooltipImage(final ItemStack stack) { - return Optional.of(new HelpTooltipComponent(isActive(stack) ? BOUND_HELP : UNBOUND_HELP)); + AbstractSecurityCardExtendedMenuProvider createMenuProvider(final SlotReference slotReference, + final SecurityPolicy policy, + final Set dirtyPermissions, + final ItemStack stack) { + return new SecurityCardExtendedMenuProvider( + slotReference, + policy, + dirtyPermissions, + requireNonNull(getBoundPlayerId(stack)), + requireNonNull(getBoundPlayerName(stack)) + ); } @Override - PlayerSecurityCardModel createModel(final ItemStack stack) { - return new PlayerSecurityCardModel(stack); + public boolean isValid(final ItemStack stack) { + return stack.getTag() != null + && stack.getTag().contains(TAG_BOUND_PLAYER_ID) + && stack.getTag().contains(TAG_BOUND_PLAYER_NAME); } @Override - AbstractSecurityCardExtendedMenuProvider createMenuProvider(final SlotReference slotReference, - final PlayerSecurityCardModel model) { - return new SecurityCardExtendedMenuProvider(slotReference, model); + public Optional getActor(final ItemStack stack) { + final UUID playerId = getBoundPlayerId(stack); + if (playerId == null) { + return Optional.empty(); + } + return Optional.of(new PlayerSecurityActor(playerId)); + } + + @Nullable + UUID getBoundPlayerId(final ItemStack stack) { + return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_ID)) + ? null + : stack.getTag().getUUID(TAG_BOUND_PLAYER_ID); + } + + @Nullable + String getBoundPlayerName(final ItemStack stack) { + return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_NAME)) + ? null + : stack.getTag().getString(TAG_BOUND_PLAYER_NAME); } - boolean isActive(final ItemStack stack) { - return PlayerSecurityCardModel.isActive(stack); + void setBoundPlayer(final ServerPlayer player, final ItemStack stack) { + final CompoundTag tag = stack.getOrCreateTag(); + tag.putUUID(TAG_BOUND_PLAYER_ID, player.getGameProfile().getId()); + tag.putString(TAG_BOUND_PLAYER_NAME, player.getGameProfile().getName()); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java index 1d36f5a53..1583c2f80 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItemPropertyFunction.java @@ -17,7 +17,7 @@ public float unclampedCall(final ItemStack itemStack, @Nullable final LivingEntity livingEntity, final int i) { if (itemStack.getItem() instanceof SecurityCardItem cardItem) { - return cardItem.isActive(itemStack) ? 1 : 0; + return cardItem.isValid(itemStack) ? 1 : 0; } return 0; } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java deleted file mode 100644 index 37d24223d..000000000 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardModel.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.refinedmods.refinedstorage2.platform.common.security; - -import com.refinedmods.refinedstorage2.platform.api.PlatformApi; -import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; - -class SecurityCardModel { - private static final String TAG_PERMISSIONS = "permissions"; - - protected final ItemStack stack; - - SecurityCardModel(final ItemStack stack) { - this.stack = stack; - } - - boolean isAllowed(final PlatformPermission permission) { - if (stack.getTag() != null && stack.getTag().contains(TAG_PERMISSIONS)) { - final ResourceLocation permissionId = PlatformApi.INSTANCE.getPermissionRegistry() - .getId(permission) - .orElseThrow(); - final CompoundTag permissionsTag = stack.getTag().getCompound(TAG_PERMISSIONS); - final boolean dirty = permissionsTag.contains(permissionId.toString()); - if (dirty) { - return permissionsTag.getBoolean(permissionId.toString()); - } - } - return permission.isAllowedByDefault(); - } - - boolean isDirty(final PlatformPermission permission) { - final ResourceLocation permissionId = PlatformApi.INSTANCE.getPermissionRegistry() - .getId(permission) - .orElseThrow(); - return stack.getTag() != null - && stack.getTag().contains(TAG_PERMISSIONS) - && stack.getTag().getCompound(TAG_PERMISSIONS).contains(permissionId.toString()); - } - - void setPermission(final ResourceLocation permissionId, final boolean allowed) { - final CompoundTag permissionsTag = stack.getOrCreateTagElement(TAG_PERMISSIONS); - permissionsTag.putBoolean(permissionId.toString(), allowed); - } - - void resetPermission(final ResourceLocation permissionId) { - final CompoundTag permissionsTag = stack.getOrCreateTagElement(TAG_PERMISSIONS); - permissionsTag.remove(permissionId.toString()); - } - - boolean isActive() { - return true; - } - - boolean isCleared() { - return stack.getTag() == null; - } - - public void clear() { - stack.setTag(null); - } -} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java index a0b900925..c44596498 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardScreen.java @@ -1,20 +1,12 @@ package com.refinedmods.refinedstorage2.platform.common.security; -import javax.annotation.Nullable; - import net.minecraft.client.gui.components.Button; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.entity.player.Inventory; -import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; - public class SecurityCardScreen extends AbstractSecurityCardScreen { private static final int BOUND_PLAYER_BUTTON_RIGHT_PADDING = 6; private static final int BOUND_PLAYER_BUTTON_WIDTH = 80; - private static final MutableComponent UNBOUND_TITLE = Component.literal("<") - .append(createTranslation("gui", "security_card.unbound")) - .append(">"); public SecurityCardScreen(final SecurityCardContainerMenu menu, final Inventory playerInventory, @@ -25,9 +17,7 @@ public SecurityCardScreen(final SecurityCardContainerMenu menu, @Override protected void init(final int rows) { super.init(rows); - final Component boundToText = menu.getBoundTo() == null - ? UNBOUND_TITLE - : Component.literal(menu.getBoundTo().name()); + final Component boundToText = Component.literal(menu.getBoundTo().name()); final Button boundPlayerButton = Button.builder(boundToText, this::toggleBoundPlayer) .pos(leftPos + imageWidth - BOUND_PLAYER_BUTTON_RIGHT_PADDING - BOUND_PLAYER_BUTTON_WIDTH, topPos + 4) .size(BOUND_PLAYER_BUTTON_WIDTH, 14) @@ -39,20 +29,11 @@ private void toggleBoundPlayer(final Button button) { if (menu.getPlayers().isEmpty()) { return; } - if (menu.getBoundTo() == null) { - setBoundPlayer(button, menu.getPlayers().get(0)); - return; - } - final int nextIndex = menu.getPlayers().indexOf(menu.getBoundTo()) + 1; - if (nextIndex >= menu.getPlayers().size()) { - setBoundPlayer(button, null); - } else { - setBoundPlayer(button, menu.getPlayers().get(nextIndex)); - } - } - - private void setBoundPlayer(final Button button, @Nullable final SecurityCardContainerMenu.Player player) { - menu.changeBoundPlayer(player); - button.setMessage(player == null ? UNBOUND_TITLE : Component.literal(player.name())); + final SecurityCardContainerMenu.Player currentPlayer = menu.getBoundTo(); + final int index = menu.getPlayers().indexOf(currentPlayer); + final int nextIndex = (index + 1) % menu.getPlayers().size(); + final SecurityCardContainerMenu.Player nextPlayer = menu.getPlayers().get(nextIndex); + menu.changeBoundPlayer(nextPlayer); + button.setMessage(Component.literal(nextPlayer.name())); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java index fd6489b7e..52a867812 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ClientToServerCommunications.java @@ -11,7 +11,6 @@ import java.util.List; import java.util.UUID; -import javax.annotation.Nullable; public interface ClientToServerCommunications { void sendGridExtract(PlatformResourceKey resource, GridExtractMode mode, boolean cursor); @@ -42,5 +41,5 @@ public interface ClientToServerCommunications { void sendSecurityCardResetPermission(PlatformPermission permission); - void sendSecurityCardBoundPlayer(@Nullable UUID playerId); + void sendSecurityCardBoundPlayer(UUID playerId); } diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 55292d942..99c616827 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -144,7 +144,6 @@ "gui.refinedstorage2.network_transmitter.status.missing_network_card": "Missing Network Card", "gui.refinedstorage2.network_transmitter.status.transmitting": "%d block(s)", "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", - "gui.refinedstorage2.security_card.unbound": "Unbound", "gui.refinedstorage2.security_card.permission.reset": "Reset", "gui.refinedstorage2.security_card.permission.modified": "Modified", "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", @@ -225,7 +224,7 @@ "item.refinedstorage2.network_card.bound_help": "Insert into a Network Transmitter. Use while crouching to clear binding.", "item.refinedstorage2.network_card.bound": "Bound to %d, %d, %d in %s.", "item.refinedstorage2.security_card": "Security Card", - "item.refinedstorage2.security_card.cleared": "Cleared binding.", + "item.refinedstorage2.security_card.cleared_configuration": "Cleared configuration.", "item.refinedstorage2.security_card.unbound": "Unbound.", "item.refinedstorage2.security_card.unbound.help": "Right click to configure. Use while crouching to bind to the current player.", "item.refinedstorage2.security_card.bound": "Bound to %s.", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java index 3ba6c6123..3d164f3f7 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/ClientToServerCommunicationsImpl.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.UUID; import java.util.function.Consumer; -import javax.annotation.Nullable; import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; @@ -151,13 +150,8 @@ public void sendSecurityCardResetPermission(final PlatformPermission permission) } @Override - public void sendSecurityCardBoundPlayer(@Nullable final UUID playerId) { - sendToServer(PacketIds.SECURITY_CARD_BOUND_PLAYER, buf -> { - buf.writeBoolean(playerId != null); - if (playerId != null) { - buf.writeUUID(playerId); - } - }); + public void sendSecurityCardBoundPlayer(final UUID playerId) { + sendToServer(PacketIds.SECURITY_CARD_BOUND_PLAYER, buf -> buf.writeUUID(playerId)); } private static void sendToServer(final ResourceLocation id, final Consumer bufConsumer) { diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java index ccca1783c..42540536c 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/c2s/SecurityCardBoundPlayerPacket.java @@ -18,8 +18,7 @@ public void receive(final MinecraftServer server, final ServerGamePacketListenerImpl handler, final FriendlyByteBuf buf, final PacketSender responseSender) { - final boolean hasPlayer = buf.readBoolean(); - final UUID playerId = hasPlayer ? buf.readUUID() : null; + final UUID playerId = buf.readUUID(); if (player.containerMenu instanceof SecurityCardContainerMenu securityCardContainerMenu) { server.execute(() -> securityCardContainerMenu.setBoundPlayer(server, playerId)); } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java index 35b2f8b7c..d5944e233 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/ClientToServerCommunicationsImpl.java @@ -14,7 +14,6 @@ import java.util.List; import java.util.UUID; -import javax.annotation.Nullable; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.neoforged.neoforge.network.PacketDistributor; @@ -112,7 +111,7 @@ public void sendSecurityCardResetPermission(final PlatformPermission permission) } @Override - public void sendSecurityCardBoundPlayer(@Nullable final UUID playerId) { + public void sendSecurityCardBoundPlayer(final UUID playerId) { sendToServer(new SecurityCardBoundPlayerPacket(playerId)); } } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java index 465576003..686cec4c5 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/c2s/SecurityCardBoundPlayerPacket.java @@ -4,16 +4,15 @@ import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; import java.util.UUID; -import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.network.handling.PlayPayloadContext; -public record SecurityCardBoundPlayerPacket(@Nullable UUID playerId) implements CustomPacketPayload { +public record SecurityCardBoundPlayerPacket(UUID playerId) implements CustomPacketPayload { public static SecurityCardBoundPlayerPacket decode(final FriendlyByteBuf buf) { - return new SecurityCardBoundPlayerPacket(buf.readBoolean() ? buf.readUUID() : null); + return new SecurityCardBoundPlayerPacket(buf.readUUID()); } public static void handle(final SecurityCardBoundPlayerPacket packet, final PlayPayloadContext ctx) { @@ -29,10 +28,7 @@ public static void handle(final SecurityCardBoundPlayerPacket packet, final Play @Override public void write(final FriendlyByteBuf buf) { - buf.writeBoolean(playerId != null); - if (playerId != null) { - buf.writeUUID(playerId); - } + buf.writeUUID(playerId); } @Override From 8f18bd56cbc4a22f081231b81bc3a2a6acc440f7 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Tue, 2 Apr 2024 17:43:01 +0200 Subject: [PATCH 45/59] feat: security manager screen --- .../common/AbstractClientModInitializer.java | 2 + .../common/AbstractModInitializer.java | 5 + .../platform/common/content/Menus.java | 11 ++ .../security/SecurityManagerBlockEntity.java | 104 +++++++++++++++++- .../SecurityManagerContainerMenu.java | 72 ++++++++++++ .../security/SecurityManagerScreen.java | 61 ++++++++++ .../assets/refinedstorage2/lang/en_us.json | 3 + .../textures/gui/security_manager.png | Bin 0 -> 1088 bytes 8 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerScreen.java create mode 100644 refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_manager.png diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java index b708c7a0b..8530d48e2 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractClientModInitializer.java @@ -20,6 +20,7 @@ import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterScreen; import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardScreen; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardScreen; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerScreen; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.DiskDriveScreen; @@ -79,6 +80,7 @@ protected static void registerScreens(final ScreenRegistration registration) { registration.register(Menus.INSTANCE.getPortableGridItem(), PortableGridScreen::new); registration.register(Menus.INSTANCE.getSecurityCard(), SecurityCardScreen::new); registration.register(Menus.INSTANCE.getFallbackSecurityCard(), FallbackSecurityCardScreen::new); + registration.register(Menus.INSTANCE.getSecurityManager(), SecurityManagerScreen::new); } protected static void registerAlternativeGridHints() { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index ddde33609..ec59e5ae6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -58,6 +58,7 @@ import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerBlockEntity; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.StorageTypes; @@ -726,6 +727,10 @@ protected final void registerMenus(final RegistryCallback> callback, FALLBACK_SECURITY_CARD, () -> menuTypeFactory.create(FallbackSecurityCardContainerMenu::new) )); + Menus.INSTANCE.setSecurityManager(callback.register( + SECURITY_MANAGER, + () -> menuTypeFactory.create(SecurityManagerContainerMenu::new) + )); } protected final void registerLootFunctions(final RegistryCallback callback) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java index 45433d8f0..197b59973 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Menus.java @@ -13,6 +13,7 @@ import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.diskdrive.DiskDriveContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.externalstorage.ExternalStorageContainerMenu; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockContainerMenu; @@ -77,6 +78,8 @@ public final class Menus { private Supplier> securityCard; @Nullable private Supplier> fallbackSecurityCard; + @Nullable + private Supplier> securityManager; private Menus() { } @@ -258,4 +261,12 @@ public void setFallbackSecurityCard( ) { this.fallbackSecurityCard = fallbackSecurityCard; } + + public MenuType getSecurityManager() { + return requireNonNull(securityManager).get(); + } + + public void setSecurityManager(final Supplier> securityManager) { + this.securityManager = securityManager; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java index f477aea81..87be3a0e8 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -1,14 +1,52 @@ package com.refinedmods.refinedstorage2.platform.common.security; import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage2.platform.api.security.SecurityPolicyContainerItem; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; +import com.refinedmods.refinedstorage2.platform.common.support.BlockEntityWithDrops; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; +import com.refinedmods.refinedstorage2.platform.common.util.ContainerUtil; + +import javax.annotation.Nullable; import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -public class SecurityManagerBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity { +public class SecurityManagerBlockEntity + extends AbstractRedstoneModeNetworkNodeContainerBlockEntity + implements BlockEntityWithDrops, ExtendedMenuProvider { + static final int CARD_AMOUNT = 18; + + private static final String TAG_SECURITY_CARDS = "sc"; + private static final String TAG_FALLBACK_SECURITY_CARD = "fsc"; + + private final SimpleContainer securityCards = new SimpleContainer(CARD_AMOUNT) { + @Override + public boolean canPlaceItem(final int slot, final ItemStack stack) { + return isValidSecurityCard(stack); + } + }; + + private final SimpleContainer fallbackSecurityCard = new SimpleContainer(1) { + @Override + public boolean canPlaceItem(final int slot, final ItemStack stack) { + return isValidFallbackSecurityCard(stack); + } + }; + public SecurityManagerBlockEntity(final BlockPos pos, final BlockState state) { super( BlockEntities.INSTANCE.getSecurityManager(), @@ -16,5 +54,69 @@ public SecurityManagerBlockEntity(final BlockPos pos, final BlockState state) { state, new SimpleNetworkNode(Platform.INSTANCE.getConfig().getSecurityManager().getEnergyUsage()) ); + securityCards.addListener(c -> setChanged()); + fallbackSecurityCard.addListener(c -> setChanged()); + } + + @Override + public void load(final CompoundTag tag) { + if (tag.contains(TAG_SECURITY_CARDS)) { + ContainerUtil.read(tag.getCompound(TAG_SECURITY_CARDS), securityCards); + } + if (tag.contains(TAG_FALLBACK_SECURITY_CARD)) { + ContainerUtil.read(tag.getCompound(TAG_FALLBACK_SECURITY_CARD), fallbackSecurityCard); + } + super.load(tag); + } + + @Override + public void saveAdditional(final CompoundTag tag) { + super.saveAdditional(tag); + tag.put(TAG_SECURITY_CARDS, ContainerUtil.write(securityCards)); + tag.put(TAG_FALLBACK_SECURITY_CARD, ContainerUtil.write(fallbackSecurityCard)); + } + + @Override + public NonNullList getDrops() { + final NonNullList drops = NonNullList.create(); + for (int i = 0; i < securityCards.getContainerSize(); ++i) { + drops.add(securityCards.getItem(i)); + } + drops.add(fallbackSecurityCard.getItem(0)); + return drops; + } + + SimpleContainer getSecurityCards() { + return securityCards; + } + + SimpleContainer getFallbackSecurityCard() { + return fallbackSecurityCard; + } + + static boolean isValidSecurityCard(final ItemStack stack) { + return stack.getItem() instanceof SecurityPolicyContainerItem securityPolicyContainerItem + && securityPolicyContainerItem.isValid(stack) + && !(stack.getItem() instanceof FallbackSecurityCardItem); + } + + static boolean isValidFallbackSecurityCard(final ItemStack stack) { + return stack.getItem() instanceof FallbackSecurityCardItem; + } + + @Override + public void writeScreenOpeningData(final ServerPlayer player, final FriendlyByteBuf buf) { + // no op + } + + @Override + public Component getDisplayName() { + return ContentNames.SECURITY_MANAGER; + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(final int syncId, final Inventory inventory, final Player player) { + return new SecurityManagerContainerMenu(syncId, inventory, this); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java new file mode 100644 index 000000000..6fb7bf048 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java @@ -0,0 +1,72 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.common.content.Menus; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.RedstoneMode; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ClientProperty; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.PropertyTypes; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ServerProperty; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ValidatedSlot; + +import javax.annotation.Nullable; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; + +import static com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerBlockEntity.CARD_AMOUNT; + +public class SecurityManagerContainerMenu extends AbstractBaseContainerMenu { + @Nullable + private Slot fallbackSecurityCardSlot; + + public SecurityManagerContainerMenu(final int syncId, + final Inventory playerInventory, + final FriendlyByteBuf buf) { + super(Menus.INSTANCE.getSecurityManager(), syncId); + addSlots(playerInventory, new SimpleContainer(CARD_AMOUNT), new SimpleContainer(1)); + registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); + } + + SecurityManagerContainerMenu(final int syncId, + final Inventory playerInventory, + final SecurityManagerBlockEntity securityManager) { + super(Menus.INSTANCE.getSecurityManager(), syncId); + addSlots(playerInventory, securityManager.getSecurityCards(), securityManager.getFallbackSecurityCard()); + registerProperty(new ServerProperty<>( + PropertyTypes.REDSTONE_MODE, + securityManager::getRedstoneMode, + securityManager::setRedstoneMode + )); + } + + private void addSlots(final Inventory playerInventory, + final Container securityCards, + final Container fallbackSecurityCard) { + for (int i = 0; i < CARD_AMOUNT; ++i) { + final int column = i % 9; + final int x = 8 + (column * 18); + final int row = i / 9; + final int y = 20 + (row * 18); + addSlot(new ValidatedSlot(securityCards, i, x, y, SecurityManagerBlockEntity::isValidSecurityCard)); + } + fallbackSecurityCardSlot = new ValidatedSlot( + fallbackSecurityCard, + 0, + 174, + 20, + SecurityManagerBlockEntity::isValidFallbackSecurityCard + ); + addSlot(fallbackSecurityCardSlot); + addPlayerInventory(playerInventory, 8, 72); + transferManager.addBiTransfer(playerInventory, securityCards); + transferManager.addBiTransfer(playerInventory, fallbackSecurityCard); + } + + @Nullable + Slot getFallbackSecurityCardSlot() { + return fallbackSecurityCardSlot; + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerScreen.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerScreen.java new file mode 100644 index 000000000..7a819c1e7 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerScreen.java @@ -0,0 +1,61 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.platform.common.Platform; +import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseScreen; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.PropertyTypes; +import com.refinedmods.refinedstorage2.platform.common.support.tooltip.HelpClientTooltipComponent; +import com.refinedmods.refinedstorage2.platform.common.support.widget.RedstoneModeSideButtonWidget; + +import java.util.List; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public class SecurityManagerScreen extends AbstractBaseScreen { + private static final ResourceLocation TEXTURE = createIdentifier("textures/gui/security_manager.png"); + + public SecurityManagerScreen(final SecurityManagerContainerMenu menu, + final Inventory playerInventory, + final Component text) { + super(menu, playerInventory, text); + this.inventoryLabelY = 59; + this.imageWidth = 197; + this.imageHeight = 154; + } + + @Override + protected void init() { + super.init(); + addSideButton(new RedstoneModeSideButtonWidget( + getMenu().getProperty(PropertyTypes.REDSTONE_MODE), + createTranslation("gui", "security_manager.redstone_mode_help") + )); + } + + @Override + protected void renderTooltip(final GuiGraphics graphics, final int x, final int y) { + if (hoveredSlot != null && hoveredSlot == menu.getFallbackSecurityCardSlot() && !hoveredSlot.hasItem()) { + Platform.INSTANCE.renderTooltip(graphics, List.of( + ClientTooltipComponent.create( + createTranslation("gui", "security_manager.fallback_security_card_slot_hint").getVisualOrderText() + ), + HelpClientTooltipComponent.create( + createTranslation("gui", "security_manager.no_fallback_security_card_consequence") + ) + ), x, y); + return; + } + super.renderTooltip(graphics, x, y); + } + + @Override + protected ResourceLocation getTexture() { + return TEXTURE; + } +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 99c616827..78bb3e19f 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -146,6 +146,9 @@ "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", "gui.refinedstorage2.security_card.permission.reset": "Reset", "gui.refinedstorage2.security_card.permission.modified": "Modified", + "gui.refinedstorage2.security_manager.redstone_mode_help": "When this device is inactive, the Security Cards and Fallback Security Card in this device will be ignored and the network will not be protected.", + "gui.refinedstorage2.security_manager.fallback_security_card_slot_hint": "Slot for a Fallback Security Card.", + "gui.refinedstorage2.security_manager.no_fallback_security_card_consequence": "If no Fallback Security Card is present, the network will be unprotected for players that don't have a corresponding Security Card.", "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_manager.png b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/textures/gui/security_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..67eb6b9703c4452ffe27e5e7b36d487ef0768699 GIT binary patch literal 1088 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9%-=m- z978JRyuEw3aCU%5>&50{p^>>4I?`S=J1yYbsq;ypdeR9wOF@Cy)b(Gd&9^)u_nGzG zVb5@TUDlnu-0K_MfBaZ9J+<)vapKGk&R!KWwmOUx($hoXqt*J9n*$nwGk9)vqlI2i+8kqh@^8 zH~Zf6I3hIkvPo#{yKW9MrkR)j$jq+(_L!%kLjM0R^5YL%UC+y=oDbHtv-+rjf4I^%GMmkb3 zYy_J6?D-9jE%KC_1P;&?O(2cDVOxBtDtb>{L$(F$u=d_7oMWAkrw@AOrx*1djJWB2=+(+uZWzQA4AuU~hs z7yFU?p1omBNo~_EnmdKI;Vst0EBsI A%>V!Z literal 0 HcmV?d00001 From 0278b41df452a7e7c37aa7fe74bfbb98aff83076 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Tue, 2 Apr 2024 17:54:02 +0200 Subject: [PATCH 46/59] feat: security card energy usage --- .../security/SecurityPolicyContainerItem.java | 2 ++ .../platform/common/Config.java | 6 ++++- .../common/content/DefaultEnergyUsage.java | 2 ++ .../common/networking/NetworkCardItem.java | 1 - .../security/FallbackSecurityCardItem.java | 6 +++++ .../common/security/SecurityCardItem.java | 6 +++++ .../security/SecurityManagerBlockEntity.java | 23 +++++++++++++++++-- .../assets/refinedstorage2/lang/en_us.json | 4 ++++ .../platform/fabric/ConfigImpl.java | 20 +++++++++++++++- .../platform/forge/ConfigImpl.java | 22 ++++++++++++++++++ 10 files changed, 87 insertions(+), 5 deletions(-) diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java index 1a6aff87e..d7d417076 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityPolicyContainerItem.java @@ -28,4 +28,6 @@ public interface SecurityPolicyContainerItem { * @return the policy, if present */ Optional getPolicy(ItemStack stack); + + long getEnergyUsage(); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java index 1993d55b6..0e9068ecf 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/Config.java @@ -17,7 +17,7 @@ public interface Config { boolean isSmoothScrolling(); int getMaxRowsStretch(); - + GridEntry getGrid(); CraftingGridEntry getCraftingGrid(); @@ -60,6 +60,10 @@ public interface Config { PortableGridEntry getPortableGrid(); + SimpleEnergyUsageEntry getSecurityCard(); + + SimpleEnergyUsageEntry getFallbackSecurityCard(); + SimpleEnergyUsageEntry getSecurityManager(); interface SimpleEnergyUsageEntry { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java index e0e9fbf16..d01592d55 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/DefaultEnergyUsage.java @@ -42,6 +42,8 @@ public final class DefaultEnergyUsage { public static final long RANGE_UPGRADE = 8; public static final long CREATIVE_RANGE_UPGRADE = 0; public static final int RANGE_UPGRADE_RANGE = 8; + public static final long SECURITY_CARD = 2; + public static final long FALLBACK_SECURITY_CARD = 4; public static final long WIRELESS_GRID_CAPACITY = 1000; public static final long WIRELESS_GRID_OPEN = 5; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java index d21515a49..880c9702f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkCardItem.java @@ -30,7 +30,6 @@ import static com.refinedmods.refinedstorage2.platform.common.networking.NetworkReceiverKey.getDimensionName; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -// TODO: energy usage per card in the security manager. public class NetworkCardItem extends Item { private static final MutableComponent UNBOUND_HELP = createTranslation("item", "network_card.unbound_help"); private static final MutableComponent BOUND_HELP = createTranslation("item", "network_card.bound_help"); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java index cb7f3771a..85e94b6d0 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/FallbackSecurityCardItem.java @@ -5,6 +5,7 @@ import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.Platform; import java.util.Optional; import java.util.Set; @@ -40,4 +41,9 @@ public Optional getTooltipImage(final ItemStack stack) { public Optional getActor(final ItemStack stack) { return Optional.empty(); } + + @Override + public long getEnergyUsage() { + return Platform.INSTANCE.getConfig().getFallbackSecurityCard().getEnergyUsage(); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java index 5d568feae..b3040bb60 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityCardItem.java @@ -5,6 +5,7 @@ import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; +import com.refinedmods.refinedstorage2.platform.common.Platform; import java.util.List; import java.util.Optional; @@ -101,6 +102,11 @@ public Optional getActor(final ItemStack stack) { return Optional.of(new PlayerSecurityActor(playerId)); } + @Override + public long getEnergyUsage() { + return Platform.INSTANCE.getConfig().getSecurityCard().getEnergyUsage(); + } + @Nullable UUID getBoundPlayerId(final ItemStack stack) { return (stack.getTag() == null || !stack.getTag().contains(TAG_BOUND_PLAYER_ID)) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java index 87be3a0e8..f94a3e87f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -54,8 +54,27 @@ public SecurityManagerBlockEntity(final BlockPos pos, final BlockState state) { state, new SimpleNetworkNode(Platform.INSTANCE.getConfig().getSecurityManager().getEnergyUsage()) ); - securityCards.addListener(c -> setChanged()); - fallbackSecurityCard.addListener(c -> setChanged()); + securityCards.addListener(c -> invalidate()); + fallbackSecurityCard.addListener(c -> invalidate()); + } + + private void invalidate() { + if (level != null) { + setChanged(); + } + long energyUsage = Platform.INSTANCE.getConfig().getSecurityManager().getEnergyUsage(); + for (int i = 0; i < securityCards.getContainerSize(); ++i) { + final ItemStack securityCard = securityCards.getItem(i); + if (!(securityCard.getItem() instanceof SecurityPolicyContainerItem securityPolicyContainerItem)) { + continue; + } + energyUsage += securityPolicyContainerItem.getEnergyUsage(); + } + final ItemStack fallbackSecurityCardStack = fallbackSecurityCard.getItem(0); + if (fallbackSecurityCardStack.getItem() instanceof SecurityPolicyContainerItem securityPolicyContainerItem) { + energyUsage += securityPolicyContainerItem.getEnergyUsage(); + } + getNode().setEnergyUsage(energyUsage); } @Override diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 78bb3e19f..9fd677663 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -353,6 +353,10 @@ "text.autoconfig.refinedstorage2.option.portableGrid.openEnergyUsage": "Open energy usage", "text.autoconfig.refinedstorage2.option.portableGrid.insertEnergyUsage": "Insert energy usage", "text.autoconfig.refinedstorage2.option.portableGrid.extractEnergyUsage": "Extract energy usage", + "text.autoconfig.refinedstorage2.option.securityCard": "Security Card", + "text.autoconfig.refinedstorage2.option.securityCard.energyUsage": "Energy usage", + "text.autoconfig.refinedstorage2.option.fallbackSecurityCard": "Fallback Security Card", + "text.autoconfig.refinedstorage2.option.fallbackSecurityCard.energyUsage": "Energy usage", "text.autoconfig.refinedstorage2.option.securityManager": "Security Manager", "text.autoconfig.refinedstorage2.option.securityManager.energyUsage": "Energy usage", "advancements.refinedstorage2.root.description": "Use one or multiple Controllers in a storage network to provide your network with energy", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java index 9866edefb..ce44228b7 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ConfigImpl.java @@ -23,7 +23,7 @@ public class ConfigImpl implements ConfigData, com.refinedmods.refinedstorage2.p @ConfigEntry.BoundedDiscrete(min = 3L, max = 256) private int maxRowsStretch = 256; - + @ConfigEntry.Gui.CollapsibleObject private GridEntryImpl grid = new GridEntryImpl(); @@ -95,6 +95,14 @@ public class ConfigImpl implements ConfigData, com.refinedmods.refinedstorage2.p @ConfigEntry.Gui.CollapsibleObject private PortableGridEntryImpl portableGrid = new PortableGridEntryImpl(); + @ConfigEntry.Gui.CollapsibleObject + private SimpleEnergyUsageEntryImpl securityCard = new SimpleEnergyUsageEntryImpl(DefaultEnergyUsage.SECURITY_CARD); + + @ConfigEntry.Gui.CollapsibleObject + private SimpleEnergyUsageEntryImpl fallbackSecurityCard = new SimpleEnergyUsageEntryImpl( + DefaultEnergyUsage.FALLBACK_SECURITY_CARD + ); + @ConfigEntry.Gui.CollapsibleObject private SimpleEnergyUsageEntryImpl securityManager = new SimpleEnergyUsageEntryImpl( DefaultEnergyUsage.SECURITY_MANAGER @@ -230,6 +238,16 @@ public PortableGridEntry getPortableGrid() { return portableGrid; } + @Override + public SimpleEnergyUsageEntry getSecurityCard() { + return securityCard; + } + + @Override + public SimpleEnergyUsageEntry getFallbackSecurityCard() { + return fallbackSecurityCard; + } + @Override public SimpleEnergyUsageEntry getSecurityManager() { return securityManager; diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java index d653f97af..549efa30c 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ConfigImpl.java @@ -43,6 +43,8 @@ public class ConfigImpl implements Config { private final SimpleEnergyUsageEntry networkReceiver; private final SimpleEnergyUsageEntry networkTransmitter; private final PortableGridEntry portableGrid; + private final SimpleEnergyUsageEntry securityCard; + private final SimpleEnergyUsageEntry fallbackSecurityCard; private final SimpleEnergyUsageEntry securityManager; public ConfigImpl() { @@ -92,6 +94,16 @@ public ConfigImpl() { DefaultEnergyUsage.NETWORK_TRANSMITTER ); portableGrid = new PortableGridEntryImpl(); + securityCard = new SimpleEnergyUsageEntryImpl( + "securityCard", + "Security Card", + DefaultEnergyUsage.SECURITY_CARD + ); + fallbackSecurityCard = new SimpleEnergyUsageEntryImpl( + "fallbackSecurityCard", + "Fallback Security Card", + DefaultEnergyUsage.FALLBACK_SECURITY_CARD + ); securityManager = new SimpleEnergyUsageEntryImpl( "securityManager", "Security Manager", @@ -229,6 +241,16 @@ public PortableGridEntry getPortableGrid() { return portableGrid; } + @Override + public SimpleEnergyUsageEntry getSecurityCard() { + return securityCard; + } + + @Override + public SimpleEnergyUsageEntry getFallbackSecurityCard() { + return fallbackSecurityCard; + } + @Override public SimpleEnergyUsageEntry getSecurityManager() { return securityManager; From 981dd66ecb1e3220f7910a35bcab1fceacd1e4b6 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Tue, 2 Apr 2024 20:30:32 +0200 Subject: [PATCH 47/59] feat: security network component logic pt 2 * If there are no decision providers, always allow * If at least one decision provider denies, fail * If at least one decision provider allows, accept * If all decision providers pass, use fallback policy * If no fallback policy is present, fail * If at least one fallback policy denies, fail * If at least one fallback policy allows, accept * If all fallback policies pass, fail This is a 2-pass check to ensure regular policies get prioritized over default policies. --- CHANGELOG.md | 3 +- .../security/SecurityDecisionProvider.java | 13 +- .../security/SecurityNetworkComponent.java | 5 - ...urityDecisionProviderProxyNetworkNode.java | 32 ++++- .../SecurityDecisionProviderImpl.java | 26 +++- .../SecurityNetworkComponentImpl.java | 39 ++++-- .../SecurityNetworkComponentImplTest.java | 117 +++++++++++++----- .../security/SecurityManagerBlockEntity.java | 50 +++++--- .../AbstractPortableGridBlockEntity.java | 9 +- .../portablegrid/InWorldPortableGrid.java | 29 +++++ .../support/SimpleFilteredContainer.java | 20 +++ .../assets/refinedstorage2/lang/en_us.json | 8 +- 12 files changed, 261 insertions(+), 90 deletions(-) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/InWorldPortableGrid.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleFilteredContainer.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 865f5c5cf..25bf7d0a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - The Security Card can be bound to other (currently online) players via its GUI. - The binding of a Security Card can now be cleared. - The Security Card tooltip and GUI now show whether the permission has been touched/changed in any way. -- A global (fallback) permission set for a network can be defined using the Fallback Security Card (instead of using an "unbound" Security Card). +- As soon as a Security Manager is placed, the storage network will be locked down by default. Start adding Security Cards to allow or deny specific access to players. +- To not lock the entire network by default for players who do not have a matching Security Card, a Fallback Security Card can be used to configure this behavior. - Smooth scrolling, screen size and max row stretch are no longer Grid-specific settings, but are now global settings. ### Fixed diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java index cf1ae3957..68add781d 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java @@ -5,14 +5,9 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") @FunctionalInterface public interface SecurityDecisionProvider { - /** - * Returns the {@link SecurityDecision} for the given {@link Permission} and {@link SecurityActor}. - * If there is no {@link SecurityPolicy} for the given {@link SecurityActor}, the decision should - * be {@link SecurityDecision#PASS}. - * - * @param permission the permission - * @param actor the actor - * @return the security decision - */ SecurityDecision isAllowed(Permission permission, SecurityActor actor); + + default SecurityDecision isAllowed(Permission permission) { + return SecurityDecision.PASS; + } } diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java index 2b518334c..fcda6ad8c 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityNetworkComponent.java @@ -7,10 +7,5 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") @FunctionalInterface public interface SecurityNetworkComponent extends NetworkComponent { - /** - * @param permission the permission - * @param actor the actor - * @return true if the actor is allowed to perform the action, false otherwise - */ boolean isAllowed(Permission permission, SecurityActor actor); } diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java index 8db409f9f..1ab5c878d 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/node/security/SecurityDecisionProviderProxyNetworkNode.java @@ -6,15 +6,30 @@ import com.refinedmods.refinedstorage2.api.network.security.SecurityDecision; import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; +import javax.annotation.Nullable; + public class SecurityDecisionProviderProxyNetworkNode extends AbstractNetworkNode implements SecurityDecisionProvider { - private final long energyUsage; - private final SecurityDecisionProvider delegate; + private long energyUsage; + @Nullable + private SecurityDecisionProvider delegate; - public SecurityDecisionProviderProxyNetworkNode(final long energyUsage, final SecurityDecisionProvider delegate) { + public SecurityDecisionProviderProxyNetworkNode(final long energyUsage) { this.energyUsage = energyUsage; + } + + public SecurityDecisionProviderProxyNetworkNode(final long energyUsage, final SecurityDecisionProvider delegate) { + this(energyUsage); + this.delegate = delegate; + } + + public void setDelegate(@Nullable final SecurityDecisionProvider delegate) { this.delegate = delegate; } + public void setEnergyUsage(final long energyUsage) { + this.energyUsage = energyUsage; + } + @Override public long getEnergyUsage() { return energyUsage; @@ -22,6 +37,17 @@ public long getEnergyUsage() { @Override public SecurityDecision isAllowed(final Permission permission, final SecurityActor actor) { + if (delegate == null) { + return SecurityDecision.PASS; + } return delegate.isAllowed(permission, actor); } + + @Override + public SecurityDecision isAllowed(final Permission permission) { + if (delegate == null) { + return SecurityDecision.PASS; + } + return delegate.isAllowed(permission); + } } diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java index ae3ee988a..006dc6e91 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityDecisionProviderImpl.java @@ -8,21 +8,45 @@ import java.util.HashMap; import java.util.Map; +import javax.annotation.Nullable; public class SecurityDecisionProviderImpl implements SecurityDecisionProvider { private final Map policyByActor = new HashMap<>(); + @Nullable + private SecurityPolicy defaultPolicy; public SecurityDecisionProviderImpl setPolicy(final SecurityActor actor, final SecurityPolicy policy) { policyByActor.put(actor, policy); return this; } + public SecurityDecisionProviderImpl setDefaultPolicy(@Nullable final SecurityPolicy policy) { + this.defaultPolicy = policy; + return this; + } + + public void clearPolicies() { + policyByActor.clear(); + } + @Override public SecurityDecision isAllowed(final Permission permission, final SecurityActor actor) { final SecurityPolicy policy = policyByActor.get(actor); if (policy == null) { return SecurityDecision.PASS; } - return policy.isAllowed(permission) ? SecurityDecision.ALLOW : SecurityDecision.DENY; + return allowOrDeny(policy.isAllowed(permission)); + } + + @Override + public SecurityDecision isAllowed(final Permission permission) { + if (defaultPolicy == null) { + return SecurityDecision.PASS; + } + return allowOrDeny(defaultPolicy.isAllowed(permission)); + } + + private static SecurityDecision allowOrDeny(final boolean allowed) { + return allowed ? SecurityDecision.ALLOW : SecurityDecision.DENY; } } diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java index 3a935dacd..614ce6b9e 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -11,6 +11,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import java.util.stream.Collectors; public class SecurityNetworkComponentImpl implements SecurityNetworkComponent { private final Set providers = new LinkedHashSet<>(); @@ -36,17 +37,33 @@ public void onContainerRemoved(final NetworkNodeContainer container) { @Override public boolean isAllowed(final Permission permission, final SecurityActor actor) { - for (final SecurityDecisionProvider provider : providers) { - final SecurityDecision decision = CoreValidations.validateNotNull( - provider.isAllowed(permission, actor), - "Security decision provider must not return null" - ); - if (decision == SecurityDecision.DENY) { - return false; - } else if (decision == SecurityDecision.ALLOW) { - return true; - } + if (providers.isEmpty()) { + return defaultPolicy.isAllowed(permission); } - return defaultPolicy.isAllowed(permission); + final Set decisions = providers.stream().map(provider -> CoreValidations.validateNotNull( + provider.isAllowed(permission, actor), + "Decision cannot be null" + )).collect(Collectors.toSet()); + final boolean anyDenied = decisions.stream().anyMatch(decision -> decision == SecurityDecision.DENY); + if (anyDenied) { + return false; + } + final boolean anyAllowed = decisions.stream().anyMatch(decision -> decision == SecurityDecision.ALLOW); + if (anyAllowed) { + return true; + } + return tryFallback(permission); + } + + private boolean tryFallback(final Permission permission) { + final Set decisions = providers.stream().map(provider -> CoreValidations.validateNotNull( + provider.isAllowed(permission), + "Decision cannot be null" + )).collect(Collectors.toSet()); + final boolean anyDenied = decisions.stream().anyMatch(decision -> decision == SecurityDecision.DENY); + if (anyDenied) { + return false; + } + return decisions.stream().anyMatch(decision -> decision == SecurityDecision.ALLOW); } } diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java index 0cbfe99da..519a8f182 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java @@ -1,7 +1,6 @@ package com.refinedmods.refinedstorage2.api.network.impl.security; import com.refinedmods.refinedstorage2.api.network.impl.node.security.SecurityDecisionProviderProxyNetworkNode; -import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; import com.refinedmods.refinedstorage2.api.network.security.Permission; import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; @@ -29,76 +28,132 @@ void shouldUseDefaultPolicyIfNoSecurityDecisionProvidersArePresent() { // Act & assert assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isFalse(); + + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); } @Test - void shouldUseDefaultPolicyIfANotConfiguredSecurityDecisionProviderIsPresent() { + void shouldDenyAllIfAtLeastOneSecurityDecisionProviderIsPresent() { // Arrange sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); // Act & assert - assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isFalse(); assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isFalse(); + + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); } @Test - void shouldUseDefaultPolicyIfAConfiguredSecurityDecisionProviderIsPresentForAnotherActor() { + void shouldAllowOrDeny() { // Arrange + securityDecisionProvider.setPolicy(TestActors.A, policy(TestPermissions.OTHER)); sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); - securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); // Act & assert - assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); - assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isFalse(); + + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); } @Test - void shouldDenyPermissionIfAConfiguredSecurityDecisionProviderIsPresentForTheActor() { + void shouldOnlyAllowIfAllSecurityDecisionProvidersAllow() { // Arrange - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); - securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setPolicy(TestActors.A, policy(TestPermissions.OTHER)) + )); + + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setPolicy(TestActors.A, policy(TestPermissions.OTHER2)) + )); + + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setPolicy(TestActors.B, policy(TestPermissions.OTHER)) + )); // Act & assert - assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); + + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.C)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.C)).isFalse(); } @Test - void shouldUseFirstSecurityDecisionProviderThatIsConfiguredForActor() { + void shouldUseDefaultPolicyOfSecurityDecisionProviderIfAllProvidersPassDecision() { // Arrange sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() - .setPolicy(TestActors.A, policy(TestPermissions.OTHER2)))); + .setPolicy(TestActors.A, policy(TestPermissions.OTHER)) + .setDefaultPolicy(policy(TestPermissions.ALLOW_BY_DEFAULT)) + )); - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); - securityDecisionProvider.setPolicy(TestActors.A, policy(TestPermissions.ALLOW_BY_DEFAULT)); // will be ignored - securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setPolicy(TestActors.A, policy(TestPermissions.OTHER)) + .setDefaultPolicy(policy(TestPermissions.ALLOW_BY_DEFAULT, TestPermissions.OTHER2)) + )); + + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setPolicy(TestActors.C, policy(TestPermissions.OTHER)) + )); // Act & assert assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isFalse(); - assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); - assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isFalse(); - assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); - assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isFalse(); assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); + + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.C)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.C)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.C)).isFalse(); } @Test - void shouldRemoveSecurityDecisionProvider() { + void shouldRemoveContainer() { // Arrange - final NetworkNode node = new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider); - sut.onContainerAdded(() -> node); - securityDecisionProvider.setPolicy(TestActors.B, policy(TestPermissions.OTHER)); + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setDefaultPolicy(policy(TestPermissions.ALLOW_BY_DEFAULT)) + )); + + final var removedNode = new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + .setDefaultPolicy(policy(TestPermissions.OTHER))); + sut.onContainerAdded(() -> removedNode); // Act - sut.onContainerRemoved(() -> node); - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() - .setPolicy(TestActors.B, policy(TestPermissions.OTHER2)))); + sut.onContainerRemoved(() -> removedNode); // Assert - assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isFalse(); - assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isFalse(); - assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); + } + + @Test + void shouldClearPolicies() { + // Arrange + sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + securityDecisionProvider.setPolicy(TestActors.A, policy(TestPermissions.OTHER)); + securityDecisionProvider.setDefaultPolicy(policy(TestPermissions.OTHER2)); + + // Act + securityDecisionProvider.clearPolicies(); + + // Assert + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isTrue(); } enum TestPermissions implements Permission { @@ -106,7 +161,7 @@ enum TestPermissions implements Permission { } enum TestActors implements SecurityActor { - A, B + A, B, C } private SecurityPolicy policy(final Permission... permissions) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java index f94a3e87f..d55590a8b 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -1,11 +1,13 @@ package com.refinedmods.refinedstorage2.platform.common.security; -import com.refinedmods.refinedstorage2.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage2.api.network.impl.node.security.SecurityDecisionProviderProxyNetworkNode; +import com.refinedmods.refinedstorage2.api.network.impl.security.SecurityDecisionProviderImpl; import com.refinedmods.refinedstorage2.platform.api.security.SecurityPolicyContainerItem; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.support.BlockEntityWithDrops; +import com.refinedmods.refinedstorage2.platform.common.support.SimpleFilteredContainer; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.util.ContainerUtil; @@ -26,42 +28,43 @@ import net.minecraft.world.level.block.state.BlockState; public class SecurityManagerBlockEntity - extends AbstractRedstoneModeNetworkNodeContainerBlockEntity + extends AbstractRedstoneModeNetworkNodeContainerBlockEntity implements BlockEntityWithDrops, ExtendedMenuProvider { static final int CARD_AMOUNT = 18; private static final String TAG_SECURITY_CARDS = "sc"; private static final String TAG_FALLBACK_SECURITY_CARD = "fsc"; - private final SimpleContainer securityCards = new SimpleContainer(CARD_AMOUNT) { - @Override - public boolean canPlaceItem(final int slot, final ItemStack stack) { - return isValidSecurityCard(stack); - } - }; + private final SimpleContainer securityCards = new SimpleFilteredContainer( + CARD_AMOUNT, + SecurityManagerBlockEntity::isValidSecurityCard + ); + private final SimpleContainer fallbackSecurityCard = new SimpleFilteredContainer( + 1, + SecurityManagerBlockEntity::isValidFallbackSecurityCard + ); - private final SimpleContainer fallbackSecurityCard = new SimpleContainer(1) { - @Override - public boolean canPlaceItem(final int slot, final ItemStack stack) { - return isValidFallbackSecurityCard(stack); - } - }; + private final SecurityDecisionProviderImpl securityDecisionProvider = new SecurityDecisionProviderImpl(); public SecurityManagerBlockEntity(final BlockPos pos, final BlockState state) { super( BlockEntities.INSTANCE.getSecurityManager(), pos, state, - new SimpleNetworkNode(Platform.INSTANCE.getConfig().getSecurityManager().getEnergyUsage()) + new SecurityDecisionProviderProxyNetworkNode( + Platform.INSTANCE.getConfig().getSecurityManager().getEnergyUsage() + ) ); securityCards.addListener(c -> invalidate()); fallbackSecurityCard.addListener(c -> invalidate()); + getNode().setDelegate(securityDecisionProvider); } private void invalidate() { if (level != null) { setChanged(); } + securityDecisionProvider.clearPolicies(); long energyUsage = Platform.INSTANCE.getConfig().getSecurityManager().getEnergyUsage(); for (int i = 0; i < securityCards.getContainerSize(); ++i) { final ItemStack securityCard = securityCards.getItem(i); @@ -69,12 +72,25 @@ private void invalidate() { continue; } energyUsage += securityPolicyContainerItem.getEnergyUsage(); + securityPolicyContainerItem.getPolicy(securityCard).ifPresent( + policy -> securityPolicyContainerItem.getActor(securityCard).ifPresent( + actor -> securityDecisionProvider.setPolicy(actor, policy))); } + energyUsage += updateDefaultPolicyAndGetEnergyUsage(); + getNode().setEnergyUsage(energyUsage); + } + + private long updateDefaultPolicyAndGetEnergyUsage() { final ItemStack fallbackSecurityCardStack = fallbackSecurityCard.getItem(0); if (fallbackSecurityCardStack.getItem() instanceof SecurityPolicyContainerItem securityPolicyContainerItem) { - energyUsage += securityPolicyContainerItem.getEnergyUsage(); + securityPolicyContainerItem.getPolicy(fallbackSecurityCardStack).ifPresentOrElse( + securityDecisionProvider::setDefaultPolicy, + () -> securityDecisionProvider.setDefaultPolicy(null) + ); + return securityPolicyContainerItem.getEnergyUsage(); } - getNode().setEnergyUsage(energyUsage); + securityDecisionProvider.setDefaultPolicy(null); + return 0; } @Override diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridBlockEntity.java index ab17a63d0..f69d122c3 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/AbstractPortableGridBlockEntity.java @@ -66,14 +66,7 @@ protected AbstractPortableGridBlockEntity(final PortableGridType type, final Blo super(getBlockEntityType(type), pos, state); this.diskInventory = new DiskInventory((inventory, slot) -> onDiskChanged(), 1); this.energyStorage = createEnergyStorage(type, this); - this.grid = new PortableGrid(energyStorage, diskInventory, diskStateListener) { - @Override - public boolean isGridActive() { - return super.isGridActive() - && level != null - && redstoneMode.isActive(level.hasNeighborSignal(worldPosition)); - } - }; + this.grid = new InWorldPortableGrid(energyStorage, diskInventory, diskStateListener, this); } static void readDiskInventory(final CompoundTag tag, final DiskInventory diskInventory) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/InWorldPortableGrid.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/InWorldPortableGrid.java new file mode 100644 index 000000000..8dfffe5ef --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/InWorldPortableGrid.java @@ -0,0 +1,29 @@ +package com.refinedmods.refinedstorage2.platform.common.storage.portablegrid; + +import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; +import com.refinedmods.refinedstorage2.api.storage.StateTrackedStorage; +import com.refinedmods.refinedstorage2.platform.common.storage.DiskInventory; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + +class InWorldPortableGrid extends PortableGrid { + private final AbstractPortableGridBlockEntity blockEntity; + + InWorldPortableGrid(final EnergyStorage energyStorage, + final DiskInventory diskInventory, + final StateTrackedStorage.Listener diskListener, + final AbstractPortableGridBlockEntity blockEntity) { + super(energyStorage, diskInventory, diskListener); + this.blockEntity = blockEntity; + } + + @Override + public boolean isGridActive() { + final Level level = blockEntity.getLevel(); + final BlockPos worldPosition = blockEntity.getBlockPos(); + return super.isGridActive() + && level != null + && blockEntity.getRedstoneMode().isActive(level.hasNeighborSignal(worldPosition)); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleFilteredContainer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleFilteredContainer.java new file mode 100644 index 000000000..13a83635f --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleFilteredContainer.java @@ -0,0 +1,20 @@ +package com.refinedmods.refinedstorage2.platform.common.support; + +import java.util.function.Predicate; + +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.ItemStack; + +public final class SimpleFilteredContainer extends SimpleContainer { + private final Predicate filter; + + public SimpleFilteredContainer(final int size, final Predicate filter) { + super(size); + this.filter = filter; + } + + @Override + public boolean canPlaceItem(final int slot, final ItemStack stack) { + return filter.test(stack); + } +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 9fd677663..590ded8d0 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -33,7 +33,7 @@ "block.refinedstorage2.portable_grid": "Portable Grid", "block.refinedstorage2.creative_portable_grid": "Creative Portable Grid", "block.refinedstorage2.security_manager": "Security Manager", - "block.refinedstorage2.security_manager.help": "Used to store Security Cards and (optionally) a Fallback Security Card for a storage network.", + "block.refinedstorage2.security_manager.help": "When this device is active, will protect the network by default and block all operations. Start adding Security Cards to permit or deny specific operations for a player.", "gui.refinedstorage2.controller.redstone_mode_help": "When this device is inactive, the storage network will not be able to use this device as an energy source.", "gui.refinedstorage2.disk_drive.disks": "Disks", "gui.refinedstorage2.storage.redstone_mode_help": "When this device is inactive, the contained storage will no longer be accessible from within the storage network.", @@ -146,9 +146,9 @@ "gui.refinedstorage2.network_transmitter.status.receiver_unreachable": "Unreachable", "gui.refinedstorage2.security_card.permission.reset": "Reset", "gui.refinedstorage2.security_card.permission.modified": "Modified", - "gui.refinedstorage2.security_manager.redstone_mode_help": "When this device is inactive, the Security Cards and Fallback Security Card in this device will be ignored and the network will not be protected.", + "gui.refinedstorage2.security_manager.redstone_mode_help": "When this device is inactive, the network will not be protected.", "gui.refinedstorage2.security_manager.fallback_security_card_slot_hint": "Slot for a Fallback Security Card.", - "gui.refinedstorage2.security_manager.no_fallback_security_card_consequence": "If no Fallback Security Card is present, the network will be unprotected for players that don't have a corresponding Security Card.", + "gui.refinedstorage2.security_manager.no_fallback_security_card_consequence": "Add a Fallback Security Card to this slot to set permissions for every player without a Security Card. By default, all actions are denied.", "item.refinedstorage2.controller.help": "Provides the storage network with energy. Multiple are allowed in a single storage network.", "item.refinedstorage2.creative_controller.help": "Provides the storage network with an infinite source of energy.", "item.refinedstorage2.disk_drive.help": "Accepts storage disks to provide the storage network with storage space.", @@ -229,7 +229,7 @@ "item.refinedstorage2.security_card": "Security Card", "item.refinedstorage2.security_card.cleared_configuration": "Cleared configuration.", "item.refinedstorage2.security_card.unbound": "Unbound.", - "item.refinedstorage2.security_card.unbound.help": "Right click to configure. Use while crouching to bind to the current player.", + "item.refinedstorage2.security_card.unbound.help": "Right click to configure and bind to the current player.", "item.refinedstorage2.security_card.bound": "Bound to %s.", "item.refinedstorage2.security_card.bound.help": "Right click to configure. Use while crouching to clear configuration and binding.", "item.refinedstorage2.fallback_security_card": "Fallback Security Card", From 31566d39db3989252933c42d8ee64a44d205484c Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Wed, 3 Apr 2024 14:26:59 +0200 Subject: [PATCH 48/59] ci: exclude rei properly from sonar duplication checking --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 54f67457f..e48c4a030 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,6 @@ enableSonarQube("refinedmods_refinedstorage2") sonarqube { properties { property "sonar.coverage.exclusions", "refinedstorage2-platform-forge/**/*,refinedstorage2-platform-fabric/**/*,refinedstorage2-platform-common/**/*,refinedstorage2-platform-api/**/*" - property "sonar.cpd.exclusions", "refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/integration/recipemod/rei/*,refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/integration/recipemod/rei/*" + property "sonar.cpd.exclusions", "refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/recipemod/rei/*,refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/recipemod/rei/*" } } From 77366f24e70abeb783a6be33439214ea4c60ba44 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Wed, 3 Apr 2024 14:45:33 +0200 Subject: [PATCH 49/59] feat: permission checking --- .../SecurityNetworkComponentImpl.java | 2 +- .../platform/api/PlatformApi.java | 4 -- .../platform/api/PlatformApiProxy.java | 7 ---- .../PlatformSecurityNetworkComponent.java | 13 +++++++ .../platform/api/security/SecurityHelper.java | 20 ++++++++++ .../common/AbstractModInitializer.java | 6 +++ .../platform/common/PlatformApiImpl.java | 8 ---- .../PlatformSecurityNetworkComponentImpl.java | 37 +++++++++++++++++++ .../common/security/PlayerSecurityActor.java | 5 --- .../common/support/AbstractBaseBlock.java | 17 ++++++++- .../support/ServerToClientCommunications.java | 3 ++ .../containermenu/ExtendedMenuProvider.java | 4 ++ .../common/support/packet/PacketIds.java | 1 + .../common/util/SecurityToastHelper.java | 23 ++++++++++++ .../assets/refinedstorage2/lang/en_us.json | 2 + .../fabric/ClientModInitializerImpl.java | 2 + .../fabric/packet/s2c/NoPermissionPacket.java | 21 +++++++++++ .../s2c/ServerToClientCommunicationsImpl.java | 6 +++ .../platform/forge/ModInitializer.java | 6 +++ .../packet/s2c/NoPermissionPacket.java | 30 +++++++++++++++ .../s2c/ServerToClientCommunicationsImpl.java | 6 +++ 21 files changed, 197 insertions(+), 26 deletions(-) create mode 100644 refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformSecurityNetworkComponent.java create mode 100644 refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/util/SecurityToastHelper.java create mode 100644 refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/NoPermissionPacket.java create mode 100644 refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/NoPermissionPacket.java diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java index 614ce6b9e..923f6effa 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -14,7 +14,7 @@ import java.util.stream.Collectors; public class SecurityNetworkComponentImpl implements SecurityNetworkComponent { - private final Set providers = new LinkedHashSet<>(); + protected final Set providers = new LinkedHashSet<>(); private final SecurityPolicy defaultPolicy; public SecurityNetworkComponentImpl(final SecurityPolicy defaultPolicy) { diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java index 36c2fce65..49deeb845 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java @@ -4,7 +4,6 @@ import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; -import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.ConstructorStrategyFactory; @@ -49,7 +48,6 @@ import java.util.Set; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -188,6 +186,4 @@ EnergyStorage asBlockItemEnergyStorage( PlatformRegistry getPermissionRegistry(); SecurityPolicy createDefaultSecurityPolicy(); - - SecurityActor createPlayerSecurityActor(ServerPlayer player); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java index f4efc398f..353dc1963 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java @@ -4,7 +4,6 @@ import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.NetworkComponent; import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; -import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.constructordestructor.ConstructorStrategyFactory; @@ -50,7 +49,6 @@ import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -371,11 +369,6 @@ public SecurityPolicy createDefaultSecurityPolicy() { return ensureLoaded().createDefaultSecurityPolicy(); } - @Override - public SecurityActor createPlayerSecurityActor(final ServerPlayer player) { - return ensureLoaded().createPlayerSecurityActor(player); - } - private PlatformApi ensureLoaded() { if (delegate == null) { throw new IllegalStateException("Platform API not loaded yet"); diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformSecurityNetworkComponent.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformSecurityNetworkComponent.java new file mode 100644 index 000000000..3850fd466 --- /dev/null +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/PlatformSecurityNetworkComponent.java @@ -0,0 +1,13 @@ +package com.refinedmods.refinedstorage2.platform.api.security; + +import com.refinedmods.refinedstorage2.api.network.NetworkComponent; +import com.refinedmods.refinedstorage2.api.network.security.Permission; + +import net.minecraft.server.level.ServerPlayer; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE, since = "2.0.0-milestone.3.5") +@FunctionalInterface +public interface PlatformSecurityNetworkComponent extends NetworkComponent { + boolean isAllowed(Permission permission, ServerPlayer player); +} diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java new file mode 100644 index 000000000..1d5b35385 --- /dev/null +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java @@ -0,0 +1,20 @@ +package com.refinedmods.refinedstorage2.platform.api.security; + +import com.refinedmods.refinedstorage2.api.network.Network; +import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; +import com.refinedmods.refinedstorage2.api.network.security.Permission; + +import net.minecraft.server.level.ServerPlayer; + +public final class SecurityHelper { + private SecurityHelper() { + } + + public static boolean isAllowed(final ServerPlayer player, final Permission permission, final NetworkNode node) { + final Network network = node.getNetwork(); + if (network == null) { + return false; + } + return network.getComponent(PlatformSecurityNetworkComponent.class).isAllowed(permission, player); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index ec59e5ae6..f4487e21f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -8,6 +8,7 @@ import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.PlatformApiProxy; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformSecurityNetworkComponent; import com.refinedmods.refinedstorage2.platform.api.upgrade.AbstractUpgradeItem; import com.refinedmods.refinedstorage2.platform.common.configurationcard.ConfigurationCardItem; import com.refinedmods.refinedstorage2.platform.common.constructordestructor.BlockBreakDestructorStrategyFactory; @@ -56,6 +57,7 @@ import com.refinedmods.refinedstorage2.platform.common.networking.NetworkTransmitterContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; import com.refinedmods.refinedstorage2.platform.common.security.FallbackSecurityCardContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.security.PlatformSecurityNetworkComponentImpl; import com.refinedmods.refinedstorage2.platform.common.security.SecurityCardContainerMenu; import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.security.SecurityManagerContainerMenu; @@ -257,6 +259,10 @@ private void registerNetworkComponents() { StorageNetworkComponent.class, network -> new PlatformStorageNetworkComponent() ); + PlatformApi.INSTANCE.getNetworkComponentMapFactory().addFactory( + PlatformSecurityNetworkComponent.class, + network -> new PlatformSecurityNetworkComponentImpl(PlatformApi.INSTANCE.createDefaultSecurityPolicy()) + ); } private void registerWirelessTransmitterRangeModifiers() { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index 5dabb004e..ef30692da 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -7,7 +7,6 @@ import com.refinedmods.refinedstorage2.api.network.energy.EnergyStorage; import com.refinedmods.refinedstorage2.api.network.impl.NetworkBuilderImpl; import com.refinedmods.refinedstorage2.api.network.impl.NetworkFactory; -import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; import com.refinedmods.refinedstorage2.api.resource.ResourceKey; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; @@ -56,7 +55,6 @@ import com.refinedmods.refinedstorage2.platform.common.grid.strategy.CompositeGridScrollingStrategy; import com.refinedmods.refinedstorage2.platform.common.recipemod.CompositeIngredientConverter; import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; -import com.refinedmods.refinedstorage2.platform.common.security.PlayerSecurityActor; import com.refinedmods.refinedstorage2.platform.common.storage.ClientStorageRepository; import com.refinedmods.refinedstorage2.platform.common.storage.StorageContainerItemHelperImpl; import com.refinedmods.refinedstorage2.platform.common.storage.StorageRepositoryImpl; @@ -97,7 +95,6 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -532,9 +529,4 @@ public SecurityPolicy createDefaultSecurityPolicy() { .filter(PlatformPermission::isAllowedByDefault) .collect(Collectors.toSet())); } - - @Override - public SecurityActor createPlayerSecurityActor(final ServerPlayer player) { - return PlayerSecurityActor.of(player); - } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java new file mode 100644 index 000000000..e6412c41d --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java @@ -0,0 +1,37 @@ +package com.refinedmods.refinedstorage2.platform.common.security; + +import com.refinedmods.refinedstorage2.api.network.impl.security.SecurityNetworkComponentImpl; +import com.refinedmods.refinedstorage2.api.network.security.Permission; +import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformSecurityNetworkComponent; + +import com.mojang.authlib.GameProfile; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; + +public class PlatformSecurityNetworkComponentImpl extends SecurityNetworkComponentImpl + implements PlatformSecurityNetworkComponent { + private final SecurityPolicy defaultPolicy; + + public PlatformSecurityNetworkComponentImpl(final SecurityPolicy defaultPolicy) { + super(defaultPolicy); + this.defaultPolicy = defaultPolicy; + } + + @Override + public boolean isAllowed(final Permission permission, final ServerPlayer player) { + if (providers.isEmpty()) { + return defaultPolicy.isAllowed(permission); + } + final MinecraftServer server = player.getServer(); + if (server == null) { + return false; + } + final GameProfile gameProfile = player.getGameProfile(); + if (server.getPlayerList().isOp(gameProfile)) { + return true; + } + final PlayerSecurityActor actor = new PlayerSecurityActor(gameProfile.getId()); + return super.isAllowed(permission, actor); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java index 6afe9c920..47ea8c321 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlayerSecurityActor.java @@ -4,10 +4,5 @@ import java.util.UUID; -import net.minecraft.server.level.ServerPlayer; - public record PlayerSecurityActor(UUID playerId) implements SecurityActor { - public static PlayerSecurityActor of(final ServerPlayer player) { - return new PlayerSecurityActor(player.getGameProfile().getId()); - } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java index dcfed8e26..8d702e599 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java @@ -3,6 +3,7 @@ import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockColorMap; import com.refinedmods.refinedstorage2.platform.common.content.Sounds; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; import java.util.Optional; import javax.annotation.Nullable; @@ -29,6 +30,8 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + public abstract class AbstractBaseBlock extends Block { protected AbstractBaseBlock(final Properties properties) { super(properties); @@ -75,13 +78,25 @@ private Optional tryOpenScreen(final BlockState state, final MenuProvider menuProvider = state.getMenuProvider(level, pos); if (menuProvider != null) { if (player instanceof ServerPlayer serverPlayer) { - Platform.INSTANCE.getMenuOpener().openMenu(serverPlayer, menuProvider); + tryOpenScreen(serverPlayer, menuProvider); } return Optional.of(InteractionResult.SUCCESS); } return Optional.empty(); } + private void tryOpenScreen(final ServerPlayer player, final MenuProvider menuProvider) { + if (menuProvider instanceof ExtendedMenuProvider extendedMenuProvider + && !extendedMenuProvider.isAllowed(player)) { + Platform.INSTANCE.getServerToClientCommunications().sendNoPermission( + player, + createTranslation("misc", "no_permission.cannot_modify", extendedMenuProvider.getDisplayName()) + ); + return; + } + Platform.INSTANCE.getMenuOpener().openMenu(player, menuProvider); + } + @Override @SuppressWarnings("deprecation") public MenuProvider getMenuProvider(final BlockState state, final Level level, final BlockPos pos) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ServerToClientCommunications.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ServerToClientCommunications.java index ac865be62..6ed54994f 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ServerToClientCommunications.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/ServerToClientCommunications.java @@ -9,6 +9,7 @@ import java.util.UUID; import javax.annotation.Nullable; +import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; public interface ServerToClientCommunications { @@ -32,4 +33,6 @@ void sendResourceSlotUpdate(ServerPlayer player, void sendStorageInfoResponse(ServerPlayer player, UUID id, StorageInfo storageInfo); void sendNetworkTransmitterStatus(ServerPlayer player, NetworkTransmitterStatus status); + + void sendNoPermission(ServerPlayer player, Component message); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java index 95e91f4aa..b7a5810fe 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java @@ -6,4 +6,8 @@ public interface ExtendedMenuProvider extends MenuProvider { void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf); + + default boolean isAllowed(ServerPlayer player) { + return true; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java index 1d3eea67a..c6a0ec64d 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/packet/PacketIds.java @@ -31,6 +31,7 @@ public final class PacketIds { "security_card_reset_permission" ); public static final ResourceLocation SECURITY_CARD_BOUND_PLAYER = createIdentifier("security_card_bound_player"); + public static final ResourceLocation NO_PERMISSION = createIdentifier("no_permission"); private PacketIds() { } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/util/SecurityToastHelper.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/util/SecurityToastHelper.java new file mode 100644 index 000000000..14ac988a7 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/util/SecurityToastHelper.java @@ -0,0 +1,23 @@ +package com.refinedmods.refinedstorage2.platform.common.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.toasts.SystemToast; +import net.minecraft.network.chat.Component; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public final class SecurityToastHelper { + private static final SystemToast.SystemToastId NO_PERMISSION_TOAST_ID = new SystemToast.SystemToastId(); + + private SecurityToastHelper() { + } + + public static void addNoPermissionToast(final Component message) { + SystemToast.add( + Minecraft.getInstance().getToasts(), + NO_PERMISSION_TOAST_ID, + createTranslation("misc", "no_permission"), + message + ); + } +} diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 590ded8d0..3a4088697 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -253,6 +253,8 @@ "misc.refinedstorage2.resource_type.item": "Item", "misc.refinedstorage2.resource_type.fluid": "Fluid", "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", + "misc.refinedstorage2.no_permission": "No permission", + "misc.refinedstorage2.no_permission.cannot_modify": "You are not allowed to modify the %s.", "key.refinedstorage2.focus_search_bar": "Focus search bar", "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java index 8fdd9ef57..7e8ead76a 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ClientModInitializerImpl.java @@ -29,6 +29,7 @@ import com.refinedmods.refinedstorage2.platform.fabric.packet.s2c.GridClearPacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.s2c.GridUpdatePacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.s2c.NetworkTransmitterStatusPacket; +import com.refinedmods.refinedstorage2.platform.fabric.packet.s2c.NoPermissionPacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.s2c.ResourceSlotUpdatePacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.s2c.StorageInfoResponsePacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.s2c.WirelessTransmitterRangePacket; @@ -312,6 +313,7 @@ private void registerPackets() { PacketIds.NETWORK_TRANSMITTER_STATUS, new NetworkTransmitterStatusPacket() ); + ClientPlayNetworking.registerGlobalReceiver(PacketIds.NO_PERMISSION, new NoPermissionPacket()); } private void registerBlockEntityRenderers() { diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/NoPermissionPacket.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/NoPermissionPacket.java new file mode 100644 index 000000000..4cbfd9608 --- /dev/null +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/NoPermissionPacket.java @@ -0,0 +1,21 @@ +package com.refinedmods.refinedstorage2.platform.fabric.packet.s2c; + +import com.refinedmods.refinedstorage2.platform.common.util.SecurityToastHelper; + +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; + +public class NoPermissionPacket implements ClientPlayNetworking.PlayChannelHandler { + @Override + public void receive(final Minecraft client, + final ClientPacketListener handler, + final FriendlyByteBuf buf, + final PacketSender responseSender) { + final Component message = buf.readComponent(); + client.execute(() -> SecurityToastHelper.addNoPermissionToast(message)); + } +} diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/ServerToClientCommunicationsImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/ServerToClientCommunicationsImpl.java index 19c2f4644..610a440f2 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/ServerToClientCommunicationsImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/packet/s2c/ServerToClientCommunicationsImpl.java @@ -18,6 +18,7 @@ import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -108,6 +109,11 @@ public void sendNetworkTransmitterStatus(final ServerPlayer player, final Networ }); } + @Override + public void sendNoPermission(final ServerPlayer player, final Component message) { + sendToPlayer(player, PacketIds.NO_PERMISSION, buf -> buf.writeComponent(message)); + } + private static void sendToPlayer(final ServerPlayer playerEntity, final ResourceLocation id, final Consumer bufConsumer) { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index 79dade470..5c938c6cf 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -58,6 +58,7 @@ import com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c.GridClearPacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c.GridUpdatePacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c.NetworkTransmitterStatusPacket; +import com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c.NoPermissionPacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c.ResourceSlotUpdatePacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c.StorageInfoResponsePacket; import com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c.WirelessTransmitterRangePacket; @@ -477,6 +478,11 @@ private static void registerServerToClientPackets(final IPayloadRegistrar regist WirelessTransmitterRangePacket::decode, handler -> handler.client(WirelessTransmitterRangePacket::handle) ); + registrar.play( + PacketIds.NO_PERMISSION, + NoPermissionPacket::decode, + handler -> handler.client(NoPermissionPacket::handle) + ); } private static void registerClientToServerPackets(final IPayloadRegistrar registrar) { diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/NoPermissionPacket.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/NoPermissionPacket.java new file mode 100644 index 000000000..b0afbb025 --- /dev/null +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/NoPermissionPacket.java @@ -0,0 +1,30 @@ +package com.refinedmods.refinedstorage2.platform.forge.support.packet.s2c; + +import com.refinedmods.refinedstorage2.platform.common.support.packet.PacketIds; +import com.refinedmods.refinedstorage2.platform.common.util.SecurityToastHelper; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.PlayPayloadContext; + +public record NoPermissionPacket(Component component) implements CustomPacketPayload { + public static NoPermissionPacket decode(final FriendlyByteBuf buf) { + return new NoPermissionPacket(buf.readComponent()); + } + + public static void handle(final NoPermissionPacket packet, final PlayPayloadContext ctx) { + ctx.workHandler().submitAsync(() -> SecurityToastHelper.addNoPermissionToast(packet.component)); + } + + @Override + public void write(final FriendlyByteBuf friendlyByteBuf) { + friendlyByteBuf.writeComponent(component); + } + + @Override + public ResourceLocation id() { + return PacketIds.NO_PERMISSION; + } +} diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/ServerToClientCommunicationsImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/ServerToClientCommunicationsImpl.java index 572261c2c..a57560624 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/ServerToClientCommunicationsImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/support/packet/s2c/ServerToClientCommunicationsImpl.java @@ -11,6 +11,7 @@ import java.util.UUID; import javax.annotation.Nullable; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; import net.neoforged.neoforge.network.PacketDistributor; @@ -85,4 +86,9 @@ public void sendStorageInfoResponse(final ServerPlayer player, public void sendNetworkTransmitterStatus(final ServerPlayer player, final NetworkTransmitterStatus status) { sendToPlayer(player, new NetworkTransmitterStatusPacket(status.error(), status.message())); } + + @Override + public void sendNoPermission(final ServerPlayer player, final Component message) { + sendToPlayer(player, new NoPermissionPacket(message)); + } } From 66afd6ad25d0ad501920ba2c284ebd1edaf14baf Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 12:08:45 +0200 Subject: [PATCH 50/59] feat: open permission checking --- .../refinedstorage2/platform/api/PlatformApi.java | 4 ++++ .../platform/api/PlatformApiProxy.java | 7 +++++++ .../platform/api/security/SecurityHelper.java | 4 ++++ .../platform/common/PlatformApiImpl.java | 12 ++++++++++++ .../DestructorBlockEntity.java | 4 ++-- .../common/controller/ControllerBlockEntity.java | 4 ++-- .../common/detector/DetectorBlockEntity.java | 4 ++-- .../common/grid/AbstractGridBlockEntity.java | 4 ++-- .../platform/common/grid/WirelessGridItem.java | 10 ++++++++++ .../common/iface/InterfaceBlockEntity.java | 4 ++-- .../common/importer/ImporterBlockEntity.java | 4 ++-- .../networking/NetworkTransmitterBlockEntity.java | 4 ++-- .../common/security/BuiltinPermission.java | 4 ++-- .../security/SecurityManagerBlockEntity.java | 12 ++++++++++-- .../diskdrive/AbstractDiskDriveBlockEntity.java | 4 ++-- .../ExternalStorageBlockEntity.java | 4 ++-- .../AbstractStorageBlockBlockEntity.java | 4 ++-- .../storagemonitor/StorageMonitorBlockEntity.java | 4 ++-- .../common/support/AbstractBaseBlock.java | 14 +++++--------- .../containermenu/ExtendedMenuProvider.java | 4 ---- .../containermenu/NetworkNodeMenuProvider.java | 15 +++++++++++++++ ...dstoneModeNetworkNodeContainerBlockEntity.java | 5 +++++ ...SchedulingNetworkNodeContainerBlockEntity.java | 4 ++-- .../WirelessTransmitterBlockEntity.java | 4 ++-- .../assets/refinedstorage2/lang/en_us.json | 6 +++--- 25 files changed, 103 insertions(+), 46 deletions(-) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java index 49deeb845..be711d0c4 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java @@ -48,6 +48,8 @@ import java.util.Set; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -186,4 +188,6 @@ EnergyStorage asBlockItemEnergyStorage( PlatformRegistry getPermissionRegistry(); SecurityPolicy createDefaultSecurityPolicy(); + + void sendNoPermissionToOpenMessage(ServerPlayer player, Component target); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java index 353dc1963..8d44d79a9 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java @@ -49,6 +49,8 @@ import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -369,6 +371,11 @@ public SecurityPolicy createDefaultSecurityPolicy() { return ensureLoaded().createDefaultSecurityPolicy(); } + @Override + public void sendNoPermissionToOpenMessage(final ServerPlayer player, final Component target) { + ensureLoaded().sendNoPermissionToOpenMessage(player, target); + } + private PlatformApi ensureLoaded() { if (delegate == null) { throw new IllegalStateException("Platform API not loaded yet"); diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java index 1d5b35385..0c4ef5038 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/security/SecurityHelper.java @@ -15,6 +15,10 @@ public static boolean isAllowed(final ServerPlayer player, final Permission perm if (network == null) { return false; } + return isAllowed(player, permission, network); + } + + public static boolean isAllowed(final ServerPlayer player, final Permission permission, final Network network) { return network.getComponent(PlatformSecurityNetworkComponent.class).isAllowed(permission, player); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index ef30692da..77e25fb5e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -93,8 +93,10 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -104,6 +106,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.saveddata.SavedData; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + public class PlatformApiImpl implements PlatformApi { private final StorageRepository clientStorageRepository = new ClientStorageRepository(Platform.INSTANCE.getClientToServerCommunications()::sendStorageInfoRequest); @@ -529,4 +533,12 @@ public SecurityPolicy createDefaultSecurityPolicy() { .filter(PlatformPermission::isAllowedByDefault) .collect(Collectors.toSet())); } + + @Override + public void sendNoPermissionToOpenMessage(final ServerPlayer player, final Component target) { + Platform.INSTANCE.getServerToClientCommunications().sendNoPermission( + player, + createTranslation("misc", "no_permission.open", target) + ); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlockEntity.java index 87441fbdc..5f90c77bd 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlockEntity.java @@ -13,7 +13,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; import com.refinedmods.refinedstorage2.platform.common.support.FilterModeSettings; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractUpgradeableNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; import com.refinedmods.refinedstorage2.platform.common.upgrade.UpgradeDestinations; @@ -34,7 +34,7 @@ import net.minecraft.world.level.block.state.BlockState; public class DestructorBlockEntity extends AbstractUpgradeableNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider { + implements NetworkNodeMenuProvider { private static final String TAG_FILTER_MODE = "fim"; private static final String TAG_PICKUP_ITEMS = "pi"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockEntity.java index ca239b878..e7d99bc8c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockEntity.java @@ -7,7 +7,7 @@ import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.energy.BlockEntityEnergyStorage; import com.refinedmods.refinedstorage2.platform.common.support.energy.CreativeEnergyStorage; import com.refinedmods.refinedstorage2.platform.common.support.energy.ItemBlockEnergyStorage; @@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory; public class ControllerBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider, TransferableBlockEntityEnergy { + implements NetworkNodeMenuProvider, TransferableBlockEntityEnergy { private static final Logger LOGGER = LoggerFactory.getLogger(ControllerBlockEntity.class); private static final String TAG_CAPACITY = "capacity"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlockEntity.java index 680e685a0..87bf4875c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlockEntity.java @@ -13,7 +13,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.AbstractSingleAmountContainerMenu; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; @@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory; public class DetectorBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider { + implements NetworkNodeMenuProvider { private static final Logger LOGGER = LoggerFactory.getLogger(DetectorBlockEntity.class); private static final String TAG_AMOUNT = "amount"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java index a5d0b50e5..c81da5cc5 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java @@ -13,7 +13,7 @@ import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.support.resource.ResourceType; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import java.util.List; @@ -28,7 +28,7 @@ public abstract class AbstractGridBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements Grid, ExtendedMenuProvider { + implements Grid, NetworkNodeMenuProvider { protected AbstractGridBlockEntity(final BlockEntityType type, final BlockPos pos, final BlockState state, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridItem.java index 7aac3acad..e7124ff40 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGridItem.java @@ -4,10 +4,13 @@ import com.refinedmods.refinedstorage2.api.network.impl.energy.EnergyStorageImpl; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; +import com.refinedmods.refinedstorage2.platform.api.security.SecurityHelper; import com.refinedmods.refinedstorage2.platform.api.support.energy.AbstractNetworkBoundEnergyItem; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.NetworkBoundItemSession; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.SlotReference; import com.refinedmods.refinedstorage2.platform.common.Platform; +import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; +import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; @@ -33,6 +36,13 @@ public EnergyStorage createEnergyStorage(final ItemStack stack) { public void use(final ServerPlayer player, final SlotReference slotReference, final NetworkBoundItemSession session) { + final boolean isAllowed = session.resolveNetwork() + .map(network -> SecurityHelper.isAllowed(player, BuiltinPermission.OPEN, network)) + .orElse(true); // if the network can't be resolved that will be apparent later in the UI. + if (!isAllowed) { + PlatformApi.INSTANCE.sendNoPermissionToOpenMessage(player, ContentNames.WIRELESS_GRID); + return; + } final Grid grid = new WirelessGrid(session); Platform.INSTANCE.getMenuOpener().openMenu(player, new WirelessGridExtendedMenuProvider(grid, slotReference)); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlockEntity.java index 58f5a9965..c09b5ad03 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlockEntity.java @@ -12,7 +12,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.support.BlockEntityWithDrops; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; @@ -33,7 +33,7 @@ public class InterfaceBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider, BlockEntityWithDrops { + implements NetworkNodeMenuProvider, BlockEntityWithDrops { private static final String TAG_EXPORT_ITEMS = "ei"; private static final int EXPORT_SLOTS = 9; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlockEntity.java index 8db0e297c..20aedfa69 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlockEntity.java @@ -14,7 +14,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; import com.refinedmods.refinedstorage2.platform.common.support.FilterModeSettings; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractUpgradeableNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; import com.refinedmods.refinedstorage2.platform.common.upgrade.UpgradeDestinations; @@ -39,7 +39,7 @@ public class ImporterBlockEntity extends AbstractUpgradeableNetworkNodeContainerBlockEntity - implements AmountOverride, ExtendedMenuProvider { + implements AmountOverride, NetworkNodeMenuProvider { private static final Logger LOGGER = LoggerFactory.getLogger(ImporterBlockEntity.class); private static final String TAG_FILTER_MODE = "fim"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java index 45fd2e0aa..37ad5e2cf 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlockEntity.java @@ -9,7 +9,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.support.BlockEntityWithDrops; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import javax.annotation.Nullable; @@ -37,7 +37,7 @@ public class NetworkTransmitterBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider, BlockEntityWithDrops { + implements NetworkNodeMenuProvider, BlockEntityWithDrops { private static final Logger LOGGER = LoggerFactory.getLogger(NetworkTransmitterBlockEntity.class); private static final NetworkTransmitterStatus INACTIVE = NetworkTransmitterStatus.message( diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java index bd2d820a6..f796acbf6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/BuiltinPermission.java @@ -26,7 +26,7 @@ public enum BuiltinPermission implements PlatformPermission { /** * Whether the player can open network device GUIs. */ - MODIFY("modify"), + OPEN("open"), /** * Whether the player can add or remove network devices. */ @@ -40,7 +40,7 @@ public enum BuiltinPermission implements PlatformPermission { INSERT, EXTRACT, AUTOCRAFTING, - MODIFY, + OPEN, BUILD, SECURITY ); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java index d55590a8b..3c1a08176 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -2,13 +2,14 @@ import com.refinedmods.refinedstorage2.api.network.impl.node.security.SecurityDecisionProviderProxyNetworkNode; import com.refinedmods.refinedstorage2.api.network.impl.security.SecurityDecisionProviderImpl; +import com.refinedmods.refinedstorage2.platform.api.security.SecurityHelper; import com.refinedmods.refinedstorage2.platform.api.security.SecurityPolicyContainerItem; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.support.BlockEntityWithDrops; import com.refinedmods.refinedstorage2.platform.common.support.SimpleFilteredContainer; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.util.ContainerUtil; @@ -29,7 +30,7 @@ public class SecurityManagerBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements BlockEntityWithDrops, ExtendedMenuProvider { + implements BlockEntityWithDrops, NetworkNodeMenuProvider { static final int CARD_AMOUNT = 18; private static final String TAG_SECURITY_CARDS = "sc"; @@ -154,4 +155,11 @@ public Component getDisplayName() { public AbstractContainerMenu createMenu(final int syncId, final Inventory inventory, final Player player) { return new SecurityManagerContainerMenu(syncId, inventory, this); } + + @Override + public boolean isAllowed(final ServerPlayer player) { + final boolean isAllowedViaSecuritySystem = NetworkNodeMenuProvider.super.isAllowed(player) + && SecurityHelper.isAllowed(player, BuiltinPermission.SECURITY, getNode()); + return isAllowedViaSecuritySystem || isPlacedBy(player.getGameProfile().getId()); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/AbstractDiskDriveBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/AbstractDiskDriveBlockEntity.java index 964534919..872113d49 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/AbstractDiskDriveBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/AbstractDiskDriveBlockEntity.java @@ -12,7 +12,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; import com.refinedmods.refinedstorage2.platform.common.support.BlockEntityWithDrops; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; import com.refinedmods.refinedstorage2.platform.common.util.ContainerUtil; @@ -40,7 +40,7 @@ public abstract class AbstractDiskDriveBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements BlockEntityWithDrops, ExtendedMenuProvider { + implements BlockEntityWithDrops, NetworkNodeMenuProvider { public static final int AMOUNT_OF_DISKS = 8; private static final String TAG_DISK_INVENTORY = "inv"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlockEntity.java index b0fc937b0..d037b1834 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlockEntity.java @@ -8,7 +8,7 @@ import com.refinedmods.refinedstorage2.platform.common.storage.StorageConfigurationContainerImpl; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; @@ -31,7 +31,7 @@ public class ExternalStorageBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider { + implements NetworkNodeMenuProvider { private static final Logger LOGGER = LoggerFactory.getLogger(ExternalStorageBlockEntity.class); private static final String TAG_TRACKED_RESOURCES = "tr"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/AbstractStorageBlockBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/AbstractStorageBlockBlockEntity.java index 2415a1c8d..4063cd07a 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/AbstractStorageBlockBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/AbstractStorageBlockBlockEntity.java @@ -9,7 +9,7 @@ import com.refinedmods.refinedstorage2.platform.api.support.resource.ResourceFactory; import com.refinedmods.refinedstorage2.platform.common.storage.StorageConfigurationContainerImpl; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; @@ -29,7 +29,7 @@ abstract class AbstractStorageBlockBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider, ItemTransferableStorageBlockEntity { + implements NetworkNodeMenuProvider, ItemTransferableStorageBlockEntity { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractStorageBlockBlockEntity.class); private static final String TAG_STORAGE_ID = "sid"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java index e9b4fac46..316f0cd16 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storagemonitor/StorageMonitorBlockEntity.java @@ -15,7 +15,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; @@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory; public class StorageMonitorBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider { + implements NetworkNodeMenuProvider { private static final Logger LOGGER = LoggerFactory.getLogger(StorageMonitorBlockEntity.class); private static final String TAG_CLIENT_FILTER = "cf"; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java index 8d702e599..3f81b6e58 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java @@ -1,9 +1,10 @@ package com.refinedmods.refinedstorage2.platform.common.support; +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockColorMap; import com.refinedmods.refinedstorage2.platform.common.content.Sounds; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import java.util.Optional; import javax.annotation.Nullable; @@ -30,8 +31,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; -import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; - public abstract class AbstractBaseBlock extends Block { protected AbstractBaseBlock(final Properties properties) { super(properties); @@ -86,12 +85,9 @@ private Optional tryOpenScreen(final BlockState state, } private void tryOpenScreen(final ServerPlayer player, final MenuProvider menuProvider) { - if (menuProvider instanceof ExtendedMenuProvider extendedMenuProvider - && !extendedMenuProvider.isAllowed(player)) { - Platform.INSTANCE.getServerToClientCommunications().sendNoPermission( - player, - createTranslation("misc", "no_permission.cannot_modify", extendedMenuProvider.getDisplayName()) - ); + if (menuProvider instanceof NetworkNodeMenuProvider networkNodeMenuProvider + && !networkNodeMenuProvider.isAllowed(player)) { + PlatformApi.INSTANCE.sendNoPermissionToOpenMessage(player, menuProvider.getDisplayName()); return; } Platform.INSTANCE.getMenuOpener().openMenu(player, menuProvider); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java index b7a5810fe..95e91f4aa 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/ExtendedMenuProvider.java @@ -6,8 +6,4 @@ public interface ExtendedMenuProvider extends MenuProvider { void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf); - - default boolean isAllowed(ServerPlayer player) { - return true; - } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java new file mode 100644 index 000000000..bbac766b4 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java @@ -0,0 +1,15 @@ +package com.refinedmods.refinedstorage2.platform.common.support.containermenu; + +import com.refinedmods.refinedstorage2.api.network.node.NetworkNode; +import com.refinedmods.refinedstorage2.platform.api.security.SecurityHelper; +import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; + +import net.minecraft.server.level.ServerPlayer; + +public interface NetworkNodeMenuProvider extends ExtendedMenuProvider { + NetworkNode getNode(); + + default boolean isAllowed(final ServerPlayer player) { + return SecurityHelper.isAllowed(player, BuiltinPermission.OPEN, getNode()); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractRedstoneModeNetworkNodeContainerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractRedstoneModeNetworkNodeContainerBlockEntity.java index 565fe7567..d2d53be3e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractRedstoneModeNetworkNodeContainerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractRedstoneModeNetworkNodeContainerBlockEntity.java @@ -7,6 +7,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.RedstoneMode; import com.refinedmods.refinedstorage2.platform.common.support.RedstoneModeSettings; +import java.util.Objects; import java.util.UUID; import javax.annotation.Nullable; @@ -86,4 +87,8 @@ public void setPlacedBy(final UUID playerId) { protected final Player getFakePlayer(final ServerLevel serverLevel) { return Platform.INSTANCE.getFakePlayer(serverLevel, placedByPlayerId); } + + protected final boolean isPlacedBy(final UUID playerId) { + return Objects.equals(placedByPlayerId, playerId); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractSchedulingNetworkNodeContainerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractSchedulingNetworkNodeContainerBlockEntity.java index d89138423..6ca816d94 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractSchedulingNetworkNodeContainerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/network/AbstractSchedulingNetworkNodeContainerBlockEntity.java @@ -6,7 +6,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.FilterWithFuzzyMode; import com.refinedmods.refinedstorage2.platform.common.support.SchedulingMode; import com.refinedmods.refinedstorage2.platform.common.support.SchedulingModeType; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceContainerImpl; import com.refinedmods.refinedstorage2.platform.common.upgrade.UpgradeDestinations; @@ -22,7 +22,7 @@ public abstract class AbstractSchedulingNetworkNodeContainerBlockEntity extends AbstractUpgradeableNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider { + implements NetworkNodeMenuProvider { protected final FilterWithFuzzyMode filter; private final SchedulingMode schedulingMode; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlockEntity.java index 003611acc..387c76246 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlockEntity.java @@ -8,7 +8,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; -import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; import com.refinedmods.refinedstorage2.platform.common.support.network.AbstractRedstoneModeNetworkNodeContainerBlockEntity; import com.refinedmods.refinedstorage2.platform.common.upgrade.UpgradeContainer; import com.refinedmods.refinedstorage2.platform.common.upgrade.UpgradeDestinations; @@ -32,7 +32,7 @@ public class WirelessTransmitterBlockEntity extends AbstractRedstoneModeNetworkNodeContainerBlockEntity - implements ExtendedMenuProvider, WirelessTransmitter { + implements NetworkNodeMenuProvider, WirelessTransmitter { private static final String TAG_UPGRADES = "u"; private final UpgradeContainer upgradeContainer = new UpgradeContainer( diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 3a4088697..9daca589a 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -254,7 +254,7 @@ "misc.refinedstorage2.resource_type.fluid": "Fluid", "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", "misc.refinedstorage2.no_permission": "No permission", - "misc.refinedstorage2.no_permission.cannot_modify": "You are not allowed to modify the %s.", + "misc.refinedstorage2.no_permission.open": "You are not allowed to open the %s.", "key.refinedstorage2.focus_search_bar": "Focus search bar", "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", @@ -268,8 +268,8 @@ "permission.refinedstorage2.extract.description": "Whether the player can extract resources from a network.", "permission.refinedstorage2.autocrafting": "Autocrafting", "permission.refinedstorage2.autocrafting.description": "Whether the player can start, cancel or view an autocrafting task.", - "permission.refinedstorage2.modify": "Modify", - "permission.refinedstorage2.modify.description": "Whether the player can open network device GUIs.", + "permission.refinedstorage2.open": "Open", + "permission.refinedstorage2.open.description": "Whether the player can open network device GUIs.", "permission.refinedstorage2.build": "Build", "permission.refinedstorage2.build.description": "Whether the player can add or remove network devices.", "permission.refinedstorage2.security": "Security", From 411e2df6453bd9dd7d9c4949fe87114dcae5e4aa Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 12:59:53 +0200 Subject: [PATCH 51/59] feat: insert and extract permission checking --- .../platform/api/PlatformApi.java | 8 +-- .../platform/api/PlatformApiProxy.java | 11 ++-- .../platform/api/grid/Grid.java | 3 +- .../GridExtractionStrategyFactory.java | 4 +- .../GridInsertionStrategyFactory.java | 4 +- .../GridScrollingStrategyFactory.java | 4 +- .../platform/common/PlatformApiImpl.java | 16 +++--- .../common/grid/AbstractGridBlockEntity.java | 14 +++-- .../grid/AbstractGridContainerMenu.java | 12 ++--- .../common/grid/SecuredGridOperations.java | 54 +++++++++++++++++++ .../platform/common/grid/WirelessGrid.java | 23 ++++++-- .../storage/portablegrid/PortableGrid.java | 8 +-- .../assets/refinedstorage2/lang/en_us.json | 4 +- .../strategy/FluidGridExtractionStrategy.java | 7 ++- .../strategy/FluidGridInsertionStrategy.java | 6 +-- .../strategy/ItemGridExtractionStrategy.java | 7 ++- .../strategy/ItemGridInsertionStrategy.java | 7 ++- .../strategy/ItemGridScrollingStrategy.java | 7 ++- .../strategy/FluidGridExtractionStrategy.java | 7 ++- .../strategy/FluidGridInsertionStrategy.java | 7 ++- .../strategy/ItemGridExtractionStrategy.java | 7 ++- .../strategy/ItemGridInsertionStrategy.java | 7 ++- .../strategy/ItemGridScrollingStrategy.java | 7 ++- 23 files changed, 157 insertions(+), 77 deletions(-) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/SecuredGridOperations.java diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java index be711d0c4..23f8eb9ee 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java @@ -112,7 +112,7 @@ public interface PlatformApi { void requestNetworkNodeUpdate(PlatformNetworkNodeContainer container, Level level); GridInsertionStrategy createGridInsertionStrategy(AbstractContainerMenu containerMenu, - Player player, + ServerPlayer player, Grid grid); void addGridInsertionStrategyFactory(GridInsertionStrategyFactory insertionStrategyFactory); @@ -122,13 +122,13 @@ GridInsertionStrategy createGridInsertionStrategy(AbstractContainerMenu containe GridInsertionHints getGridInsertionHints(); GridExtractionStrategy createGridExtractionStrategy(AbstractContainerMenu containerMenu, - Player player, + ServerPlayer player, Grid grid); void addGridExtractionStrategyFactory(GridExtractionStrategyFactory extractionStrategyFactory); GridScrollingStrategy createGridScrollingStrategy(AbstractContainerMenu containerMenu, - Player player, + ServerPlayer player, Grid grid); void addGridScrollingStrategyFactory(GridScrollingStrategyFactory scrollingStrategyFactory); @@ -190,4 +190,6 @@ EnergyStorage asBlockItemEnergyStorage( SecurityPolicy createDefaultSecurityPolicy(); void sendNoPermissionToOpenMessage(ServerPlayer player, Component target); + + void sendNoPermissionMessage(ServerPlayer player, Component message); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java index 8d44d79a9..d7fb73e03 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java @@ -194,7 +194,7 @@ public void requestNetworkNodeUpdate(final PlatformNetworkNodeContainer containe @Override public GridInsertionStrategy createGridInsertionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { return ensureLoaded().createGridInsertionStrategy(containerMenu, player, grid); } @@ -216,7 +216,7 @@ public GridInsertionHints getGridInsertionHints() { @Override public GridExtractionStrategy createGridExtractionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { return ensureLoaded().createGridExtractionStrategy(containerMenu, player, grid); } @@ -228,7 +228,7 @@ public void addGridExtractionStrategyFactory(final GridExtractionStrategyFactory @Override public GridScrollingStrategy createGridScrollingStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { return ensureLoaded().createGridScrollingStrategy(containerMenu, player, grid); } @@ -376,6 +376,11 @@ public void sendNoPermissionToOpenMessage(final ServerPlayer player, final Compo ensureLoaded().sendNoPermissionToOpenMessage(player, target); } + @Override + public void sendNoPermissionMessage(final ServerPlayer player, final Component message) { + ensureLoaded().sendNoPermissionMessage(player, message); + } + private PlatformApi ensureLoaded() { if (delegate == null) { throw new IllegalStateException("Platform API not loaded yet"); diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/Grid.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/Grid.java index c07944903..79a2b36b3 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/Grid.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/Grid.java @@ -9,6 +9,7 @@ import java.util.List; +import net.minecraft.server.level.ServerPlayer; import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.0") @@ -23,5 +24,5 @@ public interface Grid { List getResources(Class actorType); - GridOperations createOperations(ResourceType resourceType, Actor actor); + GridOperations createOperations(ResourceType resourceType, ServerPlayer player); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridExtractionStrategyFactory.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridExtractionStrategyFactory.java index 5ed2926fd..5b5a5340a 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridExtractionStrategyFactory.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridExtractionStrategyFactory.java @@ -2,12 +2,12 @@ import com.refinedmods.refinedstorage2.platform.api.grid.Grid; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.2.6") @FunctionalInterface public interface GridExtractionStrategyFactory { - GridExtractionStrategy create(AbstractContainerMenu containerMenu, Player player, Grid grid); + GridExtractionStrategy create(AbstractContainerMenu containerMenu, ServerPlayer player, Grid grid); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridInsertionStrategyFactory.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridInsertionStrategyFactory.java index 05594da03..fe11f125a 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridInsertionStrategyFactory.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridInsertionStrategyFactory.java @@ -2,12 +2,12 @@ import com.refinedmods.refinedstorage2.platform.api.grid.Grid; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.2.6") @FunctionalInterface public interface GridInsertionStrategyFactory { - GridInsertionStrategy create(AbstractContainerMenu containerMenu, Player player, Grid grid); + GridInsertionStrategy create(AbstractContainerMenu containerMenu, ServerPlayer player, Grid grid); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridScrollingStrategyFactory.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridScrollingStrategyFactory.java index e3638940c..f67268b0d 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridScrollingStrategyFactory.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/grid/strategy/GridScrollingStrategyFactory.java @@ -2,12 +2,12 @@ import com.refinedmods.refinedstorage2.platform.api.grid.Grid; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.2.6") @FunctionalInterface public interface GridScrollingStrategyFactory { - GridScrollingStrategy create(AbstractContainerMenu containerMenu, Player player, Grid grid); + GridScrollingStrategy create(AbstractContainerMenu containerMenu, ServerPlayer player, Grid grid); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index 77e25fb5e..a46342c58 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -323,7 +323,7 @@ public void requestNetworkNodeUpdate(final PlatformNetworkNodeContainer containe @Override public GridInsertionStrategy createGridInsertionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { return new CompositeGridInsertionStrategy( Platform.INSTANCE.getDefaultGridInsertionStrategyFactory().create( @@ -356,7 +356,7 @@ public GridInsertionHints getGridInsertionHints() { @Override public GridExtractionStrategy createGridExtractionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { final List strategies = gridExtractionStrategyFactories .stream() @@ -372,7 +372,7 @@ public void addGridExtractionStrategyFactory(final GridExtractionStrategyFactory @Override public GridScrollingStrategy createGridScrollingStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { final List strategies = gridScrollingStrategyFactories .stream() @@ -536,9 +536,11 @@ public SecurityPolicy createDefaultSecurityPolicy() { @Override public void sendNoPermissionToOpenMessage(final ServerPlayer player, final Component target) { - Platform.INSTANCE.getServerToClientCommunications().sendNoPermission( - player, - createTranslation("misc", "no_permission.open", target) - ); + sendNoPermissionMessage(player, createTranslation("misc", "no_permission.open", target)); + } + + @Override + public void sendNoPermissionMessage(final ServerPlayer player, final Component message) { + Platform.INSTANCE.getServerToClientCommunications().sendNoPermission(player, message); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java index c81da5cc5..ba9054fae 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridBlockEntity.java @@ -2,6 +2,7 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage2.api.grid.watcher.GridWatcher; +import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.api.network.impl.node.container.NetworkNodeContainerPriorities; import com.refinedmods.refinedstorage2.api.network.impl.node.grid.GridNetworkNode; import com.refinedmods.refinedstorage2.api.network.storage.StorageNetworkComponent; @@ -11,6 +12,8 @@ import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformSecurityNetworkComponent; +import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.ResourceType; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.NetworkNodeMenuProvider; @@ -49,11 +52,12 @@ public List getResources(final Class act } @Override - public GridOperations createOperations(final ResourceType resourceType, - final Actor actor) { - final StorageChannel storageChannel = requireNonNull(getNode().getNetwork()) - .getComponent(StorageNetworkComponent.class); - return resourceType.createGridOperations(storageChannel, actor); + public GridOperations createOperations(final ResourceType resourceType, final ServerPlayer player) { + final Network network = requireNonNull(getNode().getNetwork()); + final StorageChannel storageChannel = network.getComponent(StorageNetworkComponent.class); + final PlatformSecurityNetworkComponent security = network.getComponent(PlatformSecurityNetworkComponent.class); + final GridOperations operations = resourceType.createGridOperations(storageChannel, new PlayerActor(player)); + return new SecuredGridOperations(player, security, operations); } @Override diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java index 589653507..e3c5d027b 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/AbstractGridContainerMenu.java @@ -142,7 +142,7 @@ protected AbstractGridContainerMenu( this.grid.addWatcher(this, PlayerActor.class); this.synchronizer = NoopGridSynchronizer.INSTANCE; - initStrategies(); + initStrategies((ServerPlayer) playerInventory.player); } private Predicate filterStorageChannel() { @@ -274,25 +274,25 @@ public void onChanged( @Override public void invalidate() { if (playerInventory.player instanceof ServerPlayer serverPlayer) { - initStrategies(); + initStrategies(serverPlayer); Platform.INSTANCE.getServerToClientCommunications().sendGridClear(serverPlayer); } } - private void initStrategies() { + private void initStrategies(final ServerPlayer player) { this.insertionStrategy = PlatformApi.INSTANCE.createGridInsertionStrategy( this, - playerInventory.player, + player, requireNonNull(grid) ); this.extractionStrategy = PlatformApi.INSTANCE.createGridExtractionStrategy( this, - playerInventory.player, + player, requireNonNull(grid) ); this.scrollingStrategy = PlatformApi.INSTANCE.createGridScrollingStrategy( this, - playerInventory.player, + player, requireNonNull(grid) ); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/SecuredGridOperations.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/SecuredGridOperations.java new file mode 100644 index 000000000..b46dc4735 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/SecuredGridOperations.java @@ -0,0 +1,54 @@ +package com.refinedmods.refinedstorage2.platform.common.grid; + +import com.refinedmods.refinedstorage2.api.grid.operations.GridExtractMode; +import com.refinedmods.refinedstorage2.api.grid.operations.GridInsertMode; +import com.refinedmods.refinedstorage2.api.grid.operations.GridOperations; +import com.refinedmods.refinedstorage2.api.resource.ResourceKey; +import com.refinedmods.refinedstorage2.api.storage.ExtractableStorage; +import com.refinedmods.refinedstorage2.api.storage.InsertableStorage; +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformSecurityNetworkComponent; +import com.refinedmods.refinedstorage2.platform.common.security.BuiltinPermission; + +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerPlayer; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public class SecuredGridOperations implements GridOperations { + private static final MutableComponent CANNOT_EXTRACT_MESSAGE = createTranslation("misc", "no_permission.extract"); + private static final MutableComponent CANNOT_INSERT_MESSAGE = createTranslation("misc", "no_permission.insert"); + + private final ServerPlayer player; + private final PlatformSecurityNetworkComponent securityNetworkComponent; + private final GridOperations delegate; + + public SecuredGridOperations(final ServerPlayer player, + final PlatformSecurityNetworkComponent securityNetworkComponent, + final GridOperations delegate) { + this.player = player; + this.securityNetworkComponent = securityNetworkComponent; + this.delegate = delegate; + } + + @Override + public boolean extract(final ResourceKey resource, + final GridExtractMode extractMode, + final InsertableStorage destination) { + if (!securityNetworkComponent.isAllowed(BuiltinPermission.EXTRACT, player)) { + PlatformApi.INSTANCE.sendNoPermissionMessage(player, CANNOT_EXTRACT_MESSAGE); + return false; + } + return delegate.extract(resource, extractMode, destination); + } + + @Override + public boolean insert(final ResourceKey resource, final GridInsertMode insertMode, + final ExtractableStorage source) { + if (!securityNetworkComponent.isAllowed(BuiltinPermission.INSERT, player)) { + PlatformApi.INSTANCE.sendNoPermissionMessage(player, CANNOT_INSERT_MESSAGE); + return false; + } + return delegate.insert(resource, insertMode, source); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java index c9a66bada..54df1fd18 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/WirelessGrid.java @@ -12,6 +12,8 @@ import com.refinedmods.refinedstorage2.api.storage.Storage; import com.refinedmods.refinedstorage2.api.storage.TrackedResourceAmount; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformSecurityNetworkComponent; +import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.network.bounditem.NetworkBoundItemSession; import com.refinedmods.refinedstorage2.platform.api.support.resource.ResourceType; import com.refinedmods.refinedstorage2.platform.common.Platform; @@ -20,6 +22,8 @@ import java.util.List; import java.util.Optional; +import net.minecraft.server.level.ServerPlayer; + class WirelessGrid implements Grid { private final NetworkBoundItemSession session; private final GridWatcherManager watchers = new GridWatcherManagerImpl(); @@ -32,6 +36,10 @@ private Optional getStorage() { return session.resolveNetwork().map(network -> network.getComponent(StorageNetworkComponent.class)); } + private Optional getSecurity() { + return session.resolveNetwork().map(network -> network.getComponent(PlatformSecurityNetworkComponent.class)); + } + @Override public void addWatcher(final GridWatcher watcher, final Class actorType) { session.drainEnergy(Platform.INSTANCE.getConfig().getWirelessGrid().getOpenEnergyUsage()); @@ -69,11 +77,20 @@ public List getResources(final Class act } @Override - public GridOperations createOperations(final ResourceType resourceType, - final Actor actor) { + public GridOperations createOperations(final ResourceType resourceType, final ServerPlayer player) { return getStorage() - .map(storageChannel -> resourceType.createGridOperations(storageChannel, actor)) + .flatMap(storageChannel -> + getSecurity().map(security -> createGridOperations(resourceType, player, storageChannel, security))) .map(gridOperations -> (GridOperations) new WirelessGridOperations(gridOperations, session, watchers)) .orElseGet(NoopGridOperations::new); } + + private GridOperations createGridOperations(final ResourceType resourceType, + final ServerPlayer player, + final StorageNetworkComponent storageChannel, + final PlatformSecurityNetworkComponent securityNetworkComponent) { + final PlayerActor playerActor = new PlayerActor(player); + final GridOperations operations = resourceType.createGridOperations(storageChannel, playerActor); + return new SecuredGridOperations(player, securityNetworkComponent, operations); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGrid.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGrid.java index 9b0fbd3d0..a32eb89e6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGrid.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/portablegrid/PortableGrid.java @@ -15,6 +15,7 @@ import com.refinedmods.refinedstorage2.api.storage.TrackedResourceAmount; import com.refinedmods.refinedstorage2.api.storage.channel.StorageChannel; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; +import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.ResourceType; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.storage.DiskInventory; @@ -23,6 +24,8 @@ import java.util.List; import javax.annotation.Nullable; +import net.minecraft.server.level.ServerPlayer; + class PortableGrid implements Grid { private final EnergyStorage energyStorage; private final DiskInventory diskInventory; @@ -108,13 +111,12 @@ public List getResources(final Class act } @Override - public GridOperations createOperations(final ResourceType resourceType, - final Actor actor) { + public GridOperations createOperations(final ResourceType resourceType, final ServerPlayer player) { if (storage == null) { return new NoopGridOperations(); } final StorageChannel storageChannel = this.storage.getStorageChannel(); - final GridOperations operations = resourceType.createGridOperations(storageChannel, actor); + final GridOperations operations = resourceType.createGridOperations(storageChannel, new PlayerActor(player)); return new PortableGridOperations(operations, energyStorage); } } diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 9daca589a..a1bb0897d 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -61,7 +61,7 @@ "gui.refinedstorage2.grid.synchronizer.rei": "REI", "gui.refinedstorage2.grid.synchronizer.rei.help": "Sync the search box text to the REI filter.", "gui.refinedstorage2.grid.synchronizer.rei.two_way": "REI two-way", - "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the JEI filter, and the JEI filter to the search box text.", + "gui.refinedstorage2.grid.synchronizer.rei.two_way.help": "Sync the search box text to the REI filter, and the REI filter to the search box text.", "gui.refinedstorage2.grid.resource_type": "Resource type", "gui.refinedstorage2.grid.resource_type.all": "All", "gui.refinedstorage2.grid.resource_type.help": "Filter specific resource types.", @@ -255,6 +255,8 @@ "misc.refinedstorage2.press_shift_for_help": "Press SHIFT for help", "misc.refinedstorage2.no_permission": "No permission", "misc.refinedstorage2.no_permission.open": "You are not allowed to open the %s.", + "misc.refinedstorage2.no_permission.insert": "You are not allowed to insert.", + "misc.refinedstorage2.no_permission.extract": "You are not allowed to extract.", "key.refinedstorage2.focus_search_bar": "Focus search bar", "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridExtractionStrategy.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridExtractionStrategy.java index ea2616144..9b3e480d5 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridExtractionStrategy.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridExtractionStrategy.java @@ -7,7 +7,6 @@ import com.refinedmods.refinedstorage2.api.storage.Storage; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridExtractionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.support.resource.FluidResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; @@ -20,7 +19,7 @@ import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; import net.fabricmc.fabric.api.transfer.v1.item.PlayerInventoryStorage; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Items; @@ -36,9 +35,9 @@ public class FluidGridExtractionStrategy implements GridExtractionStrategy { private final Storage itemStorage; public FluidGridExtractionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { - this.gridOperations = grid.createOperations(ResourceTypes.FLUID, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.FLUID, player); this.playerInventoryStorage = PlayerInventoryStorage.of(player.getInventory()); this.playerCursorStorage = PlayerInventoryStorage.getCursorStorage(containerMenu); this.itemStorage = grid.getItemStorage(); diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridInsertionStrategy.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridInsertionStrategy.java index a02c50bcb..cb2f79d4e 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridInsertionStrategy.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/FluidGridInsertionStrategy.java @@ -5,7 +5,6 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridInsertionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.common.support.resource.FluidResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; @@ -20,6 +19,7 @@ import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil; import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleSlotStorage; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -33,10 +33,10 @@ public class FluidGridInsertionStrategy implements GridInsertionStrategy { private final PlayerInventoryStorage playerInventoryStorage; public FluidGridInsertionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { this.containerMenu = containerMenu; - this.gridOperations = grid.createOperations(ResourceTypes.FLUID, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.FLUID, player); this.player = player; this.playerInventoryStorage = PlayerInventoryStorage.of(player.getInventory()); } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridExtractionStrategy.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridExtractionStrategy.java index b40f135fa..2582951e6 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridExtractionStrategy.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridExtractionStrategy.java @@ -5,7 +5,6 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridExtractionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; @@ -15,7 +14,7 @@ import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleSlotStorage; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import static com.refinedmods.refinedstorage2.platform.fabric.support.resource.VariantUtil.toItemVariant; @@ -26,9 +25,9 @@ public class ItemGridExtractionStrategy implements GridExtractionStrategy { private final SingleSlotStorage playerCursorStorage; public ItemGridExtractionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { - this.gridOperations = grid.createOperations(ResourceTypes.ITEM, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.ITEM, player); this.playerInventoryStorage = PlayerInventoryStorage.of(player.getInventory()); this.playerCursorStorage = PlayerInventoryStorage.getCursorStorage(containerMenu); } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridInsertionStrategy.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridInsertionStrategy.java index 1632bea91..77fad8db0 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridInsertionStrategy.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridInsertionStrategy.java @@ -5,7 +5,6 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridInsertionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; @@ -15,7 +14,7 @@ import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil; import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleSlotStorage; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -29,10 +28,10 @@ public class ItemGridInsertionStrategy implements GridInsertionStrategy { private final SingleSlotStorage playerCursorStorage; public ItemGridInsertionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { this.containerMenu = containerMenu; - this.gridOperations = grid.createOperations(ResourceTypes.ITEM, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.ITEM, player); this.playerCursorStorage = PlayerInventoryStorage.getCursorStorage(containerMenu); } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridScrollingStrategy.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridScrollingStrategy.java index 7d51b15b0..fd82958dd 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridScrollingStrategy.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/grid/strategy/ItemGridScrollingStrategy.java @@ -7,7 +7,6 @@ import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.GridScrollMode; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridScrollingStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; @@ -17,7 +16,7 @@ import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleSlotStorage; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import static com.refinedmods.refinedstorage2.platform.fabric.support.resource.VariantUtil.toItemVariant; @@ -28,9 +27,9 @@ public class ItemGridScrollingStrategy implements GridScrollingStrategy { private final SingleSlotStorage playerCursorStorage; public ItemGridScrollingStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { - this.gridOperations = grid.createOperations(ResourceTypes.ITEM, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.ITEM, player); this.playerInventoryStorage = PlayerInventoryStorage.of(player.getInventory()); this.playerCursorStorage = PlayerInventoryStorage.getCursorStorage(containerMenu); } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridExtractionStrategy.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridExtractionStrategy.java index 0e716b99a..dfcea5ddd 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridExtractionStrategy.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridExtractionStrategy.java @@ -8,7 +8,6 @@ import com.refinedmods.refinedstorage2.api.storage.Storage; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridExtractionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.support.resource.FluidResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; @@ -16,7 +15,7 @@ import javax.annotation.Nullable; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -38,10 +37,10 @@ public class FluidGridExtractionStrategy implements GridExtractionStrategy { private final Storage itemStorage; public FluidGridExtractionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { this.menu = containerMenu; - this.gridOperations = grid.createOperations(ResourceTypes.FLUID, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.FLUID, player); this.playerInventoryStorage = new PlayerMainInvWrapper(player.getInventory()); this.itemStorage = grid.getItemStorage(); } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridInsertionStrategy.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridInsertionStrategy.java index 65bd05106..a63e81e68 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridInsertionStrategy.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/FluidGridInsertionStrategy.java @@ -5,13 +5,12 @@ import com.refinedmods.refinedstorage2.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridInsertionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.common.support.resource.FluidResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; import javax.annotation.Nullable; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.capabilities.Capabilities; @@ -26,9 +25,9 @@ public class FluidGridInsertionStrategy implements GridInsertionStrategy { private final AbstractContainerMenu menu; private final GridOperations gridOperations; - public FluidGridInsertionStrategy(final AbstractContainerMenu menu, final Player player, final Grid grid) { + public FluidGridInsertionStrategy(final AbstractContainerMenu menu, final ServerPlayer player, final Grid grid) { this.menu = menu; - this.gridOperations = grid.createOperations(ResourceTypes.FLUID, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.FLUID, player); } @Override diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridExtractionStrategy.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridExtractionStrategy.java index fc691d78a..f1d24744b 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridExtractionStrategy.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridExtractionStrategy.java @@ -5,14 +5,13 @@ import com.refinedmods.refinedstorage2.platform.api.exporter.AmountOverride; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridExtractionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; import com.refinedmods.refinedstorage2.platform.forge.storage.CapabilityCache; import com.refinedmods.refinedstorage2.platform.forge.storage.ItemHandlerInsertableStorage; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.PlayerMainInvWrapper; @@ -23,9 +22,9 @@ public class ItemGridExtractionStrategy implements GridExtractionStrategy { private final CursorItemHandler playerCursorItemHandler; public ItemGridExtractionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { - this.gridOperations = grid.createOperations(ResourceTypes.ITEM, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.ITEM, player); this.playerInventoryStorage = new PlayerMainInvWrapper(player.getInventory()); this.playerCursorItemHandler = new CursorItemHandler(containerMenu); } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridInsertionStrategy.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridInsertionStrategy.java index 732d2adee..326f7836d 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridInsertionStrategy.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridInsertionStrategy.java @@ -5,13 +5,12 @@ import com.refinedmods.refinedstorage2.platform.api.exporter.AmountOverride; import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridInsertionStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; import com.refinedmods.refinedstorage2.platform.forge.storage.CapabilityCache; import com.refinedmods.refinedstorage2.platform.forge.storage.ItemHandlerExtractableStorage; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -26,10 +25,10 @@ public class ItemGridInsertionStrategy implements GridInsertionStrategy { private final CursorItemHandler playerCursorItemHandler; public ItemGridInsertionStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { this.containerMenu = containerMenu; - this.gridOperations = grid.createOperations(ResourceTypes.ITEM, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.ITEM, player); this.playerCursorItemHandler = new CursorItemHandler(containerMenu); } diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridScrollingStrategy.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridScrollingStrategy.java index 2b5b88169..8093f7982 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridScrollingStrategy.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/grid/strategy/ItemGridScrollingStrategy.java @@ -7,7 +7,6 @@ import com.refinedmods.refinedstorage2.platform.api.grid.Grid; import com.refinedmods.refinedstorage2.platform.api.grid.GridScrollMode; import com.refinedmods.refinedstorage2.platform.api.grid.strategy.GridScrollingStrategy; -import com.refinedmods.refinedstorage2.platform.api.storage.PlayerActor; import com.refinedmods.refinedstorage2.platform.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage2.platform.common.support.resource.ItemResource; import com.refinedmods.refinedstorage2.platform.common.support.resource.ResourceTypes; @@ -15,8 +14,8 @@ import com.refinedmods.refinedstorage2.platform.forge.storage.ItemHandlerExtractableStorage; import com.refinedmods.refinedstorage2.platform.forge.storage.ItemHandlerInsertableStorage; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.wrapper.InvWrapper; @@ -30,9 +29,9 @@ public class ItemGridScrollingStrategy implements GridScrollingStrategy { private final CursorItemHandler playerCursorItemHandler; public ItemGridScrollingStrategy(final AbstractContainerMenu containerMenu, - final Player player, + final ServerPlayer player, final Grid grid) { - this.gridOperations = grid.createOperations(ResourceTypes.ITEM, new PlayerActor(player)); + this.gridOperations = grid.createOperations(ResourceTypes.ITEM, player); this.playerInventory = player.getInventory(); this.playerInventoryStorage = new PlayerMainInvWrapper(playerInventory); this.playerCursorItemHandler = new CursorItemHandler(containerMenu); From 43eae90f68bd23fc467f5065d80b8fd34ad96247 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 15:13:18 +0200 Subject: [PATCH 52/59] feat: build permission checking --- .../platform/api/PlatformApi.java | 4 ++ .../platform/api/PlatformApiProxy.java | 10 +++ .../network/PlatformNetworkNodeContainer.java | 7 ++ .../common/AbstractModInitializer.java | 9 +-- .../platform/common/PlatformApiImpl.java | 37 ++++++++++ .../ConstructorBlock.java | 14 ++-- .../DestructorBlock.java | 14 ++-- .../platform/common/content/Blocks.java | 54 +++++++-------- .../platform/common/content/Items.java | 68 +++++++++---------- .../controller/AbstractControllerBlock.java | 2 +- .../common/controller/ControllerBlock.java | 2 +- .../controller/ControllerBlockItem.java | 22 ++++-- .../controller/CreativeControllerBlock.java | 2 +- .../CreativeControllerBlockItem.java | 9 ++- .../common/detector/DetectorBlock.java | 14 ++-- .../common/exporter/ExporterBlock.java | 12 ++-- .../common/grid/CraftingGridBlock.java | 14 ++-- .../platform/common/grid/GridBlock.java | 14 ++-- .../platform/common/iface/InterfaceBlock.java | 4 +- .../common/importer/ImporterBlock.java | 12 ++-- .../common/networking/CableBlock.java | 12 +++- .../networking/NetworkReceiverBlock.java | 10 ++- .../networking/NetworkTransmitterBlock.java | 10 ++- .../common/security/SecurityManagerBlock.java | 12 ++-- .../security/SecurityManagerBlockEntity.java | 9 ++- .../storage/diskdrive/DiskDriveBlock.java | 4 +- .../externalstorage/ExternalStorageBlock.java | 12 ++-- .../common/support/AbstractBaseBlock.java | 2 +- .../common/support/AbstractColoredBlock.java | 10 +-- ...NamedBlockItem.java => BaseBlockItem.java} | 25 ++++--- .../common/support/NetworkNodeBlockItem.java | 39 +++++++++++ .../common/support/SimpleBlockItem.java | 35 ---------- .../NetworkNodeMenuProvider.java | 2 +- .../WirelessTransmitterBlock.java | 12 ++-- .../assets/refinedstorage2/lang/en_us.json | 2 + .../platform/fabric/ModInitializerImpl.java | 7 ++ ...NetworkNodeBreakSecurityEventListener.java | 36 ++++++++++ .../fabric/security/package-info.java | 7 ++ .../platform/forge/ModInitializer.java | 19 ++++++ .../datagen/tag/ItemTagsProviderImpl.java | 4 +- 40 files changed, 377 insertions(+), 216 deletions(-) rename refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/{NamedBlockItem.java => BaseBlockItem.java} (63%) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java delete mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleBlockItem.java create mode 100644 refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java create mode 100644 refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/package-info.java diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java index 23f8eb9ee..a0414004d 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApi.java @@ -47,6 +47,7 @@ import java.util.Optional; import java.util.Set; +import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -57,6 +58,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.1.0") @@ -192,4 +194,6 @@ EnergyStorage asBlockItemEnergyStorage( void sendNoPermissionToOpenMessage(ServerPlayer player, Component target); void sendNoPermissionMessage(ServerPlayer player, Component message); + + boolean canPlaceNetworkNode(ServerPlayer player, Level level, BlockPos pos, BlockState state); } diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java index d7fb73e03..d67c643f9 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/PlatformApiProxy.java @@ -48,6 +48,7 @@ import java.util.Set; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -58,6 +59,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; public class PlatformApiProxy implements PlatformApi { @Nullable @@ -381,6 +383,14 @@ public void sendNoPermissionMessage(final ServerPlayer player, final Component m ensureLoaded().sendNoPermissionMessage(player, message); } + @Override + public boolean canPlaceNetworkNode(final ServerPlayer player, + final Level level, + final BlockPos pos, + final BlockState state) { + return ensureLoaded().canPlaceNetworkNode(player, level, pos, state); + } + private PlatformApi ensureLoaded() { if (delegate == null) { throw new IllegalStateException("Platform API not loaded yet"); diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java index ec7d815c7..f8ec77341 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java @@ -1,9 +1,12 @@ package com.refinedmods.refinedstorage2.platform.api.support.network; import com.refinedmods.refinedstorage2.api.network.node.container.NetworkNodeContainer; +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.security.SecurityHelper; import net.minecraft.core.Direction; import net.minecraft.core.GlobalPos; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import org.apiguardian.api.API; @@ -39,4 +42,8 @@ public interface PlatformNetworkNodeContainer extends NetworkNodeContainer { GlobalPos getContainerPosition(); boolean isContainerRemoved(); + + default boolean canBreak(final ServerPlayer player) { + return SecurityHelper.isAllowed(player, PlatformApi.INSTANCE.getBuiltinPermissions().build(), getNode()); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index f4487e21f..4d6966ae8 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -93,8 +93,9 @@ import com.refinedmods.refinedstorage2.platform.common.storagemonitor.StorageMonitorBlock; import com.refinedmods.refinedstorage2.platform.common.storagemonitor.StorageMonitorBlockEntity; import com.refinedmods.refinedstorage2.platform.common.storagemonitor.StorageMonitorContainerMenu; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.SimpleBlock; -import com.refinedmods.refinedstorage2.platform.common.support.SimpleBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.SimpleItem; import com.refinedmods.refinedstorage2.platform.common.support.energy.EnergyLootItemFunction; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeContainerBlockEntityImpl; @@ -354,15 +355,15 @@ private void registerSimpleItems(final RegistryCallback callback) { Items.INSTANCE.setQuartzEnrichedIron(callback.register(QUARTZ_ENRICHED_IRON, SimpleItem::new)); callback.register( QUARTZ_ENRICHED_IRON_BLOCK, - () -> new SimpleBlockItem(Blocks.INSTANCE.getQuartzEnrichedIronBlock()) + () -> new BaseBlockItem(Blocks.INSTANCE.getQuartzEnrichedIronBlock()) ); Items.INSTANCE.setSilicon(callback.register(SILICON, SimpleItem::new)); Items.INSTANCE.setProcessorBinding(callback.register(PROCESSOR_BINDING, SimpleItem::new)); callback.register(DISK_DRIVE, () -> Blocks.INSTANCE.getDiskDrive().createBlockItem()); Items.INSTANCE.setWrench(callback.register(WRENCH, WrenchItem::new)); Items.INSTANCE.setStorageHousing(callback.register(STORAGE_HOUSING, SimpleItem::new)); - callback.register(MACHINE_CASING, () -> new SimpleBlockItem(Blocks.INSTANCE.getMachineCasing())); - callback.register(STORAGE_MONITOR, () -> new SimpleBlockItem(Blocks.INSTANCE.getStorageMonitor())); + callback.register(MACHINE_CASING, () -> new BaseBlockItem(Blocks.INSTANCE.getMachineCasing())); + callback.register(STORAGE_MONITOR, () -> new NetworkNodeBlockItem(Blocks.INSTANCE.getStorageMonitor())); callback.register(INTERFACE, () -> Blocks.INSTANCE.getInterface().createBlockItem()); Items.INSTANCE.setConstructionCore(callback.register(CONSTRUCTION_CORE, SimpleItem::new)); Items.INSTANCE.setDestructionCore(callback.register(DESTRUCTION_CORE, SimpleItem::new)); diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index a46342c58..9aa8f1a21 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -27,6 +27,7 @@ import com.refinedmods.refinedstorage2.platform.api.recipemod.IngredientConverter; import com.refinedmods.refinedstorage2.platform.api.security.BuiltinPermissions; import com.refinedmods.refinedstorage2.platform.api.security.PlatformPermission; +import com.refinedmods.refinedstorage2.platform.api.security.PlatformSecurityNetworkComponent; import com.refinedmods.refinedstorage2.platform.api.storage.StorageContainerItemHelper; import com.refinedmods.refinedstorage2.platform.api.storage.StorageRepository; import com.refinedmods.refinedstorage2.platform.api.storage.StorageType; @@ -91,6 +92,8 @@ import java.util.Set; import java.util.stream.Collectors; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -103,7 +106,9 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.saveddata.SavedData; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; @@ -543,4 +548,36 @@ public void sendNoPermissionToOpenMessage(final ServerPlayer player, final Compo public void sendNoPermissionMessage(final ServerPlayer player, final Component message) { Platform.INSTANCE.getServerToClientCommunications().sendNoPermission(player, message); } + + @Override + public boolean canPlaceNetworkNode(final ServerPlayer player, + final Level level, + final BlockPos pos, + final BlockState state) { + for (final Direction direction : Direction.values()) { + final BlockPos adjacentPos = pos.relative(direction); + final BlockEntity adjacentBlockEntity = level.getBlockEntity(adjacentPos); + if (!(adjacentBlockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer)) { + continue; + } + if (!platformNetworkNodeContainer.canAcceptIncomingConnection(direction.getOpposite(), state)) { + continue; + } + final Network network = platformNetworkNodeContainer.getNode().getNetwork(); + if (network == null) { + continue; + } + final PlatformSecurityNetworkComponent security = network.getComponent( + PlatformSecurityNetworkComponent.class + ); + if (!security.isAllowed(BuiltinPermission.BUILD, player)) { + PlatformApi.INSTANCE.sendNoPermissionMessage( + player, + createTranslation("misc", "no_permission.build.place", state.getBlock().getName()) + ); + return false; + } + } + return true; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ConstructorBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ConstructorBlock.java index e8c9ea21f..751fa6880 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ConstructorBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/ConstructorBlock.java @@ -3,8 +3,9 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockColorMap; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.Blocks; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import javax.annotation.Nullable; @@ -13,15 +14,14 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class ConstructorBlock extends AbstractConstructorDestructorBlock< - ConstructorBlock, ConstructorBlockEntity, NamedBlockItem - > implements BlockItemProvider { + ConstructorBlock, ConstructorBlockEntity, BaseBlockItem + > implements BlockItemProvider { private static final Component HELP = createTranslation("item", "constructor.help"); public ConstructorBlock(final DyeColor color, final MutableComponent name) { @@ -32,7 +32,7 @@ public ConstructorBlock(final DyeColor color, final MutableComponent name) { } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getConstructor(); } @@ -43,7 +43,7 @@ public BlockEntity newBlockEntity(final BlockPos blockPos, final BlockState bloc } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), getName(), HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlock.java index eb95d5e00..c9988df10 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/constructordestructor/DestructorBlock.java @@ -3,8 +3,9 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockColorMap; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.Blocks; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import javax.annotation.Nullable; @@ -13,15 +14,14 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class DestructorBlock extends AbstractConstructorDestructorBlock< - DestructorBlock, DestructorBlockEntity, NamedBlockItem - > implements BlockItemProvider { + DestructorBlock, DestructorBlockEntity, BaseBlockItem + > implements BlockItemProvider { private static final Component HELP = createTranslation("item", "destructor.help"); public DestructorBlock(final DyeColor color, final MutableComponent name) { @@ -32,7 +32,7 @@ public DestructorBlock(final DyeColor color, final MutableComponent name) { } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getDestructor(); } @@ -43,7 +43,7 @@ public BlockEntity newBlockEntity(final BlockPos blockPos, final BlockState bloc } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), getName(), HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java index e48858a26..f393da0a5 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Blocks.java @@ -26,7 +26,7 @@ import com.refinedmods.refinedstorage2.platform.common.storage.storageblock.FluidStorageBlock; import com.refinedmods.refinedstorage2.platform.common.storage.storageblock.ItemStorageBlock; import com.refinedmods.refinedstorage2.platform.common.storagemonitor.StorageMonitorBlock; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.SimpleBlock; import com.refinedmods.refinedstorage2.platform.common.wirelesstransmitter.WirelessTransmitterBlock; @@ -44,25 +44,25 @@ public final class Blocks { public static final DyeColor CABLE_LIKE_COLOR = DyeColor.GRAY; public static final Blocks INSTANCE = new Blocks(); - private final BlockColorMap cable = new BlockColorMap<>( + private final BlockColorMap cable = new BlockColorMap<>( CableBlock::new, ContentIds.CABLE, ContentNames.CABLE, CABLE_LIKE_COLOR ); - private final BlockColorMap grid = new BlockColorMap<>( + private final BlockColorMap grid = new BlockColorMap<>( GridBlock::new, ContentIds.GRID, ContentNames.GRID, COLOR ); - private final BlockColorMap craftingGrid = new BlockColorMap<>( + private final BlockColorMap craftingGrid = new BlockColorMap<>( CraftingGridBlock::new, ContentIds.CRAFTING_GRID, ContentNames.CRAFTING_GRID, COLOR ); - private final BlockColorMap detector = new BlockColorMap<>( + private final BlockColorMap detector = new BlockColorMap<>( DetectorBlock::new, ContentIds.DETECTOR, ContentNames.DETECTOR, @@ -90,55 +90,55 @@ public final class Blocks { ContentNames.CREATIVE_CONTROLLER, COLOR ); - private final BlockColorMap exporter = new BlockColorMap<>( + private final BlockColorMap exporter = new BlockColorMap<>( ExporterBlock::new, ContentIds.EXPORTER, ContentNames.EXPORTER, CABLE_LIKE_COLOR ); - private final BlockColorMap importer = new BlockColorMap<>( + private final BlockColorMap importer = new BlockColorMap<>( ImporterBlock::new, ContentIds.IMPORTER, ContentNames.IMPORTER, CABLE_LIKE_COLOR ); - private final BlockColorMap externalStorage = new BlockColorMap<>( + private final BlockColorMap externalStorage = new BlockColorMap<>( ExternalStorageBlock::new, ContentIds.EXTERNAL_STORAGE, ContentNames.EXTERNAL_STORAGE, CABLE_LIKE_COLOR ); - private final BlockColorMap destructor = new BlockColorMap<>( + private final BlockColorMap destructor = new BlockColorMap<>( DestructorBlock::new, ContentIds.DESTRUCTOR, ContentNames.DESTRUCTOR, CABLE_LIKE_COLOR ); - private final BlockColorMap constructor = new BlockColorMap<>( + private final BlockColorMap constructor = new BlockColorMap<>( ConstructorBlock::new, ContentIds.CONSTRUCTOR, ContentNames.CONSTRUCTOR, CABLE_LIKE_COLOR ); - private final BlockColorMap wirelessTransmitter = new BlockColorMap<>( + private final BlockColorMap wirelessTransmitter = new BlockColorMap<>( WirelessTransmitterBlock::new, ContentIds.WIRELESS_TRANSMITTER, ContentNames.WIRELESS_TRANSMITTER, COLOR ); - private final BlockColorMap networkReceiver = new BlockColorMap<>( + private final BlockColorMap networkReceiver = new BlockColorMap<>( NetworkReceiverBlock::new, ContentIds.NETWORK_RECEIVER, ContentNames.NETWORK_RECEIVER, COLOR ); - private final BlockColorMap networkTransmitter = new BlockColorMap<>( + private final BlockColorMap networkTransmitter = new BlockColorMap<>( NetworkTransmitterBlock::new, ContentIds.NETWORK_TRANSMITTER, ContentNames.NETWORK_TRANSMITTER, COLOR ); - private final BlockColorMap securityManager = new BlockColorMap<>( + private final BlockColorMap securityManager = new BlockColorMap<>( SecurityManagerBlock::new, ContentIds.SECURITY_MANAGER, ContentNames.SECURITY_MANAGER, @@ -167,7 +167,7 @@ public final class Blocks { private Blocks() { } - public BlockColorMap getCable() { + public BlockColorMap getCable() { return cable; } @@ -183,11 +183,11 @@ public SimpleBlock getMachineCasing() { return requireNonNull(machineCasing).get(); } - public BlockColorMap getGrid() { + public BlockColorMap getGrid() { return grid; } - public BlockColorMap getCraftingGrid() { + public BlockColorMap getCraftingGrid() { return craftingGrid; } @@ -230,11 +230,11 @@ public FluidStorageBlock getFluidStorageBlock(final FluidStorageType.Variant var return fluidStorageBlocks.get(variant).get(); } - public BlockColorMap getImporter() { + public BlockColorMap getImporter() { return importer; } - public BlockColorMap getExporter() { + public BlockColorMap getExporter() { return exporter; } @@ -246,23 +246,23 @@ public InterfaceBlock getInterface() { return requireNonNull(iface).get(); } - public BlockColorMap getExternalStorage() { + public BlockColorMap getExternalStorage() { return externalStorage; } - public BlockColorMap getDetector() { + public BlockColorMap getDetector() { return detector; } - public BlockColorMap getDestructor() { + public BlockColorMap getDestructor() { return destructor; } - public BlockColorMap getConstructor() { + public BlockColorMap getConstructor() { return constructor; } - public BlockColorMap getWirelessTransmitter() { + public BlockColorMap getWirelessTransmitter() { return wirelessTransmitter; } @@ -274,11 +274,11 @@ public StorageMonitorBlock getStorageMonitor() { return requireNonNull(storageMonitor).get(); } - public BlockColorMap getNetworkReceiver() { + public BlockColorMap getNetworkReceiver() { return networkReceiver; } - public BlockColorMap getNetworkTransmitter() { + public BlockColorMap getNetworkTransmitter() { return networkTransmitter; } @@ -298,7 +298,7 @@ public void setCreativePortableGrid(final Supplier supplier) this.creativePortableGrid = supplier; } - public BlockColorMap getSecurityManager() { + public BlockColorMap getSecurityManager() { return securityManager; } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java index b95e19a91..4d8dea711 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/content/Items.java @@ -10,7 +10,7 @@ import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.portablegrid.PortableGridBlockItem; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import java.util.ArrayList; import java.util.Collections; @@ -37,17 +37,17 @@ public final class Items { = new EnumMap<>(FluidStorageType.Variant.class); private final List> allControllers = new ArrayList<>(); private final List> allCreativeControllers = new ArrayList<>(); - private final List> allCables = new ArrayList<>(); - private final List> allExporters = new ArrayList<>(); - private final List> allImporters = new ArrayList<>(); - private final List> allExternalStorages = new ArrayList<>(); - private final List> allDetectors = new ArrayList<>(); - private final List> allDestructors = new ArrayList<>(); - private final List> allConstructors = new ArrayList<>(); - private final List> allWirelessTransmitters = new ArrayList<>(); - private final List> allNetworkReceivers = new ArrayList<>(); - private final List> allNetworkTransmitters = new ArrayList<>(); - private final List> allSecurityManagers = new ArrayList<>(); + private final List> allCables = new ArrayList<>(); + private final List> allExporters = new ArrayList<>(); + private final List> allImporters = new ArrayList<>(); + private final List> allExternalStorages = new ArrayList<>(); + private final List> allDetectors = new ArrayList<>(); + private final List> allDestructors = new ArrayList<>(); + private final List> allConstructors = new ArrayList<>(); + private final List> allWirelessTransmitters = new ArrayList<>(); + private final List> allNetworkReceivers = new ArrayList<>(); + private final List> allNetworkTransmitters = new ArrayList<>(); + private final List> allSecurityManagers = new ArrayList<>(); @Nullable private Supplier quartzEnrichedIron; @Nullable @@ -207,67 +207,67 @@ public List> getControllers() { return Collections.unmodifiableList(allControllers); } - public void addCable(final Supplier supplier) { + public void addCable(final Supplier supplier) { allCables.add(supplier); } - public List> getCables() { + public List> getCables() { return Collections.unmodifiableList(allCables); } - public void addExporter(final Supplier supplier) { + public void addExporter(final Supplier supplier) { allExporters.add(supplier); } - public List> getExporters() { + public List> getExporters() { return Collections.unmodifiableList(allExporters); } - public void addImporter(final Supplier supplier) { + public void addImporter(final Supplier supplier) { allImporters.add(supplier); } - public List> getImporters() { + public List> getImporters() { return Collections.unmodifiableList(allImporters); } - public void addExternalStorage(final Supplier supplier) { + public void addExternalStorage(final Supplier supplier) { allExternalStorages.add(supplier); } - public List> getExternalStorages() { + public List> getExternalStorages() { return Collections.unmodifiableList(allExternalStorages); } - public void addDetector(final Supplier supplier) { + public void addDetector(final Supplier supplier) { allDetectors.add(supplier); } - public List> getDetectors() { + public List> getDetectors() { return Collections.unmodifiableList(allDetectors); } - public void addDestructor(final Supplier supplier) { + public void addDestructor(final Supplier supplier) { allDestructors.add(supplier); } - public List> getDestructors() { + public List> getDestructors() { return Collections.unmodifiableList(allDestructors); } - public void addConstructor(final Supplier supplier) { + public void addConstructor(final Supplier supplier) { allConstructors.add(supplier); } - public List> getConstructors() { + public List> getConstructors() { return Collections.unmodifiableList(allConstructors); } - public void addWirelessTransmitter(final Supplier supplier) { + public void addWirelessTransmitter(final Supplier supplier) { allWirelessTransmitters.add(supplier); } - public List> getWirelessTransmitters() { + public List> getWirelessTransmitters() { return Collections.unmodifiableList(allWirelessTransmitters); } @@ -383,27 +383,27 @@ public void setConfigurationCard(final Supplier supplier) { this.configurationCard = supplier; } - public void addNetworkReceiver(final Supplier supplier) { + public void addNetworkReceiver(final Supplier supplier) { allNetworkReceivers.add(supplier); } - public List> getNetworkReceivers() { + public List> getNetworkReceivers() { return Collections.unmodifiableList(allNetworkReceivers); } - public void addNetworkTransmitter(final Supplier supplier) { + public void addNetworkTransmitter(final Supplier supplier) { allNetworkTransmitters.add(supplier); } - public List> getNetworkTransmitters() { + public List> getNetworkTransmitters() { return Collections.unmodifiableList(allNetworkTransmitters); } - public void addSecurityManager(final Supplier supplier) { + public void addSecurityManager(final Supplier supplier) { allSecurityManagers.add(supplier); } - public List> getSecurityManagers() { + public List> getSecurityManagers() { return Collections.unmodifiableList(allSecurityManagers); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/AbstractControllerBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/AbstractControllerBlock.java index 7acfa9e89..0619f81fe 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/AbstractControllerBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/AbstractControllerBlock.java @@ -27,7 +27,7 @@ public abstract class AbstractControllerBlock ControllerEnergyType.class ); - protected final MutableComponent name; + private final MutableComponent name; private final ControllerType type; private final ControllerBlockEntityTicker ticker; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlock.java index 68f216341..1359ff2dc 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlock.java @@ -20,6 +20,6 @@ public BlockColorMap, ControllerBlo @Override public ControllerBlockItem createBlockItem() { - return new ControllerBlockItem(this, name); + return new ControllerBlockItem(this); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockItem.java index d78218c88..984707d77 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/ControllerBlockItem.java @@ -11,29 +11,32 @@ import java.util.Optional; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class ControllerBlockItem extends AbstractEnergyBlockItem { - private final Component name; + private final Block block; - ControllerBlockItem(final Block block, final Component displayName) { + ControllerBlockItem(final Block block) { super(block, new Item.Properties().stacksTo(1), PlatformApi.INSTANCE.getEnergyItemHelper()); - this.name = displayName; + this.block = block; } @Override public Component getDescription() { - return name; + return block.getName(); } @Override public Component getName(final ItemStack stack) { - return name; + return block.getName(); } @Override @@ -51,4 +54,13 @@ public EnergyStorage createEnergyStorage(final ItemStack stack) { BlockEntities.INSTANCE.getController() ); } + + @Override + protected boolean placeBlock(final BlockPlaceContext ctx, final BlockState state) { + if (ctx.getPlayer() instanceof ServerPlayer serverPlayer + && !(PlatformApi.INSTANCE.canPlaceNetworkNode(serverPlayer, ctx.getLevel(), ctx.getClickedPos(), state))) { + return false; + } + return super.placeBlock(ctx, state); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlock.java index a2b071dca..24df80bb6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlock.java @@ -22,6 +22,6 @@ CreativeControllerBlockItem> getBlockColorMap() { @Override public CreativeControllerBlockItem createBlockItem() { - return new CreativeControllerBlockItem(this, name); + return new CreativeControllerBlockItem(this); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java index 7a8d67dce..c5f8fad45 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/controller/CreativeControllerBlockItem.java @@ -1,18 +1,17 @@ package com.refinedmods.refinedstorage2.platform.common.controller; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -public class CreativeControllerBlockItem extends NamedBlockItem { +public class CreativeControllerBlockItem extends NetworkNodeBlockItem { private static final MutableComponent HELP = createTranslation("item", "creative_controller.help"); - CreativeControllerBlockItem(final Block block, final Component name) { - super(block, new Item.Properties().stacksTo(1), name, HELP); + CreativeControllerBlockItem(final Block block) { + super(block, new Item.Properties().stacksTo(1), HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlock.java index 195db2cc0..892333d3e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/detector/DetectorBlock.java @@ -6,9 +6,10 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionType; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionTypeImpl; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; @@ -18,7 +19,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -36,8 +36,8 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class DetectorBlock extends AbstractDirectionalBlock - implements ColorableBlock, SimpleWaterloggedBlock, EntityBlock, - BlockItemProvider { + implements ColorableBlock, SimpleWaterloggedBlock, EntityBlock, + BlockItemProvider { public static final BooleanProperty POWERED = BooleanProperty.create("powered"); private static final Component HELP = createTranslation("item", "detector.help"); @@ -75,7 +75,7 @@ protected void createBlockStateDefinition(final StateDefinition.Builder getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getDetector(); } @@ -137,7 +137,7 @@ public int getSignal(final BlockState state, } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), name, HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/exporter/ExporterBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/exporter/ExporterBlock.java index b7d004666..501b1c5cb 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/exporter/ExporterBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/exporter/ExporterBlock.java @@ -5,10 +5,11 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalCableBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; import com.refinedmods.refinedstorage2.platform.common.support.DirectionalCableBlockShapes; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import java.util.HashMap; @@ -20,7 +21,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -32,7 +32,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class ExporterBlock extends AbstractDirectionalCableBlock - implements ColorableBlock, EntityBlock, BlockItemProvider { + implements ColorableBlock, EntityBlock, BlockItemProvider { private static final Component HELP = createTranslation("item", "exporter.help"); private static final Map SHAPE_CACHE = new HashMap<>(); private static final AbstractBlockEntityTicker TICKER = @@ -65,7 +65,7 @@ public BlockEntityTicker getTicker(final Level level, } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getExporter(); } @@ -87,7 +87,7 @@ public MutableComponent getName() { } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), name, HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlock.java index ea5be5efe..5221ffcb8 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/CraftingGridBlock.java @@ -4,8 +4,9 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import javax.annotation.Nullable; @@ -14,7 +15,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; @@ -23,8 +23,8 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -public class CraftingGridBlock extends AbstractGridBlock - implements BlockItemProvider { +public class CraftingGridBlock extends AbstractGridBlock + implements BlockItemProvider { private static final Component HELP = createTranslation("item", "crafting_grid.help"); private static final AbstractBlockEntityTicker TICKER = new NetworkNodeBlockEntityTicker<>( BlockEntities.INSTANCE::getCraftingGrid, @@ -36,7 +36,7 @@ public CraftingGridBlock(final DyeColor color, final MutableComponent name) { } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getCraftingGrid(); } @@ -55,7 +55,7 @@ public BlockEntityTicker getTicker(final Level level, } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), getName(), HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java index d928f622a..2547b5d94 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/grid/GridBlock.java @@ -4,8 +4,9 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import javax.annotation.Nullable; @@ -14,7 +15,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; @@ -23,8 +23,8 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -public class GridBlock extends AbstractGridBlock - implements BlockItemProvider { +public class GridBlock extends AbstractGridBlock + implements BlockItemProvider { private static final Component HELP = createTranslation("item", "grid.help"); private static final AbstractBlockEntityTicker TICKER = new NetworkNodeBlockEntityTicker<>( BlockEntities.INSTANCE::getGrid, @@ -36,7 +36,7 @@ public GridBlock(final DyeColor color, final MutableComponent name) { } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getGrid(); } @@ -55,7 +55,7 @@ public BlockEntityTicker getTicker(final Level level, } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), getName(), HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlock.java index 80f4de506..91f870bbe 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/iface/InterfaceBlock.java @@ -4,7 +4,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseBlock; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; -import com.refinedmods.refinedstorage2.platform.common.support.SimpleBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import javax.annotation.Nullable; @@ -62,6 +62,6 @@ public BlockEntityTicker getTicker(final Level level, } public BlockItem createBlockItem() { - return new SimpleBlockItem(this, HELP); + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlock.java index 061634789..d63240ccd 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/importer/ImporterBlock.java @@ -5,10 +5,11 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalCableBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; import com.refinedmods.refinedstorage2.platform.common.support.DirectionalCableBlockShapes; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import java.util.HashMap; @@ -20,7 +21,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -32,7 +32,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class ImporterBlock extends AbstractDirectionalCableBlock implements - ColorableBlock, EntityBlock, BlockItemProvider { + ColorableBlock, EntityBlock, BlockItemProvider { private static final Component HELP = createTranslation("item", "importer.help"); private static final Map SHAPE_CACHE = new HashMap<>(); private static final AbstractBlockEntityTicker TICKER = @@ -65,7 +65,7 @@ public BlockEntityTicker getTicker(final Level level, } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getImporter(); } @@ -87,7 +87,7 @@ public MutableComponent getName() { } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), name, HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/CableBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/CableBlock.java index d49d16772..06ecfa786 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/CableBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/CableBlock.java @@ -8,10 +8,11 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractColoredBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.CableBlockSupport; import com.refinedmods.refinedstorage2.platform.common.support.CableShapeCacheKey; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeContainerBlockEntityImpl; @@ -41,7 +42,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; public class CableBlock extends AbstractColoredBlock - implements ColorableBlock, SimpleWaterloggedBlock, EntityBlock { + implements ColorableBlock, SimpleWaterloggedBlock, EntityBlock { private static final AbstractBlockEntityTicker> TICKER = new NetworkNodeBlockEntityTicker<>(BlockEntities.INSTANCE::getCable); @@ -119,7 +120,7 @@ public BlockEntity newBlockEntity(final BlockPos pos, final BlockState state) { } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getCable(); } @@ -130,4 +131,9 @@ public BlockEntityTicker getTicker(final Level level, final BlockEntityType type) { return TICKER.get(level, type); } + + @Override + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkReceiverBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkReceiverBlock.java index 94db2f415..2cd782ed3 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkReceiverBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkReceiverBlock.java @@ -6,7 +6,8 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractColoredBlock; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import javax.annotation.Nullable; @@ -46,7 +47,7 @@ protected void createBlockStateDefinition(final StateDefinition.Builder getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getNetworkReceiver(); } @@ -63,4 +64,9 @@ public BlockEntityTicker getTicker(final Level level, final BlockEntityType type) { return TICKER.get(level, type); } + + @Override + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlock.java index 44f7184f7..62abfcb18 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/networking/NetworkTransmitterBlock.java @@ -5,7 +5,8 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractColoredBlock; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import javax.annotation.Nullable; @@ -47,7 +48,7 @@ protected void createBlockStateDefinition(final StateDefinition.Builder getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getNetworkTransmitter(); } @@ -64,4 +65,9 @@ public BlockEntityTicker getTicker(final Level level, final BlockEntityType type) { return TICKER.get(level, type); } + + @Override + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java index 7fd137575..8d58168ff 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java @@ -6,9 +6,10 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirection; import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirectionType; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionType; @@ -19,7 +20,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -33,7 +33,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class SecurityManagerBlock extends AbstractDirectionalBlock - implements ColorableBlock, BlockItemProvider, EntityBlock { + implements ColorableBlock, BlockItemProvider, EntityBlock { public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); private static final MutableComponent HELP = createTranslation("block", "security_manager.help"); @@ -66,7 +66,7 @@ protected DirectionType getDirectionType() { } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getSecurityManager(); } @@ -81,8 +81,8 @@ public MutableComponent getName() { } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), getName(), HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } @Nullable diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java index 3c1a08176..7ae79d19d 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -157,9 +157,14 @@ public AbstractContainerMenu createMenu(final int syncId, final Inventory invent } @Override - public boolean isAllowed(final ServerPlayer player) { - final boolean isAllowedViaSecuritySystem = NetworkNodeMenuProvider.super.isAllowed(player) + public boolean canOpen(final ServerPlayer player) { + final boolean isAllowedViaSecuritySystem = NetworkNodeMenuProvider.super.canOpen(player) && SecurityHelper.isAllowed(player, BuiltinPermission.SECURITY, getNode()); return isAllowedViaSecuritySystem || isPlacedBy(player.getGameProfile().getId()); } + + @Override + public boolean canBreak(final ServerPlayer player) { + return super.canBreak(player) || isPlacedBy(player.getGameProfile().getId()); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/DiskDriveBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/DiskDriveBlock.java index 597b90aff..fa5752604 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/DiskDriveBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/diskdrive/DiskDriveBlock.java @@ -2,7 +2,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.BlockConstants; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; -import com.refinedmods.refinedstorage2.platform.common.support.SimpleBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirection; import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirectionType; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionType; @@ -50,6 +50,6 @@ public BlockEntityTicker getTicker(final Level level, } public BlockItem createBlockItem() { - return new SimpleBlockItem(this, HELP); + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlock.java index 4cbcd239f..db7fb2008 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/externalstorage/ExternalStorageBlock.java @@ -5,10 +5,11 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalCableBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; import com.refinedmods.refinedstorage2.platform.common.support.DirectionalCableBlockShapes; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import java.util.HashMap; @@ -21,7 +22,6 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -36,7 +36,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class ExternalStorageBlock extends AbstractDirectionalCableBlock - implements ColorableBlock, EntityBlock, BlockItemProvider { + implements ColorableBlock, EntityBlock, BlockItemProvider { private static final Component HELP = createTranslation("item", "external_storage.help"); private static final Map SHAPE_CACHE = new HashMap<>(); private static final AbstractBlockEntityTicker TICKER = @@ -87,7 +87,7 @@ public void neighborChanged(final BlockState state, } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getExternalStorage(); } @@ -109,7 +109,7 @@ public MutableComponent getName() { } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), name, HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java index 3f81b6e58..a8bf7c049 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java @@ -86,7 +86,7 @@ private Optional tryOpenScreen(final BlockState state, private void tryOpenScreen(final ServerPlayer player, final MenuProvider menuProvider) { if (menuProvider instanceof NetworkNodeMenuProvider networkNodeMenuProvider - && !networkNodeMenuProvider.isAllowed(player)) { + && !networkNodeMenuProvider.canOpen(player)) { PlatformApi.INSTANCE.sendNoPermissionToOpenMessage(player, menuProvider.getDisplayName()); return; } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractColoredBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractColoredBlock.java index 08754b8b1..5c032635e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractColoredBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractColoredBlock.java @@ -2,11 +2,10 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; -public abstract class AbstractColoredBlock> - extends AbstractBaseBlock implements ColorableBlock, BlockItemProvider { +public abstract class AbstractColoredBlock> + extends AbstractBaseBlock implements ColorableBlock, BlockItemProvider { private final DyeColor color; private final MutableComponent name; @@ -25,9 +24,4 @@ public MutableComponent getName() { public DyeColor getColor() { return color; } - - @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), name); - } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NamedBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/BaseBlockItem.java similarity index 63% rename from refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NamedBlockItem.java rename to refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/BaseBlockItem.java index 80183c9b0..15d228129 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NamedBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/BaseBlockItem.java @@ -11,34 +11,33 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; -public class NamedBlockItem extends BlockItem { - private final Component name; +public class BaseBlockItem extends BlockItem { + private final Block block; @Nullable private final Component helpText; - public NamedBlockItem(final Block block, - final Properties properties, - final Component name) { - this(block, properties, name, null); + public BaseBlockItem(final Block block) { + this(block, null); } - public NamedBlockItem(final Block block, - final Properties properties, - final Component name, - @Nullable final Component helpText) { + public BaseBlockItem(final Block block, @Nullable final Component helpText) { + this(block, new Properties(), helpText); + } + + public BaseBlockItem(final Block block, final Properties properties, @Nullable final Component helpText) { super(block, properties); - this.name = name; + this.block = block; this.helpText = helpText; } @Override public Component getDescription() { - return name; + return block.getName(); } @Override public Component getName(final ItemStack stack) { - return name; + return block.getName(); } @Override diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java new file mode 100644 index 000000000..31d85c437 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java @@ -0,0 +1,39 @@ +package com.refinedmods.refinedstorage2.platform.common.support; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; + +import javax.annotation.Nullable; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +// TODO: inactiveness of security manager +// TODO: fix directionality of security manager (fix shift clicking on place working) +// TODO: fix slot shuffle security manager w/ fallback +// TODO: sonar fixes +// TODO: server test before release +public class NetworkNodeBlockItem extends BaseBlockItem { + public NetworkNodeBlockItem(final Block block) { + super(block); + } + + public NetworkNodeBlockItem(final Block block, final Component helpText) { + super(block, helpText); + } + + public NetworkNodeBlockItem(final Block block, final Properties properties, @Nullable final Component helpText) { + super(block, properties, helpText); + } + + @Override + protected boolean placeBlock(final BlockPlaceContext ctx, final BlockState state) { + if (ctx.getPlayer() instanceof ServerPlayer serverPlayer + && !(PlatformApi.INSTANCE.canPlaceNetworkNode(serverPlayer, ctx.getLevel(), ctx.getClickedPos(), state))) { + return false; + } + return super.placeBlock(ctx, state); + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleBlockItem.java deleted file mode 100644 index 05ef58f3f..000000000 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/SimpleBlockItem.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.refinedmods.refinedstorage2.platform.common.support; - -import com.refinedmods.refinedstorage2.platform.api.support.HelpTooltipComponent; - -import java.util.Optional; -import javax.annotation.Nullable; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.inventory.tooltip.TooltipComponent; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; - -public final class SimpleBlockItem extends BlockItem { - @Nullable - private final Component helpText; - - public SimpleBlockItem(final Block block) { - this(block, null); - } - - public SimpleBlockItem(final Block block, @Nullable final Component helpText) { - super(block, new Item.Properties()); - this.helpText = helpText; - } - - @Override - public Optional getTooltipImage(final ItemStack stack) { - if (helpText == null) { - return Optional.empty(); - } - return Optional.of(new HelpTooltipComponent(helpText)); - } -} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java index bbac766b4..c24cd3bb6 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/containermenu/NetworkNodeMenuProvider.java @@ -9,7 +9,7 @@ public interface NetworkNodeMenuProvider extends ExtendedMenuProvider { NetworkNode getNode(); - default boolean isAllowed(final ServerPlayer player) { + default boolean canOpen(final ServerPlayer player) { return SecurityHelper.isAllowed(player, BuiltinPermission.OPEN, getNode()); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlock.java index 4cca430bf..b45d2187c 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/wirelesstransmitter/WirelessTransmitterBlock.java @@ -6,9 +6,10 @@ import com.refinedmods.refinedstorage2.platform.common.content.Blocks; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBlockEntityTicker; import com.refinedmods.refinedstorage2.platform.common.support.AbstractDirectionalBlock; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionType; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionTypeImpl; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; @@ -20,7 +21,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -38,7 +38,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; public class WirelessTransmitterBlock extends AbstractDirectionalBlock - implements ColorableBlock, BlockItemProvider, + implements ColorableBlock, BlockItemProvider, EntityBlock { public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); @@ -99,7 +99,7 @@ public VoxelShape getShape(final BlockState state, } @Override - public BlockColorMap getBlockColorMap() { + public BlockColorMap getBlockColorMap() { return Blocks.INSTANCE.getWirelessTransmitter(); } @@ -128,7 +128,7 @@ public MutableComponent getName() { } @Override - public NamedBlockItem createBlockItem() { - return new NamedBlockItem(this, new Item.Properties(), getName(), HELP); + public BaseBlockItem createBlockItem() { + return new NetworkNodeBlockItem(this, HELP); } } diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index a1bb0897d..24d307f5f 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -257,6 +257,8 @@ "misc.refinedstorage2.no_permission.open": "You are not allowed to open the %s.", "misc.refinedstorage2.no_permission.insert": "You are not allowed to insert.", "misc.refinedstorage2.no_permission.extract": "You are not allowed to extract.", + "misc.refinedstorage2.no_permission.build.place": "You are not allowed to place a %s here.", + "misc.refinedstorage2.no_permission.build.break": "You are not allowed to break the %s.", "key.refinedstorage2.focus_search_bar": "Focus search bar", "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java index bc77c1b31..74fa4beba 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/ModInitializerImpl.java @@ -47,6 +47,7 @@ import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.SingleAmountChangePacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.StorageInfoRequestPacket; import com.refinedmods.refinedstorage2.platform.fabric.packet.c2s.UseNetworkBoundItemPacket; +import com.refinedmods.refinedstorage2.platform.fabric.security.NetworkNodeBreakSecurityEventListener; import com.refinedmods.refinedstorage2.platform.fabric.storage.diskdrive.FabricDiskDriveBlockEntity; import com.refinedmods.refinedstorage2.platform.fabric.storage.externalstorage.FabricStoragePlatformExternalStorageProviderFactory; import com.refinedmods.refinedstorage2.platform.fabric.storage.portablegrid.FabricPortableGridBlockEntity; @@ -65,6 +66,7 @@ import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; @@ -122,6 +124,7 @@ public void onInitialize() { registerSidedHandlers(); registerTickHandler(); registerWrenchingEvent(); + registerSecurityBlockBreakEvent(); LOGGER.debug("Refined Storage 2 has loaded."); } @@ -452,4 +455,8 @@ private void registerWrenchingEvent() { .orElse(InteractionResult.PASS); }); } + + private void registerSecurityBlockBreakEvent() { + PlayerBlockBreakEvents.BEFORE.register(new NetworkNodeBreakSecurityEventListener()); + } } diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java new file mode 100644 index 000000000..c25d66dfe --- /dev/null +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java @@ -0,0 +1,36 @@ +package com.refinedmods.refinedstorage2.platform.fabric.security; + +import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.support.network.PlatformNetworkNodeContainer; + +import javax.annotation.Nullable; + +import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + +public class NetworkNodeBreakSecurityEventListener implements PlayerBlockBreakEvents.Before { + @Override + public boolean beforeBlockBreak(final Level world, + final Player player, + final BlockPos pos, + final BlockState state, + @Nullable final BlockEntity blockEntity) { + if (blockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer + && player instanceof ServerPlayer serverPlayer + && !platformNetworkNodeContainer.canBreak(serverPlayer)) { + PlatformApi.INSTANCE.sendNoPermissionMessage( + serverPlayer, + createTranslation("misc", "no_permission.build.break", state.getBlock().getName()) + ); + return false; + } + return true; + } +} diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/package-info.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/package-info.java new file mode 100644 index 000000000..2d9c25b8b --- /dev/null +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@FieldsAndMethodsAreNonnullByDefault +package com.refinedmods.refinedstorage2.platform.fabric.security; + +import com.refinedmods.refinedstorage2.api.core.FieldsAndMethodsAreNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index 5c938c6cf..d7e93a7b0 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -1,6 +1,7 @@ package com.refinedmods.refinedstorage2.platform.forge; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.support.network.PlatformNetworkNodeContainer; import com.refinedmods.refinedstorage2.platform.common.AbstractModInitializer; import com.refinedmods.refinedstorage2.platform.common.PlatformProxy; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; @@ -71,6 +72,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; @@ -95,6 +97,7 @@ import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import net.neoforged.neoforge.event.level.BlockEvent; import net.neoforged.neoforge.items.wrapper.InvWrapper; import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; import net.neoforged.neoforge.network.registration.IPayloadRegistrar; @@ -110,6 +113,7 @@ import static com.refinedmods.refinedstorage2.platform.common.content.ContentIds.WIRELESS_GRID; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.MOD_ID; import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createIdentifier; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; @Mod(IdentifierUtil.MOD_ID) public class ModInitializer extends AbstractModInitializer { @@ -154,6 +158,7 @@ public ModInitializer(final IEventBus eventBus) { eventBus.addListener(this::registerCapabilities); NeoForge.EVENT_BUS.addListener(this::registerWrenchingEvent); + NeoForge.EVENT_BUS.addListener(this::registerSecurityBlockBreakEvent); } private void registerAdditionalGridInsertionStrategyFactories() { @@ -430,6 +435,20 @@ public void registerWrenchingEvent(final PlayerInteractEvent.RightClickBlock e) }); } + @SubscribeEvent + public void registerSecurityBlockBreakEvent(final BlockEvent.BreakEvent e) { + final BlockEntity blockEntity = e.getLevel().getBlockEntity(e.getPos()); + if (blockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer + && e.getPlayer() instanceof ServerPlayer serverPlayer + && !platformNetworkNodeContainer.canBreak(serverPlayer)) { + PlatformApi.INSTANCE.sendNoPermissionMessage( + serverPlayer, + createTranslation("misc", "no_permission.build.break", e.getState().getBlock().getName()) + ); + e.setCanceled(true); + } + } + @SubscribeEvent public void registerNetworkPackets(final RegisterPayloadHandlerEvent event) { final IPayloadRegistrar registrar = event.registrar(MOD_ID); diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java index d3df12ac6..6827cd5cb 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/tag/ItemTagsProviderImpl.java @@ -4,7 +4,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.Items; import com.refinedmods.refinedstorage2.platform.common.storage.FluidStorageType; import com.refinedmods.refinedstorage2.platform.common.storage.ItemStorageType; -import com.refinedmods.refinedstorage2.platform.common.support.NamedBlockItem; +import com.refinedmods.refinedstorage2.platform.common.support.BaseBlockItem; import java.util.Arrays; import java.util.Collection; @@ -121,7 +121,7 @@ private void addAllToTag(final TagKey t, final Collection tag(t).add(items.stream().map(Supplier::get).toArray(Item[]::new)).replace(false); } - private void addAllToTag2(final TagKey t, final Collection> items) { + private void addAllToTag2(final TagKey t, final Collection> items) { tag(t).add(items.stream().map(Supplier::get).toArray(Item[]::new)).replace(false); } } From b87adbee84217cb5933de415e754acbec309397b Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 16:03:32 +0200 Subject: [PATCH 53/59] fix: activeness checking on the security manager --- .../security/SecurityDecisionProvider.java | 4 ++ .../SecurityNetworkComponentImpl.java | 23 ++++---- .../SecurityNetworkComponentImplTest.java | 56 +++++++++++++++---- .../common/support/NetworkNodeBlockItem.java | 1 - 4 files changed, 61 insertions(+), 23 deletions(-) diff --git a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java index 68add781d..65648e5fc 100644 --- a/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java +++ b/refinedstorage2-network-api/src/main/java/com/refinedmods/refinedstorage2/api/network/security/SecurityDecisionProvider.java @@ -10,4 +10,8 @@ public interface SecurityDecisionProvider { default SecurityDecision isAllowed(Permission permission) { return SecurityDecision.PASS; } + + default boolean isActive() { + return true; + } } diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java index 923f6effa..9de3d6499 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -37,13 +37,15 @@ public void onContainerRemoved(final NetworkNodeContainer container) { @Override public boolean isAllowed(final Permission permission, final SecurityActor actor) { - if (providers.isEmpty()) { + final Set activeProviders = providers.stream() + .filter(SecurityDecisionProvider::isActive) + .collect(Collectors.toSet()); + if (activeProviders.isEmpty()) { return defaultPolicy.isAllowed(permission); } - final Set decisions = providers.stream().map(provider -> CoreValidations.validateNotNull( - provider.isAllowed(permission, actor), - "Decision cannot be null" - )).collect(Collectors.toSet()); + final Set decisions = activeProviders.stream().map(provider -> + CoreValidations.validateNotNull(provider.isAllowed(permission, actor), "Decision cannot be null") + ).collect(Collectors.toSet()); final boolean anyDenied = decisions.stream().anyMatch(decision -> decision == SecurityDecision.DENY); if (anyDenied) { return false; @@ -52,14 +54,13 @@ public boolean isAllowed(final Permission permission, final SecurityActor actor) if (anyAllowed) { return true; } - return tryFallback(permission); + return tryFallback(permission, activeProviders); } - private boolean tryFallback(final Permission permission) { - final Set decisions = providers.stream().map(provider -> CoreValidations.validateNotNull( - provider.isAllowed(permission), - "Decision cannot be null" - )).collect(Collectors.toSet()); + private boolean tryFallback(final Permission permission, final Set activeProviders) { + final Set decisions = activeProviders.stream().map(provider -> + CoreValidations.validateNotNull(provider.isAllowed(permission), "Decision cannot be null") + ).collect(Collectors.toSet()); final boolean anyDenied = decisions.stream().anyMatch(decision -> decision == SecurityDecision.DENY); if (anyDenied) { return false; diff --git a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java index 519a8f182..596534a0c 100644 --- a/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java +++ b/refinedstorage2-network/src/test/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImplTest.java @@ -3,6 +3,7 @@ import com.refinedmods.refinedstorage2.api.network.impl.node.security.SecurityDecisionProviderProxyNetworkNode; import com.refinedmods.refinedstorage2.api.network.security.Permission; import com.refinedmods.refinedstorage2.api.network.security.SecurityActor; +import com.refinedmods.refinedstorage2.api.network.security.SecurityDecisionProvider; import com.refinedmods.refinedstorage2.api.network.security.SecurityNetworkComponent; import com.refinedmods.refinedstorage2.api.network.security.SecurityPolicy; @@ -16,11 +17,13 @@ class SecurityNetworkComponentImplTest { SecurityNetworkComponent sut; SecurityDecisionProviderImpl securityDecisionProvider; + SecurityDecisionProviderProxyNetworkNode node; @BeforeEach void setUp() { sut = new SecurityNetworkComponentImpl(policy(TestPermissions.ALLOW_BY_DEFAULT)); securityDecisionProvider = new SecurityDecisionProviderImpl(); + node = createNode(securityDecisionProvider); } @Test @@ -38,7 +41,7 @@ void shouldUseDefaultPolicyIfNoSecurityDecisionProvidersArePresent() { @Test void shouldDenyAllIfAtLeastOneSecurityDecisionProviderIsPresent() { // Arrange - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + sut.onContainerAdded(() -> node); // Act & assert assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isFalse(); @@ -50,11 +53,27 @@ void shouldDenyAllIfAtLeastOneSecurityDecisionProviderIsPresent() { assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); } + @Test + void shouldUseDefaultPolicyIfAllSecurityDecisionProvidersAreInactive() { + // Arrange + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() + .setDefaultPolicy(policy(TestPermissions.OTHER)), false)); + + // Act & assert + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isFalse(); + + assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.B)).isTrue(); + assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.B)).isFalse(); + assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.B)).isFalse(); + } + @Test void shouldAllowOrDeny() { // Arrange securityDecisionProvider.setPolicy(TestActors.A, policy(TestPermissions.OTHER)); - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + sut.onContainerAdded(() -> node); // Act & assert assertThat(sut.isAllowed(TestPermissions.ALLOW_BY_DEFAULT, TestActors.A)).isFalse(); @@ -69,18 +88,22 @@ void shouldAllowOrDeny() { @Test void shouldOnlyAllowIfAllSecurityDecisionProvidersAllow() { // Arrange - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() .setPolicy(TestActors.A, policy(TestPermissions.OTHER)) )); - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() .setPolicy(TestActors.A, policy(TestPermissions.OTHER2)) )); - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() .setPolicy(TestActors.B, policy(TestPermissions.OTHER)) )); + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() + .setPolicy(TestActors.A, policy(TestPermissions.ALLOW_BY_DEFAULT)) + .setDefaultPolicy(policy(TestPermissions.OTHER, TestPermissions.OTHER2)), false)); + // Act & assert assertThat(sut.isAllowed(TestPermissions.OTHER, TestActors.A)).isFalse(); assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isFalse(); @@ -95,17 +118,17 @@ void shouldOnlyAllowIfAllSecurityDecisionProvidersAllow() { @Test void shouldUseDefaultPolicyOfSecurityDecisionProviderIfAllProvidersPassDecision() { // Arrange - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() .setPolicy(TestActors.A, policy(TestPermissions.OTHER)) .setDefaultPolicy(policy(TestPermissions.ALLOW_BY_DEFAULT)) )); - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() .setPolicy(TestActors.A, policy(TestPermissions.OTHER)) .setDefaultPolicy(policy(TestPermissions.ALLOW_BY_DEFAULT, TestPermissions.OTHER2)) )); - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() .setPolicy(TestActors.C, policy(TestPermissions.OTHER)) )); @@ -126,11 +149,11 @@ void shouldUseDefaultPolicyOfSecurityDecisionProviderIfAllProvidersPassDecision( @Test void shouldRemoveContainer() { // Arrange - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + sut.onContainerAdded(() -> createNode(new SecurityDecisionProviderImpl() .setDefaultPolicy(policy(TestPermissions.ALLOW_BY_DEFAULT)) )); - final var removedNode = new SecurityDecisionProviderProxyNetworkNode(0, new SecurityDecisionProviderImpl() + final var removedNode = createNode(new SecurityDecisionProviderImpl() .setDefaultPolicy(policy(TestPermissions.OTHER))); sut.onContainerAdded(() -> removedNode); @@ -144,7 +167,7 @@ void shouldRemoveContainer() { @Test void shouldClearPolicies() { // Arrange - sut.onContainerAdded(() -> new SecurityDecisionProviderProxyNetworkNode(0, securityDecisionProvider)); + sut.onContainerAdded(() -> node); securityDecisionProvider.setPolicy(TestActors.A, policy(TestPermissions.OTHER)); securityDecisionProvider.setDefaultPolicy(policy(TestPermissions.OTHER2)); @@ -156,6 +179,17 @@ void shouldClearPolicies() { assertThat(sut.isAllowed(TestPermissions.OTHER2, TestActors.A)).isTrue(); } + private static SecurityDecisionProviderProxyNetworkNode createNode(final SecurityDecisionProvider provider) { + return createNode(provider, true); + } + + private static SecurityDecisionProviderProxyNetworkNode createNode(final SecurityDecisionProvider provider, + final boolean active) { + final var node = new SecurityDecisionProviderProxyNetworkNode(0, provider); + node.setActive(active); + return node; + } + enum TestPermissions implements Permission { ALLOW_BY_DEFAULT, OTHER, OTHER2 } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java index 31d85c437..25bd4c034 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java @@ -10,7 +10,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -// TODO: inactiveness of security manager // TODO: fix directionality of security manager (fix shift clicking on place working) // TODO: fix slot shuffle security manager w/ fallback // TODO: sonar fixes From 295ec2f43b90e1e3759bddc8ffc77a28b842379c Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 16:32:25 +0200 Subject: [PATCH 54/59] fix: confusing directionality on security manager Only allow horizontal directions for now. --- .../blockstates/black_security_manager.json | 76 ------------------- .../blockstates/blue_security_manager.json | 76 ------------------- .../blockstates/brown_security_manager.json | 76 ------------------- .../blockstates/cyan_security_manager.json | 76 ------------------- .../blockstates/gray_security_manager.json | 76 ------------------- .../blockstates/green_security_manager.json | 76 ------------------- .../light_gray_security_manager.json | 76 ------------------- .../blockstates/lime_security_manager.json | 76 ------------------- .../blockstates/magenta_security_manager.json | 76 ------------------- .../blockstates/orange_security_manager.json | 76 ------------------- .../blockstates/pink_security_manager.json | 76 ------------------- .../blockstates/purple_security_manager.json | 76 ------------------- .../blockstates/red_security_manager.json | 76 ------------------- .../blockstates/security_manager.json | 76 ------------------- .../blockstates/white_security_manager.json | 76 ------------------- .../blockstates/yellow_security_manager.json | 76 ------------------- .../common/security/SecurityManagerBlock.java | 10 +-- .../security/SecurityManagerBlockEntity.java | 20 +++++ .../common/support/NetworkNodeBlockItem.java | 1 - .../direction/HorizontalDirection.java | 20 +++++ .../direction/HorizontalDirectionType.java | 55 ++++++++++++++ .../forge/datagen/BlockStateProviderImpl.java | 6 +- 22 files changed, 105 insertions(+), 1223 deletions(-) create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirection.java create mode 100644 refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirectionType.java diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json index 5a317adc1..8b1b082d0 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/black_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/black", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/black", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/black", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/black", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/black", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/black", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/black", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/black", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/black", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/black", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/black", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json index e097c4e27..e3e6cf425 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/blue_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/blue", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/blue", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/blue", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/blue", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/blue", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/blue", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/blue", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/blue", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/blue", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/blue", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/blue", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json index 782b43dfa..94c2baa51 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/brown_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/brown", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/brown", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/brown", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/brown", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/brown", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/brown", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/brown", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/brown", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/brown", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/brown", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/brown", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json index ccbab024f..39a4f2936 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/cyan_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/cyan", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/cyan", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/cyan", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/cyan", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json index 0bced5e96..b81f036ca 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/gray_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/gray", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/gray", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/gray", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/gray", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/gray", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/gray", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/gray", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/gray", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/gray", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/gray", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/gray", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json index c0c4b2ee3..a441897fd 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/green_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/green", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/green", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/green", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/green", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/green", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/green", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/green", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/green", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/green", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/green", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/green", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json index 54b93ccf8..0d4e1f070 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/light_gray_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/light_gray", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/light_gray", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/light_gray", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/light_gray", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json index f65e5d902..1e4b8ecf6 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/lime_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/lime", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/lime", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/lime", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/lime", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/lime", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/lime", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/lime", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/lime", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/lime", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/lime", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/lime", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json index 92ad88871..94aa92374 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/magenta_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/magenta", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/magenta", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/magenta", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/magenta", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json index 4450ef516..9b0f12848 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/orange_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/orange", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/orange", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/orange", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/orange", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/orange", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/orange", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/orange", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/orange", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/orange", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/orange", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/orange", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json index d33e77fec..07715e635 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/pink_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/pink", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/pink", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/pink", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/pink", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/pink", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/pink", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/pink", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/pink", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/pink", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/pink", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/pink", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json index bc0e84f00..1862553e8 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/purple_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/purple", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/purple", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/purple", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/purple", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/purple", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/purple", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/purple", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/purple", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/purple", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/purple", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/purple", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json index 724a669a7..b9341743d 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/red_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/red", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/red", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/red", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/red", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/red", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/red", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/red", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/red", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/red", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/red", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/red", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json index 8f3d5a73a..9bc1d02f9 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/light_blue", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/light_blue", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/light_blue", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/light_blue", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json index 5c1131a54..348271d18 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/white_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/white", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/white", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/white", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/white", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/white", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/white", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/white", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/white", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/white", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/white", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/white", "y": 270 diff --git a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json index 47fe1e882..cce362476 100644 --- a/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json +++ b/refinedstorage2-platform-common/src/generated/resources/assets/refinedstorage2/blockstates/yellow_security_manager.json @@ -1,24 +1,5 @@ { "variants": { - "active=false,direction=down_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": -90 - }, - "active=false,direction=down_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90 - }, - "active=false,direction=down_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 180 - }, - "active=false,direction=down_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": 90, - "y": 90 - }, "active=false,direction=east": { "model": "refinedstorage2:block/security_manager/inactive", "y": 90 @@ -30,48 +11,10 @@ "model": "refinedstorage2:block/security_manager/inactive", "y": 180 }, - "active=false,direction=up_east": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": -90 - }, - "active=false,direction=up_north": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 180 - }, - "active=false,direction=up_south": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90 - }, - "active=false,direction=up_west": { - "model": "refinedstorage2:block/security_manager/inactive", - "x": -90, - "y": 90 - }, "active=false,direction=west": { "model": "refinedstorage2:block/security_manager/inactive", "y": 270 }, - "active=true,direction=down_east": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": 90, - "y": -90 - }, - "active=true,direction=down_north": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": 90 - }, - "active=true,direction=down_south": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": 90, - "y": 180 - }, - "active=true,direction=down_west": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": 90, - "y": 90 - }, "active=true,direction=east": { "model": "refinedstorage2:block/security_manager/yellow", "y": 90 @@ -83,25 +26,6 @@ "model": "refinedstorage2:block/security_manager/yellow", "y": 180 }, - "active=true,direction=up_east": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": -90, - "y": -90 - }, - "active=true,direction=up_north": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": -90, - "y": 180 - }, - "active=true,direction=up_south": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": -90 - }, - "active=true,direction=up_west": { - "model": "refinedstorage2:block/security_manager/yellow", - "x": -90, - "y": 90 - }, "active=true,direction=west": { "model": "refinedstorage2:block/security_manager/yellow", "y": 270 diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java index 8d58168ff..e47df4f6e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlock.java @@ -10,9 +10,9 @@ import com.refinedmods.refinedstorage2.platform.common.support.BlockItemProvider; import com.refinedmods.refinedstorage2.platform.common.support.ColorableBlock; import com.refinedmods.refinedstorage2.platform.common.support.NetworkNodeBlockItem; -import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirection; -import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirectionType; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionType; +import com.refinedmods.refinedstorage2.platform.common.support.direction.HorizontalDirection; +import com.refinedmods.refinedstorage2.platform.common.support.direction.HorizontalDirectionType; import com.refinedmods.refinedstorage2.platform.common.support.network.NetworkNodeBlockEntityTicker; import javax.annotation.Nullable; @@ -32,7 +32,7 @@ import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; -public class SecurityManagerBlock extends AbstractDirectionalBlock +public class SecurityManagerBlock extends AbstractDirectionalBlock implements ColorableBlock, BlockItemProvider, EntityBlock { public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); @@ -61,8 +61,8 @@ protected void createBlockStateDefinition(final StateDefinition.Builder getDirectionType() { - return BiDirectionType.INSTANCE; + protected DirectionType getDirectionType() { + return HorizontalDirectionType.INSTANCE; } @Override diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java index 7ae79d19d..acc365689 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage2.api.network.impl.security.SecurityDecisionProviderImpl; import com.refinedmods.refinedstorage2.platform.api.security.SecurityHelper; import com.refinedmods.refinedstorage2.platform.api.security.SecurityPolicyContainerItem; +import com.refinedmods.refinedstorage2.platform.api.support.network.ConnectionSink; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockEntities; import com.refinedmods.refinedstorage2.platform.common.content.ContentNames; @@ -16,6 +17,7 @@ import javax.annotation.Nullable; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; @@ -167,4 +169,22 @@ public boolean canOpen(final ServerPlayer player) { public boolean canBreak(final ServerPlayer player) { return super.canBreak(player) || isPlacedBy(player.getGameProfile().getId()); } + + @Override + public void addOutgoingConnections(final ConnectionSink sink) { + for (final Direction direction : Direction.values()) { + if (direction == Direction.UP) { + continue; + } + sink.tryConnectInSameDimension(worldPosition.relative(direction), direction.getOpposite()); + } + } + + @Override + public boolean canAcceptIncomingConnection(final Direction incomingDirection, final BlockState connectingState) { + if (!colorsAllowConnecting(connectingState)) { + return false; + } + return incomingDirection != Direction.UP; + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java index 25bd4c034..eca931d13 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java @@ -10,7 +10,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -// TODO: fix directionality of security manager (fix shift clicking on place working) // TODO: fix slot shuffle security manager w/ fallback // TODO: sonar fixes // TODO: server test before release diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirection.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirection.java new file mode 100644 index 000000000..36a77b423 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirection.java @@ -0,0 +1,20 @@ +package com.refinedmods.refinedstorage2.platform.common.support.direction; + +import java.util.Locale; + +import net.minecraft.util.StringRepresentable; + +public enum HorizontalDirection implements StringRepresentable { + NORTH, EAST, SOUTH, WEST; + + private final String name; + + HorizontalDirection() { + this.name = name().toLowerCase(Locale.ROOT); + } + + @Override + public String getSerializedName() { + return name; + } +} diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirectionType.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirectionType.java new file mode 100644 index 000000000..22116b079 --- /dev/null +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/direction/HorizontalDirectionType.java @@ -0,0 +1,55 @@ +package com.refinedmods.refinedstorage2.platform.common.support.direction; + +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.properties.EnumProperty; + +public class HorizontalDirectionType implements DirectionType { + public static final DirectionType INSTANCE = new HorizontalDirectionType(); + + private static final EnumProperty PROPERTY = EnumProperty.create( + "direction", + HorizontalDirection.class + ); + + @Override + public EnumProperty getProperty() { + return PROPERTY; + } + + @Override + public HorizontalDirection getDefault() { + return HorizontalDirection.NORTH; + } + + @Override + public Direction extractDirection(final HorizontalDirection direction) { + return switch (direction) { + case NORTH -> Direction.NORTH; + case EAST -> Direction.EAST; + case SOUTH -> Direction.SOUTH; + case WEST -> Direction.WEST; + }; + } + + @Override + public HorizontalDirection getDirection(final Direction clickedFace, + final Direction playerFacing, + final float playerPitch) { + return switch (playerFacing) { + case EAST -> HorizontalDirection.EAST; + case SOUTH -> HorizontalDirection.SOUTH; + case WEST -> HorizontalDirection.WEST; + default -> HorizontalDirection.NORTH; + }; + } + + @Override + public HorizontalDirection rotate(final HorizontalDirection direction) { + return switch (direction) { + case NORTH -> HorizontalDirection.EAST; + case EAST -> HorizontalDirection.SOUTH; + case SOUTH -> HorizontalDirection.WEST; + case WEST -> HorizontalDirection.NORTH; + }; + } +} diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java index f9ed517ce..e60050740 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockStateProviderImpl.java @@ -14,6 +14,7 @@ import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirection; import com.refinedmods.refinedstorage2.platform.common.support.direction.BiDirectionType; import com.refinedmods.refinedstorage2.platform.common.support.direction.DirectionTypeImpl; +import com.refinedmods.refinedstorage2.platform.common.support.direction.HorizontalDirectionType; import com.refinedmods.refinedstorage2.platform.common.wirelesstransmitter.WirelessTransmitterBlock; import java.util.EnumMap; @@ -315,7 +316,10 @@ private void registerSecurityManagers() { } else { model.modelFile(inactive); } - addRotation(model, blockState.getValue(BiDirectionType.INSTANCE.getProperty())); + final Direction direction = HorizontalDirectionType.INSTANCE.extractDirection(blockState.getValue( + HorizontalDirectionType.INSTANCE.getProperty() + )); + addRotation(model, BiDirection.forHorizontal(direction)); return model.build(); }); }); From a60e8e999b8bbd0ea6c8f4fa5bef380a19272ebd Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 16:36:47 +0200 Subject: [PATCH 55/59] fix: slight desync when transferring fallback card --- .../platform/common/AbstractModInitializer.java | 7 +++---- .../security/SecurityManagerContainerMenu.java | 13 +++++++------ .../common/support/NetworkNodeBlockItem.java | 2 -- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java index 4d6966ae8..a346ee107 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/AbstractModInitializer.java @@ -734,10 +734,9 @@ protected final void registerMenus(final RegistryCallback> callback, FALLBACK_SECURITY_CARD, () -> menuTypeFactory.create(FallbackSecurityCardContainerMenu::new) )); - Menus.INSTANCE.setSecurityManager(callback.register( - SECURITY_MANAGER, - () -> menuTypeFactory.create(SecurityManagerContainerMenu::new) - )); + Menus.INSTANCE.setSecurityManager(callback.register(SECURITY_MANAGER, () -> menuTypeFactory.create( + (syncId, playerInventory, buf) -> new SecurityManagerContainerMenu(syncId, playerInventory) + ))); } protected final void registerLootFunctions(final RegistryCallback callback) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java index 6fb7bf048..78ece2d4e 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerContainerMenu.java @@ -3,6 +3,7 @@ import com.refinedmods.refinedstorage2.platform.common.content.Menus; import com.refinedmods.refinedstorage2.platform.common.support.AbstractBaseContainerMenu; import com.refinedmods.refinedstorage2.platform.common.support.RedstoneMode; +import com.refinedmods.refinedstorage2.platform.common.support.SimpleFilteredContainer; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ClientProperty; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.PropertyTypes; import com.refinedmods.refinedstorage2.platform.common.support.containermenu.ServerProperty; @@ -10,9 +11,7 @@ import javax.annotation.Nullable; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.Slot; @@ -22,11 +21,13 @@ public class SecurityManagerContainerMenu extends AbstractBaseContainerMenu { @Nullable private Slot fallbackSecurityCardSlot; - public SecurityManagerContainerMenu(final int syncId, - final Inventory playerInventory, - final FriendlyByteBuf buf) { + public SecurityManagerContainerMenu(final int syncId, final Inventory playerInventory) { super(Menus.INSTANCE.getSecurityManager(), syncId); - addSlots(playerInventory, new SimpleContainer(CARD_AMOUNT), new SimpleContainer(1)); + addSlots( + playerInventory, + new SimpleFilteredContainer(CARD_AMOUNT, SecurityManagerBlockEntity::isValidSecurityCard), + new SimpleFilteredContainer(1, SecurityManagerBlockEntity::isValidFallbackSecurityCard) + ); registerProperty(new ClientProperty<>(PropertyTypes.REDSTONE_MODE, RedstoneMode.IGNORE)); } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java index eca931d13..1139dea97 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java @@ -10,9 +10,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -// TODO: fix slot shuffle security manager w/ fallback // TODO: sonar fixes -// TODO: server test before release public class NetworkNodeBlockItem extends BaseBlockItem { public NetworkNodeBlockItem(final Block block) { super(block); From 04f0cb4bf5455049db47f642a951fb523e7940d0 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 16:37:57 +0200 Subject: [PATCH 56/59] chore: sonar issues --- .../security/SecurityNetworkComponentImpl.java | 2 +- .../PlatformSecurityNetworkComponentImpl.java | 6 ------ .../common/support/NetworkNodeBlockItem.java | 1 - .../forge/datagen/BlockModelProviderImpl.java | 15 +++++++++------ 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java index 9de3d6499..1b3eceeb0 100644 --- a/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java +++ b/refinedstorage2-network/src/main/java/com/refinedmods/refinedstorage2/api/network/impl/security/SecurityNetworkComponentImpl.java @@ -14,7 +14,7 @@ import java.util.stream.Collectors; public class SecurityNetworkComponentImpl implements SecurityNetworkComponent { - protected final Set providers = new LinkedHashSet<>(); + private final Set providers = new LinkedHashSet<>(); private final SecurityPolicy defaultPolicy; public SecurityNetworkComponentImpl(final SecurityPolicy defaultPolicy) { diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java index e6412c41d..b11f97eb4 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/PlatformSecurityNetworkComponentImpl.java @@ -11,18 +11,12 @@ public class PlatformSecurityNetworkComponentImpl extends SecurityNetworkComponentImpl implements PlatformSecurityNetworkComponent { - private final SecurityPolicy defaultPolicy; - public PlatformSecurityNetworkComponentImpl(final SecurityPolicy defaultPolicy) { super(defaultPolicy); - this.defaultPolicy = defaultPolicy; } @Override public boolean isAllowed(final Permission permission, final ServerPlayer player) { - if (providers.isEmpty()) { - return defaultPolicy.isAllowed(permission); - } final MinecraftServer server = player.getServer(); if (server == null) { return false; diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java index 1139dea97..ef29acba8 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/NetworkNodeBlockItem.java @@ -10,7 +10,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -// TODO: sonar fixes public class NetworkNodeBlockItem extends BaseBlockItem { public NetworkNodeBlockItem(final Block block) { super(block); diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java index fbea17c15..bf5080b64 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/datagen/BlockModelProviderImpl.java @@ -25,6 +25,9 @@ public class BlockModelProviderImpl extends BlockModelProvider { private static final ResourceLocation ALL_CUTOUT = createIdentifier("block/all_cutout"); private static final ResourceLocation NORTH_CUTOUT = createIdentifier("block/north_cutout"); + private static final String NORTH = "north"; + private static final String SOUTH = "south"; + private static final ResourceLocation BOTTOM_TEXTURE = createIdentifier("block/bottom"); public BlockModelProviderImpl(final PackOutput output, final ExistingFileHelper existingFileHelper) { @@ -90,9 +93,9 @@ private void registerGrids(final String name, final ResourceLocation top = createIdentifier(BLOCK_PREFIX + "/" + name + "/top"); withExistingParent(BLOCK_PREFIX + "/" + name + "/" + variantName, baseModel) .texture(PARTICLE_TEXTURE, right) - .texture("north", front) + .texture(NORTH, front) .texture("east", right) - .texture("south", back) + .texture(SOUTH, back) .texture("west", left) .texture("up", top) .texture("down", BOTTOM_TEXTURE) @@ -185,9 +188,9 @@ private void registerSecurityManagers() { ); withExistingParent("block/security_manager/" + color.getName(), EMISSIVE_CUTOUT) .texture(PARTICLE_TEXTURE, back) - .texture("north", front) + .texture(NORTH, front) .texture("east", right) - .texture("south", back) + .texture(SOUTH, back) .texture("west", left) .texture("up", top) .texture("down", BOTTOM_TEXTURE) @@ -205,9 +208,9 @@ private void registerSecurityManagers() { final ResourceLocation cutoutTop = createIdentifier("block/security_manager/cutouts/top/inactive"); withExistingParent("block/security_manager/inactive", CUTOUT) .texture(PARTICLE_TEXTURE, back) - .texture("north", front) + .texture(NORTH, front) .texture("east", right) - .texture("south", back) + .texture(SOUTH, back) .texture("west", left) .texture("up", top) .texture("down", BOTTOM_TEXTURE) From 9b32e83c68a7e8ea30b5bbbaa8830d6f7a74b305 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 17:01:08 +0200 Subject: [PATCH 57/59] fix: forgotten build check for item storage and fluid storage blocks --- .../platform/common/PlatformApiImpl.java | 18 +++++++----------- .../FluidStorageBlockBlockItem.java | 12 ++++++++++++ .../ItemStorageBlockBlockItem.java | 12 ++++++++++++ .../common/support/AbstractBaseBlock.java | 2 +- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java index 9aa8f1a21..803d80feb 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/PlatformApiImpl.java @@ -557,19 +557,15 @@ public boolean canPlaceNetworkNode(final ServerPlayer player, for (final Direction direction : Direction.values()) { final BlockPos adjacentPos = pos.relative(direction); final BlockEntity adjacentBlockEntity = level.getBlockEntity(adjacentPos); - if (!(adjacentBlockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer)) { + if (!(adjacentBlockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer) + || !platformNetworkNodeContainer.canAcceptIncomingConnection(direction.getOpposite(), state) + || platformNetworkNodeContainer.getNode().getNetwork() == null) { continue; } - if (!platformNetworkNodeContainer.canAcceptIncomingConnection(direction.getOpposite(), state)) { - continue; - } - final Network network = platformNetworkNodeContainer.getNode().getNetwork(); - if (network == null) { - continue; - } - final PlatformSecurityNetworkComponent security = network.getComponent( - PlatformSecurityNetworkComponent.class - ); + final PlatformSecurityNetworkComponent security = platformNetworkNodeContainer + .getNode() + .getNetwork() + .getComponent(PlatformSecurityNetworkComponent.class); if (!security.isAllowed(BuiltinPermission.BUILD, player)) { PlatformApi.INSTANCE.sendNoPermissionMessage( player, diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/FluidStorageBlockBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/FluidStorageBlockBlockItem.java index 936737ea6..d43dc07d5 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/FluidStorageBlockBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/FluidStorageBlockBlockItem.java @@ -9,9 +9,12 @@ import javax.annotation.Nullable; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; public class FluidStorageBlockBlockItem extends AbstractStorageContainerBlockItem { private final FluidStorageType.Variant variant; @@ -48,4 +51,13 @@ protected ItemStack createSecondaryDisassemblyByproduct(final int count) { } return new ItemStack(Items.INSTANCE.getFluidStoragePart(variant), count); } + + @Override + protected boolean placeBlock(final BlockPlaceContext ctx, final BlockState state) { + if (ctx.getPlayer() instanceof ServerPlayer serverPlayer + && !(PlatformApi.INSTANCE.canPlaceNetworkNode(serverPlayer, ctx.getLevel(), ctx.getClickedPos(), state))) { + return false; + } + return super.placeBlock(ctx, state); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/ItemStorageBlockBlockItem.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/ItemStorageBlockBlockItem.java index 085ee20c8..3e6bb5634 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/ItemStorageBlockBlockItem.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/storage/storageblock/ItemStorageBlockBlockItem.java @@ -9,9 +9,12 @@ import javax.annotation.Nullable; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; public class ItemStorageBlockBlockItem extends AbstractStorageContainerBlockItem { private final ItemStorageType.Variant variant; @@ -48,4 +51,13 @@ protected ItemStack createSecondaryDisassemblyByproduct(final int count) { } return new ItemStack(Items.INSTANCE.getItemStoragePart(variant), count); } + + @Override + protected boolean placeBlock(final BlockPlaceContext ctx, final BlockState state) { + if (ctx.getPlayer() instanceof ServerPlayer serverPlayer + && !(PlatformApi.INSTANCE.canPlaceNetworkNode(serverPlayer, ctx.getLevel(), ctx.getClickedPos(), state))) { + return false; + } + return super.placeBlock(ctx, state); + } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java index a8bf7c049..534251341 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java @@ -87,7 +87,7 @@ private Optional tryOpenScreen(final BlockState state, private void tryOpenScreen(final ServerPlayer player, final MenuProvider menuProvider) { if (menuProvider instanceof NetworkNodeMenuProvider networkNodeMenuProvider && !networkNodeMenuProvider.canOpen(player)) { - PlatformApi.INSTANCE.sendNoPermissionToOpenMessage(player, menuProvider.getDisplayName()); + PlatformApi.INSTANCE.sendNoPermissionToOpenMessage(player, getName()); return; } Platform.INSTANCE.getMenuOpener().openMenu(player, menuProvider); From 147a90ecf664ec4ca37b5ef9a75f0dab07d13718 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 17:32:17 +0200 Subject: [PATCH 58/59] fix: being able to bypass security rules with rotating or dismantling --- .../network/PlatformNetworkNodeContainer.java | 2 +- .../security/SecurityManagerBlockEntity.java | 4 +- .../common/support/AbstractBaseBlock.java | 71 +++++++++++++++---- .../assets/refinedstorage2/lang/en_us.json | 2 + ...NetworkNodeBreakSecurityEventListener.java | 2 +- .../platform/forge/ModInitializer.java | 2 +- 6 files changed, 66 insertions(+), 17 deletions(-) diff --git a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java index f8ec77341..e1151c134 100644 --- a/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java +++ b/refinedstorage2-platform-api/src/main/java/com/refinedmods/refinedstorage2/platform/api/support/network/PlatformNetworkNodeContainer.java @@ -43,7 +43,7 @@ public interface PlatformNetworkNodeContainer extends NetworkNodeContainer { boolean isContainerRemoved(); - default boolean canBreak(final ServerPlayer player) { + default boolean canBreakOrRotate(final ServerPlayer player) { return SecurityHelper.isAllowed(player, PlatformApi.INSTANCE.getBuiltinPermissions().build(), getNode()); } } diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java index acc365689..929c2a1bc 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/security/SecurityManagerBlockEntity.java @@ -166,8 +166,8 @@ public boolean canOpen(final ServerPlayer player) { } @Override - public boolean canBreak(final ServerPlayer player) { - return super.canBreak(player) || isPlacedBy(player.getGameProfile().getId()); + public boolean canBreakOrRotate(final ServerPlayer player) { + return super.canBreakOrRotate(player) || isPlacedBy(player.getGameProfile().getId()); } @Override diff --git a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java index 534251341..59909a309 100644 --- a/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java +++ b/refinedstorage2-platform-common/src/main/java/com/refinedmods/refinedstorage2/platform/common/support/AbstractBaseBlock.java @@ -1,6 +1,8 @@ package com.refinedmods.refinedstorage2.platform.common.support; +import com.refinedmods.refinedstorage2.api.network.Network; import com.refinedmods.refinedstorage2.platform.api.PlatformApi; +import com.refinedmods.refinedstorage2.platform.api.support.network.PlatformNetworkNodeContainer; import com.refinedmods.refinedstorage2.platform.common.Platform; import com.refinedmods.refinedstorage2.platform.common.content.BlockColorMap; import com.refinedmods.refinedstorage2.platform.common.content.Sounds; @@ -10,6 +12,7 @@ import javax.annotation.Nullable; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.world.Containers; @@ -31,6 +34,8 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; +import static com.refinedmods.refinedstorage2.platform.common.util.IdentifierUtil.createTranslation; + public abstract class AbstractBaseBlock extends Block { protected AbstractBaseBlock(final Properties properties) { super(properties); @@ -148,8 +153,8 @@ public final Optional tryUseWrench(final BlockState state, if (!isWrenchingOwnBlock) { return Optional.empty(); } - if (!level.isClientSide()) { - final boolean success = dismantleOrRotate(state, level, hitResult, player); + if (player instanceof ServerPlayer serverPlayer) { + final boolean success = dismantleOrRotate(state, level, hitResult, serverPlayer); if (success) { level.playSound( null, @@ -167,21 +172,54 @@ public final Optional tryUseWrench(final BlockState state, private boolean dismantleOrRotate(final BlockState state, final Level level, final BlockHitResult hitResult, - final Player player) { + final ServerPlayer player) { if (player.isCrouching()) { - dismantle(state, level, hitResult, player); - return true; + return dismantle(state, level, hitResult, player); } else { - return rotate(state, level, hitResult.getBlockPos()); + return rotate(state, level, hitResult.getBlockPos(), player); } } - private boolean rotate(final BlockState state, final Level level, final BlockPos pos) { + private boolean rotate(final BlockState state, + final Level level, + final BlockPos pos, + final ServerPlayer player) { + final BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer) { + final Network network = platformNetworkNodeContainer.getNode().getNetwork(); + if (!platformNetworkNodeContainer.canBreakOrRotate(player) + || mightMakeConnectionWithAnotherSecuredNetwork(level, pos, player, network)) { + PlatformApi.INSTANCE.sendNoPermissionMessage( + player, + createTranslation("misc", "no_permission.build.rotate", getName()) + ); + return false; + } + } final BlockState rotated = getRotatedBlockState(state, level, pos); level.setBlockAndUpdate(pos, rotated); return !state.equals(rotated); } + private boolean mightMakeConnectionWithAnotherSecuredNetwork(final Level level, + final BlockPos pos, + final ServerPlayer player, + @Nullable final Network rotatedNetwork) { + for (final Direction direction : Direction.values()) { + final BlockPos neighborPos = pos.relative(direction); + final BlockEntity neighborBlockEntity = level.getBlockEntity(neighborPos); + if (neighborBlockEntity instanceof PlatformNetworkNodeContainer neighborNetworkNodeContainer + && neighborNetworkNodeContainer.getNode().getNetwork() != rotatedNetwork) { + PlatformApi.INSTANCE.sendNoPermissionMessage( + player, + createTranslation("misc", "no_permission.build.rotate", getName()) + ); + return true; + } + } + return false; + } + @SuppressWarnings("deprecation") protected BlockState getRotatedBlockState(final BlockState state, final Level level, final BlockPos pos) { return state.rotate(Rotation.CLOCKWISE_90); @@ -191,12 +229,20 @@ private boolean isWrench(final ItemStack item) { return item.is(Platform.INSTANCE.getWrenchTag()); } - private void dismantle(final BlockState state, - final Level level, - final BlockHitResult hitResult, - final Player player) { - final ItemStack stack = Platform.INSTANCE.getCloneItemStack(state, level, hitResult, player); + private boolean dismantle(final BlockState state, + final Level level, + final BlockHitResult hitResult, + final ServerPlayer player) { final BlockEntity blockEntity = level.getBlockEntity(hitResult.getBlockPos()); + if (blockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer + && !platformNetworkNodeContainer.canBreakOrRotate(player)) { + PlatformApi.INSTANCE.sendNoPermissionMessage( + player, + createTranslation("misc", "no_permission.build.dismantle", getName()) + ); + return false; + } + final ItemStack stack = Platform.INSTANCE.getCloneItemStack(state, level, hitResult, player); if (blockEntity != null) { blockEntity.saveToItem(stack); // Ensure that we don't drop items @@ -210,6 +256,7 @@ private void dismantle(final BlockState state, hitResult.getLocation().z, stack )); + return true; } public final Optional tryUpdateColor(final BlockState state, diff --git a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json index 24d307f5f..36f89262b 100644 --- a/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json +++ b/refinedstorage2-platform-common/src/main/resources/assets/refinedstorage2/lang/en_us.json @@ -259,6 +259,8 @@ "misc.refinedstorage2.no_permission.extract": "You are not allowed to extract.", "misc.refinedstorage2.no_permission.build.place": "You are not allowed to place a %s here.", "misc.refinedstorage2.no_permission.build.break": "You are not allowed to break the %s.", + "misc.refinedstorage2.no_permission.build.rotate": "You are not allowed to rotate the %s.", + "misc.refinedstorage2.no_permission.build.dismantle": "You are not allowed to dismantle the %s.", "key.refinedstorage2.focus_search_bar": "Focus search bar", "key.refinedstorage2.clear_crafting_grid_matrix_to_network": "Clear Crafting Grid matrix to network", "key.refinedstorage2.clear_crafting_grid_matrix_to_inventory": "Clear Crafting Grid matrix to inventory", diff --git a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java index c25d66dfe..92ae8d63c 100644 --- a/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java +++ b/refinedstorage2-platform-fabric/src/main/java/com/refinedmods/refinedstorage2/platform/fabric/security/NetworkNodeBreakSecurityEventListener.java @@ -24,7 +24,7 @@ public boolean beforeBlockBreak(final Level world, @Nullable final BlockEntity blockEntity) { if (blockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer && player instanceof ServerPlayer serverPlayer - && !platformNetworkNodeContainer.canBreak(serverPlayer)) { + && !platformNetworkNodeContainer.canBreakOrRotate(serverPlayer)) { PlatformApi.INSTANCE.sendNoPermissionMessage( serverPlayer, createTranslation("misc", "no_permission.build.break", state.getBlock().getName()) diff --git a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java index d7e93a7b0..eb988a812 100644 --- a/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java +++ b/refinedstorage2-platform-forge/src/main/java/com/refinedmods/refinedstorage2/platform/forge/ModInitializer.java @@ -440,7 +440,7 @@ public void registerSecurityBlockBreakEvent(final BlockEvent.BreakEvent e) { final BlockEntity blockEntity = e.getLevel().getBlockEntity(e.getPos()); if (blockEntity instanceof PlatformNetworkNodeContainer platformNetworkNodeContainer && e.getPlayer() instanceof ServerPlayer serverPlayer - && !platformNetworkNodeContainer.canBreak(serverPlayer)) { + && !platformNetworkNodeContainer.canBreakOrRotate(serverPlayer)) { PlatformApi.INSTANCE.sendNoPermissionMessage( serverPlayer, createTranslation("misc", "no_permission.build.break", e.getState().getBlock().getName()) From 6181a4712dc26d7d7b6de566ca97049c906a6231 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 4 Apr 2024 15:46:29 +0000 Subject: [PATCH 59/59] chore: prepare release v2.0.0-milestone.3.5 --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25bf7d0a2..b3603d3cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [2.0.0-milestone.3.5] - 2024-04-04 + ### Added - Security Card @@ -552,7 +554,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - The Grid can now use smooth scrolling. - The Grid now has syntax highlighting for the search query. -[Unreleased]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.3.4...HEAD +[Unreleased]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.3.5...HEAD + +[2.0.0-milestone.3.5]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.3.4...v2.0.0-milestone.3.5 [2.0.0-milestone.3.4]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.3.3...v2.0.0-milestone.3.4

7{qYul_UZil-R=dh#()z#6v0DaY51p* zZ8MIc;q*>g^zxQAZv^Nqg=A^e?l})M5SV9AfQIWKOGX1wJI<6(e3I?Fh1OS{O?P>1#$-gw=6O?< z8kh#nnOgla#2~ju{Gc5M+6ByNP6^dC`69Da&KbWQa&yF$D$^@rnwk9}Zx+KK^a#h4 z%_-n~Se=Hm-M7*jiwz5w&?NqDFDMrE&?Zai`hW7$1-J>_-*mzJh%^K3;8;1BYp#6; z+8ERdlt45N4-eE&bYYFNC^tJE(9Mx{1t-yNqFvKSF!O(StN3zZ>2CH%AwQ<&=PUXD zEw&Dyl|tkVOBC0ps19E*nvja$4s%KtU-L7hy+|S6*8(o!2`NqLIbqvQ2I`X^0eg*5 z8apr@qS6qu9m4)_2JP(NxF^bN6|#REqe6#OY-~-I!II;us>s2wnxU&gsHsv5N0EQ< z?pN0&*WI556oh`AT9 zk$-T}NvL_izZA2#E7Q3a80cESwlsW5NvlyAc=A&sm162#Lz&IHVdM;63P11%quklg zmC?~22TyHE!+yU^NaZ0n7|f}L4frb%o(c6jtZ%~yYAJ>u9`W4Z|Asg_IQ zcg`na7UJ}J$35o@|A)CNRU$FUQ_dgbXC%R9@P!BQDGJZt?wxlp##n{Qz(XBCN*Jw_T`EYB(J7bc zDG5(|y%oZP%<+>%8Ygmo^388R6T~MT9?3XuvCuCIEwzZrJ$E|*I`hp&0#**V1XZP7 z%}_>z_@;74NA!(9B~-7{2ek#S^I?aVT1@501R5U+wW^{jb~dXI$2Lrr;t1l0V+IE7 zs?DO@StXgE1KHHJAZ)tQU0 z0P%~y07-XPOR?@?qtPfb2rX>**M@%B?ult*wkR)Mq)w+yu zQ0Kst9os4lfd_cJzcoQM$7wvjL8m2;&rCp??xX9-U>w0GJ`N?H-`y(0hvqs##PeTN zV(=a;h&|Ie9n_^&NW$+rFKOpH8(j}Jgfd~;F}tR)CUfc`B4!H?le^=W71z6{nSy`Y zW1OTe2PARKxQ9HY=&%H_K8?$)m)du+{ntpDN2(?8trhA{><>cH5UaC@8*Gw&YyHU;;&MP_Zh4j#qHhLo{z__3g(s z%or^2{H^OgaoE|ps&`ecgbTfKraN6;_MneFsTvhn*gorlFGM`b$o}P>ht=8$)-9bH z)`zbW2$;~81Zup`h%`8+>Y|NvEve1IpE&2gY(^Om)wapZOYG;bP z2~bBM#?|07@vP36ubtQ9ksu4-FObCN4su~irX38*TLtj7^bh8`06flw$PZulDa`gr zYPsD{Lx`ghKl8&+>6e67N6Cm71C?2jQZiEJawo(tHoVQ~X4FFg+AxIK%@TNNXJahz zI&Nj%c|K>=Cb}2Bd>1L()0&)dLxrs9D5Ye&WZE9%ExJA@$jT8{C!YjRpk)RhdqM!#s4`ZsDaEJW~Q7R7EGGF&bH#|z}D zx#Z_vkoX+=IO)zynP*~4du+j+z`q2~?cF%X!?^7mJCEC+t(~pvGc6dVR~u|=YZc3K z7BTQlWZc)FW%I214WJoNQx~k4#K_%@74W(sjg3vzDslB3 -~#zBE8=-cho5$;}t zV8Wr@k`g(HZz@L9K4^X~Ip?k{)sl*5Al`fo!`mKwT%F<6{R2Vd2Z$T`BRmtl9Y7WA zjo8jP;)dm|;#{WI+ZwmHfTJiwOepdfRkAZ~A()3eTL|T?#~X3wOhm)c-levoJno6d z{9V)1eSoUcMLYHpQ{^rf<-bTjF&Sk%LS36&nD}B4atCkB;ax7b>{x~ zXzMi%N(ez05q=%Lz{4b{^^Wd({>uRqs%B@6Ux~vi~~>;$!n~%W~d>u}4rJTJVMlCp~JxJHSyX}k(iu8sVF{=ZcT(er&6R43TjxVGa>WOUqJz9V@AxJmSpe);6k@_D!n0E#t(3z$Bmj;~xn68t&y&-k4^aV(s>>jAUOCmd3Mp+k zu!+jAHClT(W&*{};tx>$?zt>=Tl}^}OI&K&o*HQLvTv1jFiB%#=v~2l#Dm|?StnGB zs%okF%Fhl+RrJ&o3{MHl8OQ&Oz!9nrb6I6$@5F-1NSmuSvf!M-{o3=kvvILCV-p6I z`|z-1r1Z_*{xpqJ&nd1)Ci%G&A|CuHI`-t>hbLk@FcOSP{@m@e19W?1R0*&;+jta3 zhk}%!%d%n6hD$Ie2sP9t)BC1ONfT)9&kMUu=U=Ty2bIoHOQHT2nB-yU0{vyOdp>5p z;>cQYX&HrR#NDg{(VXCpv+OE6-v~vxqN(NlH4YmE3TkT!e(Gww^gC{s;*L*pJGtxE z5jUGZ!Adh$G2FdMNSy2MmF2$%7StY5oPt^!z~@5JclLcR%51laK$2BY9scDG7Rkl9 zd$gTn1V9`AdP3HU7`e{A3vIqv@W)b#Fq&7K5v|Af1u++DXgp&Iv+7)czbb7tvJiSI zDNf^_@(>}=VR=sN^+F83Pgcf;mJcgFI)#mWvw;Bpgf#LT{`KW6ZA#FEfn-sQygbN@ zxRvUz#%%Kda}bdBqOVVXKTI&gc*(m-?1XhArswA zz&l9=(#{9|(s)^??Ymo@HTg;~qpo%X9l< zYiK6!QtG_=L3U~H{y{aGH4e4uvV-&Js6Qf|%Z=Hzoz3s4_1N;irsbo6yiU$d&{ zb#pSG-J=%Rl+3^a9QZR+M|sUOop^EaXXWBNWzH4-nB6oNlFJ=}_`V>oAnM)2ho zxB$Ro=j2nuZ!4y7PDjGZ_E^WEJodu7Y-T1c2+B^@ijBy#lf*Cs0G;ciZG)0fFrm`^ z6p)v#^=TnTgu~dC`As=4XAq3L`z1p#p3=3}%Fd*DDF%LlWKhfpvaq$vG}>-3+;6rB z?<&%m0)2F5Hy5|zPmG>Y`$S~om8#Gr)^B)Y-){%B&5^dCpCB3 za9z5W9q!Ej^S{cRy}K17Z9-?Ujh>Yw$GH_zrI=Q~Y5X9UHsRqa*pDxvV=D!6dW3qvlm{PaY-bcTLi%f&L-F=8Mi zZ<#@_0}f3p#KhC?fRo1Vj=D|5t})9W9Nn9at{NL1n_W5p5ipWD;q&@Dv#~u!9Ppo| z6X}_OS0rCNsJ467bDD~)=KDEYHsm2u;qz&4?kvZS<9|I$^7ga8ORbxRKuPmg^iB~F;8Qe z{cuFR;GTF80c@BHeA~$MU(Y>q*m1xYa&J?1BEoUN$$W|||M0~}Kh^kp9JNOdg?V5I zkzUa{#Q}cyt31~+m94}lEpX*Axr2%0{3A2JY1iU5G?@ONxk=;-1LHWKax3OyO%M2T z+NX$SO%?cm7Q_4or3MoHIEGq)-KKIFT+5@>qTgkZf<<8B&{<5iPK5XesK$rbnartR z!LjVOGBYM;r1&Gs1S3xia5?K@djgh13eJwpR&j*H(<^l0*UJ7N)poiJf%r-=-z^jp zNS+h=p`X>?S=$1BjP8NyM`D@&VJOaQsKSest1m1_l8`rFQJR~h?@$nCHujI8ul?V= zq$E0H&x(~%JjW~IX~^JL`)P;bUSgEH*I6?_;jFX|Z80S024bz+fkYxjIEp<0xx4?U|kr-GG-c8#VsAd{1ER71!S z%D^W`8?^X#-}d7!F--J>525VBJ6MVqMCC=IV{2~e5fVLSbr$)E$n(830xAA1a7|5K zlGQO-ZbfW6(X-te#}s~Rb$F(({ozkg2l?GzPb51)d`a=;!lP6f71Vj>Px4LW(%{R1@TE;GmqpQ zBI3QR{0H8?7(Rhpeoavz%edSC_md2LzDC>EvE)<*@^*vFoai{n=7kCpQU?os*(5X3 z8_fe2Dc^OQhJ$_IoHi_44NxK@rIDL$Mh0+jE(iMx6@YIY8(8N_4)!@f(uaaR$4=mC z+t=Do)?f<`&h2q=ja%{DOp7FUJ$ZWf%nYnPv7%haFb$q69mj1QNyFF>DX~s<mHlgCvFQKK0|Ic<-7!r;A6^}2w40GKy#tBtt980#iC_#8y(H0 zHioaZ9dx~tZ3ob!x?(org_<&;+o}%g&kTzG__q6-%J1=Qx;)@;(yjDAPZA^m(ff{( z+F)Z2Dqf(m6k(drGwD)ztce$CFKRF*%1L7-n_~S>2Uf~vW6xhnLUvz5F*BRsYV$nt z4Q~=~GlqmHI*o>-AE^>kUB$|0?a}L_yhnDFki9r4-3lmI{D0BG492?7?N*=02&G~AD6gkjGwtr& z<=d?&Sk_kT_2dRaF>hoJp$jgql@z+_ex6!70$Y8dpfu~nL8)dNHt$A`A`gk5eNTXH zIbotASdW&5HD5eVM> z#t18)cu&|2;j_u$|4jk`so5;yu-k9`_|D@*GUl4cH0MlKp9An?y zic)dtPko)00mhyl`hU^itxs9jLf6N%&$bi*hvrmt^napqO9fLwVKwYLhfPt-7mz3P zl{vnRV#2zi!!Wk*x8OEntkHDdl7a_#Nlu;%h6x+cF3XzmA0EvYX$|({@ zz$v6uzQI9>@}-UMN+MF{CSr^8V5{x%mv{Z@f;`ppy65k%&T9=#IJRXGe^8h@F`<*! z(Ra^9-(M~H_to1?mR!w&HmbWjS4pO3Hs-~UyVSy`$a1Hp?$A?NFg3>6L`mwa(kXE8 z!c&$SV&Cyel(oI?g`+RsCo*_9KwCqh;HdXyoLR(Y0^b*V2=NhMC7zn5aU**>4~sU+^`l=8WW8F&w>WU3zC%J zQhfBo+!Z!GITof+osn+gCQ!oD9#7ilSl}sb1duM!J22#HCIw`}P{#1ejxIORu4CB|cxq z3-@7{=}m1)qVtMb`4IQ>IMHVhYSGZrRFiPlL%EN3FC!%2`u&wNEOpf#u=x*Srpx5F zTv1=G#4w(uIlV`X6T8226n#$dNJwl?3{q!|PJ(zIL;LP~5o}rr` z3Pu1Hwn+EK+Q<;Lep`26gA4gCJp()wk~VcCF8sGANg{v=7V*6hbMK?t+%k9gL-w5= zGf$MZ*%KB^=oHrPnsF03*oZFxT%%=p)Z?W;dM|G1$e6NxdLyPM{FjPgdynS!i-=$7 zginm^tA#>8>mg3D)`swaRZr7$lhUUD0y;C`qXiA01}^Vfo6C#-OW&xwzJ6Wrv&DAh z$A$)SdHK!Jb?H|U)E*wxt*}-rv`=u~C?4eD&YS;cTvmbvnzV!@U*bX#<%qsY{e2dp z(0dii`lbcn=cDYTd8?3_C%YClq}@F!d4KWDVrr^(eLhumBJ$@)gFF#Vv^Yyeb?%>{ zM8NtEG+6ffXy(SMJdI9!{hZ}2P=m{{?33Wy2`25Jj_kh);=W^sz z7!0wiv7EX%Y_x3GptXC3)zuooya=Q8D%5u9ppYDTmn84{SlG=Hy@ZBy-alUde^Tfr z=Is&*FvgXdLGs$I_#W20OJD2OOT!#r!0|bU7$a*(TeBkKPsv)J3I+}uluXsSqu#JD z1^cx;v9#O+ar2#>+HJ9wy9Wj6rBes*SxgDNh;#M6+!saip^>r17<5lZ%}?ytewp{p z!}f3Dfn9M9ZelRb4|>gT()7*A+$;`FN}-wnD~oB`^JeN%j^T3qnmkI~@<%6xoqKT0zgDDf?Hfm>ecxw8)eCd$cvi1QxF-|GPq20 zusICtZ&ulEZEDNyTA*Q?hiyaWQpTVcr3|Ih9?Q^;7AA}v#-_N~R&=@b)$HYnde$Nq z(SrN-D=g7PmNwDLOm;w90?W&TqM-$akgXF;!weCMIvwMeG)0q~)2X?%ID3kyYvO`` z#nAM4=06T8U|-VFFxn=+%cA_Lu_QYym`QM2g~uKiVGPl%RUaDijaai4x6|FG!z0u5 z`(>J@u3(|YjLgp~hBJCyqBL`3ap;vtSvHd#20IMKRYOUBv+^{C^0i1jz{vWIg>D{q zd2B%Yhew%-Ugc+HhAT;Wk5s`5t3H zHMye^Wln5;#{M=}P&E@_1&W?N94QJziSZ)&J>hIoWg8~oU+HEB7TcmH}NhSC~g zuUGIxvOj}+yvR{5L%Tdit8~Ctr`G~Aq07-&zrns5Ai$m4bZ!v524nJ#KgN>`=avv5 z{)*}qyr1MB7`>OV$^CJAYLsjCah*$pj=%U&sx5k^>Qr$l_RY(}=4vEr`ZcWToP#EY zF+TS8c1^NDA=H{agqKx?W__}tPgizwIC9vD0nOh0ZL5K{6}wmdo}bAUS6++H_vO) z`xjBKN?KWsnsw^>P5g%2{^tVv6rgm+UHco7KoN2L16vFgw_V}um*_#3c zqI%WDp`z+@Sd@Jv6{fImwPABSOnc*cT-FxE92~Al)WcM`hC5O<_e1{n=_v5ddI8E0 zNkZBx)rm1zU(5jdN$f)9o-qv{)xy{29GLC z^<)J?S@`6uq-oD;Y?Qa^s2<$3=2p!_jhU0zK-8j57QY>KD2@3`N~zWrpRhRRSp!-` z%$RB`W}dQ0aLr)>aN(j6K^Hp7)8P=B5xz@&1US^H<3~{@HM`a&;*HP12e*m=` zI`BAzS-nctP4acDlo*wF($NlBJ||u9Xd0U*q;9yzJE=aHZ+oH}fGK?I`9yBr4wV@h zwrnM0Qz03E>|QfCk6qz9Z2!0r5XI{1HuK}o$akec;?QUYa=xm-STby=kQM!u`ZCwJ3r??*@*eeP$gVR1Y;zNU(&2-6v1b8B*Gks+r24S}u$6q!$gBFO?2 z-;sM{w!Nvm5904j&=eInFW10`JJO?2X%Q8dbDNQ_m#%d5nSXpW7$#@1v1>2|TTGhc zD)#{S;=pKfR+0V2i9n9k(KUvy@;uolDVD_5J4BUk$4UwR(cO9-`HC;h*1+;Le1}7U zG5K}5LT%J3beFwKk$i0^1X^v^5a*%oW8QlVK=b##)Mlk$1KJdgvhRzB90)6 zK?8CgRXp2Q7QVLWzaidR%T?ML|B5NUxa71ecp80|qH=`xZ4MSqQ;FAA;Xt^d_3U-QVB6MsJ}ERvOMzzI-+JwmY>1 zf)n$!)p{nQO8*7ys8R*|yD)yX8@;dTg75pQN5H>NAX?=vjEzl|r8vBZ6eCrA#DCQC zP=ezG%&x7$1H4v8WJ;6*Qfmw0ex_I%!|6Ky4JkdCrWB-$&Twv0vDXTbu-G_hI58I& zYOp1$4@4F}AN&lv4WD(#3{_*>`_B|71HNh^I;BAw;S7MYRYJO?SF+&q-7>6$F`}KE ziOkTd8-H9hc-d&XZ_1VH-$32JbBMdEyj6`QO8>h<>t_P6uS7bvc3~;g1Ifv`@Gbi9 zI7hWIM_`Hj;1~kj?vkry1YWIE0!(s-q4NkYfuGUjx7JvN{({IGA38Hcxai}=a+OsZ z$|wvviO{?DIH5{B36*n6Bz8IZPs3X&zY`mxPUSo;?v2H@;Ew>huw*VH-a9mO5xc7{ zBLbFoh3%181o8Eb%j`+Ld-{wVUW}-onkV=^k_|pWbiA}SeNBzfZLNFg#(xbkcaOxp z^6mQ34B?}%P_7%G;8Jrrpu3@ND83=m!}+W5S(P85!;Q;ige;1*`K14}LJR3T2?@5lSpntvF&^&n+aU~PRvMW4^C`OaUf&EiP;DePD zVQfCivjijf_sPP0ZS5y;Iz{OpSeh?zC4QG-Y7A`_z!v8eU<3wLe%s2 z?sP}EhaXbkL_p{EKmUT%O=@6kj+e#PDAdJI$knlA?_W&g{6tekP z2fvu71|PTg{#>?PTz3A5H(b2gb+*8A?TW8qI1e3GGl!EJefPt{KnBk83vEl?#bmC5 zYtc68kq_qJOCNM@OKRt^`prq5dg50y83d3wRM98h&-n`;6Ds9JOJYWNQk4mDdK8I{ zkMz*vAi(RyS0~)t={V;}azRYY`TQmMVGi7klS0A#>rXt&Fv{SFIWe0)A+*DilT{7f zNn6r4`1ijT^V?uSRxqy8kHeby3Rh8H_pQgDx&I4dL7l#;l9qQ~c?8E}@uFd3T;H?h zT+n;9qiWo>A-{FbsO(tGQ!+K3L&&9nbRQX3ai5r^xHpA=n-yolLqSDz9#i`}wwm!g zMh@FqyB(kfqQquz%=VHMaE`_9Drdvbao}yIYCLAN|7#wf!9XuTz3+ z5zGorqqS_XuqJBHf?JJk zr|3=-UYpeT_G$ge_<;ZECEcpWbzC2~^|nH}q>_2z0AGRQ*TS|lfVLgDHyS`GVvFzh z`HtZTUHek++e5E0A7L37Y*gDMFsBdYZq^_N z7B?{~F6)2{4hWU4)TE*pby@}bM7`j?IYb1P`@oyexMRad)7s-nhZFvD<0C($jPsg5 zhc%AidY{ns4reu$?4fsXR=nTr6KM{~HSA4$3U)wW< za~f!&S{d?dYlCm)f4`C<0Q_h3Prv@ZzRdIU+UNg8*CqYjP~3Un3R2*p*ghEfqvISm z@V3F8TlyfCaVFwX38so)KMH8rW}tE$(p)BnvRqUi6YpCjSS8Zh7*t>(FzjaSa%Qkh zMUur?@VJQw#x)CWUMZVQ+r+)4yKOaN=vYJ+<#3Z(P;X7meK10W6JTse!3Y~jwvAZ3 z>A}HL=51rQ)Qk!wQvf7nL_3D-N0yJ%5HRt+^=KCX=Z}tPNMU$QkF(V`$F<5uTs1^VSjJuwoeih5d|2hE^53wss7^ROK%;+NRI2c-h=hFDslLza4ZkOrA70$$zAr} zOAy005k+;gkB{2Lv{obl!I4UF(Ft(&MK}x&4>7k7dNE&QR7EAgWhb=uiCb$`U(_Ds z>OkHoQ`F;%5A2INv@O+f<)KQoJ1gxWJ7X-LSlgM!L}~}0j_X@*O}_Znp9kY*k3{gg z&dPZBZ6+SBD(qkDwv2nx z27V08r@GHn6^FsKxVOTM78tMB{yhOGl}2e_PlLBMI19r?%DAiohW5HePB;s+o0NgT zAf#gyUvecJ{=2Zv2nX<3T+)WY0xw&^T?@NwmsP-d2*^r{3y18CmSM+y8ba$!-YeBl z4{7aU#cxgWhql&%x>Zu?w>>q5xK{=W9iyv*soss2LA+!`jm4_M=V-G3UWgcvxyM_3 zJ#avQdi&k$oZBwO!W7c2W;DX&zr9%uPMyctxz_Uw0AuH=u9{NabAokdab42zN+Ew^ zgp7qzDf&VWHh&*qU;a6@0<>iy3oRErRZHwUB=I@WN>Xf4*D2!M(b`cG^Z?p9*5+H@ zDvQ(ra+3$P3EHUI03(&|3s3I)ne(_)iaB#l?GRxCk5NJN6^qD1lc~onl=rHrfR^)| zY%}~K6M;GqhYd0|;D#3fK6+X~RDbI9&8L6ny}D12>$pCs>uuDFQZ#nm;bFZ>hm^ib z1n{n%y!NKTL`B;;9VjoQb;e)u?CY-4>{lG8(CM$l|N35z0)L-|89@&S_vd47q zabC0G)pcm&e9Lf6nY#AYZZ7e`zb$(_llb-{@b$m%xV~l9`4@lVJCo$U|4DR&18g2m zGMhr>NJDUfO`=--UM2wA&kX5nG{5b{R1sfDB zDsIn;-{7baFD181a2x#L>6_hW#jtkJk00KS^z|0S;b@4xg=kuSdWACA2I*i{JVItHzj#JQ0_ z;3sGKaF5SoHao__I?%CW9?SxE7aL@-kj}`sssf%j5l(@QSW2HMj|G9bS4B)LOv*Vd zgO^Y0is3U^Sr`Wn&J6<7052-*KqzN3BGeezEY`CEDtz`$yvH(S+#0G+fHplbsbUY{ zA@a3Qv=%in|NP@nlAd#jW*<2Z0Ufa5+u4S&D}pQx4G{sJ$4HDBc$`H@b9fPB>$Sd1 z858etpA!Ns4q6ohL#Yjn%+R;txiWjQwa;*FG>oed82g@SrD(Jy;{hkmW0C2PFCE98 zI7BIt(HUds&;Xd_gpu>u+MgvHc*HX#R1kFGFfldR35WO`Xiu1$ts#qIXIJxuC;6fQ zH!V9=EHt%>u7EU(S8QOf`1^x!*sshjOkAL~LP_PQz+^rESZK!3(MC}V2lHl1ibcl; z8M`9bA!8~5b4{3<&BH;k)YSg_xg#_CLHXUbvMxcv#4R!h5w`%&Bw$#3{P9;h^>2K2 z_Y0R___gnQ@u$A$`Fnlu9@lYwP}bWD$seHg>YH!&H#z^(cc31}y}}zUg4c-+Ol8FbvUML64>4mD9A51Ne8muj zQ5DbkvAvegEYN0e!*qL9qrW7an=gM5JRXv^Ap-;Nuuc53omL*p$YH&r$gLBL){f)m zauPg-!3udV=zE5rbZvt=3=a1V2f7}Nr#r1!u=fLp`mUSQwxa<+6c9&BM2WI4QSckH zlk9TFLNlIeTsz<|%)b9)^Ot#!#$Wuk?^n_PZs=(L=!nNn6G8g3wWv+mtIT(M9s&{+ zGmDZ2Xh8`oEid_|i5Pf?eMZY&F5cLr{8`WJ@Aya0wQS1f(0R;@0$hfvQpVDXud7hu zS<~RM4!DU49p@}cI=7n+RTjb}UNhSqSFkrmuY#Bd$V)wZ%^- zXshZjbH=IjSStOv9dW2caRPpxEi$}P#jnkdAR-W@U-~+-KqlP+SlEE&EG6`812Yg0 z5kUvE9Ek9k?!kg|k=a2hcr<6eV-I2t2SOxYqY4jhj5f+)M1To>W9Q8x!_UZqn$HAh z*IWY*`wh&3vbABqrG<(tHDh9Yjb{G9Wc40R=~ouN@}<8Y_Oq3!z;Ho_Kk z*ZiXIbcs;48w7`0!-wU(VZ>~~yv5A-E+Ff+6br}o!C9N!{d*T0Ua$6r>#7X%=+HXR zJXS1<#s@+SB$kv_aN#1<#v=+kHfEz&MmxW5vdZ z8tY_H@WP+1YVo&DaMPp~k=3(5^R_V^nQ|Q*Ed0me-n{weHUC=#)v;m&S)_x9c4tLc zB_)UiIICFL7c0|V6cXoFD7u-?dX!&F=AeP^@=C~zAS zImTdnzgR92 zIEM&cTLsxR^|TjEeQ3WQmN{ddGe(}*QYG}@md{j}(FH#^6o;D>TU*G==p7kM*(<2U zsEQ3T-yf871v#VRT8qyn{vGEjzI{%{BBxZYoD^2S?#?Fp*Cbd?wx?1e*muXM>huI#Ivd#Q zm()l(Y)HKoNtboNpmG>LvLr1nQo1mBv$C+ATYPnGzT(0KzO!iTlG-Mq%IAdE3MW*> zcZM&k9H|KaFhjyz)8D!K)F*%brJkVAst;>n zM^&6v9_yrdVhX+!v`QiXBLleBd%9C@aeIUFfCuR_Z--dJaDl@4Jh zuw&@}dtbB>+;Qj=Lr>~Nku4oa*SHEyuA65j{v|cvxnt^|*g0#U=sAZwyVh?FU08xl zf*ogCC3vkAM)OKJ4BjZ!=n`mh;sh^JL{`O8X+yg30b7)Ng4f1YS*Q=44I(PAH&1Za zJjD*cy(V0^fQe&zAVB~1wGICj3|$6`+P*mKOd((Efr||gb+qfd6FrrCVR$1mS3Fpz%DMpbuWUePQYa+v>^(`qpZNYB2T>9so(`IF<@xa zjh?Yr`SW}`FZ~?7_SWCN^5I|ma8+SrtoEo>(VdX3J8Kfo4E=WE53S~9B4R8;+jCXIMK;Nb zOtV?sr-ZF$8)l@kT%y2vZMb%rcy4X~kq!EGowN#Rd5-N&;dH{kmq7*m&aSJ*RK62; zhD6&CJA~mGEqv5 zWmcvbu9Zc4RwaEQ1nfWyLSqBhwW+HBa2`S%ZQd0@-_w#JV4*s8^%COMJ1^bc8txBJTNTV)CEjkz#bgJ-Ke%WwvCdk zkwI%iWxqcI7&|-0rcyUhbj;H{6rSIqZEO@QK1&MVz&rCh)A!tg!=2KiG%|Jg!T!Bq zCHJbRt;gg5EH$;8AAlRbTTLy6rl`Vukl7rB1A`Bm5y6zf5|Yw|<9o;nrdz>*p6(1& z-Id2d?3!&v@dF?3i>my+^Dq78Ctk)qeO$-&t-QWrh5DERQ6f!CL2%;vgn5C>y%r2hnhcg6%+27guan1 z0DDjz<>U{{x_IO16J-3tYq_fX!t3s)i8%2NmvulT?0D>RZYRgXBih5H@;Ixx*~$u> z+d$v#o&<~gNRR4S#X-4JP%UFZ*K>OQ`97j+h0EM*KP9LFreJ$1Em^@=cahjPl*BD= zG+*o^&P=f$2XAu%Y~>FEKhH7}iB_5QW1Ct04?F{T23BB}yQ|6C+6pQG9un;+&tk;0 z9H05h|HYRbDl&QF*Zu;4ztOe9CvgjdFnQ!H{wt$04`5SyYxeW0r{Nx{lG%W(+o2SRuUu?G8&rnQb!t z-C03Pk9Eu@fvB#bbr6Pzkn4HD*n12d)#;*YkG#iu2)GDT$uC2I!mbxPb_KIGbbQv{ zrbq?UHgUy%kwG7C;TfNqFS#qUC7gPORLpb2JSA+b=w4z0=tnLv#lgh9o^d1 zyfd%x$a$^X&}y_bwxPB`-c0}Bob za$xaip!E}P%-`-nuW}GU4Z++B*hMb(79Q)N&G%FyEuwA%MOPd~!q0Ll9=Dkr?f@3r z5$ps7p;g8Mtv#p=BzDE2W5sncyGQ5)pSjSVp|M?Js&tB#5>PQ`1HB&NeGTMqH=AQ;DlAmsJ!52 zA92^D7E=hYxa@i+OpXGR&35K%oi#SK?;WBI$n_r4VjN($2}L*XXGHVu3uvLZs96v> z$4%+T3ahF4h6m;^Zj{4(00Vh8DWh_*qK|6o$otkdwaZL}^Fl`X+Pty%=6gM@JO-XK z0y9YwiXXlCzVG_ImwAfLzx11*5V+60R#oz(3azhK6>Z`sK=s!@vQuMd>^w3JZ);?aa(s*5T);sxRYo(9yys>_1Q+Jbbt3I+BN*}#L6vyy88iNn z$zi{Zv9(NSxvm7Q$J*KX7zWqIi#N(-JOEgOL!BEd;5RwrIz5FUeWdM&;u&4aUir?B) z;;kx{nTmMdHi|_-U1S!{58!=MgJ`_Mlfy3NUw z8+o2eJa&Lt9l`f>aT@TUY4!SkTm6rJ_`CVIj_ZT7zG0!9AN_~&klY!6c$*dTnDCG? z7V)5VMJ+AqjES+1=aCPfvnrU9#a7yVliKNXfZon`x)f|ZU+*JM0u%Vk5MKs8$(8v| zyT>B=1G6UmtDnA5|3e>lH8F5X|Lw|J!z1s|v;&^G9isEXYuf>>4dTwO&y@|I?j9A+ z4lIoO_S%kfxNQ>d4WZa|!p?>bc%4-N!$8_XW51^iTrFa1)o3OHI@C76SG>pT%&Ehq zdbn>~VdKK0Nz1$7)edPaXZ@f1-vhgXr?DF^%&@0>bR6f@h7Sgc-d}$u!+KQyUv6>$fFS^dPtYrYL z1!JQmzs$`>a2q3nDWM9qosW4=@YbQ2nPTmPNW1%-u+ogN*;5u4loAA%9Otl84)vA6 z!=yy9b;Pykzn-Jb;@r~)GPa-X1?~GRHV&%UERJ_jEOJ7$BDrw09R#;#TUlf>oCSh` z91;xA?3o}!I>uPI@!3M#V4A|WF6?M0f-}cR>Wxx8R;3l<#1wKB;9fK4nZytg4h}9f zn@5@6;yd#&FEr!MFm!!!7z-_mg=~>wC@SR!YL-*WZ(eBP&?Fe%vIi|5l?WylN-{N! z-p1~ybH`5F){5otx$5FWr{OP8-gx>Sz1R2naUIvU>UtX<4lstKwQeh+y8Jvud|Be} zQ(ALfx`4C2N3CoH1(BBZ`v15F&pO|LWBhL4urOex&@Q^3-sxq`ts+$rO=XqI?Bn{@ zT+=T;{gE?qKk;#Na352vP@dHuIcrNu8JJBWsX`sEAL7)g(l(|ZJ?T`K$JB<@cwzB; zZp`CnyNL7Jw=wMy+B6>Q?-vAEQeK-Y^Wg>|S>vm_*oNMy9Ks_OG2yHZ7ir4_(GA2wakCa#({Z_NXLh>)(ed@da z+n0KRR3*Oo)@QCl_~eJHihpEY@8TCO@y%Y?y%JE#J+C~T?IX@Bk4AwfRlseE=m{0N z;8`s16%Zi`O#v&ib8C6oBo=6!%#^=q!&_Y|B6h0CiCu?E#D>V&0e}r&3J%l>dP}sZeyb5!W7uODi(>J_y@CaWN_H96?+wrffb_++fhwZhfB=T6vvdE%2RzuI-PG~lA5?K=>4j@m zoH>U+IKX(}hyYYm^Sg$63u=Rz&Lay@0hrsS`J^k4fx7^^IuQj__a4@ zpZ=a-ei^s?aUIvU(t2B=T;Tfy?^t?3t@eo}$YJOKj) zhJi)ELt-OxpA|jN=;He(;j$C(e8(yH$~q2(pZsFajogb}#92-21F?u?b>CU|$Ym!W zW+qXdci6c|%4=;B=qs*-(A2fX^Twj4iC`3{QmY;YSr?I9@Te@1qrwLCv`yT5v5zf^ zE{kH555sH<7GbNz*78LiaN9(5ZO{+^oK4OLC%D&)1@c>=j~{#K=je^Meq!X^k9>Po z;XWpu29IS@D_Vh$qq;o~v{g937|KlME9rD2&j{iZ=UT)+$C;gI$*&bT81}r`o7G*s#X?(z<*n>#`2mWkuh!g?thm&MN=SUuf(5VizCX)c92D;RkacAK%va#J0xAw>7RJ zC-`sn5vLWu$W}3b&EQfQJ}ik|0KeQmfewB!_wj?dk3XIJ?awd&9M}7AO~3G4BX#)P zYp4ceSo)b2nxzOH1&<~x?qkNZ@_2}huI_nL8qF8F&5Bn$6|QU;bs0H?vx=$p9A_&O z)+yt*NvOS8(G4`2WQq*nqGl^zgw%<)NH*n^zI;K~GXy2t0N%4*#4crwf=BJ?HGQ#9 zEt~eD_Lu}R#5;}!QV9d9Onr-{lr36J96w_z__vwu=HJWB!nyRr*RQ|6dYR{F^2S?# zRs}y*a8?T7MH8_%^)7*kw8H4ks;w`3Z3^MQ(_;0a;UMok(S}hx;36;zh_&n;3&+|# z;bkCjVsjOxc)X3|WtT#_3_b=^jrXd^LR(0&M@znBPKbRIz<9_d?wRMgybl56sZY%J zJ2Zdnskfp(XPkL@t`m4qJZQ$w&~eVx@4b0|?-Frv3;R7o^LtN>#&Hp71F66P#DS^# z%bbjqK`TVZv9L|%jqcdB+i@gulyHx-i8yxw9kYdu9m7{A)2b}a!Iiz8kRuuu?oXjZ1+day8U zpt$nElw`q$p#w93k?@$GSdkp;bped;UfDHP7}zD6n_h6L$6b)-la-sGmDxWAaHizb zb~S*v^Qg!IEHvSA9PqL8`rE2H{5(FZ@B9n;xQ^=sxZYMM_bglipcnI<^C-A(o78@J zl+ce=dgni7-mu*zpqetR7+HN)2PT{uzjm8)i@z#Vj#|X17aS%ubU#kKYX@73f>B%X z|876uas3fls*>IQGao|rU9Sq;`IRY%L0# zs}^tQz&nhMJaOA3^c=6Pr76%!SzN4B#v-!74FWvhMe`+V8}GUkyKgrTRGGXbsb zU}1={O=fXMzbUWpjuXtx8+#ig);TjQMA$~3Rvwip#g&K+$N6MSn+Vap?%XA`0NjkZ>a_YWmJ$mJ${zwZnj`oUu#^cZr*ziT611jCd}E z^r`o_OAPfG7(D{uXJ450<01s6v)Mo={ng15?i`j@1U}eCDL^pxp|ynwfO`v7nPrkc z&b`OTd#rNCg$+rrv*N+5411J8HnXb$coriT%Fjo?IX4q?qs#P!U7nRiRs$@ulX8>v zkm)}z^p1@cf>RqFWU;92kXqk4Jn<}^8)cFrNi!^52R5L%(1aawYvtK1(*+x0VL8i@ z$%0_l#epe$T`=))nKL)Ljwyd9M)25zSi1zE-(IKu?o9Ui%Rt|QX543P$nKPbv5z6WOdV~99aF6V4pw#{IClX%vX???FzA~KWzR_R!CQASegXb5TwL8nu-aC4| z5Yx3bp#NQyur|Ehtf4n;Tl{?~V{Tu5o) z*#2IlMYJRYD?pt9P=zX);j3hxOea{HnpsE)duSVTyGj{jE7W_=VHg~?i7n`TR%7on zOo4bY*IFq~1DU|L4O752nFahd)2Avz6?v9YYe|aaeEm1GPks02Ug`;Y`n1j=efGlp zt5a9(DJb@*fa`G> z%seI1Gn5#(jvf25Cgzo0ri_cguEH!P44rG$+p*^W*F(;B%+I?p8bt*r>kR{~84fH6cV@#V&#=ad{#WV>J;&>!@2G4i zEATr)QpRNnSY|4%_c@t0f%K2tRQ$a3AK%2tO`aXc1Qw$^rO*4)!c2nsfydtC%!ih5 zT?q@%6X)Ij)$CEfAqvu z@1~pRjF`kd>{jnxr`1L;r)&KHUaOiH6_{GvUy2RMp z@-OxggFt0xYw=FLS~u@c)35g5+7KwcRhb^0Eg)kw56Tgn=kmpIc%ZE{^if} z!gE%Bt}1=Y8>Lr!ZEEth4g3|%T=D2CxMA9xKYo_@9v(8=?yH<|YC$AJ$1X}VHF|8; zfOF4asGc~8z!=NiuoO!IHw9KCW^$DQi+IkoZ#d9)k)XKnq4fq=LOaO4snl6{-k}`w z>xi_m&K=>oyw3?s<;LaQ1$6CaBvA~U!?~dmYcP&Fm@4mWqwv@^QPK{GE#u5ABE?s{u|d79=2lr=7|O52&1Zh>*4}tx3inYJ29Qs;Fz&;j1T5)}Td zwnc4;gw0^#k(FxRG9DP8<%_0ZypmFh^CB%iPC&)F@RciL-X1Y>@1HgO!k0hfoc#R9 zwe~sjIv55H)68SC@DOgW&dig%HBa)1;oqiJForO#8mE@jS2=p>6^dCC(enXH2e6M@S~Fc;G_J9Taz!o z_3w^Ee*EKgjcmo}Z4)8FfRBQ1Yixgd7CZ*Vy=Ji}E$_H;XlWG>R@6k!>Qcc}TD$g2 zj&yLe*{tl|?-~+sucTd!Jr&TB(AIOttqxR7hc?VMvp}PvH*T?`tzu%-Cs?PPDaEY^_)udVcQWtKEWrcL6{9UbQXyiyAJV*V@}~^Thi$ zsjutlQ3Ze}A<*M2e6Efye55>A#lcW#{QCl8$re`JmjToUMC5hE;YExXc^0RPiKb0r zYRbC`1(th5xdBwt&po;N_ZC)C3z26*IN(;qnfpu(V#J}KEs2wJQ@Nua1_6uuEvB~D zjst%C_P>)Nv9v<9DDoK$b}349VK%D(5jMyUD*gby(_1KBoK#TU+9AxbRKj}kt#~?yYcY`krweI zrg)S>^_{GH8=?|Wo!&pwU7G zKCRV-&we|q%PR>8w!zt05YDs;ZPB{Q-de2nD zeWn6@T6vt-9_LkHi#FLnAOOHfEHPna*YD$Dy3@+HU!b)Wft!@u#LAv|rEi;r$}xd$ zXx5PXCRqW;g89y(v-?JFC@uX_V0efJ@T3m7F<*5MK_>{Vk@lkQM_=}Y`{a$Me^NyM z`-|W$@PviRle$8|f<1mNoCn{ArevT^&P%E|uL8C#Gna10eah$xe^0Q_u+AA%9}pn8H`Z|_2mfz2 zYsHx(Lwan-a%hB)Mj3iCFzX7yzdtiZ^jYwvO#nD^0b@tM@hp)iT!Fsdjzvb_WuC8{ zl3lG<5EqqvFl`LH*Qhe{yM{&mZH}mf7`QTA z+JUrQZ3S>^DTYf;Bw|>ByfLowUKQsSsok*+aW)&qjYgs#HDf1A+XnbKXZeskn4kx% z2H1HxGo;_fHVAViRi-a|FACa6o}31J^sN4#P44{D-HNi zsw{SxUgqO^|E$vo`I%SY|K&;YXdJ%~9xTLRY_xhZnnui%x)3L2%mohUq7^ zB(hGxvt5IJV1ckn{JG9MJU0gTz;hb@u1R>(2^e}R(A$(T2qaP5rG$$*VAk+U^Ta#M zBa6A)J^itjP_e$*CyaxGg4f|PrFH|?b?lS?_#_uE)2yDN?{&RPa~snD*h5Klns z>qVm9bLy$giO~oa);z zEK2bxv;mwbRYL{ZVY#!wu#9!)P}Xf?hhpkHW;PI5Tj4i#RCNn7E`kLelmlF40Io4x z!4nHhiI3XT8~agPy5@BO9oCr<~_kH2{#WDUvriAE)~M zh_A_)-uic@+5Px;NDX+Nv&y;`yUfC37!lssBQ=A{-q8D&1d#O*gfKGCbpxX7)|MXFF`sp#^lbK(KHO&-u}t}YzWaff z{Kcp0+?U?^xijxS`jNWALn@498$<&KZhK&Q*?nZZZvz`*3mz#K>le@EJf>EGXIh?M znP@rLnQB~Fm!Kzx)-omW))Ei?~QUVwEbAw-p}=UI$UVW`Kw{hpm>3>;NR z5f*tBc)dkX*}aYo-nfei;tUh#sIX3LI8cQJbr4_{S?D@PuCceDs{j_(Ez3B(wshxS z#E7x?t@WS;iU70@tj(X^*k@Nz;T>7<#!v#b_VYTvOI zI1VjV_Bndu5QHR+4HT#1Fw3-8+$)P}0hQsE9n0G2A7zs?*VKO2t(iima_F>{f#i># z)%eO?^E1;gy!F4&{?sSG@ZLWtj_bJIf9q|9a#4~6hbZf=clfy0cr8~5B5g4Zd~Mt{ z0OY{JrQ;Y{!XOaElNj)c(81hduWy@#Nnk-fkNNFN^6#^fD)vC@Wn87N<&S=|<>c+P z^t+*Q9M}K?67&IIjcNDdU-8+BO#L+?XX} zQhAH6J`5&Bvqfy|OL-88f)f#V#{iSAV{~<`RHwU!QgqhBJ@IAp#y{_w54z)6*z7U~ zQnUG%$ARdlRmym!uCO;>{b}WK-9&Uf{mYf3ryhWLo_YWEd}*089=mHOyk(*X_)Zg+ z$Y1XH&0oEH$>(VL##?{uvI_skN2o3bX48*6w9Ws0VsW>#W{f>m=YiQ1ywKVs z#^0U#06^i4+Z;`4E=4j2{P>)|i3wL#z@1rY297p?O{NuPoihgojr6fHL|kolC9Sn*%bQ5h~BCiCBq{Ntr-JT zn6uJyu-4oLYelf2kHXh7wNKijeBfMLBnto!piJD}XGTe%yMX(g&~f}OECC@w1oxV7 zWvP9Izg@6_l_|LcQ=3Q5;lT#?x@NWM6>AZIo~hcf>%RxVJxIWqh{w6}cwq%}@y*Yb zo0_|V<`bZ!w4&^w?I5MI2WwRW-}P;s`Zs@f_ltvH`K|9;ecvCuetA!g<2tVQ$NGj9 zW*MT}+K^1~{FZX^abf!PM2n&#C2J=R%zrsHpI=cMCV_umZt8cs%D_*f+A2yVSmd3o zVE*ayPw|l+*B{Mw`sQzsMdWj@Y1KcI&<<}pA&|NZaA{q*k7(U;!(H&yVrzO4#|>f>iVF)s1ctOH3EH&z@v;YQjCa2`Ut zVJIONWoYgpXUr3e3=!b63S<`>4sxdo2Wg9qjwA74YQt@%kX@yWwPu_K9=j7KSR@t| z14p{WsWG1CF<}c1K|QGgZsK9MY_BA31S`^k681rlEI%6{jzw<}!PL557lw%|!)FTG z8z5*4s{ngng4R2HVgrH2S3FM%&tk;bl*FEM?SuS8924E3tp%g8_ovF?$B`#VqL3$+ zM!?8QReq5ZR7$`F&%?bH$M-2&LLYzMET#6^>zjAHu>rXF=(s4j`8l;jz7rvnSaBFw zj8HU6mh*Kc^6);BbU{U#vCU`RW37sL&RCkoLqN4#!D84u!7>wtRtr-GN!@T?`@8K} zt#WRIQXUG~!xZa5vEeYy(ufj#PimjDT#p;gm}^2~*FqmG%**#@PaGEDb+^@ps<=@SPYTh)ndM`NjBAb9*!x;5z0eQV zx%$|o#>Xz|57lx1kB(s^$8}u44@bFnf^|B0#TX5pTMwInD%|7ZxfGrEHZA^;a!Z#e zuPYG$q6Yn877G#IDsAs{1tChVB$+8%f#A6Qs4Z1N-u=TT8a{T3(4M!1!_Ma3FmJV! zR+TJRwu_p>U>zqo@q%4C4Ct&<#xmvBtL_B&yw_oNd8h`0mKMLqSd^H4dkap0l z7HPS;&zp!%rsA$vD3*UzIbe5Dg?6)1n@TzHzE$i?n8V7L)L-34c)N$aSpv3?Y&K;> z)pguRSB|P2j#Ap^wn@gs4j=jTe zitRCfFq%URp0iS@PCY|Ao~MXi&R7~UEt^VTIMy8z+~kBS9}sXz?JJw0MNT}|%7MxM zm%Vq7nJqiZ{GNBMwRhdVx_#Hvw%gstTx7QyAov19l!!zbCdx>O06`)~i~>ZFLK11D zpg}VNO_)qH$wY~AaVE+Tq)9*t7Do9ak!Jo0iZTZG#f%dBw1@EkX0Y9T&UdN$>Rz?? zT5tY%-nHxNZZPMVKHY7o*Rs0%oVxE_yPox~=lwkp3foHQQyx2yj@>Q~B_e+p9dT(+ z7-F(hhI4dn(VMR-Cyr@)eQ|i0YIMZmDn%3^UT$Dkl{^?YMQrRF0n&toRKm}wBM#T8 zrgz(j6#4xxG~p^mROXrP$^J7tvVqTz(9^w9QZl%>pa2eLrEsuC4kCsYfqm`*n+3Lz zJOVrGLva`gNkLhx7iNVCARh6X&s%ucaq%yYpMCjnJee!Up$_%+Q*RK;xg*^5wn{he zT*tXP@&pZTsBn8E+a_6*bb4)|Sh9EpE0t6Hq!-6sD8#{;9y2TH7 zHCm43imu;>S*#PgJ`cAw#(~0bRG81$1i-u|Vk{FgN*lz>7N$(z$b)LZJk3)}13WJS zJj@H46kn_>2=s4GKK8Bu$CErh?|SK_u2cWX_k=KhrYt$QYqqT07;#voGfNwu%NC4*cTEt<#)MVwyydPd z6V5mwH?dT>wK9&HF~AgHQ56?Oz&KDCd+W>=Ld=!|NJ6Vj%NB1tRb19JE<%B%Jnp3k zZX#L3JLRs%HgUJD<>(pSBqlaaBD?Lu&daSWCgzcTc?XLmwq1kM5YTrXry=0jb9=q( zJT^#}#)y&GNb+!F9!EM|$Kuo(csvni>|e2hel;+=7r)u~xE< zbL_JR&(FCgbj&`mOzg5orLALN*WH2hwm9JXJh4vlzkHw=69-G{psuY+ZVPKfM7Ni+s zEQP~^=Z=es+U~OfsVXZaBRTIDCub#|MfTj z>T#$;ef`uM6zZbs$YjqP*{lGXF38eS^K!_+I`YS=V^h(C;88k<6sYeUL)i z@pgmY8?Wf2mSVr9m%DP0S~<=-2rVG_f_SKRRvkb8x$hI`Uw;pZraM_F2fsE+8$R~5 zij8e^;sC>ey!#MgmJjA+=IglpvTW2*X6}yyhy^F8mHTS&3 zI;vTW*o_up^z_yiaSHlzud9foz~?_Tn}RBEYBAF-zdsLq#&CXRS2w{Nb0Z{NlpJPj zIdX!p>e_-d1h1qDbEJQ8^Tp@>`jb9JYi<9XvGd=4FBBFM!bRvhac&@DZz*V*fE`;v zP%y!IWx*LofeCn-cA(gIrt^X!cZt`^g+t%ix|JQTy!{X0HFhiyU>*}5R5h+^hL@=D zwTuj@*E5@jg2Qy<;4!mnVg8)EhLa1z(3F+Et|0V$IshH-ut+>V2A-Y0i=v>=v}dpVFda2y28Ayo?C%04_Mk)`8zZab@8rK40Snm}|s|d8z@R zC$wH1-D#F2>_b3G2yRnsh6ro(kXPXQAWcM?^uv}=$R^OTvCxE(?Gz*h9;VvnAJl$# z*nJKFcA~gddZ}{=N?Qay6WuH2FeI%P(hMa|>=*#FYjL3?jg>J%Q9^L7JdRx$8V`b7 z-CI@^XkKRvq^ZEZs~>u%C8GFygU{Um#>c!o9O_ViV(JYFvvekaZ5S{Ab8TYwuB6Pc z{(f*xz(;LAT6wU@!6yAdaoi6S(3#V$z-u_ie*i*3y}ndMRaA)`h_40j7Qu^W#(*8_ zomZpZeEAs_`NeNR%a_)@o5zU4iHQdKk~`kvybP%9yt~{{Fy`|xMm$V z>Orf-!>Y#2=oKALK{PegUC%ir6Ls%y73dkZuI(MRW(_FJo}peb)%1I{3xDxRhl-3} z{M=8T`Qk_4RWL*%fv>T)#ly<30XY!l;jV_W_nKp+hvo_HdDndIrQ;w}jtSqS)XX;w zJV_XZfc)jiANz?BE*7?MZ#jp11!)iy6YpIoI4vmTXw#s`yp8O>wj@&&6xVgcEOKi; z$2fcI@;S44Bv522Xp5+n{_vgV>!cXJmR)9N1814{n*&j*#OqLA%niK9z#jMLj!mO2 z#FBZi*}$&5G-$+*4Y!_!fSbse?9%KKlgNON%uy~(^v&&ia^y(4NWyMuQeJ1fP8v_K zxA!?q5loK`I6Icc zEWWb$v$cg$4f>TK6oF@+*tnHhD?EUqA^DbxVJfX=@nDN%WUR-!jMF2a^&-6=t;9hI! zBMxCChx$`nZ=hbh=+}SnEgf*K0q>24b-OrBHwa`Jf7#b~kU7S8?gId5@gHZ&NfeV<~fZ@Ve zzoqPhO8Q2y=sF70jroIHBJgHuI5(mDu&(!m&Y%UPEA$E93jvjNmUA~bTS~G8qh%fV zTk{o9V-08DiN5oQ!mgkPZ36KFY5W#ou2YumXm;Np)#JN$h6lK+%LazXa2;bo$AVGDlWc4|RA;xI`O z-f^(9W!8$Qws2 zCq_bn;>6x(0Bv2sey~1*4WzbtocrKs z*0R^}4W}ixwSL?0T)h}b;wUWlMD zF||zz9q$^l0mD8bN=Hw;2Rl^vN{=sZDx4G^oj`nB5bkWex+Oz-*(5%aL~&d&viiIX zHmpa|#KVfidJ2+Zk^{~yo_!hFy{aQm!Kn#o3Mq%v(wi@tRE6_0U=fKwgIEX8yv<3O z<`=9B=K!3Q6r>7vTO(jtC*Y=vn7IT|`N`Yw`oL$N4EkKik*E6JA-^A-xia7CsI1g|DGkc5s-m@cW zLVRh1ZaZ5zsEO8Tq6eM!J072f?Or<2>T&J^ra8vh2@3Jej>Szf+l#n{y$o=Hlqob` z*%4i8Y8D3TlyIDbJZuqh;vCjWF7=u7XnBT@?4VHVc=s)(@5qKEJ=nd5SvtlReVqVw zAPvJf_i^&TUyi^Y2>s);q==5Mje_4pJ0WA@f5bQ*oMaCM6KKMQH0z7@MKur3h zc>exxOg{G9|L`VVP7ZabuZwy^NBL1IV`^45V3gU8k5XOl$UL=YK(|JaH8AAe5@O}sCV2S=r0 zaMLr&M7jki7S)EMw#G#6dZyk@D-M2Dpbg?Eh=qVCh6U67x|X0;I1Yua>V%83z{4H8 zH7)1x>aK=h@6&Ia-}%Z&7GB86z1neCB^r4{060f~@^Rs@v0a!~E%omva)|7-2zX^z zVPpe;NrA!xP90`82nzsb1?d_6!sDjmYrjRpLenoyKla@J^h6KPul-u6ocqMPitz3; zOG;asADLU=6pZ|QxTSkjM>q$x!ERR9xn?l#)`l39?yU_iCzwR?dZTjJU~M+5AcC({ z6$A{@=sJh7SqxsOY9yOk7zf{29CDz>w5G`QA{codhqfaHVr^s%fFe|(m>YVsXI7A? z6p;f7mZ}%}r9=rpR3rm|+MuuPbfZG(|oWLuET8?9OW*_Mq1p*+AL4=4iaqR3WfE^NAaLC+> zwJJ*U)UIq;F4|)kpeW5E@<<$(0LG55Z6k^b7U6A+2rdFR;I{#11#0l~TWZ3I<257M zLKWb3XswDNXmhzv5ebSD$72CS(={F$RpM3?E*v|}L)*Ea@XpaVJm*%*^HIPJQ^sW5 zqFZC*X$H*WEj;g9jv|-G&f_ZCuC7o#cWv1^Fu{K80xq>i8vz}0h#)p^iG)IV&bGh~ zI8z7{3OMv2c<*tE-@B>)>ysDn|K{~ao_pacJO;*?k(nlv zOQC13Yl3!Z{8@m4Hg`rIr}F*tc6+W>WaRZ-Uv(aWIn>)CJEj6?swJJ^m6B-xFMfT7FU6R7Qp1fu#w24k% zD&v61b{<^Uj4RI!2K;MWs#eQ(F6sFbX>mj?>Y%ttv zYP{Kn&^`gl-E|8f5n2skurm^^ zHsL>V9uH%U2nycpvG0g9LzVyqxrgBR&T!oh6wrO=`I-QW{iX=;kI_pjh#3835gZclu!wi_=ZNRP%z4y@131v4?$lXDk$bkyUkn~0&;EkjoR+# z!OPRbRAa8uh7j461%R0{xiLa<<~%JT%FvZc6(z?uM^o_6V3@}gngax*c|3Vz4_ID{_`i!rC<3*l>iTZMoLiBBg!&-qm!3xP>@e+rWFcq*M)Cx> z04N<}q+i|AuRE>S#q~ma!!YniCnwpBOWG@f@P`jz2#5d}6&`)_9KW)yaZ!e5cViy4 zLB`E3mioxVE{T5h zB6zCUyU9vn_zHlA#hmD0vgh;V4ldz^&;FXRj7|8MPewQZr48Ol3VhJXmW*e%(!#Yc`9 zw(5>Jasph&8Y7Fcu1q}Tl)9FY9ZKw}6AN2-bcDMxD^14uJz*VeqY`YdENcG4`dpl@j?x>-SHE69Qb)0$9JhIQX)_sy*UudH^wuC<~{G0|R z=(lzZ7UmrmaN*pw&t+=1jaq@=qvyUoun;-ogK5jI9zGOnUJV+ zCLU)lU?iOFNMHwkq7g|ADF?oe+CKLl_*^~fLLZBV2r#uklQvxQnN2m~eHSI(a~%HM z_@bsMWiJn#;9Kq!TP6f5fuSv||^Y$Ehr|m)37gG6UmnO zx_Jj;Y1qLWkzU(&=Yws{FpEGB=V=+>9qAFOz`ZiyvZ^t!BcgILydNCKg>OVwA%X|H z8aGwlbe{#V=OZJwN{Z7mAPVtkUKnMaJC~cJ=mpo%5jKh4<(>_h^}K5$t+U^?R`PjA z!CRn%;FVZIfuFni*oXeXlRQ4-mwtPwz$f2Z6undH>Tb>FPv0rOza2XcEfc}H%fGMz zv>fw&UWA6fej6j42)5R(J+f|brNn-X3jWx4oHU=`E-{k2=l0y{9ABRO%?s;PFH?f* z-ELa`cSdO^(B81J1$oQSD$sN6DkoJWQ7p~>8@o zd7ikCU1-9o9@l*IHwSh^1la9%_vWq*W|H+XZb)?66;^8mqjp z0{PB8ILyqVu>}3unY3}KHG^}6Rt|5+gwLZ*s$mBX-*{01ioZI3{QL{z zdTgPbNfEENHau$0Y7W<|EQ|!;RCNCi+AD9B0(h)JK>$s}>ycrl0Ct_WiO8)S3c$(q z$G43f>dmY1^DqBv3jEA@;trnwLl!NWQ9B48lZsoC39w;2de1L+bwkDgfWnino2?H= zf!)4Ur07{I2mPGb09hSTC&eHz_VqT>zn-lho5Zk_sPqbpLo;C4at=3Djao^kxUA|X zs`;|2o1xci1F0+=BXd==w=`jI8>&<>sUmL79cFCvGNhL(caG7))Yan_817PGGKJ36!7 zrf8xj+X5z$-S)ntSh5`rBAiocfmjjv`<7@9*CpLh*>4|Oa*B~Bm zY{z?NHjxs%4?j+JS{WVA9fS?&W8V8}fjkJ9{oX+YL+8+Oe9oRY^u?iVmW&|#PI2ZG zx1F;^1J9L3A~vlMic$rw5~t2%AY`6TQe+p}&bu1)9(ys*IM8&4TVUwOP#AoZ)Z*Hq z=!v6>L-B*-FSNBd*+tx?~d1&hO-R(oYH8p(cv+sxKFMdNR<;byfxHC^` zP7+(jgn3P$?D_-zT^CZzfKfV$%NF-w$Uq9sCiN^YqE)NV?@Wh#v|-NFYg7qD{!`Lxy{MfE1YC9Qc&eQH<-eLvpbK!tqvIRo?(DWnfPsnXYbEk8C*w{uVyb+-1KC@RyVhOKU2g@48l!#Jj>KUg zMCrYI5b%Mg+9Rj_lZP;pL;Xpv$Hv3e%49qzcr5R5uBh5fN@p>UJHH)chTe@19t3s` zA2nnocN5kzZ$80*ExlcZ=#VAj8N7dKxtk;p)v4zk-7*S8&pSNak&i5ZA=wn0is#ZUDXvUtM^&`EN6#x}b%GOm zRkKfdV{F`;7>%hM(GMPl!yRuS@NmZsQx(8PH1XG!Qv6m)(GC1D?^vfh2%2QT+el%) zN|s)y#h3pTRsBy+92WutzUOUH+#0^^ zrjG0c+xGR5_jq8qyks5So7+SXoB#kI07*naRGL5E0t#jNavcP@J4i9zvTp9HwhQ2d zDRUcJ%sTUS=cKw)7$nm1`qmh8K2v*A~=~XBQ?l2kPz>1#V)Eo)at+ z|NO`?NJMpijPe%w#*S^aDs(-cx90@2v`;ThKtuAVltTD8&|`X4b5~@4-sTVsirySR zlef}0iT>%qU0M*>nSEe*!K)ZifHB+I-@Y(PLfQMk>2?&)cD;39}N8vshN8il(l*(aStI@Zb#bzUH>6937f&7kKTN>KFOYQm9S zsGW6tC-(V_9T#Nz9NH-ZdfMR5k#lHw;FLS0ZX$CB>*Qvq}>t;GsDQ`0l_U2 zh7xdVm^*>s3N?oC=zxp<9Qg9|X@PB>zWsME@o@nE_M3G1In<%vQT3XA?nepicyB5Y zY*m^)zoiKN33j-2^;f$)?rFfiI=~5iqpCpPLLj=Y6Wy724DiDJ&zuR}uTtk4@J(7a zUB$cgDYyEg15pn3melyg&;7lNRQ%{uDKwt-j!{W=cI=i$n`pcJq6)&`iH>7f#e;2) zmgA50E|Huvj|t<#V^*`{sR|qg2UW#awl!3Mi!$KBj%jiUjJ_TQ##$HVRh`AupsPeE z+*?LtI4c6Ks~Trzz#^t5iuyK^l{~2;PE4S$BE@!u^6xAquJQ9G3WU6P%zWnCnjJ1KKMUB(c|;d{r4i_rEhMPX9LIB=<^~p0&1D~eO;Q@zcj0Y6B`Dz zMQZMdcO5&**HvxrE#a&rK5u2mt>d`BEzEgXv$o}Lf+h$L64(@4-pcIFj#6-j(f}JJ0l_J&wPK_tmf#1VylgLSd9Y-;E9U}&2 zd70RPAP*e|;b*5nvlyBuK6b{`IS3wFxJn*Wi~zP4=8-K8m$63Me7||IRNLoTLmRS9 z*Zan6oxp)YC(>A(1RPWwh--MmBXM|`A_l@^@jz>MJJvgBgN<8apX@kt9tGHlxzySO zK415R3wtVsJtklj4LioAaHk^U*jgeDy`y6dpP?{KaD#*r6yrHuB?yNF6VTX0GJdXQ zK65@EZ6-Z9+=2tdEs(#wLc&0}0}!lho_*UDfRS*_(1DBDt&-l67ZnV=N%+E-cliCu z?%%!n$aDYWn|wJs)S=$?dV^5@_Nv`%3Fl6Y+71680Se$XLN|9j?goC`jl0g3yT!G# zTb2ieUN4$+Fi3u!mfJsezHNT2ySK@&WoNjlgHV2F)cA#$|Gj(gAAi4PhAYr?x^it2 zJ-yjm>P0ZEB8DYJ=*}=~r3fVd040SAk9XGw+K34w6SDol^CpO3R&(or zlY<_Nw2%k!ZmLMZUAP8AHqYKy5%WCqwL1InS{19P7zB2$PKwYhE~hoc(jq2!$50Ce z7msE3`#NBi6zj-E#9R_q694Yv#(4ojHI*$ zOvh2|txbGxRGaXYzIB|PaNuv`eS^izvjOx<)1U4|I25M|wJ?}ts|jrjG073&IWS~y zxV}p1xCjbMpDHLBd%0Jy{?%HW{(|Ck0MD zlLm>PLxb=eiNgZ?UL+_6;?d&%4WeihUNW%vkOlm4j<^=Vjn?*?&+c@v_mmeNYxAcs zk#Hj1l%B04{+}-_cS+Ot+v@InozsCGpg6wnc5B2uf z@$;YmZb1L5r|vj@UVn6I^Q>IdKKNaU2oDk&B<2fO-)F6%gl zUhp_BJ*Fm-w~3zPLWm|5Aug`%xRpP&g_kOAK;qa{zN%t_eiHC}>jq-uI^JR6xoy9S z6!Xr}xBFnrkc)Xu`#{^USB1dd6Kxs5K4QJ)1mnVE>l74G2|DwF=KzXKAOZOIQGwIK<0J&k412a!#i<>isEUVXN67aV z6WEi;Zgv20Q3UiocN2njw^}CJhrz*FXIp?K)WkXRwYzRFcqWn9zpgDxh+$)=IkSQV z6l!_!?A*diE(|}{_8fjY3ju1Bg$Tt(2=t`dnZ2=VT%NP2ltZCTVCNCL>cP5+C!XlE z0(^frG1(v@7gJf}MWLw8REw4{a{Al{bR84uYA9-9*E&J*RM`8=Cy4L?VN zJx5<{?v5@}!q673!8(;4d+wEWhYL`c&5Tdnwa#x6`dSO&Ys#G7w&PZR#*QtO^p{HW z0406Y0*kJ;^Yh63x!KR01?yF+aU`zsDc8z@&`dO0Yib^^?;K8@$H*~O`^dQ_;6nu% zS;C!y7Kq9^!!_vVW!MQU_L+a*vcbTO5h>=@Nfxjx901Ibn#Iu8{Jsligm>;-FKw4& zrSuq|yMPw>*lSfB3*X<|KI0Cg@jj2mVFE6iqV0s_U7!URnlcuTws5g>Dt;em1d=jp zRSe6m<&XboutAAC=%ba21Yf9bbQ-?R(Tp$_#9s5c1Z?j5Fa z-sapUCQ(H-MA98mnt#}qF*RShO7%7VWe1AtwcRg^@r+mM`PaUTesGQ8z5DN_y`G+R zkqgI|;=AH}leC$D&+O4dz5R9cn_oCnNuPMXmZjJlXcelghWYq`Y0le`lOS67P(`(6~z?sQd0dx zc<#B~lRQSp&%gZRWAQ(JVuXT@5dtnP{G(-l+f2P7L1zEmYulh*4*nRL|8$cWByv+n zjJ(Hfj2M{xWKu`mYXyuf*>2t>Xj0Xj1doSRjmw%iF?Ox_9Uu5T;R4tX%=MiOO?ro$ zy5``QY7>5vuQ!>ky;W`OBS9!6y?IfyaJ(`v@YarDGC}7BjnB649IhinX>KA1&vLro zIwcJJet|TJyfRg~-;U48eA!aabH1^z?7hT$6knyp!}ao_0KCn@=pSS6;UPHp97cU; z?_p=J)ybX+u~kMow@ut_Obo6}aA!}R7ol)W5i|2ZPh-Ru+AKtd&S7XBUT1z|fJ1dj z6;XhZb-L-F=DBqpYyLX~L+4Q|{k$iR@1wBycj77dbGMV$iGVqnT$crT-#P4r_J9gp z*wv~{*B3yu^RZCUB695YJr}St%ZLaUO-23;AQ(8Z!ULqCPppkQ+;h$%r^&WnX~K<0 zw9U$qaeNEihtjN}O*&o>F?)lU&zZN)iy{u$aVKT2sW~s#P_)6%J37(YD8f6Wr`-EG^ihaDqt{%`;0ewKaZmZ9`{QRYcoo zn+0th4|g>nKtJ$DyKka+87XMH!5Q&^TmJ$yi_Bq>2`k)%xhMms<~y!UAQp}u#e1!y zxlQ4@z4^+vM#~Fc)jDd@AHMmnZ~M}dJVe9iKl@=7{rJ5=Y*`R#n9bvYgI8G`FB6&P zTeBuy*Ac@&Pxh--O{`e(xT8N$LNJtlwEd-7Q-axUHr748wwUeQ`5oLLQans`Ly0IM zxJ|K1QWRL23t-8AY94HUZ)O^eEW$xZdcwKDP*6O#AUJUz+iW4T$GdRcp&(Z~HbU5& z_2L@jMhCM~oEb9C2?cRs&vU69R&B^nVAuRi=$Y?}LnXA=JkY91>SH3Hpb|cYfMR^A z5gkY)v`f3LMJPI8m%k+rAGm1a*^~17j-P$`XWxX&(xDFZj;J>Xf+!Y$6ihW0kL(8)g*0L3nZI}zi;H^{iQcQ~@e(I&Cu zS2}iO2Z3F(qzwJYakju7J-D%MXz3hcBG)#Dd~9OEQ>}o@UBs(94xV{|aga$OxM;Dj zbXqb!Y-3E|p6B1s>WHqV0A5+gEe|OcCX{mAb?#EHtyBJ>s!4vaA=f1mpz>Fz-}Rwi zdy>be|I%-rI&q(TZ&9>*-ZcRX%fycT%2;gdbg~0EDtyBnE`?p^o-KxRI15o@^!J_? zMoJJS)SVY$Z@o$!5DOqa&RfS-z-z>@d1^<7J5y!AN45@JRyD5c*ib4?JRc+2PM3gP z-;S3C54lNu3Pjg44ttdnR_1kH+co21T|;C~;h31kBy)|2HfVX9q9yL3;dB>SFsIb8 zm1|WjY=BR}Ad#M(`-+TT6Py(RZF_<9l(07P#HkNBGGWQ|ISOJg6x&1Rab$vcrzAP# zVD)J4cc(lK5$v`m<#(oMc8lz>&0TBK9kfXp%-8LuDo%aCz&gHb!|(MCopd8@=)WsFHw1znn8uet3rG-Y{K6{}ua~LDwFQD~RdJnabj4u^(nA(VHULRPTm?l3 zO!jMRFyL?GQWMUlz|uPNed|uIY;o4Hg}_R=$jY7P%;#PsVTXkGUzAYbXT~qy|5x9H z%hRC_^|sd^2ubT%Wa^Rm0ZZ#P(CN$F9T=k&PnxZ2g|1=mdVA9*hP#=&Eg zc%FF2b6rH5)W3;^kO(MrD-*Pfntt7zs>U6+0oF0$x{8=qHp~<}ROqWOOjP7^JKHI; z2Ri$lCv`+GxF&R>;~i=NrbwTheDni<`-vW)PpA(Xf9YKzy!Rr6#?sJrOwp^rfxMx2 zxU6f;>{vXg*s*UL(c(CGT-G(VcZ3YL;vFW|J+AKT8cgi-7Emm<%`2Ym7kP-PR>eHA zD|uPdH(ELdujJ47se%iz(}EGmOHH`0=_Ma}200Xtw1q6}J2v3gat=d_f*zV3B-<@E ziQV5kFX8V9NWg+nJkPnIV<$cfi1QGjb}butZ@g*2X`sy{C-W^5ZDP|H8$Y+0*q$0y zL_iC~l@0u@HQ`}hV`>Ac`F~dyezLK^iJX#`7nJOxTfB0<&YBlI`@x6KH3Mha10Dbj zoW~@_CUhdRi{}~}LPoaXO|6SONnFUR5-lPQ96am@Mck1%MB9y7t2RL!5HvQE+#w&^ z=bOO6#2k78q3B!N4nR%>gmsSrS`=!f&A-ub z=Ae=+STn)mSjg>;pf`Q3`{BZY@bPYxX_VOuooyF6$#3Yqg|E;T&EY$~;FTs6X4~iq zJ>I8|I|~ExICp`Gi^?5>wP@pgo@yle4~i>9^eq;Y4CzqL;cn9ZI1UpibOY+dUo@ zuY3LjC;1&!%cvNbMFQCy*@SD*@7r?wWWJ0bTgB9D>(_=6%eP;}{a_~mKq*99PHflrE1={ay!}Bt9lbS+yYVwG|J<4n zH8E-n8}d>`BV>*oh40YpO_goemu3w}0AgYyVcR+MgF{vGHqJSm*k^iNcwE=fP+%4j zopRS-O~}GLx%}+Ti_j1*a!|>U*$4zg2M&WrR~*`+7D{0q-a77y3+4|#D*`U-8fSr* z!IjZ6I^uAvaUXLGiq{+rll{!Yz+^xNG%1B*zU3^YN%b(B4cK4^p!LVQeZpI5J1qjS z&<=;0`BV#`C$uYj5={2NC(yo;YpLvF3iuuBJ6Z#_X^&CMK3WLOXUyccLbyWQBtHMK z_qaCXT+8wMkq2zAA{ROtYgPk|C1hpYVF3m1OcPFAz)h-g;sSO^sFWSZ9%z3lKwHVc zy5a29a@cN?7;4jZ9+h%28EotS#L#Bf8qqS2vlHOfy7;wy9@E6`bFCbd>xsi!Y450% zLvFPyu9UCw+Q<(lhCka`=Q}rOwqWNRpl4ZaaUDSst3qPMQWXoOIPaLK&kKwHeC|SXyn@|t1H}*yQ{l0m+nC=N0qud{1NYkF&%d(yVo z_rK>$fA;D1n{~}P)S=$$daPgL@eB9$d(s;Ncoe{|KLUPj{K9?xaNT(gVlGekKMKBW z{K9?xwyNDk=4L$HP8Bcu^#T9(4z2ME_y6`ig#YOMC|`5N<>SY|0{+D!CLD$RDrc8C zXq6OLMh1RdS2cRUV_`{lJKJ&S+17fk6bY*ASWhZ;Y=d>*A~;~@tdlmiVLxZjUqQ{I zD~&(`DC}p}ah=u?BlEB3fxh6S**PhlU{*81Z>RM2*Q!|A;9ti}gF~#KxK{>-sN4zb zn7M?V=uh2z^tu1yNgS8a^DqA!BKoU%%Rx&df}``FS98PmPDn$2ubuat}fB*LvP9EjXtf8Wg=kx!b3;@kyXrWylrT;!Pr zqz9%vu5DqlL$U--vr@sK6o$1ZXxq8b$XIO=6fmAOlzeFjW=J@J$E8NR%ly$(&~JVO zhq+A$jNq|B!f(H_!|y!Y{lfHP&;9t@am)^Ns5he?JDKnGb(eGeC`Hl1-{mZlA16e* zZ4=*xaKP|xFv+3bnKk+12Y(vRzWk9w;nldI1GZvgI&$nn-rzzbFFQAKa(rGJ(Ao%p;lLlRBbI zg00uTHG1LmFHS%Df&cr>J}%Rbeei$BVejQohkB&a7e4oQZ=C!@aZHAA2@b@SaE;#= z00zQgxSrWuoU)s|u?}`^9_79`+@#p}&3DiysAZuH#DS3RF*VDI8s_cTI`3-}y_wOx z(ufo1ajT^DY!rs(C{p?1nHUf+bxqgLk* zF(dm+ALm7ojl91{$L$%)hkA$B4@oRi`r+T#>dRA!%|KP|sN@7Y$bRT8*#$l+ns5sR zJH@4AFhr$_wx@6L;jYHCj(E7M?*!%$d30U|^lZRuqX{QAh*lX&Faj6^2k-dLZQ{V` z%>Li=4*lR6k8FPYtE$G(23`v%xT)w5|$plxBpgMAy=3c>-nO(Mq22|fJT=bs1G zo+?QII1}%I^vfr|{#);U+m7F%4s|Gumc9Sr<~Dw2cbiiOfuSYhtt}?|+%YP;2kR;W zdn<)?n1{l_)(A9F*K6~Y7bY}=**Uu6n%fl+dig~#(TI(8dKa2-?0hp|y0Fgk7L2G? z8x)M-;(cJ0Zv}9x2@52wEWK~8`x%4GOLhRJ8nINS_<8%Y6%+$_K(&b-2iVD832h_* zaCRD?qW|si)1Uv&x9(^i>QHZ9J+@HJ_@kW-IYr&`ksqaU?=bU@0lX$$-C(7Pb)=~FA~>>;lDm)B^Bk({+Qi<8#bNKvbJ;e(<~Vr9C|egAu&7^8 zrt>CoxT)_QPKtn8OpWij>m0@ff7p&Zv38?CD#Id@$GSACOI-s4br&hrzl{6$%O`%I z4t1zQ{ektx?|t7U)$RvxuH(&mwWp@Eh2P;CKrNg-*qYdN5NtuDWdc3Jg$UYkMC7?l z)NmFXP0=}W9_JEJf~1QIByA+HbL>Qn%S`coV@Zb_O=#Pd#@l@tk}x#EowBDMf@>RI z1YrJU4oXIQ4KrgU=M=+Z@tA4E0NioQ{_vp?`AI7ZAU1#+AebSd*KznWPj}kRrC%BR z`u*d#`nVnHP=DNdY@wXD!n3!OF~5(;7GGoztqp6nA4BL0C}uJ(BgY6I>YZPck9_D; z3jEYpv}Ra^b4;as-R)KuZUgYbE`X(WX+u+KnV_Cl5lOX4f9!dOqzb6wr0}Q`(6vFT z3q!`87J<|0wlflJihdOn9_%;}nt#|t1fzmvhjq$3DXH-=&tk;VY#TRq#BI&MiLP^a zSk>4h+Ac=H6jJK?b8N-fj`MBGIH8|&Iml*5T@qy~8@pb+f|uZ6X+gR6jH z+(>ZAX@v@405%S8w8l&=V8&2#3U;k~CYZZ$&EQ_J;aLEvg#PFP`{?wokv^OVM&cV3 z;zmi%7>LJ45*})eYmKAo)7`cZ0a2&x=XaHy}Jntt@T|K?SV|LgCfVs}Kz>rIN+ zbafMGQxE~Bh9nypQZ0u~j0=yGl8og9;Nh-rb}V{EPv`~4PtR=^Vx5Q}%rWWy&JV{f zG0ATcd47!ohxU?^MzONQ$K0_V6b`3FfR`K+p%yv-w7g(w!+t^bLyIc3I%%N{=@N$pZmAox}$ZdLmle%b@S2Z{=O*w#%!`rx!Z^~ zUF0_C{he!0hvl3@0z*>9&f^HKVPFd^Ia0_^-fBVseZph7{@-fqd zH54b}ac$ytj?|zm^XsXUw2B(ENB|V$9dTHLeB>znvyBZI?nS)d3N;F_yBxsak_aXT zu8?r4BzbJjmJuLmnfc_Ko@(LQ)AG-cUV8aw-s)p^s6+j6>TB{SXOY{pG`z>LP5}FK zz5L|WW93V~rvLyT07*naR0!@_&Gae-x4{qf^;aFg`iWOj-~YX|L*7i-rhSJcM@+Xe zXV<*IK?K`KlEuQfw6APyOpGq!1-P~t>b7TU+bSl^>pjCaC-G%#M#mzC)x6M!?9p?p zoCayT9tmhdHg>9*8mqTb2JCo|eWY(v%wxn!;jy;YTnI2OJg%yUj+5rKcD=)}aA-U7 zi?@lpEjLv}OZew?QWQx5m7hO;;r?@P{ZTvAp$?Vn=A$3{xy5bz`wycn~6B4P(}mmMgU3kYs4aW9HCUEr25sV{(HKMFB=S(FE1*Srsh zfp{A>L_^N-5OmFYQi`AhhiC2;5XH|Pzi|K0zr}~_P>1@O>#>z)4r5qYyew169{piH z%! zidO}9J;-o&=y}>bP79Ag@QtrpV4Y&Wk4tAd;GT&)F~Y_sa^n56s&P@W3!T45I~yMC z2Z!sb#x5zYs~VMR6W6;_g(%Qh*G<5$j$iui;ah&-4t1zQu|!g=@gvho{Gu*sm1x6Z zC=9LX2^YPy%wPtvGBKRQhT$|dfgl^Z{xHmho!AJ)Kp3KvjH8@=$I%{dBMDa;u|&d& z1gt>(+#F2S%gF)(902UYH(lq3o+jn6;(mLIo69qMbS*Z3C3FWmpCt=+Q}@N^2V zp-yDt#qY=tSMCo946!Ea|M3x{Nuv28b96LTk^VZ+iyloz~+a!whDk)ax9qxL;{9+*8MfL&!Lv{eKMhHzLyk<3a`W1rU7hXaI(j299x)r3-jzG3Co$_85A zwL5kmHHeK9@O}gF_@@uI_{XnoKQmZ#|M@R|@B1FTQ+B9By$$sSq5NldZS)P1l|}H; z>pI4@i4QVnx$WF`f_a_L@`RP^>xS$eB~av0fBI_t;>&;QDfqwg4N_uRGi+pDM~G1= z0D9r`z~}XjiElel=-yN{qWPOgg~K}X{M;!+JxXEHT=xD7fJwzpM`0c3+bUvdNozp_ zmsO49J1phQScU@Li3Nw)7O8W43q@e+T$L!0=N9Yk1(?>v(j~B)R2lK&m8xz!-nDYr zrZR8!Dk<(2M4gN6k?nbqli#T-w5sDQOI!3-&t72%_w!L?px4D zrHWJW*oZbA;L4s~0H{cVfmyZ8{Pd$A`gh*iBX+1mJzl-RGtu(<&RppP zM;7V1Akrw>5`}Z}KAUqm~_j00Tk% zzImeeSwRa^-#eUyfI;CKzxFZ_6}O1=Ssw+@@1{CHnEFKZS5FTq|!8@?q-7)=;$V{yT8EFw>W5&7gpGhM+60EADN!sJ3Ck552pMXHLqWIDYZ|kG*9F>rjXK z8tM%~S%Ah`QP_5J9-7OY<(3UjtzI|8x3vHg2cYE`&TtURhx)4ZLlSqP{5SuZR$qEm zYot31tjtHQ%#SPpRw-dzdYl#k%NVha2`6PhQebGfwd2Ags^ZwJ6{XNCys(aSFj2a- zPIa(>x4 z+dCYYPdYCI)`@=POwVWuBe{>9#eCaqPz6TbVJzM|!T)yr>HqgVZ}Cw()S(V_r;g&_ z-(ODCKf0bq6Q&%7%V~Q($0op77!$pj7zq#3RaU>2S@fbRK ziQDE?Zi%2U&$1IVg1R!oMg_&<4t-;5zT_htB-}~DHMnqBFsgS2dXojTOx%DNxB+N! ztL!~(gk9vVd7Qn`J`|ZH%{0KdMigK)_goWNa7~imyH5(J;=dccc>g=z>SK1OLp^G} zK`3wU5GYo*b)3I^xfI;$Zr|xP1ADC3-3Jb~eSN4y{b9BE=f3Gu)cw#u)!l9-^zHV{ zcCn88ppSm=jG4BfzoZn-i#p+?U>DdKo#Lbja3*rsi2^x+-Qy}LCKa)7Hx+**)@h%% z^Pvt2>2*^7 z1D99zb! zR`=VS^W$NR`PXiDyZfBu#~gE9LYIl0!A1N?AbtK;>)x|7 zo^p(UJ_zXFc&4O6jPMf*mZ%ts3Es*0N682E%I7-fC+GL*IRaozz6b)xcb13)KmZRr z9_Q6r#2@;O;m90+{o?=p+gIP*t9F{xytnx(p!~Mff-zhbMQuL2R{5*qhgGg!Jtx3~ zf@MA$`kKc11d~tmjpp$O|Gg&DC)))8BatSXb`IRB+*W*^8L;XdFxdxJj(mo|l3cOu(9QkD(dnh1$by zWeGq4Jpjq*3t%);_#;;<`wPD#7w$BtISl|{_JiO5%K(0K{tv2qAsajczmF0iuvxn( zwk)9f=mk$+FjM~VnV8@!ix^wL&;rgZz>SX+VFKNbi3L<6qnpG6_dx$pABJi)>pcj_ z?wo|c#3Ih5ORhkdbP+&691OTr4svae307?PEdXM(rL@G2MGVcbG4GlLGaMrXJWDlHg`rT6Z*xlZ`5m;LV!gZN*-{p4dh%|~v&3MlWj0&O!0bn63015%L7eA!f7@}K{F*<)L47dyC6Ifp|fB>L~Gea0eJ)vnSA zHws+bolDvfRrWC!Bb}>vl803$2)*kkGQj{Qi7k8wcPDW0dZG!>r!5cWPWtgLMf-#yS3wV@r_}(+d zO3-Xy zn%AiHk39X*Xa4p#`?{UxG^f%0S01mv>&yTB^-cW8aLvDJjkY5MY^-7+AnYJWcJMoD z;T3n5@ZcFk3mq#w_oA3Lw&%5ykc$vI?eQ4`Rsyy|X`QbvBEazE8F$9-puG_w)9A;j zxv>SDA)pwOFBVF;*eH!7==Tb!TMjTJ05i!)ZY|;o1$_ieTY85WY6DsDB!9+@MJ)83 zD`zssvlk4q;eY+vWij`E^6>{h{XczEui0r%^L6HH0_7HA1@Oi`3gJVEcl$;;%_ksz z8UUF7#Fsx2ga6d0!rKF&ZS}}Ch$y5W}MOl=JL#?>(Cp>5BkXt#)x>9m6 z&js0m+a8a%f!>2VCMja8*EmUZ#G3)L!r!@wp)>d_WNbXRW2DrKQ6M|@D(7GDF#O!p zXFops=3ceaoaQubCSUx2Z&S%%y!)2)oxLgJ*VgV>f%ViQqa@+dBD05$$q{1<7$D$Y zjI)`c2kMWL_1zS|y1xB$wd!fDD*m@jVxPeDB8ww;|)N zoeavS`KZiS0cH22`EHT|2GP2l{HOStQ^%;X{kTqjm-U-u%OGFk0a zsa<4J)N4JDfo*=EjKqwf`6k6qhuypYO{OuifQuM@G{;hP=5x@Xs zqO1O#K=%333U)H}O%bqdK-(QNP-ap`C5~H z<6jK4&D{zQ`pR~2=wX>GFj1&2Fny;RxU-{&}jqm#M9~~n9Bj0H~{cY2_ zIrD^5M0W20Y111&=Ypw#??`OyqA*6@eU_kF|HF<`)6eM9{mG{Nh>(7SRmD zz?#~5uGrU#Zy6Glw`RTPTyfPSkS=h{OTig}GRdi>K2HG;hm2_ocy-9QNl`^A0Gy3{ z6~HiXJJn?9E8u5x@7{&_Bk=XU=p{Uq40GVz!k@<%zVzpR$1dJ!PIDUcriR|7VQc{- z7uHPa3t==;Kr z0JkU5ycK{p7!F>su!=1lFAy;?-j7>rsW~&1+eCr(0Fo2~fr2f(V}yA>4|s!&8;hMh zV}mN~Gm|q2z#aF>R`d#6;4(|oP@V^$77{R{v6ujc*V8M?iEX+74agA8gk8cw4b z`e2p11GwtbptpB6*#R`ljbrGf6Bmiq)3aRRV3x5P7i|v5B9p-d$T%+o9o(x*0Pb2l zzU(K=bHOkKtfh0_SKcrlGBwk~U^qB1jREsg0Yk@-Kg;NMe<-+0v14=Y4+WDHuu%2& zsxl$tI*?6{Mh$h=jb|uEIhx@r2K1ugIagdKmY_W5LZhH@H)kBIyP2{kmraLR&p!^_ zlAXqg=Ui}^BIeRdrvOYM&4ex2c`dd*fDHIFQWDd)b*I_|*f|#i;~4OeGp-YjihI?5 zKPiX09oMQ>q(EkWRtlyeB7^MQ-W|(YFbNU!%I#@4U@V!;bLN(G3_#xkmbI{?L9cye zOzfFUtDcp^oxp~)n;5ax_Y)(n_?_6-du~~IKHlji#rFklz3ImZIL?geD_dtixH~g) zP00j{$~MWN1uVS?&;<0&@K{(vVO zb3>gc7lSx5!_eBf2+H?$Jl2BZz*(TVYiP&%<*3NB9oPo9mOgjuj%f&8?3jUagC{Sz z3}k4}^?I{D|1nTr006IR##M;j?&%)%I}8xIb7}x)&d<$6wa?JGx(+m?U0Up-&`ifM zkkp_!+wodHdJ;h8t9A@R=rWS;o!QIRmXM7lAppN)R!*rzQ0!YX{7x-k3+5UhlxmU1 z9yfh(fVvFy{TP6*T6iA zUTKU825ODnF)y_<4?Z0VCW(&p=L5ltYiqQ)%Yew6w;Rw4H21YO%=1XVc+*Rr{9+m- zE>pzX9SbFXG!tY$@K|nCuRT!P-z0{PacUW>*_jMtP+5y!SA^j#23FGMg5qSoR;A)H zMGP%;dD2B}R%;%dmx6Vz*r+CaT?yj1mEh9^j&D-zvRTdO%%6schnz7E0ngG&RNk!j0N;kXJBqre@CD)2d0PVcf7T!&U$%-3@k z7)O@DCb_j&7EkD0tYr|p4&45CIBr71T}(I=kUbBKI9#dl!pyJ+7pTih@I47!C`1Fc zx*r5^F>|iMj12EU{COa7orb8=3zl45hA7Z`lnXc<*D+!wuv-Lbt5eGKQ+PHv|i6#-ohlTnnuWIIfkwSnQQZ~*&t5RJz$iH_$l5tL7YIH8ID=u1ifjbleFVHfLWE%}*7*R(M#&p( zH~9jr$WEa4`e2U1S-|&y$6##0U%&jDfAjK#-$hPyn%~-djS6e~iWa_hqx~?al}EHW z&?SwKlPJ<{TqL`9y$hSSt=Q|QoCH^M-_}rV#JF+LE|X0tYnf};zd=yGT(E- zfD{Z@y@+XIW%ZkVMrvsiO4-;ufyhlS;wr_i#@!6K-&5|<^1}lRqhMdrT3MW?!OLFg zc2f3|AieA-j3PDDWXcKLs^cqma}EOLqhMXm^j3Oncjh%e+Fu(Uh3H8?2gMA@$MmG7z|e_ zB1r#z&^cJuiYm|;jWytAjJm5}J@-IBU=+yQo&`qnMX~V*$z)z60x}3Vw{v6wu2SmW z6B{SUs8G>^87AQfjPH60&xH%1H>KdI6l~!F_hcBaV#IBXD8?O#ix}}(xN|WKhLx^& zdmYgXH!)#b9Z$7jQyupuV^J$sl`&q6!aw%|uX%BT8byk^5zR{v_UTHL4>wPh?KmhIp<9zR-W77x5>|KIv!$ZlK z34r#b!+p0L$Os#-s60n!0)B0$a;Eci02y5eV-ovfjt`O-Irw)8hD%i?CvX9_sJy-d zz2=>O-O#L)0!#yQh8z1iuLSHH@I0T3C2vI>N$C!)xo#zy!;6^UI*%KH{&SUf^kCSv zY-8tl(j@TvWMGDOYsQ%X?L9JHd&bHurVRuOXg4r#fFj(e3x-}-6qsz!v)8%XdBxg! z9F1|_cV@q1Q(tQZ9Z2WQ4CI0eGX6_F&K}3bis}4ku!v+50%jG|myQ03$dz zsCYubP^@vwRNkUWN+Px#+>uyfI`U2)_}UGt_^>?=X(9**-E5sV<_G6n3a;a2f(ZBbW1mUkzk;aLoL zIursXuNa%5FLpDUiTSOa3a=jsa)FjKW4Kl=b`jWiLl;BW$^_11z?+edpWAaA&+X6&bXpGd0S=R# zqHp}WwUc2s0Ize#Wh8Ul*25Q(n#;9X2a~SH%U;4$F6akCHI}Y8xFz3W^oG&8bCF