Implemented saving gruntwork results to file.

* Monkey Skyway paths are now saved in a format compatible with
paths.json
* flush() is called on every periodic DB save in addition to the /flush
and /mss N export commands
* Monkeys now accept WIP routes
This commit is contained in:
dongresource 2020-10-06 21:53:21 +02:00
parent ce58411ff8
commit d4d0f388c4
9 changed files with 108 additions and 17 deletions

View File

@ -37,6 +37,8 @@ xdtdata=tdata/xdt.json
mobdata=tdata/mobs.json
# path json
pathdata=tdata/paths.json
# gruntwork output (this is what you submit)
gruntwork=tdata/gruntwork.json
# account permission level that will be set upon character creation
# 1 = default, will allow *all* commands

View File

@ -6,6 +6,7 @@
#include "CNShared.hpp"
#include "settings.hpp"
#include "Database.hpp"
#include "TableData.hpp" // for flush()
#include <iostream>
#include <sstream>
@ -56,6 +57,7 @@ void CNShardServer::periodicSaveTimer(CNServer* serv, time_t currTime) {
Database::updatePlayer(pair.second.plr);
}
TableData::flush();
std::cout << "[INFO] Done." << std::endl;
}

View File

@ -99,7 +99,7 @@ void mssCommand(std::string full, std::vector<std::string>& args, CNSocket* sock
if (args.size() < 3) {
ChatManager::sendServerMessage(sock, "[MSS] Too few arguments");
ChatManager::sendServerMessage(sock, "[MSS] Usage: /mss <route> <add/remove/goto/clear/test/export> <<height>>");
ChatManager::sendServerMessage(sock, "[MSS] Usage: /mss <route> <add/remove/goto/clear/test> <<height>>");
return;
}
@ -167,26 +167,16 @@ void mssCommand(std::string full, std::vector<std::string>& args, CNSocket* sock
return;
}
// IMPROMPTU LERP
int speed = 1500; // TODO: make this adjustable
std::queue<WarpLocation> path;
WarpLocation last = route->front(); // start pos
PlayerManager::sendPlayerTo(sock, last.x, last.y, last.z); // send the player to the start of the path
for (int i = 1; i < route->size(); i++) {
WarpLocation coords = route->at(i);
TransportManager::lerp(&path, last, coords, speed);
path.push(coords); // add keyframe to the queue
last = coords; // update start pos
}
TransportManager::SkywayQueues[sock] = path;
WarpLocation pulled = route->front();
PlayerManager::sendPlayerTo(sock, pulled.x, pulled.y, pulled.z);
TransportManager::testMssRoute(sock, route);
return;
}
// mss <route> export
// for compatibility: mss <route> export
if (args[2] == "export") {
ChatManager::sendServerMessage(sock, "[MSS] export on " + std::to_string(routeNum));
// TODO: dump route to tdata
TableData::flush();
return;
}
@ -195,6 +185,11 @@ void mssCommand(std::string full, std::vector<std::string>& args, CNSocket* sock
}
void flushCommand(std::string full, std::vector<std::string>& args, CNSocket* sock) {
ChatManager::sendServerMessage(sock, "Wrote gruntwork to " + settings::GRUNTWORKJSON);
TableData::flush();
}
void ChatManager::init() {
REGISTER_SHARD_PACKET(P_CL2FE_REQ_SEND_FREECHAT_MESSAGE, chatHandler);
REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_AVATAR_EMOTES_CHAT, emoteHandler);
@ -204,6 +199,7 @@ void ChatManager::init() {
registerCommand("access", 100, accessCommand);
// TODO: add help command
registerCommand("mss", 30, mssCommand);
registerCommand("flush", 30, flushCommand);
registerCommand("level", 50, levelCommand);
registerCommand("population", 100, populationCommand);
}

View File

@ -196,6 +196,8 @@ void TableData::init() {
std::cerr << "[WARN] Malformed mobs.json file! Reason:" << err.what() << std::endl;
}
loadGruntwork();
NPCManager::nextId = nextId;
}
@ -290,7 +292,6 @@ void TableData::constructPathSkyway(nlohmann::json::iterator _pathData) {
}
void TableData::constructPathSlider(nlohmann::json points, int rotations, int sliderID) {
std::queue<WarpLocation> route;
std::rotate(points.begin(), points.begin() + rotations, points.end()); // rotate points
nlohmann::json::iterator _point = points.begin(); // iterator
@ -336,3 +337,64 @@ void TableData::constructPathNPC(nlohmann::json::iterator _pathData) {
}
TransportManager::NPCQueues[pathData["iNPCID"]] = points;
}
// load gruntwork output; if it exists
void TableData::loadGruntwork() {
try {
std::ifstream inFile(settings::GRUNTWORKJSON);
nlohmann::json gruntwork;
// skip if there's no gruntwork to load
if (inFile.fail())
return;
inFile >> gruntwork;
// skyway paths
auto skyway = gruntwork["skyway"];
for (auto _route = skyway.begin(); _route != skyway.end(); _route++) {
auto route = _route.value();
std::vector<WarpLocation> points;
for (auto _point = route["points"].begin(); _point != route["points"].end(); _point++) {
auto point = _point.value();
points.push_back(WarpLocation{point["x"], point["y"], point["z"]});
}
RunningSkywayRoutes[(int)route["iRouteID"]] = points;
}
std::cout << "[INFO] Loaded gruntwork.json" << std::endl;
}
catch (const std::exception& err) {
std::cerr << "[WARN] Malformed gruntwork.json file! Reason:" << err.what() << std::endl;
}
}
// write gruntwork output to file
void TableData::flush() {
std::ofstream file(settings::GRUNTWORKJSON);
nlohmann::json gruntwork;
for (auto& pair : RunningSkywayRoutes) {
nlohmann::json route;
route["iRouteID"] = (int)pair.first;
route["iMonkeySpeed"] = 1500; // TODO
std::cout << "serializing mss route " << (int)pair.first << std::endl;
for (WarpLocation& point : pair.second) {
nlohmann::json tmp;
tmp["x"] = point.x;
tmp["y"] = point.y;
tmp["z"] = point.z;
route["points"].push_back(tmp);
}
gruntwork["skyway"].push_back(route);
}
file << gruntwork << std::endl;
}

View File

@ -9,6 +9,8 @@ namespace TableData {
void init();
void cleanup();
void loadGruntwork();
void flush();
int getItemType(int);
void loadPaths(int*);

View File

@ -3,6 +3,7 @@
#include "PlayerManager.hpp"
#include "NanoManager.hpp"
#include "TransportManager.hpp"
#include "TableData.hpp"
#include <unordered_map>
#include <cmath>
@ -157,6 +158,12 @@ void TransportManager::transportWarpHandler(CNSocket* sock, CNPacketData* data)
NanoManager::summonNano(sock, -1); // make sure that no nano is active during the ride
SkywayQueues[sock] = SkywayPaths[route.mssRouteNum]; // set socket point queue to route
break;
} else if (TableData::RunningSkywayRoutes.find(route.mssRouteNum) != TableData::RunningSkywayRoutes.end()) {
std::vector<WarpLocation>* _route = &TableData::RunningSkywayRoutes[route.mssRouteNum];
NanoManager::summonNano(sock, -1);
testMssRoute(sock, _route);
break;
}
// refund and send alert packet
@ -184,6 +191,21 @@ void TransportManager::transportWarpHandler(CNSocket* sock, CNPacketData* data)
sock->sendPacket((void*)&resp, P_FE2CL_REP_PC_WARP_USE_TRANSPORTATION_SUCC, sizeof(sP_FE2CL_REP_PC_WARP_USE_TRANSPORTATION_SUCC));
}
void TransportManager::testMssRoute(CNSocket *sock, std::vector<WarpLocation>* route) {
int speed = 1500; // TODO: make this adjustable
std::queue<WarpLocation> path;
WarpLocation last = route->front(); // start pos
for (int i = 1; i < route->size(); i++) {
WarpLocation coords = route->at(i);
TransportManager::lerp(&path, last, coords, speed);
path.push(coords); // add keyframe to the queue
last = coords; // update start pos
}
SkywayQueues[sock] = path;
}
void TransportManager::tickTransportationSystem(CNServer* serv, time_t currTime) {
stepNPCPathing();
stepSkywaySystem();

View File

@ -30,6 +30,8 @@ namespace TransportManager {
void transportRegisterLocationHandler(CNSocket*, CNPacketData*);
void transportWarpHandler(CNSocket*, CNPacketData*);
void testMssRoute(CNSocket *sock, std::vector<WarpLocation>* route);
void tickTransportationSystem(CNServer*, time_t);
void stepNPCPathing();
void stepSkywaySystem();

View File

@ -24,6 +24,7 @@ std::string settings::NPCJSON = "tdata/NPCs.json";
std::string settings::XDTJSON = "tdata/xdt.json";
std::string settings::MOBJSON = "tdata/mobs.json";
std::string settings::PATHJSON = "tdata/paths.json";
std::string settings::GRUNTWORKJSON = "tdata/gruntwork.json";
std::string settings::MOTDSTRING = "Welcome to OpenFusion!";
int settings::ACCLEVEL = 1;
@ -56,6 +57,7 @@ void settings::init() {
XDTJSON = reader.Get("shard", "xdtdata", XDTJSON);
MOBJSON = reader.Get("shard", "mobdata", MOBJSON);
PATHJSON = reader.Get("shard", "pathdata", PATHJSON);
GRUNTWORKJSON = reader.Get("shard", "gruntwork", GRUNTWORKJSON);
MOTDSTRING = reader.Get("shard", "motd", MOTDSTRING);
ACCLEVEL = reader.GetInteger("shard", "accountlevel", ACCLEVEL);
}

View File

@ -20,6 +20,7 @@ namespace settings {
extern std::string XDTJSON;
extern std::string MOBJSON;
extern std::string PATHJSON;
extern std::string GRUNTWORKJSON;
void init();
}