void save_player(Player* p_, bool on_exit = true) {
if (p_->tankIDName.empty() or p_->discord.empty()) return;
if (saving_ and p_->saved_on_close) {
cout << "already saved" << endl;
return;
}
//saveall
struct tm newtime;
time_t now = time(0);
localtime_s(&newtime, &now);
p_->lo = "" + to_string(newtime.tm_mon + 1) + "/" + to_string(today_day) + "/2022 " + to_string(newtime.tm_hour) + ":" + (newtime.tm_min < 10 ? "0" + to_string(newtime.tm_min) + "" : "" + to_string(newtime.tm_min)) + ":" + to_string(newtime.tm_sec) + "";
json save_, achievements_ = json::array(), friends_ = json::array(), inv_ = json::array(), visited_worlds_ = json::array(), worlds_owned_ = json::array(), playmods_ = json::array();
save_["name"] = p_->tankIDName;
save_["n"] = p_->n;
save_["adminLevel"] = p_->adminLevel;
save_["m_h"] = p_->m_h;
save_["cc"] = p_->cc;
save_["isNew"] = p_->isNew;
save_["breakPoint"] = p_->breakPoint;
save_["bans"] = p_->bans;
save_["discord_code"] = p_->discord_code;
save_["promo"] = p_->promo;
save_["license"] = p_->license;
save_["clist"] = p_->clist;
save_["w_w"] = p_->w_w;
save_["w_d"] = p_->w_d;
save_["mer"] = p_->mercy;
save_["drtt"] = p_->drtitle;
save_["_drt"] = p_->drt;
save_["dnr"] = p_->donor;
save_["mst"] = p_->master;
save_["lvl125"] = p_->lvl125;
save_["radio"] = p_->radio;
save_["fa_ip"] = p_->fa_ip;
save_["2fa"] = p_->fa2;
save_["modname"] = p_->modName;
save_["autofarm"] = p_->autofarm;
save_["find_item_collect"] = p_->find_item_collect;
save_["flagset"] = p_->flagset;
save_["skl"] = p_->surgery_skill;
save_["guild_id"] = p_->guild_id;
save_["sgt"] = p_->surgery_type;
save_["sd"] = p_->surgery_done;
save_["su1"] = p_->su_8552_1;
save_["su2"] = p_->su_8552_2;
save_["vipused_potion"] = p_->vipused_potion;
save_["egg"] = p_->egg;
save_["glo"] = p_->glo;
//save_["logs"] = p_->logs;
save_["b_t"] = p_->b_t;
save_["b_b"] = p_->b_b;
save_["dd"] = p_->dd;
save_["lo"] = p_->lo;
save_["ip"] = p_->ip;
save_["b_s"] = p_->b_s;
save_["b_r"] = p_->b_r;
save_["b_ra"] = p_->b_ra;
save_["i_11818_1"] = p_->i_11818_1;
save_["i_11818_2"] = p_->i_11818_2;
save_["b_lvl"] = p_->b_lvl;
save_["b_i"] = p_->b_i;
save_["b_a"] = p_->b_a;
save_["b_w"] = p_->b_w;
save_["b_p"] = p_->b_p;
save_["m_r"] = p_->m_r;
save_["m_b"] = p_->m_b;
save_["note"] = p_->note;
save_["supp"] = p_->supp;
save_["hs"] = p_->hs;
save_["dds"] = p_->dds;
save_["tk"] = p_->tk;
save_["bb"] = p_->bb;
save_["gtwl"] = p_->gtwl;
save_["rb"] = p_->rb;
save_["mds"] = p_->mds;
save_["gr"] = p_->gr;
save_["gp"] = p_->gp;
save_["gd"] = p_->gd;
save_["glo_p"] = p_->glo_p;
save_["lvl_p"] = p_->lvl_p;
save_["t_p"] = p_->t_p;
save_["bb_p"] = p_->bb_p;
save_["ff_p"] = p_->ff_p;
save_["p_p"] = p_->p_p;
save_["g_p"] = p_->g_p;
save_["t_xp"] = p_->t_xp;
save_["bb_xp"] = p_->bb_xp;
save_["ff_xp"] = p_->ff_xp;
save_["s_xp"] = p_->s_xp;
save_["g_xp"] = p_->g_xp;
save_["p_xp"] = p_->p_xp;
save_["t_lvl"] = p_->t_lvl;
save_["bb_lvl"] = p_->bb_lvl;
save_["ff_lvl"] = p_->ff_lvl;
save_["g_lvl"] = p_->g_lvl;
save_["p_lvl"] = p_->p_lvl;
save_["s_lvl"] = p_->s_lvl;
save_["b_l"] = p_->b_l;
save_["bp"] = p_->bp;
save_["flagmay"] = p_->flagmay;
save_["pass"] = p_->tankIDPass, save_["discord"] = p_->discord;
save_["gems"] = p_->gems;
save_["punch"] = p_->punch_count;
save_["home_world"] = p_->home_world;
save_["show_location"] = p_->show_location_;
save_["show_notifications"] = p_->show_friend_notifications_;
save_["xp"] = p_->xp;
save_["d_name"] = p_->d_name;
save_["level"] = p_->level;
save_["skin"] = p_->skin;
save_["geiger"] = p_->geiger_;
save_["ghost"] = p_->ghost;
save_["invis"] = p_->invis;
save_["date"] = p_->account_created;
save_["booty_broken"] = p_->booty_broken;
save_["playtime"] = p_->seconds + (time(NULL) - p_->playtime);
save_["legend"] = p_->is_legend;
save_["roleSkin"] = p_->roleSkin;
save_["roleIcon"] = p_->roleIcon;
save_["mac"] = p_->mac;
save_["rid"] = p_->rid;
save_["vid"] = p_->vid;
save_["aid"] = p_->aid;
save_["gid"] = p_->gid;
save_["pid"] = p_->platformid;
save_["wk"] = p_->wk;
for (int i_ = 0; i_ < p_->inv.size(); i_++) {
json item_;
item_["i"] = p_->inv[i_].id;
item_["c"] = p_->inv[i_].count;
inv_.push_back(item_);
}
map<string, int>::iterator it;
for (it = p_->achievements.begin(); it != p_->achievements.end(); it++) {
json achievement_;
achievement_["title"] = it->first;
achievement_["progress"] = it->second;
achievements_.push_back(achievement_);
} for (int i_ = 0; i_ < p_->friends.size(); i_++) {
json friend_;
friend_["name"] = p_->friends[i_].name;
friend_["mute"] = p_->friends[i_].mute;
friend_["block_trade"] = p_->friends[i_].block_trade;
friend_["last_seen"] = p_->friends[i_].last_seen;
friends_.push_back(friend_);
} for (int i_ = 0; i_ < p_->last_visited_worlds.size(); i_++) {
json world_;
world_["name"] = p_->last_visited_worlds[i_];
visited_worlds_.push_back(world_);
} for (int i_ = 0; i_ < p_->worlds_owned.size(); i_++) {
json world_;
world_["name"] = p_->worlds_owned[i_];
worlds_owned_.push_back(world_);
} for (int i_ = 0; i_ < p_->playmods.size(); i_++) {
json playmod_;
playmod_["id"] = p_->playmods[i_].id;
playmod_["time"] = p_->playmods[i_].time;
playmod_["user"] = p_->playmods[i_].user;
playmods_.push_back(playmod_);
}
json blarneys_ = json::array();
for (int i_ = 0; i_ < p_->completed_blarneys.size(); i_++) {
json blarney_;
blarney_["world"] = p_->completed_blarneys[i_][0];
blarney_["time"] = p_->completed_blarneys[i_][1];
blarneys_.push_back(blarney_);
}
save_["blarney"] = blarneys_;
save_["playmods"] = playmods_;
save_["worlds_owned"] = worlds_owned_;
save_["last_worlds"] = visited_worlds_;
save_["inv"] = inv_;
save_["achievements"] = achievements_;
save_["friends"] = friends_;
save_["hair"] = p_->hair, save_["shirt"] = p_->shirt, save_["pants"] = p_->pants, save_["feet"] = p_->feet, save_["face"] = p_->face, save_["hand"] = p_->hand, save_["back"] = p_->back, save_["mask"] = p_->mask, save_["necklace"] = p_->necklace, save_["ances"] = p_->ances;
ofstream w_("database/players/" + p_->tankIDName + "_.json");
if (w_.fail()) {
cout << "failed to save player " << p_->tankIDName << endl;
return;
}
w_ << save_ << endl;
w_.close();
{
if (on_exit) {
vector<string> friends_;
long long time_t = time(NULL);
for (int c_ = 0; c_ < p_->friends.size(); c_++) {
friends_.push_back(p_->friends[c_].name);
} for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) {
if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue;
if (pInfo(currentPeer)->m_h == 1) continue;
if (pInfo(currentPeer)->invis == true) continue;
if (find(friends_.begin(), friends_.end(), pInfo(currentPeer)->tankIDName) != friends_.end()) {
for (int d_ = 0; d_ < pInfo(currentPeer)->friends.size(); d_++) {
if (pInfo(currentPeer)->friends[d_].name == p_->tankIDName) {
pInfo(currentPeer)->friends[d_].last_seen = time_t;
break;
}
}
if (not p_->invis and not p_->m_h) {
if (pInfo(currentPeer)->show_friend_notifications_) {
packet_(currentPeer, "action|play_sfx\nfile|audio/friend_logoff.wav\ndelayMS|0");
string color = "`o";
if (p_->name_color == "`6@" or p_->name_color == "`#@") color = p_->name_color;
gamepacket_t p;
p.Insert("OnConsoleMessage");
p.Insert("`3FRIEND ALERT:`` " + color + p_->tankIDName + "`` has `4logged off``.");
p.CreatePacket(currentPeer);
}
}
friends_.erase(remove(friends_.begin(), friends_.end(), pInfo(currentPeer)->tankIDName), friends_.end());
}
}
try {
for (int c_ = 0; c_ < friends_.size(); c_++) {
string path_ = "database/players/" + friends_.at(c_) + "_.json";
//if (exists(path_)) {
if (_access_s(path_.c_str(), 0) == 0) {
json r_;
ifstream f_(path_, ifstream::binary);
if (f_.fail()) {
cout << "failed reading data for " << friends_.at(c_) << endl;
return;
}
f_ >> r_;
f_.close();
json f_g = r_.at("friends").get<json>();
for (int i_ = 0; i_ < f_g.size(); i_++) {
if (f_g.at(i_).at("name") == p_->tankIDName) {
f_g.at(i_).at("last_seen") = time_t;
break;
}
}
r_.at("friends") = f_g;
{
ofstream f_(path_, ifstream::binary);
f_ << r_;
f_.close();
}
}
}
}
catch (exception)
{
return;
}
}
}
}