Foolish not to avoid the lack of counteracting no-clip

- Ejectors now occasionally track launched items, scanning for any obstacles in their trajectory
- Fixed rendered items passing an Ejectors' target on clients ticking faster than their server
- Removed outdated warnings for 'transposer funnels'
This commit is contained in:
simibubi 2021-03-27 20:14:55 +01:00
parent 4675e0ad15
commit 497ea4bb66
20 changed files with 152 additions and 175 deletions

View file

@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
@ -403,19 +403,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
ce0e5405da381a86625b908c569c5dbe347abdba assets/create/lang/en_ud.json
75e0c8fea601eecd505e00084e3001d54b315484 assets/create/lang/en_us.json
3f1b5016f59fc581352c4acca569dd68e82d96de assets/create/lang/unfinished/de_de.json
77c60af805305234d28421be451a6091c9222d44 assets/create/lang/unfinished/es_es.json
00cdb52c58844b3d9b00551929866ff7eb23aff8 assets/create/lang/unfinished/es_mx.json
41b68809a2c0267be7e6966274e00a69f370b743 assets/create/lang/unfinished/fr_fr.json
4606b3e7bcbb0b54802e52a800838343e84087ee assets/create/lang/unfinished/it_it.json
38e23ba73a515cb238d3899cc7517ff30223a3bc assets/create/lang/unfinished/ja_jp.json
0e34e4848b8e0ea0b73778477cc4790d6a637143 assets/create/lang/unfinished/ko_kr.json
f8c6e3946025b6af0172319b0a4fc12b6f12a10f assets/create/lang/unfinished/nl_nl.json
5a0d6736f89c5d9e78d893d8c6ceb4ee07b9428b assets/create/lang/unfinished/pt_br.json
ae45aacb4418411dec1e6248637094efec94bd24 assets/create/lang/unfinished/ru_ru.json
ba653601c0452116fd5f8b820a136b4833dcb426 assets/create/lang/unfinished/zh_cn.json
1087875125ce70b1543df07e3957b14b5ef60e9f assets/create/lang/unfinished/zh_tw.json
442123de75c67a2b562194981d62c6a6de053593 assets/create/lang/en_us.json
1a5739ce1ab4a923dcf5a7ed12f16af394aed719 assets/create/lang/unfinished/de_de.json
4f21f855b45e8b44aedcae94e5a41c797d05af45 assets/create/lang/unfinished/es_es.json
e971082462cd5a92a08c3a1481e8e7c6e1afcea1 assets/create/lang/unfinished/es_mx.json
64a39634a36da998fd11553340cd1fc652129ce9 assets/create/lang/unfinished/fr_fr.json
afb72ad7e2713819b3cda0110a41dcdbbcc0bb0b assets/create/lang/unfinished/it_it.json
583b4bddc044614efb1b08f9bfb36a49e0a67e4f assets/create/lang/unfinished/ja_jp.json
9baa3052e1a9440e1cb6d46950d2227f2be3435e assets/create/lang/unfinished/ko_kr.json
7701f3b29b3e92a9943c15000beb9df02143fe90 assets/create/lang/unfinished/nl_nl.json
9f935fe569d793f6ee581ebc24bff5740c91fbab assets/create/lang/unfinished/pt_br.json
9ede4dc1051fea0bcabc30da1d133c0048d29641 assets/create/lang/unfinished/ru_ru.json
2442b5fe4ed2d92ab3081e7422bfecdf1ac06610 assets/create/lang/unfinished/zh_cn.json
56268c452b57cf072f35839ebfa130213a966730 assets/create/lang/unfinished/zh_tw.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json

View file

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

View file

@ -1122,10 +1122,6 @@
"create.hint.hose_pulley": "The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "No Targets",
"create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.",
"create.hint.horizontal_funnel.title": "Horizontal Funnels",
"create.hint.horizontal_funnel": "cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.",
"create.hint.upward_funnel.title": "Funnels facing upward",
"create.hint.upward_funnel": "can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.",
"create.hint.empty_bearing.title": "Update Bearing",
"create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.",
"create.hint.full_deployer.title": "Deployer Item Overflow",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1510",
"_": "Missing Localizations: 1506",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets",
"create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.",
"create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels",
"create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.",
"create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward",
"create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.",
"create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing",
"create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.",
"create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow",

View file

@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita",
"create.hint.mechanical_arm_no_targets.title": "No hay objetivos",
"create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona correas, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.",
"create.hint.horizontal_funnel.title": "Embudos horizontales",
"create.hint.horizontal_funnel": "No puede transferir entre inventarios _directamente_. Intenta pasar una _correa_ o un _depósito_ por debajo de tu embudo para extraer artículos de los inventarios",
"create.hint.upward_funnel.title": "Embudos hacia arriba",
"create.hint.upward_funnel": "sólo pueden transferir objetos insertados por _brazos_, y _ductos_ impulsados por ventilador, o elementos _lanzados_ hacia ellos. Intenta construir algunos _ductos_ si quieres mover tus objetos _verticalmente_",
"create.hint.empty_bearing.title": "Rodamiento de reloj",
"create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él",
"create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1440",
"_": "Missing Localizations: 1436",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets",
"create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.",
"create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels",
"create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.",
"create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward",
"create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.",
"create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing",
"create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.",
"create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1222",
"_": "Missing Localizations: 1218",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets",
"create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.",
"create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels",
"create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.",
"create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward",
"create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.",
"create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing",
"create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.",
"create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow",

View file

@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "Il corpo fluido selezionato è considerato infinito.",
"create.hint.mechanical_arm_no_targets.title": "Nessun bersaglio",
"create.hint.mechanical_arm_no_targets": "Sembra che questo _braccio_ _meccanico_ non sia stato assegnato a nessun _bersaglio_. Seleziona nastri, depositi, imbuti e altri blocchi _cliccandoli_ _col_ _destro_ e _tenendo_ _in_ _mano_ il _braccio_ _meccanico_.",
"create.hint.horizontal_funnel.title": "Imbuto orizzontale",
"create.hint.horizontal_funnel": "Non puoi trasferire tra inventari _direttamente_. Prova a mettere un _nastro_ _meccanico_ o un _deposito_ sotto il tuo imbuto per estrarre gli oggetti dagli inventari.",
"create.hint.upward_funnel.title": "Imbuti rivolti verso l'alto",
"create.hint.upward_funnel": "Puoi solo inserire oggetti inseriti da _braccia_, _scivoli_ alimentati da ventilatori, od oggetti _gettati_ in essi. Prova a costruire degli _scivoli_ se stai cercando di muovere gli oggetti _verticalmente_.",
"create.hint.empty_bearing.title": "Aggiorna il supporto",
"create.hint.empty_bearing": "_Clicca_ _col_ _destro_ il supporto con una _mano_ _vuota_ per _attaccarci_ la struttura che ci hai appena costruito davanti.",
"create.hint.full_deployer.title": "Overflow di oggetti dell'installatore",

View file

@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "対象となる液体は無限とみなされています。",
"create.hint.mechanical_arm_no_targets.title": "ターゲットが見つかりません",
"create.hint.mechanical_arm_no_targets": "どうやらこの_メカニカルアーム_には_ターゲット_が割り当てられていないようです。_メカニカルアーム_を_手_に持って_右クリック_して、ベルト、デポ、ファンネルなどのブロックを選択します。",
"create.hint.horizontal_funnel.title": "水平ファンネル",
"create.hint.horizontal_funnel": "この状態ではインベントリ間でアイテムを_直接_転送することはできません。インベントリからアイテムを取り出すために、ファンネルの下 _メカニカルベルト_ や _デポ_ を置いてみて下さい。",
"create.hint.upward_funnel.title": "上向きファンネル",
"create.hint.upward_funnel": "この状態では_メカニカルアーム_や風を送り込んだ_シュート_、_落ちている_アイテムしか移動できません。アイテムを_縦_に移動させたい場合は、いくつか_シュート_を作ってみてください。",
"create.hint.empty_bearing.title": "ベアリングの更新",
"create.hint.empty_bearing": "_素手_でベアリングを_右クリック_して、その前に先ほど作った構造物を_接続_します。",
"create.hint.full_deployer.title": "デプロイヤーのアイテムが溢れています",

View file

@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "목표 없음",
"create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않은 것 같습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 깔때기를 _우클릭_하여 목표로 지정하세요.",
"create.hint.horizontal_funnel.title": "깔때기가 수평임",
"create.hint.horizontal_funnel": "깔때기는 더이상 아이템을 _직접_ 이동시킬 수 없습니다. _벨트나 아이템 거치대_위에 깔때기를 설치하여 아이템을 이동시키세요.",
"create.hint.upward_funnel.title": "깔때기가 위를 바라보고 있음",
"create.hint.upward_funnel": "_기계 팔_, 선풍기가 부착된 _슈트_를 이용하거나, 혹은 아이템이 _던져져야만_ 이동시킬 수 있습니다. 아이템을 _수직으로_ 옮기고 싶다면 _슈트_를 사용해보세요.",
"create.hint.empty_bearing.title": "베어링 업데이트_",
"create.hint.empty_bearing": "_맨 손_으로 베어링을 _우클릭_하여 구조물을 _부착_하세요.",
"create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1709",
"_": "Missing Localizations: 1705",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets",
"create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.",
"create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels",
"create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.",
"create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward",
"create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.",
"create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing",
"create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.",
"create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1775",
"_": "Missing Localizations: 1771",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets",
"create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.",
"create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels",
"create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.",
"create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward",
"create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.",
"create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing",
"create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.",
"create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow",

View file

@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.",
"create.hint.mechanical_arm_no_targets.title": "Нет целей",
"create.hint.mechanical_arm_no_targets": "Кажется, эта _Механическая рука_ не имеет никаких целей. Выберите _ремни_, _депо_, _воронки_, или другие блоки, с помощью _правого клика_, удерживая _Механическую руку_.",
"create.hint.horizontal_funnel.title": "Горизонтальные воронки",
"create.hint.horizontal_funnel": "Невозможно передавать предметы _напрямую_. Попробуйте запустить _механический ремень_ или _депо_ под вашей воронкой, чтобы извлекать предметы из присоеденённого инвентаря.",
"create.hint.upward_funnel.title": "Воронка направленна вверх",
"create.hint.upward_funnel": "Может перемещать только предметы, вставленные _рукой_, _желобами_ с вентиляторами, или брошенные на неё. Попробуйте использовать _желоба_, если вам нужно перемещать предметы по вертикали.",
"create.hint.empty_bearing.title": "Обновить подшипник",
"create.hint.empty_bearing": "_Правый клик_ по подшипнику _пустой рукой_, чтобы _присоединить_ к нему структуру, которую вы только что построили перед ним.",
"create.hint.full_deployer.title": "Переполнение автономного активатора",

View file

@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "目标液体对象被视为无限量的。",
"create.hint.mechanical_arm_no_targets.title": "没有目标",
"create.hint.mechanical_arm_no_targets": "看起来这个_动力臂_没有被分配给任何_目标_。在手持机械臂的同时右键选取传送带、置物台、漏斗或其他设备来设置目标。",
"create.hint.horizontal_funnel.title": "水平漏斗",
"create.hint.horizontal_funnel": "无法_直接_在两个物品栏间移动物品。请使用传送带或者置物台来从物品栏中提取物品。",
"create.hint.upward_funnel.title": "漏斗向上",
"create.hint.upward_funnel": "只可以传送由_动力臂_鼓风机驱动的_溜槽_或者被投掷的物品。请试着做一些溜槽来垂直运输物品。",
"create.hint.empty_bearing.title": "更新轴承",
"create.hint.empty_bearing": "_空手右键_轴承来_激活_你新建造的结构。",
"create.hint.full_deployer.title": "机械手物品溢出",

View file

@ -1123,10 +1123,6 @@
"create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "沒有目標",
"create.hint.mechanical_arm_no_targets": "看起來這個_機械手臂_沒有被分配任何_目標_。在手持機械手臂的同時右鍵選取輸送帶、置物臺、漏斗或其他設備來設定目標。",
"create.hint.horizontal_funnel.title": "水平漏斗",
"create.hint.horizontal_funnel": "無法_直接_在兩個庫存間移動物品。試著使用輸送帶或者置物臺來從庫存中提取物品。",
"create.hint.upward_funnel.title": "漏斗向上",
"create.hint.upward_funnel": "只可以傳送由_機械手臂_鼓風機驅動的_滑道_或者被投擲的物品。試著做一些滑道來垂直輸送物品。",
"create.hint.empty_bearing.title": "更新軸承",
"create.hint.empty_bearing": "_空手右鍵_軸承來_添加_你新建造的結構。",
"create.hint.full_deployer.title": "機械手物品溢出",

View file

@ -33,7 +33,7 @@ public class EjectorRenderer extends KineticTileEntityRenderer {
public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) {
return true;
}
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
@ -48,17 +48,22 @@ public class EjectorRenderer extends KineticTileEntityRenderer {
SuperByteBuffer model = AllBlockPartials.EJECTOR_TOP.renderOn(te.getBlockState());
applyLidAngle(te, angle, model.matrixStacker());
model.light(light)
.renderInto(ms, vertexBuilder);
.renderInto(ms, vertexBuilder);
}
MatrixStacker msr = MatrixStacker.of(ms);
float maxTime =
(float) (ejector.earlyTarget != null ? ejector.earlyTargetTime : ejector.launcher.getTotalFlyingTicks());
for (IntAttached<ItemStack> intAttached : ejector.launchedItems) {
ms.push();
float time = intAttached.getFirst() + partialTicks;
if (time > maxTime)
continue;
ms.push();
Vec3d launchedItemLocation = ejector.getLaunchedItemLocation(time);
msr.translate(launchedItemLocation.subtract(new Vec3d(te.getPos())));
Vec3d itemRotOffset = VecHelper.voxelSpace(0,3,0);
Vec3d itemRotOffset = VecHelper.voxelSpace(0, 3, 0);
msr.translate(itemRotOffset);
msr.rotateY(AngleHelper.horizontalAngle(ejector.getFacing()));
msr.rotateX(time * 40);

View file

@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Nullable;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
@ -20,6 +22,7 @@ import com.simibubi.create.foundation.utility.IntAttached;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser;
@ -33,6 +36,7 @@ import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ElytraItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
@ -41,7 +45,12 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceContext.BlockMode;
import net.minecraft.util.math.RayTraceContext.FluidMode;
import net.minecraft.util.math.RayTraceResult.Type;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
@ -62,6 +71,14 @@ public class EjectorTileEntity extends KineticTileEntity {
boolean launch;
State state;
// item collision
@Nullable
Pair<Vec3d, BlockPos> earlyTarget;
float earlyTargetTime;
// runtime stuff
int scanCooldown;
ItemStack trackedItem;
public enum State {
CHARGED, LAUNCHING, RETRACTING;
}
@ -207,22 +224,30 @@ public class EjectorTileEntity extends KineticTileEntity {
world.markAndNotifyBlock(pos, world.getChunkAt(pos), getBlockState(), getBlockState(), 0);
if (depotBehaviour.heldItem != null) {
launchedItems.add(IntAttached.withZero(heldItemStack));
addToLaunchedItems(heldItemStack);
depotBehaviour.removeHeldItem();
}
for (TransportedItemStack transportedItemStack : depotBehaviour.incoming)
launchedItems.add(IntAttached.withZero(transportedItemStack.stack));
addToLaunchedItems(transportedItemStack.stack);
depotBehaviour.incoming.clear();
ItemStackHandler outputs = depotBehaviour.processingOutputBuffer;
for (int i = 0; i < outputs.getSlots(); i++) {
ItemStack extractItem = outputs.extractItem(i, 64, false);
if (!extractItem.isEmpty())
launchedItems.add(IntAttached.withZero(extractItem));
addToLaunchedItems(extractItem);
}
}
protected boolean addToLaunchedItems(ItemStack stack) {
if ((!world.isRemote || isVirtual()) && trackedItem == null && scanCooldown == 0) {
scanCooldown = AllConfigs.SERVER.kinetics.ejectorScanInterval.get();
trackedItem = stack;
}
return launchedItems.add(IntAttached.withZero(stack));
}
protected Direction getFacing() {
BlockState blockState = getBlockState();
if (!AllBlocks.WEIGHTED_EJECTOR.has(blockState))
@ -237,7 +262,10 @@ public class EjectorTileEntity extends KineticTileEntity {
boolean doLogic = !world.isRemote || isVirtual();
State prevState = state;
float maxTime = Math.max(3, (float) launcher.getTotalFlyingTicks());
float totalTime = Math.max(3, (float) launcher.getTotalFlyingTicks());
if (scanCooldown > 0)
scanCooldown--;
if (launch) {
launch = false;
@ -246,7 +274,11 @@ public class EjectorTileEntity extends KineticTileEntity {
for (Iterator<IntAttached<ItemStack>> iterator = launchedItems.iterator(); iterator.hasNext();) {
IntAttached<ItemStack> intAttached = iterator.next();
if (intAttached.exceeds((int) maxTime)) {
boolean hit = false;
if (intAttached.getSecond() == trackedItem)
hit = scanTrajectoryForObstacles(intAttached.getFirst());
float maxTime = earlyTarget != null ? Math.min(earlyTargetTime, totalTime) : totalTime;
if (hit || intAttached.exceeds((int) maxTime)) {
placeItemAtTarget(doLogic, maxTime, intAttached);
iterator.remove();
}
@ -276,7 +308,7 @@ public class EjectorTileEntity extends KineticTileEntity {
lidProgress.setValue(0);
sendData();
}
float value = MathHelper.clamp(lidProgress.getValue() - getWindUpSpeed(), 0, 1);
lidProgress.setValue(value);
@ -292,6 +324,31 @@ public class EjectorTileEntity extends KineticTileEntity {
notifyUpdate();
}
private boolean scanTrajectoryForObstacles(int time) {
if (time == 0)
return false;
Vec3d source = getLaunchedItemLocation(time);
Vec3d target = getLaunchedItemLocation(time + 1);
BlockRayTraceResult rayTraceBlocks =
world.rayTraceBlocks(new RayTraceContext(source, target, BlockMode.COLLIDER, FluidMode.NONE, null));
if (rayTraceBlocks.getType() == Type.MISS) {
if (earlyTarget != null && earlyTargetTime < time + 1) {
earlyTarget = null;
earlyTargetTime = 0;
}
return false;
}
Vec3d vec = rayTraceBlocks.getHitVec();
earlyTarget = Pair.of(vec.add(new Vec3d(rayTraceBlocks.getFace()
.getDirectionVec()).scale(.25f)), rayTraceBlocks.getPos());
earlyTargetTime = (float) (time + (source.distanceTo(vec) / source.distanceTo(target)));
sendData();
return true;
}
protected void nudgeEntities() {
for (Entity entity : world.getEntitiesWithinAABB(Entity.class,
new AxisAlignedBB(pos).grow(-1 / 16f, 0, -1 / 16f)))
@ -334,6 +391,8 @@ public class EjectorTileEntity extends KineticTileEntity {
protected void placeItemAtTarget(boolean doLogic, float maxTime, IntAttached<ItemStack> intAttached) {
if (!doLogic)
return;
if (intAttached.getSecond() == trackedItem)
trackedItem = null;
DirectBeltInputBehaviour targetOpenInv = getTargetOpenInv();
if (targetOpenInv != null) {
@ -345,7 +404,7 @@ public class EjectorTileEntity extends KineticTileEntity {
.isEmpty())
return;
Vec3d ejectVec = getLaunchedItemLocation(maxTime);
Vec3d ejectVec = earlyTarget != null ? earlyTarget.getFirst() : getLaunchedItemLocation(maxTime);
Vec3d ejectMotionVec = getLaunchedItemMotion(maxTime);
ItemEntity item = new ItemEntity(world, ejectVec.x, ejectVec.y, ejectVec.z, intAttached.getValue());
item.setMotion(ejectMotionVec);
@ -354,8 +413,10 @@ public class EjectorTileEntity extends KineticTileEntity {
}
public DirectBeltInputBehaviour getTargetOpenInv() {
return TileEntityBehaviour.get(world, pos.up(launcher.getVerticalDistance())
.offset(getFacing(), Math.max(1, launcher.getHorizontalDistance())), DirectBeltInputBehaviour.TYPE);
BlockPos targetPos = earlyTarget != null ? earlyTarget.getSecond()
: pos.up(launcher.getVerticalDistance())
.offset(getFacing(), Math.max(1, launcher.getHorizontalDistance()));
return TileEntityBehaviour.get(world, targetPos, DirectBeltInputBehaviour.TYPE);
}
public Vec3d getLaunchedItemLocation(float time) {
@ -363,7 +424,8 @@ public class EjectorTileEntity extends KineticTileEntity {
}
public Vec3d getLaunchedItemMotion(float time) {
return launcher.getGlobalVelocity(time, getFacing().getOpposite(), pos);
return launcher.getGlobalVelocity(time, getFacing().getOpposite(), pos)
.scale(.5f);
}
public void dropFlyingItems() {
@ -402,6 +464,12 @@ public class EjectorTileEntity extends KineticTileEntity {
compound.put("Lid", lidProgress.writeNBT());
compound.put("LaunchedItems",
NBTHelper.writeCompoundList(launchedItems, ia -> ia.serializeNBT(ItemStack::serializeNBT)));
if (earlyTarget != null) {
compound.put("EarlyTarget", VecHelper.writeNBT(earlyTarget.getFirst()));
compound.put("EarlyTargetPos", NBTUtil.writeBlockPos(earlyTarget.getSecond()));
compound.putFloat("EarlyTargetTime", earlyTargetTime);
}
}
@Override
@ -421,6 +489,14 @@ public class EjectorTileEntity extends KineticTileEntity {
lidProgress.readNBT(compound.getCompound("Lid"), clientPacket);
launchedItems = NBTHelper.readCompoundList(compound.getList("LaunchedItems", NBT.TAG_COMPOUND),
nbt -> IntAttached.read(nbt, ItemStack::read));
earlyTarget = null;
earlyTargetTime = 0;
if (compound.contains("EarlyTarget")) {
earlyTarget = Pair.of(VecHelper.readNBT(compound.getList("EarlyTarget", NBT.TAG_DOUBLE)),
NBTUtil.readBlockPos(compound.getCompound("EarlyTargetPos")));
earlyTargetTime = compound.getFloat("EarlyTargetTime");
}
}
public void updateSignal() {

View file

@ -4,17 +4,14 @@ import java.lang.ref.WeakReference;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.saw.SawTileEntity;
import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape;
import com.simibubi.create.content.logistics.packet.FunnelFlapPacket;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered;
@ -31,17 +28,12 @@ import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringInformation, IInstanceRendered {
@ -344,48 +336,6 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn
.onFunnelTransfer(world, pos, stack);
}
@Override
// Hint players not to use funnels like 0.2 transposers
public boolean addToTooltip(List<String> tooltip, boolean isPlayerSneaking) {
if (isPlayerSneaking)
return false;
BlockState state = getBlockState();
if (!(state.getBlock() instanceof FunnelBlock))
return false;
Direction funnelFacing = FunnelBlock.getFunnelFacing(state);
if (world.getBlockState(pos.offset(funnelFacing.getOpposite()))
.getMaterial()
.isReplaceable())
return false;
BlockPos inputPos = pos.offset(funnelFacing);
TileEntity tileEntity = world.getTileEntity(inputPos);
if (tileEntity == null)
return false;
if (tileEntity instanceof BeltTileEntity)
return false;
if (tileEntity instanceof SawTileEntity)
return false;
if (tileEntity instanceof ChuteTileEntity)
return false;
LazyOptional<IItemHandler> capability = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
if (!capability.isPresent())
return false;
if (funnelFacing == Direction.DOWN) {
TooltipHelper.addHint(tooltip, "hint.upward_funnel");
return true;
}
if (!funnelFacing.getAxis()
.isHorizontal())
return false;
TooltipHelper.addHint(tooltip, "hint.horizontal_funnel");
return true;
}
@Override
public boolean shouldRenderAsTE() {
return true;

View file

@ -16,6 +16,7 @@ public class CKinetics extends ConfigBase {
public ConfigFloat crankHungerMultiplier = f(.01f, 0, 1, "crankHungerMultiplier", Comments.crankHungerMultiplier);
public ConfigInt minimumWindmillSails = i(8, 0, "minimumWindmillSails", Comments.minimumWindmillSails);
public ConfigInt maxEjectorDistance = i(32, 0, "maxEjectorDistance", Comments.maxEjectorDistance);
public ConfigInt ejectorScanInterval = i(120, 10, "ejectorScanInterval", Comments.ejectorScanInterval);
public ConfigGroup fan = group(1, "encasedFan", "Encased Fan");
public ConfigInt fanPushDistance = i(20, 5, "fanPushDistance", Comments.fanPushDistance);
@ -83,6 +84,7 @@ public class CKinetics extends ConfigBase {
static String kineticValidationFrequency = "Game ticks between Kinetic Blocks checking whether their source is still valid.";
static String minimumWindmillSails = "Amount of sail-type blocks required for a windmill to assemble successfully.";
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";
}
public static enum DeployerAggroSetting {

View file

@ -482,10 +482,6 @@
"create.hint.hose_pulley": "The targeted body of fluid is considered infinite.",
"create.hint.mechanical_arm_no_targets.title": "No Targets",
"create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.",
"create.hint.horizontal_funnel.title": "Horizontal Funnels",
"create.hint.horizontal_funnel": "cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.",
"create.hint.upward_funnel.title": "Funnels facing upward",
"create.hint.upward_funnel": "can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.",
"create.hint.empty_bearing.title": "Update Bearing",
"create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.",
"create.hint.full_deployer.title": "Deployer Item Overflow",