Files
qt5-legatus-legacy/Lts/Services/CentralEffectSimulation/Plugins/ParticipantBuildings/handler_blocked_areas.cpp
T
2026-08-13 18:33:10 +02:00

140 lines
6.0 KiB
C++
Executable File

/**
* Handler for player data
* $Id$
* $HeadURL$
* $Author$
* Created by hjl, SLSE, 2017-02-20
*/
#include "handler_blocked_areas.h"
#include "handler_participant_building.h"
#include <CentralEffectSimulation/handler_participant.h>
namespace CesParticipantBuildings
{
HandlerBlockedAreas::HandlerBlockedAreas(const std::shared_ptr<CentralEffectSimulation::DdsHandler> &ddsHandler,
const std::shared_ptr<CentralEffectSimulation::HandlerParticipant> &participantHandler,
const std::shared_ptr<HandlerParticipantBuilding> &participantBuildingHandler,
QObject *parent)
: QObject(parent)
, m_ddsHandler(ddsHandler)
, m_handlerParticipant(participantHandler)
, m_handlerParticipantBuilding(participantBuildingHandler)
, m_logger(CentralEffectSimulation::getLogger("Plugin.ParticipantBuildings.HandlerBlockedAreas"))
{
} // end of ctor()
//-----------------------------------------------------------------------------
HandlerBlockedAreas::~HandlerBlockedAreas()
{
} // end of dtor()
//-----------------------------------------------------------------------------
bool HandlerBlockedAreas::init()
{
DEBUG_LOG(m_logger) << "init";
connect(m_handlerParticipant.get(), &CentralEffectSimulation::HandlerParticipant::newIndoorPosition,
this, &HandlerBlockedAreas::onParticipantPositionChanged);
connect(m_handlerParticipant.get(), &CentralEffectSimulation::HandlerParticipant::newOutdoorPosition,
this, &HandlerBlockedAreas::onParticipantPositionChanged);
connect(m_handlerParticipantBuilding.get(), &HandlerParticipantBuilding::newBuildingState,
this, &HandlerBlockedAreas::onBuildingStateChanged);
return true;
} // end of init()
//-----------------------------------------------------------------------------
void HandlerBlockedAreas::onSendParticipantBlockedAreaReply(const Core::FunctionReplyObject &replyObject)
{
if (replyObject.error())
WARNING_LOG(m_logger) << "Can not send blocked Area to participant : " << replyObject();
else
DEBUG_LOG(m_logger) << "onSendParticipantBlockedAreaReply for id " << replyObject.id() << " success";
}
void HandlerBlockedAreas::onParticipantPositionChanged(const CentralEffectSimulation::HandlerParticipant::CesParticipantData &partPos)
{
const int participantId = partPos.participantId();
int damagePercentBlockedAreas = 90; // From the percentage damage, blocked area applies Todo Config Value
DEBUG_LOG(m_logger) << "HandlerBlockedAreas onParticipantPositionChanged participantId=" << participantId;
TrainingAreaBase::SendParticipantBlockedAreaRequest pba;
pba.equipmentNumber(m_ddsHandler->participantId2EquipNo(partPos.participantId()));
pba.participantId(partPos.participantId());
// if (partPos.vulnerabilityState == ProjectDataManagement::VulnerabilityState_def::CombatReady)
// m_blockedAreas.remove(participantId);
if (!partPos.insideBuilding())
{
auto it = m_blockedAreas.find(participantId);
if (it != m_blockedAreas.end())
{
DEBUG_LOG(m_logger) << "Blocked Area Leave equipment-No. =" << pba.equipmentNumber();
pba.blockedAreaMode(TrainingAreaBase::BlockedAreaMode_def::Leave);
m_ddsHandler->ftcTab()->sendParticipantBlockedAreaRequest(pba, this);
m_blockedAreas.erase(it);
}
return;
}
else
{
// check leave
if (m_blockedAreas.contains(participantId) &&
(m_handlerParticipantBuilding->getDamagePercentFromRoom(partPos.roomId()) < damagePercentBlockedAreas))
{
DEBUG_LOG(m_logger) << "Blocked Area Leave equipment-No. =" << pba.equipmentNumber();
pba.blockedAreaMode(TrainingAreaBase::BlockedAreaMode_def::Leave);
m_ddsHandler->ftcTab()->sendParticipantBlockedAreaRequest(pba, this);
m_blockedAreas.remove(participantId);
return;
}
}
DEBUG_LOG(m_logger) << "Room =" << partPos.roomId()
<< " DamagePercentRoom=" << m_handlerParticipantBuilding->getDamagePercentFromRoom(partPos.roomId());
DEBUG_LOG(m_logger) << "1: " << m_handlerParticipantBuilding->getDamagePercentFromRoom(partPos.roomId())
<< " damagePercentBlockedAreas= " << damagePercentBlockedAreas << "\n"
<< " getDamagePercentFromBuilding=" << m_handlerParticipantBuilding->getDamagePercentFromBuilding(partPos.buildingId()) << "\n"
<< "m_blockedAreas.contains(participantId) = " << m_blockedAreas.contains(participantId) ;
if ((m_handlerParticipantBuilding->getDamagePercentFromRoom(partPos.roomId()) >= damagePercentBlockedAreas
|| m_handlerParticipantBuilding->getDamagePercentFromBuilding(partPos.buildingId()) == 100)
&& !m_blockedAreas.contains(participantId))
{
DEBUG_LOG(m_logger) << "Send Enter Blocked Area to Participant:" << participantId;
pba.blockedAreaMode(TrainingAreaBase::BlockedAreaMode_def::Enter);
m_ddsHandler->ftcTab()->sendParticipantBlockedAreaRequest(pba, this);
m_blockedAreas.insert(participantId, partPos.roomId());
}
} // end of onParticipantPositionChanged()
void HandlerBlockedAreas::onBuildingStateChanged(const int32_t buildingId)
{
DEBUG_LOG(m_logger) << "onBuildingStateChanged buildingId:" << buildingId;
int damagePercent = m_handlerParticipantBuilding->getDamagePercentFromBuilding(buildingId);
if (damagePercent == 0 && !m_blockedAreas.isEmpty()) // init
{
const auto participants = m_handlerParticipant->getParticipantsBuilding(buildingId);
for (int participantId : participants)
{
if (m_blockedAreas.contains(participantId))
{
DEBUG_LOG(m_logger) << "remove participantId: " << participantId;
TrainingAreaBase::SendParticipantBlockedAreaRequest pba;
pba.equipmentNumber(m_ddsHandler->participantId2EquipNo(participantId));
pba.participantId(participantId);
pba.blockedAreaMode(TrainingAreaBase::BlockedAreaMode_def::Leave);
m_ddsHandler->ftcTab()->sendParticipantBlockedAreaRequest(pba, this);
m_blockedAreas.remove(participantId);
}
}
}
}
} // namespace CesParticipantBuildings