Merge branch 'mc1.18/dev' into mc1.19/dev

This commit is contained in:
simibubi 2022-12-13 12:10:04 +01:00
commit 6854f14bf5
122 changed files with 20051 additions and 6325 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 4",
"_": "Missing Localizations: 0",
"_": "->------------------------] Game Elements [------------------------<-",
@ -576,8 +576,6 @@
"entity.create.stationary_contraption": "Macchinario stazionario",
"entity.create.super_glue": "Super colla",
"fluid.create.chocolate": "UNLOCALIZED: Chocolate",
"fluid.create.honey": "UNLOCALIZED: Honey",
"fluid.create.potion": "Pozione",
"fluid.create.tea": "Tè del costruttore",
@ -1487,7 +1485,7 @@
"create.schedule.condition.threshold.equal": "esattamente",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s di %3$s",
"create.schedule.condition.threshold.matching_content": "Contenuto corrispondente",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.anything": "qualsiasi cosa",
"create.schedule.condition.threshold.item_measure": "Misura",
"create.schedule.condition.threshold.items": "Oggetti",
"create.schedule.condition.threshold.stacks": "Stack",
@ -1495,7 +1493,7 @@
"create.schedule.condition.threshold.status": "Carico: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "Oggetto di riferimento",
"create.schedule.condition.threshold.place_item_2": "È permesso usare Filtri",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.threshold.place_item_3": "Lascia vuoto per confrontare qualsiasi cosa",
"create.schedule.condition.fluid_threshold": "Carico di fluidi",
"create.schedule.condition.item_threshold": "Carico di oggetti",
"create.schedule.condition.redstone_link": "Connessione redstone",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 6",
"_": "Missing Localizations: 0",
"_": "->------------------------] Game Elements [------------------------<-",
@ -390,7 +390,7 @@
"block.create.polished_cut_veridium_stairs": "磨かれた翡翠岩の切石の階段",
"block.create.polished_cut_veridium_wall": "磨かれた翡翠岩の切石の塀",
"block.create.portable_fluid_interface": "ポータブル液体インターフェース",
"block.create.portable_storage_interface": "ポータブルストレジインターフェース",
"block.create.portable_storage_interface": "ポータブルストジインターフェース",
"block.create.powered_latch": "パワードラッチ",
"block.create.powered_shaft": "パワードシャフト",
"block.create.powered_toggle_latch": "パワードトグルラッチ",
@ -492,8 +492,8 @@
"block.create.smart_fluid_pipe": "スマート液体パイプ",
"block.create.speedometer": "速度メーター",
"block.create.spout": "アイテム注液口",
"block.create.spruce_window": "マツの窓",
"block.create.spruce_window_pane": "マツの板窓",
"block.create.spruce_window": "トウヒの窓",
"block.create.spruce_window_pane": "トウヒの板窓",
"block.create.steam_engine": "蒸気エンジン",
"block.create.steam_whistle": "汽笛",
"block.create.steam_whistle_extension": "延長汽笛",
@ -576,8 +576,6 @@
"entity.create.stationary_contraption": "付設からくり",
"entity.create.super_glue": "超粘着剤",
"fluid.create.chocolate": "UNLOCALIZED: Chocolate",
"fluid.create.honey": "UNLOCALIZED: Honey",
"fluid.create.potion": "ポーション",
"fluid.create.tea": "建築家のお茶",
@ -590,7 +588,7 @@
"item.create.brass_hand": "真鍮の手",
"item.create.brass_ingot": "真鍮インゴット",
"item.create.brass_nugget": "真鍮塊",
"item.create.brass_sheet": "真鍮シート",
"item.create.brass_sheet": "真鍮",
"item.create.builders_tea": "建築家のお茶",
"item.create.chest_minecart_contraption": "チェスト付きからくりトロッコ",
"item.create.chocolate_bucket": "チョコレート入りバケツ",
@ -673,7 +671,7 @@
"advancement.create.andesite_alloy": "頑丈な岩",
"advancement.create.andesite_alloy.desc": "Createで最も重要な素材、安山岩合金を手に入れる。",
"advancement.create.andesite_casing": "安山岩の時代",
"advancement.create.andesite_casing.desc": "安山岩合金をに使って、基本の機械のケーシングを作る",
"advancement.create.andesite_casing.desc": "安山岩合金を樹皮を剥いだ原木に使って、基本の機械のケーシングを作る",
"advancement.create.mechanical_press": "ドン!",
"advancement.create.mechanical_press.desc": "メカニカルプレスで板を作る",
"advancement.create.encased_fan": "風のタクト",
@ -683,7 +681,7 @@
"advancement.create.saw_processing": "工房で最も恐ろしい",
"advancement.create.saw_processing.desc": "メカニカルソーを上向きに置いて素材を加工する",
"advancement.create.compacting": "小型化",
"advancement.create.compacting.desc": "プレスと鉢でより少ないアイテムからよりたくさんのアイテムを作る",
"advancement.create.compacting.desc": "メカニカルプレスと鉢でより少ないアイテムからよりたくさんのアイテムを作る",
"advancement.create.belt": "ベルトコンブア",
"advancement.create.belt.desc": "2つのシャフトをメカニカルベルトで繋ぐ",
"advancement.create.funnel": "空港の美学",
@ -708,10 +706,10 @@
"advancement.create.contraption_actors.desc": "ドリルか、ソー、ハーベスターのいずれかがついたからくりを作る",
"advancement.create.portable_storage_interface": "ドライブスルー",
"advancement.create.portable_storage_interface.desc": "ポータブルストレージインターフェースでからくりからアイテムを搬出入する",
"advancement.create.wrench_goggles": "装備支給",
"advancement.create.wrench_goggles": "装備一式",
"advancement.create.wrench_goggles.desc": "エンジニアのゴーグルとレンチを装備する",
"advancement.create.stressometer": "必要な応力は?",
"advancement.create.stressometer.desc": "動作中の応力メーターをゴーグルを通して見て、正確な値を読み取る",
"advancement.create.stressometer.desc": "エンジニアのゴーグルを通して、動作中の応力メーターから正確な値を読み取る",
"advancement.create.cuckoo_clock": "今何時?",
"advancement.create.cuckoo_clock.desc": "鳩時計が就寝の時間を告げるのを目撃する",
"advancement.create.windmill_maxed": "雄風",
@ -723,7 +721,7 @@
"advancement.create.cart_pickup": "力ずく",
"advancement.create.cart_pickup.desc": "200ブロック以上が取り付けられたからくりトロッコを回収する",
"advancement.create.anvil_plough": "鍛冶屋の大砲",
"advancement.create.anvil_plough.desc": "メカニカルプラウで金床を打ち上げる",
"advancement.create.anvil_plough.desc": "メカニカルプラウで金床を打ち出す",
"advancement.create.lava_wheel_00000": "マグマ車",
"advancement.create.lava_wheel_00000.desc": "こんなの動くべきじゃない§7\n(隠し進捗)",
"advancement.create.hand_crank_000": "トレーニングの時間",
@ -733,9 +731,9 @@
"advancement.create.stressometer_maxed": "無駄のない動き",
"advancement.create.stressometer_maxed.desc": "応力メーターがちょうど100%を指すのを読み取る§7\n(隠し進捗)",
"advancement.create.copper": "もっと頑丈な岩",
"advancement.create.copper.desc": "液体を取り扱うために、銅を貯めておく",
"advancement.create.copper.desc": "液体を取り扱うために、銅のインゴットを貯めておく",
"advancement.create.copper_casing": "銅の時代",
"advancement.create.copper_casing.desc": "銅のインゴットをに使って防水の機械のケーシングを作る",
"advancement.create.copper_casing.desc": "銅のインゴットを樹皮を剥いだ原木に使って防水の機械のケーシングを作る",
"advancement.create.spout": "ぱしゃぱしゃ",
"advancement.create.spout.desc": "アイテム注液口が液体を充填している様子を見る",
"advancement.create.drain": "回転式排液機",
@ -746,14 +744,14 @@
"advancement.create.steam_whistle.desc": "汽笛を稼働させる",
"advancement.create.backtank": "圧力、お持ち帰りで!",
"advancement.create.backtank.desc": "銅のバックタンクを作り、圧縮空気を溜める",
"advancement.create.diving_suit": "深海に潜る準備",
"advancement.create.diving_suit": "深海に出発だ!",
"advancement.create.diving_suit.desc": "銅のバックタンクと潜水ヘルメットを装備し、水に飛び込む",
"advancement.create.mechanical_pump_0": "圧をかける",
"advancement.create.mechanical_pump_0.desc": "メカニカルポンプを設置して、稼働させる",
"advancement.create.glass_pipe": "フロウ・スパイ",
"advancement.create.glass_pipe.desc": "液体が入ったパイプにレンチを使う",
"advancement.create.glass_pipe.desc": "液体が入ったプにレンチを使う",
"advancement.create.water_supply": "水たまり収集機",
"advancement.create.water_supply.desc": "パイプまたはポンプの端から、水を吸い込む",
"advancement.create.water_supply.desc": "液体パイプかメカニカルポンプの端から、水を吸い込む",
"advancement.create.hose_pulley": "工業排水",
"advancement.create.hose_pulley.desc": "ホースプーリーを下げて、液体の放出や吸引を見る",
"advancement.create.chocolate_bucket": "空想世界",
@ -767,7 +765,7 @@
"advancement.create.foods": "バランスのとれたおやつ",
"advancement.create.foods.desc": "チョコレートベリー、リンゴのハチミツかけ、スイートロールを全て同じ注液口で作る",
"advancement.create.diving_suit_lava": "ストライダーと泳ごう",
"advancement.create.diving_suit_lava.desc": "銅の潜水具と共にマグマダイブしてみる§7\n(隠し進捗)",
"advancement.create.diving_suit_lava.desc": "潜水具を着てマグマダイブしてみる§7\n(隠し進捗)",
"advancement.create.chained_drain": "うまく回ってます",
"advancement.create.chained_drain.desc": "並んだアイテム排液口の上をアイテムが通るのを見る§7\n(隠し進捗)",
"advancement.create.cross_streams": "液体を交差させるな!",
@ -775,9 +773,9 @@
"advancement.create.pipe_organ": "パイプオルガン",
"advancement.create.pipe_organ.desc": "音程の違う12個の汽笛を1つの液体タンクに設置する§7\n(隠し進捗)",
"advancement.create.brass": "本物の合金",
"advancement.create.brass.desc": "銅と亜鉛のインゴットをブレイズ付きミキサーを使って真鍮を作る",
"advancement.create.brass.desc": "ブレイズで加熱したメカニカルミキサーで銅と亜鉛のインゴットを合金にして真鍮を作る",
"advancement.create.brass_casing": "真鍮の時代",
"advancement.create.brass_casing.desc": "真鍮のインゴットをに使って、高度な機械のケーシングを作る。",
"advancement.create.brass_casing.desc": "真鍮のインゴットを樹皮を剥いだ原木に使って、高度な機械のケーシングを作る。",
"advancement.create.rose_quartz": "ピンク色のダイヤモンド",
"advancement.create.rose_quartz.desc": "ローズクォーツを磨く",
"advancement.create.deployer": "人工知能",
@ -807,7 +805,7 @@
"advancement.create.arm_blaze_burner": "燃料補給マシーン",
"advancement.create.arm_blaze_burner.desc": "メカニカルアームにブレイズバーナーの燃料補給をさせる",
"advancement.create.crusher_maxed_0000": "破砕の勢い",
"advancement.create.crusher_maxed_0000.desc": "破砕ホイールを最速度で稼働させる",
"advancement.create.crusher_maxed_0000.desc": "破砕ホイールを最速度で稼働させる",
"advancement.create.arm_many_targets": "整理整頓マシーン",
"advancement.create.arm_many_targets.desc": "メカニカルアームに10ヶ所以上、搬出先を設定する",
"advancement.create.potato_cannon_collide": "野菜花火",
@ -819,7 +817,7 @@
"advancement.create.crafter_lazy_000": "苦肉の策",
"advancement.create.crafter_lazy_000.desc": "メカニカルクラフターを極端に遅く稼働させ、インフラ整備を先延ばしにする§7\n(隠し進捗)",
"advancement.create.extendo_grip_dual": "脱法リーチ",
"advancement.create.extendo_grip_dual.desc": "二刀流のマジックハンドで超人的なリーチを手に入れる§7\n(隠し進捗)",
"advancement.create.extendo_grip_dual.desc": "マジックハンドの二刀流で超人的なリーチを手に入れる§7\n(隠し進捗)",
"advancement.create.musical_arm": "DJ メカニコ",
"advancement.create.musical_arm.desc": "メカニカルアームがジュークボックスを使う様子を見る§7\n(隠し進捗)",
"advancement.create.sturdy_sheet": "もっとも頑丈な岩",
@ -829,7 +827,7 @@
"advancement.create.train": "出発進行!",
"advancement.create.train.desc": "最初の列車を作る",
"advancement.create.conductor": "人材育成",
"advancement.create.conductor.desc": "時刻表で運転手に指示する",
"advancement.create.conductor.desc": "鉄道時刻表で運転手に指示する",
"advancement.create.track_signal": "運行管理",
"advancement.create.track_signal.desc": "鉄道信号機を設置する",
"advancement.create.display_board_0": "ダイナミックな時刻表",
@ -851,7 +849,7 @@
"advancement.create.train_roadkill": "轢き殺し",
"advancement.create.train_roadkill.desc": "列車で敵を轢く§7\n(隠し進捗)",
"advancement.create.red_signal": "運転の達人",
"advancement.create.red_signal.desc": "列車で赤信号を走る§7\n(隠し進捗)",
"advancement.create.red_signal.desc": "赤信号を無視する§7\n(隠し進捗)",
"advancement.create.train_crash": "ひどいおもてなし",
"advancement.create.train_crash.desc": "乗客として列車事故に遭遇する§7\n(隠し進捗)",
"advancement.create.train_crash_backwards": "盲点",
@ -1228,7 +1226,7 @@
"create.gui.filter.ignore_data": "データを無視",
"create.gui.filter.ignore_data.description": "アイテムは属性に関係なく一致します。",
"create.item_attributes.placeable": "設置できるか",
"create.item_attributes.placeable": "設置できるか",
"create.item_attributes.placeable.inverted": "設置できないか",
"create.item_attributes.consumable": "食べられるか",
"create.item_attributes.consumable.inverted": "食べられないか",
@ -1244,26 +1242,26 @@
"create.item_attributes.damaged.inverted": "破損していないか",
"create.item_attributes.badly_damaged": "ひどく損傷してるか",
"create.item_attributes.badly_damaged.inverted": "ひどく損傷していないか",
"create.item_attributes.not_stackable": "スタックできるか",
"create.item_attributes.not_stackable": "スタックできるか",
"create.item_attributes.not_stackable.inverted": "スタックできないか",
"create.item_attributes.equipable": "装備できるか",
"create.item_attributes.equipable": "装備できるか",
"create.item_attributes.equipable.inverted": "装備できないか",
"create.item_attributes.furnace_fuel": "かまどの燃料か",
"create.item_attributes.furnace_fuel.inverted": "かまどの燃料でないか",
"create.item_attributes.washable": "洗浄できるか",
"create.item_attributes.washable": "洗浄できるか",
"create.item_attributes.washable.inverted": "洗浄できないか",
"create.item_attributes.hauntable": "憑霊できるか",
"create.item_attributes.hauntable.inverted": "憑霊できないか",
"create.item_attributes.crushable": "粉砕できるか",
"create.item_attributes.crushable": "粉砕できるか",
"create.item_attributes.crushable.inverted": "粉砕できないか",
"create.item_attributes.smeltable": "精錬できるか",
"create.item_attributes.smeltable": "精錬できるか",
"create.item_attributes.smeltable.inverted": "精錬できないか",
"create.item_attributes.smokable": "燻製器で調理できるか",
"create.item_attributes.smokable": "燻製器で調理できるか",
"create.item_attributes.smokable.inverted": "燻製器で調理できないか",
"create.item_attributes.blastable": "溶鉱炉で精錬できるか",
"create.item_attributes.blastable": "溶鉱炉で精錬できるか",
"create.item_attributes.blastable.inverted": "溶鉱炉で精錬できないか",
"create.item_attributes.compostable": "UNLOCALIZED: can be composted",
"create.item_attributes.compostable.inverted": "UNLOCALIZED: cannot be composted",
"create.item_attributes.compostable": "コンポストできるか",
"create.item_attributes.compostable.inverted": "コンポストできないか",
"create.item_attributes.shulker_level": "%1$sシュルカーか",
"create.item_attributes.shulker_level.inverted": "%1$sシュルカーでないか",
"create.item_attributes.shulker_level.full": "満杯の",
@ -1275,7 +1273,7 @@
"create.item_attributes.in_item_group.inverted": "%1$sに属していないか",
"create.item_attributes.added_by": "%1$sによって追加されたか",
"create.item_attributes.added_by.inverted": "%1$sによって追加されていないか",
"create.item_attributes.has_enchant": "エンチャントされているか%1$s",
"create.item_attributes.has_enchant": "%1$sエンチャントされているか",
"create.item_attributes.has_enchant.inverted": "エンチャントがされていないか",
"create.item_attributes.color": "%1$sで染められているか",
"create.item_attributes.color.inverted": "%1$sで染められていないか",
@ -1487,7 +1485,7 @@
"create.schedule.condition.threshold.equal": "ぴったり",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$sの%3$s",
"create.schedule.condition.threshold.matching_content": "一致する貨物",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.anything": "なんでも",
"create.schedule.condition.threshold.item_measure": "アイテム単位",
"create.schedule.condition.threshold.items": "個",
"create.schedule.condition.threshold.stacks": "スタック",
@ -1495,7 +1493,7 @@
"create.schedule.condition.threshold.status": "貨物: %1$s/%2$s%3$s",
"create.schedule.condition.threshold.place_item": "参照アイテム",
"create.schedule.condition.threshold.place_item_2": "フィルターも使えます",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.threshold.place_item_3": "空白なら任意のアイテムと一致します",
"create.schedule.condition.fluid_threshold": "液体貨物の状態",
"create.schedule.condition.item_threshold": "アイテム貨物の状態",
"create.schedule.condition.redstone_link": "レッドストーンリンク",
@ -1685,7 +1683,7 @@
"create.display_source.station_summary": "鉄道駅の概要",
"create.display_source.station_summary.filter": "駅名フィルター",
"create.display_source.station_summary.train_name_column": "列車名の表示幅",
"create.display_source.station_summary.platform_column": "プラットフォームの表示幅",
"create.display_source.station_summary.platform_column": "駅名の表示幅",
"create.display_source.station_summary.now": "到着",
"create.display_source.station_summary.minutes": "分後",
"create.display_source.station_summary.seconds": "%1$s秒後",
@ -1853,7 +1851,7 @@
"item.create.tree_fertilizer.tooltip.behaviour1": "_間隔の条件_に_関係なく_苗木を成長させる",
"item.create.extendo_grip.tooltip": "マジックハンド",
"item.create.extendo_grip.tooltip.summary": "ビヨヨーン着用者の_射程_を大幅に_伸ばし_ます。",
"item.create.extendo_grip.tooltip.summary": "ビヨヨーン着用者の_リーチ_を大幅に_伸ばし_ます。",
"item.create.extendo_grip.tooltip.condition1": "オフハンドに装備したとき",
"item.create.extendo_grip.tooltip.behaviour1": "_メインハンド_で使うアイテムの_射程_を_伸ばし_ます。",
"item.create.extendo_grip.tooltip.condition2": "銅のバックタンクを装備したとき",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 10",
"_": "Missing Localizations: 2",
"_": "->------------------------] Game Elements [------------------------<-",
@ -576,8 +576,6 @@
"entity.create.stationary_contraption": "고정된 구조물",
"entity.create.super_glue": "강력 접착제",
"fluid.create.chocolate": "UNLOCALIZED: Chocolate",
"fluid.create.honey": "UNLOCALIZED: Honey",
"fluid.create.potion": "포션",
"fluid.create.tea": "건축가의 차",
@ -761,7 +759,7 @@
"advancement.create.honey_drain": "자동 양봉장",
"advancement.create.honey_drain.desc": "파이프를 이용해 벌집이나 벌통에서 꿀을 빼내세요",
"advancement.create.hose_pulley_lava": "맨틀 두드리기",
"advancement.create.hose_pulley_lava.desc": "무한으로 인식되는 용암 웅덩이에서 용암을 끌어올리세요",
"advancement.create.hose_pulley_lava.desc": "줄어들지 않을 정도로 큰 용암 웅덩이에서 용암을 끌어올리세요",
"advancement.create.steam_engine_maxed": "엔진 풀가동",
"advancement.create.steam_engine_maxed.desc": "보일러를 최고 레벨로 작동시키세요",
"advancement.create.foods": "달콤한 식단",
@ -977,7 +975,7 @@
"create.gui.scrollInput.scrollToAdjustAmount": "스크롤로 수량 조절하기",
"create.gui.scrollInput.scrollToSelect": "스크롤로 선택",
"create.gui.scrollInput.shiftScrollsFaster": "쉬프트-스크롤로 빨리 수정하기",
"create.gui.toolmenu.focusKey": "[%1$s] 눌러 세부정보 보기",
"create.gui.toolmenu.focusKey": "[%1$s]을(를) 눌러 세부정보 보기",
"create.gui.toolmenu.cycle": "스크롤로 순환",
"create.toolbox.unequip": "되돌리기: %1$s",
@ -1095,7 +1093,7 @@
"create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "축 회전",
"create.gui.sequenced_gearshift.instruction.turn_angle": "축 회전",
"create.gui.sequenced_gearshift.instruction.turn_angle.angle": "각도",
"create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "피스톤/도르래/트리 회전",
"create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "피스톤/도르래/트리 회전",
"create.gui.sequenced_gearshift.instruction.turn_distance": "장치 회전",
"create.gui.sequenced_gearshift.instruction.turn_distance.distance": "거리",
"create.gui.sequenced_gearshift.instruction.delay.descriptive": "지연 시간",
@ -1119,7 +1117,7 @@
"create.schematicAndQuill.title": "설계도 이름:",
"create.schematicAndQuill.convert": "저장하고 즉시 적용",
"create.schematicAndQuill.fallbackName": "내 설계도",
"create.schematicAndQuill.saved": "%1$s으(로) 저장했습니다",
"create.schematicAndQuill.saved": "%1$s(으)로 저장했습니다",
"create.schematic.invalid": "[!] 없는 아이템 - 설계도 테이블을 이용하세요",
"create.schematic.position": "위치",
@ -1217,7 +1215,7 @@
"create.schematicannon.status.schematicExpired": "설계도 파일이 제거됨",
"create.materialChecklist": "재료 목록",
"create.materialChecklist.blocksNotLoaded": "* 경고 *\n\n관련된 청크가 불러올 수 없어 재료 목록이 부정확할 수 있습니다.",
"create.materialChecklist.blocksNotLoaded": "* 경고 *\n\n관련된 청크가 불러와지지 않아 재료 목록이 부정확할 수 있습니다.",
"create.gui.filter.deny_list": "블랙리스트",
"create.gui.filter.deny_list.description": "위에 등록된 아이템은 통과할 수 없습니다. 빈 블랙리스트는 모든 아이템을 통과시킵니다.",
@ -1262,15 +1260,15 @@
"create.item_attributes.smokable.inverted": "훈연될 수 없음",
"create.item_attributes.blastable": "용광로에 녹일 수 있음",
"create.item_attributes.blastable.inverted": "용광로에 녹일 수 없음",
"create.item_attributes.compostable": "UNLOCALIZED: can be composted",
"create.item_attributes.compostable.inverted": "UNLOCALIZED: cannot be composted",
"create.item_attributes.shulker_level": "셜커가 %1$s있음",
"create.item_attributes.shulker_level.inverted": "셜커가 %1$s있지 않음",
"create.item_attributes.compostable": "퇴비로 쓸 수 있음",
"create.item_attributes.compostable.inverted": "퇴비로 쓸 수 없음",
"create.item_attributes.shulker_level": "셜커가 %1$s 있음",
"create.item_attributes.shulker_level.inverted": "셜커가 %1$s 있지 않음",
"create.item_attributes.shulker_level.full": "가득 차",
"create.item_attributes.shulker_level.empty": "비어",
"create.item_attributes.shulker_level.partial": "조금 차",
"create.item_attributes.in_tag": "%1$s로 등록됨",
"create.item_attributes.in_tag.inverted": "%1$s로 등록되지 않음",
"create.item_attributes.in_tag": "%1$s(으)로 등록됨",
"create.item_attributes.in_tag.inverted": "%1$s(으)로 등록되지 않음",
"create.item_attributes.in_item_group": "%1$s탭에 속함",
"create.item_attributes.in_item_group.inverted": "%1$s탭에 속함",
"create.item_attributes.added_by": "%1$s모드가 추가함",
@ -1281,8 +1279,8 @@
"create.item_attributes.color.inverted": "염색되지 않음",
"create.item_attributes.has_fluid": "%1$s을(를) 담고 있음",
"create.item_attributes.has_fluid.inverted": "%1$s을(를) 담고 있지 않음",
"create.item_attributes.has_name": "%1$s라는 이름을 갖고 있음",
"create.item_attributes.has_name.inverted": "%1$s라는 이름을 갖고 있지 않음",
"create.item_attributes.has_name": "%1$s(이)라는 이름을 갖고 있음",
"create.item_attributes.has_name.inverted": "%1$s(이)라는 이름을 갖고 있지 않음",
"create.item_attributes.book_author": "%1$s이(가) 작성함",
"create.item_attributes.book_author.inverted": "%1$s이(가) 작성하지 않음",
"create.item_attributes.book_copy_original": "원본임",
@ -1314,8 +1312,8 @@
"create.gui.attribute_filter.deny_list.description": "아이템이 선택된 속성이 없다면 통과시킵니다.",
"create.gui.attribute_filter.add_reference_item": "참고할 아이템을 추가하기",
"create.tooltip.holdForDescription": "[%1$s]을 눌러 설명 보기",
"create.tooltip.holdForControls": "[%1$s]을 눌러 조작법 보기",
"create.tooltip.holdForDescription": "[%1$s]을(를) 눌러 설명 보기",
"create.tooltip.holdForControls": "[%1$s]을(를) 눌러 조작법 보기",
"create.tooltip.keyShift": "Shift",
"create.tooltip.keyCtrl": "Ctrl",
"create.tooltip.speedRequirement": "요구 회전속도: %1$s",
@ -1342,9 +1340,9 @@
"create.mechanical_arm.points_outside_range": "범위 제한으로 인해 %1$s개의 선택된 지점이 해제되었습니다",
"create.weighted_ejector.target_set": "투척 지점이 설정되었습니다",
"create.weighted_ejector.target_not_valid": "인접한 블록에 발사합니다 (투척 지점이 올바르지 않습니다)",
"create.weighted_ejector.no_target": "인접한 블록에 발사합니다 (투척 지점이 설정되지 않았습니다)",
"create.weighted_ejector.targeting": "[%1$s,%2$s,%3$s]에 투척합니다",
"create.weighted_ejector.target_not_valid": "인접한 블록에 발사합니다 (투척 지점이 올바르지 않습니다)",
"create.weighted_ejector.no_target": "인접한 블록에 발사합니다 (투척 지점이 설정되지 않았습니다)",
"create.weighted_ejector.targeting": "[%1$s,%2$s,%3$s]에 투척합니다",
"create.weighted_ejector.stack_size": "투척하는 아이템의 수량",
"create.logistics.when_multiple_outputs_available": "여러 출력구가 있을 때",
@ -1370,10 +1368,10 @@
"create.tooltip.chute.fans_pull_up": "선풍기가 위에서 당김",
"create.tooltip.chute.fans_pull_down": "선풍기가 아래에서 당김",
"create.tooltip.chute.contains": "들어있는 아이템: %1$s x%2$s",
"create.tooltip.deployer.header": "UNLOCALIZED: Deployer Information",
"create.tooltip.deployer.using": "UNLOCALIZED: Mode: Use",
"create.tooltip.deployer.punching": "UNLOCALIZED: Mode: Attack",
"create.tooltip.deployer.contains": "UNLOCALIZED: Item: %1$s x%2$s",
"create.tooltip.deployer.header": "기계손 정보",
"create.tooltip.deployer.using": "모드: 사용",
"create.tooltip.deployer.punching": "모드: 공격",
"create.tooltip.deployer.contains": "아이템: %1$s x%2$s",
"create.tooltip.brass_tunnel.contains": "분배 중인 아이템:",
"create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s",
"create.tooltip.brass_tunnel.retrieve": "우클릭하여 회수",
@ -1450,17 +1448,17 @@
"create.schedule.instruction.name_edit_box_1": "디스플레이에 보일 문자입니다",
"create.schedule.instruction.name_edit_box_2": "기본값은 다음 정거장의 이름입니다",
"create.schedule.instruction.throttle": "최고 속도 변경",
"create.schedule.instruction.throttle.summary": "최고 속도를 %1$s로 변경",
"create.schedule.instruction.throttle.summary": "최고 속도를 %1$s(으)로 변경",
"create.schedule.instruction.throttle_edit_box": "제한",
"create.schedule.instruction.throttle_edit_box_1": "기차의 최고 속도를 설정합니다",
"create.schedule.condition_type": "조건이 맞으면 계속:",
"create.schedule.condition.editor": "조건 편집기",
"create.schedule.condition.delay": "딜레이",
"create.schedule.condition.delay_short": "멈춤: %1$s",
"create.schedule.condition.delay.status": "%1$s후 출발",
"create.schedule.condition.delay.status": "%1$s 후 출발",
"create.schedule.condition.idle": "저장소 휴식",
"create.schedule.condition.idle_short": "저장소 휴식: %1$s",
"create.schedule.condition.idle.status": "%1$s동안 저장소 멈춤",
"create.schedule.condition.idle.status": "%1$s 동안 저장소 멈춤",
"create.schedule.condition.for_x_time": "%1$s 동안",
"create.schedule.condition.unloaded": "청크 언로드",
"create.schedule.condition.unloaded.status": "청크 언로드되길 기다리는 중",
@ -1548,7 +1546,7 @@
"create.track.not_enough_tracks": "선로이 부족합니다",
"create.track.not_enough_pavement": "기반 블록이 부족합니다",
"create.portal_track.failed": "차원간 선로 설치할 수 없습니다:",
"create.portal_track.failed": "차원간 선로 설치할 수 없습니다:",
"create.portal_track.missing": "대상 차원문이 아직 생성되지 않았습니다",
"create.portal_track.blocked": "대상 좌표가 가로막혔습니다 (%1$s,%2$s,%3$s)",
@ -1601,7 +1599,7 @@
"create.train.unnamed": "이름없는 기차",
"create.train.cannot_relocate_moving": "움직이는 기차를 옮길 수 없습니다",
"create.train.relocate": "%1$s 놓을 선로를 클릭하세요. 쉬프트 우클릭으로 취소합니다",
"create.train.relocate": "%1$s을(를) 놓을 선로를 클릭하세요. 쉬프트 우클릭으로 취소합니다",
"create.train.relocate.abort": "이동이 취소되었습니다",
"create.train.relocate.success": "성공적으로 옮겼습니다",
"create.train.relocate.valid": "여기에 옮길 수 있습니다. 클릭하여 놓습니다",
@ -1628,7 +1626,7 @@
"create.track_signal.mode_change.entry_signal": "-> 구역이 사용중이 아니면 통과 가능",
"create.track_signal.mode_change.cross_signal": "-> 구역을 온전히 횡단가능하면 통과 가능",
"create.contraption.controls.start_controlling": "%1$s 조종합니다",
"create.contraption.controls.start_controlling": "%1$s을(를) 조종합니다",
"create.contraption.controls.stop_controlling": "구조물 조종을 멈췄습니다",
"create.contraption.controls.approach_station": "%1$s을(를) 눌러 %2$s에 접근합니다",
@ -2065,12 +2063,12 @@
"create.ponder.hold_to_ponder": "[%1$s]키를 눌러 분석하기",
"create.ponder.subject": "분석의 주제",
"create.ponder.pondering": "분석 중입니다...",
"create.ponder.identify_mode": "탐색모드가 활성화되어 있습니다. \n[%1$s] 눌러 중지합니다.",
"create.ponder.identify_mode": "탐색모드가 활성화되어 있습니다. \n[%1$s]을(를) 눌러 중지합니다.",
"create.ponder.associated": "연관된 항목들",
"create.ponder.close": "닫기",
"create.ponder.identify": "탐색",
"create.ponder.next": "다음 장면",
"create.ponder.next_up": "Up Next:",
"create.ponder.next_up": "다음 장면:",
"create.ponder.previous": "이전 장면",
"create.ponder.replay": "다시 재생",
"create.ponder.think_back": "되돌아가기",
@ -2187,8 +2185,8 @@
"create.ponder.blaze_burner.text_4": "이 시스템은 기계 손이나 기계 팔을 이용해 자동화될 수 있습니다.",
"create.ponder.brass_funnel.header": "황동 퍼널",
"create.ponder.brass_funnel.text_1": "안산암 퍼널 아이템 한 개만 뽑아냅니다.",
"create.ponder.brass_funnel.text_2": "황동 퍼널 한 스택까지 뽑을 수 있습니다.",
"create.ponder.brass_funnel.text_1": "안산암 퍼널 아이템 한 개만 뽑아냅니다.",
"create.ponder.brass_funnel.text_2": "황동 퍼널 한 스택까지 뽑을 수 있습니다.",
"create.ponder.brass_funnel.text_3": "핕터 슬롯을 스크롤하여 추출 갯수를 조절합니다.",
"create.ponder.brass_funnel.text_4": "필터 슬롯에 아이템을 사용하여 추출할 아이템 종류를 정합니다.",
@ -2218,7 +2216,7 @@
"create.ponder.cart_assembler.header": "수레 조립기로 구조물 움직이기",
"create.ponder.cart_assembler.text_1": "활성화된 수레 조립기는 지나가는 수레에 구조물을 부착합니다.",
"create.ponder.cart_assembler.text_2": "신호가 없다면, 구조물을 때어냅니다.",
"create.ponder.cart_assembler.text_2": "신호가 없다면, 구조물을 떼어 냅니다.",
"create.ponder.cart_assembler.text_3": "수레에 렌치로 우클릭하면 구조물을 들고 다닐 수 있습니다.",
"create.ponder.cart_assembler_dual.header": "한 구조물에 여러 수레 결합하기",
@ -2283,7 +2281,7 @@
"create.ponder.cogwheel.text_1": "톱니바퀴는 인접한 톱니바퀴에 동력을 전달합니다.",
"create.ponder.cogwheel.text_2": "이렇게 연결된 톱니바퀴 축은 반대방향으로 돌아갑니다.",
"create.ponder.cogwheel_casing.header": "톱니바에 케이스 씌우기",
"create.ponder.cogwheel_casing.header": "톱니바에 케이스 씌우기",
"create.ponder.cogwheel_casing.text_1": "황동, 안산암 케이스는 톱니바퀴를 꾸밀 때 사용할 수 있습니다.",
"create.ponder.cogwheel_casing.text_2": "기본적으로 케이스를 씌운 톱니바퀴는 축과 연결되지 않습니다.",
"create.ponder.cogwheel_casing.text_3": "렌치를 사용하여 축과 연결하거나 차단할 수 있습니다.",
@ -2442,13 +2440,13 @@
"create.ponder.funnel_direction.text_5": "벨트 위의 퍼널는 벨트의 움직임에 따라 아이템을 빼내거나 가져갑니다.",
"create.ponder.funnel_intro.header": "퍼널 사용하기",
"create.ponder.funnel_intro.text_1": "퍼널 보관함에서 아이템을 옮기거나 빼낼 때 유용합니다.",
"create.ponder.funnel_intro.text_1": "퍼널 보관함에서 아이템을 옮기거나 빼낼 때 유용합니다.",
"create.ponder.funnel_redstone.header": "레드스톤 신호",
"create.ponder.funnel_redstone.text_1": "레드스톤 신호를 받으면 동작을 멈춥니다.",
"create.ponder.funnel_transfer.header": "직접 수송",
"create.ponder.funnel_transfer.text_1": "퍼널 아이템을 보관함에서 다른 보관함로 옮깁니다.",
"create.ponder.funnel_transfer.text_1": "퍼널 아이템을 보관함에서 다른 보관함로 옮깁니다.",
"create.ponder.funnel_transfer.text_2": "슈트나 스마트 슈트가 이런 목적에 더 적합합니다.",
"create.ponder.funnel_transfer.text_3": "수평 방향으로는 벨트가 적합합니다.",
@ -2592,7 +2590,7 @@
"create.ponder.mechanical_crafter.text_2": "렌치를 이용해, 조합기의 경로를 변경할 수 있습니다.",
"create.ponder.mechanical_crafter.text_3": "올바른 조합을 위해서는, 모든 조합기의 경로가 외부로 나가는 한 길로 이어져야합니다.",
"create.ponder.mechanical_crafter.text_4": "결과물은 경로 끝 보관함에 보내집니다.",
"create.ponder.mechanical_crafter.text_5": "조합기는 동력이 요구됩니다.",
"create.ponder.mechanical_crafter.text_5": "조합기는 동력이 필요합니다.",
"create.ponder.mechanical_crafter.text_6": "앞면을 우클릭해서 직접 아이템을 넣습니다.",
"create.ponder.mechanical_crafter.text_7": "모든 면이 아이템을 가지고 있다면, 조합이 시작됩니다.",
"create.ponder.mechanical_crafter.text_8": "모든 면이 아이템을 가지고 있지 않아도, 레드스톤 신호로 조합을 강제 시작할 수 있습니다.",
@ -2803,8 +2801,8 @@
"create.ponder.sail_frame.text_1": "날개 틀은 풍차를 만들기에 좋은 블록입니다.",
"create.ponder.sail_frame.text_2": "강력 접착제나 섀시 없이 연결할 수 있습니다",
"create.ponder.sequenced_gearshift.header": "순서화 전환기를 통한 회전 속도 제어",
"create.ponder.sequenced_gearshift.text_1": "순서화 전환기는 설정한 지시에 따라 회전됩니다.",
"create.ponder.sequenced_gearshift.header": "순서 기어쉬프트를 통한 회전 속도 제어",
"create.ponder.sequenced_gearshift.text_1": "순서 기어쉬프트는 설정한 지시에 따라 회전됩니다.",
"create.ponder.sequenced_gearshift.text_2": "오른쪽 버튼을 누르면 설정 창이 열립니다.",
"create.ponder.sequenced_gearshift.text_3": "레드스톤 신호를 받으면 설정된 지시에 따라 회전하기 시작합니다.",
"create.ponder.sequenced_gearshift.text_4": "완료되면, 다음 레드스톤 신호를 기다립니다.",
@ -2816,8 +2814,8 @@
"create.ponder.shaft_casing.header": "축에 케이스 씌우기",
"create.ponder.shaft_casing.text_1": "황동 케이스나 안산암 케이스로 축을 장식할 수 있습니다.",
"create.ponder.smart_chute.header": "스마트 슈트 통한 아이템 필터",
"create.ponder.smart_chute.text_1": "스마트 슈트 필터 기능이 있는 슈트입니다.",
"create.ponder.smart_chute.header": "스마트 슈트 통한 아이템 필터",
"create.ponder.smart_chute.text_1": "스마트 슈트 필터 기능이 있는 슈트입니다.",
"create.ponder.smart_chute.text_2": "필터 슬롯으로 아이템을 지정하여 원하는 아이템을 입출력할 수 있습니다.",
"create.ponder.smart_chute.text_3": "스크롤하여 한 번에 내보내는 아이템의 양을 조절합니다.",
"create.ponder.smart_chute.text_4": "레드스톤 신호를 받으면 작동을 멈춥니다.",

View file

@ -48,7 +48,7 @@
"block.create.brown_toolbox": "UNLOCALIZED: Brown Toolbox",
"block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle",
"block.create.calcite_pillar": "UNLOCALIZED: Calcite Pillar",
"block.create.cart_assembler": "Kar Assembler",
"block.create.cart_assembler": "Kar-assembler",
"block.create.chocolate": "UNLOCALIZED: Chocolate",
"block.create.chute": "UNLOCALIZED: Chute",
"block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing",
@ -282,7 +282,7 @@
"block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle",
"block.create.limestone": "Kalksteen",
"block.create.limestone_pillar": "Kalksteen Pillar",
"block.create.linear_chassis": "Lineaar Frame",
"block.create.linear_chassis": "Lineair Chassis",
"block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner",
"block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube",
"block.create.magenta_sail": "UNLOCALIZED: Magenta Sail",
@ -396,13 +396,13 @@
"block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch",
"block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet",
"block.create.pulse_extender": "UNLOCALIZED: Pulse Extender",
"block.create.pulse_repeater": "Pulse Versterker",
"block.create.pulse_repeater": "Puls Versterker",
"block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube",
"block.create.purple_sail": "UNLOCALIZED: Purple Sail",
"block.create.purple_seat": "UNLOCALIZED: Purple Seat",
"block.create.purple_toolbox": "UNLOCALIZED: Purple Toolbox",
"block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle",
"block.create.radial_chassis": "Rotation Frame",
"block.create.radial_chassis": "Radiaal Chassis",
"block.create.railway_casing": "UNLOCALIZED: Train Casing",
"block.create.raw_zinc_block": "UNLOCALIZED: Block of Raw Zinc",
"block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube",
@ -410,7 +410,7 @@
"block.create.red_seat": "UNLOCALIZED: Red Seat",
"block.create.red_toolbox": "UNLOCALIZED: Red Toolbox",
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
"block.create.redstone_contact": "Redstone redstone_contact",
"block.create.redstone_contact": "Redstone Contact",
"block.create.redstone_link": "Redstone Brug",
"block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing",
"block.create.rope": "UNLOCALIZED: Rope",
@ -502,7 +502,7 @@
"block.create.stockpile_switch": "Voorraad Schakelaar",
"block.create.stressometer": "Stressmeter",
"block.create.tiled_glass": "Getegeld Glas",
"block.create.tiled_glass_pane": "Getegeld Glazen Paneel",
"block.create.tiled_glass_pane": "Getegeld Glazen Ruit",
"block.create.track": "UNLOCALIZED: Train Track",
"block.create.track_observer": "UNLOCALIZED: Train Observer",
"block.create.track_signal": "UNLOCALIZED: Train Signal",
@ -589,8 +589,8 @@
"item.create.blaze_cake_base": "UNLOCALIZED: Blaze Cake Base",
"item.create.brass_hand": "UNLOCALIZED: Brass Hand",
"item.create.brass_ingot": "UNLOCALIZED: Brass Ingot",
"item.create.brass_nugget": "Brons klompje",
"item.create.brass_sheet": "Brons Platen",
"item.create.brass_nugget": "Bronsklompje",
"item.create.brass_sheet": "Bronzen Plaat",
"item.create.builders_tea": "UNLOCALIZED: Builder's Tea",
"item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption",
"item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket",
@ -599,7 +599,7 @@
"item.create.cinder_flour": "UNLOCALIZED: Cinder Flour",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Koper klompje",
"item.create.copper_nugget": "Koperklompje",
"item.create.copper_sheet": "UNLOCALIZED: Copper Sheet",
"item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover",
"item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint",
@ -622,19 +622,19 @@
"item.create.dough": "Deeg",
"item.create.electron_tube": "UNLOCALIZED: Electron Tube",
"item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner",
"item.create.empty_schematic": "Lege bouwtekening",
"item.create.empty_schematic": "Lege Bouwtekening",
"item.create.experience_nugget": "UNLOCALIZED: Nugget of Experience",
"item.create.extendo_grip": "UNLOCALIZED: Extendo Grip",
"item.create.filter": "Filter",
"item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption",
"item.create.goggles": "Ingenieur's Bril",
"item.create.goggles": "Ingenieurs Bril",
"item.create.golden_sheet": "UNLOCALIZED: Golden Sheet",
"item.create.handheld_worldshaper": "UNLOCALIZED: Creative Worldshaper",
"item.create.honey_bucket": "UNLOCALIZED: Honey Bucket",
"item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple",
"item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism",
"item.create.incomplete_track": "UNLOCALIZED: Incomplete Track",
"item.create.iron_sheet": "IJzeren Platen",
"item.create.iron_sheet": "IJzeren Plaat",
"item.create.linked_controller": "UNLOCALIZED: Linked Controller",
"item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption",
"item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling",
@ -646,7 +646,7 @@
"item.create.raw_zinc": "UNLOCALIZED: Raw Zinc",
"item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper",
"item.create.refined_radiance": "UNLOCALIZED: Refined Radiance",
"item.create.rose_quartz": "Roze Kwarts",
"item.create.rose_quartz": "Rozenkwarts",
"item.create.sand_paper": "UNLOCALIZED: Sand Paper",
"item.create.schedule": "UNLOCALIZED: Train Schedule",
"item.create.schematic": "Bouwtekening",
@ -655,7 +655,7 @@
"item.create.sturdy_sheet": "UNLOCALIZED: Sturdy Sheet",
"item.create.super_glue": "UNLOCALIZED: Super Glue",
"item.create.sweet_roll": "UNLOCALIZED: Sweet Roll",
"item.create.tree_fertilizer": "Boom mest",
"item.create.tree_fertilizer": "Boommest",
"item.create.unprocessed_obsidian_sheet": "UNLOCALIZED: Unprocessed Obsidian Sheet",
"item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox",
"item.create.wand_of_symmetry": "Symmetrie Staf",
@ -663,7 +663,7 @@
"item.create.whisk": "UNLOCALIZED: Whisk",
"item.create.wrench": "Moersleutel",
"item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot",
"item.create.zinc_nugget": "Zink Nugget",
"item.create.zinc_nugget": "Zinkklompje",
"_": "->------------------------] Advancements [------------------------<-",
@ -863,7 +863,7 @@
"itemGroup.create.base": "UNLOCALIZED: Create",
"itemGroup.create.palettes": "UNLOCALIZED: Create's Building Blocks",
"death.attack.create.crush": "%1$s is verwerkd door verpulverende wielen",
"death.attack.create.crush": "%1$s is verwerkt door verpulverende wielen",
"death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s",
"death.attack.create.fan_fire": "%1$s is verbrand door hete lucht",
"death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s",
@ -934,7 +934,7 @@
"create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated",
"create.generic.range": "Omvang",
"create.generic.radius": "Radius",
"create.generic.radius": "Straal",
"create.generic.width": "UNLOCALIZED: Width",
"create.generic.height": "UNLOCALIZED: Height",
"create.generic.length": "UNLOCALIZED: Length",
@ -977,7 +977,7 @@
"create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount",
"create.gui.scrollInput.scrollToSelect": "Scroll om te selecteren",
"create.gui.scrollInput.shiftScrollsFaster": "Shift om sneller te Scrollen",
"create.gui.toolmenu.focusKey": "Hou [%1$s] ingedrukt om te Focusen",
"create.gui.toolmenu.focusKey": "Houd [%1$s] ingedrukt om te focussen",
"create.gui.toolmenu.cycle": "[SCROLL] om te Cycleën",
"create.toolbox.unequip": "UNLOCALIZED: Unequip: %1$s",
@ -1084,7 +1084,7 @@
"create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation",
"create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.",
"create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.",
"create.gui.adjustable_crate.title": "FlexKrat",
"create.gui.adjustable_crate.title": "Verstelbare Krat",
"create.gui.adjustable_crate.storageSpace": "Opslagruimte",
"create.gui.stockpile_switch.title": "Voorraad Schakelaar",
"create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal",
@ -1111,7 +1111,7 @@
"create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed",
"create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed",
"create.schematicAndQuill.dimensions": "Bouwtekening Groote: %1$sx%2$sx%3$s",
"create.schematicAndQuill.dimensions": "Bouwtekening Grootte: %1$sx%2$sx%3$s",
"create.schematicAndQuill.firstPos": "Eerste positie ingesteld.",
"create.schematicAndQuill.secondPos": "Tweede positie ingesteld.",
"create.schematicAndQuill.noTarget": "Houd [Ctrl] ingedrukt om een Lucht block te kiezen.",
@ -1121,7 +1121,7 @@
"create.schematicAndQuill.fallbackName": "Mijn Bouwtekening",
"create.schematicAndQuill.saved": "Opgeslagen als %1$s",
"create.schematic.invalid": "[!] Invalide object - Gebruik inplaats hiervan de Bouwtekening Tafel",
"create.schematic.invalid": "[!] Ongeldig object - Gebruik inplaats hiervan de Bouwtekening Tafel",
"create.schematic.position": "Positie",
"create.schematic.rotation": "Rotatie",
"create.schematic.rotation.none": "Geen",
@ -1143,7 +1143,7 @@
"create.schematic.tool.deploy.description.2": "Houd [Ctrl] ingedrukt om op een afstand te selecteren.",
"create.schematic.tool.deploy.description.3": "[Ctrl]-Scroll om de afstand te veranderen.",
"create.schematic.tool.move.description.0": "Verschuift de Bouwtekening Horizontaal",
"create.schematic.tool.move.description.1": "Wijs naar de Bouwtekening and [CTRL]-Scroll om hem te duwen.",
"create.schematic.tool.move.description.1": "Wijs naar de Bouwtekening en [CTRL]-Scroll om hem te duwen.",
"create.schematic.tool.move.description.2": "",
"create.schematic.tool.move.description.3": "",
"create.schematic.tool.movey.description.0": "Verschuift de Bouwtekening Verticaal",
@ -1191,28 +1191,28 @@
"create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon",
"create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic",
"create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.",
"create.gui.schematicannon.option.skipMissing.description": "Als het Bouwtekeningkannon niet een geschikt blok kan vinden om te plaatsen gaat hij door bij de volgende locatie.",
"create.gui.schematicannon.option.skipMissing.description": "Als het Bouwtekeningkannon niet een geschikt blok kan vinden om te plaatsen gaat hij door naar de volgende positie.",
"create.gui.schematicannon.option.skipTileEntities.description": "Het Bouwtekeningkannon probeert blokken met data zoals kisten te vermijden",
"create.gui.schematicannon.option.dontReplaceSolid.description": "Het Bouwtekeningkannon zal nooit vaste blokken in zijn gebied vervangen, alleen niet-vaste blokken en lucht",
"create.gui.schematicannon.option.replaceWithSolid.description": "Het Bouwtekeningkannon zal alleen vaste blokken in zijn gebied veranderen, als de bouwtekening een vast blok bevat op zijn locatie.",
"create.gui.schematicannon.option.replaceWithAny.description": "Het Bouwtekeningkannon zal vaste blokken in zijn gebied vervangen als, de bouwtekening een blok op bevat op zijn locatie.",
"create.gui.schematicannon.option.replaceWithSolid.description": "Het Bouwtekeningkannon zal alleen vaste blokken in zijn gebied veranderen als de bouwtekening een vast blok bevat op zijn positie.",
"create.gui.schematicannon.option.replaceWithAny.description": "Het Bouwtekeningkannon zal vaste blokken in zijn gebied vervangen als de bouwtekening een blok op bevat op zijn positie.",
"create.gui.schematicannon.option.replaceWithEmpty.description": "Het Bouwtekeningkannon zal alle blokken in zijn gebied vervangen, inclusief blokken vervangen door lucht.",
"create.schematicannon.status.idle": "IJdel",
"create.schematicannon.status.ready": "Paraat",
"create.schematicannon.status.running": "Draaiend",
"create.schematicannon.status.idle": "Inactief",
"create.schematicannon.status.ready": "Gereed",
"create.schematicannon.status.running": "Lopend",
"create.schematicannon.status.finished": "Klaar",
"create.schematicannon.status.paused": "Gepauzeerd",
"create.schematicannon.status.stopped": "Gestopt",
"create.schematicannon.status.noGunpowder": "Buskruit op",
"create.schematicannon.status.targetNotLoaded": "Blok is niet geladen",
"create.schematicannon.status.targetOutsideRange": "Doel is te ver weg",
"create.schematicannon.status.targetOutsideRange": "Doelwit is te ver weg",
"create.schematicannon.status.searching": "Aan het zoeken",
"create.schematicannon.status.skipping": "Aan het overslaan",
"create.schematicannon.status.missingBlock": "Missende Blok:",
"create.schematicannon.status.placing": "Aan het plaatsen",
"create.schematicannon.status.clearing": "Blokken aan het verwijderen",
"create.schematicannon.status.schematicInvalid": "Bouwtekening niet valide",
"create.schematicannon.status.schematicInvalid": "Bouwtekening is ongeschikt",
"create.schematicannon.status.schematicNotPlaced": "Bouwtekening niet geplaatst",
"create.schematicannon.status.schematicExpired": "Bouwtekening verlopen",
@ -1829,7 +1829,7 @@
"item.create.wand_of_symmetry.tooltip": "SYMMETRIE STAF",
"item.create.wand_of_symmetry.tooltip.summary": "Spiegelt uw blokplaatsing perfect over de geconfigureerde vlakken.",
"item.create.wand_of_symmetry.tooltip.condition1": "Waneer in de Actiebalk",
"item.create.wand_of_symmetry.tooltip.condition1": "Wanneer in de Actiebalk",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Blijft actief",
"item.create.wand_of_symmetry.tooltip.control1": "R-Klik op de Grond",
"item.create.wand_of_symmetry.tooltip.action1": "_Creëerd_ of _Beweegt_ de Spiegel",
@ -1847,7 +1847,7 @@
"item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking",
"item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration Interface_",
"item.create.tree_fertilizer.tooltip": "BOOM MEST",
"item.create.tree_fertilizer.tooltip": "BOOMMEST",
"item.create.tree_fertilizer.tooltip.summary": "Een krachtige combinatie van mineralen geschikt voor de meest voorkomende typen bomen.",
"item.create.tree_fertilizer.tooltip.condition1": "Wanneer gebruikt op Kiemplanten",
"item.create.tree_fertilizer.tooltip.behaviour1": "Groeit bomen onafhankelijk van beschikbare ruimte",
@ -1884,18 +1884,18 @@
"item.create.empty_schematic.tooltip.summary": "Bruikbaar als ingredient in recepten en voor het schrijven aan de _BOUWTEKENING_ _TAFEL._",
"item.create.schematic.tooltip": "BOUWTEKENING",
"item.create.schematic.tooltip.summary": "Bevat een structuur die gepositioneerd en geplaatst van worden in de wereld. Positineer het Hologram als gewilt en gebruik een _BOUWTEKENINGKANNON_ om het te bouwen.",
"item.create.schematic.tooltip.summary": "Bevat een structuur die gepositioneerd en geplaatst kan worden in de wereld. Positineer het Hologram als gewilt en gebruik een _BOUWTEKENINGKANNON_ om het te bouwen.",
"item.create.schematic.tooltip.condition1": "Wanneer ingedrukt",
"item.create.schematic.tooltip.behaviour1": "Kan gepositioneerd worden met de knoppen op het scherm",
"item.create.schematic.tooltip.control1": "R-Klik terwijl je sluipt",
"item.create.schematic.tooltip.action1": "Opent een_Interface_ voor het invullen van preciese _coordinaten._",
"item.create.schematic_and_quill.tooltip": "BOUWTEKENING EN VEER",
"item.create.schematic_and_quill.tooltip.summary": "Bruikbaar om een contructie in je wereld op te slaan naar een .nbt bestand.",
"item.create.schematic_and_quill.tooltip.summary": "Bruikbaar om een constructie in jouw wereld op te slaan naar een .nbt bestand.",
"item.create.schematic_and_quill.tooltip.condition1": "Stap 1",
"item.create.schematic_and_quill.tooltip.behaviour1": "Selecteer twee hoekpunten met R-Klik",
"item.create.schematic_and_quill.tooltip.condition2": "Stap 2",
"item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ op de zijden om de groote aan te passen. R-Klik nogmaals om op te slaan.",
"item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ op de zijden om de grootte aan te passen. R-Klik nogmaals om op te slaan.",
"item.create.schematic_and_quill.tooltip.control1": "R-Klik",
"item.create.schematic_and_quill.tooltip.action1": "Selecteer een hoekpunt / opslaan bevestigen",
"item.create.schematic_and_quill.tooltip.control2": "Ctrl Ingedrukt houden",
@ -1962,7 +1962,7 @@
"block.create.content_observer.tooltip.behaviour2": "UNLOCALIZED: Emits a _Redstone Pulse_ when a _matching_ Item is _transferred_.",
"block.create.creative_crate.tooltip": "CREATIEF KRAT",
"block.create.creative_crate.tooltip.summary": "Bied een eindloze vooraad blokken aan een aangeloten _Bouwtekeningkannon_",
"block.create.creative_crate.tooltip.summary": "Biedt een eindloze vooraad blokken aan een aangeloten _Bouwtekeningkannon_",
"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._",

View file

@ -6,6 +6,7 @@
"minecraft:iron_bars",
"minecraft:mangrove_roots",
"#minecraft:campfires",
"#minecraft:fences"
"#minecraft:fences",
"#minecraft:leaves"
]
}

View file

@ -0,0 +1,8 @@
{
"replace": false,
"values": [
"minecraft:cobweb",
"minecraft:powder_snow",
"#minecraft:fence_gates"
]
}

View file

@ -100,6 +100,7 @@ public class AllTags {
CASING,
FAN_TRANSPARENT,
NON_MOVABLE,
MOVABLE_EMPTY_COLLIDER,
ORE_OVERRIDE_STONE,
PASSIVE_BOILER_HEATERS,
SAFE_NBT,

View file

@ -28,6 +28,7 @@ import com.simibubi.create.foundation.block.CopperRegistries;
import com.simibubi.create.foundation.command.ServerLagger;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.ContraptionMovementSetting;
import com.simibubi.create.foundation.data.AllLangPartials;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.data.LangMerger;
import com.simibubi.create.foundation.data.TagGen;
@ -158,7 +159,7 @@ public class Create {
TagGen.datagen();
DataGenerator gen = event.getGenerator();
if (event.includeClient()) {
gen.addProvider(true, new LangMerger(gen));
gen.addProvider(true, new LangMerger(gen, ID, "Create", AllLangPartials.values()));
gen.addProvider(true, AllSoundEvents.provider(gen));
}
if (event.includeServer()) {

View file

@ -13,7 +13,8 @@ import net.minecraftforge.fml.ModList;
public enum Mods {
DYNAMICTREES,
TCONSTRUCT,
CURIOS;
CURIOS,
STORAGEDRAWERS;
/**
* @return a boolean of whether the mod is loaded or not based on mod id

View file

@ -1,10 +1,13 @@
package com.simibubi.create.compat.jei.category;
import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.compat.jei.category.animations.AnimatedDeployer;
import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.utility.Lang;
@ -34,22 +37,28 @@ public class DeployingCategory extends CreateRecipeCategory<DeployerApplicationR
.addSlot(RecipeIngredientRole.INPUT, 51, 5)
.setBackground(getRenderedSlot(), -1, -1)
.addIngredients(recipe.getRequiredHeldItem());
builder
.addSlot(RecipeIngredientRole.OUTPUT, 132, 51)
.setBackground(getRenderedSlot(recipe.getRollableResults().get(0)), -1, -1)
.addItemStack(recipe.getResultItem())
.addTooltipCallback(addStochasticTooltip(recipe.getRollableResults().get(0)));
if (recipe.shouldKeepHeldItem()) {
handItemSlot.addTooltipCallback((recipeSlotView, tooltip) -> tooltip.add(1, Lang.translateDirect("recipe.deploying.not_consumed").withStyle(ChatFormatting.GOLD)));
List<ProcessingOutput> results = recipe.getRollableResults();
boolean single = results.size() == 1;
for (int i = 0; i < results.size(); i++) {
ProcessingOutput output = results.get(i);
int xOffset = i % 2 == 0 ? 0 : 19;
int yOffset = (i / 2) * -19;
builder.addSlot(RecipeIngredientRole.OUTPUT, single ? 132 : 132 + xOffset, 51 + yOffset)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
}
if (recipe.shouldKeepHeldItem())
handItemSlot.addTooltipCallback((recipeSlotView, tooltip) -> tooltip.add(1, Lang.translateDirect("recipe.deploying.not_consumed").withStyle(ChatFormatting.GOLD)));
}
@Override
public void draw(DeployerApplicationRecipe recipe, IRecipeSlotsView recipeSlotsView, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SHADOW.render(matrixStack, 62, 57);
AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 126, 29);
AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 126, 29 + (recipe.getRollableResults().size() > 2 ? -19 : 0));
deployer.draw(matrixStack, getBackground().getWidth() / 2 - 13, 22);
}

View file

@ -1,5 +1,6 @@
package com.simibubi.create.compat.jei.category;
import java.util.List;
import java.util.Optional;
import javax.annotation.ParametersAreNonnullByDefault;
@ -8,6 +9,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Vector3f;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.content.contraptions.processing.ItemApplicationRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.utility.Lang;
@ -46,10 +48,17 @@ public class ItemApplicationCategory extends CreateRecipeCategory<ItemApplicatio
: (view, tooltip) -> {}
);
builder.addSlot(RecipeIngredientRole.OUTPUT, 132, 38)
.setBackground(getRenderedSlot(recipe.getRollableResults().get(0)), -1, -1)
.addItemStack(recipe.getResultItem())
.addTooltipCallback(addStochasticTooltip(recipe.getRollableResults().get(0)));
List<ProcessingOutput> results = recipe.getRollableResults();
boolean single = results.size() == 1;
for (int i = 0; i < results.size(); i++) {
ProcessingOutput output = results.get(i);
int xOffset = i % 2 == 0 ? 0 : 19;
int yOffset = (i / 2) * -19;
builder.addSlot(RecipeIngredientRole.OUTPUT, single ? 132 : 132 + xOffset, 38 + yOffset)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
}
}
@Override

View file

@ -0,0 +1,41 @@
package com.simibubi.create.compat.storageDrawers;
import com.simibubi.create.compat.Mods;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.items.IItemHandler;
public class StorageDrawers {
public static boolean isDrawer(BlockEntity tile) {
return tile != null && Mods.STORAGEDRAWERS.asId()
.equals(tile.getType()
.getRegistryName()
.getNamespace());
}
public static float getTrueFillLevel(IItemHandler inv, FilteringBehaviour filtering) {
float occupied = 0;
float totalSpace = 0;
for (int slot = 1; slot < inv.getSlots(); slot++) {
ItemStack stackInSlot = inv.getStackInSlot(slot);
int space = inv.getSlotLimit(slot);
int count = stackInSlot.getCount();
if (space == 0)
continue;
totalSpace += 1;
if (filtering.test(stackInSlot))
occupied += count * (1f / space);
}
if (totalSpace == 0)
return 0;
return occupied / totalSpace;
}
}

View file

@ -1,6 +1,7 @@
package com.simibubi.create.content.contraptions.base;
import com.simibubi.create.foundation.advancement.AdvancementBehaviour;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemDescription.Palette;
import net.minecraft.core.BlockPos;
@ -45,6 +46,11 @@ public abstract class KineticBlock extends Block implements IRotate {
}
}
@Override
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
ITE.onRemove(pState, pLevel, pPos, pNewState);
}
@Override
public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) {
return false;

View file

@ -184,18 +184,13 @@ public class KineticTileEntity extends SmartTileEntity implements IHaveGoggleInf
}
@Override
public void setRemoved() {
super.setRemoved();
}
@Override
protected void setRemovedNotDueToChunkUnload() {
public void remove() {
if (!level.isClientSide) {
if (hasNetwork())
getOrCreateNetwork().remove(this);
detachKinetics();
}
super.setRemovedNotDueToChunkUnload();
super.remove();
}
@Override

View file

@ -73,10 +73,10 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity {
}
@Override
public void setRemoved() {
public void invalidate() {
super.invalidate();
if (!level.isClientSide && destroyProgress != 0)
level.destroyBlockProgress(breakerId, breakingPos, -1);
super.setRemoved();
}
@Override

View file

@ -112,8 +112,8 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
invalidateCapability();
}

View file

@ -95,7 +95,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock
}
}
if (state.hasBlockEntity() && state.getBlock() != newState.getBlock()) {
if (state.hasBlockEntity() && !state.is(newState.getBlock())) {
MechanicalCrafterTileEntity crafter = CrafterHelper.getCrafter(worldIn, pos);
if (crafter != null) {
if (crafter.covered)
@ -121,9 +121,9 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock
ConnectedInputHandler.toggleConnection(worldIn, pos, otherPos);
}
worldIn.removeBlockEntity(pos);
}
super.onRemove(state, worldIn, pos, newState, isMoving);
}
public static Pointing pointingFromFacing(Direction pointingFace, Direction blockFacing) {

View file

@ -215,9 +215,9 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
}
@Override
public void setRemoved() {
public void invalidate() {
super.invalidate();
invSupplier.invalidate();
super.setRemoved();
}
public int getCountDownSpeed() {

View file

@ -70,6 +70,9 @@ public class HandCrankBlock extends DirectionalKineticBlock
@Override
public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn,
BlockHitResult hit) {
if (player.isSpectator())
return InteractionResult.PASS;
withTileEntityDo(worldIn, pos, te -> te.turn(player.isShiftKeyDown()));
player.causeFoodExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF());

View file

@ -47,17 +47,14 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
for (Direction d : Iterate.directions) {
if (d.getAxis() == state.getValue(AXIS))
continue;
if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(worldIn.getBlockState(pos.relative(d))))
worldIn.setBlockAndUpdate(pos.relative(d), Blocks.AIR.defaultBlockState());
worldIn.removeBlock(pos.relative(d), isMoving);
}
if (state.hasBlockEntity() && state.getBlock() != newState.getBlock()) {
worldIn.removeBlockEntity(pos);
}
super.onRemove(state, worldIn, pos, newState, isMoving);
}
public void updateControllers(BlockState state, Level world, BlockPos pos, Direction side) {

View file

@ -32,7 +32,7 @@ public class DeployerApplicationRecipe extends ItemApplicationRecipe implements
@Override
protected int getMaxOutputCount() {
return 2;
return 4;
}
public static DeployerApplicationRecipe convert(Recipe<?> sandpaperRecipe) {

View file

@ -8,8 +8,6 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.content.contraptions.components.AssemblyOperatorUseContext;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
@ -61,20 +59,9 @@ public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE<De
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasBlockEntity() && state.getBlock() != newState.getBlock()) {
withTileEntityDo(worldIn, pos, te -> {
if (te.player != null && !isMoving) {
te.player.getInventory()
.dropAll();
te.overflowItems.forEach(itemstack -> te.player.drop(itemstack, true, false));
te.player.discard();
te.player = null;
}
});
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
worldIn.removeBlockEntity(pos);
}
if (!isMoving && !state.is(newState.getBlock()))
withTileEntityDo(worldIn, pos, DeployerTileEntity::discardPlayer);
super.onRemove(state, worldIn, pos, newState, isMoving);
}
@Override

View file

@ -434,9 +434,19 @@ public class DeployerTileEntity extends KineticTileEntity {
return super.createRenderBoundingBox().inflate(3);
}
public void discardPlayer() {
if (player == null)
return;
player.getInventory()
.dropAll();
overflowItems.forEach(itemstack -> player.drop(itemstack, true, false));
player.discard();
player = null;
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
if (invHandler != null)
invHandler.invalidate();
}

View file

@ -43,8 +43,6 @@ public class ManualApplicationRecipe extends ItemApplicationRecipe {
BlockPos pos = event.getPos();
BlockState blockState = level.getBlockState(pos);
if (level.isClientSide())
return;
if (heldItem.isEmpty())
return;
if (blockState.isAir())
@ -66,6 +64,12 @@ public class ManualApplicationRecipe extends ItemApplicationRecipe {
if (foundRecipe.isEmpty())
return;
event.setCancellationResult(InteractionResult.SUCCESS);
event.setCanceled(true);
if (level.isClientSide())
return;
level.playSound(null, pos, SoundEvents.COPPER_BREAK, SoundSource.PLAYERS, 1, 1.45f);
ManualApplicationRecipe recipe = (ManualApplicationRecipe) foundRecipe.get();
level.destroyBlock(pos, false);
@ -75,9 +79,11 @@ public class ManualApplicationRecipe extends ItemApplicationRecipe {
recipe.rollResults()
.forEach(stack -> Block.popResource(level, pos, stack));
boolean creative = event.getPlayer() != null && event.getPlayer()
.isCreative();
boolean unbreakable = heldItem.hasTag() && heldItem.getTag()
.getBoolean("Unbreakable");
boolean keepHeld = recipe.shouldKeepHeldItem();
boolean keepHeld = recipe.shouldKeepHeldItem() || creative;
if (!unbreakable && !keepHeld) {
if (heldItem.isDamageableItem())
@ -87,9 +93,6 @@ public class ManualApplicationRecipe extends ItemApplicationRecipe {
}
awardAdvancements(event.getEntity(), transformedBlock);
event.setCancellationResult(InteractionResult.SUCCESS);
event.setCanceled(true);
}
private static void awardAdvancements(Player player, BlockState placed) {

View file

@ -36,14 +36,6 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<Enca
blockUpdate(stateIn, worldIn, pos);
}
@Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) {
if (state.hasBlockEntity() && (state.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasBlockEntity())) {
withTileEntityDo(world, pos, EncasedFanTileEntity::updateChute);
world.removeBlockEntity(pos);
}
}
@Override
public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {

View file

@ -84,6 +84,12 @@ public class EncasedFanTileEntity extends KineticTileEntity implements IAirCurre
return speed > 0 ? facing : facing.getOpposite();
}
@Override
public void remove() {
super.remove();
updateChute();
}
@Override
public boolean isSourceRemoved() {
return remove;

View file

@ -5,7 +5,6 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.KineticBlock;
import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
@ -118,18 +117,6 @@ public class MillstoneBlock extends KineticBlock implements ITE<MillstoneTileEnt
itemEntity.setItem(remainder);
}
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasBlockEntity() && state.getBlock() != newState.getBlock()) {
withTileEntityDo(worldIn, pos, te -> {
ItemHelper.dropContents(worldIn, pos, te.inputInv);
ItemHelper.dropContents(worldIn, pos, te.outputInv);
});
worldIn.removeBlockEntity(pos);
}
}
@Override
public Axis getRotationAxis(BlockState state) {
return Axis.Y;

View file

@ -6,6 +6,7 @@ import java.util.Optional;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.sound.SoundScapes;
import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
@ -116,11 +117,18 @@ public class MillstoneTileEntity extends KineticTileEntity {
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
capability.invalidate();
}
@Override
public void destroy() {
super.destroy();
ItemHelper.dropContents(level, worldPosition, inputInv);
ItemHelper.dropContents(level, worldPosition, outputInv);
}
private void process() {
RecipeWrapper inventoryIn = new RecipeWrapper(inputInv);

View file

@ -7,9 +7,6 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.content.contraptions.components.actors.DrillBlock;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
@ -102,16 +99,6 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE<SawTile
: super.hasShaftTowards(world, pos, state, face);
}
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (!state.hasBlockEntity() || state.getBlock() == newState.getBlock())
return;
withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory));
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
worldIn.removeBlockEntity(pos);
}
@Override
public Class<SawTileEntity> getTileEntityClass() {
return SawTileEntity.class;

View file

@ -255,9 +255,15 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
}
@Override
public void setRemoved() {
public void invalidate() {
super.invalidate();
invProvider.invalidate();
super.setRemoved();
}
@Override
public void destroy() {
super.destroy();
ItemHelper.dropContents(level, worldPosition, inventory);
}
@Override

View file

@ -134,11 +134,11 @@ public class SteamEngineTileEntity extends SmartTileEntity implements IHaveGoggl
}
@Override
protected void setRemovedNotDueToChunkUnload() {
public void remove() {
PoweredShaftTileEntity shaft = getShaft();
if (shaft != null)
shaft.remove(worldPosition);
super.setRemovedNotDueToChunkUnload();
super.remove();
}
@Override
@ -219,7 +219,6 @@ public class SteamEngineTileEntity extends SmartTileEntity implements IHaveGoggl
Direction facing = SteamEngineBlock.getFacing(getBlockState());
for (int i = 0; i < 2; i++) {
Vec3 offset = VecHelper.rotate(new Vec3(0, 0, 1).add(VecHelper.offsetRandomly(Vec3.ZERO, level.random, 1)
.multiply(1, 1, 0)
.normalize()
@ -230,7 +229,6 @@ public class SteamEngineTileEntity extends SmartTileEntity implements IHaveGoggl
Vec3 m = offset.subtract(Vec3.atLowerCornerOf(facing.getNormal())
.scale(.75f));
level.addParticle(new SteamJetParticleData(1), v.x, v.y, v.z, m.x, m.y, m.z);
}
prevAngle = angle;
}

View file

@ -192,8 +192,7 @@ public class WhistleBlock extends Block implements ITE<WhistleTileEntity>, IWren
@Override
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
if (pState.hasBlockEntity() && (!pState.is(pNewState.getBlock()) || !pNewState.hasBlockEntity()))
pLevel.removeBlockEntity(pPos);
ITE.onRemove(pState, pLevel, pPos, pNewState);
FluidTankBlock.updateBoilerState(pState, pLevel, pPos.relative(getAttachedDirection(pState)));
}

View file

@ -46,7 +46,6 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.DiodeBlock;
import net.minecraft.world.level.block.DoorBlock;
import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock;
import net.minecraft.world.level.block.FenceGateBlock;
import net.minecraft.world.level.block.FlowerPotBlock;
import net.minecraft.world.level.block.GrindstoneBlock;
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
@ -175,15 +174,13 @@ public class BlockMovementChecks {
private static boolean isMovementNecessaryFallback(BlockState state, Level world, BlockPos pos) {
if (isBrittle(state))
return true;
if (state.getBlock() instanceof FenceGateBlock)
return true;
if (state.getMaterial()
if (!state.getMaterial()
.isReplaceable())
return false;
if (state.getCollisionShape(world, pos)
.isEmpty())
return false;
return true;
if (!state.getCollisionShape(world, pos)
.isEmpty())
return true;
return AllBlockTags.MOVABLE_EMPTY_COLLIDER.matches(state);
}
private static boolean isMovementAllowedFallback(BlockState state, Level world, BlockPos pos) {

View file

@ -744,10 +744,12 @@ public abstract class Contraption {
ListTag actorsNBT = new ListTag();
for (MutablePair<StructureBlockInfo, MovementContext> actor : getActors()) {
MovementBehaviour behaviour = AllMovementBehaviours.getBehaviour(actor.left.state);
if (behaviour == null)
continue;
CompoundTag compound = new CompoundTag();
compound.put("Pos", NbtUtils.writeBlockPos(actor.left.pos));
AllMovementBehaviours.getBehaviour(actor.left.state)
.writeExtraData(actor.right);
behaviour.writeExtraData(actor.right);
actor.right.writeToNBT(compound);
actorsNBT.add(compound);
}
@ -1120,8 +1122,9 @@ public abstract class Contraption {
public void startMoving(Level world) {
for (MutablePair<StructureBlockInfo, MovementContext> pair : actors) {
MovementContext context = new MovementContext(world, pair.left, this);
AllMovementBehaviours.getBehaviour(pair.left.state)
.startMoving(context);
MovementBehaviour behaviour = AllMovementBehaviours.getBehaviour(pair.left.state);
if (behaviour != null)
behaviour.startMoving(context);
pair.setRight(context);
}
}
@ -1137,8 +1140,12 @@ public abstract class Contraption {
}
public void forEachActor(Level world, BiConsumer<MovementBehaviour, MovementContext> callBack) {
for (MutablePair<StructureBlockInfo, MovementContext> pair : actors)
callBack.accept(AllMovementBehaviours.getBehaviour(pair.getLeft().state), pair.getRight());
for (MutablePair<StructureBlockInfo, MovementContext> pair : actors) {
MovementBehaviour behaviour = AllMovementBehaviours.getBehaviour(pair.getLeft().state);
if (behaviour == null)
continue;
callBack.accept(behaviour, pair.getRight());
}
}
protected boolean shouldUpdateAfterMovement(StructureBlockInfo info) {

View file

@ -372,15 +372,10 @@ public class ClockworkBearingTileEntity extends KineticTileEntity
}
@Override
public void setRemoved() {
super.setRemoved();
}
@Override
protected void setRemovedNotDueToChunkUnload() {
public void remove() {
if (!level.isClientSide)
disassemble();
super.setRemovedNotDueToChunkUnload();
super.remove();
}
@Override

View file

@ -59,15 +59,10 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity
}
@Override
public void setRemoved() {
super.setRemoved();
}
@Override
protected void setRemovedNotDueToChunkUnload() {
public void remove() {
if (!level.isClientSide)
disassemble();
super.setRemovedNotDueToChunkUnload();
super.remove();
}
@Override

View file

@ -21,6 +21,8 @@ import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.NonNullList;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
@ -90,6 +92,7 @@ public class SailBlock extends WrenchableDirectionalBlock {
if (heldItem.getItem() instanceof ShearsItem) {
if (!world.isClientSide)
world.playSound(null, pos, SoundEvents.SHEEP_SHEAR, SoundSource.BLOCKS, 1.0f, 1.0f);
applyDye(state, world, pos, ray.getLocation(), null);
return InteractionResult.SUCCESS;
}
@ -100,6 +103,7 @@ public class SailBlock extends WrenchableDirectionalBlock {
DyeColor color = DyeColor.getColor(heldItem);
if (color != null) {
if (!world.isClientSide)
world.playSound(null, pos, SoundEvents.DYE_USE, SoundSource.BLOCKS, 1.0f, 1.1f - world.random.nextFloat() * .2f);
applyDye(state, world, pos, ray.getLocation(), color);
return InteractionResult.SUCCESS;
}

View file

@ -18,6 +18,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.ContraptionMovementSetting;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper;
@ -205,6 +206,8 @@ public class MinecartContraptionItem extends Item {
Player player = event.getEntity();
if (player == null || entity == null)
return;
if (!AllConfigs.SERVER.kinetics.survivalContraptionPickup.get() && !player.isCreative())
return;
ItemStack wrench = player.getItemInHand(event.getHand());
if (!AllItems.WRENCH.isIn(wrench))

View file

@ -174,16 +174,11 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity
}
@Override
public void setRemoved() {
super.setRemoved();
}
@Override
protected void setRemovedNotDueToChunkUnload() {
public void remove() {
this.remove = true;
if (!level.isClientSide)
disassemble();
super.setRemovedNotDueToChunkUnload();
super.remove();
}
@Override

View file

@ -49,16 +49,15 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<Pulle
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.getBlock() != newState.getBlock()) {
if (!worldIn.isClientSide) {
super.onRemove(state, worldIn, pos, newState, isMoving);
if (state.is(newState.getBlock()))
return;
if (worldIn.isClientSide)
return;
BlockState below = worldIn.getBlockState(pos.below());
if (below.getBlock() instanceof RopeBlockBase)
worldIn.destroyBlock(pos.below(), true);
}
if (state.hasBlockEntity())
worldIn.removeBlockEntity(pos);
}
}
public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn,
BlockHitResult hit) {

View file

@ -156,11 +156,10 @@ public class PumpBlock extends DirectionalKineticBlock
@Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
boolean blockTypeChanged = state.getBlock() != newState.getBlock();
boolean blockTypeChanged = !state.is(newState.getBlock());
if (blockTypeChanged && !world.isClientSide)
FluidPropagator.propagateChangedPipe(world, pos, state);
if (state.hasBlockEntity() && (blockTypeChanged || !newState.hasBlockEntity()))
world.removeBlockEntity(pos);
super.onRemove(state, world, pos, newState, isMoving);
}
@Override

View file

@ -86,7 +86,7 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
while (!queue.isEmpty()) {
// Dont dequeue here, so we can decide not to dequeue a valid entry when
// simulating
BlockPos currentPos = queue.first().pos;
BlockPos currentPos = queue.first().pos();
BlockState blockState = world.getBlockState(currentPos);
BlockState emptied = blockState;
Fluid fluid = Fluids.EMPTY;
@ -262,10 +262,15 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
}
private void continueSearch() {
try {
fluid = search(fluid, frontier, visited, (e, d) -> {
queue.enqueue(new BlockPosEntry(e, d));
validationSet.add(e);
}, false);
} catch (ChunkNotLoadedException e) {
tileEntity.sendData();
visited.clear();
}
Level world = getWorld();
int maxBlocks = maxBlocks();
@ -273,14 +278,14 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
infinite = true;
// Find first block with valid fluid
while (true) {
BlockPos first = queue.first().pos;
BlockPos first = queue.first().pos();
if (canPullFluidsFrom(world.getBlockState(first), first) != FluidBlockType.SOURCE) {
queue.dequeue();
continue;
}
break;
}
BlockPos firstValid = queue.first().pos;
BlockPos firstValid = queue.first().pos();
frontier.clear();
visited.clear();
queue.clear();
@ -297,7 +302,13 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
}
private void continueValidation() {
try {
search(fluid, validationFrontier, validationVisited, (e, d) -> newValidationSet.add(e), false);
} catch (ChunkNotLoadedException e) {
validationFrontier.clear();
setLongValidationTimer();
return;
}
int maxBlocks = maxBlocks();
if (validationVisited.size() > maxBlocks && canDrainInfinitely(fluid)) {

View file

@ -71,8 +71,15 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour {
}
protected void continueValidation(Fluid fluid) {
try {
search(fluid, infinityCheckFrontier, infinityCheckVisited,
(p, d) -> infinityCheckFrontier.add(new BlockPosEntry(p, d)), true);
} catch (ChunkNotLoadedException e) {
infinityCheckFrontier.clear();
setLongValidationTimer();
return;
}
int maxBlocks = maxBlocks();
if (infinityCheckVisited.size() > maxBlocks && maxBlocks != -1 && !fillInfinite()) {
@ -154,7 +161,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour {
boolean success = false;
for (int i = 0; !success && !queue.isEmpty() && i < searchedPerTick; i++) {
BlockPosEntry entry = queue.first();
BlockPos currentPos = entry.pos;
BlockPos currentPos = entry.pos();
if (visited.contains(currentPos)) {
queue.dequeue();
@ -223,7 +230,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour {
SpaceType nextSpaceType = getAtPos(world, offsetPos, fluid);
if (nextSpaceType != SpaceType.BLOCKING)
queue.enqueue(new BlockPosEntry(offsetPos, entry.distance + 1));
queue.enqueue(new BlockPosEntry(offsetPos, entry.distance() + 1));
}
}

View file

@ -14,6 +14,7 @@ import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.core.BlockPos;
@ -33,14 +34,11 @@ import net.minecraftforge.fluids.FluidStack;
public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
protected static class BlockPosEntry {
public BlockPos pos;
public int distance;
public static record BlockPosEntry(BlockPos pos, int distance) {
};
public BlockPosEntry(BlockPos pos, int distance) {
this.pos = pos;
this.distance = distance;
}
public static class ChunkNotLoadedException extends Exception {
private static final long serialVersionUID = 1L;
}
BoundingBox affectedArea;
@ -49,7 +47,7 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
protected boolean counterpartActed;
// Search
static final int searchedPerTick = 256;
static final int searchedPerTick = 1024;
static final int validationTimerMin = 160;
List<BlockPosEntry> frontier;
Set<BlockPos> visited;
@ -141,7 +139,7 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
}
protected Fluid search(Fluid fluid, List<BlockPosEntry> frontier, Set<BlockPos> visited,
BiConsumer<BlockPos, Integer> add, boolean searchDownward) {
BiConsumer<BlockPos, Integer> add, boolean searchDownward) throws ChunkNotLoadedException {
Level world = getWorld();
int maxBlocks = maxBlocks();
int maxRange = canDrainInfinitely(fluid) ? maxRange() : maxRange() / 2;
@ -156,6 +154,9 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
continue;
visited.add(currentPos);
if (!world.isLoaded(currentPos))
throw new ChunkNotLoadedException();
FluidState fluidState = world.getFluidState(currentPos);
if (fluidState.isEmpty())
continue;
@ -173,6 +174,8 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
continue;
BlockPos offsetPos = currentPos.relative(side);
if (!world.isLoaded(offsetPos))
throw new ChunkNotLoadedException();
if (visited.contains(offsetPos))
continue;
if (offsetPos.distSqr(rootPos) > maxRangeSq)
@ -212,6 +215,8 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
@Override
public void write(CompoundTag nbt, boolean clientPacket) {
if (infinite)
NBTHelper.putMarker(nbt, "Infinite");
if (rootPos != null)
nbt.put("LastPos", NbtUtils.writeBlockPos(rootPos));
if (affectedArea != null) {
@ -225,6 +230,7 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
@Override
public void read(CompoundTag nbt, boolean clientPacket) {
infinite = nbt.contains("Infinite");
if (nbt.contains("LastPos"))
rootPos = NbtUtils.readBlockPos(nbt.getCompound("LastPos"));
if (nbt.contains("AffectedAreaFrom") && nbt.contains("AffectedAreaTo"))

View file

@ -4,14 +4,12 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
@ -72,17 +70,6 @@ public class HosePulleyBlock extends HorizontalKineticBlock implements ITE<HoseP
return prefferedSide == null ? null : prefferedSide.getOpposite();
}
@Override
public void onRemove(BlockState p_196243_1_, Level world, BlockPos pos, BlockState p_196243_4_,
boolean p_196243_5_) {
if (p_196243_1_.hasBlockEntity()
&& (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasBlockEntity())) {
TileEntityBehaviour.destroy(world, pos, FluidDrainingBehaviour.TYPE);
TileEntityBehaviour.destroy(world, pos, FluidFillingBehaviour.TYPE);
world.removeBlockEntity(pos);
}
}
@Override
public Class<HosePulleyTileEntity> getTileEntityClass() {
return HosePulleyTileEntity.class;

View file

@ -147,6 +147,8 @@ public class HosePulleyTileEntity extends KineticTileEntity {
@Override
protected void write(CompoundTag compound, boolean clientPacket) {
if (clientPacket)
offset.forceNextSync();
compound.put("Offset", offset.writeNBT());
compound.put("Tank", internalTank.writeToNBT(new CompoundTag()));
super.write(compound, clientPacket);
@ -164,8 +166,8 @@ public class HosePulleyTileEntity extends KineticTileEntity {
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
capability.invalidate();
}

View file

@ -252,8 +252,8 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
for (LazyOptional<ItemDrainItemHandler> lazyOptional : itemHandlers.values())
lazyOptional.invalidate();
}

View file

@ -89,11 +89,10 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock
@Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
boolean blockTypeChanged = state.getBlock() != newState.getBlock();
boolean blockTypeChanged = !state.is(newState.getBlock());
if (blockTypeChanged && !world.isClientSide)
FluidPropagator.propagateChangedPipe(world, pos, state);
if (state.hasBlockEntity() && (blockTypeChanged || !newState.hasBlockEntity()))
world.removeBlockEntity(pos);
super.onRemove(state, world, pos, newState, isMoving);
}
@Override

View file

@ -485,8 +485,8 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
}
@Override

View file

@ -77,10 +77,7 @@ public class GoggleOverlayRenderer {
BlockEntity te = world.getBlockEntity(pos);
int prevHoverTicks = hoverTicks;
if (lastHovered == null || lastHovered.equals(pos))
hoverTicks++;
else
hoverTicks = 0;
lastHovered = pos;
boolean wearingGoggles = GogglesItem.isWearingGoggles(mc.player);
@ -122,8 +119,10 @@ public class GoggleOverlayRenderer {
hoverTicks = prevHoverTicks + 1;
// break early if goggle or hover returned false when present
if ((hasGoggleInformation && !goggleAddedInformation) && (hasHoveringInformation && !hoverAddedInformation))
if ((hasGoggleInformation && !goggleAddedInformation) && (hasHoveringInformation && !hoverAddedInformation)) {
hoverTicks = 0;
return;
}
// check for piston poles if goggles are worn
BlockState state = world.getBlockState(pos);
@ -140,8 +139,10 @@ public class GoggleOverlayRenderer {
.getBlock() instanceof MechanicalPistonBlock;
}
if (!pistonFound)
if (!pistonFound) {
hoverTicks = 0;
return;
}
if (!tooltip.isEmpty())
tooltip.add(Components.immutableEmpty());
@ -150,8 +151,10 @@ public class GoggleOverlayRenderer {
.append(Components.literal(" " + poles)));
}
if (tooltip.isEmpty())
if (tooltip.isEmpty()) {
hoverTicks = 0;
return;
}
poseStack.pushPose();
@ -175,7 +178,7 @@ public class GoggleOverlayRenderer {
posX = Math.min(posX, width - tooltipTextWidth - 20);
posY = Math.min(posY, height - tooltipHeight - 20);
float fade = Mth.clamp((hoverTicks + partialTicks) / 12f, 0, 1);
float fade = Mth.clamp((hoverTicks + partialTicks) / 24f, 0, 1);
Boolean useCustom = cfg.overlayCustomColor.get();
Color colorBackground = useCustom ? new Color(cfg.overlayBackgroundColor.get())
: Theme.c(Theme.Key.VANILLA_TOOLTIP_BACKGROUND)
@ -188,7 +191,7 @@ public class GoggleOverlayRenderer {
.copy();
if (fade < 1) {
poseStack.translate((1 - fade) * Math.signum(cfg.overlayOffsetX.get() + .5f) * 4, 0, 0);
poseStack.translate(Math.pow(1 - fade, 3) * Math.signum(cfg.overlayOffsetX.get() + .5f) * 8, 0, 0);
colorBackground.scaleAlpha(fade);
colorBorderTop.scaleAlpha(fade);
colorBorderBot.scaleAlpha(fade);

View file

@ -13,7 +13,6 @@ import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@ -170,15 +169,7 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (!state.hasBlockEntity() || state.getBlock() == newState.getBlock())
return;
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
withTileEntityDo(worldIn, pos, te -> {
ItemHelper.dropContents(worldIn, pos, te.inputInventory);
ItemHelper.dropContents(worldIn, pos, te.outputInventory);
te.spoutputBuffer.forEach(is -> Block.popResource(worldIn, pos, is));
});
worldIn.removeBlockEntity(pos);
ITE.onRemove(state, worldIn, pos, newState);
}
@Override

View file

@ -18,6 +18,7 @@ import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
@ -194,21 +195,29 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor
visualizedOutputFluids.clear();
}
@Override
public void destroy() {
super.destroy();
ItemHelper.dropContents(level, worldPosition, inputInventory);
ItemHelper.dropContents(level, worldPosition, outputInventory);
spoutputBuffer.forEach(is -> Block.popResource(level, worldPosition, is));
}
@Override
public void remove() {
super.remove();
onEmptied();
}
public void onEmptied() {
getOperator().ifPresent(te -> te.basinRemoved = true);
}
@Override
public void setRemoved() {
public void invalidate() {
super.invalidate();
itemCapability.invalidate();
fluidCapability.invalidate();
super.setRemoved();
}
@Override
protected void setRemovedNotDueToChunkUnload() {
onEmptied();
super.setRemovedNotDueToChunkUnload();
}
@Nonnull

View file

@ -34,7 +34,7 @@ public class ItemApplicationRecipe extends ProcessingRecipe<RecipeWrapper> {
@Override
protected int getMaxOutputCount() {
return 9;
return 4;
}
public boolean shouldKeepHeldItem() {

View file

@ -20,7 +20,6 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
@ -252,8 +251,12 @@ public class BlazeBurnerBlock extends HorizontalDirectionalBlock implements ITE<
}
public static int getLight(BlockState state) {
return Mth.clamp(state.getValue(HEAT_LEVEL)
.ordinal() * 4 - 1, 0, 15);
HeatLevel level = state.getValue(HEAT_LEVEL);
return switch (level) {
case NONE -> 0;
case SMOULDERING -> 8;
default -> 15;
};
}
public static LootTable.Builder buildLootTable() {

View file

@ -192,7 +192,7 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
newBurnTime = 1000;
newFuel = FuelType.SPECIAL;
} else {
newBurnTime = ForgeHooks.getBurnTime(itemStack, null);
newBurnTime = (int) Math.min(ForgeHooks.getBurnTime(itemStack, null), MAX_HEAT_CAPACITY * 0.95f);
if (newBurnTime > 0)
newFuel = FuelType.NORMAL;
else if (AllItemTags.BLAZE_BURNER_FUEL_REGULAR.matches(itemStack)) {
@ -297,15 +297,16 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
Vec3 v = c.add(VecHelper.offsetRandomly(Vec3.ZERO, r, .125f)
.multiply(1, 0, 1));
if (r.nextInt(3) == 0)
level.addParticle(ParticleTypes.LARGE_SMOKE, v.x, v.y, v.z, 0, 0, 0);
if (r.nextInt(2) != 0)
if (r.nextInt(4) != 0)
return;
boolean empty = level.getBlockState(worldPosition.above())
.getCollisionShape(level, worldPosition.above())
.isEmpty();
if (empty || r.nextInt(8) == 0)
level.addParticle(ParticleTypes.LARGE_SMOKE, v.x, v.y, v.z, 0, 0, 0);
double yMotion = empty ? .0625f : r.nextDouble() * .0125f;
Vec3 v2 = c.add(VecHelper.offsetRandomly(Vec3.ZERO, r, .5f)
.multiply(1, .25f, 1)

View file

@ -455,6 +455,8 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
@Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
super.onRemove(state, world, pos, newState, isMoving);
if (world.isClientSide)
return;
if (state.getBlock() == newState.getBlock())
@ -462,15 +464,6 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
if (isMoving)
return;
BlockEntity te = world.getBlockEntity(pos);
if (te instanceof BeltTileEntity) {
BeltTileEntity beltTileEntity = (BeltTileEntity) te;
if (beltTileEntity.isController())
beltTileEntity.getInventory()
.ejectAll();
world.removeBlockEntity(pos);
}
// Destroy chain
for (boolean forward : Iterate.trueAndFalse) {
BlockPos currentPos = nextSegmentPosition(state, pos, forward);

View file

@ -191,8 +191,15 @@ public class BeltTileEntity extends KineticTileEntity {
}
@Override
public void setRemoved() {
super.setRemoved();
public void destroy() {
super.destroy();
if (isController())
getInventory().ejectAll();
}
@Override
public void invalidate() {
super.invalidate();
itemHandler.invalidate();
}

View file

@ -35,7 +35,6 @@ public abstract class AbstractSimpleShaftBlock extends AbstractShaftBlock implem
}
@Override
@SuppressWarnings("deprecation")
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
if (state != newState && !isMoving)
removeBracket(world, pos, true).ifPresent(stack -> Block.popResource(world, pos, stack));

View file

@ -87,8 +87,8 @@ public class ToolboxTileEntity extends SmartTileEntity implements MenuProvider,
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
ToolboxHandler.onUnload(this);
}

View file

@ -5,6 +5,8 @@ import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;
import org.jetbrains.annotations.Nullable;
import com.simibubi.create.AllEnchantments;
import com.simibubi.create.AllEntityTypes;
import com.simibubi.create.Create;
@ -12,6 +14,7 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.content.curiosities.armor.BackTankUtil;
import com.simibubi.create.content.curiosities.zapper.ShootableGadgetItemMethods;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.CustomArmPoseItem;
import com.simibubi.create.foundation.item.render.SimpleCustomRenderer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Components;
@ -20,6 +23,8 @@ import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.HumanoidModel.ArmPose;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction.Axis;
@ -45,7 +50,7 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.extensions.common.IClientItemExtensions;
public class PotatoCannonItem extends ProjectileWeaponItem {
public class PotatoCannonItem extends ProjectileWeaponItem implements CustomArmPoseItem {
public static ItemStack CLIENT_CURRENT_AMMO = ItemStack.EMPTY;
public static final int MAX_DAMAGE = 100;
@ -269,6 +274,15 @@ public class PotatoCannonItem extends ProjectileWeaponItem {
return UseAnim.NONE;
}
@Override
@Nullable
public ArmPose getArmPose(ItemStack stack, AbstractClientPlayer player, InteractionHand hand) {
if (!player.swinging) {
return ArmPose.CROSSBOW_HOLD;
}
return null;
}
@Override
public int getDefaultProjectileRange() {
return 15;

View file

@ -1,7 +1,5 @@
package com.simibubi.create.content.curiosities.weapons;
import static com.simibubi.create.content.curiosities.weapons.PotatoProjectileRenderMode.entityRandom;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.utility.AngleHelper;

View file

@ -4,9 +4,12 @@ import java.util.List;
import javax.annotation.Nonnull;
import org.jetbrains.annotations.Nullable;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.item.CustomArmPoseItem;
import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Lang;
@ -14,6 +17,8 @@ import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.NBTProcessors;
import net.minecraft.ChatFormatting;
import net.minecraft.client.model.HumanoidModel.ArmPose;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
@ -43,7 +48,7 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
public abstract class ZapperItem extends Item {
public abstract class ZapperItem extends Item implements CustomArmPoseItem {
public ZapperItem(Properties properties) {
super(properties.stacksTo(1));
@ -213,6 +218,15 @@ public abstract class ZapperItem extends Item {
return UseAnim.NONE;
}
@Override
@Nullable
public ArmPose getArmPose(ItemStack stack, AbstractClientPlayer player, InteractionHand hand) {
if (!player.swinging) {
return ArmPose.CROSSBOW_HOLD;
}
return null;
}
public static void configureSettings(ItemStack stack, PlacementPatterns pattern) {
CompoundTag nbt = stack.getOrCreateTag();
NBTHelper.writeEnum(nbt, "Pattern", pattern);

View file

@ -17,7 +17,6 @@ import com.simibubi.create.foundation.utility.WorldHelper;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
public class RedstoneLinkNetworkHandler {
@ -112,10 +111,7 @@ public class RedstoneLinkNetworkHandler {
iterator.remove();
continue;
}
if (!(world instanceof Level level) || !level.isLoaded(other.getLocation())) {
iterator.remove();
continue;
}
if (!withinRange(actor, other))
continue;

View file

@ -56,8 +56,8 @@ public class BeltTunnelTileEntity extends SmartTileEntity {
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
cap.invalidate();
}

View file

@ -3,8 +3,7 @@ package com.simibubi.create.content.logistics.block.belts.tunnel;
import java.util.List;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.block.ITE;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@ -16,7 +15,6 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
@ -61,16 +59,7 @@ public class BrassTunnelBlock extends BeltTunnelBlock {
@Override
public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasBlockEntity() && (state.getBlock() != newState.getBlock() || !newState.hasBlockEntity())) {
TileEntityBehaviour.destroy(level, pos, FilteringBehaviour.TYPE);
withTileEntityDo(level, pos, te -> {
if (!(te instanceof BrassTunnelTileEntity btte))
return;
Block.popResource(level, pos, btte.stackToDistribute);
btte.stackEnteredFrom = null;
});
level.removeBlockEntity(pos);
}
ITE.onRemove(state, level, pos, newState);
}
}

View file

@ -46,6 +46,7 @@ import net.minecraft.nbt.Tag;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
@ -714,9 +715,16 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
}
@Override
public void setRemoved() {
public void invalidate() {
super.invalidate();
tunnelCapability.invalidate();
super.setRemoved();
}
@Override
public void destroy() {
super.destroy();
Block.popResource(level, worldPosition, stackToDistribute);
stackEnteredFrom = null;
}
@Override

View file

@ -10,7 +10,6 @@ import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.render.ReducedDestroyEffects;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
@ -132,14 +131,10 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I
}
@Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) {
boolean differentBlock = state.getBlock() != p_196243_4_.getBlock();
if (state.hasBlockEntity() && (differentBlock || !p_196243_4_.hasBlockEntity())) {
TileEntityBehaviour.destroy(world, pos, FilteringBehaviour.TYPE);
withTileEntityDo(world, pos, c -> c.onRemoved(state));
world.removeBlockEntity(pos);
}
if (p_196243_5_ || !differentBlock)
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
ITE.onRemove(state, world, pos, newState);
if (isMoving || state.is(newState.getBlock()))
return;
updateDiagonalNeighbour(state, world, pos);

View file

@ -509,10 +509,10 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
if (lazyHandler != null)
lazyHandler.invalidate();
super.invalidate();
}
@Override
@ -557,8 +557,10 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
return (Mth.clamp(motion, -maxItemSpeed, maxItemSpeed) + (motion <= 0 ? -gravity : 0)) / 20f;
}
public void onRemoved(BlockState chuteState) {
ChuteTileEntity targetChute = getTargetChute(chuteState);
@Override
public void destroy() {
super.destroy();
ChuteTileEntity targetChute = getTargetChute(getBlockState());
List<ChuteTileEntity> inputChutes = getInputChutes();
if (!item.isEmpty() && level != null)
Containers.dropItemStack(level, worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), item);

View file

@ -32,6 +32,7 @@ import net.minecraft.nbt.Tag;
import net.minecraft.world.Containers;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.capabilities.Capability;
@ -199,7 +200,19 @@ public class DepotBehaviour extends TileEntityBehaviour {
}
@Override
public void remove() {
public void destroy() {
super.destroy();
Level level = getWorld();
BlockPos pos = getPos();
ItemHelper.dropContents(level, pos, processingOutputBuffer);
for (TransportedItemStack transportedItemStack : incoming)
Block.popResource(level, pos, transportedItemStack.stack);
if (!getHeldItemStack().isEmpty())
Block.popResource(level, pos, getHeldItemStack());
}
@Override
public void unload() {
if (lazyItemHandler != null)
lazyItemHandler.invalidate();
}

View file

@ -55,7 +55,7 @@ public class DepotBlock extends Block implements ITE<DepotTileEntity>, IWrenchab
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving);
ITE.onRemove(state, worldIn, pos, newState);
}
@Override

View file

@ -125,12 +125,6 @@ public class EjectorBlock extends HorizontalKineticBlock implements ITE<EjectorT
return SharedDepotBlockMethods.onUse(state, world, pos, player, hand, ray);
}
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
withTileEntityDo(worldIn, pos, EjectorTileEntity::dropFlyingItems);
SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving);
}
@Override
public Axis getRotationAxis(BlockState state) {
return state.getValue(HORIZONTAL_FACING)

View file

@ -471,6 +471,12 @@ public class EjectorTileEntity extends KineticTileEntity {
.scale(.5f);
}
@Override
public void destroy() {
super.destroy();
dropFlyingItems();
}
public void dropFlyingItems() {
for (IntAttached<ItemStack> intAttached : launchedItems) {
Vec3 ejectVec = getLaunchedItemLocation(intAttached.getFirst());

View file

@ -4,7 +4,6 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
@ -13,7 +12,6 @@ import net.minecraft.core.Direction;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
@ -76,22 +74,6 @@ public class SharedDepotBlockMethods {
return InteractionResult.SUCCESS;
}
public static void onReplaced(BlockState state, Level worldIn, BlockPos pos, BlockState newState,
boolean isMoving) {
if (!state.hasBlockEntity() || state.getBlock() == newState.getBlock())
return;
DepotBehaviour behaviour = get(worldIn, pos);
if (behaviour == null)
return;
ItemHelper.dropContents(worldIn, pos, behaviour.processingOutputBuffer);
for (TransportedItemStack transportedItemStack : behaviour.incoming)
Containers.dropItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), transportedItemStack.stack);
if (!behaviour.getHeldItemStack()
.isEmpty())
Containers.dropItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), behaviour.getHeldItemStack());
worldIn.removeBlockEntity(pos);
}
public static void onLanded(BlockGetter worldIn, Entity entityIn) {
if (!(entityIn instanceof ItemEntity))
return;

View file

@ -33,7 +33,7 @@ public abstract class StatTrackingDisplaySource extends ScoreboardDisplaySource
scoreboard.addObjective(name, ObjectiveCriteria.DUMMY, getObjectiveDisplayName(), RenderType.INTEGER);
Objective objective = scoreboard.getObjective(name);
sLevel.players()
sLevel.getServer().getPlayerList().getPlayers()
.forEach(s -> scoreboard.getOrCreatePlayerScore(s.getScoreboardName(), objective)
.setScore(updatedScoreOf(s)));

View file

@ -128,13 +128,8 @@ public abstract class AbstractFunnelBlock extends Block implements ITE<FunnelTil
protected abstract Direction getFacing(BlockState state);
@Override
public void onRemove(BlockState p_196243_1_, Level p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_,
boolean p_196243_5_) {
if (p_196243_1_.hasBlockEntity() && (p_196243_1_.getBlock() != p_196243_4_.getBlock() && !isFunnel(p_196243_4_)
|| !p_196243_4_.hasBlockEntity())) {
TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE);
p_196243_2_.removeBlockEntity(p_196243_3_);
}
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
ITE.onRemove(state, world, pos, newState);
}
@Override

View file

@ -36,8 +36,8 @@ public class CreativeCrateTileEntity extends CrateTileEntity {
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
if (itemHandler != null)
itemHandler.invalidate();
}

View file

@ -12,7 +12,6 @@ import com.simibubi.create.foundation.block.ITE;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
@ -81,19 +80,6 @@ public class ArmBlock extends KineticBlock implements ITE<ArmTileEntity>, ICogWh
return AllTileEntities.MECHANICAL_ARM.get();
}
@Override
public void onRemove(BlockState p_196243_1_, Level world, BlockPos pos, BlockState p_196243_4_,
boolean p_196243_5_) {
if (p_196243_1_.hasBlockEntity()
&& (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasBlockEntity())) {
withTileEntityDo(world, pos, te -> {
if (!te.heldItem.isEmpty())
Containers.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), te.heldItem);
});
world.removeBlockEntity(pos);
}
}
@Override
public InteractionResult use(BlockState p_225533_1_, Level world, BlockPos pos, Player player,
InteractionHand p_225533_5_, BlockHitResult p_225533_6_) {

View file

@ -37,6 +37,7 @@ import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.JukeboxBlock;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
@ -220,6 +221,13 @@ public class ArmTileEntity extends KineticTileEntity implements ITransformableTE
.orElse(false);
}
@Override
public void destroy() {
super.destroy();
if (!heldItem.isEmpty())
Block.popResource(level, worldPosition, heldItem);
}
@Nullable
private ArmInteractionPoint getTargetedInteractionPoint() {
if (chasedPointIndex == -1)

View file

@ -125,10 +125,7 @@ public class ContentObserverBlock extends HorizontalDirectionalBlock implements
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasBlockEntity() && state.getBlock() != newState.getBlock()) {
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
worldIn.removeBlockEntity(pos);
}
ITE.onRemove(state, worldIn, pos, newState);
}
@Override

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.block.redstone;
import java.util.List;
import com.simibubi.create.compat.storageDrawers.StorageDrawers;
import com.simibubi.create.content.logistics.block.display.DisplayLinkBlock;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
@ -16,6 +17,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
@ -95,10 +97,14 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
BlockPos target = worldPosition.relative(getBlockState().getOptionalValue(StockpileSwitchBlock.FACING)
.orElse(Direction.NORTH));
BlockEntity targetTile = level.getBlockEntity(target);
if (level.getBlockEntity(target) instanceof StockpileSwitchObservable observable) {
if (targetTile instanceof StockpileSwitchObservable observable) {
currentLevel = observable.getPercent() / 100f;
} else if (StorageDrawers.isDrawer(targetTile) && observedInventory.hasInventory()) {
currentLevel = StorageDrawers.getTrueFillLevel(observedInventory.getInventory(), filtering);
} else if (observedInventory.hasInventory() || observedTank.hasInventory()) {
if (observedInventory.hasInventory()) {
// Item inventory

View file

@ -308,8 +308,7 @@ public class FlapDisplayBlock extends HorizontalKineticBlock
@Override
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
if (pState.hasBlockEntity() && (!pState.is(pNewState.getBlock()) || !pNewState.hasBlockEntity()))
pLevel.removeBlockEntity(pPos);
super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving);
if (pIsMoving || pNewState.getBlock() == this)
return;
for (Direction d : Iterate.directionsInAxis(getConnectionAxis(pState))) {

View file

@ -234,10 +234,10 @@ public class TrackTargetingBehaviour<T extends TrackEdgePoint> extends TileEntit
}
@Override
public void remove() {
public void destroy() {
super.destroy();
if (edgePoint != null && !getWorld().isClientSide)
edgePoint.tileRemoved(getPos(), getTargetDirection() == AxisDirection.POSITIVE);
super.remove();
}
@Override

View file

@ -3,8 +3,6 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint.observ
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@ -57,11 +55,8 @@ public class TrackObserverBlock extends Block implements ITE<TrackObserverTileEn
}
@Override
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
if (pState.hasBlockEntity() && (!pState.is(pNewState.getBlock()) || !pNewState.hasBlockEntity())) {
TileEntityBehaviour.destroy(pLevel, pPos, FilteringBehaviour.TYPE);
pLevel.removeBlockEntity(pPos);
}
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
ITE.onRemove(state, worldIn, pos, newState);
}
}

View file

@ -100,7 +100,7 @@ public class StationBlock extends Block implements ITE<StationTileEntity>, IWren
@Override
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving);
ITE.onRemove(state, worldIn, pos, newState);
}
@Override

View file

@ -438,11 +438,10 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable
}
@Override
protected void setRemovedNotDueToChunkUnload() {
public void remove() {
assemblyAreas.get(level)
.remove(worldPosition);
super.setRemovedNotDueToChunkUnload();
super.remove();
}
public void assemble(UUID playerUUID) {

View file

@ -9,7 +9,9 @@ import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
@ -25,9 +27,15 @@ public class StationUnloadedCondition extends ScheduleWaitCondition {
GlobalStation currentStation = train.getCurrentStation();
if (currentStation == null)
return false;
if (level instanceof ServerLevel serverLevel)
return !serverLevel.isPositionEntityTicking(currentStation.getTilePos());
ResourceKey<Level> stationDim = currentStation.getTileDimension();
MinecraftServer server = level.getServer();
if (server == null)
return false;
ServerLevel stationLevel = server.getLevel(stationDim);
if (stationLevel == null) {
return false;
}
return !stationLevel.isPositionEntityTicking(currentStation.getTilePos());
}
@Override

View file

@ -269,15 +269,15 @@ public class TrackTileEntity extends SmartTileEntity implements ITransformableTE
}
@Override
public void setRemoved() {
super.setRemoved();
public void invalidate() {
super.invalidate();
if (level.isClientSide)
removeFromCurveInteraction();
}
@Override
protected void setRemovedNotDueToChunkUnload() {
super.setRemovedNotDueToChunkUnload();
public void remove() {
super.remove();
for (BezierConnection connection : connections.values())
manageFakeTracksAlong(connection, true);

View file

@ -132,29 +132,29 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer<Schematicanno
continue;
// Calculate position of flying block
Vec3 start = Vec3.atLowerCornerOf(tileEntityIn.getBlockPos()
.offset(.5f, 1, .5f));
Vec3 target = Vec3.atLowerCornerOf(launched.target)
.add(-.5, 0, 1);
Vec3 start = Vec3.atCenterOf(tileEntityIn.getBlockPos()
.above());
Vec3 target = Vec3.atCenterOf(launched.target);
Vec3 distance = target.subtract(start);
double targetY = target.y - start.y;
double throwHeight = Math.sqrt(distance.lengthSqr()) * .6f + targetY;
double yDifference = target.y - start.y;
double throwHeight = Math.sqrt(distance.lengthSqr()) * .6f + yDifference;
Vec3 cannonOffset = distance.add(0, throwHeight, 0)
.normalize()
.scale(2);
start = start.add(cannonOffset);
yDifference = target.y - start.y;
float progress =
((float) launched.totalTicks - (launched.ticksRemaining + 1 - partialTicks)) / launched.totalTicks;
Vec3 blockLocationXZ = new Vec3(.5, .5, .5).add(target.subtract(start)
Vec3 blockLocationXZ = target.subtract(start)
.scale(progress)
.multiply(1, 0, 1));
.multiply(1, 0, 1);
// Height is determined through a bezier curve
float t = progress;
double yOffset = 2 * (1 - t) * t * throwHeight + t * t * targetY;
Vec3 blockLocation = blockLocationXZ.add(0, yOffset + 1, 0)
double yOffset = 2 * (1 - t) * t * throwHeight + t * t * yDifference;
Vec3 blockLocation = blockLocationXZ.add(0.5, yOffset + 1.5, 0.5)
.add(cannonOffset);
// Offset to position
@ -194,6 +194,7 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer<Schematicanno
// Render particles for launch
if (launched.ticksRemaining == launched.totalTicks && tileEntityIn.firstRenderTick) {
start = start.subtract(.5, .5, .5);
tileEntityIn.firstRenderTick = false;
for (int i = 0; i < 10; i++) {
RandomSource r = tileEntityIn.getLevel()

View file

@ -279,7 +279,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
refillFuelIfPossible();
// Update Printer
skipsLeft = config().schematicannonSkips.get();
skipsLeft = 1000;
blockSkipped = true;
while (blockSkipped && skipsLeft-- > 0)
@ -304,6 +304,13 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
ItemStack blueprint = inventory.getStackInSlot(0);
blockSkipped = false;
if (blueprint.isEmpty() && !statusMsg.equals("idle")) {
state = State.STOPPED;
statusMsg = "idle";
sendUpdate = true;
return;
}
// Skip if not Active
if (state == State.STOPPED) {
if (printer.isLoaded())
@ -311,13 +318,6 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
return;
}
if (blueprint.isEmpty()) {
state = State.STOPPED;
statusMsg = "idle";
sendUpdate = true;
return;
}
if (state == State.PAUSED && !positionNotLoaded && missingItem == null && fuelLevel > getFuelUsageRate())
return;
@ -374,6 +374,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
// Get item requirement
ItemRequirement requirement = printer.getCurrentRequirement();
if (requirement.isInvalid() || !printer.shouldPlaceCurrent(level, this::shouldPlace)) {
sendUpdate = !statusMsg.equals("searching");
statusMsg = "searching";
blockSkipped = true;
return;
@ -641,6 +642,11 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
inventory.getStackInSlot(4)
.shrink(1);
fuelLevel += getFuelAddedByGunPowder();
if (statusMsg.equals("noGunpowder")) {
if (blocksPlaced > 0)
state = State.RUNNING;
statusMsg = "ready";
}
sendUpdate = true;
}
@ -657,6 +663,12 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
boolean outputFull = inventory.getStackInSlot(BookOutput)
.getCount() == inventory.getSlotLimit(BookOutput);
if (!printer.isLoaded()) {
if (!blueprint.isEmpty())
initializePrinter(blueprint);
return;
}
if (paper.isEmpty() || outputFull) {
if (bookPrintingProgress != 0)
sendUpdate = true;
@ -665,12 +677,6 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
return;
}
if (!printer.isLoaded()) {
if (!blueprint.isEmpty())
initializePrinter(blueprint);
return;
}
if (bookPrintingProgress >= 1) {
bookPrintingProgress = 0;

View file

@ -34,6 +34,21 @@ public interface ITE<T extends BlockEntity> extends EntityBlock {
.orElse(InteractionResult.PASS);
}
/**
* if the ITE is bound to a SmartTileEntity, which implements destroy(),<br>
* call this method in BlockBehaviour::onRemove (replace super call)
*/
public static void onRemove(BlockState blockState, Level level, BlockPos pos, BlockState newBlockState) {
if (!blockState.hasBlockEntity())
return;
if (blockState.is(newBlockState.getBlock()) && newBlockState.hasBlockEntity())
return;
BlockEntity blockEntity = level.getBlockEntity(pos);
if (blockEntity instanceof SmartTileEntity ste)
ste.destroy();
level.removeBlockEntity(pos);
}
default Optional<T> getTileEntityOptional(BlockGetter world, BlockPos pos) {
return Optional.ofNullable(getTileEntity(world, pos));
}

View file

@ -34,6 +34,7 @@ public class CKinetics extends ConfigBase {
public final ConfigInt maxPistonPoles = i(64, 1, "maxPistonPoles", Comments.maxPistonPoles);
public final ConfigInt maxRopeLength = i(256, 1, "maxRopeLength", Comments.maxRopeLength);
public final ConfigInt maxCartCouplingLength = i(32, 1, "maxCartCouplingLength", Comments.maxCartCouplingLength);
public final ConfigBool survivalContraptionPickup = b(true, "survivalContraptionPickup", Comments.survivalContraptionPickup);
public final ConfigEnum<ContraptionMovementSetting> spawnerMovement =
e(ContraptionMovementSetting.NO_PICKUP, "movableSpawners", Comments.spawnerMovement);
public final ConfigEnum<ContraptionMovementSetting> amethystMovement =
@ -107,6 +108,7 @@ public class CKinetics extends ConfigBase {
static String maxEjectorDistance = "Max Distance in blocks a Weighted Ejector can throw";
static String ejectorScanInterval =
"Time in ticks until the next item launched by an ejector scans blocks for potential collisions";
static String survivalContraptionPickup = "Whether minecart contraptions can be picked up in survival mode.";
static String spawnerMovement = "Configure how Spawner blocks can be moved by contraptions.";
static String amethystMovement = "Configure how Budding Amethyst can be moved by contraptions.";
static String obsidianMovement = "Configure how Obsidian blocks can be moved by contraptions.";

View file

@ -11,7 +11,6 @@ public class CSchematics extends ConfigBase {
public final ConfigGroup schematicannon = group(0, "schematicannon", "Schematicannon");
public final ConfigInt schematicannonDelay = i(10, 1, "schematicannonDelay", Comments.delay);
public final ConfigInt schematicannonSkips = i(10, 1, "schematicannonSkips", Comments.skips);
public final ConfigFloat schematicannonGunpowderWorth =
f(20, 0, 100, "schematicannonGunpowderWorth", Comments.gunpowderWorth);
public final ConfigFloat schematicannonFuelUsage = f(0.05f, 0, 100, "schematicannonFuelUsage", Comments.fuelUsage);
@ -31,7 +30,6 @@ public class CSchematics extends ConfigBase {
static String idleTimeout =
"Amount of game ticks without new packets arriving until an active schematic upload process is discarded.";
static String delay = "Amount of game ticks between shots of the cannon. Higher => Slower";
static String skips = "Amount of block positions per tick scanned by a running cannon. Higher => Faster";
static String gunpowderWorth = "% of Schematicannon's Fuel filled by 1 Gunpowder.";
static String fuelUsage = "% of Schematicannon's Fuel used for each fired block.";
static String creativePrintIncludesAir =

View file

@ -6,10 +6,9 @@ import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.ponder.PonderLocalization;
import com.simibubi.create.foundation.utility.FilesHelper;
import com.simibubi.create.foundation.utility.Lang;
public enum AllLangPartials {
public enum AllLangPartials implements LangPartial {
ADVANCEMENTS("Advancements", AllAdvancements::provideLangEntries),
INTERFACE("UI & Messages"),
@ -19,34 +18,28 @@ public enum AllLangPartials {
;
private String display;
private Supplier<JsonElement> provider;
private final String displayName;
private final Supplier<JsonElement> provider;
private AllLangPartials(String display) {
this.display = display;
this.provider = this::fromResource;
private AllLangPartials(String displayName) {
this.displayName = displayName;
String fileName = Lang.asId(name());
this.provider = () -> LangPartial.fromResource(Create.ID, fileName);
}
private AllLangPartials(String display, Supplier<JsonElement> customProvider) {
this.display = display;
this.provider = customProvider;
private AllLangPartials(String displayName, Supplier<JsonElement> provider) {
this.displayName = displayName;
this.provider = provider;
}
public String getDisplay() {
return display;
@Override
public String getDisplayName() {
return displayName;
}
@Override
public JsonElement provide() {
return provider.get();
}
private JsonElement fromResource() {
String fileName = Lang.asId(name());
String filepath = "assets/" + Create.ID + "/lang/default/" + fileName + ".json";
JsonElement element = FilesHelper.loadJsonResource(filepath);
if (element == null)
throw new IllegalStateException(String.format("Could not find default lang file: %s", filepath));
return element;
}
}

View file

@ -40,12 +40,15 @@ import net.minecraft.util.GsonHelper;
public class LangMerger implements DataProvider {
private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting()
private static final Gson GSON = new GsonBuilder().setPrettyPrinting()
.disableHtmlEscaping()
.create();
static final String CATEGORY_HEADER = "\t\"_\": \"->------------------------] %s [------------------------<-\",";
private static final String CATEGORY_HEADER = "\t\"_\": \"->------------------------] %s [------------------------<-\",";
private DataGenerator gen;
private final String modid;
private final String displayName;
private final LangPartial[] langPartials;
private List<Object> mergedLangData;
private Map<String, List<Object>> populatedLangData;
@ -54,8 +57,11 @@ public class LangMerger implements DataProvider {
private List<String> langIgnore;
public LangMerger(DataGenerator gen) {
public <T extends LangPartial> LangMerger(DataGenerator gen, String modid, String displayName, T[] langPartials) {
this.gen = gen;
this.modid = modid;
this.displayName = displayName;
this.langPartials = langPartials;
this.mergedLangData = new ArrayList<>();
this.langIgnore = new ArrayList<>();
this.allLocalizedEntries = new HashMap<>();
@ -64,7 +70,7 @@ public class LangMerger implements DataProvider {
populateLangIgnore();
}
private void populateLangIgnore() {
protected void populateLangIgnore() {
// Key prefixes added here will NOT be transferred to lang templates
langIgnore.add("create.ponder.debug_"); // Ponder debug scene text
langIgnore.add("create.gui.chromatic_projector");
@ -79,13 +85,13 @@ public class LangMerger implements DataProvider {
@Override
public String getName() {
return "Lang merger";
return displayName + "'s lang merger";
}
@Override
public void run(CachedOutput cache) throws IOException {
Path path = this.gen.getOutputFolder()
.resolve("assets/" + Create.ID + "/lang/" + "en_us.json");
.resolve("assets/" + modid + "/lang/" + "en_us.json");
for (Pair<String, JsonElement> pair : getAllLocalizationFiles()) {
if (!pair.getRight()
@ -119,7 +125,7 @@ public class LangMerger implements DataProvider {
for (Entry<String, List<Object>> localization : populatedLangData.entrySet()) {
String key = localization.getKey();
Path populatedLangPath = this.gen.getOutputFolder()
.resolve("assets/" + Create.ID + "/lang/unfinished/" + key);
.resolve("assets/" + modid + "/lang/unfinished/" + key);
save(cache, localization.getValue(), missingTranslationTally.get(key)
.intValue(), populatedLangPath, "Populating " + key + " with missing entries...");
}
@ -208,7 +214,7 @@ public class LangMerger implements DataProvider {
// Always put tooltips and ponder scenes in their own paragraphs
if (key.endsWith(".tooltip"))
return true;
if (key.startsWith("create.ponder") && key.endsWith(PonderScene.TITLE_KEY))
if (key.startsWith(modid + ".ponder") && key.endsWith(PonderScene.TITLE_KEY))
return true;
key = key.replaceFirst("\\.", "");
@ -226,7 +232,7 @@ public class LangMerger implements DataProvider {
private List<Pair<String, JsonElement>> getAllLocalizationFiles() {
ArrayList<Pair<String, JsonElement>> list = new ArrayList<>();
String filepath = "assets/" + Create.ID + "/lang/";
String filepath = "assets/" + modid + "/lang/";
try (InputStream resourceStream = ClassLoader.getSystemResourceAsStream(filepath)) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resourceStream));
while (true) {
@ -247,8 +253,8 @@ public class LangMerger implements DataProvider {
}
private void collectEntries() {
for (AllLangPartials partial : AllLangPartials.values())
addAll(partial.getDisplay(), partial.provide()
for (LangPartial partial : langPartials)
addAll(partial.getDisplayName(), partial.provide()
.getAsJsonObject());
}
@ -273,7 +279,7 @@ public class LangMerger implements DataProvider {
if (missingKeys != -1)
builder.append("\t\"_\": \"Missing Localizations: " + missingKeys + "\",\n");
data.forEach(builder::append);
builder.append("\t\"_\": \"Thank you for translating Create!\"\n\n");
builder.append("\t\"_\": \"Thank you for translating ").append(displayName).append("!\"\n\n");
builder.append("}");
return builder.toString();
}

Some files were not shown because too many files have changed in this diff Show more