/** * 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 // AES-Handling for participants namespace CesMineAreas { 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 MineListItem { int aesItemId; qint64 time; qreal distance; // distance from last Position to mine int mineIndex; QPointF minePos; }; class HandlerMineAreas final: public QObject , protected TrainingAreaBase::Interface::Ftc::SendCesHitReplyHandler , protected AreaEffectSimulation::Interface::Ftc::MineTriggeredReplyHandler { Q_OBJECT public: HandlerMineAreas(const std::shared_ptr &ddsHandler, const std::shared_ptr &participantHandler, QObject *parent = nullptr); ~HandlerMineAreas(); /** * Initialize the handler to manage information from player management */ bool init(); protected: void onSendCesHitReply(const Core::FunctionReplyObject &replyObject) override final; void onMineTriggeredReply(const Core::FunctionReplyObject &replyObject) override final; private Q_SLOTS: /** * Handle the signals from 'AES' */ void onAesItemViewChanged(const AreaEffectSimulation::AesItemView &data, DataModification modType); void onTriggeredImpactsChanged(const AreaEffectSimulation::TriggeredImpacts &data, DataModification modType); void sendFtcMineTrigger(int aesItemId, int mineIndex); private: // methoden void calculateImpacts(const AreaEffectSimulation::TriggeredImpacts &data); void calculateImpacts(const CentralEffectSimulation::AesItemViewUtm &itemView, const QVector &impactsToCheck, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); void onNewOutdoorPosition(const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); void onNewParticipantState(const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPos); // Checks if a mine has been crossed. // If so, the mine with the smallest distance to the last position should be taken. bool intersectMineRadiusCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); qreal crossCircle(const QPointF ¢erUtm, const double radius, const int participantId, int zone); bool inCircle(const QPointF ¢erUtm, const double radius, const QPointF &pointUtm); bool intersectsBoundingBoxCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const int participantId); bool inBoundingBoxCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); bool inFormCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); bool inExtededFormCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition) const; double distancePointLine(const QPointF &p, const QPointF &l1, const QPointF &l2) const; double squareLen(const QPointF &p1, const QPointF &p2) const; bool intersectFormCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const int participantId); void sendCesHitRequest(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition, qint64 effectTime, int mineFieldBitIndex = 0); void sendCesHitRequest(const AreaEffectSimulation::AesItemView &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition, qint64 effectTime, int mineFieldBitIndex = 0); void sendParticipantEventEnterLeave(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition, const bool inFormCheckResult); void sendParticipantEvent(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition, const ProjectDataManagement::EventType eventType); void sendEffectTypeEvent(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition, EffectType effectType, int mineFieldBitIndex, qint64 effectTime); ProjectDataManagement::EventType leaveEventTypeForAesType(AreaEffectSimulation::AesType aesTypeId); EffectType leaveEffectTypeForAesType(AreaEffectSimulation::AesType aesTypeId); void aesItemViewRemoved(int aesItemId); void printAesItemViews(); private: // attributes std::shared_ptr m_ddsHandler; ///< Pointer to VOM DDS handler std::shared_ptr m_handlerParticipant; QHash m_aesItemId2partIdMap; QHash m_triggeredImpacts; // key = aesItemId // AES-Values QHash m_aesItemViews; // key = aesItemId QQueue m_sendCesHitRequestQueue; QHash> m_eventStates; // QHash>> QHash>> m_effectTypeStates; // QHash>> QHash>> m_effectTypeBitFieldIndexes; // QHash>> QHash> m_mineLists; // Key = ParticipantId CentralEffectSimulation::LOGGER_T &m_logger; ///< Interface to the Logging-Facility }; } // namespace CesMineAreas