Major refactoring - internal server state machine implemented
This commit is contained in:
1 parent
71c654e5b6
commit
66e93d46f4
48 files changed
+3948
-3696
No files matched your search
+83
-206
@@ -2,6 +2,76 @@
|
||||
|
||||
namespace FRG {
|
||||
|
||||
extern const char* CONST_ZIP_FILE;
|
||||
|
||||
namespace {
|
||||
nlohmann::json saveCar(const NpcCar& car)
|
||||
{
|
||||
nlohmann::json waypoints = nlohmann::json::array();
|
||||
for (const auto& waypoint : car.waypoints)
|
||||
waypoints.push_back(
|
||||
{{"x", waypoint.x()}, {"y", waypoint.y()}, {"z", waypoint.z()}});
|
||||
return {
|
||||
{"position", {car.position.x(), car.position.y(), car.position.z()}},
|
||||
{"rotation", car.rotation},
|
||||
{"velocity", car.velocity},
|
||||
{"steeringAngle", car.steeringAngle},
|
||||
{"wheelAngle", car.wheelAngle},
|
||||
{"mode", static_cast<int>(car.mode)},
|
||||
{"waypoints", std::move(waypoints)},
|
||||
{"currentWaypoint", car.currentWaypoint}
|
||||
};
|
||||
}
|
||||
|
||||
void loadCar(NpcCar& car, const nlohmann::json& value)
|
||||
{
|
||||
const auto& position = value.at("position");
|
||||
car.position = {
|
||||
position.at(0).get<float>(),
|
||||
position.at(1).get<float>(),
|
||||
position.at(2).get<float>()};
|
||||
car.rotation = value.at("rotation").get<float>();
|
||||
car.velocity = value.at("velocity").get<float>();
|
||||
car.steeringAngle = value.at("steeringAngle").get<float>();
|
||||
car.wheelAngle = value.at("wheelAngle").get<float>();
|
||||
car.mode = static_cast<NpcCar::Mode>(value.at("mode").get<int>());
|
||||
car.waypoints.clear();
|
||||
for (const auto& waypoint : value.at("waypoints"))
|
||||
car.waypoints.push_back({
|
||||
waypoint.at("x").get<float>(),
|
||||
waypoint.at("y").get<float>(),
|
||||
waypoint.at("z").get<float>()});
|
||||
car.currentWaypoint = value.at("currentWaypoint").get<std::size_t>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::vector<Eigen::Vector3f> LocationState::planPathExceptMyself(const Eigen::Vector3f& start, const Eigen::Vector3f& end, const std::string& entityId) const
|
||||
{
|
||||
return navigationMaps[activeNavigationIndex].findPathToNearest(start, end, {});
|
||||
}
|
||||
|
||||
void LocationState::initNavigation(const std::vector<std::string>& paths)
|
||||
{
|
||||
const int savedActiveNavigationIndex = activeNavigationIndex;
|
||||
//navigationMapPaths = paths;
|
||||
navigationMaps.clear();
|
||||
navigationMaps.resize(paths.size());
|
||||
|
||||
for (size_t i = 0; i < paths.size(); ++i) {
|
||||
// Service the OS message queue between builds so the window doesn't
|
||||
// get flagged as "not responding" while loading many navigation grids.
|
||||
SDL_PumpEvents();
|
||||
navigationMaps[i].build(paths[i], CONST_ZIP_FILE);
|
||||
}
|
||||
|
||||
activeNavigationIndex =
|
||||
savedActiveNavigationIndex >= 0 &&
|
||||
savedActiveNavigationIndex < static_cast<int>(navigationMaps.size())
|
||||
? savedActiveNavigationIndex
|
||||
: 0;
|
||||
}
|
||||
|
||||
void LocationState::save(nlohmann::json& out) const
|
||||
{
|
||||
out["cameraAzimuth"] = cameraAzimuth;
|
||||
@@ -9,99 +79,14 @@ void LocationState::save(nlohmann::json& out) const
|
||||
|
||||
out["activeNavigationIndex"] = activeNavigationIndex;
|
||||
|
||||
out["targetInteractiveObjectIndex"] = targetInteractiveObjectIndex;
|
||||
out["targetInteractNpcIndex"] = targetInteractNpcIndex;
|
||||
out["targetTeleportZoneIndex"] = targetTeleportZoneIndex;
|
||||
out["targetInteractiveObjectId"] = targetInteractiveObjectId;
|
||||
out["targetInteractNpcId"] = targetInteractNpcId;
|
||||
out["targetTeleportZoneId"] = targetTeleportZoneId;
|
||||
|
||||
out["isDarklands"] = isDarklands;
|
||||
out["isNight"] = isNight;
|
||||
out["isDawn"] = isDawn;
|
||||
|
||||
|
||||
|
||||
// Taxi stuff:
|
||||
nlohmann::json taxiJson;
|
||||
|
||||
taxiJson["taxiCar"] = {
|
||||
{"positionX", taxiCar.position.x()},
|
||||
{"positionY", taxiCar.position.y()},
|
||||
{"positionZ", taxiCar.position.z()},
|
||||
{"rotation", taxiCar.rotation},
|
||||
{"velocity", taxiCar.velocity},
|
||||
{"steeringAngle", taxiCar.steeringAngle},
|
||||
{"mode", static_cast<int>(taxiCar.mode)},
|
||||
{"waypoints", nlohmann::json::array()},
|
||||
{"currentWaypoint", taxiCar.currentWaypoint},
|
||||
{"waypointReachRadius", taxiCar.waypointReachRadius}
|
||||
out["taxi"] = {
|
||||
{"car", saveCar(taxiCar)},
|
||||
{"arrivedCallbackCalled", taxiArrivedCallbackCalled}
|
||||
};
|
||||
|
||||
nlohmann::json taxiWaypoints = nlohmann::json::array();
|
||||
|
||||
for (int i = 0; i < taxiCar.waypoints.size(); ++i) {
|
||||
taxiWaypoints.push_back({
|
||||
{"x", taxiCar.waypoints[i].x()},
|
||||
{"y", taxiCar.waypoints[i].y()},
|
||||
{"z", taxiCar.waypoints[i].z()}
|
||||
});
|
||||
}
|
||||
|
||||
taxiJson["taxiCar"]["waypoints"] = std::move(taxiWaypoints);
|
||||
|
||||
taxiJson["taxiCarInitialState"] = {
|
||||
{"positionX", taxiCarInitialState.position.x()},
|
||||
{"positionY", taxiCarInitialState.position.y()},
|
||||
{"positionZ", taxiCarInitialState.position.z()},
|
||||
{"rotation", taxiCarInitialState.rotation},
|
||||
{"velocity", taxiCarInitialState.velocity},
|
||||
{"steeringAngle", taxiCarInitialState.steeringAngle},
|
||||
{"mode", static_cast<int>(taxiCarInitialState.mode)},
|
||||
{"waypoints", nlohmann::json::array()},
|
||||
{"currentWaypoint", taxiCarInitialState.currentWaypoint},
|
||||
{"waypointReachRadius", taxiCarInitialState.waypointReachRadius}
|
||||
};
|
||||
|
||||
nlohmann::json taxiInitialWaypoints = nlohmann::json::array();
|
||||
|
||||
for (int i = 0; i < taxiCarInitialState.waypoints.size(); ++i) {
|
||||
taxiInitialWaypoints.push_back({
|
||||
{"x", taxiCarInitialState.waypoints[i].x()},
|
||||
{"y", taxiCarInitialState.waypoints[i].y()},
|
||||
{"z", taxiCarInitialState.waypoints[i].z()}
|
||||
});
|
||||
}
|
||||
|
||||
taxiJson["taxiCarInitialState"]["waypoints"] = std::move(taxiInitialWaypoints);
|
||||
|
||||
nlohmann::json taxiDefaultWaypoints = nlohmann::json::array();
|
||||
|
||||
for (int i = 0; i < taxiCarWaypoints.size(); ++i) {
|
||||
taxiDefaultWaypoints.push_back({
|
||||
{"x", taxiCarWaypoints[i].x()},
|
||||
{"y", taxiCarWaypoints[i].y()},
|
||||
{"z", taxiCarWaypoints[i].z()}
|
||||
});
|
||||
}
|
||||
|
||||
taxiJson["taxiDefaultWaypoints"] = taxiDefaultWaypoints;
|
||||
|
||||
/* taxiCarTriggerPosition = Eigen::Vector3f(
|
||||
taxiJson.value("taxiCarTriggerPositionX", 0.f),
|
||||
taxiJson.value("taxiCarTriggerPositionY", 0.f),
|
||||
taxiJson.value("taxiCarTriggerPositionZ", 0.f)
|
||||
);*/
|
||||
|
||||
taxiJson["taxiCarTriggerPositionX"] = taxiCarTriggerPosition.x();
|
||||
taxiJson["taxiCarTriggerPositionY"] = taxiCarTriggerPosition.y();
|
||||
taxiJson["taxiCarTriggerPositionZ"] = taxiCarTriggerPosition.z();
|
||||
|
||||
// {"y", taxiCarTriggerPosition.y()},
|
||||
// {"z", taxiCarTriggerPosition.z()}
|
||||
//};
|
||||
|
||||
taxiJson["taxiArrivedCallbackCalled"] = taxiArrivedCallbackCalled;
|
||||
|
||||
//questJournal.save(questJson);
|
||||
out["taxi"] = std::move(taxiJson);
|
||||
}
|
||||
|
||||
void LocationState::load(const nlohmann::json& in)
|
||||
@@ -113,122 +98,14 @@ void LocationState::load(const nlohmann::json& in)
|
||||
|
||||
activeNavigationIndex = in.value("activeNavigationIndex", activeNavigationIndex);
|
||||
|
||||
targetInteractiveObjectIndex = in.value("targetInteractiveObjectIndex", -1);
|
||||
targetInteractNpcIndex = in.value("targetInteractNpcIndex", -1);
|
||||
targetTeleportZoneIndex = in.value("targetTeleportZoneIndex", -1);
|
||||
|
||||
isDarklands = in.value("isDarklands", false);
|
||||
isNight = in.value("isNight", false);
|
||||
isDawn = in.value("isDawn", false);
|
||||
|
||||
|
||||
//logger() << "LocationState::load step 2" << std::endl;
|
||||
|
||||
nlohmann::json taxiJson = in["taxi"];
|
||||
|
||||
taxiArrivedCallbackCalled = taxiJson.value("taxiArrivedCallbackCalled", false);
|
||||
|
||||
//----- Taxi State ----
|
||||
|
||||
nlohmann::json taxiCarJson = taxiJson["taxiCar"];
|
||||
|
||||
taxiCar.position = Eigen::Vector3f(
|
||||
taxiCarJson.value("positionX", 0.f),
|
||||
taxiCarJson.value("positionY", 0.f),
|
||||
taxiCarJson.value("positionZ", 0.f)
|
||||
);
|
||||
|
||||
//logger() << "LocationState::load step 3" << std::endl;
|
||||
|
||||
taxiCar.rotation = taxiCarJson.value("rotation", 0.f);
|
||||
|
||||
taxiCar.velocity = taxiCarJson.value("velocity", 0.f);
|
||||
|
||||
taxiCar.steeringAngle = taxiCarJson.value("steeringAngle", 0.f);
|
||||
|
||||
taxiCar.mode = static_cast<NpcCar::Mode>(taxiCarJson.value("mode", 0));
|
||||
|
||||
//logger() << "LocationState::load step 4" << std::endl;
|
||||
|
||||
taxiCar.waypoints.clear();
|
||||
if (taxiCarJson.contains("waypoints") && taxiCarJson["waypoints"].is_array()) {
|
||||
for (int i = 0; i < static_cast<int>(taxiCarJson["waypoints"].size()); ++i)
|
||||
taxiCar.waypoints.push_back(Eigen::Vector3f(
|
||||
taxiCarJson["waypoints"][i].value("x", 0.f),
|
||||
taxiCarJson["waypoints"][i].value("y", 0.f),
|
||||
taxiCarJson["waypoints"][i].value("z", 0.f)
|
||||
));
|
||||
}
|
||||
|
||||
//logger() << "LocationState::load step 5" << std::endl;
|
||||
|
||||
taxiCar.currentWaypoint = taxiCarJson.value("currentWaypoint", 0);
|
||||
taxiCar.waypointReachRadius = taxiCarJson.value("waypointReachRadius", 3.f);
|
||||
taxiCar.wheelAngle = taxiCarJson.value("wheelAngle", 0.f);
|
||||
|
||||
|
||||
//--------- Taxi initial state -----
|
||||
|
||||
//logger() << "LocationState::load step 6" << std::endl;
|
||||
|
||||
nlohmann::json taxiCarInitialStateJson = taxiJson["taxiCarInitialState"];
|
||||
|
||||
taxiCarInitialState.position = Eigen::Vector3f(
|
||||
taxiCarInitialStateJson.value("positionX", 0.f),
|
||||
taxiCarInitialStateJson.value("positionY", 0.f),
|
||||
taxiCarInitialStateJson.value("positionZ", 0.f)
|
||||
);
|
||||
|
||||
taxiCarInitialState.rotation = taxiCarInitialStateJson.value("rotation", 0.f);
|
||||
|
||||
taxiCarInitialState.velocity = taxiCarInitialStateJson.value("velocity", 0.f);
|
||||
|
||||
taxiCarInitialState.steeringAngle = taxiCarInitialStateJson.value("steeringAngle", 0.f);
|
||||
|
||||
taxiCarInitialState.mode = static_cast<NpcCar::Mode>(taxiCarInitialStateJson.value("mode", 0));
|
||||
|
||||
//logger() << "LocationState::load step 7" << std::endl;
|
||||
|
||||
|
||||
taxiCarInitialState.waypoints.clear();
|
||||
if (taxiCarInitialStateJson.contains("waypoints") && taxiCarInitialStateJson["waypoints"].is_array()) {
|
||||
for (int i = 0; i < static_cast<int>(taxiCarInitialStateJson["waypoints"].size()); ++i)
|
||||
taxiCarInitialState.waypoints.push_back(Eigen::Vector3f(
|
||||
taxiCarInitialStateJson["waypoints"][i].value("x", 0.f),
|
||||
taxiCarInitialStateJson["waypoints"][i].value("y", 0.f),
|
||||
taxiCarInitialStateJson["waypoints"][i].value("z", 0.f)
|
||||
));
|
||||
}
|
||||
|
||||
//logger() << "LocationState::load step 8" << std::endl;
|
||||
|
||||
taxiCarInitialState.currentWaypoint = taxiCarInitialStateJson.value("currentWaypoint", 0);
|
||||
taxiCarInitialState.waypointReachRadius = taxiCarInitialStateJson.value("waypointReachRadius", 3.f);
|
||||
taxiCarInitialState.wheelAngle = taxiCarInitialStateJson.value("wheelAngle", 0.f);
|
||||
|
||||
|
||||
|
||||
taxiCarWaypoints.clear();
|
||||
if (taxiJson.contains("taxiDefaultWaypoints") && taxiJson["taxiDefaultWaypoints"].is_array()) {
|
||||
for (int i = 0; i < static_cast<int>(taxiJson["taxiDefaultWaypoints"].size()); ++i)
|
||||
taxiCarWaypoints.push_back(Eigen::Vector3f(
|
||||
taxiJson["taxiDefaultWaypoints"][i].value("x", 0.f),
|
||||
taxiJson["taxiDefaultWaypoints"][i].value("y", 0.f),
|
||||
taxiJson["taxiDefaultWaypoints"][i].value("z", 0.f)
|
||||
));
|
||||
}
|
||||
|
||||
//logger() << "LocationState::load step 9" << std::endl;
|
||||
|
||||
taxiCarTriggerPosition = Eigen::Vector3f(
|
||||
taxiJson.value("taxiCarTriggerPositionX", 0.f),
|
||||
taxiJson.value("taxiCarTriggerPositionY", 0.f),
|
||||
taxiJson.value("taxiCarTriggerPositionZ", 0.f)
|
||||
);
|
||||
|
||||
//logger() << "LocationState::load step 10" << std::endl;
|
||||
|
||||
targetInteractiveObjectId = in.value("targetInteractiveObjectId", std::string());
|
||||
targetInteractNpcId = in.value("targetInteractNpcId", std::string());
|
||||
targetTeleportZoneId = in.value("targetTeleportZoneId", std::string());
|
||||
|
||||
const auto& taxi = in.at("taxi");
|
||||
loadCar(taxiCar, taxi.at("car"));
|
||||
taxiArrivedCallbackCalled =
|
||||
taxi.at("arrivedCallbackCalled").get<bool>();
|
||||
}
|
||||
|
||||
} // namespace FRG
|
||||
Reference in new issue
Block a user