#pragma once #include #include #include #include #include #include "Core/Models.h" // ------------------------------------------------------------------------- // EntityCategoryProjector // Merges the three entity lists (near / far / slow) and projects them into // typed category vectors. All methods are static — no instance state. // ------------------------------------------------------------------------- class EntityCategoryProjector { public: // ------------------------------------------------------------------ // Public projection methods // ------------------------------------------------------------------ static std::vector BuildPlayers( const std::vector& near, const std::vector& far, const std::vector& slow, const std::unordered_map& scoreboardNames, std::function deadResolver, std::function heldItemResolver, std::function healthResolver, std::function adminResolver = nullptr); static std::vector BuildAnimals( const std::vector& near, const std::vector& far, const std::vector& slow); static std::vector BuildZombies( const std::vector& near, const std::vector& far, const std::vector& slow); static std::vector BuildCarsAndBoats( const std::vector& near, const std::vector& far, const std::vector& slow); static std::vector BuildOtherEntities( const std::vector& near, const std::vector& far, const std::vector& slow); private: // ------------------------------------------------------------------ // Unified flattened view of one entity from any list // ------------------------------------------------------------------ struct EntityProjection { uint64_t address = 0; uint32_t networkId = 0; std::optional position; std::optional headingDegrees; std::string entityName; std::string typeName; std::string configName; std::string modelName; }; // ------------------------------------------------------------------ // Internal helpers // ------------------------------------------------------------------ /// Merge all three lists, deduplicate by address, and sort by /// (entityName, address) for deterministic ordering. static std::vector EnumerateEntities( const std::vector& near, const std::vector& far, const std::vector& slow); /// Returns true if typeName belongs to one of the explicitly-handled /// categories (player, animal, zombie, vehicle). static bool IsKnownCategoryType(const std::string& typeName); /// Returns the VehicleKind for known vehicle type names, or nullopt. static std::optional GetVehicleKind(const std::string& typeName); // Type-name constants static constexpr const char* kTypePlayer = "dayzplayer"; static constexpr const char* kTypeAnimal = "dayzanimal"; static constexpr const char* kTypeZombie = "dayzinfected"; static constexpr const char* kTypeBoat = "boat"; static constexpr const char* kTypeCar = "car"; static constexpr const char* kTypeHeli = "helicopter"; static constexpr const char* kTypePlane = "plane"; };