Work around assertion in alphalabs4, fix #409

In the savegame from that bugreport, "monster_zsec_shotgun_12" was
lying dead pretty much at its spawn point.
script/map_alphalabs4.script moves those "ride_of_death" platforms
around, and at the end of a cycle teleports "ride_of_death*_parent" back
to its starting position - and the "ride_of_death*" bound to it, which
is a pushing mover, just gets dragged along by the physics code and thus
can collide with that zombie cadaver, which then tries to push it along,
causing that assertion in TestHugeTranslation().
This is a map bug - Doom3 even prints a warning:
 WARNING: script/map_alphalabs4.script(722): Thread
  'map_alphalabs4::RideOfDeathPath': teleported 'ride_of_death2_parent'
  which has the pushing mover 'ride_of_death2' bound to it
So I just disable that assertion for this specific case..
Also moved the assertion behind the corresponding warning, so that gets
printed before the assertion kills the game..

Also a small change to CMakeLists.txt that should make enabling
LINUX_RELEASE_BINS after CMake has already been run without it work
This commit is contained in:
Daniel Gibson 2022-05-16 05:43:47 +02:00
parent adad73cda7
commit c22965bf58
5 changed files with 28 additions and 11 deletions

View file

@ -69,7 +69,9 @@ Note: Numbers starting with a "#" like #330 refer to the bugreport with that num
- On Mac it's in `$HOME/Library/Application Support/dhewm3/`
- On other Unix-like systems like Linux it's in `$XDG_DATA_HOME/dhewm3/`
(usually `$HOME/.local/share/dhewm3/`)
* Improved compatibility with Wayland (#426)
* Work around assertion in AlphaLabs4 due to "ride_of_death" yeeting
the dead "monster_zsec_shotgun_12" into the void (#409)
1.5.1 (2021-03-14)
------------------------------------------------------------------------

View file

@ -33,6 +33,7 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/sys/cmake")
if(LINUX_RELEASE_BINS)
message(STATUS "Setting RPATH to \$ORIGIN/libs/ so you can put dependencies in there")
set(CMAKE_SKIP_RPATH OFF CACHE BOOL "Skip RPATH" FORCE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "$ORIGIN/libs")

View file

@ -887,7 +887,8 @@ void idCollisionModelManagerLocal::Translation( trace_t *results, const idVec3 &
if ( session->rw ) {
session->rw->DebugArrow( colorRed, start, end, 1 );
}
common->Printf( "idCollisionModelManagerLocal::Translation: huge translation\n" );
common->Printf( "idCollisionModelManagerLocal::Translation: huge translation from (%.2f %.2f %.2f) to (%.2f %.2f %.2f)\n",
start.x, start.y, start.z, end.x, end.y, end.z);
return;
}

View file

@ -965,14 +965,6 @@ idClip::TestHugeTranslation
*/
ID_INLINE bool TestHugeTranslation( trace_t &results, const idClipModel *mdl, const idVec3 &start, const idVec3 &end, const idMat3 &trmAxis ) {
if ( mdl != NULL && ( end - start ).LengthSqr() > Square( CM_MAX_TRACE_DIST ) ) {
#ifndef CTF
// May be important: This occurs in CTF when a player connects and spawns
// in the PVS of a player that has a flag that is spawning the idMoveableItem
// "nuggets". The error seems benign and the assert was getting in the way
// of testing.
assert( 0 );
#endif
results.fraction = 0.0f;
results.endpos = start;
results.endAxis = trmAxis;
@ -984,6 +976,15 @@ ID_INLINE bool TestHugeTranslation( trace_t &results, const idClipModel *mdl, co
} else {
gameLocal.Printf( "huge translation for clip model %d\n", mdl->GetId() );
}
gameLocal.Printf( " from (%.2f %.2f %.2f) to (%.2f %.2f %.2f)\n", start.x, start.y, start.z, end.x, end.y, end.z);
#ifndef CTF
// May be important: This occurs in CTF when a player connects and spawns
// in the PVS of a player that has a flag that is spawning the idMoveableItem
// "nuggets". The error seems benign and the assert was getting in the way
// of testing.
assert( 0 );
#endif
return true;
}
return false;

View file

@ -965,7 +965,7 @@ idClip::TestHugeTranslation
*/
ID_INLINE bool TestHugeTranslation( trace_t &results, const idClipModel *mdl, const idVec3 &start, const idVec3 &end, const idMat3 &trmAxis ) {
if ( mdl != NULL && ( end - start ).LengthSqr() > Square( CM_MAX_TRACE_DIST ) ) {
assert( 0 );
results.fraction = 0.0f;
results.endpos = start;
@ -979,6 +979,18 @@ ID_INLINE bool TestHugeTranslation( trace_t &results, const idClipModel *mdl, co
} else {
gameLocal.Printf( "huge translation for clip model %d\n", mdl->GetId() );
}
gameLocal.Printf( " from (%.2f %.2f %.2f) to (%.2f %.2f %.2f)\n", start.x, start.y, start.z, end.x, end.y, end.z);
if ( mdl->GetEntity() != NULL && idStr::Cmp(mdl->GetEntity()->GetName(), "monster_zsec_shotgun_12") == 0
&& idStr::Cmp(gameLocal.GetMapName(), "maps/game/alphalabs4.map") == 0 )
{
// there is a map bug in alpha4 where the ride of death can push a monster far into the void
// don't assert there
return true;
}
assert( 0 );
return true;
}
return false;