Merge branch 'mc1.15/dev' of https://github.com/Creators-of-Create/Create into mc1.15/dev

This commit is contained in:
Snownee 2021-02-07 12:17:17 +08:00
commit b76782364d
33 changed files with 867 additions and 591 deletions

1
.gitignore vendored
View file

@ -40,4 +40,3 @@ local.properties
# PDT-specific
.buildpath
src/generated/resources/.cache/cache

View file

@ -404,7 +404,7 @@ e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json
acc852d80378b426d7ee6cb59c169e06b6d63b25 assets/create/lang/en_us.json
30ce93c56557cea2f384a47b549fb893700523a5 assets/create/lang/unfinished/de_de.json
77b8310f3cbed36fa0d2ee29e65ac6aee0c2adc2 assets/create/lang/unfinished/es_mx.json
b8e44c8c33b3c36b850f579e317103eb57f85f07 assets/create/lang/unfinished/fr_fr.json
8db9f9147dcef8c8182c548a524f96f578c116ec assets/create/lang/unfinished/fr_fr.json
89f7029d73733938ee9f900fc36d52ab7fc97563 assets/create/lang/unfinished/it_it.json
b1935e7f8d79d1112e1685adb42daedb976ac6d7 assets/create/lang/unfinished/ja_jp.json
23aaf879d07a24775aeba3b98c355c992b24f28b assets/create/lang/unfinished/ko_kr.json
@ -3539,7 +3539,7 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone
eedf31af7134d03656c5fa57229982f9c5bed07c data/create/tags/blocks/brittle.json
13b55d6e905a02403d2e95e9ba2357f99c5f2241 data/create/tags/blocks/fan_heaters.json
3bc64e3a1e7980237435b1770a9ba2102d57fcd4 data/create/tags/blocks/fan_transparent.json
745a82505a68a6482407d87374e356781406ab46 data/create/tags/blocks/safe_nbt.json
c81ea194e808985847159b201140d4aa4cbcca65 data/create/tags/blocks/safe_nbt.json
c9ac7e3e5ec18554e7184168d65e9b8e44ef5610 data/create/tags/blocks/sails.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 730",
"_": "Missing Localizations: 666",
"_": "->------------------------] Game Elements [------------------------<-",
@ -10,83 +10,83 @@
"block.create.adjustable_pulse_repeater": "Répéteur d'impulsions réglable",
"block.create.adjustable_repeater": "Répéteur réglable",
"block.create.analog_lever": "Levier analogique",
"block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel",
"block.create.andesite_belt_funnel": "Entonnoir en andésite pour tapis roulant",
"block.create.andesite_bricks": "Briques d'andésite",
"block.create.andesite_bricks_slab": "Dalle en briques d'andésite",
"block.create.andesite_bricks_stairs": "Escalier en briques d'andésite",
"block.create.andesite_bricks_wall": "Mur en briques d'andésite",
"block.create.andesite_casing": "Boîtier en andésite",
"block.create.andesite_casing": "Revêtement en andésite",
"block.create.andesite_cobblestone": "Pierres d'andésite",
"block.create.andesite_cobblestone_slab": "Dalles en pierres d'andésite",
"block.create.andesite_cobblestone_stairs": "Escaliers en pierres d'andésite",
"block.create.andesite_cobblestone_wall": "Mur en pierres d'andésite",
"block.create.andesite_encased_shaft": "Arbre mécanique dans un revêtement en andésite",
"block.create.andesite_encased_shaft": "Rotor dans un revêtement en andésite",
"block.create.andesite_funnel": "Entonnoir en andésite",
"block.create.andesite_pillar": "Pilier en andésite",
"block.create.andesite_tunnel": "Tunnel en andésite",
"block.create.basin": "Bassin",
"block.create.belt": "Tapis roulant",
"block.create.birch_window": "Fenêtre en bouleau",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_sail": "UNLOCALIZED: Black Sail",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
"block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle",
"block.create.blaze_burner": "UNLOCALIZED: Blaze Burner",
"block.create.blue_sail": "UNLOCALIZED: Blue Sail",
"block.create.blue_seat": "UNLOCALIZED: Blue Seat",
"block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "Boîtier en laiton",
"block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_sail": "UNLOCALIZED: Brown Sail",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
"block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle",
"block.create.birch_window_pane": "Vitre en bouleau",
"block.create.black_sail": "Voile noire",
"block.create.black_seat": "Siège noir",
"block.create.black_valve_handle": "Vanne noire",
"block.create.blaze_burner": "Brûleur à blaze",
"block.create.blue_sail": "Voile bleue",
"block.create.blue_seat": "Siège bleu",
"block.create.blue_valve_handle": "Vanne bleue",
"block.create.brass_belt_funnel": "Entonnoir en laiton pour tapis roulant",
"block.create.brass_block": "Bloc de laiton",
"block.create.brass_casing": "Revêtement en laiton",
"block.create.brass_encased_shaft": "Rotor dans un revêtement en laiton",
"block.create.brass_funnel": "Entonnoir en laiton",
"block.create.brass_tunnel": "Tunnel en laiton",
"block.create.brown_sail": "Voile brune",
"block.create.brown_seat": "Siège brun",
"block.create.brown_valve_handle": "Vanne brune",
"block.create.cart_assembler": "Assembleur de wagon",
"block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria",
"block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite",
"block.create.chiseled_gabbro": "UNLOCALIZED: Chiseled Gabbro",
"block.create.chiseled_limestone": "UNLOCALIZED: Chiseled Limestone",
"block.create.chiseled_scoria": "UNLOCALIZED: Chiseled Scoria",
"block.create.chiseled_weathered_limestone": "UNLOCALIZED: Chiseled Weathered Limestone",
"block.create.chocolate": "UNLOCALIZED: Chocolate",
"block.create.chute": "UNLOCALIZED: Chute",
"block.create.chiseled_dark_scoria": "Scoria sombre taillé",
"block.create.chiseled_dolomite": "Dolomite taillée",
"block.create.chiseled_gabbro": "Gabbro taillé",
"block.create.chiseled_limestone": "Calcaire taillé",
"block.create.chiseled_scoria": "Scoria taillé",
"block.create.chiseled_weathered_limestone": "Calcaire altéré taillé",
"block.create.chocolate": "Chocolat",
"block.create.chute": "Glissière",
"block.create.clockwork_bearing": "Roulement mécanique horloger",
"block.create.clutch": "Embrayage",
"block.create.cogwheel": "Roue dentée",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.controller_rail": "UNLOCALIZED: Controller Rail",
"block.create.content_observer": "Observateur de contenu",
"block.create.controller_rail": "Rails controlleurs",
"block.create.copper_block": "Bloc de cuivre",
"block.create.copper_casing": "Boîtier en cuivre",
"block.create.copper_casing": "Revêtement en cuivre",
"block.create.copper_ore": "Minerai de cuivre",
"block.create.copper_shingles": "Bardeaux de cuivre",
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.copper_tiles": "Tuiles en cuivre",
"block.create.copper_valve_handle": "Vanne en cuivre",
"block.create.creative_crate": "Créateur de schémacanon",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_fluid_tank": "Réservoir créatif",
"block.create.creative_motor": "Moteur",
"block.create.crushing_wheel": "Roue de concassage",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
"block.create.crushing_wheel_controller": "Contrôleur de roue de concassage",
"block.create.cuckoo_clock": "Horloge à coucou",
"block.create.cyan_sail": "UNLOCALIZED: Cyan Sail",
"block.create.cyan_seat": "UNLOCALIZED: Cyan Seat",
"block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle",
"block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window",
"block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane",
"block.create.cyan_sail": "Voile cyan",
"block.create.cyan_seat": "Siège cyan",
"block.create.cyan_valve_handle": "Vanne cyan",
"block.create.dark_oak_window": "fenêtre en chêne sombre",
"block.create.dark_oak_window_pane": "Vitre en chêne sombre",
"block.create.dark_scoria": "Scorie sombre",
"block.create.dark_scoria_bricks": "Briques de scorie sombre",
"block.create.dark_scoria_bricks_slab": "Dalles de briques de scorie sombre",
"block.create.dark_scoria_bricks_stairs": "Escaliers de briques de scorie sombre",
"block.create.dark_scoria_bricks_wall": "Muret de briques de scorie sombre",
"block.create.dark_scoria_cobblestone": "UNLOCALIZED: Dark Scoria Cobblestone",
"block.create.dark_scoria_cobblestone": "Pierres de scorie sombre",
"block.create.dark_scoria_cobblestone_slab": "UNLOCALIZED: Dark Scoria Cobblestone Slab",
"block.create.dark_scoria_cobblestone_stairs": "UNLOCALIZED: Dark Scoria Cobblestone Stairs",
"block.create.dark_scoria_cobblestone_wall": "UNLOCALIZED: Dark Scoria Cobblestone Wall",
"block.create.dark_scoria_pillar": "UNLOCALIZED: Dark Scoria Pillar",
"block.create.deployer": "Déployeur",
"block.create.depot": "UNLOCALIZED: Depot",
"block.create.depot": "pot",
"block.create.diorite_bricks": "Briques de diorite",
"block.create.diorite_bricks_slab": "UNLOCALIZED: Diorite Bricks Slab",
"block.create.diorite_bricks_stairs": "UNLOCALIZED: Diorite Bricks Stairs",
@ -96,18 +96,18 @@
"block.create.diorite_cobblestone_stairs": "UNLOCALIZED: Diorite Cobblestone Stairs",
"block.create.diorite_cobblestone_wall": "UNLOCALIZED: Diorite Cobblestone Wall",
"block.create.diorite_pillar": "UNLOCALIZED: Diorite Pillar",
"block.create.dolomite": "Dolomie",
"block.create.dolomite_bricks": "Briques de dolomie",
"block.create.dolomite_bricks_slab": "Dalle de briques de dolomie",
"block.create.dolomite_bricks_stairs": "Escaliers de briques de dolomie",
"block.create.dolomite_bricks_wall": "Muret de briques de dolomie",
"block.create.dolomite": "Dolomite",
"block.create.dolomite_bricks": "Briques de dolomite",
"block.create.dolomite_bricks_slab": "Dalle de briques de dolomite",
"block.create.dolomite_bricks_stairs": "Escaliers de briques de dolomite",
"block.create.dolomite_bricks_wall": "Muret de briques de dolomite",
"block.create.dolomite_cobblestone": "UNLOCALIZED: Dolomite Cobblestone",
"block.create.dolomite_cobblestone_slab": "UNLOCALIZED: Dolomite Cobblestone Slab",
"block.create.dolomite_cobblestone_stairs": "UNLOCALIZED: Dolomite Cobblestone Stairs",
"block.create.dolomite_cobblestone_wall": "UNLOCALIZED: Dolomite Cobblestone Wall",
"block.create.dolomite_pillar": "Pillier de dolomie",
"block.create.encased_chain_drive": "UNLOCALIZED: Encased Chain Drive",
"block.create.encased_fan": "Ventilateur enfermé",
"block.create.dolomite_pillar": "Pillier de dolomite",
"block.create.encased_chain_drive": "Chaine de transmission",
"block.create.encased_fan": "Ventilateur enchâssé",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
@ -308,12 +308,12 @@
"block.create.pink_sail": "UNLOCALIZED: Pink Sail",
"block.create.pink_seat": "UNLOCALIZED: Pink Seat",
"block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle",
"block.create.piston_extension_pole": "Pôle d'extension de piston",
"block.create.piston_extension_pole": "Barre d'extension de piston",
"block.create.polished_dark_scoria": "Scorie sombre polie",
"block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab",
"block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs",
"block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall",
"block.create.polished_dolomite": "Dolomie polie",
"block.create.polished_dolomite": "Dolomite polie",
"block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab",
"block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs",
"block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall",
@ -329,8 +329,8 @@
"block.create.polished_scoria_slab": "Dalle de scorie polie",
"block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs",
"block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall",
"block.create.polished_weathered_limestone": "Calcaire patinées polies",
"block.create.polished_weathered_limestone_slab": "Dalle de calcaire patinées",
"block.create.polished_weathered_limestone": "Calcaire altéré polies",
"block.create.polished_weathered_limestone_slab": "Dalle de calcaire altéré",
"block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs",
"block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall",
"block.create.portable_fluid_interface": "UNLOCALIZED: Portable Fluid Interface",
@ -346,7 +346,7 @@
"block.create.red_sail": "UNLOCALIZED: Red Sail",
"block.create.red_seat": "UNLOCALIZED: Red Seat",
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
"block.create.redstone_contact": "redstone_contact Redstone",
"block.create.redstone_contact": "Contact de redstone",
"block.create.redstone_link": "Liaison Redstone",
"block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing",
"block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail",
@ -369,7 +369,7 @@
"block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis",
"block.create.sequenced_gearshift": "Décaleur de rotation séquencé",
"block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing",
"block.create.shaft": "Arbre mécanique",
"block.create.shaft": "Rotor",
"block.create.smart_chute": "UNLOCALIZED: Smart Chute",
"block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe",
"block.create.speedometer": "Compteur de vitesse",
@ -385,16 +385,16 @@
"block.create.vertical_framed_glass": "Fenêtre en verre verticale",
"block.create.vertical_framed_glass_pane": "Vitre encadrée verticale",
"block.create.water_wheel": "Roue à eau",
"block.create.weathered_limestone": "Calcaire patinées",
"block.create.weathered_limestone_bricks": "Briques de calcaire patinées",
"block.create.weathered_limestone_bricks_slab": "Dalle de briques de calcaire patinées",
"block.create.weathered_limestone_bricks_stairs": "Escaliers de briques de calcaire patinées",
"block.create.weathered_limestone_bricks_wall": "Muret de briques de calcaire patinées",
"block.create.weathered_limestone": "Calcaire altéré",
"block.create.weathered_limestone_bricks": "Briques de Calcaire altéré",
"block.create.weathered_limestone_bricks_slab": "Dalle de briques de Calcaire altéré",
"block.create.weathered_limestone_bricks_stairs": "Escaliers de briques de Calcaire altéré",
"block.create.weathered_limestone_bricks_wall": "Muret de briques de Calcaire altéré",
"block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone",
"block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab",
"block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs",
"block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall",
"block.create.weathered_limestone_pillar": "Pillier de calcaire patinées",
"block.create.weathered_limestone_pillar": "Pillier de Calcaire altéré",
"block.create.white_sail": "UNLOCALIZED: White Sail",
"block.create.white_seat": "UNLOCALIZED: White Seat",
"block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle",
@ -478,7 +478,7 @@
"item.create.schematic_and_quill": "Schéma et plume",
"item.create.shadow_steel": "Acier sombre",
"item.create.super_glue": "Colle extra-forte",
"item.create.tree_fertilizer": "Engrais pour arbre",
"item.create.tree_fertilizer": "Engrais pour arbres",
"item.create.vertical_gearbox": "Boîte de transfert verticale",
"item.create.wand_of_symmetry": "Bâton de symétrie",
"item.create.wheat_flour": "Farine",
@ -496,7 +496,7 @@
"advancement.create.andesite_alloy.desc": "Certains matériaux de Create ont des noms bizzares; l'alliage d'andésite est l'un d'entre eux.",
"advancement.create.its_alive": "Ça bouge!",
"advancement.create.its_alive.desc": "Regardez vos bremiers composants tourner.",
"advancement.create.shifting_gears": "Arbre de transmission",
"advancement.create.shifting_gears": "rotor de transmission",
"advancement.create.shifting_gears.desc": "Connectez une roue dentée à une grande roue dentée afin de changer la vitesse de votre engin",
"advancement.create.overstressed": "Surtension",
"advancement.create.overstressed.desc": "Testez d'abord les limites de la force mécanique",
@ -657,7 +657,7 @@
"itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create Palettes",
"death.attack.create.crush": "%1$s nanana a été traitée par une roue de concassage",
"death.attack.create.crush": "%1$s a été concassé.e",
"death.attack.create.fan_fire": "%1$s a été brûlé à mort par l'air chaud",
"death.attack.create.fan_lava": "%1$s a été brûlé à mort par un ventilateur de lave",
"death.attack.create.mechanical_drill": "%1$s a été empalé par une perceuse mécanique",
@ -796,10 +796,10 @@
"create.contraptions.movement_mode": "Mode de mouvement",
"create.contraptions.movement_mode.move_place": "Toujours placer à l'arrêt",
"create.contraptions.movement_mode.move_place_returned": "Placer uniquement en position de départ",
"create.contraptions.movement_mode.move_never_place": "Ne placer que lorsque l'ancre est détruite",
"create.contraptions.movement_mode.move_never_place": "Ne placer que Quand l'ancre est détruite",
"create.contraptions.movement_mode.rotate_place": "Toujours placer à l'arrêt",
"create.contraptions.movement_mode.rotate_place_returned": "Placer uniquement près de l'angle initial",
"create.contraptions.movement_mode.rotate_never_place": "Ne placer que lorsque l'ancre est détruite",
"create.contraptions.movement_mode.rotate_never_place": "Ne placer que Quand l'ancre est détruite",
"create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode",
"create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion",
"create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating",
@ -1118,7 +1118,7 @@
"create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start <tickTime> to artificially slow down the server tick",
"create.command.killTPSCommand.argument.tickTime": "tickTime",
"create.subtitle.schematicannon_launch_block": "Tire de schémacanon",
"create.subtitle.schematicannon_launch_block": "Tir de schémacanon",
"create.subtitle.schematicannon_finish": "Fin de schémacanon",
"create.subtitle.slime_added": "Bruit de slime",
"create.subtitle.mechanical_press_activation": "Activation de la presse mechanique",
@ -1138,7 +1138,7 @@
"item.create.example_item.tooltip.behaviour1": "Donc cet objet fait ceci. (les comportements sont affichés avec shift)",
"item.create.example_item.tooltip.condition2": "Et quand cela",
"item.create.example_item.tooltip.behaviour2": "Vous pouvez ajouter autant de comportements que vous le souhaitez",
"item.create.example_item.tooltip.control1": "Lorsque Ctrl enfoncé",
"item.create.example_item.tooltip.control1": "Quand Ctrl enfoncé",
"item.create.example_item.tooltip.action1": "Ces commandes sont affichées.",
"block.create.andesite_encased_shaft.tooltip": "UNLOCALIZED: ANDESITE ENCASED SHAFT",
@ -1298,7 +1298,7 @@
"item.create.wand_of_symmetry.tooltip": "BÂTON DE SYMÉTRIE",
"item.create.wand_of_symmetry.tooltip.summary": "Reflète parfaitement le placement des blocs sur les plans configurés.",
"item.create.wand_of_symmetry.tooltip.condition1": "Lorsque positionné dans la barre active",
"item.create.wand_of_symmetry.tooltip.condition1": "Quand positionné dans la barre active",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Reste actif",
"item.create.wand_of_symmetry.tooltip.control1": "Clic droit au sol",
"item.create.wand_of_symmetry.tooltip.action1": "_Créé_ ou _déplace_ le mirroir",
@ -1325,13 +1325,13 @@
"item.create.handheld_worldshaper.tooltip.control3": "Clic droit en étant accroupi",
"item.create.handheld_worldshaper.tooltip.action3": "Ouvre l'_interface_ _de_ _configuration_",
"item.create.tree_fertilizer.tooltip": "ENGRAIS POUR ARBRE",
"item.create.tree_fertilizer.tooltip.summary": "Une puissante combinaison de minéraux adaptée pour accélérer la croissance des types d'arbres communs.",
"item.create.tree_fertilizer.tooltip.condition1": "Lorsqu'utilisé sur une pousse d'arbre",
"item.create.tree_fertilizer.tooltip.behaviour1": "Fait pousser des arbres _indépendamment_ de leurs _conditions_ _d'emplacement_",
"item.create.tree_fertilizer.tooltip": "ENGRAIS POUR ARBRES",
"item.create.tree_fertilizer.tooltip.summary": "Une puissante combinaison de minéraux adaptée pour accélérer la croissance des types d'rotors communs.",
"item.create.tree_fertilizer.tooltip.condition1": "Lorsqu'utilisé sur une pousse d'rotor",
"item.create.tree_fertilizer.tooltip.behaviour1": "Fait pousser des rotors _indépendamment_ de leurs _conditions_ _d'emplacement_",
"item.create.deforester.tooltip": "DÉFORESTEUR",
"item.create.deforester.tooltip.summary": "Une _hache_ _rayonnante_ capable d'abattre des arbres en une fraction de seconde.",
"item.create.deforester.tooltip.summary": "Une _hache_ _rayonnante_ capable d'abattre des rotors en une fraction de seconde.",
"item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP",
"item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.",
@ -1340,14 +1340,14 @@
"item.create.filter.tooltip": "FILTRE",
"item.create.filter.tooltip.summary": "_Contrôle_ les _sorties_ et _entrées_ de dispositifs logistiques avec plus de _précision_, en les comparant à un _ensemble_ _d'objets_ ou à plusieurs _filtres_ _imbriqués_.",
"item.create.filter.tooltip.condition1": "Lorsque dans l'emplacement de filtre",
"item.create.filter.tooltip.condition1": "Quand dans l'emplacement de filtre",
"item.create.filter.tooltip.behaviour1": "_Contrôle_ le flux d'object selon sa _configuration_.",
"item.create.filter.tooltip.condition2": "Clic droit",
"item.create.filter.tooltip.behaviour2": "Ouvre l'_interface_ _de_ _configuration_.",
"item.create.attribute_filter.tooltip": "FILTRE D'ATTRIBUTS",
"item.create.attribute_filter.tooltip.summary": "_Contrôle_ les _sorties_ et les _entrées_ de dispositifs logistiques avec plus de _précision_, en les comparant à un _ensemble_ _d'objets_ ou à plusieurs _filtres_ _imbriqués_.",
"item.create.attribute_filter.tooltip.condition1": "Lorsque dans l'emplacement de filtre",
"item.create.attribute_filter.tooltip.condition1": "Quand dans l'emplacement de filtre",
"item.create.attribute_filter.tooltip.behaviour1": "_Contrôle_ le flux d'object selon sa _configuration_.",
"item.create.attribute_filter.tooltip.condition2": "Clic droit",
"item.create.attribute_filter.tooltip.behaviour2": "Ouvre l'_interface_ _de_ _configuration_.",
@ -1357,7 +1357,7 @@
"item.create.schematic.tooltip": "SCHÉMA",
"item.create.schematic.tooltip.summary": "Contient une structure à positionner et à placer dans le monde. Positionnez l'hologramme comme vous le souhaitez et utilisez un _schémacanon_ pour le construire.",
"item.create.schematic.tooltip.condition1": "Lorsque tenu en main",
"item.create.schematic.tooltip.condition1": "Quand tenu en main",
"item.create.schematic.tooltip.behaviour1": "Peut être positionné à l'aide des outils à l'écran.",
"item.create.schematic.tooltip.control1": "Clic droit en étant accroupi",
"item.create.schematic.tooltip.action1": "Ouvre une _interface_ pour rentrer les _coordonées_ correctes.",
@ -1382,31 +1382,31 @@
"block.create.schematic_table.tooltip": "TABLE À SCHÉMA",
"block.create.schematic_table.tooltip.summary": "Écrit les schémas enregistrés dans un _schéma_ _vide_.",
"block.create.schematic_table.tooltip.condition1": "Lorsque donné un schéma vide",
"block.create.schematic_table.tooltip.condition1": "Quand donné un schéma vide",
"block.create.schematic_table.tooltip.behaviour1": "Télécharge un fichier choisi à partir de votre dossier de schémas.",
"block.create.shaft.tooltip": "ARBRE MÉCANIQUE",
"block.create.shaft.tooltip.summary": "_Relais_ la _rotation_ en ligne droite.",
"block.create.shaft.tooltip": "ROTOR",
"block.create.shaft.tooltip.summary": "_Relaie_ la _rotation_ en ligne droite.",
"block.create.cogwheel.tooltip": "ROUE DENTÉE",
"block.create.cogwheel.tooltip.summary": "_Relais_ la _rotation_ en ligne droite, et aux _roues_ _dentées_ adjacentes.",
"block.create.cogwheel.tooltip.summary": "_Relaie_ la _rotation_ en ligne droite, et aux _roues_ _dentées_ adjacentes.",
"block.create.large_cogwheel.tooltip": "GRANDE ROUE DENTÉE",
"block.create.large_cogwheel.tooltip.summary": "Une version plus grande de la _roue_ _dentée_, permettant des _changements_ dans la _vitesse_ _de_ _rotation_ lorsqu'il est connecté à son homologue plus petit.",
"block.create.encased_shaft.tooltip": "ARBRE MÉCANIQUE ENBOÎTÉ",
"block.create.encased_shaft.tooltip.summary": "_Relais_ la _rotation_ en ligne droite. Convient pour propager la rotation à travers les murs.",
"block.create.encased_shaft.tooltip": "ROTOR ENCASTRÉ",
"block.create.encased_shaft.tooltip.summary": "_Relaie_ la _rotation_ en ligne droite. Convient pour propager la rotation à travers les murs.",
"block.create.gearbox.tooltip": "BOÎTE DE VITESSES",
"block.create.gearbox.tooltip.summary": "_Relais_ la _rotation_ dans _quatre_ _directions_. Inverse les connexions directes.",
"block.create.gearbox.tooltip.summary": "_Relaie_ la _rotation_ dans _quatre_ _directions_. Inverse les connexions directes.",
"block.create.gearshift.tooltip": "DÉCALEUR DE ROTATION",
"block.create.gearshift.tooltip.summary": "Une commande pour basculer le sens de rotation des arbres connectés.",
"block.create.gearshift.tooltip": "BOÎTE DE VITESSES",
"block.create.gearshift.tooltip.summary": "Une commande pour basculer le sens de rotation des rotors connectés.",
"block.create.gearshift.tooltip.condition1": "Lorsqu'alimenté",
"block.create.gearshift.tooltip.behaviour1": "_Inverse_ la rotation sortante.",
"block.create.clutch.tooltip": "EMBRAYAGE",
"block.create.clutch.tooltip.summary": "Une commande pour engager / désengager la rotation des arbres connectés.",
"block.create.clutch.tooltip.summary": "Une commande pour engager / désengager la rotation des rotors connectés.",
"block.create.clutch.tooltip.condition1": "Lorsqu'alimenté",
"block.create.clutch.tooltip.behaviour1": "_Arrête_ de transmettre la rotation de l'autre côté.",
@ -1421,23 +1421,23 @@
"block.create.adjustable_chain_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Without_ a signal, adjacent chain drives will relay the _same speed._ With a _full strength_ signal, adjacent chain drives will relay exactly _twice its speed._ Anything inbetween will give results between 1-2x its speed.",
"item.create.belt_connector.tooltip": "CONNECTEUR DE TAPIS ROULANTS",
"item.create.belt_connector.tooltip.summary": "Connecte deux _arbres_ ou plus à un _tapis_ _roulant_ _mécanique_. Les arbres connectés auront exactement la même vitesse et le même sens de rotation. La ceinture peut agir comme un _convoyeur_ pour _objets_ et _entités_.",
"item.create.belt_connector.tooltip.control1": "Clic droit sur arbre",
"item.create.belt_connector.tooltip.action1": "Sélectionne l'arbre comme une poulie de la courroie. Les deux arbres sélectionnés doivent être _alignés_ soit _verticalement_, _horizontalement_, ou _diagonalement_ en direction de la courroie.",
"item.create.belt_connector.tooltip.summary": "Connecte deux _rotors_ ou plus à un _tapis_ _roulant_ _mécanique_. Les rotors connectés auront exactement la même vitesse et le même sens de rotation. La ceinture peut agir comme un _convoyeur_ pour _objets_ et _entités_.",
"item.create.belt_connector.tooltip.control1": "Clic droit sur rotor",
"item.create.belt_connector.tooltip.action1": "Sélectionne le rotor comme une poulie de la courroie. Les deux rotors sélectionnés doivent être _alignés_ soit _verticalement_, _horizontalement_, ou _diagonalement_ en direction de la courroie.",
"item.create.belt_connector.tooltip.control2": "Clic droit en étant accroupi",
"item.create.belt_connector.tooltip.action2": "_Réinitialise_ la première position sélectionnée pour le tapis roulant.",
"item.create.goggles.tooltip": "LUNETTES",
"item.create.goggles.tooltip.summary": "Une paire de lunettes pour augmenter votre vision avec des _informations_ _kinétiques_ utiles.",
"item.create.goggles.tooltip.condition1": "Lorsque portées",
"item.create.goggles.tooltip.condition1": "Quand portées",
"item.create.goggles.tooltip.behaviour1": "Affiche des _indicateurs_ _colorés_ correspondants au _niveau_ _de_ _vitesse_ d'un composant cinétique placé ainsi que _l'impact_ du _stress_ et la _capacité_ des composants individuels.",
"item.create.goggles.tooltip.condition2": "Lorsque vision portée sur une jauge",
"item.create.goggles.tooltip.condition2": "Quand vision portée sur une jauge",
"item.create.goggles.tooltip.behaviour2": "Affiche des informations détaillées sur la _vitesse_ ou le _stress_ du réseau auquel la jauge est connectée.",
"item.create.wrench.tooltip": "CLÉ",
"item.create.wrench.tooltip.summary": "Un outil utile pour travailler sur les engins cinétiques. Peut être utilisé pour _tourner_, _démonter_ et _configurer_ les composants.",
"item.create.wrench.tooltip.control1": "Clic droit a kinetic block",
"item.create.wrench.tooltip.action1": "_Tourne_ les _composents_ proche ou loin de la face avec lequel vous avez interagi.",
"item.create.wrench.tooltip.control1": "Clic droit sur un bloc de Create",
"item.create.wrench.tooltip.action1": "_Tourne_ le _composant_ le long de l'axe dépendant de la face avec lequel vous avez interagi.",
"item.create.wrench.tooltip.control2": "Clic droit en étant accroupi",
"item.create.wrench.tooltip.action2": "_Démonte_ les _composants_ _cinétiques_ et les replace dans _votre_ _inventaire_.",
@ -1447,17 +1447,17 @@
"block.create.water_wheel.tooltip": "ROUE À EAU",
"block.create.water_wheel.tooltip.summary": "Fournit une _force_ _de_ _rotation_ provenant de _courants_ _d'eau_ adjacents.",
"block.create.encased_fan.tooltip": "VENTILATEUR ENFERMÉ",
"block.create.encased_fan.tooltip": "VENTILATEUR ENCHÂSSÉ",
"block.create.encased_fan.tooltip.summary": "Convertit _force_ _de_ _rotation_ en _courants_ _d'air_ et inversement. A une variété d'utilisations.",
"block.create.encased_fan.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.encased_fan.tooltip.behaviour1": "Fournit _force_ _de_ _rotation_ à partir de toute _source_ _de_ _chaleur_ immédiatement en dessous de lui. Le ventilateur doit être tourné vers le bas.",
"block.create.encased_fan.tooltip.condition2": "Lorsque tourné",
"block.create.encased_fan.tooltip.condition2": "Quand tourné",
"block.create.encased_fan.tooltip.behaviour2": "_Pousse_ ou _tire_ les entités, selon la vitesse de rotation entrante.",
"block.create.encased_fan.tooltip.condition3": "Lorsque souffle à travers des blocs spéciaux",
"block.create.encased_fan.tooltip.condition3": "Quand souffle à travers des blocs spéciaux",
"block.create.encased_fan.tooltip.behaviour3": "Des particules de _liquides_ et de _feu_ sont émises dans le flux d'air. Cela peut être utilisé pour _traiter_ des _objets_.",
"block.create.nozzle.tooltip": "BUSE",
"block.create.nozzle.tooltip.summary": "Attachez-le à l'avant d'un _ventilateur_ _enfermé_ pour répartir son effet sur les entités dans _toutes_ les _directions_.",
"block.create.nozzle.tooltip.summary": "Attachez-le à l'avant d'un _ventilateur_ enchâssé_ pour répartir son effet sur les entités dans _toutes_ les _directions_.",
"block.create.hand_crank.tooltip": "MANIVELLE",
"block.create.hand_crank.tooltip.summary": "Une simple _source_ de _force_ _de_ _rotation_ qui nécessite l'interaction des joueurs.",
@ -1466,11 +1466,11 @@
"block.create.cuckoo_clock.tooltip": "COUCOU",
"block.create.cuckoo_clock.tooltip.summary": "Un bel artisanat pour _décorer_ un espace et _garder_ la _notion_ _du_ _temps_.",
"block.create.cuckoo_clock.tooltip.condition1": "Lorsque tourné",
"block.create.cuckoo_clock.tooltip.condition1": "Quand tourné",
"block.create.cuckoo_clock.tooltip.behaviour1": "Affiche le _temps_ _présent_ et joue une mélodie deux fois par jour. _S'active_ une fois le _midi_ et une fois au crépuscule, dès que les _joueurs_ _peuvent_ _dormir_.",
"block.create.turntable.tooltip": "PLAQUE TOURNANTE",
"block.create.turntable.tooltip.summary": "Transforme la _force_ _de_ _rotation_ en une nausée.",
"block.create.turntable.tooltip.summary": "Transforme la _force_ _de_ _rotation_ en énergie cinétique.",
"block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE",
"block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.",
@ -1481,7 +1481,7 @@
"block.create.crushing_wheel.tooltip": "ROUE DE CONCASSAGE",
"block.create.crushing_wheel.tooltip.summary": "Grandes roues rotatives qui _cassent_ n'importe quoi.",
"block.create.crushing_wheel.tooltip.condition1": "Lorsque fixé à une autre roue de concassage",
"block.create.crushing_wheel.tooltip.condition1": "Quand fixé à une autre roue de concassage",
"block.create.crushing_wheel.tooltip.behaviour1": "Forme une machine de concassage pour traiter une variété de choses. Les dents des roues doivent se connecter et se déplacer avec la _même_ _vitesse_ dans des _directions_ _opposées_.",
"block.create.mechanical_press.tooltip": "PRESSE MÉCANIQUE",
@ -1511,11 +1511,11 @@
"block.create.mechanical_mixer.tooltip": "MIXEUR MÉCANIQUE",
"block.create.mechanical_mixer.tooltip.summary": "Un fouet cinétique pour appliquer toutes les recettes d'artisanat informes aux objets en dessous. Nécessite une _force_ _de_ _rotation_ constant et un _bassin_ placé en dessous (avec un espace entre les deux).",
"block.create.mechanical_mixer.tooltip.condition1": "Lorsqu'au-dessus d'un bassin",
"block.create.mechanical_mixer.tooltip.behaviour1": "Commence à mélanger les objets dans le bassin lorsque tous les ingrédients nécessaires sont présents.",
"block.create.mechanical_mixer.tooltip.behaviour1": "Commence à mélanger les objets dans le bassin Quand tous les ingrédients nécessaires sont présents.",
"block.create.mechanical_crafter.tooltip": "ÉTABLI MÉCANIQUE",
"block.create.mechanical_crafter.tooltip.summary": "Un assembleur cinétique pour _automatiser_ n'importe quelle recette _en_ _forme_. Placez-en _plusieurs_ _dans_ _une_ _grille_ correspondant à votre recette, et _arrangez_ _leurs_ _tapis_ _roulant_ pour créer un _flux_ qui sort de la grille sur l'un des établis.",
"block.create.mechanical_crafter.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_crafter.tooltip.condition1": "Quand tourné",
"block.create.mechanical_crafter.tooltip.behaviour1": "_Démarre_ _le_ _processus_ _d'artisanat_ dès que _tous_ les _établis_ dans la grille ont _reçu_ _un_ _objet_.",
"block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse",
"block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting process_ with all currently given _items_ in the grid.",
@ -1537,7 +1537,7 @@
"block.create.portable_storage_interface.tooltip": "INTERFACE DE STOCKAGE PORTABLE",
"block.create.portable_storage_interface.tooltip.summary": "Un point d'échange portable pour _déplacer_ des _objets_ vers et depuis une _structure_ déplacée par un piston, un roulement, un chariot ou une poulie.",
"block.create.portable_storage_interface.tooltip.condition1": "Lorsqu'en mouvement",
"block.create.portable_storage_interface.tooltip.behaviour1": "Interagit avec les _transposeurs_ stationnaires de sorte que les transposeurs faisant _face_ _autrepart_ de l'interface tirent les objets, et les transposeurs ciblant l'interface y _insereront_ les _objets_ de l'inventaire joint. L'engin se bloquera brièvement lorsque les objets seront échangés.",
"block.create.portable_storage_interface.tooltip.behaviour1": "Interagit avec les _transposeurs_ stationnaires de sorte que les transposeurs faisant _face_ _autrepart_ de l'interface tirent les objets, et les transposeurs ciblant l'interface y _insereront_ les _objets_ de l'inventaire joint. L'engin se bloquera brièvement Quand les objets seront échangés.",
"block.create.portable_storage_interface.tooltip.condition2": "UNLOCALIZED: When Powered by Redstone",
"block.create.portable_storage_interface.tooltip.behaviour2": "UNLOCALIZED: _Disengages_ any active connection immediately.",
@ -1555,17 +1555,17 @@
"block.create.mechanical_piston.tooltip": "PISTON MÉCANIQUE",
"block.create.mechanical_piston.tooltip.summary": "Une version plus avancée du _piston_. Il utilise une _force_ _de_ rotation_ pour déplacer précisément les structures attachées. Les _pôles_ _d'extension_ _de_ _piston_ à l'arrière définissent la _portée_ de cet appareil. Sans extensions, le piston ne bougera pas. Utilisez un _châssis_ ou un _bloc_ _de_ slime_ pour déplacer plus d'une seule ligne de blocs.",
"block.create.mechanical_piston.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_piston.tooltip.condition1": "Quand tourné",
"block.create.mechanical_piston.tooltip.behaviour1": "Commence à déplacer la structure attachée. La vitesse et la direction sont corrélées à la vitesse de rotation entrante.",
"block.create.piston_extension_pole.tooltip": "PÔLE DE PISTON",
"block.create.piston_extension_pole.tooltip": "BARRE DE PISTON",
"block.create.piston_extension_pole.tooltip.summary": "Étend la portée des _pistons_ _mécaniques.",
"block.create.piston_extension_pole.tooltip.condition1": "Lorsqu'attaché à un piston mécanique",
"block.create.piston_extension_pole.tooltip.behaviour1": "Étend la portée du _piston_ d'un bloc",
"block.create.mechanical_bearing.tooltip": "ROULEMENT MÉCANIQUE",
"block.create.mechanical_bearing.tooltip.summary": "Utilisé pour faire tourner de _plus_ _grande_ _structures_ ou pour exploiter une _force_ _de_ rotation_ contre le vent.",
"block.create.mechanical_bearing.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_bearing.tooltip.condition1": "Quand tourné",
"block.create.mechanical_bearing.tooltip.behaviour1": "Démarre les blocs attachés en rotation. Utilisez un _châssis_ ou _bloc_ _de_ _slime_ pour déplacer plus d'un seul bloc.",
"block.create.windmill_bearing.tooltip": "UNLOCALIZED: WINDMILL BEARING",
@ -1583,20 +1583,20 @@
"block.create.clockwork_bearing.tooltip": "ROULEMENT MÉCANIQUE HORLOGER",
"block.create.clockwork_bearing.tooltip.summary": "Une version avancée du _roulement_ _mécanique_ pour faire tourner jusqu'à deux _aiguilles_ _d'horloge_ en fonction du _temps_ _en-jeu_ actuel.",
"block.create.clockwork_bearing.tooltip.condition1": "Lorsque tourné",
"block.create.clockwork_bearing.tooltip.condition1": "Quand tourné",
"block.create.clockwork_bearing.tooltip.behaviour1": "Commence la rotation de la structure attachée vers l'_heure_ _actuelle_. Si une seconde structure est présente, elle servira _d'aiguille_ _des_ _minutes_.",
"block.create.sequenced_gearshift.tooltip": "DÉCALEUR DE ROTATION SÉQUENCÉ",
"block.create.sequenced_gearshift.tooltip": "BOÎITE À VITESSES SÉQUENCÉE",
"block.create.sequenced_gearshift.tooltip.summary": "Un _composant_ _utilitaire_ _programmable_, qui peut changer son _débit_ _de_ _rotation_ suivant jusqu'à _5_ _instructions_ _consécutives_. Utilisez-le pour alimenter des roulements mécaniques, des pistons ou des poulies avec plus de contrôle sur le timing et la vitesse. Peut devenir moins précis à des vitesses plus élevées.",
"block.create.sequenced_gearshift.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.sequenced_gearshift.tooltip.behaviour1": "_Commence_ _à_ _exécuter_ les instructions programmées en fonction de la vitesse d'entrée.",
"block.create.sequenced_gearshift.tooltip.condition2": "Clic droit",
"block.create.sequenced_gearshift.tooltip.behaviour2": "Ouvre _l'interface_ _de_ _configuration_",
"block.create.cart_assembler.tooltip": "ASSEMBLEUR DE CHARIOT",
"block.create.cart_assembler.tooltip.summary": "Monte une structure connectée sur un _chariot_ _passant_.",
"block.create.cart_assembler.tooltip": "ASSEMBLEUR DE WAGON",
"block.create.cart_assembler.tooltip.summary": "Monte une structure connectée sur un _wagon_ _passant_.",
"block.create.cart_assembler.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.cart_assembler.tooltip.behaviour1": "_Démonte_ les structures montées un _chariot_ _passant_ et les remet dans le monde.",
"block.create.cart_assembler.tooltip.behaviour1": "_Démonte_ les structures montées un _wagon passant_ et les remet dans le monde.",
"block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: Carriage Contraptions",
"block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: Two cart assembers _connected by_ a _structure_ will, once both contain a minecart, connect those carts with a _contraption mounted between_ the _two_ of them. The structure will behave similarly to a _Minecart Coupling_.",
"block.create.cart_assembler.tooltip.control1": "UNLOCALIZED: When placed above Rail",
@ -1608,35 +1608,35 @@
"block.create.cart_assembler.tooltip.control4": "UNLOCALIZED: When placed above Activator Rail",
"block.create.cart_assembler.tooltip.action4": "UNLOCALIZED: _Disassembles_ carts when powered.",
"block.create.rope_pulley.tooltip": "POULIE DE CORDE",
"block.create.rope_pulley.tooltip": "POULIE",
"block.create.rope_pulley.tooltip.summary": "Déplace les _blocs_ et _structures_ attachés _verticalement_. Utilisez un _châssis_ ou _bloc_ _de_ _slime_ pour déplacer plus d'un seul bloc.",
"block.create.rope_pulley.tooltip.condition1": "Lorsque tourné",
"block.create.rope_pulley.tooltip.condition1": "Quand tourné",
"block.create.rope_pulley.tooltip.behaviour1": "Commence à déplacer la structure attachée. La vitesse et la direction sont corrélées à la vitesse de rotation entrante.",
"block.create.linear_chassis.tooltip": "CHÂSSIS DE TRADUCTION",
"block.create.linear_chassis.tooltip": "CHÂSSIS LINÉAIRE",
"block.create.linear_chassis.tooltip.summary": "Un bloc de base configurable reliant les structures pour le mouvement.",
"block.create.linear_chassis.tooltip.condition1": "Lorsque déplacé",
"block.create.linear_chassis.tooltip.condition1": "Quand déplacé",
"block.create.linear_chassis.tooltip.behaviour1": "_Déplace_ tous les _châssis_ _attachés_ avec la même orientation, et une colonne de blocs dans sa portée. Les blocs ne seront tirés que si la face du châssis est _collante_ (Voir [Ctrl]).",
"block.create.linear_chassis.tooltip.condition2": "Lorsqu'utilisé avec une clé",
"block.create.linear_chassis.tooltip.behaviour2": "Configurez la _portée_ pour ce bloc de châssis. Maintenez CTRL pour modifier également la plage de tous les blocs de châssis connectés.",
"block.create.linear_chassis.tooltip.control1": "Clic droit avec une boule de slime",
"block.create.linear_chassis.tooltip.action1": "Rends la face _collante_. Lorsque déplace, le châssis va _tirer_ les blocs attachés, quelle que soit la direction du mouvement.",
"block.create.linear_chassis.tooltip.action1": "Rend la face _collante_. Quand déplacé, le châssis va _tirer_ les blocs attachés, quelle que soit la direction du mouvement.",
"block.create.secondary_linear_chassis.tooltip": "UNLOCALIZED: SECONDARY LINEAR CHASSIS",
"block.create.secondary_linear_chassis.tooltip.summary": "UNLOCALIZED: A second type of _Linear Chassis_ that does not connect to the other.",
"block.create.secondary_linear_chassis.tooltip": "CHÂSSIS LINÉAIRE SECONDAIRE",
"block.create.secondary_linear_chassis.tooltip.summary": "Un deuxième type de _châssis linéaire_ qui ne se connecte pas au premier.",
"block.create.radial_chassis.tooltip": "CHÂSSIS DE ROTATION",
"block.create.radial_chassis.tooltip.summary": "Un bloc de base configurable reliant les structures pour le mouvement.",
"block.create.radial_chassis.tooltip.condition1": "Lorsque déplacé",
"block.create.radial_chassis.tooltip.condition1": "Quand déplacé",
"block.create.radial_chassis.tooltip.behaviour1": "_Déplace_ tous les _châssis_ _attachés_ en colonne, et un cylindre de blocs autour de lui. Les blocs qui l'entourent ne sont déplacés que lorsqu'ils sont à portée et attachés à un côté collant (voir [Ctrl]).",
"block.create.radial_chassis.tooltip.condition2": "Lorsqu'utilisé avec une clé",
"block.create.radial_chassis.tooltip.behaviour2": "Configure la _portée_ pour ce bloc de châssis. Maintenez CTRL pour modifier également la portée de tous les blocs de châssis connectés.",
"block.create.radial_chassis.tooltip.control1": "Clic droit avec une boule de slime",
"block.create.radial_chassis.tooltip.action1": "Rend la face _collante_. Lorsque le châssis se déplace, tous les blocs désignés attachés au côté collant sont déplacés avec lui.",
"block.create.radial_chassis.tooltip.action1": "Rend la face _collante_. Quand le châssis se déplace, tous les blocs désignés attachés au côté collant sont déplacés avec lui.",
"block.create.mechanical_drill.tooltip": "PERCEUSE MÉCANIQUE",
"block.create.mechanical_drill.tooltip.summary": "Un dispositif mécanique adapté pour _casser_ les _blocs_. Il est déplaceable avec _pistons_ _mécaniques_ ou _roulements_.",
"block.create.mechanical_drill.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_drill.tooltip.condition1": "Quand tourné",
"block.create.mechanical_drill.tooltip.behaviour1": "Agit comme un casseur de bloc _stationnaire_. Inflige aussi des _dégats_ aux _entités_ se situant dans sa zone effective.",
"block.create.mechanical_drill.tooltip.condition2": "Lorsqu'en mouvement",
"block.create.mechanical_drill.tooltip.behaviour2": "Casse les blocs avec lesquels la perceuse entre en collision.",
@ -1646,36 +1646,36 @@
"block.create.mechanical_harvester.tooltip.condition1": "Lorsqu'en mouvement",
"block.create.mechanical_harvester.tooltip.behaviour1": "_Récolte_ toutes les _cultures_ _matures_ que la lame entre en touche et les remet à leur état de croissance initial.",
"block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH",
"block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.",
"block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving",
"block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks blocks_ which _cannot be collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills soil blocks_ as though a Hoe would be used on them.",
"block.create.mechanical_plough.tooltip": "CHARRUE MÉCANIQUE",
"block.create.mechanical_plough.tooltip.summary": "Une charrue mécanique a divers usages. Elle peut être déplacée à l'aide de _pistons mécaniques_, de _roulements_ ou d'autres dispositifs de commande.",
"block.create.mechanical_plough.tooltip.condition1": "Lorsquen mouvement",
"block.create.mechanical_plough.tooltip.behaviour1": "_Casse les blocs_ avec lesquels _on ne peut pas entrer en collision_, tels que les torches, les sentiers ou les couches de neige. _Applique_ son _mouvement_ aux _entités_ sans les blesser. _Bêche les blocs de terre_ comme si une houe était utilisée sur ceux-ci.",
"block.create.mechanical_saw.tooltip": "SCIE MÉCANIQUE",
"block.create.mechanical_saw.tooltip.summary": "Convient pour _couper_ des _arbres_ efficacement et pour _tailler_ des _blocs_ dans leurs homologues menuisés. Il est déplaceable à l'aide de _pistons_ _mécaniques_ ou _roulements_.",
"block.create.mechanical_saw.tooltip.condition1": "Lorsque tourné vers le haut",
"block.create.mechanical_saw.tooltip.behaviour1": "Applique les _recettes_ de _sciage_ et de _taillerie_ aux éléments jetés ou insérés dedans. Lorsque plusieurs sorties sont possibles, il les parcourt à moins qu'un _filtre_ ne soit affecté.",
"block.create.mechanical_saw.tooltip.summary": "Convient pour _couper_ des _rotors_ efficacement et pour _tailler_ des _blocs_ dans leurs homologues menuisés. Il est déplaceable à l'aide de _pistons_ _mécaniques_ ou _roulements_.",
"block.create.mechanical_saw.tooltip.condition1": "Quand tourné vers le haut",
"block.create.mechanical_saw.tooltip.behaviour1": "Applique les _recettes_ de _sciage_ et de _taillerie_ aux éléments jetés ou insérés dedans. Quand plusieurs sorties sont possibles, il les parcourt à moins qu'un _filtre_ ne soit affecté.",
"block.create.mechanical_saw.tooltip.condition2": "Lorsqu'à l'horizontal",
"block.create.mechanical_saw.tooltip.behaviour2": "_Casse_ les _troncs_ devant elle. Si le tronc a supportait un arbre, _l'arbre_ _tombera_ loin de la scie.",
"block.create.mechanical_saw.tooltip.behaviour2": "_Casse_ les _troncs_ devant elle. Si le tronc a supportait un rotor, _le rotor_ _tombera_ loin de la scie.",
"block.create.mechanical_saw.tooltip.condition3": "Lorsqu'en mouvement",
"block.create.mechanical_saw.tooltip.behaviour3": "_Coupe_ tous les _arbres_ avec lesquels la scie entre en collision.",
"block.create.mechanical_saw.tooltip.behaviour3": "_Coupe_ tous les _rotors_ avec lesquels la scie entre en collision.",
"block.create.stockpile_switch.tooltip": "DÉTÉCTEUR DE STOCKAGE",
"block.create.stockpile_switch.tooltip.summary": "Bascule un signal Redstone basé sur _l'espace_ _de_ _stockage_ dans le conteneur attaché.",
"block.create.stockpile_switch.tooltip.condition1": "Lorsqu'en dessous de la limite de stockage minimum",
"block.create.stockpile_switch.tooltip.behaviour1": "Arrête de fournir de _l'énergie_",
"block.create.content_observer.tooltip": "UNLOCALIZED: CONTENT OBSERVER",
"block.create.content_observer.tooltip.summary": "UNLOCALIZED: _Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.",
"block.create.content_observer.tooltip": "OBSERVATEUR DE CONTENU",
"block.create.content_observer.tooltip.summary": "_Détecte les objets_ à l'intérieur des _conteneurs_ et des _transporteurs_ correspondant à un _filtre_ configuré. Tant que l'_inventaire_, le _tapis roulant_ ou la _glissière_ observé _contient_ un objet correspondant, ce composant émet un _signal de redstone_. Quand un _entonnoir_ observé _transfère_ un objet correspondant, ce composant émet une _impulsion de redstone_.",
"block.create.redstone_link.tooltip": "LIAISON REDSTONE",
"block.create.redstone_link.tooltip.summary": "Points de terminaison pour les connexions de _redstone_ _sans-fil_. Peut être attribué des _fréquences_ en utilisant n'importe quel objet. La portée du signal est limitée, quoique raisonnablement loin.",
"block.create.redstone_link.tooltip.condition1": "Lorsqu'alimenté",
"block.create.redstone_link.tooltip.behaviour1": "La réception de liens de la même _fréquence_ produira un signal redstone.",
"block.create.redstone_link.tooltip": "LIEN DE REDSTONE",
"block.create.redstone_link.tooltip.summary": "Terminaux pour les connexions de _redstone_ _sans-fil_. Peut être attribué des _fréquences_ en utilisant n'importe quel objet. La portée du signal est limitée, nonobstant raisonnablement loin.",
"block.create.redstone_link.tooltip.condition1": "Quand alimenté",
"block.create.redstone_link.tooltip.behaviour1": "Les liens de la même _fréquence_ configurés en réception produira un signal redstone.",
"block.create.redstone_link.tooltip.control1": "Clic droit avec un objet",
"block.create.redstone_link.tooltip.action1": "Définit la _fréquence_ sur cet élément. Un total de _deux_ _différents_ _objets_ peuvent être utilisés en combinaison pour définir une fréquence.",
"block.create.redstone_link.tooltip.control2": "Clic droit en étant accroupi",
"block.create.redstone_link.tooltip.action2": "TBascule entre le mode _receveur_ et _transmetteur_.",
"block.create.redstone_link.tooltip.action2": "Bascule entre le mode _récepteur_ et _transmetteur_.",
"block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE",
"block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ and _Text Display_.",
@ -1684,12 +1684,12 @@
"block.create.nixie_tube.tooltip.condition2": "UNLOCALIZED: With Name Tag",
"block.create.nixie_tube.tooltip.behaviour2": "UNLOCALIZED: Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.",
"block.create.redstone_contact.tooltip": "redstone_contact REDSTONE",
"block.create.redstone_contact.tooltip.summary": "N'émet de l'énergie que par paires. Il est mobile avec _pistons_ _mécaniques_ ou _roulements_.",
"block.create.redstone_contact.tooltip.condition1": "Lorsque tourné vers un autre redstone_contact",
"block.create.redstone_contact.tooltip.behaviour1": "Fournit un _signal_ _redstone_.",
"block.create.redstone_contact.tooltip.condition2": "Lorsqu'en mouvement",
"block.create.redstone_contact.tooltip.behaviour2": "Déclenche tous les redstone_contacts fixes qu'il passe.",
"block.create.redstone_contact.tooltip": "CONTACT DE REDSTONE",
"block.create.redstone_contact.tooltip.summary": "N'émet de l'énergie que par paires. Il est mobile avec des _pistons_ _mécaniques_ ou _roulements_.",
"block.create.redstone_contact.tooltip.condition1": "Quand tourné vers un autre contact de redstone",
"block.create.redstone_contact.tooltip.behaviour1": "Fournit un _signal_ de _redstone_.",
"block.create.redstone_contact.tooltip.condition2": "Quand en mouvement",
"block.create.redstone_contact.tooltip.behaviour2": "Déclenche tous les contacts de redstone fixes qu'il passe.",
"block.create.adjustable_crate.tooltip": "CAISSE AJUSTABLE",
"block.create.adjustable_crate.tooltip.summary": "Ce _conteneur_ _de_ _stockage_ permet un contrôle manuel de sa capacité. Il peut contenir jusqu'à _16_ _piles_ de n'importe quel objet. Prend en charge les _comparateurs_ _de_ _redstone_.",
@ -1698,20 +1698,20 @@
"block.create.creative_crate.tooltip": "CAISSE CRÉATIVE",
"block.create.creative_crate.tooltip.summary": "Fournit une réserve infinie de blocs aux _Schémacanons_ adjacents.",
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.creative_crate.tooltip.condition1": "Quand un objet se trouve dans l'emplacement de filtrage",
"block.create.creative_crate.tooltip.behaviour1": "Tout ce qui _extrait_ de ce conteneur aura une _alimentation illimitée_ de l'objet spécifié. Les objets _insérés_ dans cette caisse seront _éliminés_.",
"block.create.deployer.tooltip": "DÉPLOYEUR",
"block.create.deployer.tooltip.summary": "_Frappe_, _utilise_ et _active_. Cette machine essaiera _d'imiter_ un _joueur_ autant que possible. Peut _prendre_ et _déposer_ des _objets_ dans _l'inventaire_ adjacent. Peut être affecté à une pile d'éléments en tant que _filtre_.",
"block.create.deployer.tooltip.condition1": "Lorsque tourné",
"block.create.deployer.tooltip.condition1": "Quand tourné",
"block.create.deployer.tooltip.behaviour1": "Étend son bras et _active_ dans l'espace de bloc _2m_ _devant_ de lui-même.",
"block.create.deployer.tooltip.condition2": "Clic droit avec une clé",
"block.create.deployer.tooltip.behaviour2": "Bascule le mode frappe. Dans le _mode_ _frappe_, le déployeur tentera d'utiliser son élément pour _casser_ les _blocs_ ou infliger des _dégats_ aux _entités_.",
"block.create.deployer.tooltip.condition3": "UNLOCALIZED: When Filter assigned",
"block.create.deployer.tooltip.behaviour3": "UNLOCALIZED: Deployer will not activate unless held item _matches_ the _filter._ Items not matching cannot be inserted; Held items matching the filter cannot be extracted.",
"block.create.deployer.tooltip.condition3": "Quand un filtre est attribué",
"block.create.deployer.tooltip.behaviour3": "Le déploiement n'est activé que si l'élément tenu _correspond_ au _filtre._ Les éléments ne correspondant pas ne peuvent pas être insérés ; les éléments tenus correspondant au filtre ne peuvent pas être extraits.",
"block.create.brass_casing.tooltip": "BOÎTIER EN LAITON",
"block.create.brass_casing.tooltip.summary": "Boîtier de machine robuste avec une variété d'utilisations. Sans danger pour la décoration.",
"block.create.brass_casing.tooltip": "REVÊTEMENT EN LAITON",
"block.create.brass_casing.tooltip.summary": "Revêtement de machine robuste avec une variété d'utilisations. Sans danger pour la décoration.",
"block.create.pulse_repeater.tooltip": "RÉPÉTEUR D'IMPULSIONS",
"block.create.pulse_repeater.tooltip.summary": "Un circuit simple pour couper les signaux de redstone passant à une longueur de _1_ _tick_.",
@ -1738,28 +1738,28 @@
"block.create.speedometer.tooltip": "COMPTEUR DE VITESSE",
"block.create.speedometer.tooltip.summary": "Mesure et affiche la _ vitesse de rotation _ des composants cinétiques attachés. Prend en charge les _comparateurs_ _de_ _redstone_.",
"block.create.speedometer.tooltip.condition1": "Lorsque tourné",
"block.create.speedometer.tooltip.condition1": "Quand tourné",
"block.create.speedometer.tooltip.behaviour1": "Indique une couleur correspondant au niveau de vitesse. _Vert_ indique une rotation lente, _Bleu_ modérée et _violet_ rapide. Certains composants mécaniques nécessitent une vitesse suffisante pour fonctionner correctement.",
"block.create.stressometer.tooltip": "STRESSOMÈTRE",
"block.create.stressometer.tooltip.summary": "Mesure et affiche la _stress__ globale du réseau cinétique attaché. Prend en charge les _comparateurs_ _de_ _redstone_.",
"block.create.stressometer.tooltip.condition1": "Lorsque tourné",
"block.create.stressometer.tooltip.condition1": "Quand tourné",
"block.create.stressometer.tooltip.behaviour1": "Indique une couleur correspondant au niveau de contrainte. Les _réseaux_ _surchargés_ cesseront de bouger. Le stress peut être soulagé en ajoutant plus de _sources_ _rotationnelles_ au réseau.",
"item.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER",
"item.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish materials_. Can be automatically applied using the Deployer.",
"item.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used",
"item.create.sand_paper.tooltip.behaviour1": "UNLOCALIZED: Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_",
"item.create.sand_paper.tooltip": "PAPIER DE VERRE",
"item.create.sand_paper.tooltip.summary": "Un papier rugueux qui peut être utilisé pour _polir des matériaux_. Peut être appliqué automatiquement à l'aide du déployeur.",
"item.create.sand_paper.tooltip.condition1": "Quand utilisé",
"item.create.sand_paper.tooltip.behaviour1": "Polit les objets qui se tenus dans la _main secondaire_ ou par terre quand on les _regarde_.",
"item.create.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE",
"item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.",
"item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used",
"item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged along_ when moved by _mechanical pistons_, _bearings_ and other controllers.",
"item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand",
"item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically attaches_ blocks placed from the main hand to the _side_ they were _placed against._",
"item.create.super_glue.tooltip": "COLLE EXTRA-FORTE",
"item.create.super_glue.tooltip.summary": "Collez un bloc à un autre, et ils seront à jamais inséparables.",
"item.create.super_glue.tooltip.condition1": "Quand utilisé",
"item.create.super_glue.tooltip.behaviour1": "Rend la face _cliquée_ d'un bloc _collante_. Les blocs attachés aux faces collantes seront entraînés par des _pistons mécaniques_, _des roulements_ et d'autres contrôleurs.",
"item.create.super_glue.tooltip.condition2": "Quand tenu en main secondaire",
"item.create.super_glue.tooltip.behaviour2": "Attache automatiquement les blocs placés de la main principale à la _face_ contre laquelle ils ont été _placés_.",
"item.create.builders_tea.tooltip": "UNLOCALIZED: BUILDERS TEA",
"item.create.builders_tea.tooltip.summary": "UNLOCALIZED: The perfect drink to get the day started- _Motivating_ and _Saturating._",
"item.create.builders_tea.tooltip": "THÉ DU CONSTRUCTEUR",
"item.create.builders_tea.tooltip.summary": "La boisson parfaite pour commencer la journée - _motivante_ et _rasasiante_.",
"item.create.refined_radiance.tooltip": "ÉCLAT RAFFINÉ",
"item.create.refined_radiance.tooltip.summary": "Un matériau chromatique forgé à partir de _lumière_ _absorbée_.",
@ -1767,7 +1767,7 @@
"item.create.shadow_steel.tooltip": "ACIER SOMBRE",
"item.create.shadow_steel.tooltip.summary": "Un matériau chromatique forgé _dans_ _le_ _néant_.",
"item.create.minecart_coupling.tooltip": "UNLOCALIZED: MINECART COUPLING",
"item.create.minecart_coupling.tooltip": "LIEN POUR WAGONS",
"item.create.minecart_coupling.tooltip.summary": "UNLOCALIZED: _Chains_ all your _Minecarts_ or _Carriage Contraptions_ together to form a majestic Train.",
"item.create.minecart_coupling.tooltip.condition1": "UNLOCALIZED: When Used on Minecart",
"item.create.minecart_coupling.tooltip.behaviour1": "UNLOCALIZED: _Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.",
@ -1780,7 +1780,7 @@
"create.tooltip.randomWipDescription0": "Veuillez garder cet objet hors de portée des enfants.",
"create.tooltip.randomWipDescription1": "Un bébé panda meurt chaque fois que vous utilisez cet objet. Chaque. Fois.",
"create.tooltip.randomWipDescription2": "À utiliser à vos risques et périls.",
"create.tooltip.randomWipDescription3": "Ce n'est pas l'objet que vous recherchez, *agites les doigts* veuillez vous disperser.",
"create.tooltip.randomWipDescription3": "Ce n'est pas l'objet que vous recherchez, *agite les doigts* circulez.",
"create.tooltip.randomWipDescription4": "Cet objet s'autodétruit en 10 secondes. 10, 9, 8...",
"create.tooltip.randomWipDescription5": "Croyez-moi, c'est inutile.",
"create.tooltip.randomWipDescription6": "En utilisant cet article, vous êtes responsables et acceptez ses conditions.",

View file

@ -23,6 +23,7 @@
"create:redstone_link",
"create:analog_lever",
"create:adjustable_repeater",
"create:adjustable_pulse_repeater"
"create:adjustable_pulse_repeater",
"#minecraft:signs"
]
}

View file

@ -187,5 +187,7 @@ public class AllTags {
AllBlockTags.FAN_TRANSPARENT.add(Blocks.IRON_BARS);
AllBlockTags.FAN_HEATERS.add(Blocks.MAGMA_BLOCK, Blocks.CAMPFIRE, Blocks.LAVA, Blocks.FIRE);
AllBlockTags.SAFE_NBT.includeAll(BlockTags.SIGNS);
}
}

View file

@ -8,7 +8,6 @@ import java.util.stream.Collectors;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.compat.jei.category.animations.AnimatedCrafter;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import mezz.jei.api.constants.VanillaTypes;

View file

@ -1,6 +1,5 @@
package com.simibubi.create.content.contraptions.components.fan;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock;
@ -33,9 +32,16 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<Enca
@Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, worldIn, pos, oldState, isMoving);
blockUpdate(state, worldIn, pos);
}
@Override
public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) {
super.updateNeighbors(stateIn, worldIn, pos, flags);
blockUpdate(stateIn, worldIn, pos);
}
@Override
public void onReplaced(BlockState state, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) {
if (state.hasTileEntity() && (state.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) {
@ -70,13 +76,13 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<Enca
.isSneaking() ? preferredFacing : preferredFacing.getOpposite());
}
protected void blockUpdate(BlockState state, World worldIn, BlockPos pos) {
protected void blockUpdate(BlockState state, IWorld worldIn, BlockPos pos) {
if (worldIn instanceof WrappedWorld)
return;
notifyFanTile(worldIn, pos);
if (worldIn.isRemote)
if (worldIn.isRemote())
return;
withTileEntityDo(worldIn, pos, te -> te.updateGenerator(state.get(FACING)));
withTileEntityDo(worldIn, pos, te -> te.queueGeneratorUpdate());
}
protected void notifyFanTile(IWorld world, BlockPos pos) {

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.fan;
import javax.annotation.Nullable;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
@ -18,7 +19,6 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@MethodsReturnNonnullByDefault
public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements IAirCurrentSource {
@ -27,18 +27,21 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
protected int entitySearchCooldown;
protected boolean isGenerator;
protected boolean updateAirFlow;
protected boolean updateGenerator;
public EncasedFanTileEntity(TileEntityType<? extends EncasedFanTileEntity> type) {
super(type);
isGenerator = false;
airCurrent = new AirCurrent(this);
updateAirFlow = true;
updateGenerator = false;
}
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
super.read(compound, clientPacket);
isGenerator = compound.getBoolean("Generating");
if (!wasMoved)
isGenerator = compound.getBoolean("Generating");
if (clientPacket)
airCurrent.rebuild();
}
@ -64,12 +67,20 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
return isGenerator ? AllConfigs.SERVER.kinetics.generatingFanSpeed.get() : 0;
}
public void updateGenerator(Direction facing) {
boolean shouldGenerate = world.isBlockPowered(pos) && facing == Direction.DOWN
&& world.isBlockPresent(pos.down()) && blockBelowIsHot();
if (shouldGenerate == isGenerator)
public void queueGeneratorUpdate() {
updateGenerator = true;
}
public void updateGenerator() {
BlockState blockState = getBlockState();
if (!AllBlocks.ENCASED_FAN.has(blockState))
return;
if (blockState.get(EncasedFanBlock.FACING) != Direction.DOWN)
return;
boolean shouldGenerate = world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot();
if (shouldGenerate == isGenerator)
return;
isGenerator = shouldGenerate;
updateGeneratedRotation();
}
@ -171,6 +182,11 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
sendData();
}
if (updateGenerator) {
updateGenerator = false;
updateGenerator();
}
if (getSpeed() == 0 || isGenerator)
return;

View file

@ -23,6 +23,7 @@ import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllMovementBehaviours;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.actors.SeatBlock;
import com.simibubi.create.content.contraptions.components.actors.SeatEntity;
@ -35,6 +36,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.glu
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonHeadBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonExtensionPoleBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock.MagnetBlock;
@ -50,6 +52,7 @@ import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
import com.simibubi.create.foundation.utility.BlockFace;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.NBTProcessors;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
@ -72,6 +75,7 @@ import net.minecraft.nbt.NBTUtil;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.state.properties.ChestType;
import net.minecraft.state.properties.DoubleBlockHalf;
import net.minecraft.state.properties.PistonType;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
@ -267,25 +271,11 @@ public abstract class Contraption {
if (AllBlocks.BELT.has(state))
moveBelt(pos, frontier, visited, state);
if (AllBlocks.GANTRY_PINION.has(state)) {
BlockPos offset = pos.offset(state.get(GantryPinionBlock.FACING));
if (!visited.contains(offset))
frontier.add(offset);
}
if (AllBlocks.GANTRY_PINION.has(state))
moveGantryPinion(world, pos, frontier, visited, state);
if (AllBlocks.GANTRY_SHAFT.has(state))
for (Direction d : Iterate.directions) {
BlockPos offset = pos.offset(d);
if (!visited.contains(offset)) {
BlockState offsetState = world.getBlockState(offset);
Direction facing = state.get(GantryShaftBlock.FACING);
if (d.getAxis() == facing.getAxis() && AllBlocks.GANTRY_SHAFT.has(offsetState)
&& offsetState.get(GantryShaftBlock.FACING) == facing)
frontier.add(offset);
else if (AllBlocks.GANTRY_PINION.has(offsetState) && offsetState.get(GantryPinionBlock.FACING) == d)
frontier.add(offset);
}
}
moveGantryShaft(world, pos, frontier, visited, state);
// Bearings potentially create stabilized sub-contraptions
if (AllBlocks.MECHANICAL_BEARING.has(state))
@ -303,6 +293,10 @@ public abstract class Contraption {
if (state.getBlock() instanceof MechanicalPistonBlock)
if (!moveMechanicalPiston(world, pos, frontier, visited, state))
return false;
if (isExtensionPole(state))
movePistonPole(world, pos, frontier, visited, state);
if (isPistonHead(state))
movePistonHead(world, pos, frontier, visited, state);
// Doors try to stay whole
if (state.getBlock() instanceof DoorBlock) {
@ -358,6 +352,83 @@ public abstract class Contraption {
return blocks.size() <= AllConfigs.SERVER.kinetics.maxBlocksMoved.get();
}
protected void movePistonHead(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
Direction direction = state.get(MechanicalPistonHeadBlock.FACING);
BlockPos offset = pos.offset(direction.getOpposite());
if (!visited.contains(offset)) {
BlockState blockState = world.getBlockState(offset);
if (isExtensionPole(blockState) && blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() == direction.getAxis())
frontier.add(offset);
if (blockState.getBlock() instanceof MechanicalPistonBlock) {
Direction pistonFacing = blockState.get(MechanicalPistonBlock.FACING);
if (pistonFacing == direction && blockState.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED)
frontier.add(offset);
}
}
if (state.get(MechanicalPistonHeadBlock.TYPE) == PistonType.STICKY) {
BlockPos attached = pos.offset(direction);
if (!visited.contains(attached))
frontier.add(attached);
}
}
protected void movePistonPole(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
for (Direction d : Iterate.directionsInAxis(state.get(PistonExtensionPoleBlock.FACING)
.getAxis())) {
BlockPos offset = pos.offset(d);
if (!visited.contains(offset)) {
BlockState blockState = world.getBlockState(offset);
if (isExtensionPole(blockState) && blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() == d.getAxis())
frontier.add(offset);
if (isPistonHead(blockState) && blockState.get(MechanicalPistonHeadBlock.FACING)
.getAxis() == d.getAxis())
frontier.add(offset);
if (blockState.getBlock() instanceof MechanicalPistonBlock) {
Direction pistonFacing = blockState.get(MechanicalPistonBlock.FACING);
if (pistonFacing == d || pistonFacing == d.getOpposite()
&& blockState.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED)
frontier.add(offset);
}
}
}
}
protected void moveGantryPinion(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
BlockPos offset = pos.offset(state.get(GantryPinionBlock.FACING));
if (!visited.contains(offset))
frontier.add(offset);
Axis rotationAxis = ((IRotate) state.getBlock()).getRotationAxis(state);
for (Direction d : Iterate.directionsInAxis(rotationAxis)) {
offset = pos.offset(d);
BlockState offsetState = world.getBlockState(offset);
if (AllBlocks.GANTRY_SHAFT.has(offsetState) && offsetState.get(GantryShaftBlock.FACING)
.getAxis() == d.getAxis())
if (!visited.contains(offset))
frontier.add(offset);
}
}
protected void moveGantryShaft(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
for (Direction d : Iterate.directions) {
BlockPos offset = pos.offset(d);
if (!visited.contains(offset)) {
BlockState offsetState = world.getBlockState(offset);
Direction facing = state.get(GantryShaftBlock.FACING);
if (d.getAxis() == facing.getAxis() && AllBlocks.GANTRY_SHAFT.has(offsetState)
&& offsetState.get(GantryShaftBlock.FACING) == facing)
frontier.add(offset);
else if (AllBlocks.GANTRY_PINION.has(offsetState) && offsetState.get(GantryPinionBlock.FACING) == d)
frontier.add(offset);
}
}
}
private void moveBearing(BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited, BlockState state) {
Direction facing = state.get(MechanicalBearingBlock.FACING);
if (!canBeStabilized(facing, pos.subtract(anchor))) {
@ -410,47 +481,25 @@ public abstract class Contraption {
private boolean moveMechanicalPiston(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get();
Direction direction = state.get(MechanicalPistonBlock.FACING);
if (state.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) {
BlockPos searchPos = pos;
while (limit-- >= 0) {
searchPos = searchPos.offset(direction);
BlockState blockState = world.getBlockState(searchPos);
if (isExtensionPole(blockState)) {
if (blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() != direction.getAxis())
break;
if (!visited.contains(searchPos))
frontier.add(searchPos);
continue;
}
if (isPistonHead(blockState))
if (!visited.contains(searchPos))
frontier.add(searchPos);
break;
}
if (limit <= -1)
return false;
}
BlockPos searchPos = pos;
while (limit-- >= 0) {
searchPos = searchPos.offset(direction.getOpposite());
BlockState blockState = world.getBlockState(searchPos);
if (isExtensionPole(blockState)) {
if (blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() != direction.getAxis())
break;
if (!visited.contains(searchPos))
frontier.add(searchPos);
continue;
}
break;
}
if (limit <= -1)
PistonState pistonState = state.get(MechanicalPistonBlock.STATE);
if (pistonState == PistonState.MOVING)
return false;
BlockPos offset = pos.offset(direction.getOpposite());
if (!visited.contains(offset)) {
BlockState poleState = world.getBlockState(offset);
if (AllBlocks.PISTON_EXTENSION_POLE.has(poleState) && poleState.get(PistonExtensionPoleBlock.FACING)
.getAxis() == direction.getAxis())
frontier.add(offset);
}
if (pistonState == PistonState.EXTENDED || MechanicalPistonBlock.isStickyPiston(state)) {
offset = pos.offset(direction);
if (!visited.contains(offset))
frontier.add(offset);
}
return true;
}
@ -837,6 +886,8 @@ public abstract class Contraption {
TileEntity tileEntity = world.getTileEntity(targetPos);
CompoundNBT tag = block.nbt;
if (tileEntity != null)
tag = NBTProcessors.process(tileEntity, tag, false);
if (tileEntity != null && tag != null) {
tag.putInt("x", targetPos.getX());
tag.putInt("y", targetPos.getY());
@ -867,9 +918,10 @@ public abstract class Contraption {
}
}
for (BlockInfo block : blocks.values()) {
BlockPos targetPos = transform.apply(block.pos);
if (!shouldUpdateAfterMovement(block))
continue;
BlockPos targetPos = transform.apply(block.pos);
BlockState state = world.getBlockState(targetPos);
world.markAndNotifyBlock(targetPos, null, block.state, block.state,
BlockFlags.IS_MOVING | BlockFlags.DEFAULT);
}

View file

@ -10,11 +10,15 @@ import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
@ -34,10 +38,15 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT
.getAxis() != direction.getAxis();
}
@Override
public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) {
super.updateNeighbors(stateIn, worldIn, pos, flags);
withTileEntityDo(worldIn, pos, GantryPinionTileEntity::checkValidGantryShaft);
}
@Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, worldIn, pos, oldState, isMoving);
withTileEntityDo(worldIn, pos, GantryPinionTileEntity::checkValidGantryShaft);
}
@Override
@ -50,6 +59,18 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT
return context.getFace();
}
public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) {
if (!player.isAllowEdit() || player.isSneaking())
return ActionResultType.PASS;
if (player.getHeldItem(handIn)
.isEmpty()) {
withTileEntityDo(worldIn, pos, te -> te.checkValidGantryShaft());
return ActionResultType.SUCCESS;
}
return ActionResultType.PASS;
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState stateForPlacement = super.getStateForPlacement(context);

View file

@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Direction;
@ -45,22 +46,26 @@ public class ContraptionInteractionPacket extends SimplePacketBase {
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity sender = context.get()
.getSender();
if (sender == null)
return;
Entity entityByID = sender.getServerWorld()
.getEntityByID(target);
if (!(entityByID instanceof AbstractContraptionEntity))
return;
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
if (contraptionEntity.handlePlayerInteraction(sender, localPos, face, interactionHand))
sender.swingHand(interactionHand, true);
});
context.get()
.setPacketHandled(true);
context.get().enqueueWork(() -> {
ServerPlayerEntity sender = context.get().getSender();
if (sender == null)
return;
Entity entityByID = sender.getServerWorld().getEntityByID(target);
if (!(entityByID instanceof AbstractContraptionEntity))
return;
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
double d = sender.getAttribute(PlayerEntity.REACH_DISTANCE).getValue();
if (!sender.canEntityBeSeen(entityByID))
d -= 3;
d *= d;
if (sender.getDistanceSq(entityByID) > d) {
// TODO log?
return;
}
if (contraptionEntity.handlePlayerInteraction(sender, localPos, face, interactionHand))
sender.swingHand(interactionHand, true);
});
context.get().setPacketHandled(true);
}
}

View file

@ -21,9 +21,7 @@ import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.item.PotionItem;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.BlockParticleData;
import net.minecraft.particles.IParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.potion.PotionUtils;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;

View file

@ -113,17 +113,25 @@ public class GantryShaftBlock extends DirectionalKineticBlock {
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState state = super.getStateForPlacement(context);
BlockPos pos = context.getPos();
World world = context.getWorld();
Direction face = context.getFace();
BlockState blockState = context.getWorld()
.getBlockState(context.getPos()
.offset(face.getOpposite()));
if (AllBlocks.GANTRY_SHAFT.has(blockState) && blockState.get(FACING)
.getAxis() == face.getAxis()) {
Direction facing = blockState.get(FACING);
BlockState neighbour = world.getBlockState(pos.offset(state.get(FACING)
.getOpposite()));
BlockState clickedState =
AllBlocks.GANTRY_SHAFT.has(neighbour) ? neighbour : world.getBlockState(pos.offset(face.getOpposite()));
if (AllBlocks.GANTRY_SHAFT.has(clickedState) && clickedState.get(FACING)
.getAxis() == state.get(FACING)
.getAxis()) {
Direction facing = clickedState.get(FACING);
state = state.with(FACING, context.getPlayer() == null || !context.getPlayer()
.isSneaking() ? facing : facing.getOpposite());
}
return state.with(POWERED, shouldBePowered(state, context.getWorld(), context.getPos()));
return state.with(POWERED, shouldBePowered(state, world, pos));
}
@Override
@ -179,13 +187,9 @@ public class GantryShaftBlock extends DirectionalKineticBlock {
toUpdate.add(pos);
for (BlockPos blockPos : toUpdate) {
BlockState blockState = worldIn.getBlockState(blockPos);
if (!shouldPower) {
TileEntity te = worldIn.getTileEntity(blockPos);
if (te instanceof KineticTileEntity)
((KineticTileEntity) te).detachKinetics();
}
TileEntity te = worldIn.getTileEntity(blockPos);
if (te instanceof KineticTileEntity)
((KineticTileEntity) te).detachKinetics();
if (blockState.getBlock() instanceof GantryShaftBlock)
worldIn.setBlockState(blockPos, blockState.with(POWERED, shouldPower), 2);
}

View file

@ -5,6 +5,7 @@ import java.util.function.Supplier;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Hand;
@ -53,25 +54,29 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase {
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity sender = context.get()
.getSender();
if (sender == null)
context.get().enqueueWork(() -> {
ServerPlayerEntity sender = context.get().getSender();
if (sender == null)
return;
Entity entityByID = sender.getServerWorld().getEntityByID(target);
if (entityByID != null && ExtendoGripItem.isHoldingExtendoGrip(sender)) {
double d = sender.getAttribute(PlayerEntity.REACH_DISTANCE).getValue();
if (!sender.canEntityBeSeen(entityByID))
d -= 3;
d *= d;
if (sender.getDistanceSq(entityByID) > d) {
// TODO log?
return;
Entity entityByID = sender.getServerWorld()
.getEntityByID(target);
if (entityByID != null && ExtendoGripItem.isHoldingExtendoGrip(sender)) {
if (interactionHand == null)
sender.attackTargetEntityWithCurrentItem(entityByID);
else if (specificPoint == null)
sender.interactOn(entityByID, interactionHand);
else
entityByID.applyPlayerInteraction(sender, specificPoint, interactionHand);
}
});
context.get()
.setPacketHandled(true);
if (interactionHand == null)
sender.attackTargetEntityWithCurrentItem(entityByID);
else if (specificPoint == null)
sender.interactOn(entityByID, interactionHand);
else
entityByID.applyPlayerInteraction(sender, specificPoint, interactionHand);
}
});
context.get().setPacketHandled(true);
}
}

View file

@ -10,6 +10,7 @@ import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTProcessors;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@ -115,7 +116,7 @@ public abstract class ZapperItem extends Item {
});
applyCooldown(player, item, false);
}
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item);
return new ActionResult<>(ActionResultType.SUCCESS, item);
}
boolean mainHand = hand == Hand.MAIN_HAND;
@ -125,7 +126,7 @@ public abstract class ZapperItem extends Item {
// Pass To Offhand
if (mainHand && isSwap && gunInOtherHand)
return new ActionResult<ItemStack>(ActionResultType.FAIL, item);
return new ActionResult<>(ActionResultType.FAIL, item);
if (mainHand && !isSwap && gunInOtherHand)
item.getTag()
.putBoolean("_Swap", true);
@ -144,7 +145,7 @@ public abstract class ZapperItem extends Item {
world.playSound(player, player.getPosition(), AllSoundEvents.BLOCKZAPPER_DENY.get(), SoundCategory.BLOCKS,
1f, 0.5f);
player.sendStatusMessage(msg.applyTextStyle(TextFormatting.RED), true);
return new ActionResult<ItemStack>(ActionResultType.FAIL, item);
return new ActionResult<>(ActionResultType.FAIL, item);
}
BlockState stateToUse = Blocks.AIR.getDefaultState();
@ -169,7 +170,7 @@ public abstract class ZapperItem extends Item {
// No target
if (pos == null || stateReplaced.getBlock() == Blocks.AIR) {
applyCooldown(player, item, gunInOtherHand);
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item);
return new ActionResult<>(ActionResultType.SUCCESS, item);
}
// Find exact position of gun barrel for VFX
@ -183,7 +184,7 @@ public abstract class ZapperItem extends Item {
// Client side
if (world.isRemote) {
ZapperRenderHandler.dontAnimateItem(hand);
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item);
return new ActionResult<>(ActionResultType.SUCCESS, item);
}
// Server side
@ -195,7 +196,7 @@ public abstract class ZapperItem extends Item {
new ZapperBeamPacket(barrelPos, raytrace.getHitVec(), hand, true));
}
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item);
return new ActionResult<>(ActionResultType.SUCCESS, item);
}
public ITextComponent validateUsage(ItemStack item) {
@ -240,10 +241,13 @@ public abstract class ZapperItem extends Item {
return UseAction.NONE;
}
public static void setTileData(World world, BlockPos pos, CompoundNBT data) {
if (data != null) {
public static void setTileData(World world, BlockPos pos, BlockState state, CompoundNBT data, PlayerEntity player) {
if (data != null && AllBlockTags.SAFE_NBT.matches(state)) {
TileEntity tile = world.getTileEntity(pos);
if (tile != null && !tile.onlyOpsCanSetNbt()) {
if (tile != null) {
data = NBTProcessors.process(tile, data, !player.isCreative());
if (data == null)
return;
data.putInt("x", pos.getX());
data.putInt("y", pos.getY());
data.putInt("z", pos.getZ());

View file

@ -135,7 +135,7 @@ public class BlockzapperItem extends ZapperItem {
blocksnapshot.restore(true, false);
return false;
}
setTileData(world, placed, data);
setTileData(world, placed, state, data, player);
if (player instanceof ServerPlayerEntity && world instanceof ServerWorld) {
ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player;

View file

@ -10,6 +10,7 @@ import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
@ -36,7 +37,7 @@ public enum TerrainTools {
return this != Clear && this != Flatten;
}
public void run(World world, List<BlockPos> targetPositions, Direction facing, @Nullable BlockState paintedState, @Nullable CompoundNBT data) {
public void run(World world, List<BlockPos> targetPositions, Direction facing, @Nullable BlockState paintedState, @Nullable CompoundNBT data, PlayerEntity player) {
switch (this) {
case Clear:
targetPositions.forEach(p -> world.setBlockState(p, Blocks.AIR.getDefaultState()));
@ -47,7 +48,7 @@ public enum TerrainTools {
if (!isReplaceable(toReplace))
return;
world.setBlockState(p, paintedState);
ZapperItem.setTileData(world, p, data);
ZapperItem.setTileData(world, p, paintedState, data, player);
});
break;
case Flatten:
@ -67,13 +68,13 @@ public enum TerrainTools {
if (!isReplaceable(toReplace))
return;
world.setBlockState(p, paintedState);
ZapperItem.setTileData(world, p, data);
ZapperItem.setTileData(world, p, paintedState, data, player);
});
break;
case Place:
targetPositions.forEach(p -> {
world.setBlockState(p, paintedState);
ZapperItem.setTileData(world, p, data);
ZapperItem.setTileData(world, p, paintedState, data, player);
});
break;
case Replace:
@ -82,7 +83,7 @@ public enum TerrainTools {
if (isReplaceable(toReplace))
return;
world.setBlockState(p, paintedState);
ZapperItem.setTileData(world, p, data);
ZapperItem.setTileData(world, p, paintedState, data, player);
});
break;
}

View file

@ -77,7 +77,7 @@ public class WorldshaperItem extends ZapperItem {
for (BlockPos blockPos : brush.getIncludedPositions())
affectedPositions.add(targetPos.add(blockPos));
PlacementPatterns.applyPattern(affectedPositions, stack);
tool.run(world, affectedPositions, raytrace.getFace(), stateToUse, data);
tool.run(world, affectedPositions, raytrace.getFace(), stateToUse, data, player);
return true;
}

View file

@ -379,29 +379,6 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
.isHorizontal())
return false;
// BlockState stateBelow = world.getBlockState(pos.down());
// if (stateBelow.getBlock() instanceof FunnelBlock) {
// if (stateBelow.has(BrassFunnelBlock.POWERED) && stateBelow.get(BrassFunnelBlock.POWERED))
// return false;
// if (stateBelow.get(BrassFunnelBlock.FACING) != Direction.UP)
// return false;
// ItemStack remainder = FunnelBlock.tryInsert(world, pos.down(), item, simulate);
// if (!simulate)
// setItem(remainder);
// return remainder.isEmpty();
// }
//
// DirectBeltInputBehaviour directInput =
// TileEntityBehaviour.get(world, pos.down(), DirectBeltInputBehaviour.TYPE);
// if (directInput != null) {
// if (!directInput.canInsertFromSide(Direction.UP))
// return false;
// ItemStack remainder = directInput.handleInsertion(item, Direction.UP, simulate);
// if (!simulate)
// setItem(remainder);
// return remainder.isEmpty();
// }
if (Block.hasSolidSideOnTop(world, pos.down()))
return false;
@ -420,17 +397,6 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
private boolean handleUpwardOutput(boolean simulate) {
BlockState stateAbove = world.getBlockState(pos.up());
// if (stateAbove.getBlock() instanceof FunnelBlock) {
// boolean powered = stateAbove.has(BrassFunnelBlock.POWERED) && stateAbove.get(BrassFunnelBlock.POWERED);
// if (!powered && stateAbove.get(BrassFunnelBlock.FACING) == Direction.DOWN) {
// ItemStack remainder = FunnelBlock.tryInsert(world, pos.up(), item, simulate);
// if (remainder.isEmpty()) {
// if (!simulate)
// setItem(remainder);
// return true;
// }
// }
// }
if (world == null)
return false;
@ -501,9 +467,12 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
if (world == null)
return LazyOptional.empty();
TileEntity te = world.getTileEntity(pos);
if (te == null
|| (te instanceof ChuteTileEntity) && (side != Direction.DOWN || !(te instanceof SmartChuteTileEntity)))
if (te == null)
return LazyOptional.empty();
if (te instanceof ChuteTileEntity) {
if (side != Direction.DOWN || !(te instanceof SmartChuteTileEntity) || getItemMotion() > 0)
return LazyOptional.empty();
}
return te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
}

View file

@ -21,7 +21,7 @@ public class SmartChuteTileEntity extends ChuteTileEntity {
@Override
protected boolean canAcceptItem(ItemStack stack) {
return super.canAcceptItem(stack) && canCollectItemsFromBelow();
return super.canAcceptItem(stack) && canCollectItemsFromBelow() && filtering.test(stack);
}
@Override

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.logistics.block.redstone;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
import com.simibubi.create.foundation.utility.Iterate;

View file

@ -0,0 +1,64 @@
package com.simibubi.create.content.schematics;
import com.mojang.datafixers.Dynamic;
import com.mojang.datafixers.types.DynamicOps;
import com.simibubi.create.foundation.utility.NBTProcessors;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.template.IStructureProcessorType;
import net.minecraft.world.gen.feature.template.PlacementSettings;
import net.minecraft.world.gen.feature.template.StructureProcessor;
import net.minecraft.world.gen.feature.template.Template;
import javax.annotation.Nullable;
import java.util.Optional;
public class SchematicProcessor extends StructureProcessor {
public static final SchematicProcessor INSTANCE = new SchematicProcessor();
@Nullable
@Override
public Template.BlockInfo process(IWorldReader world, BlockPos pos, Template.BlockInfo rawInfo,
Template.BlockInfo info, PlacementSettings settings, @Nullable Template template) {
if (info.nbt != null) {
TileEntity te = info.state.createTileEntity(world);
if (te != null) {
CompoundNBT nbt = NBTProcessors.process(te, info.nbt, false);
if (nbt != info.nbt)
return new Template.BlockInfo(info.pos, info.state, nbt);
}
}
return info;
}
@Nullable
@Override
public Template.EntityInfo processEntity(IWorldReader world, BlockPos pos, Template.EntityInfo rawInfo,
Template.EntityInfo info, PlacementSettings settings, Template template) {
return EntityType.readEntityType(info.nbt).flatMap(type -> {
if (world instanceof World) {
Entity e = type.create((World) world);
if (e != null && !e.ignoreItemEntityData()) {
return Optional.of(info);
}
}
return Optional.empty();
}).orElse(null);
}
@Override
protected IStructureProcessorType getType() {
return dynamic -> INSTANCE;
}
@Override
protected <T> Dynamic<T> serialize0(DynamicOps<T> ops) {
return new Dynamic<>(ops, ops.emptyMap());
}
}

View file

@ -5,7 +5,6 @@ import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
@ -14,8 +13,6 @@ 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;
@ -91,10 +88,8 @@ public class ServerSchematicLoader {
}
public void handleNewUpload(ServerPlayerEntity player, String schematic, long size, BlockPos pos) {
String playerPath = getSchematicPath() + "/" + player.getName()
.getFormattedText();
String playerSchematicId = player.getName()
.getFormattedText() + "/" + schematic;
String playerPath = getSchematicPath() + "/" + player.getGameProfile().getName();
String playerSchematicId = player.getGameProfile().getName() + "/" + schematic;
FilesHelper.createFolderIfMissing(playerPath);
// Unsupported Format
@ -103,6 +98,14 @@ public class ServerSchematicLoader {
return;
}
Path playerSchematicsPath = Paths.get(getSchematicPath(), player.getGameProfile().getName()).toAbsolutePath();
Path uploadPath = playerSchematicsPath.resolve(schematic).normalize();
if (!uploadPath.startsWith(playerSchematicsPath)) {
Create.logger.warn("Attempted Schematic Upload with directory escape: {}", playerSchematicId);
return;
}
// Too big
if (!validateSchematicSizeOnServer(player, size))
return;
@ -118,11 +121,15 @@ public class ServerSchematicLoader {
return;
// Delete schematic with same name
Files.deleteIfExists(Paths.get(getSchematicPath(), playerSchematicId));
Files.deleteIfExists(uploadPath);
// Too many Schematics
Stream<Path> list = Files.list(Paths.get(playerPath));
if (list.count() >= getConfig().maxSchematics.get()) {
long count;
try (Stream<Path> list = Files.list(Paths.get(playerPath))) {
count = list.count();
}
if (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()
@ -132,11 +139,9 @@ public class ServerSchematicLoader {
Files.deleteIfExists(lastFilePath.get());
}
}
list.close();
// Open Stream
OutputStream writer =
Files.newOutputStream(Paths.get(getSchematicPath(), playerSchematicId), StandardOpenOption.CREATE_NEW);
OutputStream writer = Files.newOutputStream(uploadPath);
activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, player.getServerWorld(), pos));
// Notify Tile Entity
@ -165,8 +170,7 @@ public class ServerSchematicLoader {
}
public void handleWriteRequest(ServerPlayerEntity player, String schematic, byte[] data) {
String playerSchematicId = player.getName()
.getFormattedText() + "/" + schematic;
String playerSchematicId = player.getGameProfile().getName() + "/" + schematic;
if (activeUploads.containsKey(playerSchematicId)) {
SchematicUploadEntry entry = activeUploads.get(playerSchematicId);
@ -236,8 +240,7 @@ public class ServerSchematicLoader {
}
public void handleFinishedUpload(ServerPlayerEntity player, String schematic) {
String playerSchematicId = player.getName()
.getFormattedText() + "/" + schematic;
String playerSchematicId = player.getGameProfile().getName() + "/" + schematic;
if (activeUploads.containsKey(playerSchematicId)) {
try {
@ -258,8 +261,7 @@ public class ServerSchematicLoader {
if (table == null)
return;
table.finishUpload();
table.inventory.setStackInSlot(1, SchematicItem.create(schematic, player.getName()
.getFormattedText()));
table.inventory.setStackInSlot(1, SchematicItem.create(schematic, player.getGameProfile().getName()));
} catch (IOException e) {
Create.logger.error("Exception Thrown when finishing Upload: " + playerSchematicId);
@ -270,15 +272,21 @@ public class ServerSchematicLoader {
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;
String playerPath = getSchematicPath() + "/" + player.getGameProfile().getName();
String playerSchematicId = player.getGameProfile().getName() + "/" + schematic;
FilesHelper.createFolderIfMissing(playerPath);
// Unsupported Format
if (!schematic.endsWith(".nbt")) {
Create.logger.warn("Attempted Schematic Upload with non-supported Format: " + playerSchematicId);
Create.logger.warn("Attempted Schematic Upload with non-supported Format: {}", playerSchematicId);
return;
}
Path schematicPath = Paths.get(getSchematicPath()).toAbsolutePath();
Path path = schematicPath.resolve(playerSchematicId).normalize();
if (!path.startsWith(schematicPath)) {
Create.logger.warn("Attempted Schematic Upload with directory escape: {}", playerSchematicId);
return;
}
@ -288,12 +296,15 @@ public class ServerSchematicLoader {
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()) {
long count;
try (Stream<Path> list = Files.list(Paths.get(playerPath))) {
count = list.count();
}
if (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()
@ -302,24 +313,17 @@ public class ServerSchematicLoader {
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);
try (OutputStream outputStream = Files.newOutputStream(path)) {
CompoundNBT nbttagcompound = t.writeToNBT(new CompoundNBT());
CompressedStreamTools.writeCompressed(nbttagcompound, outputStream);
player.setHeldItem(Hand.MAIN_HAND, SchematicItem.create(schematic, player.getName()
.getFormattedText()));
player.setHeldItem(Hand.MAIN_HAND, SchematicItem.create(schematic, player.getGameProfile().getName()));
} 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);

View file

@ -422,8 +422,7 @@ 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(new ConfigureSchematicannonPacket(option, set));
}
}

View file

@ -27,6 +27,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.NBTProcessors;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@ -466,8 +467,9 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
CompoundNBT data = null;
if (AllBlockTags.SAFE_NBT.matches(blockState)) {
TileEntity tile = blockReader.getTileEntity(target);
if (tile != null && !tile.onlyOpsCanSetNbt()) {
if (tile != null) {
data = tile.write(new CompoundNBT());
data = NBTProcessors.process(tile, data, true);
}
}
launchBlock(target, icon, blockState, data);

View file

@ -9,7 +9,6 @@ import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.simibubi.create.content.schematics.SchematicWorld;
import com.simibubi.create.content.schematics.item.SchematicItem;
import com.simibubi.create.foundation.utility.Debug;
import com.simibubi.create.foundation.utility.WorldAttached;
import net.minecraft.item.ItemStack;
@ -63,10 +62,6 @@ public class SchematicInstances {
PlacementSettings settings = SchematicItem.getSettings(schematic);
activeTemplate.addBlocksToWorld(world, anchor, settings);
Debug.debugChat("Loading Schematic Instance of " + schematic.getTag()
.getString("File") + ". Total active instances: " + (loadedSchematics.get(wrapped).size() + 1));
return world;
}

View file

@ -1,17 +1,22 @@
package com.simibubi.create.content.schematics.item;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.zip.GZIPInputStream;
import javax.annotation.Nonnull;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.schematics.SchematicProcessor;
import com.simibubi.create.content.schematics.client.SchematicEditScreen;
import com.simibubi.create.content.schematics.filtering.SchematicInstances;
import com.simibubi.create.foundation.gui.ScreenOpener;
@ -25,6 +30,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTSizeTracker;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType;
@ -46,6 +52,8 @@ import net.minecraftforge.fml.common.thread.SidedThreadGroups;
public class SchematicItem extends Item {
private static final Logger LOGGER = LogManager.getLogger();
public SchematicItem(Properties properties) {
super(properties.maxStackSize(1));
}
@ -96,6 +104,7 @@ public class SchematicItem extends Item {
PlacementSettings settings = new PlacementSettings();
settings.setRotation(Rotation.valueOf(tag.getString("Rotation")));
settings.setMirror(Mirror.valueOf(tag.getString("Mirror")));
settings.addProcessor(SchematicProcessor.INSTANCE);
return settings;
}
@ -106,25 +115,30 @@ public class SchematicItem extends Item {
String schematic = blueprint.getTag()
.getString("File");
String filepath = "";
if (!schematic.endsWith(".nbt"))
return t;
if (Thread.currentThread()
.getThreadGroup() == SidedThreadGroups.SERVER)
filepath = "schematics/uploaded/" + owner + "/" + schematic;
else
filepath = "schematics/" + schematic;
Path dir;
Path file;
InputStream stream = null;
try {
stream = Files.newInputStream(Paths.get(filepath), StandardOpenOption.READ);
CompoundNBT nbt = CompressedStreamTools.readCompressed(stream);
if (Thread.currentThread().getThreadGroup() == SidedThreadGroups.SERVER) {
dir = Paths.get("schematics", "uploaded").toAbsolutePath();
file = Paths.get(owner, schematic);
} else {
dir = Paths.get("schematics").toAbsolutePath();
file = Paths.get(schematic);
}
Path path = dir.resolve(file).normalize();
if (!path.startsWith(dir))
return t;
try (DataInputStream stream = new DataInputStream(new BufferedInputStream(
new GZIPInputStream(Files.newInputStream(path, StandardOpenOption.READ))))) {
CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L));
t.read(nbt);
} catch (IOException e) {
// Player/Server doesnt have schematic saved
} finally {
if (stream != null)
IOUtils.closeQuietly(stream);
LOGGER.warn("Failed to read schematic", e);
}
return t;
@ -142,7 +156,7 @@ public class SchematicItem extends Item {
public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
if (!onItemUse(playerIn, handIn))
return super.onItemRightClick(worldIn, playerIn, handIn);
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, playerIn.getHeldItem(handIn));
return new ActionResult<>(ActionResultType.SUCCESS, playerIn.getHeldItem(handIn));
}
private boolean onItemUse(PlayerEntity player, Hand hand) {

View file

@ -2,15 +2,13 @@ package com.simibubi.create.content.schematics.packet;
import java.util.function.Supplier;
import com.simibubi.create.content.schematics.block.SchematicannonContainer;
import com.simibubi.create.content.schematics.block.SchematicannonTileEntity;
import com.simibubi.create.content.schematics.block.SchematicannonTileEntity.State;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public class ConfigureSchematicannonPacket extends SimplePacketBase {
@ -21,45 +19,28 @@ public class ConfigureSchematicannonPacket extends SimplePacketBase {
private Option option;
private boolean set;
private BlockPos pos;
public static ConfigureSchematicannonPacket setOption(BlockPos pos, Option option, boolean set) {
ConfigureSchematicannonPacket packet = new ConfigureSchematicannonPacket(pos);
packet.option = option;
packet.set = set;
return packet;
}
public ConfigureSchematicannonPacket(BlockPos pos) {
this.pos = pos;
public ConfigureSchematicannonPacket(Option option, boolean set) {
this.option = option;
this.set = set;
}
public ConfigureSchematicannonPacket(PacketBuffer buffer) {
pos = buffer.readBlockPos();
option = Option.values()[buffer.readInt()];
set = buffer.readBoolean();
this(buffer.readEnumValue(Option.class), buffer.readBoolean());
}
public void write(PacketBuffer buffer) {
buffer.writeBlockPos(pos);
buffer.writeInt(option.ordinal());
buffer.writeEnumValue(option);
buffer.writeBoolean(set);
}
public void handle(Supplier<Context> context) {
context.get().enqueueWork(() -> {
ServerPlayerEntity player = context.get().getSender();
if (player == null)
return;
World world = player.world;
if (world == null || !world.isBlockPresent(pos))
if (player == null || !(player.openContainer instanceof SchematicannonContainer))
return;
TileEntity tileEntity = world.getTileEntity(pos);
if (!(tileEntity instanceof SchematicannonTileEntity))
return;
SchematicannonTileEntity te = (SchematicannonTileEntity) tileEntity;
SchematicannonTileEntity te = ((SchematicannonContainer) player.openContainer).getTileEntity();
switch (option) {
case DONT_REPLACE:
case REPLACE_ANY:

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.schematics.packet;
import java.util.function.Supplier;
import com.simibubi.create.content.schematics.SchematicProcessor;
import com.simibubi.create.content.schematics.item.SchematicItem;
import com.simibubi.create.foundation.networking.SimplePacketBase;
@ -36,6 +37,8 @@ public class SchematicPlacePacket extends SimplePacketBase {
return;
Template t = SchematicItem.loadSchematic(stack);
PlacementSettings settings = SchematicItem.getSettings(stack);
if (player.canUseCommandBlock())
settings.func_215220_b(SchematicProcessor.INSTANCE); // remove processor
settings.setIgnoreEntities(false);
t.addBlocksToWorld(player.getServerWorld(), NBTUtil.readBlockPos(stack.getTag().getCompound("Anchor")),
settings);

View file

@ -39,48 +39,52 @@ import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkDirection;
import net.minecraftforge.fml.network.NetworkEvent.Context;
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.PacketDistributor;
import net.minecraftforge.fml.network.PacketDistributor.TargetPoint;
import net.minecraftforge.fml.network.simple.SimpleChannel;
import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_SERVER;
import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_CLIENT;
public enum AllPackets {
// Client to Server
NBT(NbtPacket.class, NbtPacket::new),
CONFIGURE_SCHEMATICANNON(ConfigureSchematicannonPacket.class, ConfigureSchematicannonPacket::new),
CONFIGURE_FLEXCRATE(ConfigureFlexcratePacket.class, ConfigureFlexcratePacket::new),
CONFIGURE_STOCKSWITCH(ConfigureStockswitchPacket.class, ConfigureStockswitchPacket::new),
CONFIGURE_SEQUENCER(ConfigureSequencedGearshiftPacket.class, ConfigureSequencedGearshiftPacket::new),
PLACE_SCHEMATIC(SchematicPlacePacket.class, SchematicPlacePacket::new),
UPLOAD_SCHEMATIC(SchematicUploadPacket.class, SchematicUploadPacket::new),
CONFIGURE_FILTER(FilterScreenPacket.class, FilterScreenPacket::new),
CONFIGURE_FILTERING_AMOUNT(FilteringCountUpdatePacket.class, FilteringCountUpdatePacket::new),
CONFIGURE_SCROLLABLE(ScrollValueUpdatePacket.class, ScrollValueUpdatePacket::new),
EXTENDO_INTERACT(ExtendoGripInteractionPacket.class, ExtendoGripInteractionPacket::new),
CONTRAPTION_INTERACT(ContraptionInteractionPacket.class, ContraptionInteractionPacket::new),
CLIENT_MOTION(ClientMotionPacket.class, ClientMotionPacket::new),
PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new),
MINECART_COUPLING_CREATION(CouplingCreationPacket.class, CouplingCreationPacket::new),
INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new),
SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new),
LEFT_CLICK(LeftClickPacket.class, LeftClickPacket::new),
NBT(NbtPacket.class, NbtPacket::new, PLAY_TO_SERVER),
CONFIGURE_SCHEMATICANNON(ConfigureSchematicannonPacket.class, ConfigureSchematicannonPacket::new, PLAY_TO_SERVER),
CONFIGURE_FLEXCRATE(ConfigureFlexcratePacket.class, ConfigureFlexcratePacket::new, PLAY_TO_SERVER),
CONFIGURE_STOCKSWITCH(ConfigureStockswitchPacket.class, ConfigureStockswitchPacket::new, PLAY_TO_SERVER),
CONFIGURE_SEQUENCER(ConfigureSequencedGearshiftPacket.class, ConfigureSequencedGearshiftPacket::new, PLAY_TO_SERVER),
PLACE_SCHEMATIC(SchematicPlacePacket.class, SchematicPlacePacket::new, PLAY_TO_SERVER),
UPLOAD_SCHEMATIC(SchematicUploadPacket.class, SchematicUploadPacket::new, PLAY_TO_SERVER),
CONFIGURE_FILTER(FilterScreenPacket.class, FilterScreenPacket::new, PLAY_TO_SERVER),
CONFIGURE_FILTERING_AMOUNT(FilteringCountUpdatePacket.class, FilteringCountUpdatePacket::new, PLAY_TO_SERVER),
CONFIGURE_SCROLLABLE(ScrollValueUpdatePacket.class, ScrollValueUpdatePacket::new, PLAY_TO_SERVER),
EXTENDO_INTERACT(ExtendoGripInteractionPacket.class, ExtendoGripInteractionPacket::new, PLAY_TO_SERVER),
CONTRAPTION_INTERACT(ContraptionInteractionPacket.class, ContraptionInteractionPacket::new, PLAY_TO_SERVER),
CLIENT_MOTION(ClientMotionPacket.class, ClientMotionPacket::new, PLAY_TO_SERVER),
PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new, PLAY_TO_SERVER),
MINECART_COUPLING_CREATION(CouplingCreationPacket.class, CouplingCreationPacket::new, PLAY_TO_SERVER),
INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new, PLAY_TO_SERVER),
SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new, PLAY_TO_SERVER),
LEFT_CLICK(LeftClickPacket.class, LeftClickPacket::new, PLAY_TO_SERVER),
// Server to Client
SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new),
SERVER_SPEED(ServerSpeedProvider.Packet.class, ServerSpeedProvider.Packet::new),
BEAM_EFFECT(ZapperBeamPacket.class, ZapperBeamPacket::new),
CONFIGURE_CONFIG(ConfigureConfigPacket.class, ConfigureConfigPacket::new),
CONTRAPTION_STALL(ContraptionStallPacket.class, ContraptionStallPacket::new),
CONTRAPTION_DISASSEMBLE(ContraptionDisassemblyPacket.class, ContraptionDisassemblyPacket::new),
GLUE_EFFECT(GlueEffectPacket.class, GlueEffectPacket::new),
CONTRAPTION_SEAT_MAPPING(ContraptionSeatMappingPacket.class, ContraptionSeatMappingPacket::new),
LIMBSWING_UPDATE(LimbSwingUpdatePacket.class, LimbSwingUpdatePacket::new),
MINECART_CONTROLLER(MinecartControllerUpdatePacket.class, MinecartControllerUpdatePacket::new),
FLUID_SPLASH(FluidSplashPacket.class, FluidSplashPacket::new),
CONTRAPTION_FLUID(ContraptionFluidPacket.class, ContraptionFluidPacket::new),
GANTRY_UPDATE(GantryContraptionUpdatePacket.class, GantryContraptionUpdatePacket::new),
SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT),
SERVER_SPEED(ServerSpeedProvider.Packet.class, ServerSpeedProvider.Packet::new, PLAY_TO_CLIENT),
BEAM_EFFECT(ZapperBeamPacket.class, ZapperBeamPacket::new, PLAY_TO_CLIENT),
CONFIGURE_CONFIG(ConfigureConfigPacket.class, ConfigureConfigPacket::new, PLAY_TO_CLIENT),
CONTRAPTION_STALL(ContraptionStallPacket.class, ContraptionStallPacket::new, PLAY_TO_CLIENT),
CONTRAPTION_DISASSEMBLE(ContraptionDisassemblyPacket.class, ContraptionDisassemblyPacket::new, PLAY_TO_CLIENT),
GLUE_EFFECT(GlueEffectPacket.class, GlueEffectPacket::new, PLAY_TO_CLIENT),
CONTRAPTION_SEAT_MAPPING(ContraptionSeatMappingPacket.class, ContraptionSeatMappingPacket::new, PLAY_TO_CLIENT),
LIMBSWING_UPDATE(LimbSwingUpdatePacket.class, LimbSwingUpdatePacket::new, PLAY_TO_CLIENT),
MINECART_CONTROLLER(MinecartControllerUpdatePacket.class, MinecartControllerUpdatePacket::new, PLAY_TO_CLIENT),
FLUID_SPLASH(FluidSplashPacket.class, FluidSplashPacket::new, PLAY_TO_CLIENT),
CONTRAPTION_FLUID(ContraptionFluidPacket.class, ContraptionFluidPacket::new, PLAY_TO_CLIENT),
GANTRY_UPDATE(GantryContraptionUpdatePacket.class, GantryContraptionUpdatePacket::new, PLAY_TO_CLIENT),
;
@ -90,14 +94,14 @@ public enum AllPackets {
private LoadedPacket<?> packet;
private <T extends SimplePacketBase> AllPackets(Class<T> type, Function<PacketBuffer, T> factory) {
packet = new LoadedPacket<>(type, factory);
private <T extends SimplePacketBase> AllPackets(Class<T> type, Function<PacketBuffer, T> factory, NetworkDirection direction) {
packet = new LoadedPacket<>(type, factory, direction);
}
public static void registerPackets() {
channel = NetworkRegistry.ChannelBuilder.named(CHANNEL_NAME)
.serverAcceptedVersions(s -> true)
.clientAcceptedVersions(s -> true)
.serverAcceptedVersions(NETWORK_VERSION::equals)
.clientAcceptedVersions(NETWORK_VERSION::equals)
.networkProtocolVersion(() -> NETWORK_VERSION)
.simpleChannel();
for (AllPackets packet : values())
@ -117,16 +121,18 @@ public enum AllPackets {
Function<PacketBuffer, T> decoder;
BiConsumer<T, Supplier<Context>> handler;
Class<T> type;
NetworkDirection direction;
private LoadedPacket(Class<T> type, Function<PacketBuffer, T> factory) {
private LoadedPacket(Class<T> type, Function<PacketBuffer, T> factory, NetworkDirection direction) {
encoder = T::write;
decoder = factory;
handler = T::handle;
this.type = type;
this.direction = direction;
}
private void register() {
channel.messageBuilder(type, index++)
channel.messageBuilder(type, index++, direction)
.encoder(encoder)
.decoder(decoder)
.consumer(handler)

View file

@ -5,7 +5,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
@ -21,17 +20,10 @@ import net.minecraft.nbt.CompoundNBT;
public class FilesHelper {
public static void createFolderIfMissing(String name) {
Path path = Paths.get(name);
if (path.getParent() != null)
createFolderIfMissing(path.getParent()
.toString());
if (!Files.isDirectory(path)) {
try {
Files.createDirectory(path);
} catch (IOException e) {
Create.logger.warn("Could not create Folder: " + name);
}
try {
Files.createDirectories(Paths.get(name));
} catch (IOException e) {
Create.logger.warn("Could not create Folder: {}", name);
}
}

View file

@ -0,0 +1,69 @@
package com.simibubi.create.foundation.utility;
import java.util.HashMap;
import java.util.Map;
import java.util.function.UnaryOperator;
import javax.annotation.Nullable;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.logistics.item.filter.FilterItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.text.ITextComponent;
public final class NBTProcessors {
private static final Map<TileEntityType<?>, UnaryOperator<CompoundNBT>> processors = new HashMap<>();
private static final Map<TileEntityType<?>, UnaryOperator<CompoundNBT>> survivalProcessors = new HashMap<>();
public static synchronized void addProcessor(TileEntityType<?> type, UnaryOperator<CompoundNBT> processor) {
processors.put(type, processor);
}
public static synchronized void addSurvivalProcessor(TileEntityType<?> type, UnaryOperator<CompoundNBT> processor) {
survivalProcessors.put(type, processor);
}
static {
addProcessor(TileEntityType.SIGN, data -> {
for (int i = 0; i < 4; ++i) {
String s = data.getString("Text" + (i + 1));
ITextComponent textcomponent = ITextComponent.Serializer.fromJson(s.isEmpty() ? "\"\"" : s);
if (textcomponent != null && textcomponent.getStyle() != null
&& textcomponent.getStyle().getClickEvent() != null)
return null;
}
return data;
});
addSurvivalProcessor(AllTileEntities.FUNNEL.get(), data -> {
if (data.contains("Filter")) {
ItemStack filter = ItemStack.read(data.getCompound("Filter"));
if (filter.getItem() instanceof FilterItem)
data.remove("Filter");
}
return data;
});
}
private NBTProcessors() {
}
@Nullable
public static CompoundNBT process(TileEntity tileEntity, CompoundNBT compound, boolean survival) {
if (compound == null)
return null;
TileEntityType<?> type = tileEntity.getType();
if (survival && survivalProcessors.containsKey(type))
compound = survivalProcessors.get(type).apply(compound);
if (processors.containsKey(type))
return processors.get(type).apply(compound);
if (tileEntity.onlyOpsCanSetNbt())
return null;
return compound;
}
}

View file

@ -1,5 +1,4 @@
{
"_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Fenêtre en acacia",
@ -8,49 +7,88 @@
"block.create.adjustable_pulse_repeater": "Répéteur d'impulsions réglable",
"block.create.adjustable_repeater": "Répéteur réglable",
"block.create.analog_lever": "Levier analogique",
"block.create.andesite_belt_funnel": "Entonnoir en andésite pour tapis roulant",
"block.create.andesite_bricks": "Briques d'andésite",
"block.create.andesite_bricks_slab": "Dalle en briques d'andésite",
"block.create.andesite_bricks_stairs": "Escalier en briques d'andésite",
"block.create.andesite_bricks_wall": "Mur en briques d'andésite",
"block.create.andesite_casing": "Boîtier en andésite",
"block.create.andesite_casing": "Revêtement en andésite",
"block.create.andesite_cobblestone": "Pierres d'andésite",
"block.create.andesite_cobblestone_slab": "Dalles en pierres d'andésite",
"block.create.andesite_cobblestone_stairs": "Escaliers en pierres d'andésite",
"block.create.andesite_cobblestone_wall": "Mur en pierres d'andésite",
"block.create.andesite_encased_shaft": "Arbre mécanique dans un revêtement en andésite",
"block.create.andesite_encased_shaft": "Rotor dans un revêtement en andésite",
"block.create.andesite_funnel": "Entonnoir en andésite",
"block.create.andesite_pillar": "Pilier en andésite",
"block.create.andesite_tunnel": "Tunnel en andésite",
"block.create.basin": "Bassin",
"block.create.belt": "Tapis roulant",
"block.create.birch_window": "Fenêtre en bouleau",
"block.create.brass_casing": "Boîtier en laiton",
"block.create.birch_window_pane": "Vitre en bouleau",
"block.create.black_sail": "Voile noire",
"block.create.black_seat": "Siège noir",
"block.create.black_valve_handle": "Vanne noire",
"block.create.blaze_burner": "Brûleur à blaze",
"block.create.blue_sail": "Voile bleue",
"block.create.blue_seat": "Siège bleu",
"block.create.blue_valve_handle": "Vanne bleue",
"block.create.brass_belt_funnel": "Entonnoir en laiton pour tapis roulant",
"block.create.brass_block": "Bloc de laiton",
"block.create.brass_casing": "Revêtement en laiton",
"block.create.brass_encased_shaft": "Rotor dans un revêtement en laiton",
"block.create.brass_funnel": "Entonnoir en laiton",
"block.create.brass_tunnel": "Tunnel en laiton",
"block.create.brown_sail": "Voile brune",
"block.create.brown_seat": "Siège brun",
"block.create.brown_valve_handle": "Vanne brune",
"block.create.cart_assembler": "Assembleur de wagon",
"block.create.chiseled_dark_scoria": "Scoria sombre taillé",
"block.create.chiseled_dolomite": "Dolomite taillée",
"block.create.chiseled_gabbro": "Gabbro taillé",
"block.create.chiseled_limestone": "Calcaire taillé",
"block.create.chiseled_scoria": "Scoria taillé",
"block.create.chiseled_weathered_limestone": "Calcaire altéré taillé",
"block.create.chocolate": "Chocolat",
"block.create.chute": "Glissière",
"block.create.clockwork_bearing": "Roulement mécanique horloger",
"block.create.clutch": "Embrayage",
"block.create.cogwheel": "Roue dentée",
"block.create.content_observer": "Observateur de contenu",
"block.create.controller_rail": "Rails controlleurs",
"block.create.copper_block": "Bloc de cuivre",
"block.create.copper_casing": "Boîtier en cuivre",
"block.create.copper_casing": "Revêtement en cuivre",
"block.create.copper_ore": "Minerai de cuivre",
"block.create.copper_shingles": "Bardeaux de cuivre",
"block.create.copper_tiles": "Tuiles en cuivre",
"block.create.copper_valve_handle": "Vanne en cuivre",
"block.create.creative_crate": "Créateur de schémacanon",
"block.create.creative_fluid_tank": "Réservoir créatif",
"block.create.creative_motor": "Moteur",
"block.create.crushing_wheel": "Roue de concassage",
"block.create.crushing_wheel_controller": "Contrôleur de roue de concassage",
"block.create.cuckoo_clock": "Horloge à coucou",
"block.create.cyan_sail": "Voile cyan",
"block.create.cyan_seat": "Siège cyan",
"block.create.cyan_valve_handle": "Vanne cyan",
"block.create.dark_oak_window": "fenêtre en chêne sombre",
"block.create.dark_oak_window_pane": "Vitre en chêne sombre",
"block.create.dark_scoria": "Scorie sombre",
"block.create.dark_scoria_bricks": "Briques de scorie sombre",
"block.create.dark_scoria_bricks_slab": "Dalles de briques de scorie sombre",
"block.create.dark_scoria_bricks_stairs": "Escaliers de briques de scorie sombre",
"block.create.dark_scoria_bricks_wall": "Muret de briques de scorie sombre",
"block.create.dark_scoria_cobblestone": "Pierres de scorie sombre",
"block.create.deployer": "Déployeur",
"block.create.depot": "Dépot",
"block.create.diorite_bricks": "Briques de diorite",
"block.create.dolomite": "Dolomie",
"block.create.dolomite_bricks": "Briques de dolomie",
"block.create.dolomite_bricks_slab": "Dalle de briques de dolomie",
"block.create.dolomite_bricks_stairs": "Escaliers de briques de dolomie",
"block.create.dolomite_bricks_wall": "Muret de briques de dolomie",
"block.create.dolomite_pillar": "Pillier de dolomie",
"block.create.encased_fan": "Ventilateur enfermé",
"block.create.dolomite": "Dolomite",
"block.create.dolomite_bricks": "Briques de dolomite",
"block.create.dolomite_bricks_slab": "Dalle de briques de dolomite",
"block.create.dolomite_bricks_stairs": "Escaliers de briques de dolomite",
"block.create.dolomite_bricks_wall": "Muret de briques de dolomite",
"block.create.dolomite_pillar": "Pillier de dolomite",
"block.create.encased_chain_drive": "Chaine de transmission",
"block.create.encased_fan": "Ventilateur enchâssé",
"block.create.flywheel": "Volant d'inertie",
"block.create.framed_glass": "Grande fenêtre en verre",
"block.create.framed_glass_pane": "Grande vitre encadrée",
@ -85,23 +123,23 @@
"block.create.mechanical_saw": "Scie mécanique",
"block.create.natural_scoria": "Scorie naturelle",
"block.create.nozzle": "Buse",
"block.create.piston_extension_pole": "Pôle d'extension de piston",
"block.create.piston_extension_pole": "Barre d'extension de piston",
"block.create.polished_dark_scoria": "Scorie sombre polie",
"block.create.polished_dolomite": "Dolomie polie",
"block.create.polished_dolomite": "Dolomite polie",
"block.create.polished_gabbro": "Gabbro poli",
"block.create.polished_limestone": "Calcaire poli",
"block.create.polished_limestone_slab": "Dalle de calcaire polie",
"block.create.polished_scoria": "Scorie polie",
"block.create.polished_scoria_slab": "Dalle de scorie polie",
"block.create.polished_weathered_limestone": "Calcaire patinées polies",
"block.create.polished_weathered_limestone_slab": "Dalle de calcaire patinées",
"block.create.polished_weathered_limestone": "Calcaire altéré polies",
"block.create.polished_weathered_limestone_slab": "Dalle de calcaire altéré",
"block.create.portable_storage_interface": "Interface de stockage portable",
"block.create.powered_latch": "Verrou alimenté",
"block.create.powered_toggle_latch": "Verrou alimenté à bascule",
"block.create.pulley_magnet": "Aimant de poulie",
"block.create.pulse_repeater": "Répéteur d'impulsions",
"block.create.radial_chassis": "Châssis radial",
"block.create.redstone_contact": "redstone_contact Redstone",
"block.create.redstone_contact": "Contact de redstone",
"block.create.redstone_link": "Liaison Redstone",
"block.create.rope": "Corde",
"block.create.rope_pulley": "Poulie à corde",
@ -112,7 +150,7 @@
"block.create.scoria_bricks": "Briques de scorie",
"block.create.scoria_pillar": "Pillier de scorie",
"block.create.sequenced_gearshift": "Décaleur de rotation séquencé",
"block.create.shaft": "Arbre mécanique",
"block.create.shaft": "Rotor",
"block.create.speedometer": "Compteur de vitesse",
"block.create.sticky_mechanical_piston": "Piston mécanique collant",
"block.create.stockpile_switch": "Détecteur de stockage",
@ -123,12 +161,12 @@
"block.create.vertical_framed_glass": "Fenêtre en verre verticale",
"block.create.vertical_framed_glass_pane": "Vitre encadrée verticale",
"block.create.water_wheel": "Roue à eau",
"block.create.weathered_limestone": "Calcaire patinées",
"block.create.weathered_limestone_bricks": "Briques de calcaire patinées",
"block.create.weathered_limestone_bricks_slab": "Dalle de briques de calcaire patinées",
"block.create.weathered_limestone_bricks_stairs": "Escaliers de briques de calcaire patinées",
"block.create.weathered_limestone_bricks_wall": "Muret de briques de calcaire patinées",
"block.create.weathered_limestone_pillar": "Pillier de calcaire patinées",
"block.create.weathered_limestone": "Calcaire altéré",
"block.create.weathered_limestone_bricks": "Briques de Calcaire altéré",
"block.create.weathered_limestone_bricks_slab": "Dalle de briques de Calcaire altéré",
"block.create.weathered_limestone_bricks_stairs": "Escaliers de briques de Calcaire altéré",
"block.create.weathered_limestone_bricks_wall": "Muret de briques de Calcaire altéré",
"block.create.weathered_limestone_pillar": "Pillier de Calcaire altéré",
"block.create.zinc_block": "Bloc de zinc",
"block.create.zinc_ore": "Minerai de zinc",
@ -203,7 +241,7 @@
"item.create.schematic_and_quill": "Schéma et plume",
"item.create.shadow_steel": "Acier sombre",
"item.create.super_glue": "Colle extra-forte",
"item.create.tree_fertilizer": "Engrais pour arbre",
"item.create.tree_fertilizer": "Engrais pour arbres",
"item.create.vertical_gearbox": "Boîte de transfert verticale",
"item.create.wand_of_symmetry": "Bâton de symétrie",
"item.create.wheat_flour": "Farine",
@ -220,7 +258,7 @@
"advancement.create.andesite_alloy.desc": "Certains matériaux de Create ont des noms bizzares; l'alliage d'andésite est l'un d'entre eux.",
"advancement.create.its_alive": "Ça bouge!",
"advancement.create.its_alive.desc": "Regardez vos bremiers composants tourner.",
"advancement.create.shifting_gears": "Arbre de transmission",
"advancement.create.shifting_gears": "rotor de transmission",
"advancement.create.shifting_gears.desc": "Connectez une roue dentée à une grande roue dentée afin de changer la vitesse de votre engin",
"advancement.create.overstressed": "Surtension",
"advancement.create.overstressed.desc": "Testez d'abord les limites de la force mécanique",
@ -237,7 +275,7 @@
"itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create Palettes",
"death.attack.create.crush": "%1$s nanana a été traitée par une roue de concassage",
"death.attack.create.crush": "%1$s a été concassé.e",
"death.attack.create.fan_fire": "%1$s a été brûlé à mort par l'air chaud",
"death.attack.create.fan_lava": "%1$s a été brûlé à mort par un ventilateur de lave",
"death.attack.create.mechanical_drill": "%1$s a été empalé par une perceuse mécanique",
@ -365,10 +403,10 @@
"create.contraptions.movement_mode": "Mode de mouvement",
"create.contraptions.movement_mode.move_place": "Toujours placer à l'arrêt",
"create.contraptions.movement_mode.move_place_returned": "Placer uniquement en position de départ",
"create.contraptions.movement_mode.move_never_place": "Ne placer que lorsque l'ancre est détruite",
"create.contraptions.movement_mode.move_never_place": "Ne placer que Quand l'ancre est détruite",
"create.contraptions.movement_mode.rotate_place": "Toujours placer à l'arrêt",
"create.contraptions.movement_mode.rotate_place_returned": "Placer uniquement près de l'angle initial",
"create.contraptions.movement_mode.rotate_never_place": "Ne placer que lorsque l'ancre est détruite",
"create.contraptions.movement_mode.rotate_never_place": "Ne placer que Quand l'ancre est détruite",
"create.logistics.filter": "Filtre",
"create.logistics.recipe_filter": "Filtre de recettes",
@ -607,7 +645,7 @@
"create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start <tickTime> to artificially slow down the server tick",
"create.command.killTPSCommand.argument.tickTime": "tickTime",
"create.subtitle.schematicannon_launch_block": "Tire de schémacanon",
"create.subtitle.schematicannon_launch_block": "Tir de schémacanon",
"create.subtitle.schematicannon_finish": "Fin de schémacanon",
"create.subtitle.slime_added": "Bruit de slime",
"create.subtitle.mechanical_press_activation": "Activation de la presse mechanique",
@ -626,12 +664,12 @@
"item.create.example_item.tooltip.behaviour1": "Donc cet objet fait ceci. (les comportements sont affichés avec shift)",
"item.create.example_item.tooltip.condition2": "Et quand cela",
"item.create.example_item.tooltip.behaviour2": "Vous pouvez ajouter autant de comportements que vous le souhaitez",
"item.create.example_item.tooltip.control1": "Lorsque Ctrl enfoncé",
"item.create.example_item.tooltip.control1": "Quand Ctrl enfoncé",
"item.create.example_item.tooltip.action1": "Ces commandes sont affichées.",
"item.create.wand_of_symmetry.tooltip": "BÂTON DE SYMÉTRIE",
"item.create.wand_of_symmetry.tooltip.summary": "Reflète parfaitement le placement des blocs sur les plans configurés.",
"item.create.wand_of_symmetry.tooltip.condition1": "Lorsque positionné dans la barre active",
"item.create.wand_of_symmetry.tooltip.condition1": "Quand positionné dans la barre active",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Reste actif",
"item.create.wand_of_symmetry.tooltip.control1": "Clic droit au sol",
"item.create.wand_of_symmetry.tooltip.action1": "_Créé_ ou _déplace_ le mirroir",
@ -658,25 +696,25 @@
"item.create.handheld_worldshaper.tooltip.control3": "Clic droit en étant accroupi",
"item.create.handheld_worldshaper.tooltip.action3": "Ouvre l'_interface_ _de_ _configuration_",
"item.create.tree_fertilizer.tooltip": "ENGRAIS POUR ARBRE",
"item.create.tree_fertilizer.tooltip.summary": "Une puissante combinaison de minéraux adaptée pour accélérer la croissance des types d'arbres communs.",
"item.create.tree_fertilizer.tooltip.condition1": "Lorsqu'utilisé sur une pousse d'arbre",
"item.create.tree_fertilizer.tooltip.behaviour1": "Fait pousser des arbres _indépendamment_ de leurs _conditions_ _d'emplacement_",
"item.create.tree_fertilizer.tooltip": "ENGRAIS POUR ARBRES",
"item.create.tree_fertilizer.tooltip.summary": "Une puissante combinaison de minéraux adaptée pour accélérer la croissance des types d'rotors communs.",
"item.create.tree_fertilizer.tooltip.condition1": "Lorsqu'utilisé sur une pousse d'rotor",
"item.create.tree_fertilizer.tooltip.behaviour1": "Fait pousser des rotors _indépendamment_ de leurs _conditions_ _d'emplacement_",
"item.create.deforester.tooltip": "DÉFORESTEUR",
"item.create.deforester.tooltip.summary": "Une _hache_ _rayonnante_ capable d'abattre des arbres en une fraction de seconde.",
"item.create.deforester.tooltip.summary": "Une _hache_ _rayonnante_ capable d'abattre des rotors en une fraction de seconde.",
"item.create.filter.tooltip": "FILTRE",
"item.create.filter.tooltip.summary": "_Contrôle_ les _sorties_ et _entrées_ de dispositifs logistiques avec plus de _précision_, en les comparant à un _ensemble_ _d'objets_ ou à plusieurs _filtres_ _imbriqués_.",
"item.create.filter.tooltip.condition1": "Lorsque dans l'emplacement de filtre",
"item.create.filter.tooltip.condition1": "Quand dans l'emplacement de filtre",
"item.create.filter.tooltip.behaviour1": "_Contrôle_ le flux d'object selon sa _configuration_.",
"item.create.filter.tooltip.condition2": "Clic droit",
"item.create.filter.tooltip.behaviour2": "Ouvre l'_interface_ _de_ _configuration_.",
"item.create.attribute_filter.tooltip": "FILTRE D'ATTRIBUTS",
"item.create.attribute_filter.tooltip.summary": "_Contrôle_ les _sorties_ et les _entrées_ de dispositifs logistiques avec plus de _précision_, en les comparant à un _ensemble_ _d'objets_ ou à plusieurs _filtres_ _imbriqués_.",
"item.create.attribute_filter.tooltip.condition1": "Lorsque dans l'emplacement de filtre",
"item.create.attribute_filter.tooltip.condition1": "Quand dans l'emplacement de filtre",
"item.create.attribute_filter.tooltip.behaviour1": "_Contrôle_ le flux d'object selon sa _configuration_.",
"item.create.attribute_filter.tooltip.condition2": "Clic droit",
"item.create.attribute_filter.tooltip.behaviour2": "Ouvre l'_interface_ _de_ _configuration_.",
@ -686,7 +724,7 @@
"item.create.schematic.tooltip": "SCHÉMA",
"item.create.schematic.tooltip.summary": "Contient une structure à positionner et à placer dans le monde. Positionnez l'hologramme comme vous le souhaitez et utilisez un _schémacanon_ pour le construire.",
"item.create.schematic.tooltip.condition1": "Lorsque tenu en main",
"item.create.schematic.tooltip.condition1": "Quand tenu en main",
"item.create.schematic.tooltip.behaviour1": "Peut être positionné à l'aide des outils à l'écran.",
"item.create.schematic.tooltip.control1": "Clic droit en étant accroupi",
"item.create.schematic.tooltip.action1": "Ouvre une _interface_ pour rentrer les _coordonées_ correctes.",
@ -711,54 +749,54 @@
"block.create.schematic_table.tooltip": "TABLE À SCHÉMA",
"block.create.schematic_table.tooltip.summary": "Écrit les schémas enregistrés dans un _schéma_ _vide_.",
"block.create.schematic_table.tooltip.condition1": "Lorsque donné un schéma vide",
"block.create.schematic_table.tooltip.condition1": "Quand donné un schéma vide",
"block.create.schematic_table.tooltip.behaviour1": "Télécharge un fichier choisi à partir de votre dossier de schémas.",
"block.create.shaft.tooltip": "ARBRE MÉCANIQUE",
"block.create.shaft.tooltip.summary": "_Relais_ la _rotation_ en ligne droite.",
"block.create.shaft.tooltip": "ROTOR",
"block.create.shaft.tooltip.summary": "_Relaie_ la _rotation_ en ligne droite.",
"block.create.cogwheel.tooltip": "ROUE DENTÉE",
"block.create.cogwheel.tooltip.summary": "_Relais_ la _rotation_ en ligne droite, et aux _roues_ _dentées_ adjacentes.",
"block.create.cogwheel.tooltip.summary": "_Relaie_ la _rotation_ en ligne droite, et aux _roues_ _dentées_ adjacentes.",
"block.create.large_cogwheel.tooltip": "GRANDE ROUE DENTÉE",
"block.create.large_cogwheel.tooltip.summary": "Une version plus grande de la _roue_ _dentée_, permettant des _changements_ dans la _vitesse_ _de_ _rotation_ lorsqu'il est connecté à son homologue plus petit.",
"block.create.encased_shaft.tooltip": "ARBRE MÉCANIQUE ENBOÎTÉ",
"block.create.encased_shaft.tooltip.summary": "_Relais_ la _rotation_ en ligne droite. Convient pour propager la rotation à travers les murs.",
"block.create.encased_shaft.tooltip": "ROTOR ENCASTRÉ",
"block.create.encased_shaft.tooltip.summary": "_Relaie_ la _rotation_ en ligne droite. Convient pour propager la rotation à travers les murs.",
"block.create.gearbox.tooltip": "BOÎTE DE VITESSES",
"block.create.gearbox.tooltip.summary": "_Relais_ la _rotation_ dans _quatre_ _directions_. Inverse les connexions directes.",
"block.create.gearbox.tooltip.summary": "_Relaie_ la _rotation_ dans _quatre_ _directions_. Inverse les connexions directes.",
"block.create.gearshift.tooltip": "DÉCALEUR DE ROTATION",
"block.create.gearshift.tooltip.summary": "Une commande pour basculer le sens de rotation des arbres connectés.",
"block.create.gearshift.tooltip": "BOÎTE DE VITESSES",
"block.create.gearshift.tooltip.summary": "Une commande pour basculer le sens de rotation des rotors connectés.",
"block.create.gearshift.tooltip.condition1": "Lorsqu'alimenté",
"block.create.gearshift.tooltip.behaviour1": "_Inverse_ la rotation sortante.",
"block.create.clutch.tooltip": "EMBRAYAGE",
"block.create.clutch.tooltip.summary": "Une commande pour engager / désengager la rotation des arbres connectés.",
"block.create.clutch.tooltip.summary": "Une commande pour engager / désengager la rotation des rotors connectés.",
"block.create.clutch.tooltip.condition1": "Lorsqu'alimenté",
"block.create.clutch.tooltip.behaviour1": "_Arrête_ de transmettre la rotation de l'autre côté.",
"item.create.belt_connector.tooltip": "CONNECTEUR DE TAPIS ROULANTS",
"item.create.belt_connector.tooltip.summary": "Connecte deux _arbres_ ou plus à un _tapis_ _roulant_ _mécanique_. Les arbres connectés auront exactement la même vitesse et le même sens de rotation. La ceinture peut agir comme un _convoyeur_ pour _objets_ et _entités_.",
"item.create.belt_connector.tooltip.control1": "Clic droit sur arbre",
"item.create.belt_connector.tooltip.action1": "Sélectionne l'arbre comme une poulie de la courroie. Les deux arbres sélectionnés doivent être _alignés_ soit _verticalement_, _horizontalement_, ou _diagonalement_ en direction de la courroie.",
"item.create.belt_connector.tooltip.summary": "Connecte deux _rotors_ ou plus à un _tapis_ _roulant_ _mécanique_. Les rotors connectés auront exactement la même vitesse et le même sens de rotation. La ceinture peut agir comme un _convoyeur_ pour _objets_ et _entités_.",
"item.create.belt_connector.tooltip.control1": "Clic droit sur rotor",
"item.create.belt_connector.tooltip.action1": "Sélectionne le rotor comme une poulie de la courroie. Les deux rotors sélectionnés doivent être _alignés_ soit _verticalement_, _horizontalement_, ou _diagonalement_ en direction de la courroie.",
"item.create.belt_connector.tooltip.control2": "Clic droit en étant accroupi",
"item.create.belt_connector.tooltip.action2": "_Réinitialise_ la première position sélectionnée pour le tapis roulant.",
"item.create.goggles.tooltip": "LUNETTES",
"item.create.goggles.tooltip.summary": "Une paire de lunettes pour augmenter votre vision avec des _informations_ _kinétiques_ utiles.",
"item.create.goggles.tooltip.condition1": "Lorsque portées",
"item.create.goggles.tooltip.condition1": "Quand portées",
"item.create.goggles.tooltip.behaviour1": "Affiche des _indicateurs_ _colorés_ correspondants au _niveau_ _de_ _vitesse_ d'un composant cinétique placé ainsi que _l'impact_ du _stress_ et la _capacité_ des composants individuels.",
"item.create.goggles.tooltip.condition2": "Lorsque vision portée sur une jauge",
"item.create.goggles.tooltip.condition2": "Quand vision portée sur une jauge",
"item.create.goggles.tooltip.behaviour2": "Affiche des informations détaillées sur la _vitesse_ ou le _stress_ du réseau auquel la jauge est connectée.",
"item.create.wrench.tooltip": "CLÉ",
"item.create.wrench.tooltip.summary": "Un outil utile pour travailler sur les engins cinétiques. Peut être utilisé pour _tourner_, _démonter_ et _configurer_ les composants.",
"item.create.wrench.tooltip.control1": "Clic droit a kinetic block",
"item.create.wrench.tooltip.action1": "_Tourne_ les _composents_ proche ou loin de la face avec lequel vous avez interagi.",
"item.create.wrench.tooltip.control1": "Clic droit sur un bloc de Create",
"item.create.wrench.tooltip.action1": "_Tourne_ le _composant_ le long de l'axe dépendant de la face avec lequel vous avez interagi.",
"item.create.wrench.tooltip.control2": "Clic droit en étant accroupi",
"item.create.wrench.tooltip.action2": "_Démonte_ les _composants_ _cinétiques_ et les replace dans _votre_ _inventaire_.",
@ -768,17 +806,17 @@
"block.create.water_wheel.tooltip": "ROUE À EAU",
"block.create.water_wheel.tooltip.summary": "Fournit une _force_ _de_ _rotation_ provenant de _courants_ _d'eau_ adjacents.",
"block.create.encased_fan.tooltip": "VENTILATEUR ENFERMÉ",
"block.create.encased_fan.tooltip": "VENTILATEUR ENCHÂSSÉ",
"block.create.encased_fan.tooltip.summary": "Convertit _force_ _de_ _rotation_ en _courants_ _d'air_ et inversement. A une variété d'utilisations.",
"block.create.encased_fan.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.encased_fan.tooltip.behaviour1": "Fournit _force_ _de_ _rotation_ à partir de toute _source_ _de_ _chaleur_ immédiatement en dessous de lui. Le ventilateur doit être tourné vers le bas.",
"block.create.encased_fan.tooltip.condition2": "Lorsque tourné",
"block.create.encased_fan.tooltip.condition2": "Quand tourné",
"block.create.encased_fan.tooltip.behaviour2": "_Pousse_ ou _tire_ les entités, selon la vitesse de rotation entrante.",
"block.create.encased_fan.tooltip.condition3": "Lorsque souffle à travers des blocs spéciaux",
"block.create.encased_fan.tooltip.condition3": "Quand souffle à travers des blocs spéciaux",
"block.create.encased_fan.tooltip.behaviour3": "Des particules de _liquides_ et de _feu_ sont émises dans le flux d'air. Cela peut être utilisé pour _traiter_ des _objets_.",
"block.create.nozzle.tooltip": "BUSE",
"block.create.nozzle.tooltip.summary": "Attachez-le à l'avant d'un _ventilateur_ _enfermé_ pour répartir son effet sur les entités dans _toutes_ les _directions_.",
"block.create.nozzle.tooltip.summary": "Attachez-le à l'avant d'un _ventilateur_ enchâssé_ pour répartir son effet sur les entités dans _toutes_ les _directions_.",
"block.create.hand_crank.tooltip": "MANIVELLE",
"block.create.hand_crank.tooltip.summary": "Une simple _source_ de _force_ _de_ _rotation_ qui nécessite l'interaction des joueurs.",
@ -787,16 +825,16 @@
"block.create.cuckoo_clock.tooltip": "COUCOU",
"block.create.cuckoo_clock.tooltip.summary": "Un bel artisanat pour _décorer_ un espace et _garder_ la _notion_ _du_ _temps_.",
"block.create.cuckoo_clock.tooltip.condition1": "Lorsque tourné",
"block.create.cuckoo_clock.tooltip.condition1": "Quand tourné",
"block.create.cuckoo_clock.tooltip.behaviour1": "Affiche le _temps_ _présent_ et joue une mélodie deux fois par jour. _S'active_ une fois le _midi_ et une fois au crépuscule, dès que les _joueurs_ _peuvent_ _dormir_.",
"block.create.turntable.tooltip": "PLAQUE TOURNANTE",
"block.create.turntable.tooltip.summary": "Transforme la _force_ _de_ _rotation_ en une nausée.",
"block.create.turntable.tooltip.summary": "Transforme la _force_ _de_ _rotation_ en énergie cinétique.",
"block.create.crushing_wheel.tooltip": "ROUE DE CONCASSAGE",
"block.create.crushing_wheel.tooltip.summary": "Grandes roues rotatives qui _cassent_ n'importe quoi.",
"block.create.crushing_wheel.tooltip.condition1": "Lorsque fixé à une autre roue de concassage",
"block.create.crushing_wheel.tooltip.condition1": "Quand fixé à une autre roue de concassage",
"block.create.crushing_wheel.tooltip.behaviour1": "Forme une machine de concassage pour traiter une variété de choses. Les dents des roues doivent se connecter et se déplacer avec la _même_ _vitesse_ dans des _directions_ _opposées_.",
"block.create.mechanical_press.tooltip": "PRESSE MÉCANIQUE",
@ -814,11 +852,11 @@
"block.create.mechanical_mixer.tooltip": "MIXEUR MÉCANIQUE",
"block.create.mechanical_mixer.tooltip.summary": "Un fouet cinétique pour appliquer toutes les recettes d'artisanat informes aux objets en dessous. Nécessite une _force_ _de_ _rotation_ constant et un _bassin_ placé en dessous (avec un espace entre les deux).",
"block.create.mechanical_mixer.tooltip.condition1": "Lorsqu'au-dessus d'un bassin",
"block.create.mechanical_mixer.tooltip.behaviour1": "Commence à mélanger les objets dans le bassin lorsque tous les ingrédients nécessaires sont présents.",
"block.create.mechanical_mixer.tooltip.behaviour1": "Commence à mélanger les objets dans le bassin Quand tous les ingrédients nécessaires sont présents.",
"block.create.mechanical_crafter.tooltip": "ÉTABLI MÉCANIQUE",
"block.create.mechanical_crafter.tooltip.summary": "Un assembleur cinétique pour _automatiser_ n'importe quelle recette _en_ _forme_. Placez-en _plusieurs_ _dans_ _une_ _grille_ correspondant à votre recette, et _arrangez_ _leurs_ _tapis_ _roulant_ pour créer un _flux_ qui sort de la grille sur l'un des établis.",
"block.create.mechanical_crafter.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_crafter.tooltip.condition1": "Quand tourné",
"block.create.mechanical_crafter.tooltip.behaviour1": "_Démarre_ _le_ _processus_ _d'artisanat_ dès que _tous_ les _établis_ dans la grille ont _reçu_ _un_ _objet_.",
"block.create.mechanical_crafter.tooltip.control1": "Lorsqu'utilisation de la clé à l'avant",
"block.create.mechanical_crafter.tooltip.action1": "_Fait_ _défiler_ _la_ _direction_ dans laquelle un établi individuel _déplace_ _ses_ _objets_. Pour former une grille de travail, disposer les _tapis_ _roulants_ _dans_ _un_ _flux_ qui déplace tous les articles vers un établi final. Le dernier artisan doit _pointer_ _autrepart_ de la grille.",
@ -838,7 +876,7 @@
"block.create.portable_storage_interface.tooltip": "INTERFACE DE STOCKAGE PORTABLE",
"block.create.portable_storage_interface.tooltip.summary": "Un point d'échange portable pour _déplacer_ des _objets_ vers et depuis une _structure_ déplacée par un piston, un roulement, un chariot ou une poulie.",
"block.create.portable_storage_interface.tooltip.condition1": "Lorsqu'en mouvement",
"block.create.portable_storage_interface.tooltip.behaviour1": "Interagit avec les _transposeurs_ stationnaires de sorte que les transposeurs faisant _face_ _autrepart_ de l'interface tirent les objets, et les transposeurs ciblant l'interface y _insereront_ les _objets_ de l'inventaire joint. L'engin se bloquera brièvement lorsque les objets seront échangés.",
"block.create.portable_storage_interface.tooltip.behaviour1": "Interagit avec les _transposeurs_ stationnaires de sorte que les transposeurs faisant _face_ _autrepart_ de l'interface tirent les objets, et les transposeurs ciblant l'interface y _insereront_ les _objets_ de l'inventaire joint. L'engin se bloquera brièvement Quand les objets seront échangés.",
"block.create.rotation_speed_controller.tooltip": "CONTRÔLEUR DE VITESSE DE ROTATION",
@ -848,17 +886,17 @@
"block.create.mechanical_piston.tooltip": "PISTON MÉCANIQUE",
"block.create.mechanical_piston.tooltip.summary": "Une version plus avancée du _piston_. Il utilise une _force_ _de_ rotation_ pour déplacer précisément les structures attachées. Les _pôles_ _d'extension_ _de_ _piston_ à l'arrière définissent la _portée_ de cet appareil. Sans extensions, le piston ne bougera pas. Utilisez un _châssis_ ou un _bloc_ _de_ slime_ pour déplacer plus d'une seule ligne de blocs.",
"block.create.mechanical_piston.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_piston.tooltip.condition1": "Quand tourné",
"block.create.mechanical_piston.tooltip.behaviour1": "Commence à déplacer la structure attachée. La vitesse et la direction sont corrélées à la vitesse de rotation entrante.",
"block.create.piston_extension_pole.tooltip": "PÔLE DE PISTON",
"block.create.piston_extension_pole.tooltip": "BARRE DE PISTON",
"block.create.piston_extension_pole.tooltip.summary": "Étend la portée des _pistons_ _mécaniques.",
"block.create.piston_extension_pole.tooltip.condition1": "Lorsqu'attaché à un piston mécanique",
"block.create.piston_extension_pole.tooltip.behaviour1": "Étend la portée du _piston_ d'un bloc",
"block.create.mechanical_bearing.tooltip": "ROULEMENT MÉCANIQUE",
"block.create.mechanical_bearing.tooltip.summary": "Utilisé pour faire tourner de _plus_ _grande_ _structures_ ou pour exploiter une _force_ _de_ rotation_ contre le vent.",
"block.create.mechanical_bearing.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_bearing.tooltip.condition1": "Quand tourné",
"block.create.mechanical_bearing.tooltip.behaviour1": "Démarre les blocs attachés en rotation. Utilisez un _châssis_ ou _bloc_ _de_ _slime_ pour déplacer plus d'un seul bloc.",
@ -866,48 +904,50 @@
"block.create.clockwork_bearing.tooltip": "ROULEMENT MÉCANIQUE HORLOGER",
"block.create.clockwork_bearing.tooltip.summary": "Une version avancée du _roulement_ _mécanique_ pour faire tourner jusqu'à deux _aiguilles_ _d'horloge_ en fonction du _temps_ _en-jeu_ actuel.",
"block.create.clockwork_bearing.tooltip.condition1": "Lorsque tourné",
"block.create.clockwork_bearing.tooltip.condition1": "Quand tourné",
"block.create.clockwork_bearing.tooltip.behaviour1": "Commence la rotation de la structure attachée vers l'_heure_ _actuelle_. Si une seconde structure est présente, elle servira _d'aiguille_ _des_ _minutes_.",
"block.create.sequenced_gearshift.tooltip": "DÉCALEUR DE ROTATION SÉQUENCÉ",
"block.create.sequenced_gearshift.tooltip": "BOÎITE À VITESSES SÉQUENCÉE",
"block.create.sequenced_gearshift.tooltip.summary": "Un _composant_ _utilitaire_ _programmable_, qui peut changer son _débit_ _de_ _rotation_ suivant jusqu'à _5_ _instructions_ _consécutives_. Utilisez-le pour alimenter des roulements mécaniques, des pistons ou des poulies avec plus de contrôle sur le timing et la vitesse. Peut devenir moins précis à des vitesses plus élevées.",
"block.create.sequenced_gearshift.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.sequenced_gearshift.tooltip.behaviour1": "_Commence_ _à_ _exécuter_ les instructions programmées en fonction de la vitesse d'entrée.",
"block.create.sequenced_gearshift.tooltip.condition2": "Clic droit",
"block.create.sequenced_gearshift.tooltip.behaviour2": "Ouvre _l'interface_ _de_ _configuration_",
"block.create.cart_assembler.tooltip": "ASSEMBLEUR DE CHARIOT",
"block.create.cart_assembler.tooltip.summary": "Monte une structure connectée sur un _chariot_ _passant_.",
"block.create.cart_assembler.tooltip": "ASSEMBLEUR DE WAGON",
"block.create.cart_assembler.tooltip.summary": "Monte une structure connectée sur un _wagon_ _passant_.",
"block.create.cart_assembler.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.cart_assembler.tooltip.behaviour1": "_Démonte_ les structures montées un _chariot_ _passant_ et les remet dans le monde.",
"block.create.cart_assembler.tooltip.behaviour1": "_Démonte_ les structures montées un _wagon passant_ et les remet dans le monde.",
"block.create.rope_pulley.tooltip": "POULIE DE CORDE",
"block.create.rope_pulley.tooltip": "POULIE",
"block.create.rope_pulley.tooltip.summary": "Déplace les _blocs_ et _structures_ attachés _verticalement_. Utilisez un _châssis_ ou _bloc_ _de_ _slime_ pour déplacer plus d'un seul bloc.",
"block.create.rope_pulley.tooltip.condition1": "Lorsque tourné",
"block.create.rope_pulley.tooltip.condition1": "Quand tourné",
"block.create.rope_pulley.tooltip.behaviour1": "Commence à déplacer la structure attachée. La vitesse et la direction sont corrélées à la vitesse de rotation entrante.",
"block.create.linear_chassis.tooltip": "CHÂSSIS DE TRADUCTION",
"block.create.linear_chassis.tooltip": "CHÂSSIS LINÉAIRE",
"block.create.linear_chassis.tooltip.summary": "Un bloc de base configurable reliant les structures pour le mouvement.",
"block.create.linear_chassis.tooltip.condition1": "Lorsque déplacé",
"block.create.linear_chassis.tooltip.condition1": "Quand déplacé",
"block.create.linear_chassis.tooltip.behaviour1": "_Déplace_ tous les _châssis_ _attachés_ avec la même orientation, et une colonne de blocs dans sa portée. Les blocs ne seront tirés que si la face du châssis est _collante_ (Voir [Ctrl]).",
"block.create.linear_chassis.tooltip.condition2": "Lorsqu'utilisé avec une clé",
"block.create.linear_chassis.tooltip.behaviour2": "Configurez la _portée_ pour ce bloc de châssis. Maintenez CTRL pour modifier également la plage de tous les blocs de châssis connectés.",
"block.create.linear_chassis.tooltip.control1": "Clic droit avec une boule de slime",
"block.create.linear_chassis.tooltip.action1": "Rends la face _collante_. Lorsque déplace, le châssis va _tirer_ les blocs attachés, quelle que soit la direction du mouvement.",
"block.create.linear_chassis.tooltip.action1": "Rend la face _collante_. Quand déplacé, le châssis va _tirer_ les blocs attachés, quelle que soit la direction du mouvement.",
"block.create.secondary_linear_chassis.tooltip": "CHÂSSIS LINÉAIRE SECONDAIRE",
"block.create.secondary_linear_chassis.tooltip.summary": "Un deuxième type de _châssis linéaire_ qui ne se connecte pas au premier.",
"block.create.radial_chassis.tooltip": "CHÂSSIS DE ROTATION",
"block.create.radial_chassis.tooltip.summary": "Un bloc de base configurable reliant les structures pour le mouvement.",
"block.create.radial_chassis.tooltip.condition1": "Lorsque déplacé",
"block.create.radial_chassis.tooltip.condition1": "Quand déplacé",
"block.create.radial_chassis.tooltip.behaviour1": "_Déplace_ tous les _châssis_ _attachés_ en colonne, et un cylindre de blocs autour de lui. Les blocs qui l'entourent ne sont déplacés que lorsqu'ils sont à portée et attachés à un côté collant (voir [Ctrl]).",
"block.create.radial_chassis.tooltip.condition2": "Lorsqu'utilisé avec une clé",
"block.create.radial_chassis.tooltip.behaviour2": "Configure la _portée_ pour ce bloc de châssis. Maintenez CTRL pour modifier également la portée de tous les blocs de châssis connectés.",
"block.create.radial_chassis.tooltip.control1": "Clic droit avec une boule de slime",
"block.create.radial_chassis.tooltip.action1": "Rend la face _collante_. Lorsque le châssis se déplace, tous les blocs désignés attachés au côté collant sont déplacés avec lui.",
"block.create.radial_chassis.tooltip.action1": "Rend la face _collante_. Quand le châssis se déplace, tous les blocs désignés attachés au côté collant sont déplacés avec lui.",
"block.create.mechanical_drill.tooltip": "PERCEUSE MÉCANIQUE",
"block.create.mechanical_drill.tooltip.summary": "Un dispositif mécanique adapté pour _casser_ les _blocs_. Il est déplaceable avec _pistons_ _mécaniques_ ou _roulements_.",
"block.create.mechanical_drill.tooltip.condition1": "Lorsque tourné",
"block.create.mechanical_drill.tooltip.condition1": "Quand tourné",
"block.create.mechanical_drill.tooltip.behaviour1": "Agit comme un casseur de bloc _stationnaire_. Inflige aussi des _dégats_ aux _entités_ se situant dans sa zone effective.",
"block.create.mechanical_drill.tooltip.condition2": "Lorsqu'en mouvement",
"block.create.mechanical_drill.tooltip.behaviour2": "Casse les blocs avec lesquels la perceuse entre en collision.",
@ -917,38 +957,44 @@
"block.create.mechanical_harvester.tooltip.condition1": "Lorsqu'en mouvement",
"block.create.mechanical_harvester.tooltip.behaviour1": "_Récolte_ toutes les _cultures_ _matures_ que la lame entre en touche et les remet à leur état de croissance initial.",
"block.create.mechanical_plough.tooltip": "CHARRUE MÉCANIQUE",
"block.create.mechanical_plough.tooltip.summary": "Une charrue mécanique a divers usages. Elle peut être déplacée à l'aide de _pistons mécaniques_, de _roulements_ ou d'autres dispositifs de commande.",
"block.create.mechanical_plough.tooltip.condition1": "Lorsquen mouvement",
"block.create.mechanical_plough.tooltip.behaviour1": "_Casse les blocs_ avec lesquels _on ne peut pas entrer en collision_, tels que les torches, les sentiers ou les couches de neige. _Applique_ son _mouvement_ aux _entités_ sans les blesser. _Bêche les blocs de terre_ comme si une houe était utilisée sur ceux-ci.",
"block.create.mechanical_saw.tooltip": "SCIE MÉCANIQUE",
"block.create.mechanical_saw.tooltip.summary": "Convient pour _couper_ des _arbres_ efficacement et pour _tailler_ des _blocs_ dans leurs homologues menuisés. Il est déplaceable à l'aide de _pistons_ _mécaniques_ ou _roulements_.",
"block.create.mechanical_saw.tooltip.condition1": "Lorsque tourné vers le haut",
"block.create.mechanical_saw.tooltip.behaviour1": "Applique les _recettes_ de _sciage_ et de _taillerie_ aux éléments jetés ou insérés dedans. Lorsque plusieurs sorties sont possibles, il les parcourt à moins qu'un _filtre_ ne soit affecté.",
"block.create.mechanical_saw.tooltip.summary": "Convient pour _couper_ des _rotors_ efficacement et pour _tailler_ des _blocs_ dans leurs homologues menuisés. Il est déplaceable à l'aide de _pistons_ _mécaniques_ ou _roulements_.",
"block.create.mechanical_saw.tooltip.condition1": "Quand tourné vers le haut",
"block.create.mechanical_saw.tooltip.behaviour1": "Applique les _recettes_ de _sciage_ et de _taillerie_ aux éléments jetés ou insérés dedans. Quand plusieurs sorties sont possibles, il les parcourt à moins qu'un _filtre_ ne soit affecté.",
"block.create.mechanical_saw.tooltip.condition2": "Lorsqu'à l'horizontal",
"block.create.mechanical_saw.tooltip.behaviour2": "_Casse_ les _troncs_ devant elle. Si le tronc a supportait un arbre, _l'arbre_ _tombera_ loin de la scie.",
"block.create.mechanical_saw.tooltip.behaviour2": "_Casse_ les _troncs_ devant elle. Si le tronc a supportait un rotor, _le rotor_ _tombera_ loin de la scie.",
"block.create.mechanical_saw.tooltip.condition3": "Lorsqu'en mouvement",
"block.create.mechanical_saw.tooltip.behaviour3": "_Coupe_ tous les _arbres_ avec lesquels la scie entre en collision.",
"block.create.mechanical_saw.tooltip.behaviour3": "_Coupe_ tous les _rotors_ avec lesquels la scie entre en collision.",
"block.create.stockpile_switch.tooltip": "DÉTÉCTEUR DE STOCKAGE",
"block.create.stockpile_switch.tooltip.summary": "Bascule un signal Redstone basé sur _l'espace_ _de_ _stockage_ dans le conteneur attaché.",
"block.create.stockpile_switch.tooltip.condition1": "Lorsqu'en dessous de la limite de stockage minimum",
"block.create.stockpile_switch.tooltip.behaviour1": "Arrête de fournir de _l'énergie_",
"block.create.content_observer.tooltip": "OBSERVATEUR DE CONTENU",
"block.create.content_observer.tooltip.summary": "_Détecte les objets_ à l'intérieur des _conteneurs_ et des _transporteurs_ correspondant à un _filtre_ configuré. Tant que l'_inventaire_, le _tapis roulant_ ou la _glissière_ observé _contient_ un objet correspondant, ce composant émet un _signal de redstone_. Quand un _entonnoir_ observé _transfère_ un objet correspondant, ce composant émet une _impulsion de redstone_.",
"block.create.redstone_link.tooltip": "LIAISON REDSTONE",
"block.create.redstone_link.tooltip.summary": "Points de terminaison pour les connexions de _redstone_ _sans-fil_. Peut être attribué des _fréquences_ en utilisant n'importe quel objet. La portée du signal est limitée, quoique raisonnablement loin.",
"block.create.redstone_link.tooltip.condition1": "Lorsqu'alimenté",
"block.create.redstone_link.tooltip.behaviour1": "La réception de liens de la même _fréquence_ produira un signal redstone.",
"block.create.redstone_link.tooltip": "LIEN DE REDSTONE",
"block.create.redstone_link.tooltip.summary": "Terminaux pour les connexions de _redstone_ _sans-fil_. Peut être attribué des _fréquences_ en utilisant n'importe quel objet. La portée du signal est limitée, nonobstant raisonnablement loin.",
"block.create.redstone_link.tooltip.condition1": "Quand alimenté",
"block.create.redstone_link.tooltip.behaviour1": "Les liens de la même _fréquence_ configurés en réception produira un signal redstone.",
"block.create.redstone_link.tooltip.control1": "Clic droit avec un objet",
"block.create.redstone_link.tooltip.action1": "Définit la _fréquence_ sur cet élément. Un total de _deux_ _différents_ _objets_ peuvent être utilisés en combinaison pour définir une fréquence.",
"block.create.redstone_link.tooltip.control2": "Clic droit en étant accroupi",
"block.create.redstone_link.tooltip.action2": "TBascule entre le mode _receveur_ et _transmetteur_.",
"block.create.redstone_link.tooltip.action2": "Bascule entre le mode _récepteur_ et _transmetteur_.",
"block.create.redstone_contact.tooltip": "redstone_contact REDSTONE",
"block.create.redstone_contact.tooltip.summary": "N'émet de l'énergie que par paires. Il est mobile avec _pistons_ _mécaniques_ ou _roulements_.",
"block.create.redstone_contact.tooltip.condition1": "Lorsque tourné vers un autre redstone_contact",
"block.create.redstone_contact.tooltip.behaviour1": "Fournit un _signal_ _redstone_.",
"block.create.redstone_contact.tooltip.condition2": "Lorsqu'en mouvement",
"block.create.redstone_contact.tooltip.behaviour2": "Déclenche tous les redstone_contacts fixes qu'il passe.",
"block.create.redstone_contact.tooltip": "CONTACT DE REDSTONE",
"block.create.redstone_contact.tooltip.summary": "N'émet de l'énergie que par paires. Il est mobile avec des _pistons_ _mécaniques_ ou _roulements_.",
"block.create.redstone_contact.tooltip.condition1": "Quand tourné vers un autre contact de redstone",
"block.create.redstone_contact.tooltip.behaviour1": "Fournit un _signal_ de _redstone_.",
"block.create.redstone_contact.tooltip.condition2": "Quand en mouvement",
"block.create.redstone_contact.tooltip.behaviour2": "Déclenche tous les contacts de redstone fixes qu'il passe.",
"block.create.adjustable_crate.tooltip": "CAISSE AJUSTABLE",
"block.create.adjustable_crate.tooltip.summary": "Ce _conteneur_ _de_ _stockage_ permet un contrôle manuel de sa capacité. Il peut contenir jusqu'à _16_ _piles_ de n'importe quel objet. Prend en charge les _comparateurs_ _de_ _redstone_.",
@ -957,16 +1003,20 @@
"block.create.creative_crate.tooltip": "CAISSE CRÉATIVE",
"block.create.creative_crate.tooltip.summary": "Fournit une réserve infinie de blocs aux _Schémacanons_ adjacents.",
"block.create.creative_crate.tooltip.condition1": "Quand un objet se trouve dans l'emplacement de filtrage",
"block.create.creative_crate.tooltip.behaviour1": "Tout ce qui _extrait_ de ce conteneur aura une _alimentation illimitée_ de l'objet spécifié. Les objets _insérés_ dans cette caisse seront _éliminés_.",
"block.create.deployer.tooltip": "DÉPLOYEUR",
"block.create.deployer.tooltip.summary": "_Frappe_, _utilise_ et _active_. Cette machine essaiera _d'imiter_ un _joueur_ autant que possible. Peut _prendre_ et _déposer_ des _objets_ dans _l'inventaire_ adjacent. Peut être affecté à une pile d'éléments en tant que _filtre_.",
"block.create.deployer.tooltip.condition1": "Lorsque tourné",
"block.create.deployer.tooltip.condition1": "Quand tourné",
"block.create.deployer.tooltip.behaviour1": "Étend son bras et _active_ dans l'espace de bloc _2m_ _devant_ de lui-même.",
"block.create.deployer.tooltip.condition2": "Clic droit avec une clé",
"block.create.deployer.tooltip.behaviour2": "Bascule le mode frappe. Dans le _mode_ _frappe_, le déployeur tentera d'utiliser son élément pour _casser_ les _blocs_ ou infliger des _dégats_ aux _entités_.",
"block.create.deployer.tooltip.condition3": "Quand un filtre est attribué",
"block.create.deployer.tooltip.behaviour3": "Le déploiement n'est activé que si l'élément tenu _correspond_ au _filtre._ Les éléments ne correspondant pas ne peuvent pas être insérés ; les éléments tenus correspondant au filtre ne peuvent pas être extraits.",
"block.create.brass_casing.tooltip": "BOÎTIER EN LAITON",
"block.create.brass_casing.tooltip.summary": "Boîtier de machine robuste avec une variété d'utilisations. Sans danger pour la décoration.",
"block.create.brass_casing.tooltip": "REVÊTEMENT EN LAITON",
"block.create.brass_casing.tooltip.summary": "Revêtement de machine robuste avec une variété d'utilisations. Sans danger pour la décoration.",
"block.create.pulse_repeater.tooltip": "RÉPÉTEUR D'IMPULSIONS",
"block.create.pulse_repeater.tooltip.summary": "Un circuit simple pour couper les signaux de redstone passant à une longueur de _1_ _tick_.",
@ -989,20 +1039,36 @@
"block.create.speedometer.tooltip": "COMPTEUR DE VITESSE",
"block.create.speedometer.tooltip.summary": "Mesure et affiche la _ vitesse de rotation _ des composants cinétiques attachés. Prend en charge les _comparateurs_ _de_ _redstone_.",
"block.create.speedometer.tooltip.condition1": "Lorsque tourné",
"block.create.speedometer.tooltip.condition1": "Quand tourné",
"block.create.speedometer.tooltip.behaviour1": "Indique une couleur correspondant au niveau de vitesse. _Vert_ indique une rotation lente, _Bleu_ modérée et _violet_ rapide. Certains composants mécaniques nécessitent une vitesse suffisante pour fonctionner correctement.",
"block.create.stressometer.tooltip": "STRESSOMÈTRE",
"block.create.stressometer.tooltip.summary": "Mesure et affiche la _stress__ globale du réseau cinétique attaché. Prend en charge les _comparateurs_ _de_ _redstone_.",
"block.create.stressometer.tooltip.condition1": "Lorsque tourné",
"block.create.stressometer.tooltip.condition1": "Quand tourné",
"block.create.stressometer.tooltip.behaviour1": "Indique une couleur correspondant au niveau de contrainte. Les _réseaux_ _surchargés_ cesseront de bouger. Le stress peut être soulagé en ajoutant plus de _sources_ _rotationnelles_ au réseau.",
"item.create.sand_paper.tooltip": "PAPIER DE VERRE",
"item.create.sand_paper.tooltip.summary": "Un papier rugueux qui peut être utilisé pour _polir des matériaux_. Peut être appliqué automatiquement à l'aide du déployeur.",
"item.create.sand_paper.tooltip.condition1": "Quand utilisé",
"item.create.sand_paper.tooltip.behaviour1": "Polit les objets qui se tenus dans la _main secondaire_ ou par terre quand on les _regarde_.",
"item.create.super_glue.tooltip": "COLLE EXTRA-FORTE",
"item.create.super_glue.tooltip.summary": "Collez un bloc à un autre, et ils seront à jamais inséparables.",
"item.create.super_glue.tooltip.condition1": "Quand utilisé",
"item.create.super_glue.tooltip.behaviour1": "Rend la face _cliquée_ d'un bloc _collante_. Les blocs attachés aux faces collantes seront entraînés par des _pistons mécaniques_, _des roulements_ et d'autres contrôleurs.",
"item.create.super_glue.tooltip.condition2": "Quand tenu en main secondaire",
"item.create.super_glue.tooltip.behaviour2": "Attache automatiquement les blocs placés de la main principale à la _face_ contre laquelle ils ont été _placés_.",
"item.create.builders_tea.tooltip": "THÉ DU CONSTRUCTEUR",
"item.create.builders_tea.tooltip.summary": "La boisson parfaite pour commencer la journée - _motivante_ et _rasasiante_.",
"item.create.refined_radiance.tooltip": "ÉCLAT RAFFINÉ",
"item.create.refined_radiance.tooltip.summary": "Un matériau chromatique forgé à partir de _lumière_ _absorbée_.",
"item.create.shadow_steel.tooltip": "ACIER SOMBRE",
"item.create.shadow_steel.tooltip.summary": "Un matériau chromatique forgé _dans_ _le_ _néant_.",
"item.create.minecart_coupling.tooltip": "LIEN POUR WAGONS",
"item.create.crafter_slot_cover.tooltip": "COUVERCLE D'EMPLACEMENT",
"item.create.crafter_slot_cover.tooltip.summary": "Utilisé pour marquer un _établi_ _mécanique_ comme un emplacement vide dans une recette. Les établis ne doivent pas nécessairement former une grille carrée complète. C'est utile quand il y a des recettes où les _ingredients_ _sont_ _en_ _diagonale_ les uns aux autres.",
@ -1012,7 +1078,7 @@
"create.tooltip.randomWipDescription0": "Veuillez garder cet objet hors de portée des enfants.",
"create.tooltip.randomWipDescription1": "Un bébé panda meurt chaque fois que vous utilisez cet objet. Chaque. Fois.",
"create.tooltip.randomWipDescription2": "À utiliser à vos risques et périls.",
"create.tooltip.randomWipDescription3": "Ce n'est pas l'objet que vous recherchez, *agites les doigts* veuillez vous disperser.",
"create.tooltip.randomWipDescription3": "Ce n'est pas l'objet que vous recherchez, *agite les doigts* circulez.",
"create.tooltip.randomWipDescription4": "Cet objet s'autodétruit en 10 secondes. 10, 9, 8...",
"create.tooltip.randomWipDescription5": "Croyez-moi, c'est inutile.",
"create.tooltip.randomWipDescription6": "En utilisant cet article, vous êtes responsables et acceptez ses conditions.",