1515#include " mc/world/level/ChunkBlockPos.h"
1616#include " mc/world/level/block/BedrockBlockNames.h"
1717#include " mc/world/level/block/Block.h"
18+ #include " mc/world/level/block/DetectionRule.h"
19+ #include " mc/world/level/block/LiquidReaction.h"
1820#include " mc/world/level/block/actor/BlockActor.h"
1921#include " mc/world/level/block/block_serialization_utils/BlockSerializationUtils.h"
22+ #include " mc/world/level/block/components/BlockComponentDirectData.h"
2023#include " mc/world/level/block/components/BlockLiquidDetectionComponent.h"
2124#include " mc/world/level/chunk/LevelChunk.h"
2225#include " mc/world/level/dimension/Dimension.h"
26+ #include " mc/world/level/dimension/DimensionHeightRange.h"
2327
2428#include < exception>
2529
@@ -66,23 +70,24 @@ ClassDefine<BlockClass> BlockClassBuilder =
6670 .instanceFunction(" getTag" , &BlockClass::getNbt)
6771 .build();
6872
69- namespace lse ::BlockAPI {
70- inline bool isValidHeight (WeakRef<Dimension> dim, std::variant<int , float > height) {
73+ namespace lse ::api::BlockHelper {
74+ inline bool isValidHeight (WeakRef<Dimension> dimension, std::variant<int , float > height) {
75+ auto dim = dimension.lock ();
7176 if (dim) {
7277 if (std::holds_alternative<int >(height)) {
7378 int y = std::get<int >(height);
74- return dim->getMinHeight () <= y && dim->getHeight () >= y;
79+ return dim->mHeightRange -> mMin <= y && dim->mHeightRange -> mMax >= y;
7580 } else {
7681 float y = std::get<float >(height);
77- return dim->getMinHeight () <= y && dim->getHeight () >= y;
82+ return dim->mHeightRange -> mMin <= y && dim->mHeightRange -> mMax >= y;
7883 }
7984 }
8085
8186 return false ;
8287}
83- } // namespace lse::BlockAPI
88+ } // namespace lse::api::BlockHelper
8489
85- using lse::BlockAPI ::isValidHeight;
90+ using lse::api::BlockHelper ::isValidHeight;
8691
8792// ////////////////// Classes ////////////////////
8893
@@ -103,7 +108,7 @@ Local<Object> BlockClass::newBlock(Block const& block, BlockPos const& pos, Dime
103108}
104109
105110Local<Object> BlockClass::newBlock (BlockPos const & pos, DimensionType dim) {
106- if (auto dimension = ll::service::getLevel ()->getDimension (dim)) {
111+ if (auto dimension = ll::service::getLevel ()->getDimension (dim). lock () ) {
107112 if (isValidHeight (dimension, pos.y )) {
108113 auto & bl = dimension->getBlockSourceFromMainChunkSource ().getBlock (pos);
109114 return BlockClass::newBlock (bl, pos, dim);
@@ -123,7 +128,7 @@ Local<Object> BlockClass::newBlock(Block const& block, BlockPos const& pos, Bloc
123128
124129Local<Object> BlockClass::newBlock (IntVec4 pos) {
125130 BlockPos bp = {(float )pos.x , (float )pos.y , (float )pos.z };
126- if (auto dimension = ll::service::getLevel ()->getDimension (pos.dim )) {
131+ if (auto dimension = ll::service::getLevel ()->getDimension (pos.dim ). lock () ) {
127132 if (isValidHeight (dimension, pos.y )) {
128133 auto & bl = dimension->getBlockSourceFromMainChunkSource ().getBlock (bp);
129134 return BlockClass::newBlock (bl, bp, pos.dim );
@@ -185,28 +190,28 @@ Local<Value> BlockClass::getPos() {
185190Local<Value> BlockClass::getTileData () {
186191 try {
187192 // preloaded
188- return Number::newNumber (block->getVariant ());
193+ return Number::newNumber (block->getLegacyBlock (). getVariant (*block ));
189194 }
190195 CATCH (" Fail in getTileData!" );
191196}
192197
193198Local<Value> BlockClass::getVariant () {
194199 try {
195- return Number::newNumber (block->getVariant ());
200+ return Number::newNumber (block->getLegacyBlock (). getVariant (*block ));
196201 }
197202 CATCH (" Fail in getVariant!" );
198203}
199204
200205Local<Value> BlockClass::getTranslucency () {
201206 try {
202- return Number::newNumber (block->getTranslucency () );
207+ return Number::newNumber (block->getLegacyBlock (). mTranslucency );
203208 }
204209 CATCH (" Fail in getTranslucency!" );
205210}
206211
207212Local<Value> BlockClass::getThickness () {
208213 try {
209- return Number::newNumber (block->getThickness () );
214+ return Number::newNumber (block->getLegacyBlock (). mThickness );
210215 }
211216 CATCH (" Fail in getThickness!" );
212217}
@@ -220,7 +225,7 @@ Local<Value> BlockClass::isAir() {
220225
221226Local<Value> BlockClass::isBounceBlock () {
222227 try {
223- return Boolean::newBoolean (block->isBounceBlock ());
228+ return Boolean::newBoolean (block->getLegacyBlock (). isBounceBlock ());
224229 }
225230 CATCH (" Fail in isBounceBlock!" );
226231}
@@ -248,35 +253,35 @@ Local<Value> BlockClass::isDoorBlock() {
248253
249254Local<Value> BlockClass::isFenceBlock () {
250255 try {
251- return Boolean::newBoolean (block->isFenceBlock ());
256+ return Boolean::newBoolean (block->getLegacyBlock (). isFenceBlock ());
252257 }
253258 CATCH (" Fail in isFenceBlock!" );
254259}
255260
256261Local<Value> BlockClass::isFenceGateBlock () {
257262 try {
258- return Boolean::newBoolean (block->isFenceGateBlock ());
263+ return Boolean::newBoolean (block->getLegacyBlock (). isFenceGateBlock ());
259264 }
260265 CATCH (" Fail in isFenceGateBlock!" );
261266}
262267
263268Local<Value> BlockClass::isThinFenceBlock () {
264269 try {
265- return Boolean::newBoolean (block->isThinFenceBlock ());
270+ return Boolean::newBoolean (block->getLegacyBlock (). isThinFenceBlock ());
266271 }
267272 CATCH (" Fail in isThinFenceBlock!" );
268273}
269274
270275Local<Value> BlockClass::isHeavyBlock () {
271276 try {
272- return Boolean::newBoolean (block->isFallingBlock () );
277+ return Boolean::newBoolean (block->getLegacyBlock (). mFalling );
273278 }
274279 CATCH (" Fail in isHeavyBlock!" );
275280}
276281
277282Local<Value> BlockClass::isStemBlock () {
278283 try {
279- return Boolean::newBoolean (block->isStemBlock ());
284+ return Boolean::newBoolean (block->getLegacyBlock (). isStemBlock ());
280285 }
281286 CATCH (" Fail in isStemBlock!" );
282287}
@@ -290,14 +295,17 @@ Local<Value> BlockClass::isSlabBlock() {
290295
291296Local<Value> BlockClass::isUnbreakable () {
292297 try {
293- return Boolean::newBoolean (block->isUnbreakable () );
298+ return Boolean::newBoolean (block->mDirectData -> mUnkc08fbd . as < float >() < 0 . 0f );
294299 }
295300 CATCH (" Fail in isUnbreakable!" );
296301}
297302
298303Local<Value> BlockClass::isWaterBlockingBlock () {
299304 try {
300- return Boolean::newBoolean (BlockLiquidDetectionComponent::isLiquidBlocking (*block));
305+ return Boolean::newBoolean (
306+ block->mDirectData ->mUnkd3e7c9 .as <DetectionRule>().mUnk21e36d .as <LiquidReaction>()
307+ == LiquidReaction::Blocking
308+ );
301309 }
302310 CATCH (" Fail in isWaterBlockingBlock!" );
303311}
@@ -309,7 +317,8 @@ Local<Value> BlockClass::destroyBlock(const Arguments& args) {
309317 try {
310318 // same as `Level::getBlockInstance(pos.getBlockPos(),
311319 // pos.dim).breakNaturally()` when drop
312- BlockSource& bl = ll::service::getLevel ()->getDimension (blockPos.dim )->getBlockSourceFromMainChunkSource ();
320+ BlockSource& bl =
321+ ll::service::getLevel ()->getDimension (blockPos.dim ).lock ()->getBlockSourceFromMainChunkSource ();
313322 return Boolean::newBoolean (
314323 ll::service::getLevel ()->destroyBlock (bl, blockPos.getBlockPos (), args[0 ].asBoolean ().value ())
315324 );
@@ -319,7 +328,7 @@ Local<Value> BlockClass::destroyBlock(const Arguments& args) {
319328
320329Local<Value> BlockClass::getNbt (const Arguments&) {
321330 try {
322- return NbtCompoundClass::pack (block->getSerializationId (). clone ());
331+ return NbtCompoundClass::pack (block->mSerializationId -> clone ());
323332 }
324333 CATCH (" Fail in getNbt!" );
325334}
@@ -337,6 +346,7 @@ Local<Value> BlockClass::setNbt(const Arguments& args) {
337346 if (bl) {
338347 ll::service::getLevel ()
339348 ->getDimension (blockPos.dim )
349+ .lock ()
340350 ->getBlockSourceFromMainChunkSource ()
341351 .setBlock (blockPos.getBlockPos (), *bl, 3 , nullptr , nullptr );
342352 }
@@ -349,9 +359,9 @@ Local<Value> BlockClass::setNbt(const Arguments& args) {
349359Local<Value> BlockClass::getBlockState (const Arguments&) {
350360 return Local<Value>();
351361 try {
352- auto list = block->getSerializationId () ;
362+ auto list = block->mSerializationId ;
353363 try {
354- return Tag2Value (&list. at (" states" ).get (), true );
364+ return Tag2Value (&list-> at (" states" ).get (), true );
355365 } catch (...) {
356366 return Array::newArray ();
357367 }
@@ -365,9 +375,10 @@ Local<Value> BlockClass::hasContainer(const Arguments&) {
365375 try {
366376 auto & bl = ll::service::getLevel ()
367377 ->getDimension (blockPos.dim )
378+ .lock ()
368379 ->getBlockSourceFromMainChunkSource ()
369380 .getBlock (blockPos.getBlockPos ());
370- return Boolean::newBoolean (bl.isContainerBlock ());
381+ return Boolean::newBoolean (bl.getLegacyBlock (). isContainerBlock ());
371382 }
372383 CATCH (" Fail in hasContainer!" );
373384}
@@ -376,6 +387,7 @@ Local<Value> BlockClass::getContainer(const Arguments&) {
376387 try {
377388 Container* container = ll::service::getLevel ()
378389 ->getDimension (blockPos.dim )
390+ .lock ()
379391 ->getBlockSourceFromMainChunkSource ()
380392 .getBlockEntity (blockPos.getBlockPos ())
381393 ->getContainer ();
@@ -386,7 +398,7 @@ Local<Value> BlockClass::getContainer(const Arguments&) {
386398
387399Local<Value> BlockClass::hasBlockEntity (const Arguments&) {
388400 try {
389- return Boolean::newBoolean (block->hasBlockEntity () );
401+ return Boolean::newBoolean (block->getLegacyBlock (). mBlockEntityType != BlockActorType::Undefined );
390402 }
391403 CATCH (" Fail in hasBlockEntity!" );
392404}
@@ -395,6 +407,7 @@ Local<Value> BlockClass::getBlockEntity(const Arguments&) {
395407 try {
396408 BlockActor* be = ll::service::getLevel ()
397409 ->getDimension (blockPos.dim )
410+ .lock ()
398411 ->getBlockSourceFromMainChunkSource ()
399412 .getBlockEntity (blockPos.getBlockPos ());
400413 return be ? BlockEntityClass::newBlockEntity (be, blockPos.dim ) : Local<Value>();
@@ -406,6 +419,7 @@ Local<Value> BlockClass::removeBlockEntity(const Arguments&) {
406419 try {
407420 ll::service::getLevel ()
408421 ->getDimension (blockPos.dim )
422+ .lock ()
409423 ->getBlockSourceFromMainChunkSource ()
410424 .removeBlockEntity (blockPos.getBlockPos ());
411425 return Boolean::newBoolean (true );
0 commit comments