- Visual rework of all active UIs
- Fixed large scale renderers such as belts, cannons, pulleys to disappear when partially out of frame
- Schematic and Quill now has the ability to convert a selection to a readied schematic instantly
- Moved option input of cart assemblers to side faces
- Fixed crash when attempting to smelt items on belts/depots
- Stockpile switches can now be inverted
- Fixed stockpile switches not dynamically updating gui indicators frequently enough
- Tanks can no longer be directly interacted with in survival mode
- Sequenced gearshifts now emit a comparator signal based on their current instruction index
- The Piston instruction for sequencers can now accept distances up to 128m
- Fixed some rendering inconsistencies with symmetry mirrors
- Reworked symmetry mirror models to match the tool better
- Attribute filters can now add inverted conditions to the list
- Added the attribute "can be crushed"
- Made the schematicannon interface a little less confusing
- Fixed launched items of the schematicannon rendering warped
This commit is contained in:
simibubi 2020-10-02 14:28:48 +02:00
parent 5c56adaeaa
commit 334bde9de5
83 changed files with 1949 additions and 1232 deletions

View file

@ -298,7 +298,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json
469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
89b63c6e5875da07226854651079bcea85439f5b assets/create/blockstates/radial_chassis.json
bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json
c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets/create/blockstates/redstone_link.json
@ -352,16 +352,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
e7a5a4320a332f5ed4341d3c08dd50a2e945d8bb assets/create/lang/en_ud.json
040cb0a702643a865f30bae9eeacaeaa94bbce7d assets/create/lang/en_us.json
5c6ce1933165fecd71fbdf67cb8de955368d1bfc assets/create/lang/unfinished/de_de.json
b8c3464b86dd7a934d3beec6c005e4799cbdf7af assets/create/lang/unfinished/fr_fr.json
c91eb4509e5afe6f288ed737f407914ae983480a assets/create/lang/unfinished/it_it.json
16fb593c1179f58811153b2f7c7cffb55615587f assets/create/lang/unfinished/ja_jp.json
4d975de4cd34e10e7156fe35a0e5f4e40650aa69 assets/create/lang/unfinished/ko_kr.json
f98f523352796c3496c27085182118bbd597a7ad assets/create/lang/unfinished/nl_nl.json
714e68af6c0f614d069ff0b31763bced1f968437 assets/create/lang/unfinished/pt_br.json
a18338a37536490b2f7b6a8836add3e133b16920 assets/create/lang/unfinished/ru_ru.json
e7ad3d9140bb94d5aa2720b651d8bf1308ad0da4 assets/create/lang/unfinished/zh_cn.json
29d60a3aac3eb9c7a1c0e9ce4bf4db0bb83f5d53 assets/create/lang/en_us.json
f1ceb5595b8056d8a452ace3f45d7aa7bda8d89b assets/create/lang/unfinished/de_de.json
32059f6ed1f468e707d59adff9b23bf06d9da2b8 assets/create/lang/unfinished/fr_fr.json
a02eef6cf319384a767d1719846a07c98ba203ad assets/create/lang/unfinished/it_it.json
c9ea726ce46c82709285d6231b5fcda533911d74 assets/create/lang/unfinished/ja_jp.json
548ce211b40c3f68b1f9b2ff503e4c2ef68ae21c assets/create/lang/unfinished/ko_kr.json
9d54d6fee5c0b52c03dcbf0fd7106c2a9a7e7a17 assets/create/lang/unfinished/nl_nl.json
bf617f18f5901015f09c097c4de673ff6a1ab764 assets/create/lang/unfinished/pt_br.json
753697d68b3c1e5aa70aa7ee094c33c8fd195594 assets/create/lang/unfinished/ru_ru.json
4b8c4bd41cd2ee5c1f427aa49748fafa1237edf7 assets/create/lang/unfinished/zh_cn.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json

View file

@ -89,8 +89,8 @@
},
{
"when": {
"sticky_west": "true",
"axis": "x"
"axis": "x",
"sticky_west": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_x_sticky",
@ -99,8 +99,8 @@
},
{
"when": {
"sticky_west": "true",
"axis": "y"
"axis": "y",
"sticky_west": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_y_sticky",
@ -109,8 +109,8 @@
},
{
"when": {
"sticky_west": "true",
"axis": "z"
"axis": "z",
"sticky_west": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_z_sticky",
@ -119,8 +119,8 @@
},
{
"when": {
"sticky_west": "false",
"axis": "x"
"axis": "x",
"sticky_west": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_x",
@ -129,8 +129,8 @@
},
{
"when": {
"sticky_west": "false",
"axis": "y"
"axis": "y",
"sticky_west": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_y",
@ -139,8 +139,8 @@
},
{
"when": {
"sticky_west": "false",
"axis": "z"
"axis": "z",
"sticky_west": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_z",
@ -207,8 +207,8 @@
},
{
"when": {
"sticky_east": "true",
"axis": "x"
"axis": "x",
"sticky_east": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_x_sticky",
@ -217,8 +217,8 @@
},
{
"when": {
"sticky_east": "true",
"axis": "y"
"axis": "y",
"sticky_east": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_y_sticky",
@ -227,8 +227,8 @@
},
{
"when": {
"sticky_east": "true",
"axis": "z"
"axis": "z",
"sticky_east": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_z_sticky"
@ -236,8 +236,8 @@
},
{
"when": {
"sticky_east": "false",
"axis": "x"
"axis": "x",
"sticky_east": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_x",
@ -246,8 +246,8 @@
},
{
"when": {
"sticky_east": "false",
"axis": "y"
"axis": "y",
"sticky_east": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_y",
@ -256,8 +256,8 @@
},
{
"when": {
"sticky_east": "false",
"axis": "z"
"axis": "z",
"sticky_east": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_z"

View file

@ -662,12 +662,9 @@
"create.gui.adjustable_crate.title": "Adjustable Crate",
"create.gui.adjustable_crate.storageSpace": "Storage Space",
"create.gui.stockpile_switch.title": "Stockpile Switch",
"create.gui.stockpile_switch.lowerLimit": "Lower Threshold",
"create.gui.stockpile_switch.upperLimit": "Upper Threshold",
"create.gui.stockpile_switch.startAt": "Start Signal at",
"create.gui.stockpile_switch.startAbove": "Start Signal above",
"create.gui.stockpile_switch.stopAt": "Stop Signal at",
"create.gui.stockpile_switch.stopBelow": "Stop Signal below",
"create.gui.stockpile_switch.invert_signal": "Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "Sequenced Gearshift",
"create.gui.sequenced_gearshift.instruction": "Instruction",
"create.gui.sequenced_gearshift.instruction.turn_angle": "Turn",
@ -688,7 +685,8 @@
"create.schematicAndQuill.secondPos": "Second position set.",
"create.schematicAndQuill.noTarget": "Hold [Ctrl] to select Air blocks.",
"create.schematicAndQuill.abort": "Removed selection.",
"create.schematicAndQuill.prompt": "Enter a name for the Schematic:",
"create.schematicAndQuill.title": "Schematic Name:",
"create.schematicAndQuill.convert": "Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "My Schematic",
"create.schematicAndQuill.saved": "Saved as %1$s",
@ -735,28 +733,33 @@
"create.schematic.tool.flip.description.3": "",
"create.schematics.synchronizing": "Syncing...",
"create.schematics.uploadTooLarge": "Your schematic is too big.",
"create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.",
"create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:",
"create.gui.schematicTable.title": "Schematic Table",
"create.gui.schematicTable.refresh": "Refresh Files",
"create.gui.schematicTable.open_folder": "Open Folder",
"create.gui.schematicTable.availableSchematics": "Available Schematics",
"create.gui.schematicTable.noSchematics": "No Schematics Saved",
"create.gui.schematicTable.uploading": "Uploading...",
"create.gui.schematicTable.finished": "Upload Finished!",
"create.gui.schematicannon.title": "Schematicannon",
"create.gui.schematicannon.settingsTitle": "Placement Settings",
"create.gui.schematicannon.listPrinter": "Material List Printer",
"create.gui.schematicannon.listPrinter": "Checklist Printer",
"create.gui.schematicannon.gunpowderLevel": "Gunpowder at %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Shots left: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "With backup: %1$s",
"create.gui.schematicannon.optionEnabled": "Currently Enabled",
"create.gui.schematicannon.optionDisabled": "Currently Disabled",
"create.gui.schematicannon.showOptions": "Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Don't Replace Solid Blocks",
"create.gui.schematicannon.option.replaceWithSolid": "Replace Solid with Solid",
"create.gui.schematicannon.option.replaceWithAny": "Replace Solid with Any",
"create.gui.schematicannon.option.replaceWithEmpty": "Replace Solid with Empty",
"create.gui.schematicannon.option.skipMissing": "Skip missing Blocks",
"create.gui.schematicannon.option.skipTileEntities": "Protect Tile Entities",
"create.gui.schematicannon.slot.gunpowder": "Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "If the cannon cannot find a required Block for placement, it will continue at the next Location.",
"create.gui.schematicannon.option.skipTileEntities.description": "The cannon will avoid replacing data holding blocks such as Chests.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "The cannon will never replace any Solid blocks in its working area, only non-Solid and Air.",
@ -792,23 +795,42 @@
"create.gui.filter.ignore_data.description": "Items match regardless of their attributes.",
"create.item_attributes.placeable": "is placeable",
"create.item_attributes.placeable.inverted": "is not placeable",
"create.item_attributes.consumable": "can be eaten",
"create.item_attributes.consumable.inverted": "cannot be eaten",
"create.item_attributes.smeltable": "can be Smelted",
"create.item_attributes.smeltable.inverted": "cannot be Smelted",
"create.item_attributes.washable": "can be Washed",
"create.item_attributes.washable.inverted": "cannot be Washed",
"create.item_attributes.smokable": "can be Smoked",
"create.item_attributes.smokable.inverted": "cannot be Smoked",
"create.item_attributes.crushable": "can be Crushed",
"create.item_attributes.crushable.inverted": "cannot be Crushed",
"create.item_attributes.blastable": "is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "is enchanted",
"create.item_attributes.enchanted.inverted": "is unenchanted",
"create.item_attributes.damaged": "is damaged",
"create.item_attributes.damaged.inverted": "is not damaged",
"create.item_attributes.badly_damaged": "is heavily damaged",
"create.item_attributes.badly_damaged.inverted": "is not heavily damaged",
"create.item_attributes.not_stackable": "cannot stack",
"create.item_attributes.not_stackable.inverted": "can be stacked",
"create.item_attributes.equipable": "can be equipped",
"create.item_attributes.equipable.inverted": "cannot be equipped",
"create.item_attributes.furnace_fuel": "is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "is not furnace fuel",
"create.item_attributes.in_tag": "is tagged %1$s",
"create.item_attributes.in_item_group": "belongs to %1$s",
"create.item_attributes.in_tag.inverted": "is not tagged %1$s",
"create.item_attributes.in_item_group": "is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "is not in group '%1$s'",
"create.item_attributes.added_by": "was added by %1$s",
"create.item_attributes.added_by.inverted": "was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "No attributes selected",
"create.gui.attribute_filter.selected_attributes": "Selected attributes:",
"create.gui.attribute_filter.add_attribute": "Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "Whitelist (Any)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "Items pass if they have any of the selected attributes.",
"create.gui.attribute_filter.whitelist_conjunctive": "Whitelist (All)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 807",
"_": "Missing Localizations: 837",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "adjustable_crate",
"create.gui.adjustable_crate.storageSpace": "Lagerraum",
"create.gui.stockpile_switch.title": "Vorratssensor",
"create.gui.stockpile_switch.lowerLimit": "Untergrenze",
"create.gui.stockpile_switch.upperLimit": "Obergrenze",
"create.gui.stockpile_switch.startAt": "Signal bei",
"create.gui.stockpile_switch.startAbove": "Signal über",
"create.gui.stockpile_switch.stopAt": "Signalstopp bei",
"create.gui.stockpile_switch.stopBelow": "Signalstopp über",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift",
"create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction",
"create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "Zweite Position festgelegt.",
"create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.",
"create.schematicAndQuill.abort": "Auswahl zurückgesetzt.",
"create.schematicAndQuill.prompt": "Gib dem Bauplan einen Namen:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Mein Bauplan",
"create.schematicAndQuill.saved": "Gespeichert als %1$s",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:",
"create.gui.schematicTable.title": "Bauplantisch",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne",
"create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne",
"create.gui.schematicTable.uploading": "Hochladen...",
"create.gui.schematicTable.finished": "Hochgeladen!",
"create.gui.schematicannon.title": "Bauplankanone",
"create.gui.schematicannon.settingsTitle": "Platzier-Optionen",
"create.gui.schematicannon.listPrinter": "Materiallistendruck",
"create.gui.schematicannon.gunpowderLevel": "Schwarzpulver bei %1$s%%",
"create.gui.schematicannon.shotsRemaining": "%1$s Schuss übrig",
"create.gui.schematicannon.shotsRemainingWithBackup": "Mit Reserve: %1$s",
"create.gui.schematicannon.optionEnabled": "Aktiviert",
"create.gui.schematicannon.optionDisabled": "Deaktiviert",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Feste Blöcke nicht ersetzen",
"create.gui.schematicannon.option.replaceWithSolid": "Feste Blöcke mit festen ersetzen",
"create.gui.schematicannon.option.replaceWithAny": "Feste Blöcke immer ersetzen",
"create.gui.schematicannon.option.replaceWithEmpty": "Feste Blöcke mit Leere ersetzen",
"create.gui.schematicannon.option.skipMissing": "Fehlende Blöcke ignorieren",
"create.gui.schematicannon.option.skipTileEntities": "Tile Entities ignorieren",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Wenn die Bauplankanone einen benötigten Block nicht finden kann, wird sie einfach beim nächsten weiter machen.",
"create.gui.schematicannon.option.skipTileEntities.description": "Die Bauplankanone wird versuchen, Blöcke mit extra Daten, beispielsweise Truhen, nicht zu ersetzen.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "Die Kanone wird ausschließlich nicht feste Blöcke und Luft in ihrem Arbeitsbereich ersetzen.",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.",
"create.item_attributes.placeable": "UNLOCALIZED: is placeable",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "UNLOCALIZED: can be eaten",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "UNLOCALIZED: is enchanted",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "UNLOCALIZED: is damaged",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "UNLOCALIZED: can be equipped",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected",
"create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.",
"create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 431",
"_": "Missing Localizations: 461",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "Caisse réglable",
"create.gui.adjustable_crate.storageSpace": "Espace de stockage",
"create.gui.stockpile_switch.title": "Commutateur de stockage",
"create.gui.stockpile_switch.lowerLimit": "Seuil inférieur",
"create.gui.stockpile_switch.upperLimit": "Seuil supérieur",
"create.gui.stockpile_switch.startAt": "Signal de départ à",
"create.gui.stockpile_switch.startAbove": "Signal de démarrage au-dessus",
"create.gui.stockpile_switch.stopAt": "Signal d'arrêt à",
"create.gui.stockpile_switch.stopBelow": "Signal d'arrêt en-dessous",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "Décaleur de rotation séquencé",
"create.gui.sequenced_gearshift.instruction": "Instructions",
"create.gui.sequenced_gearshift.instruction.turn_angle": "Tourner",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "Seconde position définie.",
"create.schematicAndQuill.noTarget": "Enfoncez [Ctrl] pour sélectionner les blocs d'air.",
"create.schematicAndQuill.abort": "Sélection supprimée.",
"create.schematicAndQuill.prompt": "Entrez un nom pour le schéma:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Mon schéma",
"create.schematicAndQuill.saved": "Sauvegardé en tant que %1$s",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "La taille de fichier schématique maximale autorisée est:",
"create.gui.schematicTable.title": "Table à schéma",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "Schémas disponibles",
"create.gui.schematicTable.noSchematics": "Aucun schéma enregistré",
"create.gui.schematicTable.uploading": "Téléchargement...",
"create.gui.schematicTable.finished": "Téléchargement terminé!",
"create.gui.schematicannon.title": "Schémacanon",
"create.gui.schematicannon.settingsTitle": "Options de placement",
"create.gui.schematicannon.listPrinter": "Imprimante de liste de matériaux",
"create.gui.schematicannon.gunpowderLevel": "Poudre à canon à %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Tirs restants: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "Avec sauvegarde: %1$s",
"create.gui.schematicannon.optionEnabled": "Actuellement activé",
"create.gui.schematicannon.optionDisabled": "Actuellement désactivé",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Ne remplacez pas les blocs solides",
"create.gui.schematicannon.option.replaceWithSolid": "Remplacer solide par solide",
"create.gui.schematicannon.option.replaceWithAny": "Remplacer le solide par n'importe quoi",
"create.gui.schematicannon.option.replaceWithEmpty": "Remplacer le solide par rien",
"create.gui.schematicannon.option.skipMissing": "Ignorer les blocs manquants",
"create.gui.schematicannon.option.skipTileEntities": "Protéger les Tile Entities",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Si le canon ne peut pas trouver un bloc requis pour le placement, il continuera au prochain emplacement.",
"create.gui.schematicannon.option.skipTileEntities.description": "Le canon évitera de remplacer les blocs de stockage de données tels que les coffres.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "Le canon ne remplacera jamais les blocs solides dans sa zone de travail, seulement non solides et air.",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "Les éléments correspondent indépendamment de leurs attributs.",
"create.item_attributes.placeable": "est placeable",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "peut être mangé",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "est enchanté",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "est endommagé",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "est fortement damaged",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "ne peut pas s'empiler",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "peut être équipé",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "est du combustible",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "est étiqueté %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "appartient à %1$s",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "a été ajouté par %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "Aucun attribut sélectionné",
"create.gui.attribute_filter.selected_attributes": "Attributs sélectionnés:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "Liste blanche (n'importe)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "Les objets réussissent s'ils possèdent l'un des attributs sélectionnés.",
"create.gui.attribute_filter.whitelist_conjunctive": "Liste blanche (tout)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 415",
"_": "Missing Localizations: 445",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "Baule Regolabile",
"create.gui.adjustable_crate.storageSpace": "Spazio di Immagazzinamento",
"create.gui.stockpile_switch.title": "Interruttore Accumulatore",
"create.gui.stockpile_switch.lowerLimit": "Soglia Inferiore",
"create.gui.stockpile_switch.upperLimit": "Soglia Superiore",
"create.gui.stockpile_switch.startAt": "Inizia Segnale al",
"create.gui.stockpile_switch.startAbove": "Inizia il Segnale dop.",
"create.gui.stockpile_switch.stopAt": "Ferma Segnale al",
"create.gui.stockpile_switch.stopBelow": "Ferma il Segnale dop.",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "Cambio Sequenziale",
"create.gui.sequenced_gearshift.instruction": "Istruzione",
"create.gui.sequenced_gearshift.instruction.turn_angle": "Gira",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "Seconda posizione impostata.",
"create.schematicAndQuill.noTarget": "Premi [Ctrl] per selezionare il Blocco d'Aria.",
"create.schematicAndQuill.abort": "Selezione rimossa.",
"create.schematicAndQuill.prompt": "Immettere un nome per lo schema:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "La mia Schematica",
"create.schematicAndQuill.saved": "Salvata come %1$s",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "La dimensione massima consentita del file schematica è:",
"create.gui.schematicTable.title": "Banco Schematico",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "Schatiche disponibili",
"create.gui.schematicTable.noSchematics": "Nessuna Schatica Salvata",
"create.gui.schematicTable.uploading": "Caricamento...",
"create.gui.schematicTable.finished": "Caricamento Finito!",
"create.gui.schematicannon.title": "Cannoneschematico",
"create.gui.schematicannon.settingsTitle": "Impostazioni di Posizionamento",
"create.gui.schematicannon.listPrinter": "Stampante Lisra dei Materiali",
"create.gui.schematicannon.gunpowderLevel": "Polvere da sparo al %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Spari Rimanenti: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "Con il backup: %1$s",
"create.gui.schematicannon.optionEnabled": "Attualmente Abilitato",
"create.gui.schematicannon.optionDisabled": "Attualmente Disabilitato",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Non sostituire i Blocchi Solidi",
"create.gui.schematicannon.option.replaceWithSolid": "Sostituisci Solidi con Solidi",
"create.gui.schematicannon.option.replaceWithAny": "Sostituisci Solidi con Qualsiasi",
"create.gui.schematicannon.option.replaceWithEmpty": "Sostituisci Solidi con il Vuoto",
"create.gui.schematicannon.option.skipMissing": "Salta i Blocchi Mancanti",
"create.gui.schematicannon.option.skipTileEntities": "Proteggi i Blocchi Entità",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Se il cannone non riesce a trovare un blocco richiesto per il posizionamento, continuerà nella posizione successiva.",
"create.gui.schematicannon.option.skipTileEntities.description": "Il cannone eviterà di sostituire i blocchi di dati come bauli.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "Il cannone non sostituirà mai alcun blocco Solido nella sua area di lavoro, solo non solidi e aria.",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "Gli oggetti corrispondono indipendentemente dai loro attributi.",
"create.item_attributes.placeable": "è posizionabile",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "può essere mangiato",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "può essere Fuso",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "può essere Lavato",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "può essere Affumicato",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "è fondibile in un Forno fusorio",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "è incantato",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "è danneggiato",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "è gravemente danneggiato",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "non impilabile",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "può essere equipaggiato",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "è il combustibile della fornace",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "è etichettato %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "appartiene a %1$s",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "è stato aggiunto da %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "Nessun attributo selezionato",
"create.gui.attribute_filter.selected_attributes": "Attributi selezionati:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "Lista Bianca (Qualsiasi)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "Gli oggetti passano se hanno uno degli attributi selezionati.",
"create.gui.attribute_filter.whitelist_conjunctive": "Lista Bianca (Tutti)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 410",
"_": "Missing Localizations: 440",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "調整可能なクレート",
"create.gui.adjustable_crate.storageSpace": "収納スペース",
"create.gui.stockpile_switch.title": "在庫スイッチ",
"create.gui.stockpile_switch.lowerLimit": "下限しきい値",
"create.gui.stockpile_switch.upperLimit": "上限しきい値",
"create.gui.stockpile_switch.startAt": "開始信号",
"create.gui.stockpile_switch.startAbove": "以上の開始信号",
"create.gui.stockpile_switch.stopAt": "停止信号",
"create.gui.stockpile_switch.stopBelow": "以下の停止信号",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "シーケンスギアシフト",
"create.gui.sequenced_gearshift.instruction": "命令",
"create.gui.sequenced_gearshift.instruction.turn_angle": "回転",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "2番目の位置セット。",
"create.schematicAndQuill.noTarget": "[Ctrl] を押したままで空気ブロックを選択します",
"create.schematicAndQuill.abort": "選択を削除しました。",
"create.schematicAndQuill.prompt": "概略図の名前を入力してください:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "My Schematic",
"create.schematicAndQuill.saved": "%1$s として保存しました",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "最大許容概略図ファイルサイズは:",
"create.gui.schematicTable.title": "概略図テーブル",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "利用可能な概略図",
"create.gui.schematicTable.noSchematics": "保存された概略図はありません",
"create.gui.schematicTable.uploading": "アップロードしています...",
"create.gui.schematicTable.finished": "アップロードが完了しました!",
"create.gui.schematicannon.title": "概略図砲",
"create.gui.schematicannon.settingsTitle": "配置設定",
"create.gui.schematicannon.listPrinter": "材料リストプリンター",
"create.gui.schematicannon.gunpowderLevel": "火薬はあと %1$s%% 残っています",
"create.gui.schematicannon.shotsRemaining": "残りのショット数: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "バックアップあり: %1$s",
"create.gui.schematicannon.optionEnabled": "現在有効",
"create.gui.schematicannon.optionDisabled": "現在無効",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "固体ブロックを置き換えない",
"create.gui.schematicannon.option.replaceWithSolid": "固体を固体に置き換える",
"create.gui.schematicannon.option.replaceWithAny": "固体を任意のものに置き換える",
"create.gui.schematicannon.option.replaceWithEmpty": "空の固体と交換",
"create.gui.schematicannon.option.skipMissing": "不足しているブロックをスキップ",
"create.gui.schematicannon.option.skipTileEntities": "タイルエンティティを保護する",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "大砲が配置に必要なブロックを見つけられない場合、次の場所に進みます。",
"create.gui.schematicannon.option.skipTileEntities.description": "大砲は、チェストなどのデータ保持ブロックの交換を回避します。",
"create.gui.schematicannon.option.dontReplaceSolid.description": "大砲は、その作業領域の固体ブロックを置き換えることはなく、非固体と空気のみを置き換えます。",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "アイテムは属性に関係なく一致します。",
"create.item_attributes.placeable": "設置可能か",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "食べられるか",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "精錬可能か",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "洗えるか",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "燻製可能か",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "高炉で製錬可能か",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "エンチャント済みか",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "破損してるか",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "ひどく損傷してるか",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "スタック可能か",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "装備可能か",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "かまどの燃料か",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "%1$s のタグが付けられてるか",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "%1$s に属してるか",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "%1$s によって追加されたか",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "属性が選択されていません",
"create.gui.attribute_filter.selected_attributes": "選択された属性:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "ホワイトリスト(どれか)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。",
"create.gui.attribute_filter.whitelist_conjunctive": "ホワイトリスト(全て)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 415",
"_": "Missing Localizations: 445",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "가변 창고 ",
"create.gui.adjustable_crate.storageSpace": "저장 공간",
"create.gui.stockpile_switch.title": "수량 스위치",
"create.gui.stockpile_switch.lowerLimit": "최소 신호 유지수량",
"create.gui.stockpile_switch.upperLimit": "최초 신호 발동수량",
"create.gui.stockpile_switch.startAt": "다음 수량에 신호 주기",
"create.gui.stockpile_switch.startAbove": "다음 수량이상일떄 신호 주기",
"create.gui.stockpile_switch.stopAt": "다음 수량에 신호 멈추기",
"create.gui.stockpile_switch.stopBelow": "다음 수량이하일때 신호 멈추기",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "순서 기어쉬프트",
"create.gui.sequenced_gearshift.instruction": "설명",
"create.gui.sequenced_gearshift.instruction.turn_angle": "회전",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "두번째 위치 지정됨.",
"create.schematicAndQuill.noTarget": "[Ctrl]을 눌러 공기 블럭을 선택하기.",
"create.schematicAndQuill.abort": "위치 제거됨.",
"create.schematicAndQuill.prompt": "청사진의 제목을 작성하기:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "내 청사진",
"create.schematicAndQuill.saved": "%1$s로 저장됨",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "최대 청사진 파일 크기는:",
"create.gui.schematicTable.title": "청사진 테이블",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "이용가능한 청사진",
"create.gui.schematicTable.noSchematics": "저장된 청사진 없음",
"create.gui.schematicTable.uploading": "업로딩 중...",
"create.gui.schematicTable.finished": "업로드 완료!",
"create.gui.schematicannon.title": "청사진 대포",
"create.gui.schematicannon.settingsTitle": "설치 설정",
"create.gui.schematicannon.listPrinter": "재료 목록 프린터",
"create.gui.schematicannon.gunpowderLevel": "화약 용량 %1$s%%",
"create.gui.schematicannon.shotsRemaining": "남은 발포 수 : %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "화약 여분: %1$s",
"create.gui.schematicannon.optionEnabled": "현재 활성화 됨",
"create.gui.schematicannon.optionDisabled": "현재 비활성화 됨",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "온전한 블럭을 대체하지 않음",
"create.gui.schematicannon.option.replaceWithSolid": "온전한 블럭을 재료로 대체함",
"create.gui.schematicannon.option.replaceWithAny": "온전한 블럭을 아무 재료로 대체함",
"create.gui.schematicannon.option.replaceWithEmpty": "온전한 블럭을 공기로 채움",
"create.gui.schematicannon.option.skipMissing": "부족한 블럭을 무시하고 진행",
"create.gui.schematicannon.option.skipTileEntities": "타일 엔티티를 보호",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "만약 대포가 설치에 필요한 블럭을 찾지 못할 경우,건너뛰고 다음 블럭 설치를 진행합니다.",
"create.gui.schematicannon.option.skipTileEntities.description": "대포가 상세정보가 든 상자같은 타일 엔티티 설치를 무시합니다.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "대포가 작업구역의 온전한 블럭을 대체하지 않습니다.",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "상세정보와 상관없이 아이템 종류만 일치한다면 통과시킵니다.",
"create.item_attributes.placeable": "설치할 수 있음",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "먹을 수 있음",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "구워질 수 있음",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "세척될 수 있음",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "훈연될 수 있음",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "용광로에 녹일 수 있음",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "마법부여됨",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "내구도가 닮",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "심각하게 내구도가 닮",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "겹쳐질 수 없음",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "장착할 수 있음",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "화로 연료로 쓸 수 있음",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "%1$s로 등록됨",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "%1$s탭에 속함",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "%1$s가 추가함",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음",
"create.gui.attribute_filter.selected_attributes": "선택된 속성:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "화이트리스트 (최소)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.",
"create.gui.attribute_filter.whitelist_conjunctive": "화이트리스트 (모두)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 745",
"_": "Missing Localizations: 775",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "FlexKrat",
"create.gui.adjustable_crate.storageSpace": "Opslagruimte",
"create.gui.stockpile_switch.title": "Voorraad Schakelaar",
"create.gui.stockpile_switch.lowerLimit": "Lagere drempel",
"create.gui.stockpile_switch.upperLimit": "Hogere drempel",
"create.gui.stockpile_switch.startAt": "Start Signaal op",
"create.gui.stockpile_switch.startAbove": "Start Signaal boven",
"create.gui.stockpile_switch.stopAt": "Stop Signaal op",
"create.gui.stockpile_switch.stopBelow": "Stop Signaal onder",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift",
"create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction",
"create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "Tweede positie ingesteld.",
"create.schematicAndQuill.noTarget": "Houd [Ctrl] ingedrukt om een Lucht block te kiezen.",
"create.schematicAndQuill.abort": "Keuze verwijderd.",
"create.schematicAndQuill.prompt": "Vul een naam in voor de bouwtekening:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Mijn Bouwtekening",
"create.schematicAndQuill.saved": "Opgeslagen als %1$s",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "De maximum toegestane grote van een Bouwtekings bestand is:",
"create.gui.schematicTable.title": "Bouwtekening Tafel",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "Beschikbare Bouwtekeningen",
"create.gui.schematicTable.noSchematics": "Geen Bouwtekeningen opgeslagen",
"create.gui.schematicTable.uploading": "Uploaden...",
"create.gui.schematicTable.finished": "Upload Klaar!",
"create.gui.schematicannon.title": "Bouwtekeningkannon",
"create.gui.schematicannon.settingsTitle": "Plaatsing Instellingen",
"create.gui.schematicannon.listPrinter": "Materiaal lijst Printer",
"create.gui.schematicannon.gunpowderLevel": "Buskruit op %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Schoten over: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "Met backup: %1$s",
"create.gui.schematicannon.optionEnabled": "Momenteel Ingeschakeld",
"create.gui.schematicannon.optionDisabled": "Momenteel Uitgeschakeld",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Niet vaste blokken vervangen",
"create.gui.schematicannon.option.replaceWithSolid": "Vervang vast met vast",
"create.gui.schematicannon.option.replaceWithAny": "Vervang vast met alles",
"create.gui.schematicannon.option.replaceWithEmpty": "Vervang vast met leeg",
"create.gui.schematicannon.option.skipMissing": "Sla missende blokken over",
"create.gui.schematicannon.option.skipTileEntities": "Bescherm Tile Entities",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Als het Bouwtekeningkannon niet een geschikt blok kan vinden om te plaatsen gaat hij door bij de volgende locatie.",
"create.gui.schematicannon.option.skipTileEntities.description": "Het Bouwtekeningkannon probeert blokken met data zoals kisten te vermijden",
"create.gui.schematicannon.option.dontReplaceSolid.description": "Het Bouwtekeningkannon zal nooit vaste blokken in zijn gebied vervangen, alleen niet-vaste blokken en lucht",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.",
"create.item_attributes.placeable": "UNLOCALIZED: is placeable",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "UNLOCALIZED: can be eaten",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "UNLOCALIZED: is enchanted",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "UNLOCALIZED: is damaged",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "UNLOCALIZED: can be equipped",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected",
"create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.",
"create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 814",
"_": "Missing Localizations: 844",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "adjustable_crate",
"create.gui.adjustable_crate.storageSpace": "Espaço de Armazenamento",
"create.gui.stockpile_switch.title": "Disjuntor de Armazenamento",
"create.gui.stockpile_switch.lowerLimit": "Limite Mínimo",
"create.gui.stockpile_switch.upperLimit": "Limite Máximo",
"create.gui.stockpile_switch.startAt": "Iniciar Sinal em",
"create.gui.stockpile_switch.startAbove": "Iniciar Sinal acima de",
"create.gui.stockpile_switch.stopAt": "Parar Sinal em",
"create.gui.stockpile_switch.stopBelow": "Parar Sinal abaixo de",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift",
"create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction",
"create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "Segunda posição feita.",
"create.schematicAndQuill.noTarget": "Seguro [Ctrl] para selecionar Blocos de Ar.",
"create.schematicAndQuill.abort": "Seleção removida.",
"create.schematicAndQuill.prompt": "Informe um nome para o Esquema:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Meu Esquema",
"create.schematicAndQuill.saved": "Salvo como %1$s",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:",
"create.gui.schematicTable.title": "Mesa de Desenho",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "UNLOCALIZED: Available Schematics",
"create.gui.schematicTable.noSchematics": "UNLOCALIZED: No Schematics Saved",
"create.gui.schematicTable.uploading": "Importando...",
"create.gui.schematicTable.finished": "Envio Concluído!",
"create.gui.schematicannon.title": "Esquemaannon",
"create.gui.schematicannon.settingsTitle": "Parâmetros de Posicionamento",
"create.gui.schematicannon.listPrinter": "Impressora de Lista de Materiais",
"create.gui.schematicannon.gunpowderLevel": "Pólvora em %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Disparos faltantes: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "Com backup: %1$s",
"create.gui.schematicannon.optionEnabled": "Habilitado Atualmente",
"create.gui.schematicannon.optionDisabled": "Desabilitado Atualmente",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Não Substituir Blocos Sólidos",
"create.gui.schematicannon.option.replaceWithSolid": "Substituir Blocos Sólidos",
"create.gui.schematicannon.option.replaceWithAny": "Substituir Sólidos com Qualquer",
"create.gui.schematicannon.option.replaceWithEmpty": "Substituir Sólidos com Vazio",
"create.gui.schematicannon.option.skipMissing": "Pulando Blocos faltantes",
"create.gui.schematicannon.option.skipTileEntities": "Proteger Entidades Entalhadas",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Se o Esquemaannon não encontrar o Bloco para colocar, ele irá continuar para a próx. Posição.",
"create.gui.schematicannon.option.skipTileEntities.description": "O Esquemaannon vai evitar substituir blocos que contêm dados como Baus.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "O canhão irá nunca substituir Blocos sólidos na área em trabalho, apenas não-Sólidos e Ar.",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.",
"create.item_attributes.placeable": "UNLOCALIZED: is placeable",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "UNLOCALIZED: can be eaten",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "UNLOCALIZED: is enchanted",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "UNLOCALIZED: is damaged",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "UNLOCALIZED: can be equipped",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected",
"create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.",
"create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 808",
"_": "Missing Localizations: 838",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "Гибкий ящик",
"create.gui.adjustable_crate.storageSpace": "Обьём хранилища",
"create.gui.stockpile_switch.title": "Сенсор хранилища",
"create.gui.stockpile_switch.lowerLimit": "Нижний порог",
"create.gui.stockpile_switch.upperLimit": "Верхний порог",
"create.gui.stockpile_switch.startAt": "Включить на",
"create.gui.stockpile_switch.startAbove": "Включить выше",
"create.gui.stockpile_switch.stopAt": "Отключить на",
"create.gui.stockpile_switch.stopBelow": "Отключить ниже",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift",
"create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction",
"create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "Вторая позиция установлена.",
"create.schematicAndQuill.noTarget": "Зажмите [Ctrl], чтобы выделять блоки воздуха.",
"create.schematicAndQuill.abort": "Выделение удалено.",
"create.schematicAndQuill.prompt": "Введите название для новой схемы:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "Моя схема",
"create.schematicAndQuill.saved": "Сохранено как %1$s",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "Максимальный размер файла схемы:",
"create.gui.schematicTable.title": "Стол для схем",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "Доступные схемы",
"create.gui.schematicTable.noSchematics": "Нет сохранённых схем",
"create.gui.schematicTable.uploading": "Загрузка...",
"create.gui.schematicTable.finished": "Загрузка завершена!",
"create.gui.schematicannon.title": "Схемопушка",
"create.gui.schematicannon.settingsTitle": "Параметры размещения",
"create.gui.schematicannon.listPrinter": "Распечатать список материалов",
"create.gui.schematicannon.gunpowderLevel": "Порох: %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Выстрелов осталось: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "C запасом: %1$s",
"create.gui.schematicannon.optionEnabled": "Включена",
"create.gui.schematicannon.optionDisabled": "Отключена",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Не заменять целые блоки",
"create.gui.schematicannon.option.replaceWithSolid": "Заменять целые блоки целыми блоками",
"create.gui.schematicannon.option.replaceWithAny": "Заменять целые блоки чем угодно",
"create.gui.schematicannon.option.replaceWithEmpty": "Заменять целые блоки пустотой",
"create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки",
"create.gui.schematicannon.option.skipTileEntities": "Защита от сущностей",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Если схемопушка не найдёт нужный блок, то она продолжит в следующем месте.",
"create.gui.schematicannon.option.skipTileEntities.description": "Схемопушка будет избегать замены блоков с данными, например сундуки.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "Схемопушка никогда не заменит целые блоки, только не целые и воздух.",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.",
"create.item_attributes.placeable": "UNLOCALIZED: is placeable",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "UNLOCALIZED: can be eaten",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "UNLOCALIZED: is enchanted",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "UNLOCALIZED: is damaged",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "UNLOCALIZED: can be equipped",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected",
"create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.",
"create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 95",
"_": "Missing Localizations: 125",
"_": "->------------------------] Game Elements [------------------------<-",
@ -663,12 +663,9 @@
"create.gui.adjustable_crate.title": "板条箱",
"create.gui.adjustable_crate.storageSpace": "储存空间",
"create.gui.stockpile_switch.title": "储存开关",
"create.gui.stockpile_switch.lowerLimit": "阈值下限",
"create.gui.stockpile_switch.upperLimit": "阈值上限",
"create.gui.stockpile_switch.startAt": "启动信号",
"create.gui.stockpile_switch.startAbove": "给予红石信号当容量大于",
"create.gui.stockpile_switch.stopAt": "停止信号",
"create.gui.stockpile_switch.stopBelow": "停止红石信号当容量小于",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "可编程齿轮箱",
"create.gui.sequenced_gearshift.instruction": "指令",
"create.gui.sequenced_gearshift.instruction.turn_angle": "旋转",
@ -689,7 +686,8 @@
"create.schematicAndQuill.secondPos": "第二个位置.",
"create.schematicAndQuill.noTarget": "按住Ctrl选择空气方块.",
"create.schematicAndQuill.abort": "删除选择.",
"create.schematicAndQuill.prompt": "输入蓝图的名称:",
"create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:",
"create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "我的蓝图",
"create.schematicAndQuill.saved": "另存为 %1$s",
@ -740,24 +738,29 @@
"create.schematics.maxAllowedSize": "允许的最大蓝图文件大小为:",
"create.gui.schematicTable.title": "蓝图桌",
"create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files",
"create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder",
"create.gui.schematicTable.availableSchematics": "可用蓝图",
"create.gui.schematicTable.noSchematics": "没有保存的蓝图",
"create.gui.schematicTable.uploading": "正在上传...",
"create.gui.schematicTable.finished": "上传完成!",
"create.gui.schematicannon.title": "蓝图加农炮",
"create.gui.schematicannon.settingsTitle": "放置设置",
"create.gui.schematicannon.listPrinter": "物品清单打印机",
"create.gui.schematicannon.gunpowderLevel": "火药 %1$s%%",
"create.gui.schematicannon.shotsRemaining": "发射进度: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "备份: %1$s",
"create.gui.schematicannon.optionEnabled": "当前启用",
"create.gui.schematicannon.optionDisabled": "当前禁用",
"create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "不要替换方块",
"create.gui.schematicannon.option.replaceWithSolid": "用固体方块替换工作区域内的方块",
"create.gui.schematicannon.option.replaceWithAny": "用任何方块替换工作区域内的方块",
"create.gui.schematicannon.option.replaceWithEmpty": "用空气替换工作区域内的方块",
"create.gui.schematicannon.option.skipMissing": "绕过缺少的方块",
"create.gui.schematicannon.option.skipTileEntities": "保护存储方块",
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "如果缺失材料, 蓝图大炮将忽略当前缺失材料并且使用其他已有材料继续工作",
"create.gui.schematicannon.option.skipTileEntities.description": "蓝图将避免更换存储方块,如箱子.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "蓝图加农炮将不会替换工作范围内的任何固体方块.",
@ -793,23 +796,42 @@
"create.gui.filter.ignore_data.description": "匹配时忽视物品的耐久、附魔等其他属性",
"create.item_attributes.placeable": "可放置",
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "可食用",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "可被熔炉烧制",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "可被筛洗",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "可被烟熏",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "可被高炉冶炼",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "已被附魔",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.damaged": "已损坏",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "严重受损",
"create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged",
"create.item_attributes.not_stackable": "无法堆叠",
"create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked",
"create.item_attributes.equipable": "可装备",
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "是燃料",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.in_tag": "标签是%1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "属于 %1$s",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "由%1$s添加",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "没有标记任何属性",
"create.gui.attribute_filter.selected_attributes": "已选择的属性:",
"create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "任意匹配白名单 (任何)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "只要有其中一项属性符合,就可以通过",
"create.gui.attribute_filter.whitelist_conjunctive": "全匹配白名单 (所有)",

View file

@ -13,6 +13,7 @@ import com.simibubi.create.content.logistics.InWorldProcessing.Type;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.VecHelper;
@ -305,7 +306,7 @@ public class AirCurrent {
InWorldProcessing.spawnParticlesForProcessing(world, handler.getWorldPositionOf(transported),
processingType);
if (world.isRemote)
return null;
return TransportedResult.doNothing();
return InWorldProcessing.applyProcessing(transported, world, processingType);
});
}

View file

@ -10,9 +10,12 @@ import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.state.properties.RailShape;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.Vec3d;
public class CartAssemblerTileEntity extends SmartTileEntity {
private static final int assemblyCooldown = 8;
@ -24,11 +27,11 @@ public class CartAssemblerTileEntity extends SmartTileEntity {
super(type);
ticksSinceMinecartUpdate = assemblyCooldown;
}
@Override
public void tick() {
super.tick();
if(ticksSinceMinecartUpdate < assemblyCooldown) {
if (ticksSinceMinecartUpdate < assemblyCooldown) {
ticksSinceMinecartUpdate++;
}
}
@ -36,15 +39,36 @@ public class CartAssemblerTileEntity extends SmartTileEntity {
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
movementMode = new ScrollOptionBehaviour<>(CartMovementMode.class,
Lang.translate("contraptions.cart_movement_mode"), this, getMovementModeSlot());
Lang.translate("contraptions.cart_movement_mode"), this, getMovementModeSlot());
movementMode.requiresWrench();
behaviours.add(movementMode);
}
protected ValueBoxTransform getMovementModeSlot() {
return new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP);
return new CartAssemblerValueBoxTransform();
}
private class CartAssemblerValueBoxTransform extends CenteredSideValueBoxTransform {
public CartAssemblerValueBoxTransform() {
super((state, d) -> {
if (d.getAxis()
.isVertical())
return false;
if (!state.has(CartAssemblerBlock.RAIL_SHAPE))
return false;
RailShape railShape = state.get(CartAssemblerBlock.RAIL_SHAPE);
return (d.getAxis() == Axis.X) == (railShape == RailShape.NORTH_SOUTH);
});
}
@Override
protected Vec3d getSouthLocation() {
return VecHelper.voxelSpace(8, 8, 18);
}
}
public static enum CartMovementMode implements INamedIconOptions {
ROTATE(AllIcons.I_CART_ROTATE),
@ -71,11 +95,11 @@ public class CartAssemblerTileEntity extends SmartTileEntity {
return translationKey;
}
}
public void resetTicksSinceMinecartUpdate() {
ticksSinceMinecartUpdate = 0;
}
public boolean isMinecartUpdateValid() {
return ticksSinceMinecartUpdate >= assemblyCooldown;
}

View file

@ -26,6 +26,11 @@ public class PulleyRenderer extends KineticTileEntityRenderer {
public PulleyRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) {
return true;
}
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,

View file

@ -39,7 +39,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
public double getMaxRenderDistanceSquared() {
return super.getMaxRenderDistanceSquared() + offset * offset;
}
@Override
protected void assemble() {
if (!(world.getBlockState(pos)

View file

@ -100,6 +100,9 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
if (!capability.isPresent())
return ActionResultType.PASS;
if (!player.isCreative())
return ActionResultType.FAIL;
TileEntity te = world.getTileEntity(pos);
LazyOptional<IFluidHandler> tankCapability =
te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, ray.getFace());

View file

@ -141,5 +141,15 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen
public Class<SequencedGearshiftTileEntity> getTileEntityClass() {
return SequencedGearshiftTileEntity.class;
}
@Override
public boolean hasComparatorInputOverride(BlockState p_149740_1_) {
return true;
}
@Override
public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) {
return state.get(STATE).intValue();
}
}

View file

@ -3,11 +3,15 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton;
import com.simibubi.create.foundation.gui.widgets.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.ListNBT;
import net.minecraft.util.math.BlockPos;
@ -18,6 +22,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
private final ItemStack renderedItem = AllBlocks.SEQUENCED_GEARSHIFT.asStack();
private final AllGuiTextures background = AllGuiTextures.SEQUENCER;
private IconButton confirmButton;
private final String title = Lang.translate("gui.sequenced_gearshift.title");
private ListNBT compareTag;
@ -47,9 +52,9 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
}
public void initInputsOfRow(int row) {
int x = guiLeft + 28;
int y = guiTop + 29;
int rowHeight = 18;
int x = guiLeft + 30;
int y = guiTop + 18;
int rowHeight = 22;
Vector<ScrollInput> rowInputs = inputs.get(row);
rowInputs.forEach(widgets::remove);
@ -58,16 +63,16 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
Instruction instruction = instructions.get(row);
ScrollInput type =
new SelectionScrollInput(x, y + rowHeight * row, 50, 14).forOptions(SequencerInstructions.getOptions())
.calling(state -> instructionUpdated(index, state))
.setState(instruction.instruction.ordinal())
.titled(Lang.translate("gui.sequenced_gearshift.instruction"));
new SelectionScrollInput(x, y + rowHeight * row, 50, 18).forOptions(SequencerInstructions.getOptions())
.calling(state -> instructionUpdated(index, state))
.setState(instruction.instruction.ordinal())
.titled(Lang.translate("gui.sequenced_gearshift.instruction"));
ScrollInput value =
new ScrollInput(x + 54, y + rowHeight * row, 30, 14).calling(state -> instruction.value = state);
ScrollInput direction = new SelectionScrollInput(x + 88, y + rowHeight * row, 18, 14)
.forOptions(InstructionSpeedModifiers.getOptions())
.calling(state -> instruction.speedModifier = InstructionSpeedModifiers.values()[state])
.titled(Lang.translate("gui.sequenced_gearshift.speed"));
new ScrollInput(x + 58, y + rowHeight * row, 28, 18).calling(state -> instruction.value = state);
ScrollInput direction = new SelectionScrollInput(x + 88, y + rowHeight * row, 28, 18)
.forOptions(InstructionSpeedModifiers.getOptions())
.calling(state -> instruction.speedModifier = InstructionSpeedModifiers.values()[state])
.titled(Lang.translate("gui.sequenced_gearshift.speed"));
rowInputs.add(type);
rowInputs.add(value);
@ -75,6 +80,10 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
widgets.addAll(rowInputs);
updateParamsOfRow(row);
confirmButton =
new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
}
public void updateParamsOfRow(int row) {
@ -88,10 +97,10 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
value.active = value.visible = hasValue;
if (hasValue)
value.withRange(1, def.maxValue + 1)
.titled(Lang.translate(def.parameterKey))
.withShiftStep(def.shiftStep)
.setState(instruction.value)
.onChanged();
.titled(Lang.translate(def.parameterKey))
.withShiftStep(def.shiftStep)
.setState(instruction.value)
.onChanged();
if (def == SequencerInstructions.WAIT) {
value.withStepFunction(context -> {
int v = context.currentValue;
@ -112,40 +121,37 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
@Override
protected void renderWindow(int mouseX, int mouseY, float partialTicks) {
int hFontColor = 0xD3CBBE;
background.draw(this, guiLeft, guiTop);
for (int row = 0; row < instructions.capacity(); row++) {
AllGuiTextures toDraw = AllGuiTextures.SEQUENCER_EMPTY;
int yOffset = toDraw.height * row;
if (row < instructions.size()) {
Instruction instruction = instructions.get(row);
SequencerInstructions def = instruction.instruction;
def.background.draw(guiLeft + 14, guiTop + 29 + yOffset);
label(32, 6 + yOffset, Lang.translate(def.translationKey));
if (def.hasValueParameter) {
String text = def.formatValue(instruction.value);
int stringWidth = font.getStringWidth(text);
label(85 + (12 - stringWidth / 2), 6 + yOffset, text);
}
if (def.hasSpeedParameter)
label(120, 6 + yOffset, instruction.speedModifier.label);
if (row >= instructions.size()) {
toDraw.draw(guiLeft, guiTop + 14 + yOffset);
continue;
}
toDraw.draw(guiLeft + 14, guiTop + 29 + yOffset);
Instruction instruction = instructions.get(row);
SequencerInstructions def = instruction.instruction;
def.background.draw(guiLeft, guiTop + 14 + yOffset);
label(36, yOffset - 3, Lang.translate(def.translationKey));
if (def.hasValueParameter) {
String text = def.formatValue(instruction.value);
int stringWidth = font.getStringWidth(text);
label(90 + (12 - stringWidth / 2), yOffset - 3, text);
}
if (def.hasSpeedParameter)
label(127, yOffset - 3, instruction.speedModifier.label);
}
font.drawStringWithShadow(title, guiLeft - 3 + (background.width - font.getStringWidth(title)) / 2, guiTop + 10,
hFontColor);
font.drawStringWithShadow(title, guiLeft - 3 + (background.width - font.getStringWidth(title)) / 2, guiTop + 3, 0xffffff);
GuiGameElement.of(renderedItem)
.at(guiLeft + background.width + 20, guiTop + 50)
.scale(5)
.render();
.at(guiLeft + background.width + 20, guiTop + 50)
.scale(5)
.render();
}
private void label(int x, int y, String text) {
@ -184,4 +190,14 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
}
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen();
return true;
}
return super.mouseClicked(x, y, button);
}
}

View file

@ -9,7 +9,7 @@ import com.simibubi.create.foundation.utility.Lang;
public enum SequencerInstructions {
TURN_ANGLE("angle", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 360, 45, 90),
TURN_DISTANCE("distance", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 50, 5, 5),
TURN_DISTANCE("distance", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 128, 5, 5),
WAIT("duration", AllGuiTextures.SEQUENCER_WAIT, true, false, 600, 20, 10),
END("", AllGuiTextures.SEQUENCER_END),

View file

@ -40,6 +40,11 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
public BeltRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
public boolean isGlobalRenderer(BeltTileEntity te) {
return BeltBlock.canTransportObjects(te.getBlockState());
}
@Override
protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,

View file

@ -76,7 +76,7 @@ public class BeltTileEntity extends KineticTileEntity {
casing = CasingType.NONE;
color = -1;
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
super.addBehaviours(behaviours);

View file

@ -13,7 +13,6 @@ import net.minecraft.block.Blocks;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.Atlases;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.model.IBakedModel;
@ -103,7 +102,7 @@ public class SymmetryHandler {
double speed = 1 / 16d;
yShift = MathHelper.sin((float) (AnimationTickHolder.getRenderTick() * speed)) / 5f;
IRenderTypeBuffer buffer = Minecraft.getInstance()
IRenderTypeBuffer.Impl buffer = Minecraft.getInstance()
.getBufferBuilders()
.getEntityVertexConsumers();
ActiveRenderInfo info = mc.gameRenderer.getActiveRenderInfo();
@ -117,7 +116,7 @@ public class SymmetryHandler {
mirror.applyModelTransform(ms);
IBakedModel model = mirror.getModel()
.get();
IVertexBuilder builder = buffer.getBuffer(RenderType.getTranslucent());
IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid());
mc.getBlockRendererDispatcher()
.getBlockModelRenderer()
@ -125,11 +124,7 @@ public class SymmetryHandler {
player.world.getRandom(), MathHelper.getPositionRandom(pos), OverlayTexture.DEFAULT_UV,
EmptyModelData.INSTANCE);
Minecraft.getInstance()
.getBufferBuilders()
.getEntityVertexConsumers()
.draw(Atlases.getEntityTranslucent());
buffer.draw();
ms.pop();
}
}

View file

@ -2,16 +2,24 @@ package com.simibubi.create.content.curiosities.symmetry;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.content.curiosities.symmetry.mirror.*;
import com.simibubi.create.content.curiosities.symmetry.mirror.CrossPlaneMirror;
import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror;
import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror;
import com.simibubi.create.content.curiosities.symmetry.mirror.SymmetryMirror;
import com.simibubi.create.content.curiosities.symmetry.mirror.TriplePlaneMirror;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton;
import com.simibubi.create.foundation.gui.widgets.Label;
import com.simibubi.create.foundation.gui.widgets.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.networking.NbtPacket;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
@ -25,6 +33,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
private Label labelType;
private ScrollInput areaAlign;
private Label labelAlign;
private IconButton confirmButton;
private final String mirrorType = Lang.translate("gui.symmetryWand.mirrorType");
private final String orientation = Lang.translate("gui.symmetryWand.orientation");
@ -37,9 +46,9 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
super();
currentElement = SymmetryWandItem.getMirror(wand);
if (currentElement instanceof EmptyMirror) {
if (currentElement instanceof EmptyMirror)
currentElement = new PlaneMirror(Vec3d.ZERO);
}
this.hand = hand;
this.wand = wand;
}
@ -47,16 +56,17 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
@Override
public void init() {
super.init();
this.setWindowSize(AllGuiTextures.WAND_SYMMETRY.width + 50, AllGuiTextures.WAND_SYMMETRY.height + 50);
AllGuiTextures background = AllGuiTextures.WAND_OF_SYMMETRY;
this.setWindowSize(background.width + 50, background.height + 50);
labelType = new Label(guiLeft + 122, guiTop + 15, "").colored(0xFFFFFFFF)
labelType = new Label(guiLeft + 49, guiTop + 26, "").colored(0xFFFFFFFF)
.withShadow();
labelAlign = new Label(guiLeft + 122, guiTop + 35, "").colored(0xFFFFFFFF)
labelAlign = new Label(guiLeft + 49, guiTop + 48, "").colored(0xFFFFFFFF)
.withShadow();
int state =
currentElement instanceof TriplePlaneMirror ? 2 : currentElement instanceof CrossPlaneMirror ? 1 : 0;
areaType = new SelectionScrollInput(guiLeft + 119, guiTop + 12, 70, 14).forOptions(SymmetryMirror.getMirrors())
areaType = new SelectionScrollInput(guiLeft + 45, guiTop + 21, 109, 18).forOptions(SymmetryMirror.getMirrors())
.titled(mirrorType)
.writingTo(labelType)
.setState(state);
@ -85,15 +95,17 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
widgets.add(labelAlign);
widgets.add(areaType);
widgets.add(labelType);
confirmButton = new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
}
private void initAlign(SymmetryMirror element) {
if (areaAlign != null) {
if (areaAlign != null)
widgets.remove(areaAlign);
}
areaAlign = new SelectionScrollInput(guiLeft + 119, guiTop + 32, 70, 14).forOptions(element.getAlignToolTips())
areaAlign = new SelectionScrollInput(guiLeft + 45, guiTop + 43, 109, 18).forOptions(element.getAlignToolTips())
.titled(orientation)
.writingTo(labelAlign)
.setState(element.getOrientationIndex())
@ -104,30 +116,26 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
@Override
protected void renderWindow(int mouseX, int mouseY, float partialTicks) {
AllGuiTextures.WAND_SYMMETRY.draw(this, guiLeft, guiTop);
AllGuiTextures.WAND_OF_SYMMETRY.draw(this, guiLeft, guiTop);
int x = guiLeft + 63;
int y = guiTop + 15;
font.drawString(mirrorType, x - 5, y, AllGuiTextures.FONT_COLOR);
font.drawString(orientation, x - 5, y + 20, AllGuiTextures.FONT_COLOR);
font.drawStringWithShadow(wand.getDisplayName()
.getFormattedText(), guiLeft + 11, guiTop + 3, 0xffffff);
renderBlock();
GuiGameElement.of(wand)
.at(guiLeft + 200, guiTop + 170)
.scale(4)
.rotate(-70, 20, 20)
.render();
.at(guiLeft + 170, guiTop + 200)
.scale(4)
.rotate(-70, 20, 20)
.render();
}
protected void renderBlock() {
RenderSystem.pushMatrix();
MatrixStack ms = new MatrixStack();
ms.translate(guiLeft + 18, guiTop + 11, 20);
ms.translate(guiLeft + 25.5f, guiTop + 21, 20);
ms.multiply(new Vector3f(.3f, 1f, 0f).getDegreesQuaternion(-22.5f));
ms.scale(32, -32, 32);
ms.scale(16, -16, 16);
currentElement.applyModelTransform(ms);
RenderSystem.multMatrix(ms.peek()
.getModel());
@ -147,5 +155,15 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
minecraft.player.setHeldItem(hand, heldItem);
super.removed();
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen();
return true;
}
return super.mouseClicked(x, y, button);
}
}

View file

@ -5,6 +5,7 @@ import java.util.Vector;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton;
import com.simibubi.create.foundation.networking.AllPackets;
@ -14,20 +15,19 @@ import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.util.Hand;
@SuppressWarnings("deprecation")
public class ZapperScreen extends AbstractSimiScreen {
protected ItemStack zapper;
protected boolean offhand;
protected float animationProgress;
protected AllGuiTextures background;
private IconButton confirmButton;
protected final String patternSection = Lang.translate("gui.blockzapper.patternSection");
protected String title;
@ -41,7 +41,7 @@ public class ZapperScreen extends AbstractSimiScreen {
this.zapper = zapper;
this.offhand = offhand;
title = "";
brightColor = 0xCCDDFF;
brightColor = 0xfefefe;
fontColor = AllGuiTextures.FONT_COLOR;
}
@ -51,6 +51,9 @@ public class ZapperScreen extends AbstractSimiScreen {
setWindowSize(background.width + 40, background.height);
super.init();
widgets.clear();
confirmButton = new IconButton(guiLeft + background.width - 53, guiTop + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
int i = guiLeft - 20;
int j = guiTop;
@ -61,7 +64,7 @@ public class ZapperScreen extends AbstractSimiScreen {
for (int col = 0; col <= 2; col++) {
int id = patternButtons.size();
PlacementPatterns pattern = PlacementPatterns.values()[id];
patternButtons.add(new IconButton(i + 147 + col * 18, j + 23 + row * 18, pattern.icon));
patternButtons.add(new IconButton(i + background.width - 76 + col * 18, j + 19 + row * 18, pattern.icon));
patternButtons.get(id)
.setToolTip(Lang.translate("gui.blockzapper.pattern." + pattern.translationKey));
}
@ -82,17 +85,12 @@ public class ZapperScreen extends AbstractSimiScreen {
background.draw(this, i, j);
drawOnBackground(i, j);
minecraft.getTextureManager()
.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE);
RenderSystem.enableBlend();
renderBlock();
renderZapper();
}
protected void drawOnBackground(int i, int j) {
font.drawStringWithShadow(title, i + 8, j + 10, brightColor);
font.drawString(patternSection, i + 148, j + 11, fontColor);
font.drawStringWithShadow(title, i + 11, j + 3, brightColor);
}
@Override
@ -122,20 +120,25 @@ public class ZapperScreen extends AbstractSimiScreen {
nbt.putString("Pattern", PlacementPatterns.values()[patternButtons.indexOf(patternButton)].name());
}
}
if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen();
return true;
}
return super.mouseClicked(x, y, button);
}
protected void renderZapper() {
GuiGameElement.of(zapper)
.at((this.width - this.sWidth) / 2 + 210, this.height / 2 - this.sHeight / 4)
.at((this.width - this.sWidth) / 2 + 220, this.height / 2 - this.sHeight / 4 + 30)
.scale(4)
.render();
}
protected void renderBlock() {
RenderSystem.pushMatrix();
RenderSystem.translated(guiLeft + 1.7f, guiTop + 48, 120);
RenderSystem.translated(guiLeft + 7f, guiTop + 43.5f, 120);
RenderSystem.rotatef(-30f, .5f, .9f, -.1f);
RenderSystem.scaled(20, 20, 20);

View file

@ -43,26 +43,26 @@ public class BlockzapperScreen extends ZapperScreen {
int j = guiTop;
CompoundNBT nbt = zapper.getOrCreateTag();
replaceModeIndicator = new Indicator(i + 51, j + 36, "");
replaceModeButton = new IconButton(i + 51, j + 41, AllIcons.I_REPLACE_SOLID);
replaceModeIndicator = new Indicator(i + 49, j + 67, "");
replaceModeButton = new IconButton(i + 49, j + 73, AllIcons.I_REPLACE_SOLID);
if (nbt.contains("Replace") && nbt.getBoolean("Replace"))
replaceModeIndicator.state = State.ON;
replaceModeButton.setToolTip(Lang.translate("gui.blockzapper.replaceMode"));
spreadDiagonallyIndicator = new Indicator(i + 74, j + 36, "");
spreadDiagonallyButton = new IconButton(i + 74, j + 41, AllIcons.I_FOLLOW_DIAGONAL);
spreadDiagonallyIndicator = new Indicator(i + 8, j + 67, "");
spreadDiagonallyButton = new IconButton(i + 8, j + 73, AllIcons.I_FOLLOW_DIAGONAL);
if (nbt.contains("SearchDiagonal") && nbt.getBoolean("SearchDiagonal"))
spreadDiagonallyIndicator.state = State.ON;
spreadDiagonallyButton.setToolTip(Lang.translate("gui.blockzapper.searchDiagonal"));
spreadMaterialIndicator = new Indicator(i + 92, j + 36, "");
spreadMaterialButton = new IconButton(i + 92, j + 41, AllIcons.I_FOLLOW_MATERIAL);
spreadMaterialIndicator = new Indicator(i + 26, j + 67, "");
spreadMaterialButton = new IconButton(i + 26, j + 73, AllIcons.I_FOLLOW_MATERIAL);
if (nbt.contains("SearchFuzzy") && nbt.getBoolean("SearchFuzzy"))
spreadMaterialIndicator.state = State.ON;
spreadMaterialButton.setToolTip(Lang.translate("gui.blockzapper.searchFuzzy"));
spreadRangeLabel = new Label(i + 119, j + 46, "").withShadow().withSuffix("m");
spreadRangeInput = new ScrollInput(i + 115, j + 43, 22, 14).withRange(1, BlockzapperItem.getMaxAoe(zapper))
spreadRangeLabel = new Label(i + 79, j + 78, "").withShadow().withSuffix("m");
spreadRangeInput = new ScrollInput(i + 73, j + 73, 26, 18).withRange(1, BlockzapperItem.getMaxAoe(zapper))
.setState(1).titled(Lang.translate("gui.blockzapper.range")).writingTo(spreadRangeLabel);
if (nbt.contains("SearchDistance"))

View file

@ -38,8 +38,7 @@ public class WorldshaperScreen extends ZapperScreen {
public WorldshaperScreen(ItemStack zapper, boolean offhand) {
super(AllGuiTextures.TERRAINZAPPER, zapper, offhand);
brightColor = 0xDFF6FF;
fontColor = 0x436B77;
fontColor = 0x767676;
title = Lang.translate("gui.terrainzapper.title");
nbt = zapper.getOrCreateTag();
}
@ -51,8 +50,8 @@ public class WorldshaperScreen extends ZapperScreen {
i = guiLeft - 20;
j = guiTop;
brushLabel = new Label(i + 58, j + 28, "").withShadow();
brushInput = new SelectionScrollInput(i + 55, j + 25, 78, 14).forOptions(brushOptions)
brushLabel = new Label(i + 61, j + 23, "").withShadow();
brushInput = new SelectionScrollInput(i + 56, j + 18, 77, 18).forOptions(brushOptions)
.titled(Lang.translate("gui.terrainzapper.brush"))
.writingTo(brushLabel)
.calling(this::brushChanged);
@ -68,7 +67,7 @@ public class WorldshaperScreen extends ZapperScreen {
TerrainTools[] toolValues = TerrainTools.values();
for (int id = 0; id < toolValues.length; id++) {
TerrainTools tool = toolValues[id];
toolButtons.add(new IconButton(i + 8 + id * 18, j + 76, tool.icon));
toolButtons.add(new IconButton(i + 7 + id * 18, j + 77, tool.icon));
toolButtons.get(id)
.setToolTip(Lang.translate("gui.terrainzapper.tool." + tool.translationKey));
}
@ -82,7 +81,7 @@ public class WorldshaperScreen extends ZapperScreen {
PlacementOptions[] placementValues = PlacementOptions.values();
for (int id = 0; id < placementValues.length; id++) {
PlacementOptions option = placementValues[id];
placementButtons.add(new IconButton(i + 147 + id * 18, j + 76, option.icon));
placementButtons.add(new IconButton(i + 136 + id * 18, j + 77, option.icon));
placementButtons.get(id)
.setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey));
}
@ -114,15 +113,15 @@ public class WorldshaperScreen extends ZapperScreen {
Brush currentBrush = TerrainBrushes.values()[brushInput.getState()].get();
for (int index = 0; index < 3; index++) {
Label label = new Label(i + 62 + 18 * index, j + 46, "").withShadow();
Label label = new Label(i + 65 + 20 * index, j + 43, "").withShadow();
brushParamLabels.add(label);
int indexFinal = index;
ScrollInput input = new ScrollInput(i + 55 + 18 * index, j + 43, 14, 14)
ScrollInput input = new ScrollInput(i + 56 + 20 * index, j + 38, 18, 18)
.withRange(currentBrush.getMin(index), currentBrush.getMax(index) + 1)
.writingTo(label)
.titled(currentBrush.getParamLabel(index))
.calling(state -> {
label.x = i + 62 + 18 * indexFinal - font.getStringWidth(label.text) / 2;
label.x = i + 65 + 20 * indexFinal - font.getStringWidth(label.text) / 2;
});
input.setState(params[index]);
input.onChanged();
@ -175,12 +174,11 @@ public class WorldshaperScreen extends ZapperScreen {
super.drawOnBackground(i, j);
Brush currentBrush = TerrainBrushes.values()[brushInput.getState()].get();
for (int index = 2; index >= currentBrush.amtParams; index--) {
AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.draw(i + 55 + index * 18, j + 43);
}
for (int index = 2; index >= currentBrush.amtParams; index--)
AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.draw(i + 56 + 20 * index, j + 38);
font.drawString(toolSection, i + 8, j + 64, fontColor);
font.drawString(placementSection, i + 148, j + 64, fontColor);
font.drawString(toolSection, i + 7, j + 66, fontColor);
font.drawString(placementSection, i + 136, j + 66, fontColor);
}
@Override

View file

@ -40,17 +40,17 @@ public class AdjustableCrateContainer extends Container {
private void init() {
doubleCrate = te.isDoubleCrate();
int x = doubleCrate ? 52 : 124;
int x = doubleCrate ? 51 : 123;
int maxCol = doubleCrate ? 8 : 4;
for (int row = 0; row < 4; ++row) {
for (int col = 0; col < maxCol; ++col) {
this.addSlot(new SlotItemHandler(te.inventory, col + row * maxCol, x + col * 18, 25 + row * 18));
this.addSlot(new SlotItemHandler(te.inventory, col + row * maxCol, x + col * 18, 20 + row * 18));
}
}
// player Slots
int xOffset = 58;
int yOffset = 157;
int yOffset = 155;
for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 9; ++col) {
this.addSlot(new Slot(playerInventory, col + row * 9 + 9, xOffset + col * 18, yOffset + row * 18));

View file

@ -1,7 +1,7 @@
package com.simibubi.create.content.logistics.block.inventories;
import static com.simibubi.create.foundation.gui.AllGuiTextures.FLEXCRATE;
import static com.simibubi.create.foundation.gui.AllGuiTextures.FLEXCRATE_DOUBLE;
import static com.simibubi.create.foundation.gui.AllGuiTextures.ADJUSTABLE_CRATE;
import static com.simibubi.create.foundation.gui.AllGuiTextures.ADJUSTABLE_DOUBLE_CRATE;
import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY;
import java.util.ArrayList;
@ -43,11 +43,11 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
@Override
protected void init() {
setWindowSize(PLAYER_INVENTORY.width + 100, FLEXCRATE.height + PLAYER_INVENTORY.height + 20);
setWindowSize(PLAYER_INVENTORY.width + 100, ADJUSTABLE_CRATE.height + PLAYER_INVENTORY.height + 20);
super.init();
widgets.clear();
allowedItemsLabel = new Label(guiLeft + 100 + 70, guiTop + 107, "").colored(0xD3CBBE)
allowedItemsLabel = new Label(guiLeft + 100 + 69, guiTop + 108, "").colored(0xfefefe)
.withShadow();
allowedItems = new ScrollInput(guiLeft + 100 + 65, guiTop + 104, 41, 14).titled(storageSpace)
.withRange(1, (container.doubleCrate ? 2049 : 1025))
@ -60,7 +60,7 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
widgets.add(allowedItems);
extraAreas = new ArrayList<>();
extraAreas.add(new Rectangle2d(guiLeft + FLEXCRATE.width + 110, guiTop + 46, 71, 70));
extraAreas.add(new Rectangle2d(guiLeft + ADJUSTABLE_CRATE.width + 110, guiTop + 46, 71, 70));
}
@Override
@ -68,18 +68,17 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
int crateLeft = guiLeft + 100;
int crateTop = guiTop;
int invLeft = guiLeft + 50;
int invTop = crateTop + FLEXCRATE.height + 10;
int hFontColor = 0xD3CBBE;
int invTop = crateTop + ADJUSTABLE_CRATE.height + 10;
int fontColor = 0x4B3A22;
if (container.doubleCrate) {
crateLeft -= 72;
FLEXCRATE_DOUBLE.draw(this, crateLeft, crateTop);
ADJUSTABLE_DOUBLE_CRATE.draw(this, crateLeft, crateTop);
} else
FLEXCRATE.draw(this, crateLeft, crateTop);
ADJUSTABLE_CRATE.draw(this, crateLeft, crateTop);
font.drawStringWithShadow(title, crateLeft - 3 + (FLEXCRATE.width - font.getStringWidth(title)) / 2,
crateTop + 10, hFontColor);
font.drawStringWithShadow(title, crateLeft - 3 + (ADJUSTABLE_CRATE.width - font.getStringWidth(title)) / 2,
crateTop + 3, 0xfefefe);
String itemCount = "" + te.itemCount;
font.drawString(itemCount, guiLeft + 100 + 53 - font.getStringWidth(itemCount), crateTop + 107, fontColor);
@ -91,13 +90,13 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
if (allowedItems.getState() > slot * 64)
continue;
int slotsPerRow = (container.doubleCrate ? 8 : 4);
int x = crateLeft + 23 + (slot % slotsPerRow) * 18;
int y = crateTop + 24 + (slot / slotsPerRow) * 18;
AllGuiTextures.FLEXCRATE_LOCKED_SLOT.draw(this, x, y);
int x = crateLeft + 22 + (slot % slotsPerRow) * 18;
int y = crateTop + 19 + (slot / slotsPerRow) * 18;
AllGuiTextures.ADJUSTABLE_CRATE_LOCKED_SLOT.draw(this, x, y);
}
GuiGameElement.of(renderedItem)
.at(guiLeft + FLEXCRATE.width + 110, guiTop + 40)
.at(guiLeft + ADJUSTABLE_CRATE.width + 110, guiTop + 40)
.scale(5)
.render();
}

View file

@ -80,7 +80,7 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE<Stockpi
@Override
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
try {
return getTileEntity(blockAccess, pos).powered ? 15 : 0;
return getTileEntity(blockAccess, pos).isPowered() ? 15 : 0;
} catch (TileEntityException e) {
}
return 0;

View file

@ -2,40 +2,39 @@ package com.simibubi.create.content.logistics.block.redstone;
import static com.simibubi.create.foundation.gui.AllGuiTextures.STOCKSWITCH;
import java.util.Arrays;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.Label;
import com.simibubi.create.foundation.gui.widgets.IconButton;
import com.simibubi.create.foundation.gui.widgets.ScrollInput;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.LerpedFloat.Chaser;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
public class StockpileSwitchScreen extends AbstractSimiScreen {
private ScrollInput offBelow;
private Label offBelowLabel;
private ScrollInput onAbove;
private Label onAboveLabel;
private IconButton confirmButton;
private IconButton flipSignals;
private final String title = Lang.translate("gui.stockpile_switch.title");
private final String startAbove = Lang.translate("gui.stockpile_switch.startAbove");
private final String startAt = Lang.translate("gui.stockpile_switch.startAt");
private final String stopBelow = Lang.translate("gui.stockpile_switch.stopBelow");
private final String stopAt = Lang.translate("gui.stockpile_switch.stopAt");
private final String lowerLimit = Lang.translate("gui.stockpile_switch.lowerLimit");
private final String upperLimit = Lang.translate("gui.stockpile_switch.upperLimit");
private final String invertSignal = Lang.translate("gui.stockpile_switch.invert_signal");
private final ItemStack renderedItem = new ItemStack(AllBlocks.STOCKPILE_SWITCH.get());
private int lastModification;
private StockpileSwitchTileEntity te;
private float cursorPos;
private LerpedFloat cursor;
private LerpedFloat cursorLane;
public StockpileSwitchScreen(StockpileSwitchTileEntity te) {
this.te = te;
@ -44,82 +43,91 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
@Override
protected void init() {
setWindowSize(STOCKSWITCH.width + 50, STOCKSWITCH.height);
AllGuiTextures background = STOCKSWITCH;
setWindowSize(background.width + 50, background.height);
super.init();
widgets.clear();
cursorPos = te.currentLevel == -1 ? 0 : te.currentLevel;
offBelowLabel = new Label(guiLeft + 116, guiTop + 72, "").colored(0xD3CBBE)
.withShadow();
offBelow = new ScrollInput(guiLeft + 113, guiTop + 69, 33, 14).withRange(0, 96)
.titled(lowerLimit)
.calling(state -> {
offBelowLabel.text = state + "%";
lastModification = 0;
if (onAbove.getState() - 4 <= state) {
onAbove.setState(state + 5);
onAbove.onChanged();
}
})
.setState((int) (te.offWhenBelow * 100));
cursor = LerpedFloat.linear()
.startWithValue(te.getLevelForDisplay());
cursorLane = LerpedFloat.linear()
.startWithValue(te.getState() ? 1 : 0);
onAboveLabel = new Label(guiLeft + 116, guiTop + 55, "").colored(0xD3CBBE)
.withShadow();
onAbove = new ScrollInput(guiLeft + 113, guiTop + 52, 33, 14).withRange(5, 101)
.titled(upperLimit)
.calling(state -> {
onAboveLabel.text = state + "%";
lastModification = 0;
if (offBelow.getState() + 4 >= state) {
offBelow.setState(state - 5);
offBelow.onChanged();
}
})
.setState((int) (te.onWhenAbove * 100));
offBelow = new ScrollInput(guiLeft + 36, guiTop + 40, 102, 18).withRange(0, 100)
.titled("")
.calling(state -> {
lastModification = 0;
offBelow.titled(Lang.translate("gui.stockpile_switch.move_to_upper_at", state));
if (onAbove.getState() <= state) {
onAbove.setState(state + 1);
onAbove.onChanged();
}
})
.setState((int) (te.offWhenBelow * 100));
onAbove = new ScrollInput(guiLeft + 36, guiTop + 18, 102, 18).withRange(1, 101)
.titled("")
.calling(state -> {
lastModification = 0;
onAbove.titled(Lang.translate("gui.stockpile_switch.move_to_lower_at", state));
if (offBelow.getState() >= state) {
offBelow.setState(state - 1);
offBelow.onChanged();
}
})
.setState((int) (te.onWhenAbove * 100));
onAbove.onChanged();
offBelow.onChanged();
widgets.addAll(Arrays.asList(offBelowLabel, offBelow, onAbove, onAboveLabel));
widgets.add(onAbove);
widgets.add(offBelow);
confirmButton =
new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
flipSignals = new IconButton(guiLeft + 14, guiTop + 40, AllIcons.I_FLIP);
flipSignals.setToolTip(invertSignal);
widgets.add(flipSignals);
}
@Override
protected void renderWindow(int mouseX, int mouseY, float partialTicks) {
int hFontColor = 0xD3CBBE;
int fontColor = 0x4B3A22;
STOCKSWITCH.draw(this, guiLeft, guiTop);
font.drawStringWithShadow(title, guiLeft - 3 + (STOCKSWITCH.width - font.getStringWidth(title)) / 2,
guiTop + 10, hFontColor);
font.drawString(onAbove.getState() == 100 ? startAt : startAbove, guiLeft + 13, guiTop + 55, fontColor);
font.drawString(offBelow.getState() == 0 ? stopAt : stopBelow, guiLeft + 13, guiTop + 72, fontColor);
AllGuiTextures.STOCKSWITCH_POWERED_LANE.draw(this, guiLeft + 36, guiTop + (te.isInverted() ? 18 : 40));
AllGuiTextures.STOCKSWITCH_UNPOWERED_LANE.draw(this, guiLeft + 36, guiTop + (te.isInverted() ? 40 : 18));
font.drawStringWithShadow(title, guiLeft - 3 + (STOCKSWITCH.width - font.getStringWidth(title)) / 2, guiTop + 3,
0xffffff);
AllGuiTextures sprite = AllGuiTextures.STOCKSWITCH_INTERVAL;
float lowerBound = offBelow.getState() / 100f * (sprite.width - 20) + 10;
float upperBound = onAbove.getState() / 100f * (sprite.width - 20) + 10;
float lowerBound = offBelow.getState();
float upperBound = onAbove.getState();
sprite.bind();
blit((int) (guiLeft + lowerBound), guiTop + 26, (int) (sprite.startX + lowerBound), sprite.startY,
(int) (upperBound - lowerBound), sprite.height);
blit((int) (guiLeft + upperBound) + 37, guiTop + 18, (int) (sprite.startX + upperBound), sprite.startY,
(int) (sprite.width - upperBound), sprite.height);
blit(guiLeft + 37, guiTop + 40, sprite.startX, sprite.startY, (int) (lowerBound), sprite.height);
sprite = AllGuiTextures.STOCKSWITCH_INTERVAL_END;
sprite.bind();
blit((int) (guiLeft + upperBound), guiTop + 26, (int) (sprite.startX + upperBound), sprite.startY,
(int) (sprite.width - upperBound), sprite.height);
AllGuiTextures.STOCKSWITCH_ARROW_UP.draw(this, (int) (guiLeft + lowerBound + 36) - 2, guiTop + 35);
AllGuiTextures.STOCKSWITCH_ARROW_DOWN.draw(this, (int) (guiLeft + upperBound + 36) - 3, guiTop + 17);
AllGuiTextures.STOCKSWITCH_BOUND_LEFT.draw(this, (int) (guiLeft + lowerBound) - 1, guiTop + 24);
AllGuiTextures.STOCKSWITCH_BOUND_RIGHT.draw(this, (int) (guiLeft + upperBound) - 5, guiTop + 24);
AllGuiTextures cursor =
te.powered ? AllGuiTextures.STOCKSWITCH_CURSOR_ON : AllGuiTextures.STOCKSWITCH_CURSOR_OFF;
RenderSystem.pushMatrix();
RenderSystem.translatef((cursorPos * (sprite.width - 20) + 10), 0, 0);
cursor.draw(this, guiLeft - 4, guiTop + 24);
RenderSystem.popMatrix();
if (te.currentLevel != -1) {
AllGuiTextures cursor = AllGuiTextures.STOCKSWITCH_CURSOR;
RenderSystem.pushMatrix();
RenderSystem.translatef(Math.min(99, this.cursor.getValue(partialTicks) * sprite.width),
cursorLane.getValue(partialTicks) * 22, 0);
cursor.draw(this, guiLeft + 34, guiTop + 19);
RenderSystem.popMatrix();
}
RenderSystem.pushMatrix();
GuiGameElement.of(renderedItem)
.at(guiLeft + STOCKSWITCH.width + 15, guiTop + 20)
.scale(5)
.render();
.at(guiLeft + STOCKSWITCH.width + 15, guiTop + 20)
.scale(5)
.render();
RenderSystem.popMatrix();
}
@ -127,25 +135,39 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
public void tick() {
super.tick();
if (te.currentLevel == -1)
cursorPos = 0;
else
cursorPos += (te.currentLevel - cursorPos) / 4;
cursor.chase(te.getLevelForDisplay(), 1 / 4f, Chaser.EXP);
cursor.tickChaser();
cursorLane.chase(te.getState() ? 1 : 0, 1 / 4f, Chaser.EXP);
cursorLane.tickChaser();
if (lastModification >= 0)
lastModification++;
if (lastModification >= 20) {
lastModification = -1;
AllPackets.channel.sendToServer(
new ConfigureStockswitchPacket(te.getPos(), offBelow.getState() / 100f, onAbove.getState() / 100f));
send(te.isInverted());
}
}
@Override
public void removed() {
AllPackets.channel.sendToServer(
new ConfigureStockswitchPacket(te.getPos(), offBelow.getState() / 100f, onAbove.getState() / 100f));
send(te.isInverted());
}
protected void send(boolean invert) {
AllPackets.channel.sendToServer(new ConfigureStockswitchPacket(te.getPos(), offBelow.getState() / 100f,
onAbove.getState() / 100f, invert));
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (flipSignals.isHovered())
send(!te.isInverted());
if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen();
return true;
}
return super.mouseClicked(x, y, button);
}
}

View file

@ -20,7 +20,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
public float onWhenAbove;
public float offWhenBelow;
public float currentLevel;
public boolean powered;
private boolean state;
private boolean inverted;
private FilteringBehaviour filtering;
private InvManipulationBehaviour observedInventory;
@ -30,7 +31,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
onWhenAbove = .75f;
offWhenBelow = .25f;
currentLevel = -1;
powered = false;
state = false;
inverted = false;
setLazyTickRate(10);
}
@ -39,7 +41,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
onWhenAbove = compound.getFloat("OnAbove");
offWhenBelow = compound.getFloat("OffBelow");
currentLevel = compound.getFloat("Current");
powered = compound.getBoolean("Powered");
state = compound.getBoolean("Powered");
inverted = compound.getBoolean("Inverted");
super.read(compound, clientPacket);
}
@ -48,7 +51,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
compound.putFloat("OnAbove", onWhenAbove);
compound.putFloat("OffBelow", offWhenBelow);
compound.putFloat("Current", currentLevel);
compound.putBoolean("Powered", powered);
compound.putBoolean("Powered", state);
compound.putBoolean("Inverted", inverted);
super.write(compound, clientPacket);
}
@ -57,13 +61,15 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
}
public void updateCurrentLevel() {
boolean changed = false;
if (!observedInventory.hasInventory()) {
if (currentLevel == -1)
return;
world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, 0), 3);
currentLevel = -1;
powered = false;
state = false;
world.notifyNeighbors(pos, getBlockState().getBlock());
sendData();
return;
}
@ -85,15 +91,18 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
occupied += count * (1f / space);
}
currentLevel = (float) occupied / totalSpace;
float level = (float) occupied / totalSpace;
if (currentLevel != level)
changed = true;
currentLevel = level;
currentLevel = MathHelper.clamp(currentLevel, 0, 1);
boolean previouslyPowered = powered;
if (powered && currentLevel <= offWhenBelow)
powered = false;
else if (!powered && currentLevel >= onWhenAbove)
powered = true;
boolean update = previouslyPowered != powered;
boolean previouslyPowered = state;
if (state && currentLevel <= offWhenBelow)
state = false;
else if (!state && currentLevel >= onWhenAbove)
state = true;
boolean update = previouslyPowered != state;
int displayLevel = 0;
if (currentLevel > 0)
@ -101,6 +110,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, displayLevel), update ? 3 : 2);
if (update)
world.notifyNeighbors(pos, getBlockState().getBlock());
if (changed || update)
sendData();
}
@Override
@ -120,4 +131,27 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
observedInventory = new InvManipulationBehaviour(this, InterfaceProvider.towardBlockFacing()).bypassSidedness();
behaviours.add(observedInventory);
}
public float getLevelForDisplay() {
return currentLevel == -1 ? 0 : currentLevel;
}
public boolean getState() {
return state;
}
public boolean isPowered() {
return inverted != state;
}
public boolean isInverted() {
return inverted;
}
public void setInverted(boolean inverted) {
if (inverted == this.inverted)
return;
this.inverted = inverted;
world.notifyNeighbors(pos, getBlockState().getBlock());
}
}

View file

@ -41,8 +41,8 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
super.init();
widgets.clear();
resetButton = new IconButton(guiLeft + 15, guiTop + background.height - 30, AllIcons.I_TRASH);
confirmButton = new IconButton(guiLeft + 159, guiTop + background.height - 30, AllIcons.I_CONFIRM);
resetButton = new IconButton(guiLeft + background.width - 62, guiTop + background.height - 24, AllIcons.I_TRASH);
confirmButton = new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(resetButton);
widgets.add(confirmButton);
@ -59,14 +59,7 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
PLAYER_INVENTORY.draw(this, invX, invY);
font.drawString(playerInventory.getDisplayName().getFormattedText(), invX + 7, invY + 6, 0x666666);
font.drawString(I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 9, 0x5B5037);
/*RenderHelper.enableGuiDepthLighting();
RenderSystem.pushMatrix();
RenderSystem.translated(guiLeft + background.width + 0, guiTop + background.height - 60, 0);
RenderSystem.scaled(5, 5, 5);
itemRenderer.renderItemIntoGUI(container.filterItem, 0, 0);
RenderSystem.popMatrix();*/
font.drawStringWithShadow(I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 3, 0xdedede);
GuiGameElement.of(container.filterItem)
.at(guiLeft + background.width, guiTop +background.height -60)

View file

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List;
import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
@ -27,7 +28,7 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
}
WhitelistMode whitelistMode;
List<ItemAttribute> selectedAttributes;
List<Pair<ItemAttribute, Boolean>> selectedAttributes;
public AttributeFilterContainer(int id, PlayerInventory inv, PacketBuffer extraData) {
super(AllContainerTypes.ATTRIBUTE_FILTER.type, id, inv, extraData);
@ -37,21 +38,21 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
super(AllContainerTypes.ATTRIBUTE_FILTER.type, id, inv, stack);
}
public void appendSelectedAttribute(ItemAttribute itemAttribute) {
selectedAttributes.add(itemAttribute);
public void appendSelectedAttribute(ItemAttribute itemAttribute, boolean inverted) {
selectedAttributes.add(Pair.of(itemAttribute, inverted));
}
@Override
protected void clearContents() {
selectedAttributes.clear();
}
@Override
protected void init() {
super.init();
ItemStack stack = new ItemStack(Items.NAME_TAG);
stack.setDisplayName(
new StringTextComponent("Selected Tags").applyTextStyles(TextFormatting.RESET, TextFormatting.BLUE));
new StringTextComponent("Selected Tags").applyTextStyles(TextFormatting.RESET, TextFormatting.BLUE));
filterInventory.setStackInSlot(1, stack);
}
@ -61,8 +62,8 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
}
protected void addFilterSlots() {
this.addSlot(new SlotItemHandler(filterInventory, 0, 16, 23));
this.addSlot(new SlotItemHandler(filterInventory, 1, 59, 56) {
this.addSlot(new SlotItemHandler(filterInventory, 0, 16, 22));
this.addSlot(new SlotItemHandler(filterInventory, 1, 22, 57) {
@Override
public boolean canTakeStack(PlayerEntity playerIn) {
return false;
@ -110,29 +111,37 @@ public class AttributeFilterContainer extends AbstractFilterContainer {
@Override
protected int getInventoryOffset() {
return 86;
return 83;
}
@Override
protected void readData(ItemStack filterItem) {
selectedAttributes = new ArrayList<>();
whitelistMode = WhitelistMode.values()[filterItem.getOrCreateTag().getInt("WhitelistMode")];
ListNBT attributes = filterItem.getOrCreateTag().getList("MatchedAttributes", NBT.TAG_COMPOUND);
attributes.forEach(inbt -> selectedAttributes.add(ItemAttribute.fromNBT((CompoundNBT) inbt)));
whitelistMode = WhitelistMode.values()[filterItem.getOrCreateTag()
.getInt("WhitelistMode")];
ListNBT attributes = filterItem.getOrCreateTag()
.getList("MatchedAttributes", NBT.TAG_COMPOUND);
attributes.forEach(inbt -> {
CompoundNBT compound = (CompoundNBT) inbt;
selectedAttributes.add(Pair.of(ItemAttribute.fromNBT(compound), compound.getBoolean("Inverted")));
});
}
@Override
protected void saveData(ItemStack filterItem) {
filterItem.getOrCreateTag().putInt("WhitelistMode", whitelistMode.ordinal());
filterItem.getOrCreateTag()
.putInt("WhitelistMode", whitelistMode.ordinal());
ListNBT attributes = new ListNBT();
selectedAttributes.forEach(at -> {
if (at == null)
return;
CompoundNBT compoundNBT = new CompoundNBT();
at.serializeNBT(compoundNBT);
at.getFirst().serializeNBT(compoundNBT);
compoundNBT.putBoolean("Inverted", at.getSecond());
attributes.add(compoundNBT);
});
filterItem.getOrCreateTag().put("MatchedAttributes", attributes);
filterItem.getOrCreateTag()
.put("MatchedAttributes", attributes);
}
}

View file

@ -16,6 +16,7 @@ import com.simibubi.create.foundation.gui.widgets.Label;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
@ -30,6 +31,10 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
private IconButton whitelistDis, whitelistCon, blacklist;
private Indicator whitelistDisIndicator, whitelistConIndicator, blacklistIndicator;
private IconButton add;
private IconButton addInverted;
private String addDESC = Lang.translate(PREFIX + "add_attribute");
private String addInvertedDESC = Lang.translate(PREFIX + "add_inverted_attribute");
private String whitelistDisN = Lang.translate(PREFIX + "whitelist_disjunctive");
private String whitelistDisDESC = Lang.translate(PREFIX + "whitelist_disjunctive.description");
@ -58,29 +63,32 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
int x = guiLeft;
int y = guiTop;
whitelistDis = new IconButton(x + 84, y + 58, AllIcons.I_WHITELIST_OR);
whitelistDis = new IconButton(x + 47, y + 59, AllIcons.I_WHITELIST_OR);
whitelistDis.setToolTip(whitelistDisN);
whitelistCon = new IconButton(x + 102, y + 58, AllIcons.I_WHITELIST_AND);
whitelistCon = new IconButton(x + 65, y + 59, AllIcons.I_WHITELIST_AND);
whitelistCon.setToolTip(whitelistConN);
blacklist = new IconButton(x + 120, y + 58, AllIcons.I_WHITELIST_NOT);
blacklist = new IconButton(x + 83, y + 59, AllIcons.I_WHITELIST_NOT);
blacklist.setToolTip(blacklistN);
whitelistDisIndicator = new Indicator(x + 84, y + 53, "");
whitelistConIndicator = new Indicator(x + 102, y + 53, "");
blacklistIndicator = new Indicator(x + 120, y + 53, "");
whitelistDisIndicator = new Indicator(x + 47, y + 53, "");
whitelistConIndicator = new Indicator(x + 65, y + 53, "");
blacklistIndicator = new Indicator(x + 83, y + 53, "");
widgets.addAll(Arrays.asList(blacklist, whitelistCon, whitelistDis, blacklistIndicator, whitelistConIndicator,
whitelistDisIndicator));
whitelistDisIndicator));
widgets.add(add = new IconButton(x + 182, y + 21, AllIcons.I_ADD));
widgets.add(addInverted = new IconButton(x + 200, y + 21, AllIcons.I_ADD_INVERTED_ATTRIBUTE));
add.setToolTip(addDESC);
addInverted.setToolTip(addInvertedDESC);
add = new IconButton(x + 159, y + 22, AllIcons.I_ADD);
widgets.add(add);
handleIndicators();
attributeSelectorLabel = new Label(x + 40, y + 27, "").colored(0xF3EBDE).withShadow();
attributeSelector = new SelectionScrollInput(x + 37, y + 24, 118, 14);
attributeSelectorLabel = new Label(x + 43, y + 26, "").colored(0xF3EBDE)
.withShadow();
attributeSelector = new SelectionScrollInput(x + 39, y + 21, 137, 18);
attributeSelector.forOptions(Arrays.asList(""));
attributeSelector.calling(s -> {
});
attributeSelector.removeCallback();
referenceItemChanged(container.filterInventory.getStackInSlot(0));
widgets.add(attributeSelector);
@ -88,8 +96,9 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
selectedAttributes.clear();
selectedAttributes
.add(TextFormatting.YELLOW + (container.selectedAttributes.isEmpty() ? noSelectedT : selectedT));
container.selectedAttributes.forEach(at -> selectedAttributes.add(TextFormatting.GRAY + "- " + at.format()));
.add(TextFormatting.YELLOW + (container.selectedAttributes.isEmpty() ? noSelectedT : selectedT));
container.selectedAttributes.forEach(at -> selectedAttributes.add(TextFormatting.GRAY + "- " + at.getFirst()
.format(at.getSecond())));
}
@ -101,17 +110,22 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
attributeSelector.visible = false;
attributeSelectorLabel.text = TextFormatting.ITALIC + referenceH;
add.active = false;
addInverted.active = false;
attributeSelector.calling(s -> {
});
return;
}
add.active = true;
attributeSelector.titled(stack.getDisplayName().getFormattedText() + "...");
addInverted.active = true;
attributeSelector.titled(stack.getDisplayName()
.getFormattedText() + "...");
attributesOfItem.clear();
for (ItemAttribute itemAttribute : ItemAttribute.types)
attributesOfItem.addAll(itemAttribute.listAttributesOf(stack, this.minecraft.world));
List<String> options = attributesOfItem.stream().map(ItemAttribute::format).collect(Collectors.toList());
List<String> options = attributesOfItem.stream()
.map(ia -> ia.format(false))
.collect(Collectors.toList());
attributeSelector.forOptions(options);
attributeSelector.active = true;
attributeSelector.visible = true;
@ -119,17 +133,20 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
attributeSelector.calling(i -> {
attributeSelectorLabel.setTextAndTrim(options.get(i), true, 112);
ItemAttribute selected = attributesOfItem.get(i);
for (ItemAttribute existing : container.selectedAttributes) {
for (Pair<ItemAttribute, Boolean> existing : container.selectedAttributes) {
CompoundNBT testTag = new CompoundNBT();
CompoundNBT testTag2 = new CompoundNBT();
existing.serializeNBT(testTag);
existing.getFirst()
.serializeNBT(testTag);
selected.serializeNBT(testTag2);
if (testTag.equals(testTag2)) {
add.active = false;
addInverted.active = false;
return;
}
}
add.active = true;
addInverted.active = true;
});
attributeSelector.onChanged();
}
@ -141,8 +158,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
RenderSystem.translatef(0.0F, 0.0F, 32.0F);
this.setBlitOffset(200);
this.itemRenderer.zLevel = 200.0F;
this.itemRenderer.renderItemOverlayIntoGUI(font, stack, guiLeft + 59, guiTop + 56,
String.valueOf(selectedAttributes.size() - 1));
this.itemRenderer.renderItemOverlayIntoGUI(font, stack, guiLeft + 22, guiTop + 57,
String.valueOf(selectedAttributes.size() - 1));
this.setBlitOffset(0);
this.itemRenderer.zLevel = 0.0F;
RenderSystem.popMatrix();
@ -160,8 +177,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
@Override
protected void renderHoveredToolTip(int mouseX, int mouseY) {
if (this.minecraft.player.inventory.getItemStack().isEmpty() && this.hoveredSlot != null
&& this.hoveredSlot.getHasStack()) {
if (this.minecraft.player.inventory.getItemStack()
.isEmpty() && this.hoveredSlot != null && this.hoveredSlot.getHasStack()) {
if (this.hoveredSlot.slotNumber == 37) {
renderTooltip(selectedAttributes, mouseX, mouseY, font);
return;
@ -206,31 +223,40 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
return true;
}
if (add.isHovered() && add.active) {
int index = attributeSelector.getState();
if (index < attributesOfItem.size()) {
add.active = false;
CompoundNBT tag = new CompoundNBT();
ItemAttribute itemAttribute = attributesOfItem.get(index);
itemAttribute.serializeNBT(tag);
AllPackets.channel.sendToServer(new FilterScreenPacket(Option.ADD_TAG, tag));
container.selectedAttributes.add(itemAttribute);
if (container.selectedAttributes.size() == 1)
selectedAttributes.set(0, TextFormatting.YELLOW + selectedT);
selectedAttributes.add(TextFormatting.GRAY + "- " + itemAttribute.format());
return true;
}
}
if (add.isHovered() && add.active)
return handleAddedAttibute(false);
if (addInverted.isHovered() && addInverted.active)
return handleAddedAttibute(true);
return mouseClicked;
}
protected boolean handleAddedAttibute(boolean inverted) {
int index = attributeSelector.getState();
if (index >= attributesOfItem.size())
return false;
add.active = false;
addInverted.active = false;
CompoundNBT tag = new CompoundNBT();
ItemAttribute itemAttribute = attributesOfItem.get(index);
itemAttribute.serializeNBT(tag);
AllPackets.channel
.sendToServer(new FilterScreenPacket(inverted ? Option.ADD_INVERTED_TAG : Option.ADD_TAG, tag));
container.appendSelectedAttribute(itemAttribute, inverted);
if (container.selectedAttributes.size() == 1)
selectedAttributes.set(0, TextFormatting.YELLOW + selectedT);
selectedAttributes.add(TextFormatting.GRAY + "- " + itemAttribute.format(inverted));
return true;
}
@Override
protected void contentsCleared() {
selectedAttributes.clear();
selectedAttributes.add(TextFormatting.YELLOW + noSelectedT);
if (!lastItemScanned.isEmpty())
if (!lastItemScanned.isEmpty()) {
add.active = true;
addInverted.active = true;
}
}
@Override

View file

@ -24,8 +24,8 @@ public class FilterContainer extends AbstractFilterContainer {
@Override
protected void addFilterSlots() {
int x = 16;
int y = 21;
int x = 23;
int y = 20;
for (int row = 0; row < 2; ++row)
for (int col = 0; col < 9; ++col)
@ -39,7 +39,7 @@ public class FilterContainer extends AbstractFilterContainer {
@Override
protected int getInventoryOffset() {
return 100;
return 97;
}
@Override

View file

@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nonnull;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllKeys;
import com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode;
@ -36,8 +38,6 @@ import net.minecraftforge.fml.network.NetworkHooks;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import javax.annotation.Nonnull;
public class FilterItem extends Item implements INamedContainerProvider {
private FilterType type;
@ -121,12 +121,14 @@ public class FilterItem extends Item implements INamedContainerProvider {
ListNBT attributes = filter.getOrCreateTag()
.getList("MatchedAttributes", NBT.TAG_COMPOUND);
for (INBT inbt : attributes) {
ItemAttribute attribute = ItemAttribute.fromNBT((CompoundNBT) inbt);
CompoundNBT compound = (CompoundNBT) inbt;
ItemAttribute attribute = ItemAttribute.fromNBT(compound);
boolean inverted = compound.getBoolean("Inverted");
if (count > 3) {
list.add(TextFormatting.DARK_GRAY + "- ...");
break;
}
list.add(TextFormatting.GRAY + "- " + attribute.format());
list.add(TextFormatting.GRAY + "- " + attribute.format(inverted));
count++;
}
@ -211,8 +213,9 @@ public class FilterItem extends Item implements INamedContainerProvider {
ListNBT attributes = filter.getOrCreateTag()
.getList("MatchedAttributes", NBT.TAG_COMPOUND);
for (INBT inbt : attributes) {
ItemAttribute attribute = ItemAttribute.fromNBT((CompoundNBT) inbt);
boolean matches = attribute.appliesTo(stack, world);
CompoundNBT compound = (CompoundNBT) inbt;
ItemAttribute attribute = ItemAttribute.fromNBT(compound);
boolean matches = attribute.appliesTo(stack, world) != compound.getBoolean("Inverted");
if (matches) {
switch (whitelistMode) {

View file

@ -42,20 +42,20 @@ public class FilterScreen extends AbstractFilterScreen<FilterContainer> {
int x = guiLeft;
int y = guiTop;
blacklist = new IconButton(x + 58, y + 72, AllIcons.I_BLACKLIST);
blacklist = new IconButton(x + 18, y + 73, AllIcons.I_BLACKLIST);
blacklist.setToolTip(blacklistN);
whitelist = new IconButton(x + 76, y + 72, AllIcons.I_WHITELIST);
whitelist = new IconButton(x + 36, y + 73, AllIcons.I_WHITELIST);
whitelist.setToolTip(whitelistN);
blacklistIndicator = new Indicator(x + 58, y + 67, "");
whitelistIndicator = new Indicator(x + 76, y + 67, "");
blacklistIndicator = new Indicator(x + 18, y + 67, "");
whitelistIndicator = new Indicator(x + 36, y + 67, "");
widgets.addAll(Arrays.asList(blacklist, whitelist, blacklistIndicator, whitelistIndicator));
respectNBT = new IconButton(x + 98, y + 72, AllIcons.I_RESPECT_NBT);
respectNBT = new IconButton(x + 60, y + 73, AllIcons.I_RESPECT_NBT);
respectNBT.setToolTip(respectDataN);
ignoreNBT = new IconButton(x + 116, y + 72, AllIcons.I_IGNORE_NBT);
ignoreNBT = new IconButton(x + 78, y + 73, AllIcons.I_IGNORE_NBT);
ignoreNBT.setToolTip(ignoreDataN);
respectNBTIndicator = new Indicator(x + 98, y + 67, "");
ignoreNBTIndicator = new Indicator(x + 116, y + 67, "");
respectNBTIndicator = new Indicator(x + 60, y + 67, "");
ignoreNBTIndicator = new Indicator(x + 78, y + 67, "");
widgets.addAll(Arrays.asList(respectNBT, ignoreNBT, respectNBTIndicator, ignoreNBTIndicator));
handleIndicators();
}

View file

@ -13,7 +13,7 @@ import net.minecraftforge.fml.network.NetworkEvent.Context;
public class FilterScreenPacket extends SimplePacketBase {
enum Option {
CLEAR, WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, ADD_TAG;
CLEAR, WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, ADD_TAG, ADD_INVERTED_TAG;
}
private Option option;
@ -75,7 +75,9 @@ public class FilterScreenPacket extends SimplePacketBase {
if (option == Option.BLACKLIST)
c.whitelistMode = WhitelistMode.BLACKLIST;
if (option == Option.ADD_TAG)
c.appendSelectedAttribute(ItemAttribute.fromNBT(data));
c.appendSelectedAttribute(ItemAttribute.fromNBT(data), false);
if (option == Option.ADD_INVERTED_TAG)
c.appendSelectedAttribute(ItemAttribute.fromNBT(data), true);
}
});

View file

@ -12,6 +12,7 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicates;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.foundation.utility.Lang;
@ -95,8 +96,9 @@ public interface ItemAttribute {
}
@OnlyIn(value = Dist.CLIENT)
default String format() {
return Lang.translate("item_attributes." + getTranslationKey(), getTranslationParameters());
default String format(boolean inverted) {
return Lang.translate("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""),
getTranslationParameters());
}
public static enum StandardTraits implements ItemAttribute {
@ -111,6 +113,8 @@ public interface ItemAttribute {
EQUIPABLE(s -> s.getEquipmentSlot() != null),
FURNACE_FUEL(AbstractFurnaceTileEntity::isFuel),
WASHABLE(InWorldProcessing::isWashable),
CRUSHABLE((s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType())
|| testRecipe(s, w, AllRecipeTypes.MILLING.getType())),
SMELTABLE((s, w) -> testRecipe(s, w, IRecipeType.SMELTING)),
SMOKABLE((s, w) -> testRecipe(s, w, IRecipeType.SMOKING)),
BLASTABLE((s, w) -> testRecipe(s, w, IRecipeType.BLASTING));
@ -125,9 +129,11 @@ public interface ItemAttribute {
private static boolean testRecipe(ItemStack s, World w, IRecipeType<? extends IRecipe<IInventory>> smelting) {
RECIPE_WRAPPER.setInventorySlotContents(0, s.copy());
return w.getRecipeManager().getRecipe(smelting, RECIPE_WRAPPER, w).isPresent();
return w.getRecipeManager()
.getRecipe(smelting, RECIPE_WRAPPER, w)
.isPresent();
}
private StandardTraits(BiPredicate<ItemStack, World> test) {
this.testWithWorld = test;
}
@ -193,12 +199,18 @@ public interface ItemAttribute {
@Override
public boolean appliesTo(ItemStack stack) {
return stack.getItem().getTags().contains(tagName);
return stack.getItem()
.getTags()
.contains(tagName);
}
@Override
public List<ItemAttribute> listAttributesOf(ItemStack stack) {
return stack.getItem().getTags().stream().map(InTag::new).collect(Collectors.toList());
return stack.getItem()
.getTags()
.stream()
.map(InTag::new)
.collect(Collectors.toList());
}
@Override
@ -240,7 +252,8 @@ public interface ItemAttribute {
@Override
public List<ItemAttribute> listAttributesOf(ItemStack stack) {
ItemGroup group = stack.getItem().getGroup();
ItemGroup group = stack.getItem()
.getGroup();
return group == null ? Collections.emptyList() : Arrays.asList(new InItemGroup(group));
}
@ -249,9 +262,11 @@ public interface ItemAttribute {
return "in_item_group";
}
@Override
@OnlyIn(value = Dist.CLIENT)
public String format() {
return Lang.translate("item_attributes." + getTranslationKey(), I18n.format(group.getTranslationKey()));
public String format(boolean inverted) {
return Lang.translate("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""),
I18n.format(group.getTranslationKey()));
}
@Override
@ -263,7 +278,8 @@ public interface ItemAttribute {
public ItemAttribute readNBT(CompoundNBT nbt) {
String readPath = nbt.getString("path");
for (ItemGroup group : ItemGroup.GROUPS)
if (group.getPath().equals(readPath))
if (group.getPath()
.equals(readPath))
return new InItemGroup(group);
return null;
}
@ -280,12 +296,14 @@ public interface ItemAttribute {
@Override
public boolean appliesTo(ItemStack stack) {
return modId.equals(stack.getItem().getCreatorModId(stack));
return modId.equals(stack.getItem()
.getCreatorModId(stack));
}
@Override
public List<ItemAttribute> listAttributesOf(ItemStack stack) {
String id = stack.getItem().getCreatorModId(stack);
String id = stack.getItem()
.getCreatorModId(stack);
return id == null ? Collections.emptyList() : Arrays.asList(new AddedBy(id));
}
@ -296,9 +314,11 @@ public interface ItemAttribute {
@Override
public Object[] getTranslationParameters() {
Optional<? extends ModContainer> modContainerById = ModList.get().getModContainerById(modId);
String name = modContainerById.map(ModContainer::getModInfo).map(IModInfo::getDisplayName)
.orElse(StringUtils.capitalize(modId));
Optional<? extends ModContainer> modContainerById = ModList.get()
.getModContainerById(modId);
String name = modContainerById.map(ModContainer::getModInfo)
.map(IModInfo::getDisplayName)
.orElse(StringUtils.capitalize(modId));
return new Object[] { name };
}

View file

@ -10,11 +10,13 @@ public class ConfigureStockswitchPacket extends TileEntityConfigurationPacket<St
private float offBelow;
private float onAbove;
private boolean invert;
public ConfigureStockswitchPacket(BlockPos pos, float offBelow, float onAbove) {
public ConfigureStockswitchPacket(BlockPos pos, float offBelow, float onAbove, boolean invert) {
super(pos);
this.offBelow = offBelow;
this.onAbove = onAbove;
this.invert = invert;
}
public ConfigureStockswitchPacket(PacketBuffer buffer) {
@ -25,18 +27,21 @@ public class ConfigureStockswitchPacket extends TileEntityConfigurationPacket<St
protected void readSettings(PacketBuffer buffer) {
offBelow = buffer.readFloat();
onAbove = buffer.readFloat();
invert = buffer.readBoolean();
}
@Override
protected void writeSettings(PacketBuffer buffer) {
buffer.writeFloat(offBelow);
buffer.writeFloat(onAbove);
buffer.writeBoolean(invert);
}
@Override
protected void applySettings(StockpileSwitchTileEntity te) {
te.offWhenBelow = offBelow;
te.onWhenAbove = onAbove;
te.setInverted(invert);
}
}

View file

@ -66,14 +66,8 @@ public class ClientSchematicLoader {
long size = Files.size(path);
// Too big
Integer maxSize = AllConfigs.SERVER.schematics.maxTotalSchematicSize.get();
if (size > maxSize * 1000) {
Minecraft.getInstance().player.sendMessage(new StringTextComponent(
Lang.translate("schematics.uploadTooLarge") + " (" + size / 1000 + " KB)."));
Minecraft.getInstance().player.sendMessage(
new StringTextComponent(Lang.translate("schematics.maxAllowedSize") + " " + maxSize + " KB"));
if (!validateSizeLimitation(size))
return;
}
in = Files.newInputStream(path, StandardOpenOption.READ);
activeUploads.put(schematic, in);
@ -83,6 +77,20 @@ public class ClientSchematicLoader {
}
}
public static boolean validateSizeLimitation(long size) {
if (Minecraft.getInstance().isSingleplayer())
return true;
Integer maxSize = AllConfigs.SERVER.schematics.maxTotalSchematicSize.get();
if (size > maxSize * 1000) {
Minecraft.getInstance().player.sendMessage(new StringTextComponent(
Lang.translate("schematics.uploadTooLarge") + " (" + size / 1000 + " KB)."));
Minecraft.getInstance().player.sendMessage(
new StringTextComponent(Lang.translate("schematics.maxAllowedSize") + " " + maxSize + " KB"));
return false;
}
return true;
}
private void continueUpload(String schematic) {
if (activeUploads.containsKey(schematic)) {
Integer maxPacketSize = AllConfigs.SERVER.schematics.maxSchematicPacketSize.get();

View file

@ -14,7 +14,10 @@ import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;
import org.apache.commons.io.IOUtils;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.Create;
import com.simibubi.create.content.schematics.block.SchematicTableTileEntity;
import com.simibubi.create.content.schematics.item.SchematicItem;
@ -23,12 +26,17 @@ import com.simibubi.create.foundation.config.CSchematics;
import com.simibubi.create.foundation.utility.FilesHelper;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.template.Template;
public class ServerSchematicLoader {
@ -92,17 +100,12 @@ public class ServerSchematicLoader {
// Unsupported Format
if (!schematic.endsWith(".nbt")) {
Create.logger.warn("Attempted Schematic Upload with non-supported Format: " + playerSchematicId);
return;
}
// Too big
Integer maxFileSize = getConfig().maxTotalSchematicSize.get();
if (size > maxFileSize * 1000) {
player.sendMessage(new TranslationTextComponent("create.schematics.uploadTooLarge")
.appendSibling(new StringTextComponent(" (" + size / 1000 + " KB).")));
player.sendMessage(new TranslationTextComponent("create.schematics.maxAllowedSize")
.appendSibling(new StringTextComponent(" " + maxFileSize + " KB")));
if (!validateSchematicSizeOnServer(player, size))
return;
}
// Skip existing Uploads
if (activeUploads.containsKey(playerSchematicId))
@ -134,8 +137,7 @@ public class ServerSchematicLoader {
// Open Stream
OutputStream writer =
Files.newOutputStream(Paths.get(getSchematicPath(), playerSchematicId), StandardOpenOption.CREATE_NEW);
activeUploads.put(playerSchematicId,
new SchematicUploadEntry(writer, size, player.getServerWorld(), pos));
activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, player.getServerWorld(), pos));
// Notify Tile Entity
table.startUpload(schematic);
@ -146,6 +148,18 @@ public class ServerSchematicLoader {
}
}
protected boolean validateSchematicSizeOnServer(ServerPlayerEntity player, long size) {
Integer maxFileSize = getConfig().maxTotalSchematicSize.get();
if (size > maxFileSize * 1000) {
player.sendMessage(new TranslationTextComponent("create.schematics.uploadTooLarge")
.appendSibling(new StringTextComponent(" (" + size / 1000 + " KB).")));
player.sendMessage(new TranslationTextComponent("create.schematics.maxAllowedSize")
.appendSibling(new StringTextComponent(" " + maxFileSize + " KB")));
return false;
}
return true;
}
public CSchematics getConfig() {
return AllConfigs.SERVER.schematics;
}
@ -231,7 +245,7 @@ public class ServerSchematicLoader {
SchematicUploadEntry removed = activeUploads.remove(playerSchematicId);
World world = removed.world;
BlockPos pos = removed.tablePos;
Create.logger.info("New Schematic Uploaded: " + playerSchematicId);
if (pos == null)
return;
@ -252,6 +266,65 @@ public class ServerSchematicLoader {
e.printStackTrace();
}
}
}
public void handleInstantSchematic(ServerPlayerEntity player, String schematic, World world, BlockPos pos,
BlockPos bounds) {
String playerPath = getSchematicPath() + "/" + player.getName()
.getFormattedText();
String playerSchematicId = player.getName()
.getFormattedText() + "/" + schematic;
FilesHelper.createFolderIfMissing(playerPath);
// Unsupported Format
if (!schematic.endsWith(".nbt")) {
Create.logger.warn("Attempted Schematic Upload with non-supported Format: " + playerSchematicId);
return;
}
// Not holding S&Q
if (!AllItems.SCHEMATIC_AND_QUILL.isIn(player.getHeldItemMainhand()))
return;
try {
// Delete schematic with same name
Path path = Paths.get(getSchematicPath(), playerSchematicId);
Files.deleteIfExists(path);
// Too many Schematics
Stream<Path> list = Files.list(Paths.get(playerPath));
if (list.count() >= getConfig().maxSchematics.get()) {
Stream<Path> list2 = Files.list(Paths.get(playerPath));
Optional<Path> lastFilePath = list2.filter(f -> !Files.isDirectory(f))
.min(Comparator.comparingLong(f -> f.toFile()
.lastModified()));
list2.close();
if (lastFilePath.isPresent())
Files.deleteIfExists(lastFilePath.get());
}
list.close();
Template t = new Template();
t.takeBlocksFromWorld(world, pos, bounds, true, Blocks.AIR);
OutputStream outputStream = null;
try {
outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE);
CompoundNBT nbttagcompound = t.writeToNBT(new CompoundNBT());
CompressedStreamTools.writeCompressed(nbttagcompound, outputStream);
player.setHeldItem(Hand.MAIN_HAND, SchematicItem.create(schematic, player.getName()
.getFormattedText()));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null)
IOUtils.closeQuietly(outputStream);
}
} catch (IOException e) {
Create.logger.error("Exception Thrown in direct Schematic Upload: " + playerSchematicId);
e.printStackTrace();
}
}
}

View file

@ -41,7 +41,7 @@ public class SchematicTableContainer extends Container {
}
protected void init() {
inputSlot = new SlotItemHandler(te.inventory, 0, -9, 40) {
inputSlot = new SlotItemHandler(te.inventory, 0, -35, 41) {
@Override
public boolean isItemValid(ItemStack stack) {
return AllItems.EMPTY_SCHEMATIC.isIn(stack) || AllItems.SCHEMATIC_AND_QUILL.isIn(stack)
@ -49,7 +49,7 @@ public class SchematicTableContainer extends Container {
}
};
outputSlot = new SlotItemHandler(te.inventory, 1, 75, 40) {
outputSlot = new SlotItemHandler(te.inventory, 1, 110, 41) {
@Override
public boolean isItemValid(ItemStack stack) {
return false;

View file

@ -38,6 +38,8 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
private final String title = Lang.translate("gui.schematicTable.title");
private final String uploading = Lang.translate("gui.schematicTable.uploading");
private final String finished = Lang.translate("gui.schematicTable.finished");
private final String refresh = Lang.translate("gui.schematicTable.refresh");
private final String folder = Lang.translate("gui.schematicTable.open_folder");
private final String noSchematics = Lang.translate("gui.schematicTable.noSchematics");
private final String availableSchematicsTitle = Lang.translate("gui.schematicTable.availableSchematics");
private final ItemStack renderedItem = AllBlocks.SCHEMATIC_TABLE.asStack();
@ -63,20 +65,24 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
CreateClient.schematicSender.refresh();
List<String> availableSchematics = CreateClient.schematicSender.getAvailableSchematics();
schematicsLabel = new Label(mainLeft + 36, mainTop + 26, "").withShadow();
schematicsLabel = new Label(mainLeft + 49, mainTop + 26, "").withShadow();
schematicsLabel.text = "";
if (!availableSchematics.isEmpty()) {
schematicsArea =
new SelectionScrollInput(mainLeft + 33, mainTop + 23, 134, 14).forOptions(availableSchematics)
new SelectionScrollInput(mainLeft + 45, mainTop + 21, 139, 18).forOptions(availableSchematics)
.titled(availableSchematicsTitle)
.writingTo(schematicsLabel);
widgets.add(schematicsArea);
widgets.add(schematicsLabel);
}
confirmButton = new IconButton(mainLeft + 69, mainTop + 55, AllIcons.I_CONFIRM);
folderButton = new IconButton(mainLeft + 204, mainTop + 6, AllIcons.I_OPEN_FOLDER);
refreshButton = new IconButton(mainLeft + 204, mainTop + 26, AllIcons.I_REFRESH);
confirmButton = new IconButton(mainLeft + 44, mainTop + 56, AllIcons.I_CONFIRM);
folderButton = new IconButton(mainLeft + 21, mainTop + 21, AllIcons.I_OPEN_FOLDER);
folderButton.setToolTip(folder);
refreshButton = new IconButton(mainLeft + 207, mainTop + 21, AllIcons.I_REFRESH);
refreshButton.setToolTip(refresh);
widgets.add(confirmButton);
widgets.add(folderButton);
widgets.add(refreshButton);
@ -104,13 +110,13 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
SCHEMATIC_TABLE.draw(this, mainLeft, mainTop);
if (container.getTileEntity().isUploading)
font.drawString(uploading, mainLeft + 76, mainTop + 10, AllGuiTextures.FONT_COLOR);
font.drawStringWithShadow(uploading, mainLeft + 11, mainTop + 3, 0xffffff);
else if (container.getSlot(1).getHasStack())
font.drawString(finished, mainLeft + 60, mainTop + 10, AllGuiTextures.FONT_COLOR);
font.drawStringWithShadow(finished, mainLeft + 11, mainTop + 3, 0xffffff);
else
font.drawString(title, mainLeft + 60, mainTop + 10, AllGuiTextures.FONT_COLOR);
font.drawStringWithShadow(title, mainLeft + 11, mainTop + 3, 0xffffff);
if (schematicsArea == null)
font.drawStringWithShadow(noSchematics, mainLeft + 39, mainTop + 26, 0xFFDD44);
font.drawStringWithShadow(noSchematics, mainLeft + 54, mainTop + 26, 0xd3d3d3);
GuiGameElement.of(renderedItem)
.at(mainLeft + 217, mainTop + 48)
@ -123,7 +129,7 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
* MathHelper.lerp(partialTicks, lastChasingProgress, chasingProgress));
int height = SCHEMATIC_TABLE_PROGRESS.height;
RenderSystem.disableLighting();
blit(mainLeft + 94, mainTop + 56, SCHEMATIC_TABLE_PROGRESS.startX, SCHEMATIC_TABLE_PROGRESS.startY, width,
blit(mainLeft + 70, mainTop + 58, SCHEMATIC_TABLE_PROGRESS.startX, SCHEMATIC_TABLE_PROGRESS.startY, width,
height);
}
@ -194,6 +200,7 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
.forOptions(availableSchematics)
.titled(availableSchematicsTitle)
.writingTo(schematicsLabel);
schematicsArea.onChanged();
widgets.add(schematicsArea);
} else {
schematicsArea = null;

View file

@ -41,21 +41,18 @@ public class SchematicannonContainer extends Container {
int x = 20;
int y = 0;
addSlot(new SlotItemHandler(te.inventory, 0, x + 14, y + 37));
addSlot(new SlotItemHandler(te.inventory, 1, x + 170, y + 37));
addSlot(new SlotItemHandler(te.inventory, 2, x + 222, y + 21));
addSlot(new SlotItemHandler(te.inventory, 3, x + 222, y + 60));
addSlot(new SlotItemHandler(te.inventory, 4, x + 51, y + 135));
addSlot(new SlotItemHandler(te.inventory, 0, x + 15, y + 65));
addSlot(new SlotItemHandler(te.inventory, 1, x + 171, y + 65));
addSlot(new SlotItemHandler(te.inventory, 2, x + 134, y + 19));
addSlot(new SlotItemHandler(te.inventory, 3, x + 174, y + 19));
addSlot(new SlotItemHandler(te.inventory, 4, x + 15, y + 19));
// player Slots
for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 9; ++col) {
for (int row = 0; row < 3; ++row)
for (int col = 0; col < 9; ++col)
addSlot(new Slot(player.inventory, col + row * 9 + 9, -2 + col * 18, 163 + row * 18));
}
}
for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) {
for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot)
addSlot(new Slot(player.inventory, hotbarSlot, -2 + hotbarSlot * 18, 221));
}
detectAndSendChanges();
}

View file

@ -3,7 +3,6 @@ package com.simibubi.create.content.schematics.block;
import java.util.Random;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.schematics.block.LaunchedItem.ForBlockState;
@ -18,7 +17,6 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.Direction;
@ -27,19 +25,21 @@ import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.client.model.data.EmptyModelData;
@SuppressWarnings("deprecation")
public class SchematicannonRenderer extends SafeTileEntityRenderer<SchematicannonTileEntity> {
public SchematicannonRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
public boolean isGlobalRenderer(SchematicannonTileEntity p_188185_1_) {
return true;
}
@Override
protected void renderSafe(SchematicannonTileEntity tileEntityIn, float partialTicks, MatrixStack ms,
IRenderTypeBuffer buffer, int light, int overlay) {
Minecraft.getInstance().getTextureManager().bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE);
double yaw = 0;
double pitch = 40;
double recoil = 0;
@ -96,8 +96,8 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer<Schematicanno
ms.push();
ms.translate(blockLocation.x, blockLocation.y, blockLocation.z);
// Rotation and Scaling effects
ms.multiply(new Vector3f(1, 1, 0).getDegreesQuaternion(360 * t * 2));
ms.multiply(new Vector3f(0, 1, 0).getDegreesQuaternion(360 * t * 2));
ms.multiply(new Vector3f(1, 0, 0).getDegreesQuaternion(360 * t * 2));
// Render the Block
if (launched instanceof ForBlockState) {
@ -109,8 +109,8 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer<Schematicanno
// Render the item
if (launched instanceof ForEntity) {
double scale = 1.2f;
GlStateManager.scaled(scale, scale, scale);
float scale = 1.2f;
ms.scale(scale, scale, scale);
Minecraft.getInstance().getItemRenderer().renderItem(launched.stack, TransformType.GROUND, light,
overlay, ms, buffer);
}
@ -118,9 +118,8 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer<Schematicanno
ms.pop();
// Apply Recoil if block was just launched
if ((launched.ticksRemaining + 1 - partialTicks) > launched.totalTicks - 10) {
if ((launched.ticksRemaining + 1 - partialTicks) > launched.totalTicks - 10)
recoil = Math.max(recoil, (launched.ticksRemaining + 1 - partialTicks) - launched.totalTicks + 10);
}
// Render particles for launch
if (launched.ticksRemaining == launched.totalTicks && tileEntityIn.firstRenderTick) {

View file

@ -15,12 +15,15 @@ import com.simibubi.create.foundation.item.ItemDescription.Palette;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.renderer.Rectangle2d;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.TranslationTextComponent;
import java.util.ArrayList;
import java.util.Collections;
@ -31,6 +34,9 @@ import static net.minecraft.util.text.TextFormatting.GRAY;
public class SchematicannonScreen extends AbstractSimiContainerScreen<SchematicannonContainer> {
private static final AllGuiTextures BG_BOTTOM = AllGuiTextures.SCHEMATICANNON_BOTTOM;
private static final AllGuiTextures BG_TOP = AllGuiTextures.SCHEMATICANNON_TOP;
protected Vector<Indicator> replaceLevelIndicators;
protected Vector<IconButton> replaceLevelButtons;
@ -47,27 +53,37 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
protected Indicator resetIndicator;
private List<Rectangle2d> extraAreas;
protected List<Widget> placementSettingWidgets;
private final String title = Lang.translate("gui.schematicannon.title");
private final String settingsTitle = Lang.translate("gui.schematicannon.settingsTitle");
private final String listPrinter = Lang.translate("gui.schematicannon.listPrinter");
private final String _gunpowderLevel = "gui.schematicannon.gunpowderLevel";
private final String _shotsRemaining = "gui.schematicannon.shotsRemaining";
private final String _showSettings = "gui.schematicannon.showOptions";
private final String _shotsRemainingWithBackup = "gui.schematicannon.shotsRemainingWithBackup";
private final String _slotGunpowder = "gui.schematicannon.slot.gunpowder";
private final String _slotListPrinter = "gui.schematicannon.slot.listPrinter";
private final String _slotSchematic = "gui.schematicannon.slot.schematic";
private final String optionEnabled = Lang.translate("gui.schematicannon.optionEnabled");
private final String optionDisabled = Lang.translate("gui.schematicannon.optionDisabled");
private final ItemStack renderedItem = AllBlocks.SCHEMATICANNON.asStack();
private IconButton confirmButton;
private IconButton showSettingsButton;
private Indicator showSettingsIndicator;
public SchematicannonScreen(SchematicannonContainer container, PlayerInventory inventory,
ITextComponent p_i51105_3_) {
ITextComponent p_i51105_3_) {
super(container, inventory, p_i51105_3_);
placementSettingWidgets = new ArrayList<>();
}
@Override
protected void init() {
setWindowSize(AllGuiTextures.SCHEMATICANNON_BG.width + 50, AllGuiTextures.SCHEMATICANNON_BG.height + 80);
setWindowSize(BG_TOP.width + 50, BG_BOTTOM.height + BG_TOP.height + 80);
super.init();
int x = guiLeft + 20;
@ -76,63 +92,87 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
widgets.clear();
// Play Pause Stop
playButton = new IconButton(x + 70, y + 55, AllIcons.I_PLAY);
playIndicator = new Indicator(x + 70, y + 50, "");
pauseButton = new IconButton(x + 88, y + 55, AllIcons.I_PAUSE);
pauseIndicator = new Indicator(x + 88, y + 50, "");
resetButton = new IconButton(x + 106, y + 55, AllIcons.I_STOP);
resetIndicator = new Indicator(x + 106, y + 50, "");
playButton = new IconButton(x + 75, y + 86, AllIcons.I_PLAY);
playIndicator = new Indicator(x + 75, y + 79, "");
pauseButton = new IconButton(x + 93, y + 86, AllIcons.I_PAUSE);
pauseIndicator = new Indicator(x + 93, y + 79, "");
resetButton = new IconButton(x + 111, y + 86, AllIcons.I_STOP);
resetIndicator = new Indicator(x + 111, y + 79, "");
resetIndicator.state = State.RED;
Collections
.addAll(widgets, playButton, playIndicator, pauseButton, pauseIndicator, resetButton, resetIndicator);
// Replace settings
replaceLevelButtons = new Vector<>(4);
replaceLevelIndicators = new Vector<>(4);
List<AllIcons> icons = ImmutableList
.of(AllIcons.I_DONT_REPLACE, AllIcons.I_REPLACE_SOLID, AllIcons.I_REPLACE_ANY,
AllIcons.I_REPLACE_EMPTY);
List<String> toolTips = ImmutableList
.of(Lang.translate("gui.schematicannon.option.dontReplaceSolid"),
Lang.translate("gui.schematicannon.option.replaceWithSolid"),
Lang.translate("gui.schematicannon.option.replaceWithAny"),
Lang.translate("gui.schematicannon.option.replaceWithEmpty"));
for (int i = 0; i < 4; i++) {
replaceLevelIndicators.add(new Indicator(x + 16 + i * 18, y + 96, ""));
replaceLevelButtons.add(new IconButton(x + 16 + i * 18, y + 101, icons.get(i)));
replaceLevelButtons.get(i).setToolTip(toolTips.get(i));
}
widgets.addAll(replaceLevelButtons);
widgets.addAll(replaceLevelIndicators);
// Other Settings
skipMissingButton = new IconButton(x + 106, y + 101, AllIcons.I_SKIP_MISSING);
skipMissingButton.setToolTip(Lang.translate("gui.schematicannon.option.skipMissing"));
skipMissingIndicator = new Indicator(x + 106, y + 96, "");
Collections.addAll(widgets, skipMissingButton, skipMissingIndicator);
skipTilesButton = new IconButton(x + 124, y + 101, AllIcons.I_SKIP_TILES);
skipTilesButton.setToolTip(Lang.translate("gui.schematicannon.option.skipTileEntities"));
skipTilesIndicator = new Indicator(x + 124, y + 96, "");
Collections.addAll(widgets, skipTilesButton, skipTilesIndicator);
Collections.addAll(widgets, playButton, playIndicator, pauseButton, pauseIndicator, resetButton,
resetIndicator);
extraAreas = new ArrayList<>();
extraAreas.add(new Rectangle2d(guiLeft + 240, guiTop + 88, 84, 113));
confirmButton = new IconButton(x + 180, guiTop + 117, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
showSettingsButton = new IconButton(guiLeft + 29, guiTop + 117, AllIcons.I_PLACEMENT_SETTINGS);
showSettingsButton.setToolTip(Lang.translate(_showSettings));
widgets.add(showSettingsButton);
showSettingsIndicator = new Indicator(guiLeft + 29, guiTop + 111, "");
widgets.add(showSettingsIndicator);
tick();
}
private void initPlacementSettings() {
widgets.removeAll(placementSettingWidgets);
placementSettingWidgets.clear();
if (placementSettingsHidden())
return;
int x = guiLeft + 20;
int y = guiTop;
// Replace settings
replaceLevelButtons = new Vector<>(4);
replaceLevelIndicators = new Vector<>(4);
List<AllIcons> icons = ImmutableList.of(AllIcons.I_DONT_REPLACE, AllIcons.I_REPLACE_SOLID,
AllIcons.I_REPLACE_ANY, AllIcons.I_REPLACE_EMPTY);
List<String> toolTips = ImmutableList.of(Lang.translate("gui.schematicannon.option.dontReplaceSolid"),
Lang.translate("gui.schematicannon.option.replaceWithSolid"),
Lang.translate("gui.schematicannon.option.replaceWithAny"),
Lang.translate("gui.schematicannon.option.replaceWithEmpty"));
for (int i = 0; i < 4; i++) {
replaceLevelIndicators.add(new Indicator(x + 33 + i * 18, y + 111, ""));
replaceLevelButtons.add(new IconButton(x + 33 + i * 18, y + 117, icons.get(i)));
replaceLevelButtons.get(i)
.setToolTip(toolTips.get(i));
}
placementSettingWidgets.addAll(replaceLevelButtons);
placementSettingWidgets.addAll(replaceLevelIndicators);
// Other Settings
skipMissingButton = new IconButton(x + 111, y + 117, AllIcons.I_SKIP_MISSING);
skipMissingButton.setToolTip(Lang.translate("gui.schematicannon.option.skipMissing"));
skipMissingIndicator = new Indicator(x + 111, y + 111, "");
Collections.addAll(placementSettingWidgets, skipMissingButton, skipMissingIndicator);
skipTilesButton = new IconButton(x + 129, y + 117, AllIcons.I_SKIP_TILES);
skipTilesButton.setToolTip(Lang.translate("gui.schematicannon.option.skipTileEntities"));
skipTilesIndicator = new Indicator(x + 129, y + 111, "");
Collections.addAll(placementSettingWidgets, skipTilesButton, skipTilesIndicator);
widgets.addAll(placementSettingWidgets);
}
protected boolean placementSettingsHidden() {
return showSettingsIndicator.state == State.OFF;
}
@Override
public void tick() {
SchematicannonTileEntity te = container.getTileEntity();
replaceLevelIndicators.get(0).state = te.replaceMode == 0 ? State.ON : State.OFF;
for (int replaceMode = 1; replaceMode < replaceLevelButtons.size(); replaceMode++)
replaceLevelIndicators.get(replaceMode).state = replaceMode <= te.replaceMode ? State.ON : State.OFF;
skipMissingIndicator.state = te.skipMissing ? State.ON : State.OFF;
skipTilesIndicator.state = !te.replaceTileEntities ? State.ON : State.OFF;
if (!placementSettingsHidden()) {
for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++)
replaceLevelIndicators.get(replaceMode).state = replaceMode == te.replaceMode ? State.ON : State.OFF;
skipMissingIndicator.state = te.skipMissing ? State.ON : State.OFF;
skipTilesIndicator.state = !te.replaceTileEntities ? State.ON : State.OFF;
}
playIndicator.state = State.OFF;
pauseIndicator.state = State.OFF;
@ -167,12 +207,18 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
}
protected void handleTooltips() {
for (Widget w : widgets)
if (placementSettingsHidden())
return;
for (Widget w : placementSettingWidgets)
if (w instanceof IconButton) {
IconButton button = (IconButton) w;
if (!button.getToolTip().isEmpty()) {
button.setToolTip(button.getToolTip().get(0));
button.getToolTip().add(TooltipHelper.holdShift(Palette.Blue, hasShiftDown()));
if (!button.getToolTip()
.isEmpty()) {
button.setToolTip(button.getToolTip()
.get(0));
button.getToolTip()
.add(TooltipHelper.holdShift(Palette.Blue, hasShiftDown()));
}
}
@ -192,47 +238,43 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
boolean enabled = indicator.state == State.ON;
List<String> tip = button.getToolTip();
tip.add(TextFormatting.BLUE + (enabled ? optionEnabled : optionDisabled));
tip
.addAll(TooltipHelper
.cutString(Lang.translate("gui.schematicannon.option." + tooltipKey + ".description"), GRAY,
GRAY));
tip.addAll(TooltipHelper.cutString(Lang.translate("gui.schematicannon.option." + tooltipKey + ".description"),
GRAY, GRAY));
}
@Override
protected void renderWindow(int mouseX, int mouseY, float partialTicks) {
AllGuiTextures.PLAYER_INVENTORY.draw(this, guiLeft - 10, guiTop + 145);
AllGuiTextures.SCHEMATICANNON_BG.draw(this, guiLeft + 20, guiTop);
BG_TOP.draw(this, guiLeft + 20, guiTop);
BG_BOTTOM.draw(this, guiLeft + 20, guiTop + BG_TOP.height);
SchematicannonTileEntity te = container.getTileEntity();
renderPrintingProgress(te.schematicProgress);
renderFuelBar(te.fuelLevel);
renderChecklistPrinterProgress(te.bookPrintingProgress);
if (!te.inventory.getStackInSlot(0).isEmpty())
if (!te.inventory.getStackInSlot(0)
.isEmpty())
renderBlueprintHighlight();
GuiGameElement.of(renderedItem)
.at(guiLeft + 240, guiTop + 120)
.scale(5)
.render();
.at(guiLeft + 230, guiTop + 110)
.scale(5)
.render();
font.drawString(title, guiLeft + 80, guiTop + 10, AllGuiTextures.FONT_COLOR);
font.drawStringWithShadow(title, guiLeft + 80, guiTop + 3, 0xfefefe);
String msg = Lang.translate("schematicannon.status." + te.statusMsg);
int stringWidth = font.getStringWidth(msg);
if (te.missingItem != null) {
stringWidth += 15;
itemRenderer.renderItemIntoGUI(te.missingItem, guiLeft + 145, guiTop + 25);
itemRenderer.renderItemIntoGUI(te.missingItem, guiLeft + 150, guiTop + 46);
}
font.drawStringWithShadow(msg, guiLeft + 20 + 96 - stringWidth / 2, guiTop + 30, 0xCCDDFF);
font.drawString(settingsTitle, guiLeft + 20 + 13, guiTop + 84, AllGuiTextures.FONT_COLOR);
font
.drawString(playerInventory.getDisplayName().getFormattedText(), guiLeft - 10 + 7, guiTop + 145 + 6,
0x666666);
font.drawStringWithShadow(msg, guiLeft + 20 + 102 - stringWidth / 2, guiTop + 50, 0xCCDDFF);
font.drawString(playerInventory.getDisplayName()
.getFormattedText(), guiLeft - 10 + 7, guiTop + 145 + 6, 0x666666);
// to see or debug the bounds of the extra area uncomment the following lines
// Rectangle2d r = extraAreas.get(0);
@ -241,92 +283,128 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
}
protected void renderBlueprintHighlight() {
AllGuiTextures.SCHEMATICANNON_HIGHLIGHT.draw(this, guiLeft + 20 + 8, guiTop + 31);
AllGuiTextures.SCHEMATICANNON_HIGHLIGHT.draw(this, guiLeft + 20 + 10, guiTop + 60);
}
protected void renderPrintingProgress(float progress) {
progress = Math.min(progress, 1);
AllGuiTextures sprite = AllGuiTextures.SCHEMATICANNON_PROGRESS;
minecraft.getTextureManager().bindTexture(sprite.location);
blit(guiLeft + 20 + 39, guiTop + 36, sprite.startX, sprite.startY, (int) (sprite.width * progress),
sprite.height);
minecraft.getTextureManager()
.bindTexture(sprite.location);
blit(guiLeft + 20 + 44, guiTop + 64, sprite.startX, sprite.startY, (int) (sprite.width * progress),
sprite.height);
}
protected void renderChecklistPrinterProgress(float progress) {
AllGuiTextures sprite = AllGuiTextures.SCHEMATICANNON_PROGRESS_2;
minecraft.getTextureManager().bindTexture(sprite.location);
blit(guiLeft + 20 + 222, guiTop + 42, sprite.startX, sprite.startY, sprite.width,
(int) (sprite.height * progress));
AllGuiTextures sprite = AllGuiTextures.SCHEMATICANNON_CHECKLIST_PROGRESS;
minecraft.getTextureManager()
.bindTexture(sprite.location);
blit(guiLeft + 20 + 154, guiTop + 20, sprite.startX, sprite.startY, (int) (sprite.width * progress),
sprite.height);
}
protected void renderFuelBar(float amount) {
AllGuiTextures sprite = AllGuiTextures.SCHEMATICANNON_FUEL;
if (container.getTileEntity().hasCreativeCrate) {
AllGuiTextures.SCHEMATICANNON_FUEL_CREATIVE.draw(this, guiLeft + 20 + 73, guiTop + 135);
AllGuiTextures.SCHEMATICANNON_FUEL_CREATIVE.draw(this, guiLeft + 20 + 36, guiTop + 19);
return;
}
minecraft.getTextureManager().bindTexture(sprite.location);
blit(guiLeft + 20 + 73, guiTop + 135, sprite.startX, sprite.startY, (int) (sprite.width * amount),
sprite.height);
minecraft.getTextureManager()
.bindTexture(sprite.location);
blit(guiLeft + 20 + 36, guiTop + 19, sprite.startX, sprite.startY, (int) (sprite.width * amount),
sprite.height);
}
@Override
protected void renderWindowForeground(int mouseX, int mouseY, float partialTicks) {
int fuelX = guiLeft + 20 + 73, fuelY = guiTop + 135;
SchematicannonTileEntity te = container.getTileEntity();
int fuelX = guiLeft + 20 + 36, fuelY = guiTop + 19;
if (mouseX >= fuelX && mouseY >= fuelY && mouseX <= fuelX + AllGuiTextures.SCHEMATICANNON_FUEL.width
&& mouseY <= fuelY + AllGuiTextures.SCHEMATICANNON_FUEL.height) {
container.getTileEntity();
double fuelUsageRate = te.getFuelUsageRate();
int shotsLeft = (int) (te.fuelLevel / fuelUsageRate);
int shotsLeftWithItems = (int) (shotsLeft
+ te.inventory.getStackInSlot(4).getCount() * (te.getFuelAddedByGunPowder() / fuelUsageRate));
List<String> tooltip = new ArrayList<>();
float f = te.hasCreativeCrate ? 100 : te.fuelLevel * 100;
tooltip.add(Lang.translate(_gunpowderLevel, "" + (int) f));
if (!te.hasCreativeCrate)
tooltip.add(GRAY + Lang.translate(_shotsRemaining, "" + TextFormatting.BLUE + shotsLeft));
if (shotsLeftWithItems != shotsLeft)
tooltip
.add(GRAY + Lang
.translate(_shotsRemainingWithBackup, "" + TextFormatting.BLUE + shotsLeftWithItems));
&& mouseY <= fuelY + AllGuiTextures.SCHEMATICANNON_FUEL.height) {
List<String> tooltip = getFuelLevelTooltip(te);
renderTooltip(tooltip, mouseX, mouseY);
}
if (hoveredSlot != null && !hoveredSlot.getHasStack()) {
if (hoveredSlot.getSlotIndex() == 0)
renderTooltip(
TooltipHelper.cutString(Lang.translate(_slotSchematic), TextFormatting.GRAY, TextFormatting.BLUE),
mouseX, mouseY);
if (hoveredSlot.getSlotIndex() == 2)
renderTooltip(
TooltipHelper.cutString(Lang.translate(_slotListPrinter), TextFormatting.GRAY, TextFormatting.BLUE),
mouseX, mouseY);
if (hoveredSlot.getSlotIndex() == 4)
renderTooltip(
TooltipHelper.cutString(Lang.translate(_slotGunpowder), TextFormatting.GRAY, TextFormatting.BLUE),
mouseX, mouseY);
}
if (te.missingItem != null) {
int missingBlockX = guiLeft + 145, missingBlockY = guiTop + 25;
int missingBlockX = guiLeft + 150, missingBlockY = guiTop + 46;
if (mouseX >= missingBlockX && mouseY >= missingBlockY && mouseX <= missingBlockX + 16
&& mouseY <= missingBlockY + 16) {
&& mouseY <= missingBlockY + 16) {
renderTooltip(te.missingItem, mouseX, mouseY);
}
}
int paperX = guiLeft + 20 + 202, paperY = guiTop + 20;
if (mouseX >= paperX && mouseY >= paperY && mouseX <= paperX + 16 && mouseY <= paperY + 16) {
int paperX = guiLeft + 132, paperY = guiTop + 19;
if (mouseX >= paperX && mouseY >= paperY && mouseX <= paperX + 16 && mouseY <= paperY + 16)
renderTooltip(listPrinter, mouseX, mouseY);
}
super.renderWindowForeground(mouseX, mouseY, partialTicks);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
protected List<String> getFuelLevelTooltip(SchematicannonTileEntity te) {
double fuelUsageRate = te.getFuelUsageRate();
int shotsLeft = (int) (te.fuelLevel / fuelUsageRate);
int shotsLeftWithItems = (int) (shotsLeft + te.inventory.getStackInSlot(4)
.getCount() * (te.getFuelAddedByGunPowder() / fuelUsageRate));
List<String> tooltip = new ArrayList<>();
for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) {
if (!replaceLevelButtons.get(replaceMode).isHovered())
continue;
if (container.getTileEntity().replaceMode == replaceMode)
continue;
sendOptionUpdate(Option.values()[replaceMode], true);
if (te.hasCreativeCrate) {
tooltip.add(Lang.translate(_gunpowderLevel, "" + 100));
tooltip.add(TextFormatting.DARK_PURPLE + "(" + new TranslationTextComponent(AllBlocks.CREATIVE_CRATE.get()
.getTranslationKey()).getFormattedText() + ")");
return tooltip;
}
if (skipMissingButton.isHovered())
sendOptionUpdate(Option.SKIP_MISSING, !container.getTileEntity().skipMissing);
if (skipTilesButton.isHovered())
sendOptionUpdate(Option.SKIP_TILES, !container.getTileEntity().replaceTileEntities);
float f = te.fuelLevel * 100;
tooltip.add(Lang.translate(_gunpowderLevel, "" + (int) f));
tooltip.add(GRAY + Lang.translate(_shotsRemaining, "" + TextFormatting.BLUE + shotsLeft));
if (shotsLeftWithItems != shotsLeft)
tooltip
.add(GRAY + Lang.translate(_shotsRemainingWithBackup, "" + TextFormatting.BLUE + shotsLeftWithItems));
return tooltip;
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (showSettingsButton.isHovered()) {
showSettingsIndicator.state = placementSettingsHidden() ? State.GREEN : State.OFF;
initPlacementSettings();
}
if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen();
return true;
}
if (!placementSettingsHidden()) {
for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) {
if (!replaceLevelButtons.get(replaceMode)
.isHovered())
continue;
if (container.getTileEntity().replaceMode == replaceMode)
continue;
sendOptionUpdate(Option.values()[replaceMode], true);
}
if (skipMissingButton.isHovered())
sendOptionUpdate(Option.SKIP_MISSING, !container.getTileEntity().skipMissing);
if (skipTilesButton.isHovered())
sendOptionUpdate(Option.SKIP_TILES, !container.getTileEntity().replaceTileEntities);
}
if (playButton.isHovered() && playButton.active)
sendOptionUpdate(Option.PLAY, true);
@ -344,8 +422,8 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
}
protected void sendOptionUpdate(Option option, boolean set) {
AllPackets.channel
.sendToServer(ConfigureSchematicannonPacket.setOption(container.getTileEntity().getPos(), option, set));
AllPackets.channel.sendToServer(ConfigureSchematicannonPacket.setOption(container.getTileEntity()
.getPos(), option, set));
}
}

View file

@ -3,6 +3,7 @@ package com.simibubi.create.content.schematics.client;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
@ -11,9 +12,12 @@ import org.apache.commons.io.IOUtils;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllKeys;
import com.simibubi.create.AllSpecialTextures;
import com.simibubi.create.Create;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.schematics.ClientSchematicLoader;
import com.simibubi.create.content.schematics.packet.InstantSchematicPacket;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.TextInputPromptScreen;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.FilesHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.RaycastHelper;
@ -98,19 +102,12 @@ public class SchematicAndQuillHandler {
ClientPlayerEntity player = Minecraft.getInstance().player;
if (player.isSneaking()) {
firstPos = null;
secondPos = null;
Lang.sendStatus(player, "schematicAndQuill.abort");
discard();
return;
}
if (secondPos != null) {
TextInputPromptScreen guiScreenIn = new TextInputPromptScreen(this::saveSchematic, s -> {
});
guiScreenIn.setTitle(Lang.translate("schematicAndQuill.prompt"));
guiScreenIn.setButtonTextConfirm(Lang.translate("action.saveToFile"));
guiScreenIn.setButtonTextAbort(Lang.translate("action.discard"));
ScreenOpener.open(guiScreenIn);
ScreenOpener.open(new SchematicPromptScreen());
return;
}
@ -128,6 +125,13 @@ public class SchematicAndQuillHandler {
firstPos = selectedPos;
Lang.sendStatus(player, "schematicAndQuill.firstPos");
}
public void discard() {
ClientPlayerEntity player = Minecraft.getInstance().player;
firstPos = null;
secondPos = null;
Lang.sendStatus(player, "schematicAndQuill.abort");
}
public void tick() {
if (!isActive())
@ -200,11 +204,13 @@ public class SchematicAndQuillHandler {
&& Minecraft.getInstance().currentScreen == null;
}
public void saveSchematic(String string) {
public void saveSchematic(String string, boolean convertImmediately) {
Template t = new Template();
MutableBoundingBox bb = new MutableBoundingBox(firstPos, secondPos);
t.takeBlocksFromWorld(Minecraft.getInstance().world, new BlockPos(bb.minX, bb.minY, bb.minZ),
new BlockPos(bb.getXSize(), bb.getYSize(), bb.getZSize()), true, Blocks.AIR);
BlockPos origin = new BlockPos(bb.minX, bb.minY, bb.minZ);
BlockPos bounds = new BlockPos(bb.getXSize(), bb.getYSize(), bb.getZSize());
t.takeBlocksFromWorld(Minecraft.getInstance().world, origin, bounds, true, Blocks.AIR);
if (string.isEmpty())
string = Lang.translate("schematicAndQuill.fallbackName");
@ -214,9 +220,10 @@ public class SchematicAndQuillHandler {
String filename = FilesHelper.findFirstValidFilename(string, folderPath, "nbt");
String filepath = folderPath + "/" + filename;
Path path = Paths.get(filepath);
OutputStream outputStream = null;
try {
outputStream = Files.newOutputStream(Paths.get(filepath), StandardOpenOption.CREATE);
outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE);
CompoundNBT nbttagcompound = t.writeToNBT(new CompoundNBT());
CompressedStreamTools.writeCompressed(nbttagcompound, outputStream);
} catch (IOException e) {
@ -228,6 +235,23 @@ public class SchematicAndQuillHandler {
firstPos = null;
secondPos = null;
Lang.sendStatus(Minecraft.getInstance().player, "schematicAndQuill.saved", filepath);
if (!convertImmediately)
return;
if (!Files.exists(path)) {
Create.logger.fatal("Missing Schematic file: " + path.toString());
return;
}
try {
if (!ClientSchematicLoader.validateSizeLimitation(Files.size(path)))
return;
AllPackets.channel.sendToServer(new InstantSchematicPacket(filename, origin, bounds));
} catch (IOException e) {
Create.logger.fatal("Error finding Schematic file: " + path.toString());
e.printStackTrace();
return;
}
}
private Outliner outliner() {

View file

@ -8,11 +8,14 @@ import com.simibubi.create.AllItems;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.widgets.IconButton;
import com.simibubi.create.foundation.gui.widgets.Label;
import com.simibubi.create.foundation.gui.widgets.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTUtil;
@ -26,12 +29,12 @@ public class SchematicEditScreen extends AbstractSimiScreen {
private TextFieldWidget xInput;
private TextFieldWidget yInput;
private TextFieldWidget zInput;
private IconButton confirmButton;
private final List<String> rotationOptions =
Lang.translatedOptions("schematic.rotation", "none", "cw90", "cw180", "cw270");
private final List<String> mirrorOptions =
Lang.translatedOptions("schematic.mirror", "none", "leftRight", "frontBack");
private final String positionLabel = Lang.translate("schematic.position");
private final String rotationLabel = Lang.translate("schematic.rotation");
private final String mirrorLabel = Lang.translate("schematic.mirror");
@ -41,16 +44,18 @@ public class SchematicEditScreen extends AbstractSimiScreen {
@Override
protected void init() {
setWindowSize(AllGuiTextures.SCHEMATIC.width + 50, AllGuiTextures.SCHEMATIC.height);
AllGuiTextures background = AllGuiTextures.SCHEMATIC;
setWindowSize(background.width + 50, background.height);
int x = guiLeft;
int y = guiTop;
handler = CreateClient.schematicHandler;
xInput = new TextFieldWidget(font, x + 75, y + 32, 32, 10, "");
yInput = new TextFieldWidget(font, x + 115, y + 32, 32, 10, "");
zInput = new TextFieldWidget(font, x + 155, y + 32, 32, 10, "");
xInput = new TextFieldWidget(font, x + 50, y + 26, 34, 10, "");
yInput = new TextFieldWidget(font, x + 90, y + 26, 34, 10, "");
zInput = new TextFieldWidget(font, x + 130, y + 26, 34, 10, "");
BlockPos anchor = handler.getTransformation().getAnchor();
BlockPos anchor = handler.getTransformation()
.getAnchor();
if (handler.isDeployed()) {
xInput.setText("" + anchor.getX());
yInput.setText("" + anchor.getY());
@ -80,18 +85,29 @@ public class SchematicEditScreen extends AbstractSimiScreen {
});
}
PlacementSettings settings = handler.getTransformation().toSettings();
Label labelR = new Label(x + 99, y + 52, "").withShadow();
rotationArea = new SelectionScrollInput(x + 96, y + 49, 94, 14).forOptions(rotationOptions).titled("Rotation")
.setState(settings.getRotation().ordinal()).writingTo(labelR);
PlacementSettings settings = handler.getTransformation()
.toSettings();
Label labelR = new Label(x + 50, y + 48, "").withShadow();
rotationArea = new SelectionScrollInput(x + 45, y + 43, 118, 18).forOptions(rotationOptions)
.titled(rotationLabel)
.setState(settings.getRotation()
.ordinal())
.writingTo(labelR);
Label labelM = new Label(x + 99, y + 72, "").withShadow();
mirrorArea = new SelectionScrollInput(x + 96, y + 69, 94, 14).forOptions(mirrorOptions).titled("Mirror")
.setState(settings.getMirror().ordinal()).writingTo(labelM);
Label labelM = new Label(x + 50, y + 70, "").withShadow();
mirrorArea = new SelectionScrollInput(x + 45, y + 65, 118, 18).forOptions(mirrorOptions)
.titled(mirrorLabel)
.setState(settings.getMirror()
.ordinal())
.writingTo(labelM);
Collections.addAll(widgets, xInput, yInput, zInput);
Collections.addAll(widgets, labelR, labelM, rotationArea, mirrorArea);
confirmButton =
new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
super.init();
}
@ -132,14 +148,10 @@ public class SchematicEditScreen extends AbstractSimiScreen {
AllGuiTextures.SCHEMATIC.draw(this, x, y);
font.drawStringWithShadow(handler.getCurrentSchematicName(),
x + 103 - font.getStringWidth(handler.getCurrentSchematicName()) / 2, y + 10, 0xDDEEFF);
font.drawString(positionLabel, x + 10, y + 32, AllGuiTextures.FONT_COLOR);
font.drawString(rotationLabel, x + 10, y + 52, AllGuiTextures.FONT_COLOR);
font.drawString(mirrorLabel, x + 10, y + 72, AllGuiTextures.FONT_COLOR);
x + 93 - font.getStringWidth(handler.getCurrentSchematicName()) / 2, y + 3, 0xffffff);
RenderSystem.pushMatrix();
RenderSystem.translated(guiLeft + 220, guiTop + 20, 0);
RenderSystem.translated(guiLeft + 200, guiTop + 80, 0);
RenderSystem.scaled(3, 3, 3);
itemRenderer.renderItemIntoGUI(new ItemStack(AllItems.SCHEMATIC.get()), 0, 0);
RenderSystem.popMatrix();
@ -151,7 +163,7 @@ public class SchematicEditScreen extends AbstractSimiScreen {
BlockPos newLocation = null;
try {
newLocation = new BlockPos(Integer.parseInt(xInput.getText()), Integer.parseInt(yInput.getText()),
Integer.parseInt(zInput.getText()));
Integer.parseInt(zInput.getText()));
} catch (NumberFormatException e) {
validCoords = false;
}
@ -159,19 +171,31 @@ public class SchematicEditScreen extends AbstractSimiScreen {
PlacementSettings settings = new PlacementSettings();
settings.setRotation(Rotation.values()[rotationArea.getState()]);
settings.setMirror(Mirror.values()[mirrorArea.getState()]);
if (validCoords && newLocation != null) {
ItemStack item = handler.getActiveSchematicItem();
if (item != null) {
item.getTag().putBoolean("Deployed", true);
item.getTag().put("Anchor", NBTUtil.writeBlockPos(newLocation));
item.getTag()
.putBoolean("Deployed", true);
item.getTag()
.put("Anchor", NBTUtil.writeBlockPos(newLocation));
}
handler.getTransformation().init(newLocation, settings, handler.getBounds());
handler.getTransformation()
.init(newLocation, settings, handler.getBounds());
handler.markDirty();
handler.deploy();
}
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen();
return true;
}
return super.mouseClicked(x, y, button);
}
}

View file

@ -11,10 +11,10 @@ public class SchematicHotbarSlotOverlay extends AbstractGui {
public void renderOn(int slot) {
MainWindow mainWindow = Minecraft.getInstance().getWindow();
int x = mainWindow.getScaledWidth() / 2 - 92;
int y = mainWindow.getScaledHeight() - 23;
int x = mainWindow.getScaledWidth() / 2 - 88;
int y = mainWindow.getScaledHeight() - 19;
RenderSystem.enableAlphaTest();
AllGuiTextures.BLUEPRINT_SLOT.draw(this, x + 20 * slot, y);
AllGuiTextures.SCHEMATIC_SLOT.draw(this, x + 20 * slot, y);
RenderSystem.disableAlphaTest();
}

View file

@ -0,0 +1,103 @@
package com.simibubi.create.content.schematics.client;
import org.lwjgl.glfw.GLFW;
import com.simibubi.create.AllItems;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.widgets.IconButton;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.widget.TextFieldWidget;
public class SchematicPromptScreen extends AbstractSimiScreen {
private final String title = Lang.translate("schematicAndQuill.title");
private final String convertLabel = Lang.translate("schematicAndQuill.convert");
private final String abortLabel = Lang.translate("action.discard");
private final String confirmLabel = Lang.translate("action.saveToFile");
private TextFieldWidget nameField;
private IconButton confirm;
private IconButton abort;
private IconButton convert;
@Override
public void init() {
super.init();
AllGuiTextures background = AllGuiTextures.SCHEMATIC_PROMPT;
setWindowSize(background.width, background.height + 30);
nameField = new TextFieldWidget(font, guiLeft + 49, guiTop + 26, 131, 10, "");
nameField.setTextColor(-1);
nameField.setDisabledTextColour(-1);
nameField.setEnableBackgroundDrawing(false);
nameField.setMaxStringLength(35);
nameField.changeFocus(true);
abort = new IconButton(guiLeft + 7, guiTop + 53, AllIcons.I_TRASH);
abort.setToolTip(abortLabel);
widgets.add(abort);
confirm = new IconButton(guiLeft + 158, guiTop + 53, AllIcons.I_CONFIRM);
confirm.setToolTip(confirmLabel);
widgets.add(confirm);
convert = new IconButton(guiLeft + 180, guiTop + 53, AllIcons.I_SCHEMATIC);
convert.setToolTip(convertLabel);
widgets.add(convert);
widgets.add(confirm);
widgets.add(convert);
widgets.add(abort);
widgets.add(nameField);
}
@Override
public void renderWindow(int mouseX, int mouseY, float partialTicks) {
AllGuiTextures.SCHEMATIC_PROMPT.draw(this, guiLeft, guiTop);
font.drawStringWithShadow(title, guiLeft + (sWidth / 2) - (font.getStringWidth(title) / 2), guiTop + 3,
0xffffff);
itemRenderer.renderItemIntoGUI(AllItems.SCHEMATIC.asStack(), guiLeft + 22, guiTop + 23);
}
@Override
public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) {
if (keyCode == GLFW.GLFW_KEY_ENTER) {
confirm(false);
return true;
}
if (keyCode == 256 && this.shouldCloseOnEsc()) {
this.onClose();
return true;
}
return nameField.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirm.isHovered()) {
confirm(false);
return true;
}
if (abort.isHovered()) {
CreateClient.schematicAndQuillHandler.discard();
Minecraft.getInstance().player.closeScreen();
return true;
}
if (convert.isHovered()) {
confirm(true);
return true;
}
return super.mouseClicked(x, y, button);
}
private void confirm(boolean convertImmediately) {
CreateClient.schematicAndQuillHandler.saveSchematic(nameField.getText(), convertImmediately);
Minecraft.getInstance().player.closeScreen();
}
}

View file

@ -0,0 +1,52 @@
package com.simibubi.create.content.schematics.packet;
import java.util.function.Supplier;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public class InstantSchematicPacket extends SimplePacketBase {
private String name;
private BlockPos origin;
private BlockPos bounds;
public InstantSchematicPacket(String name, BlockPos origin, BlockPos bounds) {
this.name = name;
this.origin = origin;
this.bounds = bounds;
}
public InstantSchematicPacket(PacketBuffer buffer) {
name = buffer.readString(32767);
origin = buffer.readBlockPos();
bounds = buffer.readBlockPos();
}
@Override
public void write(PacketBuffer buffer) {
buffer.writeString(name);
buffer.writeBlockPos(origin);
buffer.writeBlockPos(bounds);
}
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity player = context.get()
.getSender();
if (player == null)
return;
Create.schematicReceiver.handleInstantSchematic(player, name, player.world, origin, bounds);
});
context.get()
.setPacketHandled(true);
}
}

View file

@ -13,43 +13,47 @@ public enum AllGuiTextures {
// Inventories
PLAYER_INVENTORY("player_inventory.png", 176, 108),
WAND_SYMMETRY("wand_symmetry.png", 207, 58),
BLOCKZAPPER("zapper.png", 217, 70),
TERRAINZAPPER("zapper.png", 0, 70, 217, 105),
TERRAINZAPPER_INACTIVE_PARAM("zapper.png", 0, 175, 14, 14),
WAND_OF_SYMMETRY("curiosities.png", 188, 99),
BLOCKZAPPER("curiosities.png", 0, 99, 214, 97),
TERRAINZAPPER("curiosities_2.png", 0, 0, 234, 101),
TERRAINZAPPER_INACTIVE_PARAM("curiosities_2.png", 238, 0, 18, 18),
SCHEMATIC_TABLE("schematic_table.png", 207, 89),
SCHEMATIC_TABLE_PROGRESS("schematic_table.png", 209, 0, 24, 17),
SCHEMATIC("schematic.png", 207, 95),
SCHEMATIC("schematics.png", 192, 121),
SCHEMATIC_SLOT("widgets.png", 54, 0, 16, 16),
SCHEMATIC_PROMPT("schematics_2.png", 213, 77),
HUD_BACKGROUND("overlay.png", 0, 0, 16, 16),
SCHEMATICANNON_BG("schematicannon.png", 247, 161),
SCHEMATICANNON_BG_FUEL("schematicannon.png", 247, 161),
SCHEMATICANNON_PROGRESS("schematicannon.png", 0, 161, 121, 16),
SCHEMATICANNON_PROGRESS_2("schematicannon.png", 122, 161, 16, 15),
SCHEMATICANNON_HIGHLIGHT("schematicannon.png", 0, 182, 28, 28),
SCHEMATICANNON_FUEL("schematicannon.png", 0, 215, 82, 4),
SCHEMATICANNON_FUEL_CREATIVE("schematicannon.png", 0, 219, 82, 4),
SCHEMATIC_TABLE("schematics.png", 0, 121, 214, 83),
SCHEMATIC_TABLE_PROGRESS("schematics.png", 0, 204, 84, 16),
FLEXCRATE("flex_crate_and_stockpile_switch.png", 125, 129),
FLEXCRATE_DOUBLE("double_flexcrate.png", 197, 129),
FLEXCRATE_LOCKED_SLOT("flex_crate_and_stockpile_switch.png", 138, 0, 18, 18),
SCHEMATICANNON_TOP("schematics_2.png", 0, 77, 213, 42),
SCHEMATICANNON_BOTTOM("schematics_2.png", 0, 119, 213, 99),
SCHEMATICANNON_PROGRESS("schematics_2.png", 76, 239, 114, 16),
SCHEMATICANNON_CHECKLIST_PROGRESS("schematics_2.png", 191, 240, 16, 14),
SCHEMATICANNON_HIGHLIGHT("schematics_2.png", 1, 229, 26, 26),
SCHEMATICANNON_FUEL("schematics_2.png", 28, 222, 47, 16),
SCHEMATICANNON_FUEL_CREATIVE("schematics_2.png", 28, 239, 47, 16),
STOCKSWITCH("flex_crate_and_stockpile_switch.png", 0, 129, 205, 93),
STOCKSWITCH_INTERVAL("flex_crate_and_stockpile_switch.png", 0, 222, 198, 17),
STOCKSWITCH_INTERVAL_END("flex_crate_and_stockpile_switch.png", 0, 239, 198, 17),
STOCKSWITCH_CURSOR_ON("flex_crate_and_stockpile_switch.png", 218, 129, 8, 21),
STOCKSWITCH_CURSOR_OFF("flex_crate_and_stockpile_switch.png", 226, 129, 8, 21),
STOCKSWITCH_BOUND_LEFT("flex_crate_and_stockpile_switch.png", 234, 129, 7, 21),
STOCKSWITCH_BOUND_RIGHT("flex_crate_and_stockpile_switch.png", 241, 129, 7, 21),
STOCKSWITCH("logistics.png", 182, 93),
STOCKSWITCH_ARROW_UP("logistics.png", 191, 0, 7, 24),
STOCKSWITCH_ARROW_DOWN("logistics.png", 198, 0, 7, 24),
STOCKSWITCH_CURSOR("logistics.png", 206, 0, 7, 16),
STOCKSWITCH_INTERVAL("logistics.png", 0, 93, 100, 18),
STOCKSWITCH_UNPOWERED_LANE("logistics.png", 36, 18, 102, 18),
STOCKSWITCH_POWERED_LANE("logistics.png", 36, 40, 102, 18),
FILTER("filter.png", 200, 100),
ATTRIBUTE_FILTER("filter.png", 0, 100, 200, 86),
ADJUSTABLE_CRATE("logistics_2.png", 124, 127),
ADJUSTABLE_DOUBLE_CRATE("logistics_2.png", 0, 127, 196, 127),
ADJUSTABLE_CRATE_LOCKED_SLOT("logistics_2.png", 125, 109, 18, 18),
SEQUENCER("sequencer.png", 156, 128),
SEQUENCER_INSTRUCTION("sequencer.png", 14, 47, 131, 18),
SEQUENCER_WAIT("sequencer.png", 14, 65, 131, 18),
SEQUENCER_END("sequencer.png", 14, 83, 131, 18),
SEQUENCER_EMPTY("sequencer.png", 14, 101, 131, 18),
FILTER("filters.png", 214, 97),
ATTRIBUTE_FILTER("filters.png", 0, 97, 241, 83),
SEQUENCER("sequencer.png", 173, 159),
SEQUENCER_INSTRUCTION("sequencer.png", 0, 14, 162, 22),
SEQUENCER_WAIT("sequencer.png", 0, 58, 162, 22),
SEQUENCER_END("sequencer.png", 0, 80, 162, 22),
SEQUENCER_EMPTY("sequencer.png", 0, 102, 162, 22),
// JEI
JEI_SLOT("jei/widgets.png", 18, 18),
@ -64,19 +68,14 @@ public enum AllGuiTextures {
BLOCKZAPPER_UPGRADE_RECIPE("jei/widgets.png", 0, 75, 144, 66),
// Widgets
PALETTE_BUTTON("palette_picker.png", 0, 236, 20, 20),
TEXT_INPUT("widgets.png", 0, 28, 194, 47),
BUTTON("widgets.png", 18, 18),
BUTTON_HOVER("widgets.png", 18, 0, 18, 18),
BUTTON_DOWN("widgets.png", 36, 0, 18, 18),
INDICATOR("widgets.png", 0, 18, 18, 5),
INDICATOR_WHITE("widgets.png", 18, 18, 18, 5),
INDICATOR_GREEN("widgets.png", 0, 23, 18, 5),
INDICATOR_YELLOW("widgets.png", 18, 23, 18, 5),
INDICATOR_RED("widgets.png", 36, 23, 18, 5),
GRAY("background.png", 0, 0, 16, 16),
BLUEPRINT_SLOT("widgets.png", 90, 0, 24, 24),
INDICATOR("widgets.png", 0, 18, 18, 6),
INDICATOR_WHITE("widgets.png", 18, 18, 18, 6),
INDICATOR_GREEN("widgets.png", 36, 18, 18, 6),
INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6),
INDICATOR_RED("widgets.png", 72, 18, 18, 6),
;

View file

@ -92,10 +92,14 @@ public class AllIcons {
I_ARM_ROUND_ROBIN = next(),
I_ARM_FORCED_ROUND_ROBIN = next(),
I_ARM_PREFER_FIRST = next(),
I_ADD_INVERTED_ATTRIBUTE = next(),
I_FLIP = next(),
I_PLAY = newRow(),
I_PAUSE = next(),
I_STOP = next(),
I_PLACEMENT_SETTINGS = next(),
I_PATTERN_SOLID = newRow(),
I_PATTERN_CHECKERED = next(),
@ -105,7 +109,9 @@ public class AllIcons {
I_PATTERN_CHANCE_50 = newRow(),
I_PATTERN_CHANCE_75 = next(),
I_FOLLOW_DIAGONAL = next(),
I_FOLLOW_MATERIAL = next();
I_FOLLOW_MATERIAL = next(),
I_SCHEMATIC = newRow();
public AllIcons(int x, int y) {
iconX = x * 16;

View file

@ -1,106 +0,0 @@
package com.simibubi.create.foundation.gui;
import java.util.function.Consumer;
import org.lwjgl.glfw.GLFW;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.gui.widget.button.Button;
public class TextInputPromptScreen extends AbstractSimiScreen {
private final String defaultConfirm = Lang.translate("action.confirm");
private final String defaultAbort = Lang.translate("action.abort");
private Consumer<String> callback;
private Consumer<String> abortCallback;
private TextFieldWidget nameField;
private Button confirm;
private Button abort;
private String buttonTextConfirm;
private String buttonTextAbort;
private String title;
private boolean confirmed;
public TextInputPromptScreen(Consumer<String> callBack, Consumer<String> abortCallback) {
super();
this.callback = callBack;
this.abortCallback = abortCallback;
buttonTextConfirm = defaultConfirm;
buttonTextAbort = defaultAbort;
confirmed = false;
}
@Override
public void init() {
super.init();
setWindowSize(AllGuiTextures.TEXT_INPUT.width, AllGuiTextures.TEXT_INPUT.height + 30);
this.nameField = new TextFieldWidget(font, guiLeft + 33, guiTop + 26, 128, 8, "");
this.nameField.setTextColor(-1);
this.nameField.setDisabledTextColour(-1);
this.nameField.setEnableBackgroundDrawing(false);
this.nameField.setMaxStringLength(35);
this.nameField.changeFocus(true);
confirm = new Button(guiLeft - 5, guiTop + 50, 100, 20, buttonTextConfirm, button -> {
callback.accept(nameField.getText());
confirmed = true;
minecraft.displayGuiScreen(null);
});
abort = new Button(guiLeft + 100, guiTop + 50, 100, 20, buttonTextAbort, button -> {
minecraft.displayGuiScreen(null);
});
widgets.add(confirm);
widgets.add(abort);
widgets.add(nameField);
}
@Override
public void renderWindow(int mouseX, int mouseY, float partialTicks) {
AllGuiTextures.TEXT_INPUT.draw(this, guiLeft, guiTop);
font.drawString(title, guiLeft + (sWidth / 2) - (font.getStringWidth(title) / 2), guiTop + 11,
AllGuiTextures.FONT_COLOR);
}
@Override
public void removed() {
if (!confirmed)
abortCallback.accept(nameField.getText());
super.removed();
}
public void setButtonTextConfirm(String buttonTextConfirm) {
this.buttonTextConfirm = buttonTextConfirm;
}
public void setButtonTextAbort(String buttonTextAbort) {
this.buttonTextAbort = buttonTextAbort;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) {
if (keyCode == GLFW.GLFW_KEY_ENTER) {
confirm.onPress();
return true;
}
if (keyCode == 256 && this.shouldCloseOnEsc()) {
this.onClose();
return true;
}
return nameField.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_);
}
}

View file

@ -63,7 +63,7 @@ public class ToolSelectionScreen extends Screen {
RenderSystem.pushMatrix();
RenderSystem.translatef(0, -yOffset, focused ? 100 : 0);
AllGuiTextures gray = AllGuiTextures.GRAY;
AllGuiTextures gray = AllGuiTextures.HUD_BACKGROUND;
RenderSystem.enableBlend();
RenderSystem.color4f(1, 1, 1, focused ? 7 / 8f : 1 / 2f);

View file

@ -45,6 +45,11 @@ public class ScrollInput extends AbstractSimiWidget {
this.onScroll = onScroll;
return this;
}
public ScrollInput removeCallback() {
this.onScroll = null;
return this;
}
public ScrollInput titled(String title) {
this.title = title;

View file

@ -23,6 +23,7 @@ import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket;
import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket;
import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket;
import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket;
import com.simibubi.create.content.schematics.packet.InstantSchematicPacket;
import com.simibubi.create.content.schematics.packet.SchematicPlacePacket;
import com.simibubi.create.content.schematics.packet.SchematicUploadPacket;
import com.simibubi.create.foundation.command.ConfigureConfigPacket;
@ -55,6 +56,7 @@ public enum AllPackets {
PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new),
MINECART_COUPLING_CREATION(MinecartCouplingCreationPacket.class, MinecartCouplingCreationPacket::new),
PERSISTANT_DATA_REQUEST(PersistantDataPacketRequest.class, PersistantDataPacketRequest::new),
INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new),
// Server to Client
SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new),

View file

@ -158,13 +158,10 @@
"create.gui.adjustable_crate.storageSpace": "Storage Space",
"create.gui.stockpile_switch.title": "Stockpile Switch",
"create.gui.stockpile_switch.lowerLimit": "Lower Threshold",
"create.gui.stockpile_switch.upperLimit": "Upper Threshold",
"create.gui.stockpile_switch.startAt": "Start Signal at",
"create.gui.stockpile_switch.startAbove": "Start Signal above",
"create.gui.stockpile_switch.stopAt": "Stop Signal at",
"create.gui.stockpile_switch.stopBelow": "Stop Signal below",
"create.gui.stockpile_switch.invert_signal": "Invert Signal",
"create.gui.stockpile_switch.move_to_lower_at": "Move to lower lane at %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "Move to upper lane at %1$s%%",
"create.gui.sequenced_gearshift.title": "Sequenced Gearshift",
"create.gui.sequenced_gearshift.instruction": "Instruction",
"create.gui.sequenced_gearshift.instruction.turn_angle": "Turn",
@ -185,7 +182,8 @@
"create.schematicAndQuill.secondPos": "Second position set.",
"create.schematicAndQuill.noTarget": "Hold [Ctrl] to select Air blocks.",
"create.schematicAndQuill.abort": "Removed selection.",
"create.schematicAndQuill.prompt": "Enter a name for the Schematic:",
"create.schematicAndQuill.title": "Schematic Name:",
"create.schematicAndQuill.convert": "Save and Deploy Immediately",
"create.schematicAndQuill.fallbackName": "My Schematic",
"create.schematicAndQuill.saved": "Saved as %1$s",
@ -234,9 +232,12 @@
"create.schematic.tool.flip.description.3": "",
"create.schematics.synchronizing": "Syncing...",
"create.schematics.uploadTooLarge": "Your schematic is too big.",
"create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.",
"create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:",
"create.gui.schematicTable.title": "Schematic Table",
"create.gui.schematicTable.refresh": "Refresh Files",
"create.gui.schematicTable.open_folder": "Open Folder",
"create.gui.schematicTable.title": "Schematic Table",
"create.gui.schematicTable.availableSchematics": "Available Schematics",
"create.gui.schematicTable.noSchematics": "No Schematics Saved",
@ -244,19 +245,23 @@
"create.gui.schematicTable.finished": "Upload Finished!",
"create.gui.schematicannon.title": "Schematicannon",
"create.gui.schematicannon.settingsTitle": "Placement Settings",
"create.gui.schematicannon.listPrinter": "Material List Printer",
"create.gui.schematicannon.listPrinter": "Checklist Printer",
"create.gui.schematicannon.gunpowderLevel": "Gunpowder at %1$s%%",
"create.gui.schematicannon.shotsRemaining": "Shots left: %1$s",
"create.gui.schematicannon.shotsRemainingWithBackup": "With backup: %1$s",
"create.gui.schematicannon.optionEnabled": "Currently Enabled",
"create.gui.schematicannon.optionDisabled": "Currently Disabled",
"create.gui.schematicannon.showOptions": "Show Printer Settings",
"create.gui.schematicannon.option.dontReplaceSolid": "Don't Replace Solid Blocks",
"create.gui.schematicannon.option.replaceWithSolid": "Replace Solid with Solid",
"create.gui.schematicannon.option.replaceWithAny": "Replace Solid with Any",
"create.gui.schematicannon.option.replaceWithEmpty": "Replace Solid with Empty",
"create.gui.schematicannon.option.skipMissing": "Skip missing Blocks",
"create.gui.schematicannon.option.skipTileEntities": "Protect Tile Entities",
"create.gui.schematicannon.slot.gunpowder": "Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "If the cannon cannot find a required Block for placement, it will continue at the next Location.",
"create.gui.schematicannon.option.skipTileEntities.description": "The cannon will avoid replacing data holding blocks such as Chests.",
@ -293,23 +298,42 @@
"create.gui.filter.ignore_data.description": "Items match regardless of their attributes.",
"create.item_attributes.placeable": "is placeable",
"create.item_attributes.placeable.inverted": "is not placeable",
"create.item_attributes.consumable": "can be eaten",
"create.item_attributes.consumable.inverted": "cannot be eaten",
"create.item_attributes.smeltable": "can be Smelted",
"create.item_attributes.smeltable.inverted": "cannot be Smelted",
"create.item_attributes.washable": "can be Washed",
"create.item_attributes.washable.inverted": "cannot be Washed",
"create.item_attributes.smokable": "can be Smoked",
"create.item_attributes.smokable.inverted": "cannot be Smoked",
"create.item_attributes.crushable": "can be Crushed",
"create.item_attributes.crushable.inverted": "cannot be Crushed",
"create.item_attributes.blastable": "is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace",
"create.item_attributes.enchanted": "is enchanted",
"create.item_attributes.enchanted.inverted": "is unenchanted",
"create.item_attributes.damaged": "is damaged",
"create.item_attributes.damaged.inverted": "is not damaged",
"create.item_attributes.badly_damaged": "is heavily damaged",
"create.item_attributes.badly_damaged.inverted": "is not heavily damaged",
"create.item_attributes.not_stackable": "cannot stack",
"create.item_attributes.not_stackable.inverted": "can be stacked",
"create.item_attributes.equipable": "can be equipped",
"create.item_attributes.equipable.inverted": "cannot be equipped",
"create.item_attributes.furnace_fuel": "is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "is not furnace fuel",
"create.item_attributes.in_tag": "is tagged %1$s",
"create.item_attributes.in_item_group": "belongs to %1$s",
"create.item_attributes.in_tag.inverted": "is not tagged %1$s",
"create.item_attributes.in_item_group": "is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "is not in group '%1$s'",
"create.item_attributes.added_by": "was added by %1$s",
"create.item_attributes.added_by.inverted": "was not added by %1$s",
"create.gui.attribute_filter.no_selected_attributes": "No attributes selected",
"create.gui.attribute_filter.selected_attributes": "Selected attributes:",
"create.gui.attribute_filter.add_attribute": "Add attribute to List",
"create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List",
"create.gui.attribute_filter.whitelist_disjunctive": "Whitelist (Any)",
"create.gui.attribute_filter.whitelist_disjunctive.description": "Items pass if they have any of the selected attributes.",
"create.gui.attribute_filter.whitelist_conjunctive": "Whitelist (All)",

View file

@ -1,144 +1,143 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"textures": {
"0": "block/white_stained_glass",
"1": "block/obsidian",
"2": "block/packed_ice"
},
"elements": [
{
"name": "Mirror",
"from": [ 4.0, 1.0, 7.500000007450581 ],
"to": [ 7.0, 12.0, 8.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] }
}
},
{
"name": "rod_left_bottom",
"from": [ 1.2000000029802322, 3.0, 7.0 ],
"to": [ 3.2000000029802322, 4.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_left_top",
"from": [ 1.2000000029802322, 12.0, 7.0 ],
"to": [ 3.2000000029802322, 13.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_left",
"from": [ 2.0, 4.0, 7.499999992549419 ],
"to": [ 3.0, 12.0, 8.49999999254942 ],
"shade": false,
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] },
"east": { "texture": "#2", "uv": [ 3.0, 0.0, 4.0, 8.0 ] },
"south": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] },
"west": { "texture": "#2", "uv": [ 5.0, 1.0, 6.0, 9.0 ] }
}
},
{
"name": "rod_right_bottom",
"from": [ 12.799999997019768, 3.0, 7.0 ],
"to": [ 14.799999997019768, 4.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_right",
"from": [ 13.0, 4.0, 7.499999992549419 ],
"to": [ 14.0, 12.0, 8.49999999254942 ],
"shade": false,
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 3.0, 2.0, 4.0, 10.0 ] },
"east": { "texture": "#2", "uv": [ 3.0, 3.0, 4.0, 11.0 ] },
"south": { "texture": "#2", "uv": [ 4.0, 3.0, 5.0, 11.0 ] },
"west": { "texture": "#2", "uv": [ 5.0, 0.0, 6.0, 8.0 ] }
}
},
{
"name": "rod_right_top",
"from": [ 12.799999997019768, 12.0, 7.0 ],
"to": [ 14.799999997019768, 13.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "CrossMirror",
"from": [ 7.499999992549419, 4.0, 9.50000000745058 ],
"to": [ 8.49999999254942, 15.0, 12.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] },
"west": { "texture": "#0", "uv": [ 9.0, 1.0, 12.0, 12.0 ] },
"up": { "texture": "#0", "uv": [ 3.0, 3.0, 4.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 5.0, 9.0, 6.0, 12.0 ] }
}
},
{
"name": "Mirror II",
"from": [ 9.0, 3.0, 7.500000007450581 ],
"to": [ 12.0, 14.0, 8.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] }
}
},
{
"name": "CrossMirror II",
"from": [ 7.499999992549419, 2.0, 3.5000000074505806 ],
"to": [ 8.49999999254942, 13.0, 6.500000007450581 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 14.0 ] },
"west": { "texture": "#0", "uv": [ 9.0, 2.0, 12.0, 13.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 11.0 ] }
}
}
]
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/symmetry_mirror",
"2": "create:block/brass_block"
},
"elements": [
{
"name": "Mirror",
"from": [4, 1, 7.5],
"to": [7, 12, 8.5],
"faces": {
"north": {"uv": [4, 1, 7, 12], "texture": "#0"},
"east": {"uv": [3, 1, 4, 12], "texture": "#0"},
"south": {"uv": [4, 1, 7, 12], "texture": "#0"},
"west": {"uv": [12, 1, 13, 12], "texture": "#0"},
"up": {"uv": [4, 1, 7, 2], "texture": "#0"},
"down": {"uv": [4, 14, 7, 15], "texture": "#0"}
}
},
{
"name": "rod_left_bottom",
"from": [1, 3, 7],
"to": [3, 4, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "texture": "#2"}
}
},
{
"name": "rod_left_bottom",
"from": [13, 3, 7],
"to": [15, 4, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}
}
},
{
"name": "rod_left_top",
"from": [1, 12, 7],
"to": [3, 13, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "texture": "#2"}
}
},
{
"name": "rod_left_top",
"from": [13, 12, 7],
"to": [15, 13, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}
}
},
{
"name": "rod_left",
"from": [1, 4, 7.5],
"to": [3, 12, 8.5],
"shade": false,
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [3, 5, 1, 13], "texture": "#2"},
"east": {"uv": [8, 4, 9, 12], "texture": "#2"},
"south": {"uv": [1, 3, 3, 11], "texture": "#2"},
"west": {"uv": [1, 6, 2, 14], "texture": "#2"}
}
},
{
"name": "rod_left",
"from": [13, 4, 7.5],
"to": [15, 12, 8.5],
"shade": false,
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [1, 3, 3, 11], "texture": "#2"},
"east": {"uv": [1, 6, 2, 14], "texture": "#2"},
"south": {"uv": [3, 5, 1, 13], "texture": "#2"},
"west": {"uv": [8, 4, 9, 12], "texture": "#2"}
}
},
{
"name": "CrossMirror",
"from": [7.5, 4, 9.5],
"to": [8.5, 15, 12.5],
"faces": {
"north": {"uv": [4, 1, 5, 12], "texture": "#0"},
"east": {"uv": [3, 1, 6, 12], "texture": "#0"},
"south": {"uv": [4, 1, 5, 12], "texture": "#0"},
"west": {"uv": [9, 1, 12, 12], "texture": "#0"},
"up": {"uv": [3, 3, 4, 6], "texture": "#0"},
"down": {"uv": [5, 9, 6, 12], "texture": "#0"}
}
},
{
"name": "Mirror II",
"from": [9, 3, 7.5],
"to": [12, 14, 8.5],
"faces": {
"north": {"uv": [4, 1, 7, 12], "texture": "#0"},
"east": {"uv": [3, 1, 4, 12], "texture": "#0"},
"south": {"uv": [4, 1, 7, 12], "texture": "#0"},
"west": {"uv": [12, 1, 13, 12], "texture": "#0"},
"up": {"uv": [4, 1, 7, 2], "texture": "#0"},
"down": {"uv": [4, 14, 7, 15], "texture": "#0"}
}
},
{
"name": "CrossMirror II",
"from": [7.5, 2, 3.5],
"to": [8.5, 13, 6.5],
"faces": {
"north": {"uv": [4, 1, 5, 12], "texture": "#0"},
"east": {"uv": [3, 1, 6, 12], "texture": "#0"},
"south": {"uv": [4, 3, 5, 14], "texture": "#0"},
"west": {"uv": [9, 2, 12, 13], "texture": "#0"},
"up": {"uv": [4, 3, 5, 6], "texture": "#0"},
"down": {"uv": [4, 8, 5, 11], "texture": "#0"}
}
}
]
}

View file

@ -1,99 +1,105 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"textures": {
"0": "block/white_stained_glass",
"1": "block/obsidian",
"2": "block/packed_ice"
},
"elements": [
{
"name": "Mirror",
"from": [ 4.0, 1.0, 7.500000007450581 ],
"to": [ 12.0, 15.0, 8.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 12.0, 15.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 15.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 1.0, 12.0, 15.0 ] },
"west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 15.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 1.0, 12.0, 2.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 14.0, 12.0, 15.0 ] }
}
},
{
"name": "rod_left_bottom",
"from": [ 1.2000000029802322, 3.0, 7.0 ],
"to": [ 3.2000000029802322, 4.0, 9.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_left_top",
"from": [ 1.2000000029802322, 12.0, 7.0 ],
"to": [ 3.2000000029802322, 13.0, 9.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_left",
"from": [ 2.0, 4.0, 7.499999992549419 ],
"to": [ 3.0, 12.0, 8.49999999254942 ],
"shade": false,
"faces": {
"north": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] },
"east": { "texture": "#2", "uv": [ 3.0, 0.0, 4.0, 8.0 ] },
"south": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] },
"west": { "texture": "#2", "uv": [ 5.0, 1.0, 6.0, 9.0 ] }
}
},
{
"name": "rod_right_bottom",
"from": [ 12.799999997019768, 3.0, 7.0 ],
"to": [ 14.799999997019768, 4.0, 9.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_right",
"from": [ 13.0, 4.0, 7.499999992549419 ],
"to": [ 14.0, 12.0, 8.49999999254942 ],
"shade": false,
"faces": {
"north": { "texture": "#2", "uv": [ 3.0, 2.0, 4.0, 10.0 ] },
"east": { "texture": "#2", "uv": [ 3.0, 3.0, 4.0, 11.0 ] },
"south": { "texture": "#2", "uv": [ 4.0, 3.0, 5.0, 11.0 ] },
"west": { "texture": "#2", "uv": [ 5.0, 0.0, 6.0, 8.0 ] }
}
},
{
"name": "rod_right_top",
"from": [ 12.799999997019768, 12.0, 7.0 ],
"to": [ 14.799999997019768, 13.0, 9.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
}
]
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/symmetry_mirror",
"1_2": "create:block/brass_block"
},
"elements": [
{
"name": "Mirror",
"from": [4, 1, 7.5],
"to": [12, 15, 8.5],
"faces": {
"north": {"uv": [4, 1, 12, 15], "texture": "#0"},
"east": {"uv": [3, 1, 4, 15], "texture": "#0"},
"south": {"uv": [4, 1, 12, 15], "texture": "#0"},
"west": {"uv": [12, 1, 13, 15], "texture": "#0"},
"up": {"uv": [4, 1, 12, 2], "texture": "#0"},
"down": {"uv": [4, 14, 12, 15], "texture": "#0"}
}
},
{
"name": "rod_left_bottom",
"from": [1, 3, 7],
"to": [3, 4, 9],
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"up": {"uv": [13, 13, 15, 15], "texture": "#1_2"},
"down": {"uv": [13, 13, 15, 15], "texture": "#1_2"}
}
},
{
"name": "rod_left_bottom",
"from": [13, 3, 7],
"to": [15, 4, 9],
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"},
"down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"}
}
},
{
"name": "rod_left_top",
"from": [1, 12, 7],
"to": [3, 13, 9],
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"up": {"uv": [13, 13, 15, 15], "texture": "#1_2"},
"down": {"uv": [13, 13, 15, 15], "texture": "#1_2"}
}
},
{
"name": "rod_left_top",
"from": [13, 12, 7],
"to": [15, 13, 9],
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#1_2"},
"up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"},
"down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"}
}
},
{
"name": "rod_left",
"from": [1, 4, 7.5],
"to": [3, 12, 8.5],
"shade": false,
"faces": {
"north": {"uv": [3, 5, 1, 13], "texture": "#1_2"},
"east": {"uv": [8, 4, 9, 12], "texture": "#1_2"},
"south": {"uv": [1, 3, 3, 11], "texture": "#1_2"},
"west": {"uv": [1, 6, 2, 14], "texture": "#1_2"}
}
},
{
"name": "rod_left",
"from": [13, 4, 7.5],
"to": [15, 12, 8.5],
"shade": false,
"faces": {
"north": {"uv": [1, 3, 3, 11], "texture": "#1_2"},
"east": {"uv": [1, 6, 2, 14], "texture": "#1_2"},
"south": {"uv": [3, 5, 1, 13], "texture": "#1_2"},
"west": {"uv": [8, 4, 9, 12], "texture": "#1_2"}
}
}
],
"groups": [0,
{
"name": "crossplane",
"origin": [8, 8, 8],
"children": [1, 2, 3, 4, 5, 6]
}
]
}

View file

@ -1,172 +1,178 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"textures": {
"0": "block/white_stained_glass",
"1": "block/obsidian",
"2": "block/packed_ice"
},
"elements": [
{
"name": "Mirror",
"from": [ 6.499999992549419, 1.0, 10.50000000745058 ],
"to": [ 9.49999999254942, 12.0, 11.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] }
}
},
{
"name": "rod_left_bottom",
"from": [ 1.2000000029802322, 3.0, 7.0 ],
"to": [ 3.2000000029802322, 4.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_left_top",
"from": [ 1.2000000029802322, 12.0, 7.0 ],
"to": [ 3.2000000029802322, 13.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_left",
"from": [ 2.0, 4.0, 7.499999992549419 ],
"to": [ 3.0, 12.0, 8.49999999254942 ],
"shade": false,
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] },
"east": { "texture": "#2", "uv": [ 3.0, 0.0, 4.0, 8.0 ] },
"south": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] },
"west": { "texture": "#2", "uv": [ 5.0, 1.0, 6.0, 9.0 ] }
}
},
{
"name": "rod_right_bottom",
"from": [ 12.799999997019768, 3.0, 7.0 ],
"to": [ 14.799999997019768, 4.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "rod_right",
"from": [ 13.0, 4.0, 7.499999992549419 ],
"to": [ 14.0, 12.0, 8.49999999254942 ],
"shade": false,
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 3.0, 2.0, 4.0, 10.0 ] },
"east": { "texture": "#2", "uv": [ 3.0, 3.0, 4.0, 11.0 ] },
"south": { "texture": "#2", "uv": [ 4.0, 3.0, 5.0, 11.0 ] },
"west": { "texture": "#2", "uv": [ 5.0, 0.0, 6.0, 8.0 ] }
}
},
{
"name": "rod_right_top",
"from": [ 12.799999997019768, 12.0, 7.0 ],
"to": [ 14.799999997019768, 13.0, 9.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }
}
},
{
"name": "CrossMirror",
"from": [ 4.499999977648258, 2.0, 6.500000007450581 ],
"to": [ 5.499999977648258, 13.0, 9.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] },
"west": { "texture": "#0", "uv": [ 9.0, 1.0, 12.0, 12.0 ] },
"up": { "texture": "#0", "uv": [ 3.0, 3.0, 4.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 5.0, 9.0, 6.0, 12.0 ] }
}
},
{
"name": "Mirror II",
"from": [ 6.499999992549419, 3.0, 4.500000007450581 ],
"to": [ 9.49999999254942, 14.0, 5.500000007450581 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] },
"west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] }
}
},
{
"name": "CrossMirror II",
"from": [ 10.50000000745058, 4.0, 6.500000007450581 ],
"to": [ 11.50000000745058, 15.0, 9.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 14.0 ] },
"west": { "texture": "#0", "uv": [ 9.0, 2.0, 12.0, 13.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 11.0 ] }
}
},
{
"name": "Cube",
"from": [ 7.499999992549419, 6.0, -0.4999999925494194 ],
"to": [ 8.49999999254942, 10.0, 3.5000000074505806 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 5.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 7.0, 5.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] },
"west": { "texture": "#0", "uv": [ 9.0, 2.0, 13.0, 6.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 12.0 ] }
}
},
{
"name": "Cube",
"from": [ 7.499999992549419, 6.0, 12.50000000745058 ],
"to": [ 8.49999999254942, 10.0, 16.50000000745058 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 5.0 ] },
"east": { "texture": "#0", "uv": [ 3.0, 1.0, 7.0, 5.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] },
"west": { "texture": "#0", "uv": [ 9.0, 2.0, 13.0, 6.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 12.0 ] }
}
}
]
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/symmetry_mirror",
"2": "create:block/brass_block"
},
"elements": [
{
"name": "Mirror",
"from": [6.5, 1, 10.5],
"to": [9.5, 12, 11.5],
"faces": {
"north": {"uv": [4, 1, 7, 12], "texture": "#0"},
"east": {"uv": [3, 1, 4, 12], "texture": "#0"},
"south": {"uv": [4, 1, 7, 12], "texture": "#0"},
"west": {"uv": [12, 1, 13, 12], "texture": "#0"},
"up": {"uv": [4, 1, 7, 2], "texture": "#0"},
"down": {"uv": [4, 14, 7, 15], "texture": "#0"}
}
},
{
"name": "CrossMirror",
"from": [4.5, 2, 6.5],
"to": [5.5, 13, 9.5],
"faces": {
"north": {"uv": [4, 1, 5, 12], "texture": "#0"},
"east": {"uv": [3, 1, 6, 12], "texture": "#0"},
"south": {"uv": [4, 1, 5, 12], "texture": "#0"},
"west": {"uv": [9, 1, 12, 12], "texture": "#0"},
"up": {"uv": [3, 3, 4, 6], "texture": "#0"},
"down": {"uv": [5, 9, 6, 12], "texture": "#0"}
}
},
{
"name": "Mirror II",
"from": [6.5, 3, 4.5],
"to": [9.5, 14, 5.5],
"faces": {
"north": {"uv": [4, 1, 7, 12], "texture": "#0"},
"east": {"uv": [3, 1, 4, 12], "texture": "#0"},
"south": {"uv": [4, 1, 7, 12], "texture": "#0"},
"west": {"uv": [12, 1, 13, 12], "texture": "#0"},
"up": {"uv": [4, 1, 7, 2], "texture": "#0"},
"down": {"uv": [4, 14, 7, 15], "texture": "#0"}
}
},
{
"name": "CrossMirror II",
"from": [10.5, 4, 6.5],
"to": [11.5, 15, 9.5],
"faces": {
"north": {"uv": [4, 1, 5, 12], "texture": "#0"},
"east": {"uv": [3, 1, 6, 12], "texture": "#0"},
"south": {"uv": [4, 3, 5, 14], "texture": "#0"},
"west": {"uv": [9, 2, 12, 13], "texture": "#0"},
"up": {"uv": [4, 3, 5, 6], "texture": "#0"},
"down": {"uv": [4, 8, 5, 11], "texture": "#0"}
}
},
{
"name": "Cube",
"from": [7.5, 6, -0.5],
"to": [8.5, 10, 3.5],
"rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [4, 1, 5, 5], "texture": "#0"},
"east": {"uv": [3, 1, 7, 5], "texture": "#0"},
"south": {"uv": [4, 3, 5, 7], "texture": "#0"},
"west": {"uv": [9, 2, 13, 6], "texture": "#0"},
"up": {"uv": [4, 3, 5, 7], "texture": "#0"},
"down": {"uv": [4, 8, 5, 12], "texture": "#0"}
}
},
{
"name": "Cube",
"from": [7.5, 6, 12.5],
"to": [8.5, 10, 16.5],
"rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [4, 1, 5, 5], "texture": "#0"},
"east": {"uv": [3, 1, 7, 5], "texture": "#0"},
"south": {"uv": [4, 3, 5, 7], "texture": "#0"},
"west": {"uv": [9, 2, 13, 6], "texture": "#0"},
"up": {"uv": [4, 3, 5, 7], "texture": "#0"},
"down": {"uv": [4, 8, 5, 12], "texture": "#0"}
}
},
{
"name": "rod_left_bottom",
"from": [1, 3, 7],
"to": [3, 4, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "texture": "#2"}
}
},
{
"name": "rod_left_bottom",
"from": [13, 3, 7],
"to": [15, 4, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}
}
},
{
"name": "rod_left_top",
"from": [1, 12, 7],
"to": [3, 13, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "texture": "#2"}
}
},
{
"name": "rod_left_top",
"from": [13, 12, 7],
"to": [15, 13, 9],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 2, 1], "texture": "#2"},
"east": {"uv": [0, 0, 2, 1], "texture": "#2"},
"south": {"uv": [0, 0, 2, 1], "texture": "#2"},
"west": {"uv": [0, 0, 2, 1], "texture": "#2"},
"up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"},
"down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}
}
},
{
"name": "rod_left",
"from": [1, 4, 7.5],
"to": [3, 12, 8.5],
"shade": false,
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [3, 5, 1, 13], "texture": "#2"},
"east": {"uv": [8, 4, 9, 12], "texture": "#2"},
"south": {"uv": [1, 3, 3, 11], "texture": "#2"},
"west": {"uv": [1, 6, 2, 14], "texture": "#2"}
}
},
{
"name": "rod_left",
"from": [13, 4, 7.5],
"to": [15, 12, 8.5],
"shade": false,
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [1, 3, 3, 11], "texture": "#2"},
"east": {"uv": [1, 6, 2, 14], "texture": "#2"},
"south": {"uv": [3, 5, 1, 13], "texture": "#2"},
"west": {"uv": [8, 4, 9, 12], "texture": "#2"}
}
}
],
"groups": [0, 1, 2, 3, 4, 5,
{
"name": "crossplane",
"origin": [8, 8, 8],
"children": [6, 7, 8, 9, 10, 11]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

Before

Width:  |  Height:  |  Size: 150 B

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB