@@ -37,18 +37,30 @@ with this program; if not, write to the Free Software Foundation, Inc.,
37
37
#endif
38
38
39
39
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) :
42
43
is_unloaded (is_ul),
43
- is_object (is_obj ),
44
+ obj ( nullptr ),
44
45
bouncy (bouncy),
45
46
position (pos),
46
47
box (box)
47
48
{}
48
49
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
+
49
61
bool is_unloaded;
50
62
bool is_step_up = false ;
51
- bool is_object ;
63
+ ActiveObject *obj ;
52
64
int bouncy;
53
65
v3s16 position;
54
66
aabb3f box;
@@ -312,13 +324,13 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
312
324
for (auto box : nodeboxes) {
313
325
box.MinEdge += posf;
314
326
box.MaxEdge += posf;
315
- cinfo.emplace_back (false , false , n_bouncy_value, p, box);
327
+ cinfo.emplace_back (false , n_bouncy_value, p, box);
316
328
}
317
329
} else {
318
330
// Collide with unloaded nodes (position invalid) and loaded
319
331
// CONTENT_IGNORE nodes (position valid)
320
332
aabb3f box = getNodeBox (p, BS);
321
- cinfo.emplace_back (true , false , 0 , p, box);
333
+ cinfo.emplace_back (true , 0 , p, box);
322
334
}
323
335
}
324
336
@@ -383,12 +395,10 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
383
395
iter != objects.end (); ++iter) {
384
396
ActiveObject *object = *iter;
385
397
386
- if (object) {
398
+ if (object && object-> collideWithObjects () ) {
387
399
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);
392
402
}
393
403
}
394
404
#ifndef SERVER
@@ -399,7 +409,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
399
409
v3f lplayer_pos = lplayer->getPosition ();
400
410
lplayer_collisionbox.MinEdge += lplayer_pos;
401
411
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);
403
414
}
404
415
}
405
416
#endif
@@ -498,12 +509,13 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
498
509
is_collision = false ;
499
510
500
511
CollisionInfo info;
501
- if (nearest_info.is_object )
512
+ if (nearest_info.isObject () )
502
513
info.type = COLLISION_OBJECT;
503
514
else
504
515
info.type = COLLISION_NODE;
505
516
506
517
info.node_p = nearest_info.position ;
518
+ info.object = nearest_info.obj ;
507
519
info.old_speed = *speed_f;
508
520
info.plane = nearest_collided;
509
521
@@ -572,7 +584,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
572
584
if (std::fabs (cbox.MaxEdge .Y - box.MinEdge .Y ) < 0 .05f ) {
573
585
result.touching_ground = true ;
574
586
575
- if (box_info.is_object )
587
+ if (box_info.isObject () )
576
588
result.standing_on_object = true ;
577
589
}
578
590
}
0 commit comments