void Door::onImpact(DamageType damage_type, float damage, const float3 &force, EntityRef source) { if(!isOpened() && damage_type == DamageType::bludgeoning) { float door_force = dot(force.xz(), m_open_in_dir); if(fabs(door_force) >= 8.0f && classId() != DoorClassId::sliding) { bool opening_in = door_force > 0.0f; if(classId() == DoorClassId::rotating_in && !opening_in) return; if(classId() == DoorClassId::rotating_out && opening_in) return; changeState(opening_in? DoorState::opened_in : DoorState::opened_out); } } }