diff --git a/src/character.cpp b/src/character.cpp index ff81c4ebcd2f..8af6e7efff09 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -10857,6 +10857,9 @@ void Character::knock_back_to( const tripoint &to ) } else { // It's no wall setpos( to ); + + map &here = get_map(); + here.creature_on_trap( *this ); } } diff --git a/src/game.cpp b/src/game.cpp index e931c447a141..8dfd100a6fc6 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -4260,6 +4260,8 @@ void game::knockback( std::vector &traj, int stun, int dam_mult, } std::size_t force_remaining = traj.size(); if( monster *const targ = critter_at( tp, true ) ) { + tripoint start_pos = targ->pos(); + if( stun > 0 ) { targ->add_effect( effect_stunned, 1_turns * stun ); add_msg( _( "%s was stunned!" ), targ->name() ); @@ -4317,8 +4319,14 @@ void game::knockback( std::vector &traj, int stun, int dam_mult, } } tp = traj[i]; + if( start_pos != targ->pos() ) { + map &here = get_map(); + here.creature_on_trap( *targ ); + } } } else if( npc *const targ = critter_at( tp ) ) { + tripoint start_pos = targ->pos(); + if( stun > 0 ) { targ->add_effect( effect_stunned, 1_turns * stun ); add_msg( _( "%s was stunned!" ), targ->name ); @@ -4383,8 +4391,15 @@ void game::knockback( std::vector &traj, int stun, int dam_mult, } targ->setpos( traj[i] ); tp = traj[i]; + + if( start_pos != targ->pos() ) { + map &here = get_map(); + here.creature_on_trap( *targ ); + } } } else if( u.pos() == tp ) { + tripoint start_pos = u.pos(); + if( stun > 0 ) { u.add_effect( effect_stunned, 1_turns * stun ); add_msg( m_bad, vgettext( "You were stunned for %d turn!", @@ -4462,8 +4477,12 @@ void game::knockback( std::vector &traj, int stun, int dam_mult, } else { u.setpos( traj[i] ); } - tp = traj[i]; + + if( start_pos != u.pos() ) { + map &here = get_map(); + here.creature_on_trap( u ); + } } } } diff --git a/src/monmove.cpp b/src/monmove.cpp index b8ad9060785f..ed87f58e49c0 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -2005,6 +2005,9 @@ void monster::knock_back_to( const tripoint &to ) } else { // It's no wall setpos( to ); + + map &here = get_map(); + here.creature_on_trap( *this ); } check_dead_state(); } diff --git a/src/teleport.cpp b/src/teleport.cpp index 7d50be568165..80c33f564cbd 100644 --- a/src/teleport.cpp +++ b/src/teleport.cpp @@ -110,5 +110,6 @@ bool teleport::teleport( Creature &critter, int min_distance, int max_distance, g->update_map( *p ); } critter.remove_effect( effect_grabbed ); + here.creature_on_trap( critter ); return true; }