1919#include " mc/world/level/block/block_serialization_utils/BlockSerializationUtils.h"
2020#include " mc/world/level/block/components/BlockLiquidDetectionComponent.h"
2121#include " mc/world/level/dimension/Dimension.h"
22+ #include " mc/world/level/block/BedrockBlockNames.h"
2223
2324#include < exception>
2425
@@ -67,54 +68,64 @@ ClassDefine<BlockClass> BlockClassBuilder =
6768
6869// ////////////////// Classes ////////////////////
6970
70- BlockClass::BlockClass (Block const * p)
71- : ScriptClass(ScriptClass::ConstructFromCpp<BlockClass>{}),
72- block(const_cast <Block*>(p)) {
73- preloadData ({0 , 0 , 0 }, -1 );
71+ BlockClass::BlockClass (Block const & block) : ScriptClass(ScriptClass::ConstructFromCpp<BlockClass>{}), block(&block) {
72+ preloadData (BlockPos::ZERO (), -1 );
7473}
7574
76- BlockClass::BlockClass (Block const * p , BlockPos bp, int dim)
75+ BlockClass::BlockClass (Block const & block , BlockPos const & pos, DimensionType dim)
7776: ScriptClass(ScriptClass::ConstructFromCpp<BlockClass>{}),
78- block(const_cast <Block*>(p) ) {
79- preloadData (bp , dim);
77+ block(&block ) {
78+ preloadData (pos , dim);
8079}
8180
8281// generating function
83- Local<Object> BlockClass::newBlock (Block const * p , BlockPos const * pos, int dim) {
84- auto newp = new BlockClass (p, * pos, dim);
82+ Local<Object> BlockClass::newBlock (Block const & block , BlockPos const & pos, DimensionType dim) {
83+ auto newp = new BlockClass (block, pos, dim);
8584 return newp->getScriptObject ();
8685}
8786
88- Local<Object> BlockClass::newBlock (BlockPos const * pos, int dim) {
89- auto & bl = ll::service::getLevel ()->getDimension (dim)->getBlockSourceFromMainChunkSource ().getBlock (*pos);
90- return BlockClass::newBlock (&bl, pos, dim);
87+ Local<Object> BlockClass::newBlock (const BlockPos& pos, DimensionType dim) {
88+ if (pos.y < 320 && pos.y >= -64 ) {
89+ auto & bl = ll::service::getLevel ()->getDimension (dim)->getBlockSourceFromMainChunkSource ().getBlock (pos);
90+ return BlockClass::newBlock (bl, pos, dim);
91+ }
92+ auto block = Block::tryGetFromRegistry (BedrockBlockNames::Air ());
93+ if (!block) {
94+ return Object::newObject ();
95+ }
96+ return BlockClass::newBlock (block, pos, dim);
9197}
9298
93- Local<Object> BlockClass::newBlock (const BlockPos& pos, int dim) { return newBlock (&pos, dim); }
94-
95- Local<Object> BlockClass::newBlock (Block const * p, BlockPos const * pos, BlockSource const * bs) {
96- auto newp = new BlockClass (p, *pos, bs->getDimensionId ());
99+ Local<Object> BlockClass::newBlock (Block const & block, BlockPos const & pos, BlockSource const & bs) {
100+ auto newp = new BlockClass (block, pos, bs.getDimensionId ());
97101 return newp->getScriptObject ();
98102}
99103
100104Local<Object> BlockClass::newBlock (IntVec4 pos) {
101105 BlockPos bp = {(float )pos.x , (float )pos.y , (float )pos.z };
102- auto & bl = ll::service::getLevel ()->getDimension (pos.dim )->getBlockSourceFromMainChunkSource ().getBlock (bp);
103- return BlockClass::newBlock (&bl, &bp, pos.dim );
106+ if (bp.y < 320 && bp.y >= -64 ) {
107+ auto & bl = ll::service::getLevel ()->getDimension (pos.dim )->getBlockSourceFromMainChunkSource ().getBlock (bp);
108+ return BlockClass::newBlock (bl, bp, pos.dim );
109+ }
110+ auto block = Block::tryGetFromRegistry (BedrockBlockNames::Air ());
111+ if (!block) {
112+ return Object::newObject ();
113+ }
114+ return BlockClass::newBlock (block, bp, pos.dim );
104115}
105116
106- Block* BlockClass::extract (Local<Value> v) {
117+ Block const * BlockClass::extract (Local<Value> v) {
107118 if (EngineScope::currentEngine ()->isInstanceOf <BlockClass>(v))
108119 return EngineScope::currentEngine ()->getNativeInstance <BlockClass>(v)->get ();
109120 else return nullptr ;
110121}
111122
112123// member function
113- void BlockClass::preloadData (BlockPos bp, int dim) {
114- name = block->buildDescriptionName ();
115- type = block->getTypeName ();
116- id = block->getBlockItemId ();
117- pos = {bp .x , bp .y , bp .z , dim};
124+ void BlockClass::preloadData (BlockPos pos, DimensionType dim) {
125+ name = block->buildDescriptionName ();
126+ type = block->getTypeName ();
127+ id = block->getBlockItemId ();
128+ blockPos = {pos .x , pos .y , pos .z , dim};
118129}
119130
120131Local<Value> BlockClass::getName () {
@@ -144,7 +155,7 @@ Local<Value> BlockClass::getId() {
144155Local<Value> BlockClass::getPos () {
145156 try {
146157 // preloaded
147- return IntPos::newPos (pos );
158+ return IntPos::newPos (blockPos );
148159 }
149160 CATCH (" Fail in getBlockPos!" );
150161}
@@ -276,9 +287,9 @@ Local<Value> BlockClass::destroyBlock(const Arguments& args) {
276287 try {
277288 // same as `Level::getBlockInstance(pos.getBlockPos(),
278289 // pos.dim).breakNaturally()` when drop
279- BlockSource& bl = ll::service::getLevel ()->getDimension (pos .dim )->getBlockSourceFromMainChunkSource ();
290+ BlockSource& bl = ll::service::getLevel ()->getDimension (blockPos .dim )->getBlockSourceFromMainChunkSource ();
280291 return Boolean::newBoolean (
281- ll::service::getLevel ()->destroyBlock (bl, pos .getBlockPos (), args[0 ].asBoolean ().value ())
292+ ll::service::getLevel ()->destroyBlock (bl, blockPos .getBlockPos (), args[0 ].asBoolean ().value ())
282293 );
283294 }
284295 CATCH (" Fail in destroyBlock!" );
@@ -303,11 +314,11 @@ Local<Value> BlockClass::setNbt(const Arguments& args) {
303314 const Block* bl = result.second ;
304315 if (bl) {
305316 ll::service::getLevel ()
306- ->getDimension (pos .dim )
317+ ->getDimension (blockPos .dim )
307318 ->getBlockSourceFromMainChunkSource ()
308- .setBlock (pos .getBlockPos (), *bl, 3 , nullptr , nullptr );
319+ .setBlock (blockPos .getBlockPos (), *bl, 3 , nullptr , nullptr );
309320 }
310- preloadData (pos .getBlockPos (), pos .getDimensionId ());
321+ preloadData (blockPos .getBlockPos (), blockPos .getDimensionId ());
311322 return Boolean::newBoolean (true );
312323 }
313324 CATCH (" Fail in setNbt!" )
@@ -330,9 +341,10 @@ Local<Value> BlockClass::getBlockState(const Arguments&) {
330341
331342Local<Value> BlockClass::hasContainer (const Arguments&) {
332343 try {
333- auto & bl = ll::service::getLevel ()->getDimension (pos.dim )->getBlockSourceFromMainChunkSource ().getBlock (
334- pos.getBlockPos ()
335- );
344+ auto & bl = ll::service::getLevel ()
345+ ->getDimension (blockPos.dim )
346+ ->getBlockSourceFromMainChunkSource ()
347+ .getBlock (blockPos.getBlockPos ());
336348 return Boolean::newBoolean (bl.isContainerBlock ());
337349 }
338350 CATCH (" Fail in hasContainer!" );
@@ -341,9 +353,9 @@ Local<Value> BlockClass::hasContainer(const Arguments&) {
341353Local<Value> BlockClass::getContainer (const Arguments&) {
342354 try {
343355 Container* container = ll::service::getLevel ()
344- ->getDimension (pos .dim )
356+ ->getDimension (blockPos .dim )
345357 ->getBlockSourceFromMainChunkSource ()
346- .getBlockEntity (pos .getBlockPos ())
358+ .getBlockEntity (blockPos .getBlockPos ())
347359 ->getContainer ();
348360 return container ? ContainerClass::newContainer (container) : Local<Value>();
349361 }
@@ -359,20 +371,21 @@ Local<Value> BlockClass::hasBlockEntity(const Arguments&) {
359371
360372Local<Value> BlockClass::getBlockEntity (const Arguments&) {
361373 try {
362- BlockActor* be =
363- ll::service::getLevel () ->getDimension (pos .dim )-> getBlockSourceFromMainChunkSource (). getBlockEntity (
364- pos. getBlockPos ()
365- );
366- return be ? BlockEntityClass::newBlockEntity (be, pos .dim ) : Local<Value>();
374+ BlockActor* be = ll::service::getLevel ()
375+ ->getDimension (blockPos .dim )
376+ -> getBlockSourceFromMainChunkSource ()
377+ . getBlockEntity (blockPos. getBlockPos () );
378+ return be ? BlockEntityClass::newBlockEntity (be, blockPos .dim ) : Local<Value>();
367379 }
368380 CATCH (" Fail in getBlockEntity!" );
369381}
370382
371383Local<Value> BlockClass::removeBlockEntity (const Arguments&) {
372384 try {
373- ll::service::getLevel ()->getDimension (pos.dim )->getBlockSourceFromMainChunkSource ().removeBlockEntity (
374- pos.getBlockPos ()
375- ); // ==========???
385+ ll::service::getLevel ()
386+ ->getDimension (blockPos.dim )
387+ ->getBlockSourceFromMainChunkSource ()
388+ .removeBlockEntity (blockPos.getBlockPos ());
376389 return Boolean::newBoolean (true );
377390 }
378391 CATCH (" Fail in removeBlockEntity!" );
@@ -433,13 +446,9 @@ Local<Value> McClass::getBlock(const Arguments& args) {
433446 short minHeight = dimPtr->getMinHeight ();
434447 if (pos.y < minHeight || pos.y > dimPtr->getHeight ()) return {};
435448 ChunkBlockPos cbpos = ChunkBlockPos (pos.getBlockPos (), minHeight);
436- auto block = &const_cast <Block&>(lc->getBlock (cbpos));
437- if (!block) {
438- // LOG_WRONG_ARG_TYPE(__FUNCTION__);
439- return {};
440- }
441- BlockPos bp{pos.x , pos.y , pos.z };
442- return BlockClass::newBlock (block, &bp, pos.dim );
449+ auto & block = lc->getBlock (cbpos);
450+ BlockPos bp{pos.x , pos.y , pos.z };
451+ return BlockClass::newBlock (block, bp, pos.dim );
443452 }
444453 CATCH (" Fail in GetBlock!" )
445454}
@@ -518,7 +527,7 @@ Local<Value> McClass::setBlock(const Arguments& args) {
518527 return Boolean::newBoolean (bs.setBlock (pos.getBlockPos (), bl, 3 , nullptr , nullptr ));
519528 } else {
520529 // other block object
521- Block* bl = BlockClass::extract (block);
530+ Block const * bl = BlockClass::extract (block);
522531 if (!bl) {
523532 LOG_WRONG_ARG_TYPE (__FUNCTION__);
524533 return Local<Value>();
0 commit comments