/** * Handler for player data * $Id$ * $HeadURL$ * $Author$ * Created by gr, SLSE, 2017-02-20 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include // AES-Handling for participants namespace CES_NBC { enum class EffectType { Unknown = 0, EffectiveMineRangeEnter = 0xf0000 | 1, // AtMineAreaSingleMines = 15 = 0xf EffectiveMineRangeLeave = 0xf0000 | 2, // AtMineAreaSingleMines = 15 = 0xf NContaminationLeave = 0x10000 | 0, // AtNContamination = 1 NContaminationEnterArea1 = 0x10000 | 1, NContaminationEnterArea2 = 0x10000 | 2, NContaminationDetonation = 0x10000 | 255, FunctionalAreaLeave = 0xc0000 | 0, // AtReconArea = 12 = 0xc FunctionalAreaEnter = 0xc0000 | 1, ExplosionArea = 0x30000 | 2, // AtExplosionArea = 3 ExplosionSingle = 0x40000 | 3, // AtExplosionSingle = 4 BCContaminationLeave = 0x20000 | 0, // AtBCContamination = 2 BCContaminationEnterFloating = 0x20000 | 1, BCContaminationEnterResident = 0x20000 | 2, BCContaminationEnterFloatingArea = 0x20000 | 3, BeStillWarning = 11, }; QString toString(EffectType et); struct ParticipantDistance { double squareDistance = 0; CentralEffectSimulation::HandlerParticipant::CesParticipantData participantPosition; }; class HandlerNBC : public QObject , protected TrainingAreaBase::Interface::Ftc::SendCesHitReplyHandler { Q_OBJECT public: explicit HandlerNBC(const std::shared_ptr &ddsHandler, const std::shared_ptr &participantHandler, QObject *parent = nullptr); ~HandlerNBC(); /** * Initialize the handler to manage information from player management */ bool init(); protected: void onSendCesHitReply(const Core::FunctionReplyObject &replyObject) override final; private Q_SLOTS: /** * Handle the signals from 'AES' */ void onAesItemViewChanged(const AreaEffectSimulation::AesItemView &data, DataModification modType); void onBCContaminationChanged(const AreaEffectSimulation::BCContamination &data, DataModification modType); void onNContaminationChanged(const AreaEffectSimulation::NContamination &data, DataModification modType); void onBuildingStateChanged(const Buildings::BuildingState &data, DataModification modType); private: // methoden void calculateBcContamination(const CentralEffectSimulation::AesItemViewUtm &itemView); void calculateDangerArea(const CentralEffectSimulation::AesItemViewUtm &itemView); void deleteDangerArea(const int aesItemId); void onNewOutdoorParticipantPosition(const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData); void onNewIndoorParticipantPosition(const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData); void onParticipantDecontaminated(const int participantId); void onRestoreRadioReadinessChanged(const int participantId); bool inCircle(const QPointF ¢erUtm, const double radius, const QPointF &pointUtm); bool inBoundingBoxCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData); void sendEnterEvent(const int aesItemId, const AreaEffectSimulation::AesType aesTypeId, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData, bool isIndoor = false); void sendLeaveEvent(const int aesItemId, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData); bool inFormCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData); void sendCesHitRequest(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData, qint64 effectTime, int remaining, int mineFieldBitIndex = 0); void sendCesHitRequest(const int aesItemId, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData, qint64 effectTime, int remaining, int mineFieldBitIndex = 0, EffectType effectType = CES_NBC::EffectType::Unknown); void sendParticipantEvent(const int aesItemId, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData, const ProjectDataManagement::EventType eventType); void sendEffectTypeEvent(const int aesItemId, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantData, EffectType effectType); bool eventMustBeSend(int aesItemId, int participantId, const ProjectDataManagement::EventType eventType); bool effectTypeMustBeSend(int aesItemId, int participantId, EffectType effectType); ProjectDataManagement::EventType leaveEventTypeForAesType(AreaEffectSimulation::AesType aesTypeId); EffectType leaveEffectTypeForAesType(AreaEffectSimulation::AesType aesTypeId); EffectType effectTypeForNContaminationArea(const CentralEffectSimulation::AesItemViewUtm &itemView, const QPointF &participantPosUtmPoint, qint64 partPosSampleTime, const bool isIndoor); EffectType effectTypeForBCContaminationArea(const CentralEffectSimulation::AesItemViewUtm &itemView, const QPointF &participantPosUtmPoint); void aesItemViewRemoved(int aesItemId); int getContaminationFromBuildingRoom(const int buildingId, const int roomId) const; private: // attributes std::shared_ptr m_ddsHandler; ///< Pointer to VOM DDS handler std::shared_ptr m_handlerParticipant; std::shared_ptr m_handlerBuildingData; QHash m_aesItemId2partIdMap; // AES-Values QHash m_aesItemViews; // key = aesItemId QQueue m_sendCesHitRequestQueue; QHash m_explosionSingleStates; // key = id value = state QHash>> m_eventStates; // QHash>> QHash>> m_effectTypeStates; // QHash>> QHash> m_participantAes; // key = ParticipantId key in value = aesId QHash m_isInContaminatedRoom; // key = ParticipantId value = aesId QHash m_lastRoomId; // key = ParticipantId value = RoomId from last position CentralEffectSimulation::LOGGER_T &m_logger; ///< Interface to the Logging-Facility }; } // namespace CES_NBC