海藻が透過ブロックと隣接できない
K-ebisen opened this issue · 5 comments
透過ブロックと水平方向で隣接する位置に海藻が育たず、既に設置されているあるいは手動で設置した場合にもブロック更新時にアイテム化します。
HaCのセレナイトガラス含む各種ガラスも同様であるため見栄えにおいて大きな制限がかかります。
ピストンは粘着ピストンにして不透過ブロックを挟むことで対策でき、オブザーバーはバニラの時点で元々流体と組み合わせるとクロック化するバグがあり採用できないためHaC単体の実用上においては特に問題ありませんが、
Refined StorageのDestructor等、他MODのブロック破壊機能に頼って自動化する場合には致命的な影響を受けます。
ブロック破壊系についてはまた別の問題もあるのですが、恐らくこれとは独立しているため別スレッドを立てます。
defeatedcrow/HeatAndClimateLib@be3b291 と
0538ab3 で隣接ブロックの条件が少し緩くなりました。(マテリアルがSolidであれば非固形ブロックでもある程度は許容できる)
>「水面」にあたる位置の水と同じ高さで隣接している場合の挙動もバニラの要因でしょうか?
これは仕様です。
描画の不整合をマシにしようと、水面に接している場合のみ水流を消さないようにしています。
ただし、完璧に描画を最適化することはなく、プレイヤーの運用でカバーすることを想定しています。
理由は2つあり、
・mod側が描画処理をした水面はバニラのものとみなされない(影mod等が水面と認識できない)ので作者環境では不自然になってしまうので避けたい
・水面を描画するべきかを正確に捉えようとするとブロックの周囲を常に走査する必要があるが、そこそこPC負荷が上昇してしまう
です。
負荷を軽く実装できる案が思いついたら、今後改善する可能性はあります。
これについてはHaCLibの次回更新で修正を検討します。ただし、修正によって致命的なバグが生まれる可能性があり、その場合は修正を中止します。
実際の修正内容としては、以下のような現象が起きているのを修正します。
- HaC海藻は座標のHumidityがUNDERWATERの場合にしか設置・伸長できません。
- HaCLibでのHumidity判定時、透過ブロックはAIRと判定されるため、隣接座標に透過ブロックが存在するとUNDERWATERの条件を満たせなくなります。
- よって海藻の設置条件を満たせるよう、『Humidity判定時に透過ブロックをAIRと判定する』現行仕様をやめれば、一応は解決します。
この場合、3x3x3の判定エリア内のほとんどを透過ブロックが占めていてもUNDERWATERと判定されるようになり、今より見た目の異常性は悪化します。
正直なところ、修正しないほうがマシじゃないかなと考えています。
補足:海藻他について
海藻のマテリアルはWaterであり、『流体(Fluid)』と偽装しています。
これはBoPのseaweedなども採用している手段ですが、このゲームは(少なくとも1.12.2では)流体ブロックに隣接する非固形面(Solid面)以外のブロックの側面には一様に水流が発生します。
よって海藻を植えても即座に水流に破壊されるか、常に側面に水流が表示されて景観が終わるので、対策としてWater属性にすることで隣接する水ブロックに水流が出来るのを阻止しています。(他にもいくつか理由はありますが)
HaCのセレナイトガラスなど一部のHaCブロックは、景観維持のために『水中で水流を表示しない』機能があります。
この機能は実際には『水流を消す』機能ではなく、隣接ブロックがWaterマテリアルだった場合にHaCブロックとの隣接面の描画を削る機能です。
したがって、Water属性にしたブロックがあった場合は容赦なく描画面が削られますし、場合によっては(所謂スケスケバグやX-Rayのような)描画の欠けによる異常が出てきます。
仮に海藻と隣接して設置できた場合、海藻の描画面が削られて消えます。また、ガラス側から海藻を見た場合に正常に水ブロックが描画されなくなります。
どのみち景観上に問題が生じるのは変わりがないです。
1.13+であればバニラ機能にブロックの水没時の描画挙動が実装されているようなので、今よりは取れる対策が増えているかもしれません。(悪化している気配もありますが)
現状では透過ブロックを水中に設置する場合にはいろいろな制約がありますので、このような実装になっています。
- プレイヤーのUNDERWATER判定について
プレイヤーへの判定はプレイヤーの胸辺りの座標を参照しています。なので、若干高い位置に判定座標があり、地上からズレています。
次回更新で、透過ブロックが3x3x3エリア内に1~2個であれば、許容しても大丈夫かな~と思うので試験的に仕様を変えてみる予定です。
補足解説 水ブロックの描画について
これは仕様です。隣接ブロックがWaterマテリアルだった場合にHaCブロックとの隣接面の描画を削るという機能は、まさにコレを起こします。これは海藻の有無は無関係で、この機能を持った透過ブロックを通して水中を地上(気中)から観測するとこうなります。
これはバニラの仕様が関わっています。このゲームはPCへの負担を減らすために、描画に関してはかなり省エネ仕様になっており、プレイヤーからギリギリ見えないところまで描画を減らしています。
なので、このように水が消滅したように見えてしまいます。
(作者はこれを逆手にとって、完全透明な水槽の中にJustAFewFishの魚を泳がせたりしていますが…)
以下図説
プレイヤーが想像する水中描画ってこんな感じで、水ブロックが色を持っているような想像なんじゃないでしょうか?
- 上図のように、実際のマイクラの水は、表面のテクスチャの薄い膜の内側はすべて透明になっています。また、透過ブロックに接していない部分のテクスチャも省略されています。
- プレイヤーが水中にいるときは水が描画されるのではなく、プレイヤーのHUDに水中っぽいエフェクト&青黒色のFogがかかることで水の濁りが表現されています。
HaCの建材系透過ブロックは、透過ブロックの側面にあるはずだったテクスチャを削ってしまうので、水の内部の透明空間がそのまま見えてしまいます。
>プレイヤーへの判定はプレイヤーの胸辺りの座標を参照しています。なので、若干高い位置に判定座標があり、地上からズレています。
いえ、全面をガラスに囲まれた2マスの空間を水で満たし、そこにプレイヤーが入るとUNDERWATERになることです。
よく考えたらガラスどころか空気であってもプレイヤー自身さえ水没していればUNDERWATER表示ですし、
湿度WETの際に水バケツを持っているだけでもUNDERWATERなのだから違って当然でした。
>隣接ブロックがWaterマテリアルだった場合にHaCブロックとの隣接面の描画を削る
「水面」にあたる位置の水と同じ高さで隣接している場合の挙動もバニラの要因でしょうか?
隣接したHaCブロックの真上が空気であるか否かで描画の有無が変化するようですが…