Thinking with Pipes

- Implemented ponder scenes for Fluid Pipes and Copper Casing
- Adjusted Fluid transfer, containment and rendering behaviours to function in 'virtual' environments
This commit is contained in:
simibubi 2021-06-21 18:46:31 +02:00
parent 813a1ccaba
commit 0a376b719e
33 changed files with 722 additions and 131 deletions

View file

@ -408,20 +408,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
c71f5246d2cb8e9913d1552d23fcc82c43cde7a0 assets/create/lang/en_ud.json
ecb2b14e09668bb04ead075b25751af4d47d530a assets/create/lang/en_us.json
32a311fee8bea2504ec80f4ecfabf64afc994109 assets/create/lang/unfinished/de_de.json
af669cb92010605ebb73ea48bad9215e8efa216b assets/create/lang/unfinished/es_es.json
23dce1fd449f6e0e747c10508f9551edb3912a69 assets/create/lang/unfinished/es_mx.json
461155a3e7555df12d07748e7b8c7ca137f2ce69 assets/create/lang/unfinished/fr_fr.json
9cb68aeeeb220466ec4766ac7fd4adc4a28a14ee assets/create/lang/unfinished/it_it.json
1a287c031e3a9cd370e61b8912a2d1f39273b051 assets/create/lang/unfinished/ja_jp.json
0eaa7a9f39f3cd8be5b88e61992cf3198b76689d assets/create/lang/unfinished/ko_kr.json
db87b45eff6bd38dd1774510fa54429c47c194b9 assets/create/lang/unfinished/nl_nl.json
4c90c5055d090adc5765e8ab80f73f7e22185151 assets/create/lang/unfinished/pl_pl.json
bf04fa57b3e3efee8c6989b69f98fb374c8eff86 assets/create/lang/unfinished/pt_br.json
c8f9159b77f8176c994fb008d9b57f9154f48c6d assets/create/lang/unfinished/ru_ru.json
9f55faa2273c7493fe66aa7d369bfdd6edcb2a3f assets/create/lang/unfinished/zh_cn.json
9333985168408e58aa76f9c865b2c5fad4691527 assets/create/lang/unfinished/zh_tw.json
0352f128a214a76365bae7365d7904536ffccbba assets/create/lang/en_us.json
d2fe2b5beb7c4b7d05842dc45da6630dd1f0611f assets/create/lang/unfinished/de_de.json
a486966e82368a85f4c6c5c6b4fd17b0b6e260b4 assets/create/lang/unfinished/es_es.json
94c05715d19c5ceced368c4aa4307b5184eb9d0f assets/create/lang/unfinished/es_mx.json
44fe3efbe33085dc4248ba7ee94e35065aab5cca assets/create/lang/unfinished/fr_fr.json
c53beea261e7a64bdbe397481a2010bb166b10ce assets/create/lang/unfinished/it_it.json
2d75e6eb0c1683ef4856acf86b4f1e49d9e7b9b2 assets/create/lang/unfinished/ja_jp.json
a0d8634f363ee47f3e5ac568d5b63cc6e25a4267 assets/create/lang/unfinished/ko_kr.json
75e6dcc51ef14e39fd7ec1a87a0bbc945ef12637 assets/create/lang/unfinished/nl_nl.json
93b883e54947c1a1869984bc4e764c34b7055998 assets/create/lang/unfinished/pl_pl.json
fc093fa80821bfc4076261dcf1ec56c21edc2262 assets/create/lang/unfinished/pt_br.json
c5b4013e8758f6bfde86eb2d25ec920b5d25c7d1 assets/create/lang/unfinished/ru_ru.json
5bb493fd0d4a05d4b83db99eacea460cb96f8f1a assets/create/lang/unfinished/zh_cn.json
9c049cc88deb8b319c6de28caa417eea9baa7f79 assets/create/lang/unfinished/zh_tw.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json

View file

@ -1751,6 +1751,9 @@
"create.ponder.empty_blaze_burner.text_5": "However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "Encased Fans use Rotational Force to create an Air Current",
@ -1771,8 +1774,20 @@
"create.ponder.fan_source.text_2": "When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1024",
"_": "Missing Localizations: 1039",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 725",
"_": "Missing Localizations: 740",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1337",
"_": "Missing Localizations: 1352",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1276",
"_": "Missing Localizations: 1291",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 742",
"_": "Missing Localizations: 757",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 106",
"_": "Missing Localizations: 121",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "しかし、これは加工用の熱源には適していません",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "ケース入りファンの気流",
"create.ponder.fan_direction.text_1": "ケース入りファンは、回転力を利用して気流を生み出します",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "レッドストーン信号を受けると、回転力が生成されます",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 795",
"_": "Missing Localizations: 810",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1659",
"_": "Missing Localizations: 1674",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 82",
"_": "Missing Localizations: 97",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "Nie będzie on dawał jednak ciepła",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "Przepływ powietrza przez izolowane wiatraki",
"create.ponder.fan_direction.text_1": "Izolowane wiatraki używają siły obrotowej, aby wytworzyć przepływ powietrza",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "Po zasileniu, wiatraki zaczną przesyłać siłę do przylegających komponentów",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1700",
"_": "Missing Localizations: 1715",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 639",
"_": "Missing Localizations: 654",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans",
"create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 125",
"_": "Missing Localizations: 140",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "但是,这样的热源不足以给机器提加工供足够的热量",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "鼓风机的气流",
"create.ponder.fan_direction.text_1": "鼓风机使用旋转力来制造气流",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "当鼓风机接受红石信号后,它便会向外供给旋转力",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 118",
"_": "Missing Localizations: 133",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1752,6 +1752,9 @@
"create.ponder.empty_blaze_burner.text_5": "但是,這樣的熱源不足以給機器提加工供足夠的熱量",
"create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes",
"create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state",
"create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed",
"create.ponder.fan_direction.header": "鼓風機的氣流",
"create.ponder.fan_direction.text_1": "鼓風機使用動能來製造氣流",
@ -1772,8 +1775,20 @@
"create.ponder.fan_source.text_2": "當鼓風機接受紅石訊號後,它便會向外供給動能",
"create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes",
"create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets",
"create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window",
"create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments",
"create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids",
"create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first",
"create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents",
"create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid",
"create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers",
"create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks",
"create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained",
"create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...",
"create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources",
"create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly",
"create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank",

View file

@ -60,7 +60,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour {
super.tick();
World world = getWorld();
BlockPos pos = getPos();
boolean onClient = world.isRemote;
boolean onServer = !world.isRemote || tileEntity.isVirtual();
if (interfaces == null)
return;
@ -81,7 +81,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour {
return;
}
if (!onClient) {
if (onServer) {
boolean sendUpdate = false;
for (PipeConnection connection : connections) {
sendUpdate |= connection.flipFlowsIfPressureReversed();
@ -96,7 +96,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour {
return;
}
if (!onClient) {
if (onServer) {
FluidStack availableFlow = FluidStack.EMPTY;
FluidStack collidingFlow = FluidStack.EMPTY;
@ -155,7 +155,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour {
}
interfaces.values()
.forEach(connection -> connection.deserializeNBT(nbt, clientPacket));
.forEach(connection -> connection.deserializeNBT(nbt, tileEntity.getPos(), clientPacket));
}
@Override

View file

@ -208,8 +208,9 @@ public class OpenEndedPipe extends FlowSource {
return compound;
}
public static OpenEndedPipe fromNBT(CompoundNBT compound) {
OpenEndedPipe oep = new OpenEndedPipe(BlockFace.fromNBT(compound.getCompound("Location")));
public static OpenEndedPipe fromNBT(CompoundNBT compound, BlockPos tilePos) {
BlockFace fromNBT = BlockFace.fromNBT(compound.getCompound("Location"));
OpenEndedPipe oep = new OpenEndedPipe(new BlockFace(tilePos, fromNBT.getFace()));
oep.fluidHandler.readFromNBT(compound);
oep.wasPulling = compound.getBoolean("Pulling");
return oep;

View file

@ -239,7 +239,7 @@ public class PipeConnection {
return source.orElse(null) instanceof OpenEndedPipe;
}
public void deserializeNBT(CompoundNBT tag, boolean clientPacket) {
public void deserializeNBT(CompoundNBT tag, BlockPos tilePos, boolean clientPacket) {
CompoundNBT connectionData = tag.getCompound(side.getName2());
if (connectionData.contains("Pressure")) {
@ -250,7 +250,7 @@ public class PipeConnection {
source = Optional.empty();
if (connectionData.contains("OpenEnd"))
source = Optional.of(OpenEndedPipe.fromNBT(connectionData.getCompound("OpenEnd")));
source = Optional.of(OpenEndedPipe.fromNBT(connectionData.getCompound("OpenEnd"), tilePos));
if (connectionData.contains("Flow")) {
CompoundNBT flowData = connectionData.getCompound("Flow");
@ -367,8 +367,9 @@ public class PipeConnection {
@OnlyIn(Dist.CLIENT)
private void spawnParticlesInner(World world, BlockPos pos, FluidStack fluid) {
if (!isRenderEntityWithinDistance(pos))
return;
if (world == Minecraft.getInstance().world)
if (!isRenderEntityWithinDistance(pos))
return;
if (hasOpenEnd())
spawnPouringLiquid(world, pos, fluid, 1);
else if (r.nextFloat() < IDLE_PARTICLE_SPAWN_CHANCE)
@ -377,8 +378,9 @@ public class PipeConnection {
@OnlyIn(Dist.CLIENT)
private void spawnSplashOnRimInner(World world, BlockPos pos, FluidStack fluid) {
if (!isRenderEntityWithinDistance(pos))
return;
if (world == Minecraft.getInstance().world)
if (!isRenderEntityWithinDistance(pos))
return;
spawnRimParticles(world, pos, fluid, SPLASH_PARTICLE_AMOUNT);
}

View file

@ -70,7 +70,8 @@ public class PumpTileEntity extends KineticTileEntity {
return;
arrowDirection.chase(speed >= 0 ? 1 : -1, .5f, Chaser.EXP);
arrowDirection.tickChaser();
return;
if (!isVirtual())
return;
}
sidesToUpdate.forEachWithContext((update, isFront) -> {
@ -96,7 +97,7 @@ public class PumpTileEntity extends KineticTileEntity {
return;
if (speed != 0)
reversed = speed < 0;
if (world.isRemote)
if (world.isRemote && !isVirtual())
return;
BlockPos frontPos = pos.offset(getFront());

View file

@ -106,6 +106,10 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
fluidLevel.tick();
}
public BlockPos getLastKnownPos() {
return lastKnownPos;
}
public boolean isController() {
return controller == null
|| pos.getX() == controller.getX() && pos.getY() == controller.getY() && pos.getZ() == controller.getZ();
@ -157,6 +161,12 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
markDirty();
sendData();
}
if (isVirtual()) {
if (fluidLevel == null)
fluidLevel = new InterpolatedChasingValue().start(getFillState());
fluidLevel.target(getFillState());
}
}
protected void setLuminosity(int luminosity) {
@ -268,7 +278,7 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
}
public void setController(BlockPos controller) {
if (world.isRemote)
if (world.isRemote && !isVirtual())
return;
if (controller.equals(this.controller))
return;

View file

@ -5,6 +5,7 @@ import java.util.function.Function;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.matrix.MatrixStack.Entry;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Iterate;
@ -39,6 +40,9 @@ public class FluidRenderer {
int color = fluidAttributes.getColor(fluidStack);
IVertexBuilder builder = buffer.getBuffer(RenderType.getTranslucent());
if (buffer instanceof SuperRenderTypeBuffer)
builder = ((SuperRenderTypeBuffer) buffer).getLateBuffer(RenderType.getTranslucent());
MatrixStacker msr = MatrixStacker.of(ms);
int blockLightIn = (light >> 4) & 0xf;
int luminosity = Math.max(blockLightIn, fluidAttributes.getLuminosity(fluidStack));
@ -87,6 +91,8 @@ public class FluidRenderer {
int color = fluidAttributes.getColor(fluidStack);
IVertexBuilder builder = buffer.getBuffer(RenderType.getTranslucent());
if (buffer instanceof SuperRenderTypeBuffer)
builder = ((SuperRenderTypeBuffer) buffer).getLateBuffer(RenderType.getTranslucent());
MatrixStacker msr = MatrixStacker.of(ms);
Vector3d center = new Vector3d(xMin + (xMax - xMin) / 2, yMin + (yMax - yMin) / 2, zMin + (zMax - zMin) / 2);

View file

@ -9,6 +9,7 @@ import java.util.Map;
import javax.annotation.Nullable;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.schematics.SchematicWorld;
@ -104,15 +105,26 @@ public class PonderWorld extends SchematicWorld {
originalEntities.forEach(e -> EntityType.loadEntityUnchecked(e.serializeNBT(), this)
.ifPresent(entities::add));
particles.clearEffects();
fixBeltTileEntities();
fixControllerTileEntities();
}
public void restoreBlocks(Selection selection) {
selection.forEach(p -> {
if (originalBlocks.containsKey(p))
blocks.put(p, originalBlocks.get(p));
if (originalTileEntities.containsKey(p)) {
TileEntity te = TileEntity.createFromTag(originalBlocks.get(p), originalTileEntities.get(p)
.write(new CompoundNBT()));
onTEadded(te, te.getPos());
tileEntities.put(p, te);
}
});
scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw);
redraw();
}
private void redraw() {
if (scene != null)
scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw);
}
public void pushFakeLight(int light) {
@ -226,6 +238,11 @@ public class PonderWorld extends SchematicWorld {
: iparticlefactory.makeParticle(data, asClientWorld.getValue(), x, y, z, mx, my, mz);
}
@Override
public boolean setBlockState(BlockPos pos, BlockState arg1, int arg2) {
return super.setBlockState(pos, arg1, arg2);
}
public void addParticle(Particle p) {
if (p != null)
particles.addParticle(p);
@ -240,20 +257,34 @@ public class PonderWorld extends SchematicWorld {
smartTileEntity.markVirtual();
}
public void fixBeltTileEntities() {
public void fixControllerTileEntities() {
for (TileEntity tileEntity : tileEntities.values()) {
if (!(tileEntity instanceof BeltTileEntity))
continue;
BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity;
if (!beltTileEntity.isController())
continue;
BlockPos controllerPos = tileEntity.getPos();
for (BlockPos blockPos : BeltBlock.getBeltChain(this, controllerPos)) {
TileEntity tileEntity2 = getTileEntity(blockPos);
if (!(tileEntity2 instanceof BeltTileEntity))
if (tileEntity instanceof BeltTileEntity) {
BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity;
if (!beltTileEntity.isController())
continue;
BeltTileEntity belt2 = (BeltTileEntity) tileEntity2;
belt2.setController(controllerPos);
BlockPos controllerPos = tileEntity.getPos();
for (BlockPos blockPos : BeltBlock.getBeltChain(this, controllerPos)) {
TileEntity tileEntity2 = getTileEntity(blockPos);
if (!(tileEntity2 instanceof BeltTileEntity))
continue;
BeltTileEntity belt2 = (BeltTileEntity) tileEntity2;
belt2.setController(controllerPos);
}
}
if (tileEntity instanceof FluidTankTileEntity) {
FluidTankTileEntity fluidTankTileEntity = (FluidTankTileEntity) tileEntity;
BlockPos lastKnown = fluidTankTileEntity.getLastKnownPos();
BlockPos current = fluidTankTileEntity.getPos();
if (lastKnown == null || current == null)
continue;
if (fluidTankTileEntity.isController())
continue;
if (!lastKnown.equals(current)) {
BlockPos newControllerPos = fluidTankTileEntity.getController()
.add(current.subtract(lastKnown));
fluidTankTileEntity.setController(newControllerPos);
}
}
}
}

View file

@ -14,6 +14,8 @@ import com.simibubi.create.content.contraptions.components.crafter.ConnectedInpu
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem;
import com.simibubi.create.content.contraptions.fluids.FluidPropagator;
import com.simibubi.create.content.contraptions.fluids.PumpTileEntity;
import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity;
@ -739,6 +741,10 @@ public class SceneBuilder {
});
}
public void propagatePipeChange(BlockPos pos) {
modifyTileEntity(pos, PumpTileEntity.class, te -> te.onSpeedChanged(0));
}
public void setFilterData(Selection selection, Class<? extends TileEntity> teType, ItemStack filter) {
modifyTileNBT(selection, teType, nbt -> {
nbt.put("Filter", filter.serializeNBT());

View file

@ -45,6 +45,7 @@ public class DebugScenes {
add(DebugScenes::birbScene);
add(DebugScenes::sectionsScene);
add(DebugScenes::itemScene);
add(DebugScenes::pipeScene);
}
private static void add(PonderStoryBoard sb) {
@ -434,4 +435,16 @@ public class DebugScenes {
scene.world.modifyEntities(ItemEntity.class, Entity::remove);
}
public static void pipeScene(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("debug_pipes", "Manipulating Items");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(10);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
}
}

View file

@ -242,11 +242,11 @@ public class PonderIndex {
// Fluids
PonderRegistry.forComponents(AllBlocks.FLUID_PIPE)
.addStoryBoard("debug/scene_1", PipeScenes::flow, PonderTag.FLUIDS)
.addStoryBoard("debug/scene_1", PipeScenes::interaction)
.addStoryBoard("debug/scene_1", PipeScenes::encasing);
.addStoryBoard("fluid_pipe/flow", PipeScenes::flow, PonderTag.FLUIDS)
.addStoryBoard("fluid_pipe/interaction", PipeScenes::interaction)
.addStoryBoard("fluid_pipe/encasing", PipeScenes::encasing);
PonderRegistry.forComponents(AllBlocks.COPPER_CASING)
.addStoryBoard("debug/scene_1", PipeScenes::encasing);
.addStoryBoard("fluid_pipe/encasing", PipeScenes::encasing);
PonderRegistry.forComponents(AllBlocks.MECHANICAL_PUMP)
.addStoryBoard("debug/scene_1", PumpScenes::flow, PonderTag.FLUIDS, PonderTag.KINETIC_APPLIANCES)
.addStoryBoard("debug/scene_1", PumpScenes::speed);

View file

@ -1,76 +1,364 @@
package com.simibubi.create.foundation.ponder.content.fluid;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.AxisPipeBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity;
import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
import com.simibubi.create.foundation.ponder.Selection;
import com.simibubi.create.foundation.ponder.content.PonderPalette;
import com.simibubi.create.foundation.ponder.elements.InputWindowElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.block.BeehiveBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
public class PipeScenes {
public static void flow(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("fluid_pipe_flow", "Moving Fluids using Copper Pipes");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.showBasePlate();
scene.idle(5);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
// scene.overlay.showText(50)
// .text("")
// .attachKeyFrame()
// .placeNearTarget()
// .pointAt(util.vector.topOf(2, 0, 2));
BlockState pipeState = AllBlocks.FLUID_PIPE.getDefaultState()
.with(FluidPipeBlock.UP, false)
.with(FluidPipeBlock.DOWN, false);
/*
* Use Fluid Pipes to connect two fluid sources, containers or empty spaces
*
* Using a wrench, a straight pipe segment can be given a window
*
* Windowed pipes will not connect to any other adjancent pipe segements
*
* Powered by Mechanical Pumps, Fluid Pipes can be used to transport Fluids between endpoints
*
* Until the flow finds a target, nothing is extracted from the source
*
* Once a connection is established, fluids are gradually transferred between the endpoints
*
* Thus, the Pipe blocks themselves never 'physically' contain any fluid
*/
scene.world.setBlock(util.grid.at(2, 1, 1), pipeState.with(FluidPipeBlock.NORTH, false)
.with(FluidPipeBlock.SOUTH, false), false);
scene.world.setBlock(util.grid.at(1, 1, 2), pipeState.with(FluidPipeBlock.WEST, false)
.with(FluidPipeBlock.EAST, false), false);
Selection largeCog = util.select.position(5, 0, 1);
Selection kinetics = util.select.fromTo(5, 1, 0, 3, 1, 0);
Selection tank = util.select.fromTo(4, 1, 2, 4, 2, 2);
Selection tank2 = util.select.fromTo(0, 1, 3, 0, 2, 3);
Selection strayPipes = util.select.fromTo(2, 1, 2, 2, 2, 2)
.add(util.select.fromTo(1, 2, 2, 1, 3, 2));
scene.world.showSection(tank, Direction.DOWN);
scene.idle(5);
scene.world.showSection(tank2, Direction.DOWN);
FluidStack content = new FluidStack(Fluids.LAVA, 10000);
scene.world.modifyTileEntity(util.grid.at(4, 1, 2), FluidTankTileEntity.class, te -> te.getTankInventory()
.fill(content, FluidAction.EXECUTE));
scene.idle(10);
for (int i = 4; i >= 1; i--) {
scene.world.showSection(util.select.position(i, 1, 1), i == 4 ? Direction.SOUTH : Direction.EAST);
scene.idle(3);
}
scene.overlay.showText(60)
.text("Fluid Pipes can connect two or more fluid sources and targets")
.attachKeyFrame()
.placeNearTarget()
.pointAt(util.vector.topOf(1, 1, 1));
for (int i = 2; i <= 3; i++) {
scene.world.showSection(util.select.position(1, 1, i), Direction.NORTH);
scene.idle(3);
}
scene.idle(60);
scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(2, 1, 1), Pointing.DOWN).rightClick()
.withWrench(), 40);
scene.idle(7);
scene.world.restoreBlocks(util.select.position(2, 1, 1));
scene.overlay.showText(70)
.attachKeyFrame()
.pointAt(util.vector.centerOf(2, 1, 1))
.placeNearTarget()
.text("Using a wrench, a straight pipe segment can be given a window");
scene.idle(40);
scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(1, 1, 2), Pointing.DOWN).rightClick()
.withWrench(), 10);
scene.idle(7);
scene.world.restoreBlocks(util.select.position(1, 1, 2));
scene.idle(40);
Vector3d center = util.vector.centerOf(2, 1, 2);
AxisAlignedBB bb = new AxisAlignedBB(center, center).grow(1 / 6f);
AxisAlignedBB bb1 = bb.offset(-0.5, 0, 0);
AxisAlignedBB bb2 = bb.offset(0, 0, -0.5);
scene.world.showSection(strayPipes, Direction.DOWN);
scene.idle(10);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb1, bb, 1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb1, bb1, 50);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2, 50);
scene.idle(10);
scene.overlay.showText(55)
.attachKeyFrame()
.pointAt(util.vector.centerOf(2, 1, 2))
.placeNearTarget()
.colored(PonderPalette.RED)
.text("Windowed pipes will not connect to any other adjacent pipe segments");
scene.idle(60);
scene.world.hideSection(strayPipes, Direction.UP);
scene.idle(10);
BlockPos pumpPos = util.grid.at(3, 1, 1);
scene.world.setBlock(pumpPos, AllBlocks.MECHANICAL_PUMP.getDefaultState()
.with(PumpBlock.FACING, Direction.WEST), true);
scene.idle(10);
scene.world.showSection(largeCog, Direction.UP);
scene.world.showSection(kinetics, Direction.SOUTH);
scene.idle(10);
scene.world.setKineticSpeed(util.select.position(pumpPos), 32);
scene.world.propagatePipeChange(pumpPos);
scene.overlay.showText(70)
.attachKeyFrame()
.pointAt(util.vector.topOf(pumpPos))
.placeNearTarget()
.text("Powered by Mechanical Pumps, the Pipes can transport Fluids");
scene.idle(85);
scene.overlay.showSelectionWithText(tank, 40)
.colored(PonderPalette.RED)
.placeNearTarget()
.text("No fluid is being extracted at first");
scene.idle(90);
scene.overlay.showOutline(PonderPalette.GREEN, new Object(), tank, 100);
scene.idle(5);
scene.overlay.showOutline(PonderPalette.GREEN, new Object(), tank2, 100);
scene.idle(5);
scene.overlay.showText(100)
.attachKeyFrame()
.independent()
.text("Once the flow connects them, the endpoints gradually transfer their contents");
scene.overlay.showLine(PonderPalette.GREEN, util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.WEST),
util.vector.blockSurface(util.grid.at(0, 2, 3), Direction.EAST), 80);
scene.world.multiplyKineticSpeed(util.select.everywhere(), 2);
scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationSpeedIndicator(pumpPos);
scene.idle(120);
scene.overlay.showText(60)
.text("Thus, the Pipe blocks themselves never 'physically' contain any fluid")
.placeNearTarget()
.pointAt(util.vector.topOf(1, 1, 1));
scene.idle(50);
}
public static void interaction(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("fluid_pipe_interaction", "Draining and Filling fluid containers");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.configureBasePlate(0, 1, 5);
scene.showBasePlate();
scene.idle(5);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
/*
* Endpoints of a pipe network can interact with a variety of blocks
*
* Any block with fluid storage capabities can be filled or drained
*
* Source blocks right in front of an open end can be picked up...
*
* ...while spilling into empty spaces can create fluid sources
*
* Pipes can also extract fluids from a handful of blocks directly
*/
BlockPos pumpPos = util.grid.at(2, 1, 4);
Selection largeCog = util.select.position(5, 0, 4);
Selection kinetics = util.select.fromTo(5, 1, 5, 2, 1, 5);
Selection pipes = util.select.fromTo(1, 1, 4, 3, 1, 3)
.add(util.select.position(3, 1, 2));
Selection tank = util.select.fromTo(4, 1, 3, 4, 2, 3);
Selection drain = util.select.position(1, 1, 2);
Selection basin = util.select.position(3, 1, 1);
Selection waterSourceS = util.select.position(1, 1, 1);
Selection waterTargetS = util.select.position(4, 1, 1);
Selection waterTarget2S = util.select.fromTo(4, 0, 0, 4, 1, 0);
scene.world.setKineticSpeed(util.select.position(pumpPos), 0);
scene.world.showSection(pipes, Direction.DOWN);
scene.idle(10);
scene.world.showSection(basin, Direction.SOUTH);
scene.idle(5);
scene.world.showSection(drain, Direction.SOUTH);
scene.idle(5);
scene.world.showSection(tank, Direction.WEST);
scene.overlay.showText(60)
.text("Endpoints of a pipe network can interact with a variety of blocks")
.attachKeyFrame()
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.NORTH));
scene.idle(60);
scene.world.showSection(largeCog, Direction.UP);
scene.idle(5);
scene.world.showSection(kinetics, Direction.NORTH);
scene.idle(10);
scene.world.setKineticSpeed(util.select.position(pumpPos), 64);
BlockPos drainPos = util.grid.at(1, 1, 2);
scene.world.modifyTileEntity(drainPos, ItemDrainTileEntity.class,
te -> te.getBehaviour(SmartFluidTankBehaviour.TYPE)
.allowInsertion()
.getPrimaryHandler()
.fill(new FluidStack(Fluids.WATER, 1500), FluidAction.EXECUTE));
scene.idle(50);
scene.overlay.showOutline(PonderPalette.MEDIUM, new Object(), drain, 40);
scene.idle(5);
scene.overlay.showOutline(PonderPalette.MEDIUM, new Object(), tank, 40);
scene.idle(5);
scene.overlay.showOutline(PonderPalette.MEDIUM, new Object(), basin, 40);
scene.idle(5);
scene.overlay.showText(60)
.text("Any block with fluid storage capabilities can be filled or drained")
.attachKeyFrame()
.colored(PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.blockSurface(drainPos, Direction.UP));
scene.idle(100);
scene.world.hideSection(drain, Direction.NORTH);
scene.idle(5);
scene.world.hideSection(tank, Direction.EAST);
scene.idle(5);
scene.world.setBlock(drainPos, Blocks.AIR.getDefaultState(), false);
scene.world.propagatePipeChange(pumpPos);
scene.world.hideSection(basin, Direction.NORTH);
scene.idle(5);
scene.world.setBlock(util.grid.at(3, 1, 1), Blocks.AIR.getDefaultState(), false);
scene.idle(5);
scene.world.setBlock(util.grid.at(3, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState()
.with(AxisPipeBlock.AXIS, Axis.Z), false);
scene.idle(10);
scene.world.multiplyKineticSpeed(util.select.everywhere(), 2);
scene.world.propagatePipeChange(pumpPos);
ElementLink<WorldSectionElement> water = scene.world.showIndependentSection(waterSourceS, Direction.DOWN);
scene.world.moveSection(water, util.vector.of(0, 0, 1), 0);
scene.idle(10);
scene.world.setBlock(drainPos, Blocks.WATER.getDefaultState(), false);
scene.idle(20);
scene.overlay.showText(60)
.text("Source blocks right in front of an open end can be picked up...")
.attachKeyFrame()
.placeNearTarget()
.pointAt(util.vector.blockSurface(drainPos, Direction.SOUTH));
scene.idle(40);
scene.world.setBlock(drainPos.north(), Blocks.AIR.getDefaultState(), false);
scene.idle(40);
ElementLink<WorldSectionElement> target = scene.world.showIndependentSection(waterTargetS, Direction.UP);
scene.world.moveSection(target, util.vector.of(-1, 0, 0), 0);
scene.idle(5);
scene.world.showSectionAndMerge(waterTarget2S, Direction.UP, target);
scene.overlay.showText(60)
.text("...while spilling into empty spaces can create fluid sources")
.attachKeyFrame()
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.NORTH));
scene.idle(80);
scene.world.hideIndependentSection(target, Direction.DOWN);
scene.idle(5);
scene.world.setBlock(drainPos, Blocks.BEE_NEST.getDefaultState()
.with(BeehiveBlock.HONEY_LEVEL, 5), false);
scene.world.showSection(drain, Direction.DOWN);
scene.world.setBlock(util.grid.at(3, 1, 2), AllBlocks.FLUID_TANK.getDefaultState(), false);
scene.world.propagatePipeChange(pumpPos);
scene.idle(15);
scene.overlay.showText(60)
.text("Pipes can also extract fluids from a handful of other blocks directly")
.attachKeyFrame()
.placeNearTarget()
.pointAt(util.vector.topOf(drainPos));
scene.idle(60);
scene.world.setBlock(drainPos, Blocks.BEE_NEST.getDefaultState()
.with(BeehiveBlock.HONEY_LEVEL, 0), false);
}
public static void encasing(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("encased_fluid_pipe", "Encasing Fluid Pipes");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.showBasePlate();
scene.idle(5);
scene.world.showSection(util.select.layersFrom(1), Direction.DOWN);
scene.world.showSection(util.select.position(2, 0, 5), Direction.UP);
scene.idle(5);
scene.world.showSection(util.select.layer(1), Direction.DOWN);
scene.idle(15);
/*
* Copper Casing can be used to decorate Fluid Pipes
*
* Aside from being conceiled, encased pipes are locked into their connectivity state
*
* Adding and Removing Pipes around it will no longer affect its shape
*/
BlockState copperEncased = AllBlocks.ENCASED_FLUID_PIPE.getDefaultState()
.with(FluidPipeBlock.SOUTH, true)
.with(FluidPipeBlock.WEST, true);
ItemStack casingItem = AllBlocks.COPPER_CASING.asStack();
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 1, 1), Pointing.DOWN).rightClick()
.withItem(casingItem), 60);
scene.idle(7);
scene.world.setBlock(util.grid.at(3, 1, 1), copperEncased, true);
scene.idle(10);
scene.overlay.showText(60)
.placeNearTarget()
.text("Copper Casing can be used to decorate Fluid Pipes")
.attachKeyFrame()
.pointAt(util.vector.topOf(3, 1, 1));
scene.idle(70);
scene.world.destroyBlock(util.grid.at(2, 1, 1));
scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.with(FluidPipeBlock.EAST, false)
.with(FluidPipeBlock.NORTH, true), false);
scene.idle(5);
scene.overlay.showLine(PonderPalette.RED, util.vector.of(1.5, 1.75, 1), util.vector.of(1.5, 1.75, 2), 80);
scene.idle(5);
scene.addKeyframe();
scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(3.5, 2, 1.5), util.vector.of(3.5, 2, 2), 80);
scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(3, 2, 1.5), util.vector.of(3.5, 2, 1.5), 80);
scene.idle(25);
scene.overlay.showText(60)
.placeNearTarget()
.text("Aside from being conceiled, Encased Pipes are locked into their connectivity state")
.pointAt(util.vector.blockSurface(util.grid.at(3, 1, 1), Direction.WEST));
scene.idle(70);
BlockState defaultState = AllBlocks.FLUID_PIPE.getDefaultState();
for (BooleanProperty booleanProperty : FluidPipeBlock.FACING_TO_PROPERTY_MAP.values())
defaultState = defaultState.with(booleanProperty, false);
scene.world.setBlock(util.grid.at(3, 2, 1), defaultState.with(FluidPipeBlock.EAST, true)
.with(FluidPipeBlock.WEST, true), false);
scene.world.setBlock(util.grid.at(1, 2, 1), defaultState.with(FluidPipeBlock.UP, true)
.with(FluidPipeBlock.DOWN, true), false);
scene.world.showSection(util.select.layer(2), Direction.DOWN);
scene.idle(10);
scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.with(FluidPipeBlock.UP, true)
.with(FluidPipeBlock.NORTH, false), false);
scene.idle(20);
scene.overlay.showText(60)
.placeNearTarget()
.colored(PonderPalette.RED)
.text("It will no longer react to any neighbouring blocks being added or removed")
.attachKeyFrame()
.pointAt(util.vector.centerOf(3, 2, 1));
scene.idle(20);
}
public static void valve(SceneBuilder scene, SceneBuildingUtil util) {
@ -83,7 +371,8 @@ public class PipeScenes {
/*
* Valve pipes propagate flows in a straight line
*
* When given Rotational Force in the closing direction, the valve will stop the fluid flow
* When given Rotational Force in the closing direction, the valve will stop the
* fluid flow
*
* It can be re-opened by reversing the input rotation
*/
@ -99,13 +388,17 @@ public class PipeScenes {
/*
* Smart pipes propagate flows in a straight line
*
* When placed directly at the source, they can specify the type of fluid to extract
* When placed directly at the source, they can specify the type of fluid to
* extract
*
* Simply Right-Click their filter slot with any item containing the desired fluid
* Simply Right-Click their filter slot with any item containing the desired
* fluid
*
* When placed further down a pipe network, smart pipes will only let matching fluids continue past
* When placed further down a pipe network, smart pipes will only let matching
* fluids continue past
*
* In this configuration, their filter has no impact on whether a fluid can enter the pipe network
* In this configuration, their filter has no impact on whether a fluid can
* enter the pipe network
*/
}

View file

@ -60,6 +60,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
public static final Compartment<Pair<Integer, Integer>> DOC_WORLD_SECTION = new Compartment<>();
List<TileEntity> renderedTileEntities;
List<TileEntity> tickableTileEntities;
Selection section;
boolean redraw;
@ -256,7 +257,9 @@ public class WorldSectionElement extends AnimatedSceneElement {
loadTEsIfMissing(scene.getWorld());
renderedTileEntities.removeIf(te -> scene.getWorld()
.getTileEntity(te.getPos()) != te);
renderedTileEntities.forEach(te -> {
tickableTileEntities.removeIf(te -> scene.getWorld()
.getTileEntity(te.getPos()) != te);
tickableTileEntities.forEach(te -> {
if (te instanceof ITickableTileEntity)
((ITickableTileEntity) te).tick();
});
@ -264,19 +267,23 @@ public class WorldSectionElement extends AnimatedSceneElement {
@Override
public void whileSkipping(PonderScene scene) {
if (redraw)
if (redraw) {
renderedTileEntities = null;
tickableTileEntities = null;
}
redraw = false;
}
protected void loadTEsIfMissing(PonderWorld world) {
if (renderedTileEntities != null)
return;
tickableTileEntities = new ArrayList<>();
renderedTileEntities = new ArrayList<>();
section.forEach(pos -> {
TileEntity tileEntity = world.getTileEntity(pos);
if (tileEntity == null)
return;
tickableTileEntities.add(tileEntity);
renderedTileEntities.add(tileEntity);
tileEntity.updateContainingBlockInfo();
});
@ -294,8 +301,10 @@ public class WorldSectionElement extends AnimatedSceneElement {
int light = -1;
if (fade != 1)
light = (int) (MathHelper.lerp(fade, 5, 14));
if (redraw)
if (redraw) {
renderedTileEntities = null;
tickableTileEntities = null;
}
transformMS(ms, pt);
world.pushFakeLight(light);
renderTileEntities(world, ms, buffer, pt);
@ -352,7 +361,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
if (selectedBlock == null)
return;
BlockState blockState = world.getBlockState(selectedBlock);
if (blockState.isAir(world, selectedBlock))
if (blockState.isAir())
return;
VoxelShape shape =
blockState.getShape(world, selectedBlock, ISelectionContext.forEntity(Minecraft.getInstance().player));

View file

@ -244,6 +244,9 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour {
fluidLevel.chase(tank.getFluidAmount() / (float) tank.getCapacity(), .25, Chaser.EXP);
if (!getWorld().isRemote)
sendDataLazily();
if (tileEntity.isVirtual() && !tank.getFluid()
.isEmpty())
renderedFluid = tank.getFluid();
}
public FluidStack getRenderedFluid() {

View file

@ -1,5 +1,7 @@
package com.simibubi.create.foundation.utility;
import com.simibubi.create.Create;
import net.minecraft.client.Minecraft;
import net.minecraft.util.text.IFormattableTextComponent;
import net.minecraft.util.text.ITextComponent;
@ -14,23 +16,27 @@ import net.minecraftforge.fml.common.thread.EffectiveSide;
public class Debug {
@Deprecated
public static void debugChat(ITextComponent message) {
public static void debugChat(String message) {
if (Minecraft.getInstance().player != null)
Minecraft.getInstance().player.sendStatusMessage(message, false);
Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message), false);
}
@Deprecated
public static void debugChatAndShowStack(ITextComponent message, int depth) {
public static void debugChatAndShowStack(String message, int depth) {
if (Minecraft.getInstance().player != null)
Minecraft.getInstance().player.sendStatusMessage(message.copy()
.append("@")
Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message).append("@")
.append(debugStack(depth)), false);
}
@Deprecated
public static void debugMessage(ITextComponent message) {
public static void debugMessage(String message) {
if (Minecraft.getInstance().player != null)
Minecraft.getInstance().player.sendStatusMessage(message, true);
Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message), true);
}
@Deprecated
public static void log(String message) {
Create.LOGGER.info(message);
}
@Deprecated

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.