/** * Handler for player data * $Id$ * $HeadURL$ * $Author$ * Created by gr, SLSE, 2017-02-20 */ #pragma once #include "logger.h" #include #include #include #include #include #include #include #include #include #include // AES-Handling for participants namespace Ces2D { 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 HandlerParticipantArea : public QObject , protected TrainingAreaBase::Interface::Ftc::SendCesHitReplyHandler { Q_OBJECT public: explicit HandlerParticipantArea(const std::shared_ptr &ddsHandler, const std::shared_ptr &participantHandler, const std::shared_ptr &aesDataHandler, const std::shared_ptr &buildingModelHandler, QObject *parent = nullptr); ~HandlerParticipantArea(); /** * 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 onTriggeredImpactsChanged(const AreaEffectSimulation::TriggeredImpacts &data, DataModification modType); void onExplosionAreaChanged(const AreaEffectSimulation::ExplosionArea &data, DataModification modType); void onExplosionSingleChanged(const AreaEffectSimulation::ExplosionSingle &data, DataModification modType); void onExplosionSingleCentralChanged(const AreaEffectSimulation::ExplosionSingleCentral &data, DataModification modType); void onDusSingleMineChanged(const AreaEffectSimulation::DusSingleMine &data, DataModification modType); void onBCContaminationChanged(const AreaEffectSimulation::BCContamination &data, DataModification modType); void onNContaminationChanged(const AreaEffectSimulation::NContamination &data, DataModification modType); private: // methoden void calculateImpacts(const AreaEffectSimulation::TriggeredImpacts &data); void calculateImpacts(const CentralEffectSimulation::AesItemViewUtm &itemView, const QVector &impactsToCheck, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); void calculateBcContamination(const CentralEffectSimulation::AesItemViewUtm &itemView); void calculateFunctionArea(const CentralEffectSimulation::AesItemViewUtm &itemView); void deleteFunctionalArea(const int aesItemId); void calculateAesParticipant(const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPos); void calculateSmartExplosion(const AreaEffectSimulation::ExplosionSingle &data, const QHash &participantPositions, qint64 impactTime); bool inMineRadiusCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); bool inCircle(const QPointF ¢erUtm, const double radius, const QPointF &pointUtm); bool inBoundingBoxCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); bool inFormCheck(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition); void sendCesHitRequest(const CentralEffectSimulation::AesItemViewUtm &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition, qint64 effectTime, int remaining, int mineFieldBitIndex = 0); void sendCesHitRequest(const AreaEffectSimulation::AesItemView &itemView, const CentralEffectSimulation::HandlerParticipant::CesParticipantData &participantPosition, qint64 effectTime, int remaining, int mineFieldBitIndex = 0); 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); bool eventMustBeSend(int aesItemId, int participantId, const ProjectDataManagement::EventType eventType); bool effectTypeMustBeSend(int aesItemId, int participantId, EffectType effectType, int mineFieldBitIndex, bool insideBuilding); ProjectDataManagement::EventType leaveEventTypeForAesType(AreaEffectSimulation::AesType aesTypeId); EffectType leaveEffectTypeForAesType(AreaEffectSimulation::AesType aesTypeId); EffectType effectTypeForNContaminationArea(const CentralEffectSimulation::AesItemViewUtm &itemView, const QPointF &participantPosUtmPoint, qint64 partPosSampleTime); EffectType effectTypeForBCContaminationArea(const CentralEffectSimulation::AesItemViewUtm &itemView, const QPointF &participantPosUtmPoint); void aesItemViewRemoved(int aesItemId); private: // attributes std::shared_ptr m_ddsHandler; ///< Pointer to VOM DDS handler std::shared_ptr m_handlerParticipant; std::shared_ptr m_handlerAesData; std::shared_ptr m_handlerBuildingModel; QHash m_aesItemId2partIdMap; QHash m_triggeredImpacts; // key = aesItemId // AES-Values QHash m_aesItemViews; // key = aesItemId QQueue m_sendCesHitRequestQueue; QHash m_explosionSingleStates; // key = id value = state QHash m_explosionSingleCentralStates; QHash>> m_eventStates; // QHash>> QHash>> m_effectTypeStates; // QHash>> QHash>> m_effectTypeBitFieldIndexes; // QHash>> NGL::INGLLogger &m_logger; ///< Interface to the Logging-Facility }; } // namespace Ces2D