Skip to content

Commit 2f6e4a4

Browse files
committed
fix: fix Player::getBlockFromViewVector #214
feat(tests): add PlayerTests
1 parent 63fc467 commit 2f6e4a4

File tree

5 files changed

+68
-30
lines changed

5 files changed

+68
-30
lines changed

src/legacy/api/EntityAPI.cpp

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,7 +1362,7 @@ Local<Value> EntityClass::getEntityFromViewVector(const Arguments& args) {
13621362
}
13631363
HitResult result = actor->traceRay(maxDistance, true, false);
13641364
Actor* entity = result.getEntity();
1365-
if (entity) {
1365+
if (result.mType != HitResultType::NoHit && entity) {
13661366
return EntityClass::newEntity(entity);
13671367
}
13681368
return Local<Value>();
@@ -1411,15 +1411,17 @@ Local<Value> EntityClass::getBlockFromViewVector(const Arguments& args) {
14111411
return true;
14121412
}
14131413
);
1414-
1414+
if (res.mType == HitResultType::NoHit) {
1415+
return Local<Value>();
1416+
}
14151417
BlockPos bp;
14161418
if (includeLiquid && res.mIsHitLiquid) {
14171419
bp = res.mLiquidPos;
14181420
} else {
14191421
bp = res.mBlock;
14201422
}
14211423
Block const& bl = actor->getDimensionBlockSource().getBlock(bp);
1422-
if (bl.isEmpty()) {
1424+
if (bl.isAir() || bl.isEmpty()) {
14231425
return Local<Value>();
14241426
}
14251427
return BlockClass::newBlock(bl, bp, actor->getDimensionId());
@@ -1804,16 +1806,18 @@ Local<Value> McClass::explode(const Arguments& args) {
18041806
bool isDestroy = args[beginIndex + 2].asBoolean().value();
18051807
bool isFire = args[beginIndex + 3].asBoolean().value();
18061808

1807-
return Boolean::newBoolean(ll::service::getLevel()->explode(
1808-
ll::service::getLevel()->getDimension(pos.dim)->getBlockSourceFromMainChunkSource(),
1809-
source.value_or(nullptr),
1810-
pos.getVec3(),
1811-
radius,
1812-
isFire,
1813-
isDestroy,
1814-
FLT_MAX,
1815-
false
1816-
));
1809+
return Boolean::newBoolean(
1810+
ll::service::getLevel()->explode(
1811+
ll::service::getLevel()->getDimension(pos.dim)->getBlockSourceFromMainChunkSource(),
1812+
source.value_or(nullptr),
1813+
pos.getVec3(),
1814+
radius,
1815+
isFire,
1816+
isDestroy,
1817+
FLT_MAX,
1818+
false
1819+
)
1820+
);
18171821
} else {
18181822
CHECK_ARG_TYPE(args[beginIndex + 1], ValueKind::kNumber);
18191823
CHECK_ARG_TYPE(args[beginIndex + 2], ValueKind::kNumber);
@@ -1825,16 +1829,18 @@ Local<Value> McClass::explode(const Arguments& args) {
18251829
bool isDestroy = args[beginIndex + 3].asBoolean().value();
18261830
bool isFire = args[beginIndex + 4].asBoolean().value();
18271831

1828-
return Boolean::newBoolean(ll::service::getLevel()->explode(
1829-
ll::service::getLevel()->getDimension(pos.dim)->getBlockSourceFromMainChunkSource(),
1830-
source.value_or(nullptr),
1831-
pos.getVec3(),
1832-
radius,
1833-
isFire,
1834-
isDestroy,
1835-
maxResistance,
1836-
false
1837-
));
1832+
return Boolean::newBoolean(
1833+
ll::service::getLevel()->explode(
1834+
ll::service::getLevel()->getDimension(pos.dim)->getBlockSourceFromMainChunkSource(),
1835+
source.value_or(nullptr),
1836+
pos.getVec3(),
1837+
radius,
1838+
isFire,
1839+
isDestroy,
1840+
maxResistance,
1841+
false
1842+
)
1843+
);
18381844
}
18391845
}
18401846
CATCH("Fail in Explode!");

src/legacy/api/PlayerAPI.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3120,7 +3120,7 @@ Local<Value> PlayerClass::getEntityFromViewVector(const Arguments& args) {
31203120
}
31213121
HitResult result = player->traceRay(maxDistance, true, false);
31223122
Actor* entity = result.getEntity();
3123-
if (entity) {
3123+
if (result.mType != HitResultType::NoHit && entity) {
31243124
return EntityClass::newEntity(entity);
31253125
}
31263126
return Local<Value>();
@@ -3169,15 +3169,17 @@ Local<Value> PlayerClass::getBlockFromViewVector(const Arguments& args) {
31693169
return true;
31703170
}
31713171
);
3172-
3172+
if (res.mType == HitResultType::NoHit) {
3173+
return Local<Value>();
3174+
}
31733175
BlockPos bp;
31743176
if (includeLiquid && res.mIsHitLiquid) {
31753177
bp = res.mLiquidPos;
31763178
} else {
31773179
bp = res.mBlock;
31783180
}
31793181
Block const& bl = player->getDimensionBlockSource().getBlock(bp);
3180-
if (bl.isEmpty()) {
3182+
if (bl.isAir() || bl.isEmpty()) {
31813183
return Local<Value>();
31823184
}
31833185
return BlockClass::newBlock(bl, bp, player->getDimensionBlockSource());

src/tests/LSETests/PlayerTests.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
export function TestPlayer(players) {
2+
for (let player of players) {
3+
GetFromViewVector(player)
4+
}
5+
}
6+
7+
function GetFromViewVector(player) {
8+
let en = player.getEntityFromViewVector(5.25)
9+
if (en) {
10+
logger.info(`Entity: ${en.name}`)
11+
let bl = player.getBlockFromViewVector(true, false, player.distanceTo(en), false)
12+
if (bl) {
13+
logger.info(`Block: ${bl.name} ${bl.pos}`)
14+
} else {
15+
logger.info(`No block found`)
16+
}
17+
} else {
18+
logger.info(`No entity found`)
19+
let bl = player.getBlockFromViewVector(true, false, 5.25, false)
20+
if (bl) {
21+
logger.info(`Block: ${bl.name} ${bl.pos}`)
22+
} else {
23+
logger.info(`No block found`)
24+
}
25+
}
26+
}

src/tests/LSETests/ScriptTests.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export function loggerTest(players) {
1+
export function TestLogger(players) {
22
for (let player of players) {
33
logger.setPlayer(player)
44
}

src/tests/LSETests/main.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
import {RegisterEvents, events, triggeredEvents} from './plugins/LSETests/EventTests.js';
2-
import {loggerTest} from './plugins/LSETests/ScriptTests.js';
2+
import {TestLogger} from './plugins/LSETests/ScriptTests.js';
3+
import {TestPlayer} from './plugins/LSETests/PlayerTests.js';
34

45
RegisterEvents();
56

67
mc.listen('onServerStarted', () => {
78
let cmd = mc.newCommand('lsetests', "LegacyScriptEngine tests", PermType.Console);
8-
cmd.setEnum('testOption', ['logger', 'events']);
9+
cmd.setEnum('testOption', ['logger', 'events', 'player']);
910
cmd.mandatory('testOption', ParamType.Enum, 'testOption');
1011
cmd.optional('player', ParamType.Player);
1112
cmd.overload('testOption', 'player');
1213
cmd.setCallback((cmd, origin, output, results) => {
1314
switch (results.testOption) {
1415
case 'logger':
15-
loggerTest(results.player);
16+
TestLogger(results.player);
1617
break;
1718
case 'events':
1819
const
1920
notTriggeredEvents = events.filter(event => !triggeredEvents.has(event));
2021
logger.info(`Events not triggered: ${notTriggeredEvents.join(', ')}`);
2122
break;
23+
case 'player':
24+
TestPlayer(results.player);
25+
break;
2226
default:
2327
logger.error(`Invalid test option ${results.testOption}`);
2428
break;

0 commit comments

Comments
 (0)