Skip to content

Commit 6608b7c

Browse files
committed
fix: fix BlockAPI(WIP)
1 parent 479f843 commit 6608b7c

File tree

1 file changed

+40
-26
lines changed

1 file changed

+40
-26
lines changed

src/legacy/api/BlockAPI.cpp

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@
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

105110
Local<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

124129
Local<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() {
185190
Local<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

193198
Local<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

200205
Local<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

207212
Local<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

221226
Local<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

249254
Local<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

256261
Local<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

263268
Local<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

270275
Local<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

277282
Local<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

291296
Local<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

298303
Local<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

320329
Local<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) {
349359
Local<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

387399
Local<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

Comments
 (0)