Skip to content

Commit b6b80f5

Browse files
committedMay 6, 2020
Expose collided objects in moveresult
closes #9787
1 parent cb159f8 commit b6b80f5

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed
 

Diff for: ‎doc/lua_api.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6632,6 +6632,7 @@ Collision info passed to `on_step`:
66326632
type = string, -- "node" or "object",
66336633
axis = string, -- "x", "y" or "z"
66346634
node_pos = vector, -- if type is "node"
6635+
object = ObjectRef, -- if type is "object"
66356636
old_velocity = vector,
66366637
new_velocity = vector,
66376638
},

Diff for: ‎src/collision.cpp

+26-14
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,30 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3737
#endif
3838

3939
struct NearbyCollisionInfo {
40-
NearbyCollisionInfo(bool is_ul, bool is_obj, int bouncy,
41-
const v3s16 &pos, const aabb3f &box) :
40+
// node
41+
NearbyCollisionInfo(bool is_ul, int bouncy, const v3s16 &pos,
42+
const aabb3f &box) :
4243
is_unloaded(is_ul),
43-
is_object(is_obj),
44+
obj(nullptr),
4445
bouncy(bouncy),
4546
position(pos),
4647
box(box)
4748
{}
4849

50+
// object
51+
NearbyCollisionInfo(ActiveObject *obj, int bouncy,
52+
const aabb3f &box) :
53+
is_unloaded(false),
54+
obj(obj),
55+
bouncy(bouncy),
56+
box(box)
57+
{}
58+
59+
inline bool isObject() const { return obj != nullptr; }
60+
4961
bool is_unloaded;
5062
bool is_step_up = false;
51-
bool is_object;
63+
ActiveObject *obj;
5264
int bouncy;
5365
v3s16 position;
5466
aabb3f box;
@@ -312,13 +324,13 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
312324
for (auto box : nodeboxes) {
313325
box.MinEdge += posf;
314326
box.MaxEdge += posf;
315-
cinfo.emplace_back(false, false, n_bouncy_value, p, box);
327+
cinfo.emplace_back(false, n_bouncy_value, p, box);
316328
}
317329
} else {
318330
// Collide with unloaded nodes (position invalid) and loaded
319331
// CONTENT_IGNORE nodes (position valid)
320332
aabb3f box = getNodeBox(p, BS);
321-
cinfo.emplace_back(true, false, 0, p, box);
333+
cinfo.emplace_back(true, 0, p, box);
322334
}
323335
}
324336

@@ -383,12 +395,10 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
383395
iter != objects.end(); ++iter) {
384396
ActiveObject *object = *iter;
385397

386-
if (object) {
398+
if (object && object->collideWithObjects()) {
387399
aabb3f object_collisionbox;
388-
if (object->getCollisionBox(&object_collisionbox) &&
389-
object->collideWithObjects()) {
390-
cinfo.emplace_back(false, true, 0, v3s16(), object_collisionbox);
391-
}
400+
if (object->getCollisionBox(&object_collisionbox))
401+
cinfo.emplace_back(object, 0, object_collisionbox);
392402
}
393403
}
394404
#ifndef SERVER
@@ -399,7 +409,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
399409
v3f lplayer_pos = lplayer->getPosition();
400410
lplayer_collisionbox.MinEdge += lplayer_pos;
401411
lplayer_collisionbox.MaxEdge += lplayer_pos;
402-
cinfo.emplace_back(false, true, 0, v3s16(), lplayer_collisionbox);
412+
ActiveObject *obj = (ActiveObject*) lplayer->getCAO();
413+
cinfo.emplace_back(obj, 0, lplayer_collisionbox);
403414
}
404415
}
405416
#endif
@@ -498,12 +509,13 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
498509
is_collision = false;
499510

500511
CollisionInfo info;
501-
if (nearest_info.is_object)
512+
if (nearest_info.isObject())
502513
info.type = COLLISION_OBJECT;
503514
else
504515
info.type = COLLISION_NODE;
505516

506517
info.node_p = nearest_info.position;
518+
info.object = nearest_info.obj;
507519
info.old_speed = *speed_f;
508520
info.plane = nearest_collided;
509521

@@ -572,7 +584,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
572584
if (std::fabs(cbox.MaxEdge.Y - box.MinEdge.Y) < 0.05f) {
573585
result.touching_ground = true;
574586

575-
if (box_info.is_object)
587+
if (box_info.isObject())
576588
result.standing_on_object = true;
577589
}
578590
}

Diff for: ‎src/collision.h

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct CollisionInfo
4848
CollisionType type = COLLISION_NODE;
4949
CollisionAxis axis = COLLISION_AXIS_NONE;
5050
v3s16 node_p = v3s16(-32768,-32768,-32768); // COLLISION_NODE
51+
ActiveObject *object = nullptr; // COLLISION_OBJECT
5152
v3f old_speed;
5253
v3f new_speed;
5354
int plane = -1;

Diff for: ‎src/script/common/c_content.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -2043,6 +2043,9 @@ void push_collision_move_result(lua_State *L, const collisionMoveResult &res)
20432043
if (c.type == COLLISION_NODE) {
20442044
push_v3s16(L, c.node_p);
20452045
lua_setfield(L, -2, "node_pos");
2046+
} else if (c.type == COLLISION_OBJECT) {
2047+
push_objectRef(L, c.object->getId());
2048+
lua_setfield(L, -2, "object");
20462049
}
20472050

20482051
push_v3f(L, c.old_speed / BS);

0 commit comments

Comments
 (0)
Please sign in to comment.