From 08029fdd2e226e1f872fc2600fe54bacacafcb0d Mon Sep 17 00:00:00 2001 From: tovjemam Date: Tue, 26 May 2026 21:17:38 +0200 Subject: [PATCH] Map locations, marker_tuning and destructibles not destroying each other --- src/assets/map.cpp | 16 ++++++++++++++++ src/assets/map.hpp | 7 +++++++ src/collision/object_info.hpp | 7 ++++--- src/game/drivable_vehicle.cpp | 17 ++++++++++------- src/game/drivable_vehicle.hpp | 2 ++ src/game/marker.cpp | 2 +- src/game/openworld.cpp | 5 ++++- src/game/vehicle.cpp | 2 +- src/game/world.cpp | 8 ++++++++ src/gameview/markerview.cpp | 2 +- 10 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/assets/map.cpp b/src/assets/map.cpp index 22a2e5d..53a6688 100644 --- a/src/assets/map.cpp +++ b/src/assets/map.cpp @@ -41,6 +41,15 @@ const assets::MapGraph* assets::Map::GetGraph(const std::string& name) const return nullptr; } +std::span assets::Map::GetLocations(const std::string& name) const +{ + auto it = locations_.find(name); + if (it == locations_.end()) + return std::span(); + + return it->second; +} + // MapLoader assets::MapLoader::MapLoader(const std::string& filename) @@ -281,6 +290,13 @@ void assets::MapLoader::LoadStructs() graph_edges.emplace_back(from_idx, to_idx); } + else if (command == "loc") + { + std::string loc_name; + iss >> loc_name; + Transform& trans = map_->locations_[loc_name].emplace_back().transform; + ParseTransform(iss, trans); + } return true; }); diff --git a/src/assets/map.hpp b/src/assets/map.hpp index c9ae60e..e32fe76 100644 --- a/src/assets/map.hpp +++ b/src/assets/map.hpp @@ -51,6 +51,11 @@ struct MapGraph std::vector nbs; }; +struct MapLocation +{ + Transform transform; +}; + class Map { public: @@ -61,12 +66,14 @@ public: const std::vector& GetChunks() const { return chunks_; } const std::vector& GetStaticObjects() const { return objs_; } const MapGraph* GetGraph(const std::string& name) const; + std::span GetLocations(const std::string& name) const; private: std::shared_ptr basemodel_; std::vector chunks_; std::vector objs_; std::map graphs_; + std::map> locations_; friend class MapLoader; }; diff --git a/src/collision/object_info.hpp b/src/collision/object_info.hpp index ccd743b..4d68336 100644 --- a/src/collision/object_info.hpp +++ b/src/collision/object_info.hpp @@ -17,9 +17,10 @@ using ObjectFlags = int; enum ObjectFlag : ObjectFlags { - OF_DESTRUCTIBLE = 0x01, - OF_NOTIFY_CONTACT = 0x02, - OF_USABLE = 0x04, + OF_DESTRUCTIBLE = 1, + OF_NOTIFY_CONTACT = 2, + OF_USABLE = 4, + OF_DESTRUCTING = 8, }; struct ContactInfo diff --git a/src/game/drivable_vehicle.cpp b/src/game/drivable_vehicle.cpp index 7dfd7ec..80cdcd3 100644 --- a/src/game/drivable_vehicle.cpp +++ b/src/game/drivable_vehicle.cpp @@ -8,6 +8,15 @@ game::DrivableVehicle::DrivableVehicle(World& world, const VehicleTuning& tuning OnPhysicsChanged(); } +void game::DrivableVehicle::Update() +{ + float daytime = world_.GetDayTime(); + SetLightsOn(seats_[0].occupant && (daytime < 6.0f || daytime > 18.0f)); + + Super::Update(); + +} + void game::DrivableVehicle::SetTuning(const VehicleTuning& tuning) { Super::SetTuning(tuning); @@ -63,14 +72,8 @@ bool game::DrivableVehicle::SetPassenger(uint32_t seat_idx, ControllableCharacte if (seat_idx == 0) { - if (character) + if (!character) { - SetLightsOn(true); - } - else - { - SetLightsOn(false); - // clear inputs SetInputs(0); SetSteering(false, 0.0f); diff --git a/src/game/drivable_vehicle.hpp b/src/game/drivable_vehicle.hpp index b5cdc0f..40ba32e 100644 --- a/src/game/drivable_vehicle.hpp +++ b/src/game/drivable_vehicle.hpp @@ -20,6 +20,8 @@ public: DrivableVehicle(World& world, const VehicleTuning& tuning); + virtual void Update() override; + virtual void SetTuning(const VehicleTuning& tuning) override; virtual void OnPhysicsChanged() override; diff --git a/src/game/marker.cpp b/src/game/marker.cpp index 93b1f99..3158ff7 100644 --- a/src/game/marker.cpp +++ b/src/game/marker.cpp @@ -51,7 +51,7 @@ void game::Marker::SetUseTarget(const std::string& name, MarkerQueryCallback que { query_obj_ = std::make_unique(); - static btSphereShape query_sphere(1.0f); + static btSphereShape query_sphere(0.01f); query_obj_->setCollisionShape(&query_sphere); query_obj_->setWorldTransform(root_.local.ToBtTransform()); query_obj_->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE); diff --git a/src/game/openworld.cpp b/src/game/openworld.cpp index 32bcee1..ed7e057 100644 --- a/src/game/openworld.cpp +++ b/src/game/openworld.cpp @@ -82,7 +82,10 @@ game::OpenWorld::OpenWorld(Game& game) : EnterableWorld("openworld"), game_(game daytime_offset_ = static_cast(rand() % 24); - CreateTuningGarage(glm::vec3(0.0f, 0.0f, 0.0f), 0.0f); + for (auto locs = GetMap().GetLocations("tuning"); const auto& loc : locs) + { + CreateTuningGarage(loc.transform.position, glm::eulerAngles(loc.transform.rotation).x); + } } diff --git a/src/game/vehicle.cpp b/src/game/vehicle.cpp index ee45042..5cd0c8c 100644 --- a/src/game/vehicle.cpp +++ b/src/game/vehicle.cpp @@ -633,7 +633,7 @@ game::VehiclePhysics::VehiclePhysics(collision::DynamicsWorld& world, Transform& body_ = std::make_unique(rb_info); // body_->setActivationState(DISABLE_DEACTIVATION); - collision::SetObjectInfo(body_.get(), collision::OT_ENTITY, collision::OF_NOTIFY_CONTACT, &obj_cb); + collision::SetObjectInfo(body_.get(), collision::OT_ENTITY, collision::OF_NOTIFY_CONTACT | collision::OF_DESTRUCTING, &obj_cb); // setup vehicle btRaycastVehicle::btVehicleTuning bt_tuning; diff --git a/src/game/world.cpp b/src/game/world.cpp index 697468e..3b8a64b 100644 --- a/src/game/world.cpp +++ b/src/game/world.cpp @@ -198,6 +198,14 @@ void game::World::HandleContacts() if (type == collision::OT_MAP_OBJECT && (flags & collision::OF_DESTRUCTIBLE)) { + collision::ObjectType other_type; + collision::ObjectFlags other_flags; + collision::ObjectCallback* other_cb; + collision::GetObjectInfo(other_body, other_type, other_flags, other_cb); + + if ((other_flags & collision::OF_DESTRUCTING) == 0) + return; + auto col = dynamic_cast(cb); if (!col) return; diff --git a/src/gameview/markerview.cpp b/src/gameview/markerview.cpp index 2531d40..7d40c42 100644 --- a/src/gameview/markerview.cpp +++ b/src/gameview/markerview.cpp @@ -51,7 +51,7 @@ bool game::view::MarkerView::Init(net::InMessage& msg) if (marker_type_ == MARKER_FOOT || marker_type_ == MARKER_VEHICLE) { - model_ = assets::CacheManager::GetModel("data/marker.mdl"); + model_ = assets::CacheManager::GetModel("data/marker_tuning.mdl"); } return true;