project(botcraft)

set(botcraft_PUBLIC_HDR
    include/botcraft/AI/BaseNode.hpp
    include/botcraft/AI/BehaviourClient.hpp
    include/botcraft/AI/BehaviourTree.hpp
    include/botcraft/AI/Blackboard.hpp
    include/botcraft/AI/SimpleBehaviourClient.hpp
    include/botcraft/AI/Status.hpp
    include/botcraft/AI/TemplatedBehaviourClient.hpp

    include/botcraft/AI/Tasks/AllTasks.hpp
    include/botcraft/AI/Tasks/BaseTasks.hpp
    include/botcraft/AI/Tasks/DigTask.hpp
    include/botcraft/AI/Tasks/EntitiesTasks.hpp
    include/botcraft/AI/Tasks/InventoryTasks.hpp
    include/botcraft/AI/Tasks/PathfindingTask.hpp

    include/botcraft/Game/AssetsManager.hpp
    include/botcraft/Game/ManagersClient.hpp
    include/botcraft/Game/ConnectionClient.hpp
    include/botcraft/Game/Enums.hpp
    include/botcraft/Game/Model.hpp
    include/botcraft/Game/Vector3.hpp

    include/botcraft/Game/World/Biome.hpp
    include/botcraft/Game/World/Blockstate.hpp
    include/botcraft/Game/World/Chunk.hpp
    include/botcraft/Game/World/World.hpp

    include/botcraft/Game/Entities/EntityAttribute.hpp
    include/botcraft/Game/Entities/EntityManager.hpp
    include/botcraft/Game/Entities/GlobalPos.hpp
    include/botcraft/Game/Entities/LocalPlayer.hpp
    include/botcraft/Game/Entities/VillagerData.hpp
    include/botcraft/Game/Entities/entities/UnknownEntity.hpp

    include/botcraft/Game/Entities/entities/animal/allay/AllayEntity.hpp
    include/botcraft/Game/Entities/entities/AreaEffectCloudEntity.hpp
    include/botcraft/Game/Entities/entities/decoration/ArmorStandEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ArrowEntity.hpp
    include/botcraft/Game/Entities/entities/animal/axolotl/AxolotlEntity.hpp
    include/botcraft/Game/Entities/entities/ambient/BatEntity.hpp
    include/botcraft/Game/Entities/entities/animal/BeeEntity.hpp
    include/botcraft/Game/Entities/entities/monster/BlazeEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/BoatEntity.hpp
    include/botcraft/Game/Entities/entities/monster/breeze/BreezeEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/ChestBoatEntity.hpp
    include/botcraft/Game/Entities/entities/animal/CatEntity.hpp
    include/botcraft/Game/Entities/entities/animal/camel/CamelEntity.hpp
    include/botcraft/Game/Entities/entities/monster/CaveSpiderEntity.hpp
    include/botcraft/Game/Entities/entities/animal/ChickenEntity.hpp
    include/botcraft/Game/Entities/entities/animal/CodEntity.hpp
    include/botcraft/Game/Entities/entities/animal/CowEntity.hpp
    include/botcraft/Game/Entities/entities/monster/CreeperEntity.hpp
    include/botcraft/Game/Entities/entities/animal/DolphinEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/DonkeyEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/DragonFireballEntity.hpp
    include/botcraft/Game/Entities/entities/DisplayBlockDisplayEntity.hpp
    include/botcraft/Game/Entities/entities/DisplayEntity.hpp
    include/botcraft/Game/Entities/entities/DisplayItemDisplayEntity.hpp
    include/botcraft/Game/Entities/entities/DisplayTextDisplayEntity.hpp
    include/botcraft/Game/Entities/entities/monster/DrownedEntity.hpp
    include/botcraft/Game/Entities/entities/monster/ElderGuardianEntity.hpp
    include/botcraft/Game/Entities/entities/boss/enderdragon/EndCrystalEntity.hpp
    include/botcraft/Game/Entities/entities/boss/enderdragon/EnderDragonEntity.hpp
    include/botcraft/Game/Entities/entities/monster/EnderManEntity.hpp
    include/botcraft/Game/Entities/entities/monster/EndermiteEntity.hpp
    include/botcraft/Game/Entities/entities/monster/EvokerEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/EvokerFangsEntity.hpp
    include/botcraft/Game/Entities/entities/ExperienceOrbEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/EyeOfEnderEntity.hpp
    include/botcraft/Game/Entities/entities/item/FallingBlockEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/FireworkRocketEntity.hpp
    include/botcraft/Game/Entities/entities/animal/FoxEntity.hpp
    include/botcraft/Game/Entities/entities/animal/frog/FrogEntity.hpp
    include/botcraft/Game/Entities/entities/monster/GhastEntity.hpp
    include/botcraft/Game/Entities/entities/monster/GiantEntity.hpp
    include/botcraft/Game/Entities/entities/decoration/GlowItemFrameEntity.hpp
    include/botcraft/Game/Entities/entities/GlowSquidEntity.hpp
    include/botcraft/Game/Entities/entities/animal/goat/GoatEntity.hpp
    include/botcraft/Game/Entities/entities/monster/GuardianEntity.hpp
    include/botcraft/Game/Entities/entities/monster/hoglin/HoglinEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/HorseEntity.hpp
    include/botcraft/Game/Entities/entities/monster/HuskEntity.hpp
    include/botcraft/Game/Entities/entities/monster/IllusionerEntity.hpp
    include/botcraft/Game/Entities/entities/InteractionEntity.hpp
    include/botcraft/Game/Entities/entities/animal/IronGolemEntity.hpp
    include/botcraft/Game/Entities/entities/item/ItemEntity.hpp
    include/botcraft/Game/Entities/entities/decoration/ItemFrameEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/LargeFireballEntity.hpp
    include/botcraft/Game/Entities/entities/decoration/LeashFenceKnotEntity.hpp
    include/botcraft/Game/Entities/entities/LightningBoltEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/LlamaEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/LlamaSpitEntity.hpp
    include/botcraft/Game/Entities/entities/monster/MagmaCubeEntity.hpp
    include/botcraft/Game/Entities/entities/MarkerEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/MinecartEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/MinecartChestEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/MinecartCommandBlockEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/MinecartFurnaceEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/MinecartHopperEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/MinecartSpawnerEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/MinecartTNTEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/MuleEntity.hpp
    include/botcraft/Game/Entities/entities/animal/MushroomCowEntity.hpp
    include/botcraft/Game/Entities/entities/animal/OcelotEntity.hpp
    include/botcraft/Game/Entities/entities/decoration/PaintingEntity.hpp
    include/botcraft/Game/Entities/entities/animal/PandaEntity.hpp
    include/botcraft/Game/Entities/entities/animal/ParrotEntity.hpp
    include/botcraft/Game/Entities/entities/monster/PhantomEntity.hpp
    include/botcraft/Game/Entities/entities/monster/PigZombieEntity.hpp
    include/botcraft/Game/Entities/entities/animal/PigEntity.hpp
    include/botcraft/Game/Entities/entities/monster/piglin/PiglinEntity.hpp
    include/botcraft/Game/Entities/entities/monster/piglin/PiglinBruteEntity.hpp
    include/botcraft/Game/Entities/entities/monster/PillagerEntity.hpp
    include/botcraft/Game/Entities/entities/animal/PolarBearEntity.hpp
    include/botcraft/Game/Entities/entities/item/PrimedTntEntity.hpp
    include/botcraft/Game/Entities/entities/animal/PufferfishEntity.hpp
    include/botcraft/Game/Entities/entities/animal/RabbitEntity.hpp
    include/botcraft/Game/Entities/entities/monster/RavagerEntity.hpp
    include/botcraft/Game/Entities/entities/animal/SalmonEntity.hpp
    include/botcraft/Game/Entities/entities/animal/SheepEntity.hpp
    include/botcraft/Game/Entities/entities/monster/ShulkerEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ShulkerBulletEntity.hpp
    include/botcraft/Game/Entities/entities/monster/SilverfishEntity.hpp
    include/botcraft/Game/Entities/entities/monster/SkeletonEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/SkeletonHorseEntity.hpp
    include/botcraft/Game/Entities/entities/monster/SlimeEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/SmallFireballEntity.hpp
    include/botcraft/Game/Entities/entities/animal/sniffer/SnifferEntity.hpp
    include/botcraft/Game/Entities/entities/animal/SnowGolemEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/SnowballEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/SpectralArrowEntity.hpp
    include/botcraft/Game/Entities/entities/monster/SpiderEntity.hpp
    include/botcraft/Game/Entities/entities/animal/SquidEntity.hpp
    include/botcraft/Game/Entities/entities/monster/StrayEntity.hpp
    include/botcraft/Game/Entities/entities/monster/StriderEntity.hpp
    include/botcraft/Game/Entities/entities/animal/frog/TadpoleEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ThrownEggEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ThrownEnderpearlEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ThrownExperienceBottleEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ThrownPotionEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ThrownTridentEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/TraderLlamaEntity.hpp
    include/botcraft/Game/Entities/entities/animal/TropicalFishEntity.hpp
    include/botcraft/Game/Entities/entities/animal/TurtleEntity.hpp
    include/botcraft/Game/Entities/entities/monster/VexEntity.hpp
    include/botcraft/Game/Entities/entities/npc/VillagerEntity.hpp
    include/botcraft/Game/Entities/entities/monster/VindicatorEntity.hpp
    include/botcraft/Game/Entities/entities/npc/WanderingTraderEntity.hpp
    include/botcraft/Game/Entities/entities/monster/warden/WardenEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/WindChargeEntity.hpp
    include/botcraft/Game/Entities/entities/monster/WitchEntity.hpp
    include/botcraft/Game/Entities/entities/boss/wither/WitherBossEntity.hpp
    include/botcraft/Game/Entities/entities/monster/WitherSkeletonEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/WitherSkullEntity.hpp
    include/botcraft/Game/Entities/entities/animal/WolfEntity.hpp
    include/botcraft/Game/Entities/entities/monster/ZoglinEntity.hpp
    include/botcraft/Game/Entities/entities/monster/ZombieEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/ZombieHorseEntity.hpp
    include/botcraft/Game/Entities/entities/monster/ZombieVillagerEntity.hpp
    include/botcraft/Game/Entities/entities/monster/ZombifiedPiglinEntity.hpp
    include/botcraft/Game/Entities/entities/player/PlayerEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/FishingHookEntity.hpp
    include/botcraft/Game/Entities/entities/Entity.hpp
    include/botcraft/Game/Entities/entities/LivingEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/AbstractArrowEntity.hpp
    include/botcraft/Game/Entities/entities/animal/AnimalEntity.hpp
    include/botcraft/Game/Entities/entities/ambient/AmbientCreatureEntity.hpp
    include/botcraft/Game/Entities/entities/monster/MonsterEntity.hpp
    include/botcraft/Game/Entities/entities/TamableAnimalEntity.hpp
    include/botcraft/Game/Entities/entities/animal/AbstractSchoolingFishEntity.hpp
    include/botcraft/Game/Entities/entities/animal/WaterAnimalEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/AbstractChestedHorseEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/AbstractHurtingProjectileEntity.hpp
    include/botcraft/Game/Entities/entities/MobEntity.hpp
    include/botcraft/Game/Entities/entities/monster/SpellcasterIllagerEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ProjectileEntity.hpp
    include/botcraft/Game/Entities/entities/FlyingMobEntity.hpp
    include/botcraft/Game/Entities/entities/animal/horse/AbstractHorseEntity.hpp
    include/botcraft/Game/Entities/entities/animal/AbstractGolemEntity.hpp
    include/botcraft/Game/Entities/entities/decoration/HangingEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/FireballEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/VehicleEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/AbstractMinecartEntity.hpp
    include/botcraft/Game/Entities/entities/vehicle/AbstractMinecartContainerEntity.hpp
    include/botcraft/Game/Entities/entities/animal/ShoulderRidingEntity.hpp
    include/botcraft/Game/Entities/entities/monster/piglin/AbstractPiglinEntity.hpp
    include/botcraft/Game/Entities/entities/monster/AbstractIllagerEntity.hpp
    include/botcraft/Game/Entities/entities/animal/AbstractFishEntity.hpp
    include/botcraft/Game/Entities/entities/raid/RaiderEntity.hpp
    include/botcraft/Game/Entities/entities/monster/AbstractSkeletonEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ThrowableItemProjectileEntity.hpp
    include/botcraft/Game/Entities/entities/npc/AbstractVillagerEntity.hpp
    include/botcraft/Game/Entities/entities/AgeableMobEntity.hpp
    include/botcraft/Game/Entities/entities/PathfinderMobEntity.hpp
    include/botcraft/Game/Entities/entities/monster/PatrollingMonsterEntity.hpp
    include/botcraft/Game/Entities/entities/projectile/ThrowableProjectileEntity.hpp

    include/botcraft/Game/Inventory/Window.hpp
    include/botcraft/Game/Inventory/InventoryManager.hpp
    include/botcraft/Game/Inventory/Item.hpp

    include/botcraft/Game/Physics/AABB.hpp
    include/botcraft/Game/Physics/PhysicsManager.hpp

    include/botcraft/Network/NetworkManager.hpp
    include/botcraft/Network/LastSeenMessagesTracker.hpp

    include/botcraft/Utilities/DemanglingUtilities.hpp
    include/botcraft/Utilities/EnumUtilities.hpp
    include/botcraft/Utilities/Logger.hpp
    include/botcraft/Utilities/MiscUtilities.hpp
    include/botcraft/Utilities/NBTUtilities.hpp
    include/botcraft/Utilities/ScopeLockedWrapper.hpp
    include/botcraft/Utilities/SleepUtilities.hpp
    include/botcraft/Utilities/StdAnyUtilities.hpp
    include/botcraft/Utilities/Templates.hpp
)

set(botcraft_PRIVATE_HDR
    private_include/botcraft/Network/Authentifier.hpp
    private_include/botcraft/Network/AESEncrypter.hpp
    private_include/botcraft/Network/Compression.hpp
    private_include/botcraft/Network/TCP_Com.hpp

    private_include/botcraft/Network/DNS/DNSMessage.hpp
    private_include/botcraft/Network/DNS/DNSQuestion.hpp
    private_include/botcraft/Network/DNS/DNSResourceRecord.hpp
    private_include/botcraft/Network/DNS/DNSSrvData.hpp

    private_include/botcraft/Utilities/StringUtilities.hpp

    private_include/botcraft/Game/World/Section.hpp
)

set(botcraft_SRC
    src/AI/BaseNode.cpp
    src/AI/BehaviourClient.cpp
    src/AI/Blackboard.cpp
    src/AI/SimpleBehaviourClient.cpp

    src/AI/Tasks/BaseTasks.cpp
    src/AI/Tasks/DigTask.cpp
    src/AI/Tasks/EntitiesTasks.cpp
    src/AI/Tasks/InventoryTasks.cpp
    src/AI/Tasks/PathfindingTask.cpp

    src/Game/AssetsManager.cpp
    src/Game/ConnectionClient.cpp
    src/Game/Enums.cpp
    src/Game/ManagersClient.cpp
    src/Game/Model.cpp

    src/Game/World/Biome.cpp
    src/Game/World/Blockstate.cpp
    src/Game/World/Chunk.cpp
    src/Game/World/Section.cpp
    src/Game/World/World.cpp

    src/Game/Inventory/Window.cpp
    src/Game/Inventory/InventoryManager.cpp
    src/Game/Inventory/Item.cpp

    src/Game/Entities/EntityAttribute.cpp
    src/Game/Entities/EntityManager.cpp
    src/Game/Entities/LocalPlayer.cpp
    src/Game/Entities/entities/UnknownEntity.cpp

    src/Game/Entities/entities/animal/allay/AllayEntity.cpp
    src/Game/Entities/entities/AreaEffectCloudEntity.cpp
    src/Game/Entities/entities/decoration/ArmorStandEntity.cpp
    src/Game/Entities/entities/projectile/ArrowEntity.cpp
    src/Game/Entities/entities/animal/axolotl/AxolotlEntity.cpp
    src/Game/Entities/entities/ambient/BatEntity.cpp
    src/Game/Entities/entities/animal/BeeEntity.cpp
    src/Game/Entities/entities/monster/BlazeEntity.cpp
    src/Game/Entities/entities/vehicle/BoatEntity.cpp
    src/Game/Entities/entities/monster/breeze/BreezeEntity.cpp
    src/Game/Entities/entities/vehicle/ChestBoatEntity.cpp
    src/Game/Entities/entities/animal/CatEntity.cpp
    src/Game/Entities/entities/animal/camel/CamelEntity.cpp
    src/Game/Entities/entities/monster/CaveSpiderEntity.cpp
    src/Game/Entities/entities/animal/ChickenEntity.cpp
    src/Game/Entities/entities/animal/CodEntity.cpp
    src/Game/Entities/entities/animal/CowEntity.cpp
    src/Game/Entities/entities/monster/CreeperEntity.cpp
    src/Game/Entities/entities/animal/DolphinEntity.cpp
    src/Game/Entities/entities/animal/horse/DonkeyEntity.cpp
    src/Game/Entities/entities/projectile/DragonFireballEntity.cpp
    src/Game/Entities/entities/DisplayBlockDisplayEntity.cpp
    src/Game/Entities/entities/DisplayEntity.cpp
    src/Game/Entities/entities/DisplayItemDisplayEntity.cpp
    src/Game/Entities/entities/DisplayTextDisplayEntity.cpp
    src/Game/Entities/entities/monster/DrownedEntity.cpp
    src/Game/Entities/entities/monster/ElderGuardianEntity.cpp
    src/Game/Entities/entities/boss/enderdragon/EndCrystalEntity.cpp
    src/Game/Entities/entities/boss/enderdragon/EnderDragonEntity.cpp
    src/Game/Entities/entities/monster/EnderManEntity.cpp
    src/Game/Entities/entities/monster/EndermiteEntity.cpp
    src/Game/Entities/entities/monster/EvokerEntity.cpp
    src/Game/Entities/entities/projectile/EvokerFangsEntity.cpp
    src/Game/Entities/entities/ExperienceOrbEntity.cpp
    src/Game/Entities/entities/projectile/EyeOfEnderEntity.cpp
    src/Game/Entities/entities/item/FallingBlockEntity.cpp
    src/Game/Entities/entities/projectile/FireworkRocketEntity.cpp
    src/Game/Entities/entities/animal/FoxEntity.cpp
    src/Game/Entities/entities/animal/frog/FrogEntity.cpp
    src/Game/Entities/entities/monster/GhastEntity.cpp
    src/Game/Entities/entities/monster/GiantEntity.cpp
    src/Game/Entities/entities/decoration/GlowItemFrameEntity.cpp
    src/Game/Entities/entities/GlowSquidEntity.cpp
    src/Game/Entities/entities/animal/goat/GoatEntity.cpp
    src/Game/Entities/entities/monster/GuardianEntity.cpp
    src/Game/Entities/entities/monster/hoglin/HoglinEntity.cpp
    src/Game/Entities/entities/animal/horse/HorseEntity.cpp
    src/Game/Entities/entities/monster/HuskEntity.cpp
    src/Game/Entities/entities/monster/IllusionerEntity.cpp
    src/Game/Entities/entities/InteractionEntity.cpp
    src/Game/Entities/entities/animal/IronGolemEntity.cpp
    src/Game/Entities/entities/item/ItemEntity.cpp
    src/Game/Entities/entities/decoration/ItemFrameEntity.cpp
    src/Game/Entities/entities/projectile/LargeFireballEntity.cpp
    src/Game/Entities/entities/decoration/LeashFenceKnotEntity.cpp
    src/Game/Entities/entities/LightningBoltEntity.cpp
    src/Game/Entities/entities/animal/horse/LlamaEntity.cpp
    src/Game/Entities/entities/projectile/LlamaSpitEntity.cpp
    src/Game/Entities/entities/monster/MagmaCubeEntity.cpp
    src/Game/Entities/entities/MarkerEntity.cpp
    src/Game/Entities/entities/vehicle/MinecartEntity.cpp
    src/Game/Entities/entities/vehicle/MinecartChestEntity.cpp
    src/Game/Entities/entities/vehicle/MinecartCommandBlockEntity.cpp
    src/Game/Entities/entities/vehicle/MinecartFurnaceEntity.cpp
    src/Game/Entities/entities/vehicle/MinecartHopperEntity.cpp
    src/Game/Entities/entities/vehicle/MinecartSpawnerEntity.cpp
    src/Game/Entities/entities/vehicle/MinecartTNTEntity.cpp
    src/Game/Entities/entities/animal/horse/MuleEntity.cpp
    src/Game/Entities/entities/animal/MushroomCowEntity.cpp
    src/Game/Entities/entities/animal/OcelotEntity.cpp
    src/Game/Entities/entities/decoration/PaintingEntity.cpp
    src/Game/Entities/entities/animal/PandaEntity.cpp
    src/Game/Entities/entities/animal/ParrotEntity.cpp
    src/Game/Entities/entities/monster/PhantomEntity.cpp
    src/Game/Entities/entities/monster/PigZombieEntity.cpp
    src/Game/Entities/entities/animal/PigEntity.cpp
    src/Game/Entities/entities/monster/piglin/PiglinEntity.cpp
    src/Game/Entities/entities/monster/piglin/PiglinBruteEntity.cpp
    src/Game/Entities/entities/monster/PillagerEntity.cpp
    src/Game/Entities/entities/animal/PolarBearEntity.cpp
    src/Game/Entities/entities/item/PrimedTntEntity.cpp
    src/Game/Entities/entities/animal/PufferfishEntity.cpp
    src/Game/Entities/entities/animal/RabbitEntity.cpp
    src/Game/Entities/entities/monster/RavagerEntity.cpp
    src/Game/Entities/entities/animal/SalmonEntity.cpp
    src/Game/Entities/entities/animal/SheepEntity.cpp
    src/Game/Entities/entities/monster/ShulkerEntity.cpp
    src/Game/Entities/entities/projectile/ShulkerBulletEntity.cpp
    src/Game/Entities/entities/monster/SilverfishEntity.cpp
    src/Game/Entities/entities/monster/SkeletonEntity.cpp
    src/Game/Entities/entities/animal/horse/SkeletonHorseEntity.cpp
    src/Game/Entities/entities/monster/SlimeEntity.cpp
    src/Game/Entities/entities/projectile/SmallFireballEntity.cpp
    src/Game/Entities/entities/animal/sniffer/SnifferEntity.cpp
    src/Game/Entities/entities/animal/SnowGolemEntity.cpp
    src/Game/Entities/entities/projectile/SnowballEntity.cpp
    src/Game/Entities/entities/projectile/SpectralArrowEntity.cpp
    src/Game/Entities/entities/monster/SpiderEntity.cpp
    src/Game/Entities/entities/animal/SquidEntity.cpp
    src/Game/Entities/entities/monster/StrayEntity.cpp
    src/Game/Entities/entities/monster/StriderEntity.cpp
    src/Game/Entities/entities/animal/frog/TadpoleEntity.cpp
    src/Game/Entities/entities/projectile/ThrownEggEntity.cpp
    src/Game/Entities/entities/projectile/ThrownEnderpearlEntity.cpp
    src/Game/Entities/entities/projectile/ThrownExperienceBottleEntity.cpp
    src/Game/Entities/entities/projectile/ThrownPotionEntity.cpp
    src/Game/Entities/entities/projectile/ThrownTridentEntity.cpp
    src/Game/Entities/entities/animal/horse/TraderLlamaEntity.cpp
    src/Game/Entities/entities/animal/TropicalFishEntity.cpp
    src/Game/Entities/entities/animal/TurtleEntity.cpp
    src/Game/Entities/entities/monster/VexEntity.cpp
    src/Game/Entities/entities/npc/VillagerEntity.cpp
    src/Game/Entities/entities/monster/VindicatorEntity.cpp
    src/Game/Entities/entities/npc/WanderingTraderEntity.cpp
    src/Game/Entities/entities/projectile/WindChargeEntity.cpp
    src/Game/Entities/entities/monster/warden/WardenEntity.cpp
    src/Game/Entities/entities/monster/WitchEntity.cpp
    src/Game/Entities/entities/boss/wither/WitherBossEntity.cpp
    src/Game/Entities/entities/monster/WitherSkeletonEntity.cpp
    src/Game/Entities/entities/projectile/WitherSkullEntity.cpp
    src/Game/Entities/entities/animal/WolfEntity.cpp
    src/Game/Entities/entities/monster/ZoglinEntity.cpp
    src/Game/Entities/entities/monster/ZombieEntity.cpp
    src/Game/Entities/entities/animal/horse/ZombieHorseEntity.cpp
    src/Game/Entities/entities/monster/ZombieVillagerEntity.cpp
    src/Game/Entities/entities/monster/ZombifiedPiglinEntity.cpp
    src/Game/Entities/entities/player/PlayerEntity.cpp
    src/Game/Entities/entities/projectile/FishingHookEntity.cpp
    src/Game/Entities/entities/Entity.cpp
    src/Game/Entities/entities/LivingEntity.cpp
    src/Game/Entities/entities/projectile/AbstractArrowEntity.cpp
    src/Game/Entities/entities/animal/AnimalEntity.cpp
    src/Game/Entities/entities/ambient/AmbientCreatureEntity.cpp
    src/Game/Entities/entities/monster/MonsterEntity.cpp
    src/Game/Entities/entities/TamableAnimalEntity.cpp
    src/Game/Entities/entities/animal/AbstractSchoolingFishEntity.cpp
    src/Game/Entities/entities/animal/WaterAnimalEntity.cpp
    src/Game/Entities/entities/animal/horse/AbstractChestedHorseEntity.cpp
    src/Game/Entities/entities/projectile/AbstractHurtingProjectileEntity.cpp
    src/Game/Entities/entities/MobEntity.cpp
    src/Game/Entities/entities/monster/SpellcasterIllagerEntity.cpp
    src/Game/Entities/entities/projectile/ProjectileEntity.cpp
    src/Game/Entities/entities/FlyingMobEntity.cpp
    src/Game/Entities/entities/animal/horse/AbstractHorseEntity.cpp
    src/Game/Entities/entities/animal/AbstractGolemEntity.cpp
    src/Game/Entities/entities/decoration/HangingEntity.cpp
    src/Game/Entities/entities/projectile/FireballEntity.cpp
    src/Game/Entities/entities/vehicle/AbstractMinecartEntity.cpp
    src/Game/Entities/entities/vehicle/AbstractMinecartContainerEntity.cpp
    src/Game/Entities/entities/vehicle/VehicleEntity.cpp
    src/Game/Entities/entities/animal/ShoulderRidingEntity.cpp
    src/Game/Entities/entities/monster/piglin/AbstractPiglinEntity.cpp
    src/Game/Entities/entities/monster/AbstractIllagerEntity.cpp
    src/Game/Entities/entities/animal/AbstractFishEntity.cpp
    src/Game/Entities/entities/raid/RaiderEntity.cpp
    src/Game/Entities/entities/monster/AbstractSkeletonEntity.cpp
    src/Game/Entities/entities/projectile/ThrowableItemProjectileEntity.cpp
    src/Game/Entities/entities/npc/AbstractVillagerEntity.cpp
    src/Game/Entities/entities/AgeableMobEntity.cpp
    src/Game/Entities/entities/PathfinderMobEntity.cpp
    src/Game/Entities/entities/monster/PatrollingMonsterEntity.cpp
    src/Game/Entities/entities/projectile/ThrowableProjectileEntity.cpp

    src/Game/Physics/AABB.cpp
    src/Game/Physics/PhysicsManager.cpp

    src/Network/AESEncrypter.cpp
    src/Network/Authentifier.cpp
    src/Network/Compression.cpp
    src/Network/LastSeenMessagesTracker.cpp
    src/Network/NetworkManager.cpp
    src/Network/TCP_Com.cpp

    src/Utilities/DemanglingUtilities.cpp
    src/Utilities/Logger.cpp
    src/Utilities/NBTUtilities.cpp
    src/Utilities/SleepUtilities.cpp
    src/Utilities/StdAnyUtilities.cpp
    src/Utilities/StringUtilities.cpp
)

if(BOTCRAFT_USE_OPENGL_GUI)
    list(APPEND botcraft_PUBLIC_HDR
            include/botcraft/Renderer/RenderingManager.hpp
            include/botcraft/Renderer/Enums.hpp
            include/botcraft/Renderer/Face.hpp
            include/botcraft/Renderer/Transformation.hpp
    )

    list(APPEND botcraft_PRIVATE_HDR
            private_include/botcraft/Renderer/Atlas.hpp
            private_include/botcraft/Renderer/BehaviourRenderer.hpp
            private_include/botcraft/Renderer/BlockRenderable.hpp
            private_include/botcraft/Renderer/Camera.hpp
            private_include/botcraft/Renderer/Chunk.hpp
            private_include/botcraft/Renderer/Entity.hpp
            private_include/botcraft/Renderer/ImageSaver.hpp
            private_include/botcraft/Renderer/Shader.hpp
            private_include/botcraft/Renderer/TransparentChunk.hpp
            private_include/botcraft/Renderer/WorldRenderer.hpp
    )

    list(APPEND botcraft_SRC
            src/Renderer/Atlas.cpp
            src/Renderer/BehaviourRenderer.cpp
            src/Renderer/BlockRenderable.cpp
            src/Renderer/Camera.cpp
            src/Renderer/Chunk.cpp
            src/Renderer/Entity.cpp
            src/Renderer/RenderingManager.cpp
            src/Renderer/Face.cpp
            src/Renderer/ImageSaver.cpp
            src/Renderer/Shader.cpp
            src/Renderer/Transformation.cpp
            src/Renderer/TransparentChunk.cpp
            src/Renderer/WorldRenderer.cpp
    )
endif(BOTCRAFT_USE_OPENGL_GUI)


# To have a nice files structure in Visual Studio
if(MSVC)
    foreach(source IN LISTS botcraft_PUBLIC_HDR)
        get_filename_component(source_path_header "${source}" PATH)
        string(REPLACE "include/botcraft" "Header Files/public" source_path_header "${source_path_header}")
        string(REPLACE "/" "\\" source_path_msvc "${source_path_header}")
        source_group("${source_path_msvc}" FILES "${source}")
    endforeach()

    foreach(source IN LISTS botcraft_PRIVATE_HDR)
        get_filename_component(source_path_header "${source}" PATH)
        string(REPLACE "private_include/botcraft" "Header Files/private" source_path_header "${source_path_header}")
        string(REPLACE "/" "\\" source_path_msvc "${source_path_header}")
        source_group("${source_path_msvc}" FILES "${source}")
    endforeach()

    foreach(source IN LISTS botcraft_SRC)
        get_filename_component(source_path "${source}" PATH)
        string(REPLACE "src" "Source Files" source_path "${source_path}")
        string(REPLACE "/" "\\" source_path_msvc "${source_path}")
        source_group("${source_path_msvc}" FILES "${source}")
    endforeach()
endif()

add_library(botcraft SHARED ${botcraft_SRC} ${botcraft_PUBLIC_HDR} ${botcraft_PRIVATE_HDR})
set_property(TARGET botcraft PROPERTY CXX_STANDARD 17)
set_target_properties(botcraft PROPERTIES DEBUG_POSTFIX "_d")
set_target_properties(botcraft PROPERTIES RELWITHDEBINFO_POSTFIX "_rd")

# Enable precompiled headers, except on GCC because it's hurting performances
if (BOTCRAFT_USE_PRECOMPILED_HEADERS AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    target_precompile_headers(botcraft PRIVATE
        include/botcraft/Game/Entities/entities/Entity.hpp
        ${protocolCraft_SOURCE_DIR}/include/protocolCraft/AllMessages.hpp
    )
endif()

if(MSVC)
    # To avoid having folder for each configuration when building with Visual
    set_target_properties(botcraft PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BOTCRAFT_OUTPUT_DIR}/lib")
    set_target_properties(botcraft PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BOTCRAFT_OUTPUT_DIR}/lib")
    set_target_properties(botcraft PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BOTCRAFT_OUTPUT_DIR}/lib")
    set_target_properties(botcraft PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${BOTCRAFT_OUTPUT_DIR}/lib")
else()
    set_target_properties(botcraft PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${BOTCRAFT_OUTPUT_DIR}/bin")
    set_target_properties(botcraft PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${BOTCRAFT_OUTPUT_DIR}/lib")
endif(MSVC)

if (MSVC)
    target_compile_options(botcraft PRIVATE "$<$<CONFIG:Debug>:/bigobj>")
endif (MSVC)

# Set version header
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in" "${CMAKE_CURRENT_BINARY_DIR}/include/botcraft/Version.hpp")

if (WIN32)
    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_mc_assets.bat.in" "${CMAKE_CURRENT_BINARY_DIR}/download_mc_assets.bat")
else()
    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_mc_assets.sh.in" "${CMAKE_CURRENT_BINARY_DIR}/download_mc_assets.sh")
endif (WIN32)

# Add include folders
target_include_directories(botcraft
    PUBLIC
        "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
        "$<INSTALL_INTERFACE:include>"
    PRIVATE
        "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/private_include>"
        )

target_compile_definitions(botcraft PRIVATE ASSETS_PATH="${ASSET_DIR}")

# Add DL lib for linux compilation
target_link_libraries(botcraft PUBLIC ${CMAKE_DL_LIBS})

# Add protocolCraft
target_link_libraries(botcraft PUBLIC protocolCraft)

if (WIN32 AND BOTCRAFT_WINDOWS_BETTER_SLEEP)
    target_link_libraries(botcraft PRIVATE winmm.lib)
    target_compile_definitions(botcraft PRIVATE BETTER_SLEEP=1)
endif()

# Add Asio
target_link_libraries(botcraft PRIVATE asio)
target_compile_definitions(botcraft PRIVATE ASIO_STANDALONE)

# Add threads support
target_link_libraries(botcraft PUBLIC Threads::Threads)

# Add graphical dependencies
if(BOTCRAFT_USE_OPENGL_GUI)
    target_link_libraries(botcraft PRIVATE glfw glad glm rectpack2D OpenGL::GL stb_image)
    if(BOTCRAFT_USE_IMGUI)
        target_link_libraries(botcraft PRIVATE imgui)
        target_compile_definitions(botcraft PRIVATE USE_IMGUI=1)
    endif()
    target_compile_definitions(botcraft PUBLIC USE_GUI=1)
endif(BOTCRAFT_USE_OPENGL_GUI)

if(BOTCRAFT_COMPRESSION)
    target_link_libraries(botcraft PRIVATE ZLIB::ZLIB)
    target_compile_definitions(botcraft PRIVATE USE_COMPRESSION=1)
endif(BOTCRAFT_COMPRESSION)

if(BOTCRAFT_ENCRYPTION)
    target_link_libraries(botcraft PRIVATE OpenSSL::SSL)
    target_link_libraries(botcraft PRIVATE OpenSSL::Crypto)
    target_compile_definitions(botcraft PRIVATE USE_ENCRYPTION=1)
endif(BOTCRAFT_ENCRYPTION)

if(WIN32 AND MINGW)
    target_link_libraries(botcraft PRIVATE ws2_32 crypt32)
    # Copy dll from the compiler folder
    get_filename_component(COMPILER_FOLDER ${CMAKE_CXX_COMPILER} DIRECTORY)
    add_custom_command(TARGET botcraft POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${COMPILER_FOLDER}/libstdc++-6.dll"
            $<TARGET_FILE_DIR:botcraft>)
endif()

# Installation stuff
include(GNUInstallDirs)

install(TARGETS botcraft
    EXPORT botcraft-targets
    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
    LIBRARY DESTINATION "${CMAKE_INSTALL_BINDIR}"
    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
)

if (NOT BOTCRAFT_INSTALL_MC_ASSETS)
    if (WIN32)
        install(FILES
            "${CMAKE_CURRENT_BINARY_DIR}/download_mc_assets.bat"
            DESTINATION "${CMAKE_INSTALL_BINDIR}"
        )
    else()
        install(FILES
            "${CMAKE_CURRENT_BINARY_DIR}/download_mc_assets.sh"
            DESTINATION "${CMAKE_INSTALL_BINDIR}"
        )
    endif (WIN32)
endif(NOT BOTCRAFT_INSTALL_MC_ASSETS)

install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/botcraft"
    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)

install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/include/botcraft/Version.hpp"
    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/botcraft"
)

install(EXPORT botcraft-targets
    FILE botcraft-targets.cmake
    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/botcraft"
)

include(CMakePackageConfigHelpers)

configure_package_config_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/botcraft-config.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake/botcraft-config.cmake"
    INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/botcraft"
)

install(
    FILES
        "${CMAKE_CURRENT_BINARY_DIR}/cmake/botcraft-config.cmake"
    DESTINATION
        "${CMAKE_INSTALL_LIBDIR}/cmake/botcraft"
)

export(EXPORT botcraft-targets
    FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/botcraft-targets.cmake"
)

# Copy asset files into install binary folder
if (BOTCRAFT_INSTALL_MC_ASSETS)
    install(DIRECTORY "${BOTCRAFT_OUTPUT_DIR}/bin/Assets/${BOTCRAFT_GAME_VERSION}"
        DESTINATION "${CMAKE_INSTALL_BINDIR}/Assets"
    )
else()
    install(DIRECTORY "${BOTCRAFT_OUTPUT_DIR}/bin/Assets/${BOTCRAFT_GAME_VERSION}"
        DESTINATION "${CMAKE_INSTALL_BINDIR}/Assets"
        PATTERN "minecraft" EXCLUDE
    )
endif(BOTCRAFT_INSTALL_MC_ASSETS)

# Copy Mingw libstdc++ dll
if(WIN32 AND MINGW)
    install(FILES
        "${BOTCRAFT_OUTPUT_DIR}/bin/libstdc++-6.dll"
        DESTINATION "${CMAKE_INSTALL_BINDIR}"
    )
endif()
