#pragma once #include #include #include #include #include #include "external/nlohmann/json.hpp" #include "TextModel.h" #include "InteractiveObject.h" namespace ZL { class Character; struct GameObjectData { std::string name; std::string texturePath; std::string textureDarkandsPath; std::string meshPath; float rotationX = 0.0f; float rotationY = 0.0f; float rotationZ = 0.0f; float positionX = 0.0f; float positionY = 0.0f; float positionZ = 0.0f; float scale = 1.0f; }; struct InteractiveObjectData { GameObjectData base; float interactionRadius = 2.0f; float approachRadius = 2.0f; std::string activateFunctionName; float pivotX = 0.0f; float pivotY = 0.0f; float pivotZ = 0.0f; float boundsMinX = 0.0f, boundsMinY = 0.0f, boundsMinZ = 0.0f; float boundsMaxX = 0.0f, boundsMaxY = 0.0f, boundsMaxZ = 0.0f; bool hasInteractionPosition = false; float interactionPositionX = 0.0f, interactionPositionY = 0.0f, interactionPositionZ = 0.0f; bool castShadow = true; bool castShadowNight = true; bool isActive = true; }; struct NpcData { std::string id; std::string name; std::string texturePath; std::map meshTextures; std::string animationIdlePath; std::string animationWalkPath; // Optional combat / death animations. Empty path = slot not loaded. std::string animationActionIdlePath; std::string animationActionAttackPath; std::string animationStandToActionPath; std::string animationActionToStandPath; std::string animationActionToDeathPath; std::string animationDeathIdlePath; float positionX = 0.0f; float positionY = 0.0f; float positionZ = 0.0f; float walkSpeed = 1.5f; float rotationSpeed = 8.0f; float modelScale = 0.01f; float modelCorrectionRotX = 0.0f; float modelCorrectionRotY = 0.0f; float modelCorrectionRotZ = 0.0f; float facingAngle = 0.0f; float hp = 100.0f; bool canAttack = false; bool enabled = true; float interactionRadius = 0.0f; }; class GameObjectLoader { public: static std::unordered_map loadAndCreateGameObjects( const std::string& jsonPath, Renderer& renderer, const std::string& zipPath = "" ); static std::vector loadAndCreateInteractiveObjects( const std::string& jsonPath, Renderer& renderer, const std::string& zipPath = "" ); static std::vector> loadAndCreate_Npcs( const std::string& jsonPath, const std::string& zipPath = "" ); static std::vector loadNpcsFromJson(const std::string& jsonPath, const std::string& zipPath = ""); static LoadedGameObject buildLoadedObject(const GameObjectData& data, Renderer& renderer, const std::string& zipPath); private: static nlohmann::json loadJson(const std::string& jsonPath, const std::string& zipPath); static std::vector loadFromJson(const std::string& jsonPath, const std::string& zipPath); static std::vector loadInteractiveFromJson(const std::string& jsonPath, const std::string& zipPath); }; } // namespace ZL