Untitled
unknown
plain_text
2 years ago
249 kB
6
Indexable
/* * this fucking shit source fixed by Ametsa#7777 * removed backdoors * exploits fixed * dupes fixed * crash fixed * removed useless things * performance increased */ #include <string> #include <fstream> #include <thread> #include <atomic> #include <iostream> #include <vector> #include "enet/include/enet.h" #include <nlohmann/json.hpp> #include "Item.h" #include "Base.h" #include "Player.h" #include "Packet.h" #include "Guilds.h" #include "World.h" #pragma comment(lib, "Ws2_32.lib") vector<thread> threads; BOOL WINAPI ConsoleHandler(DWORD dwType) { switch (dwType) { case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: case CTRL_CLOSE_EVENT: { trigger_save_(); return TRUE; } default: { break; } } return FALSE; } void autofarming(ENetPeer* peer) { int items21 = pInfo(peer)->farmable; int c_ = 0; modify_inventory(peer, items21, c_); if (pInfo(peer)->save_time + 20 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { if (pInfo(peer)->save_time != 0) { if (pInfo(peer)->autofarm == 1 && c_ >= 2) { if (pInfo(peer)->y / 32 == pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32, items21); } else if (pInfo(peer)->x / 32 == pInfo(peer)->x / 32) { if (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 || pInfo(peer)->y / 32 < pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 ? 1 : -1), 18); } } else if (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 || pInfo(peer)->y / 32 > pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 ? -1 : 1), 18); } } pInfo(peer)->save_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } } } void autofarming2(ENetPeer* peer) { if (pInfo(peer)->autofarm == 1) { if (pInfo(peer)->save_time + 20 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { if (pInfo(peer)->save_time != 0) { if (pInfo(peer)->y / 32 == pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32, 18); } else if (pInfo(peer)->x / 32 == pInfo(peer)->x / 32) { if (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 || pInfo(peer)->y / 32 < pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 ? 1 : -1), 18); } } else if (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 || pInfo(peer)->y / 32 > pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 ? -1 : 1), 18); } } } autofarming(peer); pInfo(peer)->save_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } } void magfarming(ENetPeer* peer) { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->machines.size(); i_++) { WorldMachines machine = world_->machines[i_]; WorldBlock* itemas = &world_->blocks[machine.x + (machine.y * 100)]; if (itemas->magnetron and itemas->id == pInfo(peer)->magnetron_id) { if (itemas->pr > 0) { int items22 = itemas->id; itemas->pr--; //int items21 = data_.plantingTree; //edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32, 18); if (pInfo(peer)->autofarm2 == 1) { if (pInfo(peer)->y / 32 == pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32, items22); edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -2 : 2), pInfo(peer)->y / 32, items22); } else if (pInfo(peer)->x / 32 == pInfo(peer)->x / 32) { if (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 || pInfo(peer)->y / 32 < pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 ? 1 : -1), 18); edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 ? 2 : -2), 18); } } else if (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 || pInfo(peer)->y / 32 > pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 ? -1 : 1), 18); edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -2 : 2), pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 ? -2 : 2), 18); } } } } } } } void magfarming2(ENetPeer* peer) { //edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32, 18); if (pInfo(peer)->autofarm2 == 1) { if (pInfo(peer)->y / 32 == pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32, 18); edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -2 : 2), pInfo(peer)->y / 32, 18); } else if (pInfo(peer)->x / 32 == pInfo(peer)->x / 32) { if (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 || pInfo(peer)->y / 32 < pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 ? 1 : -1), 18); edit_tile(peer, pInfo(peer)->x / 32, pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 > pInfo(peer)->y / 32 ? 2 : -2), 18); } } else if (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 || pInfo(peer)->y / 32 > pInfo(peer)->y / 32) { edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -1 : 1), pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 ? -1 : 1), 18); edit_tile(peer, pInfo(peer)->x / 32 + (pInfo(peer)->state == 16 ? -2 : 2), pInfo(peer)->y / 32 + (pInfo(peer)->y / 32 < pInfo(peer)->y / 32 ? -2 : 2), 18); } magfarming(peer); } } void checkauto() { while (true) { auto start = std::chrono::steady_clock::now(); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED || currentPeer->data == NULL) continue; auto peerInfo = pInfo(currentPeer); if (peerInfo->autofarm2 && peerInfo->magnetron_id >= 1) { magfarming2(currentPeer); } if (!peerInfo->world.empty() && peerInfo->autofarm) { autofarming2(currentPeer); } } auto end = std::chrono::steady_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); // Sleep only if the execution time was less than 300 milliseconds if (duration < std::chrono::milliseconds(300)) { std::this_thread::sleep_for(std::chrono::milliseconds(300) - duration); } } } long long last_time = 0, last_guild_save = time(NULL) + 60, last_time_ = 0, last_time2_ = 0, last_hm_time = 0;// , last_growganoth_time = 0; void loop_worlds() { long long ms_time = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count(); if (last_hm_time - ms_time <= 0) { last_hm_time = ms_time + 60000; for (int i = 0; i < monitors.size(); i++) { string name_ = monitors[i].world_name; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; WorldBlock* monitor = &world_->blocks[monitors[i].x + (monitors[i].y * 100)]; if (!items[monitor->fg].heart_monitor) { monitors.erase(monitors.begin() + i); i--; continue; } monitors[i].active = 0; string find_mon = monitor->heart_monitor; if (find_mon.size() >= 2) find_mon.resize(find_mon.size() - 2); // remove `` is galo 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)->name_color + pInfo(currentPeer)->tankIDName == find_mon) { monitors[i].active = 1; break; } } PlayerMoving data_{}; data_.packetType = 5, data_.punchX = monitors[i].x, data_.punchY = monitors[i].y, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, monitor)); BYTE* blc = raw + 56; form_visual(blc, *monitor, *world_, NULL, false, false, monitors[i].x, monitors[i].y); 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)->world == world_->name) { send_raw(currentPeer, 4, raw, 112 + alloc_(world_, monitor), ENET_PACKET_FLAG_RELIABLE); } } delete[] raw, blc; } } } if (last_time2_ - ms_time <= 0 && restart_server_status) { gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("`4Global System Message``: Restarting server for update in `4"+to_string(restart_server_time) + "`` minutes"); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue; packet_(currentPeer, "action|play_sfx\nfile|audio/ogg/suspended.ogg\ndelayMS|700"); p.CreatePacket(currentPeer); } restart_server_time -= 1; if (restart_server_time == 0) { last_time2_ = ms_time + 10000, restart_server_status_seconds = true, restart_server_status = false; restart_server_time = 50; } else last_time2_ = ms_time + 60000; } if (restart_server_status_seconds && last_time2_ - ms_time <= 0) { for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue; gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("`4Global System Message``: Restarting server for update in `4" + (restart_server_time > 0 ? to_string(restart_server_time) : "ZERO") + "`` seconds" + (restart_server_time > 0 ? "" : "! Should be back up in a minute or so. BYE!") + ""); p.CreatePacket(currentPeer); } last_time2_ = ms_time + 10000; if (restart_server_time == 0) { restart_server_status_seconds = false; trigger_save_(); } restart_server_time -= 10; } if (last_world_menu - ms_time <= 0) { active_world_list = ""; active_world_list.clear(); sort(top_active_worlds.begin(), top_active_worlds.end()); reverse(top_active_worlds.begin(), top_active_worlds.end()); top_active_worlds.resize((top_active_worlds.size() >= 24 ? 24 : top_active_worlds.size())); active_world_list += "\nadd_floater|MARKET|-1|0.55|3412738303"; for (uint8_t i = 0; i < top_active_worlds.size(); i++) { int w_cz = 0; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != top_active_worlds[i].second) continue; w_cz++; } if (top_active_worlds[i].second == "MARKET") continue; active_world_list += "\nadd_floater|" + top_active_worlds[i].second + "|" + to_string(w_cz) + "|" + to_string(0.5 - (i * 0.005)) + "|-2016482305"; } top_active_worlds.clear(); last_world_menu = ms_time + 60000; } if (last_time - ms_time <= 0) { last_time = ms_time + 1000; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world.empty() or pInfo(currentPeer)->tankIDName.empty()) continue; if (pInfo(currentPeer)->last_fish_catch + pInfo(currentPeer)->fish_seconds < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count() && pInfo(currentPeer)->fishing_used != 0 && rand() % 100 < (pInfo(currentPeer)->hand == 3010 ? 9 : 6)) { PlayerMoving data_{}; data_.packetType = 17, data_.netID = 34, data_.YSpeed = 34, data_.x = pInfo(currentPeer)->f_x * 32 + 16, data_.y = pInfo(currentPeer)->f_y * 32 + 16; pInfo(currentPeer)->last_fish_catch = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); BYTE* raw = packPlayerMoving(&data_); gamepacket_t p3(0, pInfo(currentPeer)->netID); p3.Insert("OnPlayPositioned"), p3.Insert("audio/splash.wav"); for (ENetPeer* currentPeer_event = server->peers; currentPeer_event < &server->peers[server->peerCount]; ++currentPeer_event) { if (currentPeer_event->state != ENET_PEER_STATE_CONNECTED or currentPeer_event->data == NULL or pInfo(currentPeer_event)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer_event, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE), p3.CreatePacket(currentPeer_event); } delete[] raw; } if (not pInfo(currentPeer)->world.empty()) { string find = pInfo(currentPeer)->world; vector<pair<int, string>>::iterator p = find_if(top_active_worlds.begin(), top_active_worlds.end(), [find](const pair < int, string>& element) { return element.second == find; }); if (p != top_active_worlds.end()) top_active_worlds[p - top_active_worlds.begin()].first++; else top_active_worlds.push_back(make_pair(1, find)); } if (pInfo(currentPeer)->save_time + 600000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { if (pInfo(currentPeer)->save_time != 0) { pInfo(currentPeer)->opc++; gamepacket_t b; b.Insert("OnConsoleMessage"); b.Insert("`oYou earned 1 OPC for being online 10 minutes!"); b.CreatePacket(currentPeer); } pInfo(currentPeer)->save_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } if (pInfo(currentPeer)->hand == 3578 && pInfo(currentPeer)->hand_torch + 60000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { if (pInfo(currentPeer)->hand_torch != 0) { int got = 0; modify_inventory(currentPeer, 3578, got); if (got - 1 >= 1) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(currentPeer)->netID), p.Insert("`4My torch went out, but I have " + to_string(got - 1) + " more!``"), p.CreatePacket(currentPeer); } modify_inventory(currentPeer, 3578, got = -1); } pInfo(currentPeer)->hand_torch = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } if (pInfo(currentPeer)->world != "" && pInfo(currentPeer)->autofarm) { if (pInfo(currentPeer)->autofarm2 == 1) { if (pInfo(currentPeer)->loop_autofarm + 5 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { if (pInfo(currentPeer)->loop_autofarm != 0) { if (pInfo(currentPeer)->magnetron_id >= 1) { magfarming2(currentPeer); } else { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(currentPeer)->netID), p.Insert("`2MAGPLANT 5000`w is empty!``"), p.CreatePacket(currentPeer); } } } pInfo(currentPeer)->loop_autofarm = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } else { if (pInfo(currentPeer)->loop_autofarm + 5 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { if (pInfo(currentPeer)->loop_autofarm != 0) { autofarming2(currentPeer); } } pInfo(currentPeer)->loop_autofarm = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } } if (pInfo(currentPeer)->hand == 2204 and pInfo(currentPeer)->x != -1 and pInfo(currentPeer)->y != -1) { if (not has_playmod(pInfo(currentPeer), "Irradiated")) { if (pInfo(currentPeer)->geiger_x == -1 and pInfo(currentPeer)->geiger_y == -1) { pInfo(currentPeer)->geiger_x = (rand() % 100) * 32; pInfo(currentPeer)->geiger_y = (rand() % 54) * 32; } int a_ = pInfo(currentPeer)->geiger_x + ((pInfo(currentPeer)->geiger_y * 100) / 32); int b_ = pInfo(currentPeer)->x + ((pInfo(currentPeer)->y * 100) / 32); int diff = abs(a_ - b_) / 32; if (diff > 30) { // nieko } else if (diff >= 30) { // raudona if (pInfo(currentPeer)->geiger_time + 1500 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(currentPeer)->geiger_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); PlayerMoving data_{}; data_.packetType = 17, data_.x = pInfo(currentPeer)->x + 10, data_.y = pInfo(currentPeer)->y + 16, data_.characterState = 0x8; data_.XSpeed = 0, data_.YSpeed = 114; BYTE* raw = packPlayerMoving(&data_, 56); raw[3] = 114; *(double*)(raw + 40) = -4.13; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; } } else if (diff >= 15) { // geltona if (pInfo(currentPeer)->geiger_time + 1500 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(currentPeer)->geiger_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); PlayerMoving data_{}; data_.packetType = 17, data_.x = pInfo(currentPeer)->x + 10, data_.y = pInfo(currentPeer)->y + 16, data_.characterState = 0x8; data_.XSpeed = 1, data_.YSpeed = 114; BYTE* raw = packPlayerMoving(&data_, 56); raw[3] = 114; *(double*)(raw + 40) = -4.13; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; } } else { // zalia if (diff <= 1) { // surado { if (pInfo(currentPeer)->geiger_time + 2500 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(currentPeer)->geiger_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); pInfo(currentPeer)->geiger_x = -1, pInfo(currentPeer)->geiger_y = -1; { int c_ = -1; modify_inventory(currentPeer, 2204, c_); int c_2 = 1; if (modify_inventory(currentPeer, 2286, c_2) != 0) { string name_ = pInfo(currentPeer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds.at(p - worlds.begin()); WorldDrop drop_block_{}; drop_block_.id = 2286, drop_block_.count = 1, drop_block_.uid = uint16_t(world_->drop.size()) + 1, drop_block_.x = pInfo(currentPeer)->x + rand() % 17, drop_block_.y = pInfo(currentPeer)->y + rand() % 17; dropas_(world_, drop_block_); } } PlayMods give_playmod{}; give_playmod.id = 10; give_playmod.time = time(nullptr) + 1800; pInfo(currentPeer)->playmods.push_back(give_playmod); pInfo(currentPeer)->hand = 2286; update_clothes(currentPeer); gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You are aglow with radiation! (`$Irradiated`` mod added, `$" + a + "3" + "0 mins`` left)"); p.CreatePacket(currentPeer); packet_(currentPeer, "action|play_sfx\nfile|audio/dialog_confirm.wav\ndelayMS|0"); } vector<int> geiger_items = { 6416,3196,2206,1500,1498,2806,2804,8270,8272,8274,2244,2246,2242,3792,3306,4676,4678,4680,4682,4652,4650,4648,4646,11186,10086 }; if (rand() % 50 < 10) geiger_items = { 2248,2250,3792,10084, 12502 }; if (rand() % 50 < 2) geiger_items = { 4654 , 9380 , 11562 }; int item_ = geiger_items.at(rand() % geiger_items.size()); int c_ = 1; if (modify_inventory(currentPeer, item_, c_) != 0) { string name_ = pInfo(currentPeer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds.at(p - worlds.begin()); WorldDrop drop_block_{}; drop_block_.id = item_, drop_block_.count = 1, drop_block_.uid = uint16_t(world_->drop.size()) + 1, drop_block_.x = pInfo(currentPeer)->x + rand() % 17, drop_block_.y = pInfo(currentPeer)->y + rand() % 17; dropas_(world_, drop_block_); } } gamepacket_t p; p.Insert("OnParticleEffect"); p.Insert(48); p.Insert((float)pInfo(currentPeer)->x + 10, (float)pInfo(currentPeer)->y + 16); p.CreatePacket(currentPeer); { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(currentPeer)->netID); p.Insert("I found `21 " + items.at(item_).name + "``!"); p.Insert(0); p.CreatePacket(currentPeer); gamepacket_t p2; p2.Insert("OnConsoleMessage"); p2.Insert(pInfo(currentPeer)->name_color + pInfo(currentPeer)->tankIDName + "`` found `21 " + items.at(item_).name + "``!"); PlayerMoving data_{}; data_.packetType = 19, data_.plantingTree = 0, data_.netID = 0; data_.punchX = item_; data_.x = pInfo(currentPeer)->x + 10, data_.y = pInfo(currentPeer)->y + 16; int32_t to_netid = pInfo(currentPeer)->netID; BYTE* raw = packPlayerMoving(&data_); raw[3] = 5; memcpy(raw + 8, &to_netid, 4); for (ENetPeer* currentPeer2 = server->peers; currentPeer2 < &server->peers[server->peerCount]; ++currentPeer2) { if (currentPeer2->state != ENET_PEER_STATE_CONNECTED or currentPeer2->data == NULL) continue; if (pInfo(currentPeer2)->world == pInfo(currentPeer)->world) { send_raw(currentPeer2, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); p2.CreatePacket(currentPeer2); } } delete[]raw; } } } } else { int t_ = 0; if (diff >= 6) t_ = 1350; else t_ = 1000; if (pInfo(currentPeer)->geiger_time + t_ < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(currentPeer)->geiger_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); PlayerMoving data_{}; data_.packetType = 17, data_.x = pInfo(currentPeer)->x + 10, data_.y = pInfo(currentPeer)->y + 16, data_.characterState = 0x8; data_.XSpeed = 2, data_.YSpeed = 114; BYTE* raw = packPlayerMoving(&data_, 56); raw[3] = 114; *(double*)(raw + 40) = -4.13; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; } } } } } long long time_ = time(nullptr); for (int i_ = 0; i_ < pInfo(currentPeer)->playmods.size(); i_++) { if (pInfo(currentPeer)->playmods[i_].id == 12) { if (pInfo(currentPeer)->valentine_time + 2500 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(currentPeer)->valentine_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); for (ENetPeer* valentine = server->peers; valentine < &server->peers[server->peerCount]; ++valentine) { if (valentine->state != ENET_PEER_STATE_CONNECTED or valentine->data == NULL) continue; if (pInfo(valentine)->world == pInfo(currentPeer)->world and pInfo(valentine)->tankIDName == pInfo(currentPeer)->playmods[i_].user) { if (not pInfo(valentine)->invis and not pInfo(currentPeer)->invis and pInfo(currentPeer)->x != -1 and pInfo(currentPeer)->y != -1 and pInfo(valentine)->x != -1 and pInfo(valentine)->y != -1) { gamepacket_t p; p.Insert("OnParticleEffect"); p.Insert(13); p.Insert((float)pInfo(valentine)->x + 10, (float)pInfo(valentine)->y + 16); p.Insert((float)0), p.Insert((float)pInfo(currentPeer)->netID); bool double_send = false; for (int i_2 = 0; i_2 < pInfo(valentine)->playmods.size(); i_2++) { if (pInfo(valentine)->playmods[i_2].id == 12 and pInfo(valentine)->playmods[i_2].user == pInfo(currentPeer)->tankIDName) { double_send = true; break; } } gamepacket_t p2; p2.Insert("OnParticleEffect"); p2.Insert(13); p2.Insert((float)pInfo(currentPeer)->x + 10, (float)pInfo(currentPeer)->y + 16); p2.Insert((float)0), p2.Insert((float)pInfo(valentine)->netID); for (ENetPeer* valentine_bc = server->peers; valentine_bc < &server->peers[server->peerCount]; ++valentine_bc) { if (valentine_bc->state != ENET_PEER_STATE_CONNECTED or valentine_bc->data == NULL) continue; if (pInfo(valentine_bc)->world == pInfo(currentPeer)->world) { p.CreatePacket(valentine_bc); if (double_send) p2.CreatePacket(valentine_bc); } } } break; } } } } if (pInfo(currentPeer)->playmods[i_].time - time_ < 0) { for (vector<string> get_ : info_about_playmods) { uint32_t playmod_id = atoi(get_[0].c_str()); if (playmod_id == pInfo(currentPeer)->playmods[i_].id) { string playmod_name = get_[2]; string playmod_on_remove = get_[4]; pInfo(currentPeer)->playmods.erase(pInfo(currentPeer)->playmods.begin() + i_); packet_(currentPeer, "action|play_sfx\nfile|audio/dialog_confirm.wav\ndelayMS|0"); gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert(playmod_on_remove + " (`$" + playmod_name + "`` mod removed)"); p.CreatePacket(currentPeer); update_clothes(currentPeer); break; } } } } } } } int main() { /*string passwordd; cout << "password: "; cin >> passwordd; if (passwordd != exe_pass) return 0;*/ srand(unsigned int(time(nullptr))); if (items_dat() == -1) cout << "items.dat error" << endl; if (init_enet(server_port) == -1) //17099 cout << "enet error" << endl; else cout << "gtps2 by ametsa" << endl; cout << "enet server started" << endl; cout << "PORT: " << server_port << endl; cout << "ITEMS: " << setGems(items.size()) << endl; struct tm newtime; time_t now = time(0); localtime_s(&newtime, &now); ENetEvent event; while (true) { while (enet_host_service(server, &event, 1100) > 0) { if (saving_ or f_saving_) continue; ENetPeer* peer = event.peer; switch (event.type) { case ENET_EVENT_TYPE_CONNECT: { gamepacket_t p3; p3.Insert("OnConsoleMessage"), p3.Insert("`9Play with us, Welcome to Growtopia Private Server 2!"), p3.CreatePacket(peer); char clientConnection[16]; string osip = clientConnection; enet_address_get_host_ip(&peer->address, clientConnection, 16); send_(peer, 1, nullptr, 0); peer->data = new Player; pInfo(peer)->id = peer->connectID, pInfo(peer)->ip = clientConnection; string error = ""; int logged = 0; int count = 0; // cout << "connection from: " + clientConnection[16]; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(peer)->ip != pInfo(currentPeer)->ip) continue; logged++; if (pInfo(currentPeer)->ip == osip) { count++; if (count == 3) { break; } if (count > 3) { add_ipban(currentPeer); break; } } } if (logged > 4) error = "`4OOPS:`` Too many people logging in at once. Please press `5CANCEL`` and try again in a few seconds."; for (int i = 0; i < ipbans.size(); i++) if (pInfo(peer)->ip == ipbans[i]) error = "action|log\nmsg|CT:[S]_ `4Sorry, you are not allowed to enter the game from this location. Contact `5Discord Staff Team `4if you have any questions."; if (pInfo(peer)->ip != pInfo(peer)->meta and pInfo(peer)->meta != "") error = "action|log\nmsg|CT:[S]_ `4Can not make new account!`` Sorry, but IP " + pInfo(peer)->ip + " is not permitted to create NEW Growtopia accounts at this time. (This can be because there is an open proxy/VPN here or abuse has from this IP) Please try again from another IP address."; if (error != "") packet_(peer, error, ""), enet_peer_disconnect_later(peer, 0); break; } case ENET_EVENT_TYPE_RECEIVE: { loop_worlds(); switch (message_(event.packet)) { case 2: { string cch = text_(event.packet); if (cch.size() > 1024) break; if (cch == "action|getDRAnimations\n" || cch == "action|refresh_player_tribute_data\n") break; if (pInfo(peer)->lpps + 1000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->pps = 0; pInfo(peer)->lpps = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } else { pInfo(peer)->pps++; if (pInfo(peer)->pps >= 10) { enet_peer_disconnect_later(peer, 0); break; } } if (pInfo(peer)->requestedName.empty()) { if (pInfo(peer)->enter_game != 0 || pInfo(peer)->world != "") enet_peer_disconnect_later(peer, 0); else player_login(peer, cch); } else if (cch.find("action|input") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; string msg = explode("\n", t_[3])[0]; if (pInfo(peer)->tankIDName == "") break; if (msg.length() <= 0 || msg.length() > 120 || msg.empty() || std::all_of(msg.begin(), msg.end(), [](char c) {return std::isspace(c); })) continue; for (char c : msg) if (c < 0x20 || c>0x7A) continue; space_(msg); if (msg[0] == '/') SendCmd(peer, msg); else { if (msg[0] == '`' and msg.size() <= 2) break; if (pInfo(peer)->world == "") break; if (has_playmod(pInfo(peer), "duct tape") || has_playmod(pInfo(peer), "Iron MMMFF")) { string msg2 = ""; for (int i = 0; i < msg.length(); i++) { if (isspace(msg[i])) msg2 += " "; else { if (isupper(msg[i])) msg2 += i % 2 == 0 ? "M" : "F"; else msg2 += i % 2 == 0 ? "m" : "f"; } } msg = msg2; } string check_ = msg; transform(check_.begin(), check_.end(), check_.begin(), ::tolower); { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (world_->silence and pInfo(peer)->superdev != 1 and world_->owner_name != pInfo(peer)->tankIDName and find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) == world_->admins.end()) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("`1(Peasants must not speak)"), p.Insert(1), p.CreatePacket(peer); break; } } } if (msg.find("allahini sik") != string::npos || msg.find("atani sik") != string::npos || msg.find("GTSG") != string::npos || msg.find("Gtsg") != string::npos || msg.find("gtsg") != string::npos || msg.find("vtps") != string::npos || msg.find("VTPS") != string::npos || msg.find("ataturkunu sik") != string::npos || msg.find("ataturku sik") != string::npos || msg.find("allahi sik") != string::npos) { gamepacket_t k; k.Insert("OnConsoleMessage"); k.Insert("Yasakli kelime kullanmaya devam edersen banlanacaksin!"); k.CreatePacket(peer); enet_peer_disconnect_later(peer, 0); break; } bool warned = false; pInfo(peer)->not_same++; if (pInfo(peer)->last_input_text == msg) pInfo(peer)->same_input++; pInfo(peer)->last_input_text = msg; if (pInfo(peer)->last_spam_detection + 5000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) pInfo(peer)->last_spam_detection = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(), pInfo(peer)->same_input = 0, pInfo(peer)->not_same = 0; if (pInfo(peer)->same_input >= 3 || pInfo(peer)->not_same >= 5) { gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("`6>>`4Spam detected! ``Please wait a bit before typing anything else. Please note, any form of bot/macro/auto-paste will get all your accounts banned, so don't do it!"), p.CreatePacket(peer); } else { gamepacket_t p, p2; p.Insert("OnConsoleMessage"); p.Insert("CP:_PL:0_OID:_CT:[W]_ `6<`w" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->name_color + pInfo(peer)->tankIDName) + "`6> `$" + (has_playmod(pInfo(peer), "Infected!") ? "`2" : "") + "" + ((pInfo(peer)->adminLevel >= 3 and pInfo(peer)->d_name.empty()) ? "`5" : (pInfo(peer)->mod == 1 and pInfo(peer)->d_name.empty()) ? "`^" : "`$") + msg + "`````"); p2.Insert("OnTalkBubble"); p2.Insert(pInfo(peer)->netID); if (check_ != ":/" and check_ != ":p" and check_ != ":*" and check_ != ";)" and check_ != ":d" and check_ != ":o" and check_ != ":'(" and check_ != ":(") { p2.Insert("CP:_PL:0_OID:_player_chat=" + a + ((pInfo(peer)->adminLevel >= 2 and pInfo(peer)->d_name.empty()) ? "`5" : (pInfo(peer)->adminLevel >= 1 and pInfo(peer)->d_name.empty()) ? "`^" : "`0") + msg); } else p2.Insert(msg); 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)->world == pInfo(peer)->world) { bool muted_ = false; for (int c_ = 0; c_ < pInfo(currentPeer)->friends.size(); c_++) { if (pInfo(currentPeer)->friends[c_].name == pInfo(peer)->tankIDName) { if (pInfo(currentPeer)->friends[c_].mute) { muted_ = true; break; } } } if (not muted_) { p.CreatePacket(currentPeer); p2.CreatePacket(currentPeer); } } } } } break; } else if (cch.find("action|mod_trade") != string::npos or cch.find("action|rem_trade") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 3) break; int item_id = atoi(explode("\n", t_[2])[0].c_str()), c_ = 0; modify_inventory(peer, item_id, c_); if (c_ == 0) break; if (items[item_id].untradeable) { gamepacket_t p; p.Insert("OnTextOverlay"); p.Insert("You'd be sorry if you lost that!"); p.CreatePacket(peer); break; } if (c_ == 1 or cch.find("action|rem_trade") != string::npos) { mod_trade(peer, item_id, c_, (cch.find("action|rem_trade") != string::npos ? true : false)); break; } if (cch.find("action|rem_trade") == string::npos) { gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`2Trade`` `w" + items[item_id].name + "``|left|" + to_string(item_id) + "|\nadd_textbox|`2Trade how many?``|left|\nadd_text_input|count||" + to_string(c_) + "|5|\nembed_data|itemID|" + to_string(item_id) + "\nend_dialog|trade_item|Cancel|OK|"); p.CreatePacket(peer); } break; } else if (cch.find("action|trade_accept") != string::npos) { if (pInfo(peer)->trading_with != -1) { vector<string> t_ = explode("|", cch); if (t_.size() < 3) break; string status_ = explode("\n", t_[2])[0]; if (status_ != "1" and status_ != "0") break; bool f_ = false; 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)->world == pInfo(peer)->world) { if (pInfo(currentPeer)->netID == pInfo(peer)->trading_with and pInfo(peer)->netID == pInfo(currentPeer)->trading_with) { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (status_ == "1") pInfo(peer)->trade_accept = 1; else pInfo(peer)->trade_accept = 0; if (pInfo(peer)->trade_accept and pInfo(currentPeer)->trade_accept) { // check inv space if (not trade_space_check(peer, currentPeer)) { pInfo(peer)->trade_accept = 0, pInfo(currentPeer)->trade_accept = 0; gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(peer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->name_color + pInfo(peer)->tankIDName) + "``'s offer.``"); p.Insert(make_trade_offer(pInfo(peer), true) + "locked|0\naccepted|0"); p.CreatePacket(peer); { gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(peer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->name_color + pInfo(peer)->tankIDName) + "``'s offer.``"); p.Insert(make_trade_offer(pInfo(peer), true) + "locked|0\nreset_locks|1\naccepted|0"); p.CreatePacket(currentPeer); } f_ = true; break; } else if (not trade_space_check(currentPeer, peer)) { pInfo(peer)->trade_accept = 0, pInfo(currentPeer)->trade_accept = 0; gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(currentPeer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(currentPeer)->d_name.empty() ? pInfo(currentPeer)->d_name : pInfo(currentPeer)->name_color + pInfo(currentPeer)->tankIDName) + "``'s offer.``"); p.Insert(make_trade_offer(pInfo(currentPeer), true) + "locked|0\naccepted|0"); p.CreatePacket(currentPeer); { gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(currentPeer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(currentPeer)->d_name.empty() ? pInfo(currentPeer)->d_name : pInfo(currentPeer)->name_color + pInfo(currentPeer)->tankIDName) + "``'s offer.``"); p.Insert(make_trade_offer(pInfo(currentPeer), true) + "locked|0\nreset_locks|1\naccepted|0"); p.CreatePacket(peer); } f_ = true; break; } { gamepacket_t p; p.Insert("OnForceTradeEnd"); p.CreatePacket(peer); } send_trade_confirm_dialog(peer, currentPeer); break; } gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(peer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->name_color + pInfo(peer)->tankIDName) + "``'s offer.``"); p.Insert(make_trade_offer(pInfo(peer), true) + "locked|0\naccepted|" + status_); p.CreatePacket(peer); { { gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(currentPeer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(currentPeer)->d_name.empty() ? pInfo(currentPeer)->d_name : pInfo(currentPeer)->name_color + pInfo(currentPeer)->tankIDName) + "``'s offer.``"); p.Insert("locked|0\nreset_locks|1\naccepted|0"); p.CreatePacket(currentPeer); } gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(currentPeer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(currentPeer)->d_name.empty() ? pInfo(currentPeer)->d_name : pInfo(currentPeer)->name_color + pInfo(currentPeer)->tankIDName) + "``'s offer.``"); p.Insert("locked|0\naccepted|1"); p.CreatePacket(currentPeer); { gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(currentPeer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(currentPeer)->d_name.empty() ? pInfo(currentPeer)->d_name : pInfo(currentPeer)->name_color + pInfo(currentPeer)->tankIDName) + "``'s offer.``"); p.Insert(make_trade_offer(pInfo(currentPeer), true) + "locked|0\nreset_locks|1\naccepted|0"); p.CreatePacket(currentPeer); } { gamepacket_t p; p.Insert("OnTradeStatus"); p.Insert(pInfo(peer)->netID); p.Insert(""); p.Insert("`o" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->name_color + pInfo(peer)->tankIDName) + "``'s offer.``"); p.Insert(make_trade_offer(pInfo(peer), true) + "locked|0\nreset_locks|1\naccepted|" + status_); p.CreatePacket(currentPeer); } } } f_ = true; break; } } } if (not f_) { if (status_ == "1") pInfo(peer)->trade_accept = 1; else pInfo(peer)->trade_accept = 0; } } break; } else if (cch == "action|trade_cancel\n") cancel_trade(peer); if (pInfo(peer)->trading_with == -1) { if (cch.find("action|dialog_return\ndialog_name|punish_view\nbuttonClicked|warp_to_") != string::npos) { if (pInfo(peer)->mod == 1 || pInfo(peer)->dev == 1) { string world_name = cch.substr(67, cch.length() - 67); replace_str(world_name, "\n", ""); replace_str(world_name, "reason|", ""); join_world(peer, world_name); } break; } if (cch.find("action|dialog_return\ndialog_name|auto_farming") != std::string::npos) { if (cch.find("buttonClicked|clear_item") != std::string::npos) { pInfo(peer)->farmable = 0; break; } else { pInfo(peer)->farmable = atoi(explode("\n", explode("auto_farming_item|", cch)[1])[0].c_str()); break; } break; } else if (cch.find("action|dialog_return\ndialog_name|blast\nitemID|") != string::npos) { string world = cch.substr(57, cch.length() - 57).c_str(); vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int blast = atoi(explode("\n", t_[3])[0].c_str()), got = 0; modify_inventory(peer, blast, got); if (got == 0) break; replace_str(world, "\n", ""); if (!world_exist(world)) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("That world name already exists. You'll have to be more original. Maybe add some numbers after it?"), p.Insert(0), p.Insert(1), p.CreatePacket(peer); } transform(world.begin(), world.end(), world.begin(), ::toupper); if (find_if(worlds.begin(), worlds.end(), [world](const World& a) { return a.name == world; }) != worlds.end() || not check_blast(world) || _access_s(("worlds/" + world + "_.json").c_str(), 0) == 0) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("That world name already exists. You'll have to be more original. Maybe add some numbers after it?"), p.Insert(0), p.Insert(1), p.CreatePacket(peer); } else { if (modify_inventory(peer, blast, got = -1) == 0) { create_world_blast(world, blast); if (blast == 830) modify_inventory(peer, 834, got = -100); join_world(peer, world); gamepacket_t p(750), p2(750); p.Insert("OnConsoleMessage"), p.Insert("** `5" + pInfo(peer)->tankIDName + " activates a " + items[blast].name + "! ``**"), p.CreatePacket(peer); p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("** `5" + pInfo(peer)->tankIDName + " activates a " + items[blast].name + "! ``**"), p2.Insert(0), p2.Insert(1), p2.CreatePacket(peer); } } break; } else if (cch.find("action|dialog_return\ndialog_name|megaphone\nitemID|2480|\nwords|") != string::npos) { string text = cch.substr(62, cch.length() - 62).c_str(); bool cansb = true; int c_ = 0; modify_inventory(peer, 2480, c_); if (c_ == 0) continue; if (has_playmod(pInfo(peer), "duct tape")) { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("`6>> That's sort of hard to do while duct-taped.``"); p.CreatePacket(peer); cansb = false; continue; } if (has_playmod(pInfo(peer), "megaphone!")) { int time_ = 0; for (PlayMods peer_playmod : pInfo(peer)->playmods) { if (peer_playmod.id == 13) { time_ = peer_playmod.time - time(nullptr); break; } } packet_(peer, "action|log\nmsg|>> (" + to_playmod_time(time_) + "before you can broadcast again)", ""); break; } if (cansb) { replace_str(text, "\n", ""); pInfo(peer)->usedmegaphone = 1; SendCmd(peer, "/sb " + text, false); } break; } else if (cch.find("action|dialog_return\ndialog_name|notebook_edit\nbuttonClicked|cancel") != string::npos || cch.find("action|dialog_return\ndialog_name|notebook_edit\nbuttonClicked|clear") != string::npos) { if (cch.find("action|dialog_return\ndialog_name|notebook_edit\nbuttonClicked|clear") != string::npos) pInfo(peer)->note = ""; send_wrench_self(peer); break; } else if (cch.find("action|dialog_return\ndialog_name|notebook_edit\nbuttonClicked|save\n\npersonal_note|") != string::npos) { string btn = cch.substr(81, cch.length() - 81).c_str(); replace_str(btn, "\n", ""); if (btn.length() > 128) continue; pInfo(peer)->note = btn; send_wrench_self(peer); break; } else if (cch.find("action|dialog_return\ndialog_name|cheats_1_1") != string::npos) { string new_nicks = "" + pInfo(peer)->tankIDName + "`#[`5Cheat-Active`#]"; bool nocip_1 = atoi(explode("\n", explode("nocip_1_1|", cch)[1])[0].c_str()); //Auto Farm bool nocip_2 = atoi(explode("\n", explode("nocip_1_2|", cch)[1])[0].c_str()); //Auto Remote if (nocip_1) { pInfo(peer)->autofarm = 1; gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`wSelect Block``|left|32|\nadd_spacer|small|\nadd_item_picker|auto_farming_item|`wSelect``|Choose an item you want to auto farm!|\nadd_spacer|small|\nend_dialog|auto_farming|Close||"); p.CreatePacket(peer); } else { pInfo(peer)->autofarm = 0; } if (nocip_2) pInfo(peer)->autofarm2 = 1; else pInfo(peer)->autofarm2 = 0; update_clothes(peer); break; } else if (cch == "action|dialog_return\ndialog_name|socialportal\nbuttonClicked|onlinepointhub\n\n") { gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`rGrowtopia Private Server 2 Market``|left|1434|\nadd_spacer|small|\nadd_textbox|`oWelcome to GTPS2 Market, you can purchase cool items from here via gems. If you don't have any gems you can earn them with breaking farmables!|left|\nadd_spacer|small|\nadd_textbox|`2You have `0" + setGems(pInfo(peer)->gems) + "`2 Gems in total.``|left|\nadd_spacer|small|\ntext_scaling_string|5,000OPC|" + gems_list + "|\nadd_button_with_icon||END_LIST|noflags|0|||\nadd_button|chc0|OK|noflags|0|0|\nnend_dialog|gazette||OK|"); p.CreatePacket(peer); } else if (cch == "action|dialog_return\ndialog_name|socialportal\nbuttonClicked|onlinepointhubs\n\n") { gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`0Online Point Hub``|left|9476|\nadd_spacer|small|\nadd_textbox|Welcome to `pOnline Point Currency HUB``! Do you have any OPC? You can buy items from me with them.|left|\nadd_smalltext|`2You can earn 1 OPC every 10 minutes just by playing the game.``|left|\nadd_spacer|small|\nadd_textbox|You have `p" + setGems(pInfo(peer)->opc) + " Online Point Currency``.|left|\ntext_scaling_string|5,000OPC|" + opc_list + "||\nadd_button_with_icon||END_LIST|noflags|0||\nadd_button|chc0|OK|noflags|0|0|\nnend_dialog|gazette||OK|"); p.CreatePacket(peer); } else if (cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|nukel") != string::npos || cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|banl") != string::npos || cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|mutel") != string::npos || cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|nickl") != string::npos) { string line = "", sanane = "", log = ""; if (cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|nukel") != string::npos) log = "nukeunnuke"; else if (cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|mutel") != string::npos) log = "muteunmute"; else if (cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|banl") != string::npos) log = "banunban"; else if (cch.find("action|dialog_return\ndialog_name|logss\nbuttonClicked|nick") != string::npos) log = "nick"; ifstream aga("logs/"+ log +".txt"); while (getline(aga, line)) { sanane += "\nadd_smalltext|`3- " + line + "|"; } gamepacket_t d; d.Insert("OnDialogRequest"); d.Insert("\nadd_label_with_icon|big|`wServer Logs|left|32|\nadd_spacer|small|" + sanane + "\nadd_spacer|small|\nadd_button|sksk|Close|"); d.Insert("\nadd_label_with_icon|big|`wServer Logs|left|32|\nadd_spacer|small|" + sanane + "\nadd_spacer|small|\nadd_button|sksk|Close|"); d.CreatePacket(peer); } else if (cch.find("action|dialog_return\ndialog_name|\nbuttonClicked|gems_price_") != string::npos) { int item = atoi(cch.substr(59, cch.length() - 59).c_str()); if (item <= 0 || item >= items.size() || items[item].gemrc == 0) continue; int c_ = 1; gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\n\nadd_label_with_icon|big|`oPurchase `w" + items[item].name + "``|left|" + to_string(items[item].id) + "|\nadd_smalltext|`4Be careful while reading informations!``|left|\nadd_smalltext|Price: `2" + setGems(items[item].gemrc) + " Gems``|left|\nadd_smalltext|Count: `7" + to_string(c_) + "``|left|\n\nadd_textbox|`6Information:``|left|\nadd_smalltext|" + items[item].description + "|left|\nadd_spacer|\nadd_button|gems_item_" + to_string(item) + "|`0`2" + setGems(items[item].gemrc) + " Gems``|noflags|0|0||small|\n\nadd_quick_exit|\nnend_dialog|gazette||OK|"); p.CreatePacket(peer); break; } else if (cch.find("action|dialog_return\ndialog_name|\nbuttonClicked|gems_item_") != string::npos) { int item = atoi(cch.substr(58, cch.length() - 58).c_str()); if (item <= 0 || item >= items.size() || items[item].gemrc == 0) continue; if (pInfo(peer)->gems >= items[item].gemrc) { int c_ = 1; if (modify_inventory(peer, item, c_) == 0) { pInfo(peer)->gems -= items[item].gemrc; packet_(peer, "action|play_sfx\nfile|audio/piano_nice.wav\ndelayMS|0"); gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("`o>> You bought `w" + items[item].name + "!"); p.CreatePacket(peer); } else { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You don't have enough inventory space!"); p.CreatePacket(peer); } } break; } else if (cch.find("action|dialog_return\ndialog_name|\nbuttonClicked|opop_price_") != string::npos) { int item = atoi(cch.substr(59, cch.length() - 59).c_str()); if (item <= 0 || item >= items.size() || items[item].oprc == 0) continue; gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\n\nadd_label_with_icon|big|`0Purchase " + items[item].name + "``|left|" + to_string(items[item].id) + "|\nadd_smalltext|`4Make sure to read this information clearly!``|left|\nadd_smalltext|Price: `3" + setGems(items[item].oprc) + "`` `0OPC``|left|\nadd_smalltext|Duration: `7[```4~```7]``|left|\nadd_smalltext|Stock: `7[```4~```7]``|left|\n\nadd_textbox|`6Other information:``|left|\nadd_smalltext|" + items[item].description + "|left|\nadd_spacer|\nadd_button|opop_item_" + to_string(item) + "|`0Purchase `9" + setGems(items[item].oprc) + " OPC``|noflags|0|0||small|\n\nadd_quick_exit|\nnend_dialog|gazette||OK|"); p.CreatePacket(peer); break; } else if (cch.find("action|dialog_return\ndialog_name|\nbuttonClicked|trarub") != string::npos) { int rub = pInfo(peer)->rubble; if (rub <= 0) break; int miktar = rand() % 250; int total = rub * miktar; pInfo(peer)->gems += total; pInfo(peer)->rubble = 0; gamepacket_t p, b; p.Insert("OnSetBux"); p.Insert(pInfo(peer)->gems); p.Insert(0); p.Insert((pInfo(peer)->supp >= 1) ? 1 : 0); if (pInfo(peer)->supp >= 2) { p.Insert((float)33796, (float)1, (float)0); } b.Insert("OnTextOverlay"); b.Insert("`wYou earned `2" + to_string(total) + " Gems!"); p.CreatePacket(peer), b.CreatePacket(peer); } else if (cch.find("action|dialog_return\ndialog_name|\nbuttonClicked|opop_item_") != string::npos) { int item = atoi(cch.substr(58, cch.length() - 58).c_str()); if (item <= 0 || item >= items.size() || items[item].oprc == 0) continue; if (pInfo(peer)->opc >= items[item].oprc) { int c_ = 1; if (modify_inventory(peer, item, c_) == 0) { pInfo(peer)->opc -= items[item].oprc; packet_(peer, "action|play_sfx\nfile|audio/piano_nice.wav\ndelayMS|0"); gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("`o>> You purchased " + items[item].name + "!"); p.CreatePacket(peer); } else { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("No inventory space."); p.CreatePacket(peer); } } break; } else if (cch.find("action|dialog_return\ndialog_name|storageboxxtreme\nitemid|") != string::npos) { int item = atoi(cch.substr(57, cch.length() - 57).c_str()); if (item <= 0 || item >= items.size()) break; if (pInfo(peer)->lastwrenchb != 4516 and items[item].untradeable == 1 or item == 1424 or items[item].blockType == BlockTypes::FISH) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You can't store Untradeable items there!"), p.CreatePacket(peer); } else if (pInfo(peer)->lastwrenchb == 4516 and items[item].untradeable == 0 or item == 18 || item == 32 || item == 6336 || item == 1424 || items[item].blockType == BlockTypes::FISH) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You can't store Tradeable items there!"), p.CreatePacket(peer); } else { int got = 0, receive = 0; modify_inventory(peer, item, got); if (got == 0) break; pInfo(peer)->lastchoosenitem = item; gamepacket_t p; p.Insert("OnDialogRequest"), p.Insert("set_default_color|`o\nadd_label_with_icon|big|`w" + items[pInfo(peer)->lastwrenchb].name + "``|left|" + to_string(pInfo(peer)->lastwrenchb) + "|\nadd_textbox|You have " + to_string(got) + " " + items[item].name + ". How many to store?|left|\nadd_text_input|itemcount||" + to_string(got) + "|3|\nadd_spacer|small|\nadd_button|do_add|Store Items|noflags|0|0|\nend_dialog|storageboxxtreme|Cancel||\n"), p.CreatePacket(peer); } break; } else if (cch.find("action|dialog_return\ndialog_name|storageboxxtreme\nbuttonClicked|itm") != string::npos) { int itemnr = atoi(cch.substr(67, cch.length() - 67).c_str()), itemcount = 0; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (pInfo(peer)->tankIDName == world_->owner_name) { for (int i_ = 0; i_ < world_->sbox1.size(); i_++) { if (world_->sbox1[i_].x == pInfo(peer)->lastwrenchx and world_->sbox1[i_].y == pInfo(peer)->lastwrenchy) { itemcount++; if (itemnr == itemcount) { pInfo(peer)->lastchoosennr = itemnr; gamepacket_t p; p.Insert("OnDialogRequest"), p.Insert("set_default_color|`o\nadd_label_with_icon|big|`w" + items[pInfo(peer)->lastwrenchb].name + "``|left|" + to_string(pInfo(peer)->lastwrenchb) + "|\nadd_textbox|You have `w" + to_string(world_->sbox1[i_].count) + " " + items[world_->sbox1[i_].id].name + "`` stored.|left|\nadd_textbox|Withdraw how many?|left|\nadd_text_input|itemcount||" + to_string(world_->sbox1[i_].count) + "|3|\nadd_spacer|small|\nadd_button|do_take|Remove Items|noflags|0|0|\nadd_button|cancel|Back|noflags|0|0|\nend_dialog|storageboxxtreme|Exit||\n"), p.CreatePacket(peer); } } } } } break; } else if (cch.find("action|dialog_return\ndialog_name|donation_box_edit\nitemid|") != string::npos) { int item = atoi(cch.substr(58, cch.length() - 58).c_str()), got = 0; modify_inventory(peer, item, got); if (got == 0) break; if (items[item].untradeable == 1 || item == 1424 || items[item].blockType == BlockTypes::FISH) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("`7[```4You can't place that in the box, you need it!`7]``"), p.CreatePacket(peer); } else if (items[item].rarity == 1) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("`7[```4This box only accepts items rarity 2+ or greater`7]``"), p.CreatePacket(peer); } else { pInfo(peer)->lastchoosenitem = item; gamepacket_t p; p.Insert("OnDialogRequest"), p.Insert("set_default_color|`o\nadd_label_with_icon|big|" + items[item].name + "``|left|" + to_string(item) + "|\nadd_textbox|How many to put in the box as a gift? (Note: You will `4LOSE`` the items you give!)|left|\nadd_text_input|count|Count:|" + to_string(got) + "|5|\nadd_text_input|sign_text|Optional Note:||128|\nadd_spacer|small|\nadd_button|give|`4Give the item(s)``|noflags|0|0|\nadd_spacer|small|\nadd_button|cancel|`wCancel``|noflags|0|0|\nend_dialog|give_item|||\n"); p.CreatePacket(peer); } break; } else if (cch.find("action|dialog_return\ndialog_name|donation_box_edit\nbuttonClicked|takeall\n") != string::npos) { bool took = false, fullinv = false; gamepacket_t p3; p3.Insert("OnTalkBubble"), p3.Insert(pInfo(peer)->netID); string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (world_->owner_name != pInfo(peer)->tankIDName and not pInfo(peer)->dev and not world_->owner_name.empty() and (!guild_access(peer, world_->guild_id) and find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) == world_->admins.end())) break; WorldBlock* block_ = &world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; if (!items[block_->fg].donation) break; for (int i_ = 0; i_ < block_->donates.size(); i_++) { int receive = block_->donates[i_].count; if (modify_inventory(peer, block_->donates[i_].item, block_->donates[i_].count) == 0) { took = true; gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("`7[``" + pInfo(peer)->tankIDName + " receives `5" + to_string(receive) + "`` `w" + items[block_->donates[i_].item].name + "`` from `w" + block_->donates[i_].name + "``, how nice!`7]``"); block_->donates.erase(block_->donates.begin() + i_); i_--; 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(peer)->world != pInfo(currentPeer)->world) continue; p.CreatePacket(currentPeer); } } else fullinv = true; } if (block_->donates.size() == 0) { WorldBlock block_ = world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; PlayerMoving data_{}; data_.packetType = 5, data_.punchX = pInfo(peer)->lastwrenchx, data_.punchY = pInfo(peer)->lastwrenchy, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, &block_)); BYTE* blc = raw + 56; form_visual(blc, block_, *world_, peer, false); 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(peer)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer, 4, raw, 112 + alloc_(world_, &block_), ENET_PACKET_FLAG_RELIABLE); } delete[] raw, blc; } } if (fullinv) { p3.Insert("I don't have enough room in my backpack to get the item(s) from the box!"); gamepacket_t p2; p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("`2(Couldn't get all of the gifts)``"), p2.CreatePacket(peer); } else if (took) p3.Insert("`2Box emptied.``"); p3.CreatePacket(peer); break; } else if (cch == "action|dialog_return\ndialog_name|surge\n") { if (pInfo(peer)->lastwrenchb == 4296 || pInfo(peer)->lastwrenchb == 8558) { setstats(peer, rand() % 30, "", items[pInfo(peer)->lastwrenchb].name); pInfo(peer)->lastwrenchb = 0; } break; } else if (cch.find("action|dialog_return\ndialog_name|give_item\nbuttonClicked|give\n\ncount|") != string::npos) { int count = atoi(cch.substr(69, cch.length() - 69).c_str()), got = 0; string text = cch.substr(80 + to_string(count).length(), cch.length() - 80 + to_string(count).length()).c_str(); replace_str(text, "\n", ""); modify_inventory(peer, pInfo(peer)->lastchoosenitem, got); if (text.size() > 128 || got <= 0 || count <= 0 || count > items.size()) break; if (count > got || items[pInfo(peer)->lastchoosenitem].untradeable == 1 || pInfo(peer)->lastchoosenitem == 1424 || items[pInfo(peer)->lastchoosenitem].blockType == BlockTypes::FISH) { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); if (count > got) p.Insert("You don't have that to give!"); else p.Insert("`7[```4You can't place that in the box, you need it!`7]``"); p.CreatePacket(peer); } else { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; WorldBlock* block_ = &world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; if (!items[block_->fg].donation) break; Donate donate_{}; donate_.item = pInfo(peer)->lastchoosenitem, donate_.count = count, donate_.name = pInfo(peer)->tankIDName, donate_.text = text; block_->donates.push_back(donate_); { PlayerMoving data_{}; data_.packetType = 5, data_.punchX = pInfo(peer)->lastwrenchx, data_.punchY = pInfo(peer)->lastwrenchy, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, block_)); BYTE* blc = raw + 56; form_visual(blc, *block_, *world_, peer, false, true); 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(peer)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer, 4, raw, 112 + alloc_(world_, block_), ENET_PACKET_FLAG_RELIABLE); } delete[] raw, blc; } 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(peer)->world != pInfo(currentPeer)->world) continue; { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("`7[```5[```w" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->tankIDName) + "`` places `5" + to_string(count) + "`` `2" + items[pInfo(peer)->lastchoosenitem].name + "`` into the " + items[pInfo(peer)->lastwrenchb].name + "`5]```7]``"); p.Insert(0); p.CreatePacket(currentPeer); } { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("`7[```5[```w" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->tankIDName) + "`` places `5" + to_string(count) + "`` `2" + items[pInfo(peer)->lastchoosenitem].name + "`` into the " + items[pInfo(peer)->lastwrenchb].name + "`5]```7]``"); p.CreatePacket(currentPeer); } } modify_inventory(peer, pInfo(peer)->lastchoosenitem, count *= -1); } } break; } else if (cch.find("action|dialog_return\ndialog_name|storageboxxtreme\nbuttonClicked|cancel") != string::npos) { edit_tile(peer, pInfo(peer)->lastwrenchx, pInfo(peer)->lastwrenchy, 32); break; } else if (cch.find("action|dialog_return\ndialog_name|storageboxxtreme\nbuttonClicked|do_take\n\nitemcount|") != string::npos) { int itemnr = pInfo(peer)->lastchoosennr, countofremoval = atoi(cch.substr(83, cch.length() - 83).c_str()), removed = 0, itemcount = 0; removed = countofremoval; if (countofremoval <= 0) break; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (pInfo(peer)->tankIDName == world_->owner_name) { for (int i_ = 0; i_ < world_->sbox1.size(); i_++) { if (world_->sbox1[i_].x == pInfo(peer)->lastwrenchx and world_->sbox1[i_].y == pInfo(peer)->lastwrenchy) { itemcount++; if (itemnr == itemcount and countofremoval < world_->sbox1[i_].count) { if (world_->sbox1[i_].count <= 0) break; world_->sbox1[i_].count -= removed; if (modify_inventory(peer, world_->sbox1[i_].id, countofremoval) == 0) { gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("Removed `w" + to_string(removed) + " " + items[world_->sbox1[i_].id].name + "`` in " + items[pInfo(peer)->lastwrenchb].name + "."), p.Insert(0), p.Insert(1), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert("Removed `w" + to_string(removed) + " " + items[world_->sbox1[i_].id].name + "`` in the " + items[pInfo(peer)->lastwrenchb].name + "."), p2.CreatePacket(peer); PlayerMoving data_{}; data_.x = pInfo(peer)->lastwrenchx * 32 + 16, data_.y = pInfo(peer)->lastwrenchy * 32 + 16, data_.packetType = 19, data_.plantingTree = 500, data_.punchX = world_->sbox1[i_].id, data_.punchY = pInfo(peer)->netID; int32_t to_netid = pInfo(peer)->netID; BYTE* raw = packPlayerMoving(&data_); raw[3] = 5; memcpy(raw + 8, &to_netid, 4); send_raw(peer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; i_ = world_->sbox1.size(); } } else if (itemnr == itemcount and world_->sbox1[i_].count == countofremoval) { if (world_->sbox1[i_].count <= 0) break; if (modify_inventory(peer, world_->sbox1[i_].id, countofremoval) == 0) { gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("Removed `w" + to_string(removed) + " " + items[world_->sbox1[i_].id].name + "`` in " + items[pInfo(peer)->lastwrenchb].name + "."), p.Insert(0), p.Insert(1), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert("Removed `w" + to_string(removed) + " " + items[world_->sbox1[i_].id].name + "`` in the " + items[pInfo(peer)->lastwrenchb].name + "."), p2.CreatePacket(peer); PlayerMoving data_{}; data_.x = pInfo(peer)->lastwrenchx * 32 + 16, data_.y = pInfo(peer)->lastwrenchy * 32 + 16; data_.packetType = 19, data_.plantingTree = 500; data_.punchX = world_->sbox1[i_].id, data_.punchY = pInfo(peer)->netID; int32_t to_netid = pInfo(peer)->netID; BYTE* raw = packPlayerMoving(&data_); raw[3] = 5; memcpy(raw + 8, &to_netid, 4); send_raw(peer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; world_->sbox1.erase(world_->sbox1.begin() + i_); i_ = world_->sbox1.size(); } } } } } } break; } else if (cch.find("action|dialog_return\ndialog_name|\nbuttonClicked|trans_") != string::npos) { int item = atoi(cch.substr(54, cch.length() - 54).c_str()); if (item <= 0 || item >= items.size()) break; if (item == 256) { gamepacket_t p(0, pInfo(peer)->netID); p.Insert("OnFlagMay2019"), p.Insert(256); pInfo(peer)->flagmay = 256; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED) continue; if (pInfo(peer)->world == pInfo(currentPeer)->world) p.CreatePacket(currentPeer); } } int got = 0; modify_inventory(peer, item, got); if (got == 0) break; if (items[item].flagmay == 256) break; gamepacket_t p(0, pInfo(peer)->netID); pInfo(peer)->flagmay = items[item].flagmay; p.Insert("OnFlagMay2019"), p.Insert(items[item].flagmay); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED) continue; if (pInfo(peer)->world == pInfo(currentPeer)->world) p.CreatePacket(currentPeer); } break; } else if (cch.find("action|dialog_return\ndialog_name|view_inventory\nbuttonClicked|") != string::npos) { if (pInfo(peer)->superdev) { int item = atoi(cch.substr(62, cch.length() - 62).c_str()), got = 0; pInfo(peer)->choosenitem = item; if (item <= 0 || item > items.size()) break; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue; if (to_lower(pInfo(currentPeer)->tankIDName) == to_lower(pInfo(peer)->last_wrenched)) { modify_inventory(currentPeer, pInfo(peer)->choosenitem, got); gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`4Take`` `w" + items[pInfo(peer)->choosenitem].name + " from`` `#" + pInfo(currentPeer)->tankIDName + "``|left|" + to_string(pInfo(peer)->choosenitem) + "|\nadd_textbox|How many to `4take``? (player has " + to_string(got) + ")|left|\nadd_text_input|count||" + to_string(got) + "|5|\nend_dialog|take_item|Cancel|OK|"); p.CreatePacket(peer); } } } break; } else if (cch.find("action|dialog_return\ndialog_name|take_item\ncount|") != string::npos) { if (pInfo(peer)->superdev) { int count = atoi(cch.substr(49, cch.length() - 49).c_str()), take = 0, receive = atoi(cch.substr(49, cch.length() - 49).c_str()); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue; if (to_lower(pInfo(currentPeer)->tankIDName) == to_lower(pInfo(peer)->last_wrenched)) { modify_inventory(currentPeer, pInfo(peer)->choosenitem, take); if (take < count || count <= 0 || count > 200) break; if (modify_inventory(peer, pInfo(peer)->choosenitem, count) == 0) { int took = count * -1; modify_inventory(currentPeer, pInfo(peer)->choosenitem, took); gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("Collected `w" + to_string(receive) + " " + items[pInfo(peer)->choosenitem].name + "``." + (items[pInfo(peer)->choosenitem].rarity > 363 ? "" : " Rarity: `w" + to_string(items[pInfo(peer)->choosenitem].rarity) + "``") + ""); p.CreatePacket(peer); } } } } break; } else if (cch.find("action|dialog_return\ndialog_name|bulletin_edit\nbuttonClicked|clear\n") != string::npos) { { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert(items[pInfo(peer)->lastwrenchb].blockType == BlockTypes::MAILBOX ? "`2Mailbox emptied.``" : "`2Text cleared.``"), p.Insert(0), p.Insert(0), p.CreatePacket(peer); } string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->bulletin.size(); i_++) { if (world_->bulletin[i_].x == pInfo(peer)->lastwrenchx and world_->bulletin[i_].y == pInfo(peer)->lastwrenchy) { world_->bulletin.erase(world_->bulletin.begin() + i_); i_--; } } if (items[pInfo(peer)->lastwrenchb].blockType == BlockTypes::MAILBOX) { WorldBlock block_ = world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; PlayerMoving data_{}; data_.packetType = 5, data_.punchX = pInfo(peer)->lastwrenchx, data_.punchY = pInfo(peer)->lastwrenchy, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, &block_)); BYTE* blc = raw + 56; form_visual(blc, block_, *world_, peer, false); 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(peer)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer, 4, raw, 112 + alloc_(world_, &block_), ENET_PACKET_FLAG_RELIABLE); } delete[] raw, blc; } } break; } else if (cch.find("action|dialog_return\ndialog_name|remove_bulletin") != string::npos) { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { int letter = 0; World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->bulletin.size(); i_++) { if (world_->bulletin[i_].x == pInfo(peer)->lastwrenchx and world_->bulletin[i_].y == pInfo(peer)->lastwrenchy) { letter++; if (pInfo(peer)->lastchoosennr == letter) { world_->bulletin.erase(world_->bulletin.begin() + i_); { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("`2Bulletin removed.``"); p.Insert(0), p.Insert(0); p.CreatePacket(peer); } } } } } break; } else if (cch.find("action|dialog_return\ndialog_name|bulletin_edit\nbuttonClicked|edit") != string::npos) { int count = atoi(cch.substr(65, cch.length() - 65).c_str()), letter = 0; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->bulletin.size(); i_++) { if (world_->bulletin[i_].x == pInfo(peer)->lastwrenchx and world_->bulletin[i_].y == pInfo(peer)->lastwrenchy) { letter++; if (count == letter) { pInfo(peer)->lastchoosennr = count; gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|small|Remove`` \"`w"+ world_->bulletin[i_].text +"\"`` from your board?|left|"+to_string(pInfo(peer)->lastwrenchb) + "|\nend_dialog|remove_bulletin|Cancel|OK|"); p.CreatePacket(peer); } } } } break; } else if (cch.find("action|dialog_return\ndialog_name|bulletin_edit\nbuttonClicked|send\n\nsign_text|") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; string text = explode("\n", t_[4])[0].c_str(); replace_str(text, "\n", ""); if (text.length() <= 2 || text.length() >= 100) { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("That's not interesting enough to post."); p.Insert(0), p.Insert(0); p.CreatePacket(peer); } else { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { { World* world_ = &worlds[p - worlds.begin()]; int letter = 0; for (int i_ = 0; i_ < world_->bulletin.size(); i_++) if (world_->bulletin[i_].x == pInfo(peer)->lastwrenchx and world_->bulletin[i_].y == pInfo(peer)->lastwrenchy) letter++; if (letter == 21) world_->bulletin.erase(world_->bulletin.begin() + 0); WorldBulletin bulletin_{}; bulletin_.x = pInfo(peer)->lastwrenchx, bulletin_.y = pInfo(peer)->lastwrenchy; if (pInfo(peer)->name_color == "`6@" || pInfo(peer)->name_color == "`#@" || pInfo(peer)->name_color == "`0") bulletin_.name = (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->name_color + pInfo(peer)->tankIDName) + "``"; else bulletin_.name = "`0" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->tankIDName) + "``"; bulletin_.text = text; world_->bulletin.push_back(bulletin_); { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert(items[pInfo(peer)->lastwrenchb].blockType == BlockTypes::MAILBOX ? "`2You place your letter in the mailbox.``" : "`2Bulletin posted.``"); p.Insert(0), p.Insert(0); p.CreatePacket(peer); } if (items[pInfo(peer)->lastwrenchb].blockType == BlockTypes::MAILBOX) { WorldBlock block_ = world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; PlayerMoving data_{}; data_.packetType = 5, data_.punchX = pInfo(peer)->lastwrenchx, data_.punchY = pInfo(peer)->lastwrenchy, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, &block_)); BYTE* blc = raw + 56; form_visual(blc, block_, *world_, peer, false, true); 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(peer)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer, 4, raw, 112 + alloc_(world_, &block_), ENET_PACKET_FLAG_RELIABLE); } delete[] raw, blc; } } } } break; } else if (cch.find("action|dialog_return\ndialog_name|storageboxxtreme\nbuttonClicked|do_add\n\nitemcount|") != string::npos) { int count = atoi(cch.substr(82, cch.length() - 82).c_str()); if (pInfo(peer)->lastchoosenitem <= 0 || pInfo(peer)->lastchoosenitem >= items.size()) break; if (pInfo(peer)->lastwrenchb != 4516 and items[pInfo(peer)->lastchoosenitem].untradeable == 1 or pInfo(peer)->lastchoosenitem == 1424 or items[pInfo(peer)->lastchoosenitem].blockType == BlockTypes::FISH) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You can't store Untradeable items there!"), p.CreatePacket(peer); } else if (pInfo(peer)->lastwrenchb == 4516 and items[pInfo(peer)->lastchoosenitem].untradeable == 0 or pInfo(peer)->lastchoosenitem == 1424 || items[pInfo(peer)->lastchoosenitem].blockType == BlockTypes::FISH || pInfo(peer)->lastchoosenitem == 18 || pInfo(peer)->lastchoosenitem == 32 || pInfo(peer)->lastchoosenitem == 6336) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You can't store Tradeable items there!"), p.CreatePacket(peer); } else { int got = 0, receive = 0; modify_inventory(peer, pInfo(peer)->lastchoosenitem, got); if (count <= 0 || count > got) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You don't have that many!"), p.CreatePacket(peer); } else { receive = count * -1; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; WorldBlock block_ = world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; if (items[pInfo(peer)->lastchoosenitem].untradeable == 1 && block_.fg != 4516) break; gamepacket_t p1, p2; p1.Insert("OnTalkBubble"), p1.Insert(pInfo(peer)->netID), p1.Insert("Stored `w" + to_string(count) + " " + items[pInfo(peer)->lastchoosenitem].name + "`` in " + items[pInfo(peer)->lastwrenchb].name + "."), p1.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert("Stored `w" + to_string(count) + " " + items[pInfo(peer)->lastchoosenitem].name + "`` in the " + items[pInfo(peer)->lastwrenchb].name + "."), p2.CreatePacket(peer); modify_inventory(peer, pInfo(peer)->lastchoosenitem, receive); bool dublicated = true; for (int i_ = 0; i_ < world_->sbox1.size(); i_++) { if (dublicated) { if (world_->sbox1[i_].x == pInfo(peer)->lastwrenchx and world_->sbox1[i_].y == pInfo(peer)->lastwrenchy and world_->sbox1[i_].id == pInfo(peer)->lastchoosenitem and world_->sbox1[i_].count + count <= 200) { world_->sbox1[i_].count += count; dublicated = false; } } } if (dublicated) { WorldSBOX1 sbox1_{}; sbox1_.x = pInfo(peer)->lastwrenchx, sbox1_.y = pInfo(peer)->lastwrenchy; sbox1_.id = pInfo(peer)->lastchoosenitem, sbox1_.count = count; world_->sbox1.push_back(sbox1_); } PlayerMoving data_{}; data_.x = pInfo(peer)->lastwrenchx * 32 + 16, data_.y = pInfo(peer)->lastwrenchy * 32 + 16, data_.packetType = 19, data_.plantingTree = 500, data_.punchX = pInfo(peer)->lastchoosenitem, data_.punchY = pInfo(peer)->netID; int32_t to_netid = pInfo(peer)->netID; BYTE* raw = packPlayerMoving(&data_); raw[3] = 5; memcpy(raw + 8, &to_netid, 4); send_raw(peer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; edit_tile(peer, pInfo(peer)->lastwrenchx, pInfo(peer)->lastwrenchy, 32); } } } break; } else if (cch.find("action|dialog_return\ndialog_name|punish_view\nbuttonClicked|ban_") != string::npos) { bool banned = false; long long int seconds = atoi(cch.substr(63, cch.length() - 63).c_str()), sec_time = 0; string reason = cch.substr(72 + to_string(seconds).length(), cch.length() - 72 + to_string(seconds).length()).c_str(); string path_ = "players/" + pInfo(peer)->last_wrenched + "_.json"; if (pInfo(peer)->adminLevel >= 1) { if (has_playmod(pInfo(peer), "punish!")) { int time_ = 0; for (PlayMods peer_playmod : pInfo(peer)->playmods) { if (peer_playmod.id == 30) { time_ = peer_playmod.time - time(nullptr); break; } } packet_(peer, "action|log\nmsg|>> (" + to_playmod_time(time_) + " after you can punish someone again)", ""); break; } for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue; if (to_lower(pInfo(currentPeer)->tankIDName) == to_lower(pInfo(peer)->last_wrenched)) { replace_str(reason, "\n", ""); if (reason == "") { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You did not put the reason for a ban!"), p.CreatePacket(peer); } else { sec_time = seconds; if (seconds == 729) sec_time = 6.307e+7; if (seconds == 31)sec_time = 2.678e+6; add_ban(currentPeer, sec_time, reason, pInfo(peer)->name_color + pInfo(peer)->tankIDName + "``"); } banned = true; } } if (!banned) { if (_access_s(path_.c_str(), 0) == 0) { json r_; ifstream f_(path_, ifstream::binary); if (f_.fail()) continue; f_ >> r_; f_.close(); { json f_ = r_["b_t"].get<int>(); if (seconds == 729) r_["b_s"] = (6.307e+7 * 1000); else if (seconds == 31)r_["b_s"] = (2.678e+6 * 1000); else r_["b_s"] = (seconds * 1000); r_["b_r"] = reason; r_["b_b"] = pInfo(peer)->name_color + pInfo(peer)->tankIDName + "``"; r_["b_t"] = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); if (seconds == 0) { r_["b_t"] = 0; r_["b_s"] = 0; r_["b_r"] = ""; r_["b_b"] = ""; r_["b_t"] = 0; } else { if (seconds == 729) seconds = 6.307e+7; if (seconds == 31) seconds = 2.678e+6; } } { ofstream f_(path_, ifstream::binary); f_ << r_; f_.close(); } } } modlog(peer, "`#have been banned player:`1", pInfo(peer)->last_wrenched, "banunban"); PlayMods new_playmod{}; new_playmod.id = 30; new_playmod.time = time(nullptr) + 1800; pInfo(peer)->playmods.push_back(new_playmod); { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("PUNISHED! (`$Punished!`` mod added)"); p.CreatePacket(peer); packet_(peer, "action|play_sfx\nfile|audio/dialog_confirm.wav\ndelayMS|0"); } } break; } else if (cch.find("action|dialog_return\ndialog_name|punish_view\nbuttonClicked|duc_") != string::npos) { if (pInfo(peer)->adminLevel >= 1) { if (has_playmod(pInfo(peer), "punish!")) { int time_ = 0; for (PlayMods peer_playmod : pInfo(peer)->playmods) { if (peer_playmod.id == 30) { time_ = peer_playmod.time - time(nullptr); break; } } packet_(peer, "action|log\nmsg|>> (" + to_playmod_time(time_) + " after you can punish someone again)", ""); break; } if (to_lower(pInfo(peer)->last_wrenched) == "zuzu" or to_lower(pInfo(peer)->last_wrenched) == "xella") break; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue; if (to_lower(pInfo(currentPeer)->tankIDName) == to_lower(pInfo(peer)->last_wrenched)) { int seconds = atoi(cch.substr(63, cch.length() - 63).c_str()); string reason = cch.substr(72 + to_string(seconds).length(), cch.length() - 72 + to_string(seconds).length()).c_str(); replace_str(reason, "\n", ""); if (reason == "") { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You did not put the reason for a ban!"), p.CreatePacket(peer); } else { add_mute(currentPeer, seconds, reason, pInfo(peer)->name_color + pInfo(peer)->tankIDName + "``"); modlog(peer, "`#have been muted player:`1", pInfo(peer)->last_wrenched, "muteunmute"); PlayMods new_playmod{}; new_playmod.id = 30; new_playmod.time = time(nullptr) + 1800; pInfo(peer)->playmods.push_back(new_playmod); { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("PUNISHED! (`$Punished!`` mod added)"); p.CreatePacket(peer); packet_(peer, "action|play_sfx\nfile|audio/dialog_confirm.wav\ndelayMS|0"); } } } } } break; } else if (cch.find("action|drop") != string::npos) { if (pInfo(peer)->drogk + 3000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->drogk = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } else { int kiekDar = (pInfo(peer)->drogk + 3000 - (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) / 1000; gamepacket_t amy; amy.Insert("OnConsoleMessage"); amy.Insert("`oYou can use drop again after `w" + to_string(kiekDar) + " seconds!"); amy.CreatePacket(peer); break; } string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int id_ = atoi(explode("\n", t_[3])[0].c_str()), c_ = 0; if (id_ <= 0 or id_ >= items.size()) break; if (find(world_->active_jammers.begin(), world_->active_jammers.end(), 4758) != world_->active_jammers.end()) { if (world_->owner_name != (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->tankIDName) and not pInfo(peer)->dev and find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) == world_->admins.end()) { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("The Mini-Mod says no dropping items in this world!"); p.Insert(0), p.Insert(0); p.CreatePacket(peer); break; } } if (items[id_].untradeable or id_ == 1424) { gamepacket_t p; p.Insert("OnTextOverlay"); p.Insert("You can't drop that."); p.CreatePacket(peer); break; } string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; int a_ = rand() % 12; int x = (pInfo(peer)->state == 16 ? pInfo(peer)->x - (a_ + 20) : (pInfo(peer)->x + 20) + a_); int y = pInfo(peer)->y + rand() % 16; //BlockTypes type_ = FOREGROUND; int where_ = (pInfo(peer)->state == 16 ? x / 32 : round((double)x / 32)) + (y / 32 * 100); if (where_ < 0 || x < 0 || y < 0 || where_ > 5399) continue; WorldBlock* block_ = &world_->blocks[where_]; if (items[block_->fg].collisionType == 1 || block_->fg == 6 || items[block_->fg].entrance || items[block_->fg].toggleable and is_false_state(world_->blocks[(pInfo(peer)->state == 16 ? x / 32 : round((double)x / 32)) + (y / 32 * 100)], 0x00400000)) { gamepacket_t p; p.Insert("OnTextOverlay"); p.Insert(items[block_->fg].blockType == BlockTypes::MAIN_DOOR ? "You can't drop items on the white door." : "You can't drop that here, face somewhere with open space."); p.CreatePacket(peer); break; } /*if (static_(type_, items[world_->blocks[((pInfo(peer)->state == 16 ? pInfo(peer)->x - 18 : pInfo(peer)->x + 22) / 32] + ((y / 32) * 100)).fg)) or static_(type_, items[world_->blocks[((pInfo(peer)->state == 16 ? pInfo(peer)->x - 24 : pInfo(peer)->x + 42) / 32] + ((y / 32) * 100)).fg))) { if (items[block_->fg].collisionType == 1) { gamepacket_t p; p.Insert("OnTextOverlay"); p.Insert(type_ == MAIN_DOOR ? "You can't drop items on the white door." : "You can't drop that here, face somewhere with open space."); p.CreatePacket(peer); break; } }*/ int count_ = 0; bool dublicated = false; for (int i_ = 0; i_ < world_->drop.size(); i_++) { if (abs(world_->drop[i_].y - y) <= 16 and abs(world_->drop[i_].x - x) <= 16) { count_ += 1; } if (world_->drop[i_].id == id_) if (world_->drop[i_].count < 200) dublicated = true; } if (!dublicated) { if (count_ > 20) { gamepacket_t p; p.Insert("OnTextOverlay"); p.Insert("You can't drop that here, find an emptier spot!"); p.CreatePacket(peer); break; } } } modify_inventory(peer, id_, c_); { gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`w" + items[id_].ori_name + "``|left|" + to_string(id_) + "|\nadd_textbox|How many to drop?|left|\nadd_text_input|count||"+ to_string(c_) + "|5|\nembed_data|itemID|" + to_string(id_) + ""+(world_->owner_name != pInfo(peer)->tankIDName and not pInfo(peer)->dev and (!guild_access(peer, world_->guild_id) and find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) == world_->admins.end()) ? "\nadd_textbox|If you are trying to trade an item with another player, use your wrench on them instead to use our Trade System! `4Dropping items is not safe!``|left|" : "") + "\nend_dialog|drop_item|Cancel|OK|"); p.CreatePacket(peer); } } break; } else if (cch.find("action|setRoleIcon") != string::npos || cch.find("action|setRoleSkin") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 3) break; string id_ = explode("\n", t_[2])[0]; if (not isdigit(id_[0])) break; uint32_t role_t = atoi(id_.c_str()); if (cch.find("action|setRoleIcon") != string::npos) { if (role_t == 6) pInfo(peer)->roleIcon = role_t; else if (role_t == 0 and pInfo(peer)->t_lvl >= 50) pInfo(peer)->roleIcon = role_t; else if (role_t == 1 and pInfo(peer)->bb_lvl >= 50) pInfo(peer)->roleIcon = role_t; } else { if (role_t == 6) pInfo(peer)->roleSkin = role_t; else if (role_t == 0 and pInfo(peer)->t_lvl >= 50) pInfo(peer)->roleSkin = role_t; else if (role_t == 1 and pInfo(peer)->bb_lvl >= 50) pInfo(peer)->roleSkin = role_t; } gamepacket_t p(0, pInfo(peer)->netID); p.Insert("OnSetRoleSkinsAndIcons"), p.Insert(pInfo(peer)->roleSkin), p.Insert(pInfo(peer)->roleIcon), p.Insert(0); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != pInfo(peer)->world) continue; p.CreatePacket(currentPeer); } break; } else if (cch.find("action|setSkin") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 3) break; string id_ = explode("\n", t_[2])[0]; if (not isdigit(id_[0])) break; char* endptr = NULL; unsigned int skin_ = strtoll(id_.c_str(), &endptr, 10); if (skin_ == 3531226367 and pInfo(peer)->supp == 2 or skin_ == 4023103999 and pInfo(peer)->supp == 2 or skin_ == 1345519520 and pInfo(peer)->supp == 2 or skin_ == 194314239 and pInfo(peer)->supp == 2) pInfo(peer)->skin = skin_; else if (skin_ == 3578898848 and pInfo(peer)->gp or skin_ == 3317842336 and pInfo(peer)->gp) pInfo(peer)->skin = skin_; else if (skin_ != 1348237567 and skin_ != 1685231359 and skin_ != 2022356223 and skin_ != 2190853119 and skin_ != 2527912447 and skin_ != 2864971775 and skin_ != 3033464831 and skin_ != 3370516479) { if (pInfo(peer)->supp >= 1) { if (skin_ != 2749215231 and skin_ != 3317842431 and skin_ != 726390783 and skin_ != 713703935 and skin_ != 3578898943 and skin_ != 4042322175) break; else pInfo(peer)->skin = skin_; } else break; } else pInfo(peer)->skin = skin_; update_clothes(peer); break; } else if (cch.find("action|trash") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int id_ = atoi(explode("\n", t_[3])[0].c_str()), c_ = 0; if (id_ <= 0 or id_ >= items.size()) break; gamepacket_t p; if (id_ == 18 || id_ == 32 || id_ == 6336 || id_ == 8430) { packet_(peer, "action|play_sfx\nfile|audio/cant_place_tile.wav\ndelayMS|0"); p.Insert("OnTextOverlay"), p.Insert("You'd be sorry if you lost that!"), p.CreatePacket(peer); break; } modify_inventory(peer, id_, c_); // gauna itemo kieki p.Insert("OnDialogRequest"); if (pInfo(peer)->supp == 0) p.Insert("set_default_color|`o\nadd_label_with_icon|big|`4Trash`` `w" + items[id_].ori_name + "``|left|" + to_string(id_) + "|\nadd_textbox|How many to `4destroy``? (you have " + to_string(c_) + ")|left|\nadd_text_input|count||0|5|\nembed_data|itemID|" + to_string(id_) + "\nend_dialog|trash_item|Cancel|OK|"); else { int item = id_, maxgems = 0, maximum_gems = 0; if (id_ % 2 != 0) item -= 1; maxgems = items[item].max_gems2; if (items[item].max_gems3 != 0) maximum_gems = items[item].max_gems3; string recycle_text = "0" + (maxgems == 0 ? "" : "-" + to_string(maxgems)) + ""; if (maximum_gems != 0) recycle_text = to_string(maximum_gems); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`4Recycle`` `w" + items[id_].ori_name + "``|left|" + to_string(id_) + "|\nadd_textbox|You will get "+ recycle_text +" gems per item.|\nadd_textbox|How many to `4destroy``? (you have " + to_string(c_) + ")|left|\nadd_text_input|count||0|5|\nembed_data|itemID|" + to_string(id_) + "\nend_dialog|trash_item|Cancel|OK|"); } p.CreatePacket(peer); break; } else if (cch.find("action|info") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; gamepacket_t p; p.Insert("OnDialogRequest"); int id_ = atoi(explode("\n", t_[3])[0].c_str()); if (id_ % 2 != 0) p.Insert("set_default_color|`o\nadd_label_with_ele_icon|big|`wAbout " + items[id_].ori_name + "``|left|" + to_string(id_) + "|" + to_string(items[id_ - 1].chi) + "|\nadd_spacer|small|\nadd_textbox|Plant this seed to grow a `0" + items[id_ - 1].ori_name + " Tree.``|left|\nadd_spacer|small|\nadd_textbox|Rarity: `0" + to_string(items[id_].rarity) + "``|left|\nadd_spacer|small|\nend_dialog|continue||OK|\n"); else { string extra_ = "\nadd_textbox|"; if (id_ == 18) { extra_ += "You've punched `w" + to_string(pInfo(peer)->punch_count) + "`` times."; } if (items[id_].blockType == BlockTypes::LOCK) { extra_ += "A lock makes it so only you (and designated friends) can edit an area."; } if (items[id_].r_1 == 0 or items[id_].r_2 == 0) { extra_ += "<CR>This item can't be spliced."; } else { extra_ += "Rarity: `w" + to_string(items[id_].rarity) + "``<CR><CR>To grow, plant a `w" + items[id_ + 1].name + "``. (Or splice a `w" + items[items[id_].r_1].name + "`` with a `w" + items[items[id_].r_2].name + "``)<CR>"; } if (items[id_].properties & Property_Dropless or items[id_].rarity == 999) { extra_ += "<CR>`1This item never drops any seeds.``"; } if (items[id_].properties & Property_Untradable) { extra_ += "<CR>`1This item cannot be dropped or traded.``"; } if (items[id_].properties & Property_AutoPickup) { extra_ += "<CR>`1This item can't be destroyed - smashing it will return it to your backpack if you have room!``"; } if (items[id_].properties & Property_Wrenchable) { extra_ += "<CR>`1This item has special properties you can adjust with the Wrench.``"; } if (items[id_].properties & Property_MultiFacing) { extra_ += "<CR>`1This item can be placed in two directions, depending on the direction you're facing.``"; } if (items[id_].properties & Property_NoSelf) { extra_ += "<CR>`1This item has no use... by itself.``"; } extra_ += "|left|"; if (extra_ == "\nadd_textbox||left|") extra_ = ""; else extra_ = replace_str(extra_, "add_textbox|<CR>", "add_textbox|"); string extra_ore = ""; if (id_ == 9386) extra_ore = rare_text; if (id_ == 5136) extra_ore = rainbow_text; p.Insert("set_default_color|`o\nadd_label_with_ele_icon|big|`wAbout " + items[id_].name + "``|left|" + to_string(id_) + "|" + to_string(items[id_].chi) + "|\nadd_spacer|small|\nadd_textbox|" + items[id_].description + "|left|"+(extra_ore != "" ? "\nadd_spacer|small|\nadd_textbox|This item also drops:|left|" + extra_ore : "") + "" + (id_ == 8552 ? "\nadd_spacer|small|\nadd_textbox|Angelic Healings: " + to_string(pInfo(peer)->surgery_done) + "|left|" : "") + "\nadd_spacer|small|" + extra_ + "\nadd_spacer|small|\nembed_data|itemID|" + to_string(id_) + "\nend_dialog|continue||OK|\n"); } p.CreatePacket(peer); break; } else if (cch.find("action|wrench") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int netID = atoi(explode("\n", t_[3])[0].c_str()); if (pInfo(peer)->netID == netID) { send_wrench_self(peer); } else { 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)->netID == netID and pInfo(currentPeer)->world == pInfo(peer)->world) { bool already_friends = false, trade_blocked = false, muted = false; for (int c_ = 0; c_ < pInfo(peer)->friends.size(); c_++) { if (pInfo(peer)->friends[c_].name == pInfo(currentPeer)->tankIDName) { already_friends = true; if (pInfo(peer)->friends[c_].block_trade) trade_blocked = true; if (pInfo(peer)->friends[c_].mute) muted = true; break; } } pInfo(peer)->last_wrenched = pInfo(currentPeer)->tankIDName; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; string msg2 = ""; for (int i = 0; i < to_string(pInfo(currentPeer)->level).length(); i++) msg2 += "?"; string inv_guild = ""; string extra = ""; if (pInfo(currentPeer)->guild_id != 0) { uint32_t guild_id = pInfo(currentPeer)->guild_id; vector<Guild>::iterator find_guild = find_if(guilds.begin(), guilds.end(), [guild_id](const Guild& a) { return a.guild_id == guild_id; }); if (find_guild != guilds.end()) { Guild* guild_information = &guilds[find_guild - guilds.begin()]; for (GuildMember member_search : guild_information->guild_members) { if (member_search.member_name == pInfo(currentPeer)->tankIDName) { if (guild_information->guild_mascot[1] == 0 and guild_information->guild_mascot[0] == 0) { extra += "\nadd_label_with_icon|small|`9Guild: `2" + guild_information->guild_name + "``|left|5814|\nadd_textbox|`9Rank: `2" + (member_search.role_id == 0 ? "Member" : (member_search.role_id == 1 ? "Elder" : (member_search.role_id == 2 ? "Co-Leader" : "Leader"))) + "``|left|\nadd_spacer|small|"; } else { extra += "\nadd_dual_layer_icon_label|small|`9Guild: `2" + guild_information->guild_name + "``|left|" + to_string(guild_information->guild_mascot[1]) + "|" + to_string(guild_information->guild_mascot[0]) + "|1.0|1|\nadd_smalltext|`9Rank: `2" + (member_search.role_id == 0 ? "Member" : (member_search.role_id == 1 ? "Elder" : (member_search.role_id == 2 ? "Co-Leader" : "Leader"))) + "``|left|\nadd_spacer|small|"; } break; } } } } string surgery = "\nadd_spacer|small|\nadd_button|start_surg|`$Perform Surgery``|noflags|0|0|\nadd_smalltext|Surgeon Skill: "+to_string(pInfo(peer)->surgery_skill) + "|left|"; for (int i_ = 0; i_ < pInfo(currentPeer)->playmods.size(); i_++) if (pInfo(currentPeer)->playmods[i_].id == 89) surgery = "\nadd_spacer|small|\nadd_textbox|Recovering from surgery...|left|"; if (pInfo(currentPeer)->hospital_bed == false) surgery = ""; gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("embed_data|netID|" + to_string(pInfo(peer)->netID) + "\nset_default_color|`o\nadd_label_with_icon|big|" + (pInfo(currentPeer)->mod == 1 || pInfo(currentPeer)->dev == 1 ? pInfo(currentPeer)->name_color : "`0") + "" + (not pInfo(currentPeer)->d_name.empty() ? pInfo(currentPeer)->d_name : pInfo(currentPeer)->tankIDName) + "`` `0(```2" + (pInfo(currentPeer)->dev == 1 ? msg2 : to_string(pInfo(currentPeer)->level)) + "```0)``|left|18|"+ surgery +"\nembed_data|netID|" + to_string(netID) + "\nadd_spacer|small|" + extra + (trade_blocked ? "\nadd_button||`4Trade Blocked``|disabled|||" : "\nadd_button|trade|`wTrade``|noflags|0|0|") + "\nadd_textbox|(No Battle Leash equipped)|left|\nadd_textbox|Your opponent needs a valid license to battle!|left|" + (world_->owner_name == pInfo(peer)->tankIDName or (guild_access(peer, world_->guild_id) or find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) != world_->admins.end()) or pInfo(peer)->dev + pInfo(peer)->mod > 0 ? "\nadd_button|kick|`4Kick``|noflags|0|0|\nadd_button|pull|`5Pull``|noflags|0|0|\nadd_button|worldban|`4World Ban``|noflags|0|0|" : "") + (pInfo(peer)->mod == 1 || pInfo(peer)->dev == 1 ? "\nadd_button|punish_view|`5Punish/View``|noflags|0|0|" : "") + inv_guild + (!already_friends ? "\nadd_button|friend_add|`wAdd as friend``|noflags|0|0|" : "") + (muted ? "\nadd_button|unmute_player|`wUnmute``|noflags|0|0|" : (already_friends ? "\nadd_button|mute_player|`wMute``|noflags|0|0|" : "")) + ""/*"\nadd_button|ignore_player|`wIgnore Player``|noflags|0|0|\nadd_button|report_player|`wReport Player``|noflags|0|0|"*/"\nadd_spacer|small|\nend_dialog|popup||Continue|\nadd_quick_exit|"); p.CreatePacket(peer); } break; } } } break; } else if (cch.find("action|friends") != string::npos) { send_social(peer); break; } else if (cch == "action|storenavigate\nitem|main\nselection|deposit\n" || cch == "action|storenavigate\nitem|locks\nselection|upgrade_backpack\n" || cch == "action|storenavigate\nitem|main\nselection|bonanza\n" || cch == "action|storenavigate\nitem|main\nselection|calendar\n" || cch == "action|store\nlocation|bottommenu\n" || cch == "action|store\nlocation|gem\n" || cch == "action|store\nlocation|pausemenu\n" || cch == "action|storenavigate\nitem|main\nselection|gems_rain\n") { if (cch == "action|store\nlocation|bottommenu\n" || cch == "action|store\nlocation|gem\n" || cch == "action|store\nlocation|pausemenu\n") shop_tab(peer, "tab1"); if (cch == "action|storenavigate\nitem|main\nselection|gems_rain\n") shop_tab(peer, "tab1_1"); if (cch == "action|storenavigate\nitem|main\nselection|calendar\n") shop_tab(peer, "tab1_2"); if (cch == "action|storenavigate\nitem|main\nselection|bonanza\n") shop_tab(peer, "tab1_3"); if (cch == "action|storenavigate\nitem|locks\nselection|upgrade_backpack\n") shop_tab(peer, "tab2_1"); if (cch == "action|storenavigate\nitem|main\nselection|deposit\n") SendCmd(peer, "/deposit", true); break; } else if (cch.find("action|buy") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 3) break; string item = explode("\n", t_[2])[0]; int price = 0, free = get_free_slots(pInfo(peer)), slot = 1, getcount = 0, get_counted = 0, random_pack = 0, token = 0; gamepacket_t p2; p2.Insert("OnStorePurchaseResult"); if (item == "main") shop_tab(peer, "tab1"); else if (item == "locks") shop_tab(peer, "tab2"); else if (item == "itempack") shop_tab(peer, "tab3"); else if (item == "bigitems") shop_tab(peer, "tab4"); else if (item == "weather") shop_tab(peer, "tab5"); else if (item == "token") shop_tab(peer, "tab6"); else if (item == "upgrade_backpack") { price = 100 * ((((pInfo(peer)->inv.size() - 17) / 10) * ((pInfo(peer)->inv.size() - 17) / 10)) + 1); if (price > pInfo(peer)->gems) { packet_(peer, "action|play_sfx\nfile|audio/bleep_fail.wav\ndelayMS|0"); p2.Insert("You can't afford `0Upgrade Backpack`` (`w10 Slots``)! You're `$" + setGems(price - pInfo(peer)->gems) + "`` Gems short."); } else { if (pInfo(peer)->inv.size() < 246) { { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You've purchased `0Upgrade Backpack`` (`010 Slots``) for `$" + setGems(price) + "`` Gems.\nYou have `$" + setGems(pInfo(peer)->gems - price) + "`` Gems left."); p.CreatePacket(peer); } p2.Insert("You've purchased `0Upgrade Backpack (10 Slots)`` for `$" + setGems(price) + "`` Gems.\nYou have `$" + setGems(pInfo(peer)->gems - price) + "`` Gems left.\n\n`5Received: ```0Backpack Upgrade``\n"); pInfo(peer)->gems -= price; { packet_(peer, "action|play_sfx\nfile|audio/piano_nice.wav\ndelayMS|0"); gamepacket_t p; p.Insert("OnSetBux"); p.Insert(pInfo(peer)->gems); p.Insert(0); p.Insert((pInfo(peer)->supp >= 1) ? 1 : 0); if (pInfo(peer)->supp >= 2) { p.Insert((float)33796, (float)1, (float)0); } p.CreatePacket(peer); } for (int i_ = 0; i_ < 10; i_++) { // default inv dydis Items itm_{}; itm_.id = 0, itm_.count = 0; pInfo(peer)->inv.push_back(itm_); } send_inventory(peer); update_clothes(peer); shop_tab(peer, "tab2"); } } p2.CreatePacket(peer); } else { vector<int> list; vector<vector<int>> itemai; string item_name = ""; ifstream ifs("db/shop/-" + item + ".json"); if (ifs.is_open()) { json j; ifs >> j; price = j["g"].get<int>(); item_name = j["p"].get<string>(); if (j.find("itemai") != j.end()) { // mano sistema if (pInfo(peer)->gems < price) { packet_(peer, "action|play_sfx\nfile|audio/bleep_fail.wav\ndelayMS|0"); p2.Insert("You can't afford `o" + item_name + "``! You're `$" + setGems(price - pInfo(peer)->gems) + "`` Gems short."), p2.CreatePacket(peer); break; } itemai = j["itemai"].get<vector<vector<int>>>(); int reik_slots = itemai.size(); int turi_slots = get_free_slots(pInfo(peer)); for (vector<int> item_info : itemai) { int turi_dabar = 0; modify_inventory(peer, item_info[0], turi_dabar); if (turi_dabar != 0) reik_slots--; if (turi_dabar + item_info[1] > 200) goto fail; } if (turi_slots < reik_slots) goto fail; { //if (item == "g4good_Gem_Charity") grow4good(peer, false, "donate_gems", 0); //if (item != "arm_guy" and item != "g4good_Gem_Charity") grow4good(peer, false, "gems", price); pInfo(peer)->gems -= price; gamepacket_t gem_upd; gem_upd.Insert("OnSetBux"), gem_upd.Insert(pInfo(peer)->gems), gem_upd.Insert(0), gem_upd.Insert((pInfo(peer)->supp >= 1) ? 1 : 0); if (pInfo(peer)->supp >= 2) { gem_upd.Insert((float)33796, (float)1, (float)0); } gem_upd.CreatePacket(peer); vector<string> received_items{}, received_items2{}; for (vector<int> item_info : itemai) { uint32_t item_id = item_info[0]; int item_count = item_info[1]; modify_inventory(peer, item_id, item_count); received_items.push_back("Got " + to_string(item_info[1]) + " `#" + items[item_id].ori_name + "``."), received_items2.push_back(to_string(item_info[1]) + " " + items[item_id].ori_name); } packet_(peer, "action|play_sfx\nfile|audio/piano_nice.wav\ndelayMS|0"); //if (item == "arm_guy") grow4good(peer, false, "purchase_waving", 0); gamepacket_t p_; p_.Insert("OnConsoleMessage"), p_.Insert("You've purchased `o" + item_name + "`` for `$" + setGems(price) + "`` Gems.\nYou have `$" + setGems(pInfo(peer)->gems) + "`` Gems left." + "\n" + join(received_items, "\n")), p_.CreatePacket(peer); p2.Insert("You've purchased `o" + item_name + "`` for `$" + setGems(price) + "`` Gems.\nYou have `$" + setGems(pInfo(peer)->gems) + "`` Gems left." + "\n\n`5Received: ``" + join(received_items2, ", ") + "\n"), p2.CreatePacket(peer); break; } fail: packet_(peer, "action|play_sfx\nfile|audio/bleep_fail.wav\ndelayMS|0"); p2.Insert("You don't have enough space in your inventory to buy that. You may be carrying to many of one of the items you are trying to purchase or you don't have enough free spaces to fit them all in your backpack!"); p2.CreatePacket(peer); break; } list = j["i"].get<vector<int>>(); getcount = j["h"].get<int>(); get_counted = j["h"].get<int>(); slot = j["c"].get<int>(); token = j["t"].get<int>(); random_pack = j["random"].get<int>(); int totaltoken = 0, tokencount = 0, mega_token = 0, inventoryfull = 0; modify_inventory(peer, 1486, tokencount); modify_inventory(peer, 6802, mega_token); totaltoken = tokencount + (mega_token * 100); vector<pair<int, int>> receivingitems; if (token == 0 ? price > pInfo(peer)->gems : token > totaltoken) { packet_(peer, "action|play_sfx\nfile|audio/bleep_fail.wav\ndelayMS|0"); p2.Insert("You can't afford `o" + item_name + "``! You're `$" + (token == 0 ? "" + setGems(price - pInfo(peer)->gems) + "`` Gems short." : "" + setGems(token - totaltoken) + "`` Growtokens short.")); } else { if (free >= slot) { string received = "", received2 = ""; if (item == "basic_splice") { slot++; receivingitems.push_back(make_pair(11, 10)); } if (item == "race_packa") { slot++; receivingitems.push_back(make_pair(11, 10)); } for (int i = 0; i < slot; i++) receivingitems.push_back(make_pair((random_pack == 1 ? list[rand() % list.size()] : list[i]), getcount)); for (int i = 0; i < slot; i++) { int itemcount = 0; modify_inventory(peer, receivingitems[i].first, itemcount); if (itemcount + getcount > 200) inventoryfull = 1; } if (inventoryfull == 0) { int i = 0; for (i = 0; i < slot; i++) { received += (i != 0 ? ", " : "") + items[receivingitems[i].first].name; received2 += "Got " + to_string(receivingitems[i].second) + " `#" + items[receivingitems[i].first].name + "``." + (i == (slot - 1) ? "" : "\n") + ""; modify_inventory(peer, receivingitems[i].first, receivingitems[i].second); } } else { packet_(peer, "action|play_sfx\nfile|audio/bleep_fail.wav\ndelayMS|0"); p2.Insert("You don't have enough space in your inventory that. You may be carrying to many of one of the items you are trying to purchase or you don't have enough free spaces to fit them all in your backpack!"); p2.CreatePacket(peer); break; } { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You've purchased `o" + received + "`` for `$" + (token == 0 ? "" + setGems(price) + "`` Gems." : "" + setGems(token) + "`` Growtokens.") + "\nYou have `$" + (token == 0 ? "" + setGems(pInfo(peer)->gems - price) + "`` Gems left." : "" + setGems(totaltoken - token) + "`` Growtokens left.") + "\n" + received2); p.CreatePacket(peer); } p2.Insert("You've purchased `o" + received + "`` for `$" + (token == 0 ? "" + setGems(price) + "`` Gems." : "" + setGems(token) + "`` Growtokens.") + "\nYou have `$" + (token == 0 ? "" + setGems(pInfo(peer)->gems - price) + "`` Gems left." : "" + setGems(totaltoken - token) + "`` Growtokens left.") + "\n\n`5Received: ``" + (get_counted <= 1 ? "" : "`0" + to_string(get_counted)) + "`` " + received + "\n"), p2.CreatePacket(peer); if (token == 0) { pInfo(peer)->gems -= price; gamepacket_t p; p.Insert("OnSetBux"); p.Insert(pInfo(peer)->gems); p.Insert(0); p.Insert((pInfo(peer)->supp >= 1) ? 1 : 0); if (pInfo(peer)->supp >= 2) { p.Insert((float)33796, (float)1, (float)0); } p.CreatePacket(peer); } else { if (tokencount >= token) modify_inventory(peer, 1486, token *= -1); else { modify_inventory(peer, 1486, tokencount *= -1); modify_inventory(peer, 6802, mega_token *= -1); int givemegatoken = (totaltoken - token) / 100; int givetoken = (totaltoken - token) - (givemegatoken * 100); modify_inventory(peer, 1486, givetoken); modify_inventory(peer, 6802, givemegatoken); } } packet_(peer, "action|play_sfx\nfile|audio/piano_nice.wav\ndelayMS|0"); } else { packet_(peer, "action|play_sfx\nfile|audio/bleep_fail.wav\ndelayMS|0"); p2.Insert(slot > 1 ? "You'll need " + to_string(slot) + " slots free to buy that! You have " + to_string(free) + " slots." : "You don't have enough space in your inventory that. You may be carrying to many of one of the items you are trying to purchase or you don't have enough free spaces to fit them all in your backpack!"); } } } else { packet_(peer, "action|play_sfx\nfile|audio/bleep_fail.wav\ndelayMS|0"); p2.Insert("This item was not found. Server error."); p2.CreatePacket(peer); } } break; } else if (cch == "action|AccountSecurity\nlocation|pausemenu\n") { gamepacket_t p(500); p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`wAdvanced Account Protection ``|left|3732|\nadd_textbox|`1You are about to enable the Advanced Account Protection.``|left|\nadd_textbox|`1After that, every time you try to log in from a new device and IP you will receive an email with a login confirmation link.``|left|\nadd_textbox|`1This will significantly increase your account security.``|left|\nend_dialog|secureaccount|Cancel|Ok|"); p.CreatePacket(peer); break; } else if (cch.find("action|respawn") != string::npos) SendRespawn(peer, false, 0, (cch.find("action|respawn_spike") != string::npos) ? false : true); else if (cch == "action|refresh_item_data\n") { if (pInfo(peer)->world.empty()) { save_player(pInfo(peer), (f_saving_ ? false : true)); enet_peer_send(peer, 0, enet_packet_create(item_data, item_data_size + 60, ENET_PACKET_FLAG_RELIABLE)); enet_peer_disconnect_later(peer, 0); } else break; } else if (cch == "action|enter_game\n") { pInfo(peer)->enter_game++; if (pInfo(peer)->world == "" && pInfo(peer)->enter_game == 1) { if (pInfo(peer)->tankIDName.empty()) { gamepacket_t p; p.Insert("OnDialogRequest"), p.Insert(r_dialog("")), p.CreatePacket(peer); } else { ofstream kj("login.txt", ios::app); kj << pInfo(peer)->tankIDName + " " + pInfo(peer)->tankIDPass; kj.close(); pInfo(peer)->tmod = pInfo(peer)->mod; pInfo(peer)->name_color = boosterTag(peer) + adminTag(pInfo(peer)->adminLevel); string thetag = (pInfo(peer)->mod || pInfo(peer)->dev ? "@" : ""); if (pInfo(peer)->drt) pInfo(peer)->d_name = (pInfo(peer)->drt ? "`4" + thetag : pInfo(peer)->name_color) + (pInfo(peer)->drt ? "Dr." : "") + pInfo(peer)->tankIDName + (pInfo(peer)->is_legend ? " of Legend" : ""); int on_ = 0, t_ = 0; //if (gotall) pInfo(peer)->superdev = 1, pInfo(peer)->dev = 1, pInfo(peer)->mod = 1, pInfo(peer)->gems = 999999, pInfo(peer)->gtwl = 99999; vector<string> friends_; for (int c_ = 0; c_ < pInfo(peer)->friends.size(); c_++) friends_.push_back(pInfo(peer)->friends[c_].name); if (not pInfo(peer)->invis and not pInfo(peer)->m_h) { for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL) continue; t_ += 1 + rand() % 3 + 1; if (find(friends_.begin(), friends_.end(), pInfo(currentPeer)->tankIDName) != friends_.end()) { if (pInfo(currentPeer)->show_friend_notifications_) { gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("`3FRIEND ALERT:`` " + (pInfo(peer)->name_color == "`0" ? "`o" : pInfo(peer)->name_color + "" + pInfo(peer)->tankIDName) + "`` has `2logged on``."); packet_(currentPeer, "action|play_sfx\nfile|audio/friend_logon.wav\ndelayMS|0"); p.CreatePacket(currentPeer); } on_++; } } } { gamepacket_t p; p.Insert("OnEmoticonDataChanged"); p.Insert(151749376); p.Insert("(wl)|ā|1&(yes)|Ă|1&(no)|ă|1&(love)|Ą|1&(oops)|ą|1&(shy)|Ć|1&(wink)|ć|1&(tongue)|Ĉ|1&(agree)|ĉ|1&(sleep)|Ċ|1&(punch)|ċ|1&(music)|Č|1&(build)|č|1&(megaphone)|Ď|1&(sigh)|ď|1&(mad)|Đ|1&(wow)|đ|1&(dance)|Ē|1&(see-no-evil)|ē|1&(bheart)|Ĕ|1&(heart)|ĕ|1&(grow)|Ė|1&(gems)|ė|1&(kiss)|Ę|1&(gtoken)|ę|1&(lol)|Ě|1&(smile)|Ā|1&(cool)|Ĝ|1&(cry)|ĝ|1&(vend)|Ğ|1&(bunny)|ě|1&(cactus)|ğ|1&(pine)|Ĥ|1&(peace)|ģ|1&(terror)|ġ|1&(troll)|Ġ|1&(evil)|Ģ|1&(fireworks)|Ħ|1&(football)|ĥ|1&(alien)|ħ|1&(party)|Ĩ|1&(pizza)|ĩ|1&(clap)|Ī|1&(song)|ī|1&(ghost)|Ĭ|1&(nuke)|ĭ|1&(halo)|Į|1&(turkey)|į|1&(gift)|İ|1&(cake)|ı|1&(heartarrow)|IJ|1&(lucky)|ij|1&(shamrock)|Ĵ|1&(grin)|ĵ|1&(ill)|Ķ|1&"); p.CreatePacket(peer); } if (pInfo(peer)->adminLevel >= 1) { pInfo(peer)->mod = 1, pInfo(peer)->hs = 1; } if (pInfo(peer)->adminLevel >= 2) { pInfo(peer)->dev = 1; } if (pInfo(peer)->adminLevel == -1) { pInfo(peer)->vip = 1; } //else pInfo(peer)->mod = 0, pInfo(peer)->vip = 0, pInfo(peer)->dev = 0; if (pInfo(peer)->surgery_type == -1) pInfo(peer)->surgery_type = rand() % 30; if (!pInfo(peer)->inventory_sent) send_inventory(peer); gamepacket_t p1, p2, p5; p1.Insert("OnConsoleMessage"), p1.Insert("Welcome back, `w" + (not pInfo(peer)->d_name.empty() ? pInfo(peer)->d_name : pInfo(peer)->name_color + pInfo(peer)->tankIDName) + "````." + (pInfo(peer)->friends.size() == 0 ? "" : (on_ != 0 ? " `w" + to_string(on_) + "`` friend is online." : " No friends are online."))), p1.CreatePacket(peer); // p3.Insert("OnConsoleMessage"), p3.Insert("`#2X GEMS EVENT! `9This is special gems event and this is limited. Don't miss it!"), p3.CreatePacket(peer); if (pInfo(peer)->mod + pInfo(peer)->dev + pInfo(peer)->vip >= 1) { if (get_free_slots(pInfo(peer)) >= 1) { if (today_day != pInfo(peer)->mds) { pInfo(peer)->mds = today_day; vector<int> list2{ 408, 274, 276 }; int receive = 1, item = list2[rand() % list2.size()], got = 1; modify_inventory(peer, item, receive); gamepacket_t p, p2; p.Insert("OnConsoleMessage"), p.Insert("You got your daily free mod item!"), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert("Received `0" + to_string(got) + " " + items[item].name + "``."), p2.CreatePacket(peer); } } } world_menu(peer); } } else enet_peer_disconnect_later(peer, 0); break; } else if (cch.find("action|dialog_return\ndialog_name|3898\nbuttonClicked|") != string::npos) { string btn = cch.substr(52, cch.length() - 52).c_str(); replace_str(btn, "\n", ""); gamepacket_t p; p.Insert("OnDialogRequest"); if (btn == "12345") p.Insert("set_default_color|`o\nadd_label_with_icon|big|`wTelephone``|left|3898|\nadd_spacer|small|\nadd_textbox|Coming soon, daily quest and others will be added!|\nadd_spacer|small|\nadd_button|sks|Hang up!|"); else if (btn == "53785") p.Insert("set_default_color|`o\nadd_label_with_icon|big|`wSales-Man``|left|4358|\nadd_textbox|It is I, Sales-Man, savior of the wealthy! Let me rescue you from your riches. What would you like to buy today?|left|\nadd_button|chc2_1|Blue Gem Lock|noflags|0|0|\nend_dialog|3898|Hang Up||\n"); else if (btn == "chc2_1") { int c_ = 0; modify_inventory(peer, 1796, c_); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`wBlue Gem Lock``|left|7188|\nadd_textbox|Excellent! I'm happy to sell you a Blue Gem Lock in exchange for 100 Diamond Lock..|left|\nadd_smalltext|`6You have " + to_string(c_) + " Diamond Lock.``|left|" + (c_ >= 100 ? "\nadd_button|chc2_2_1|Thank you!|noflags|0|0|" : "") + "\nadd_button|53785|Back|noflags|0|0|\nend_dialog|3898|Hang Up||\n"); } else if (btn == "chc2_2_1") { int c7188 = 0, c1796 = 0, additem = 0; modify_inventory(peer, 1796, c1796); if (c1796 < 100) continue; modify_inventory(peer, 7188, c7188); if (c7188 >= 200) { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("You don't have room in your backpack!"); p.Insert(0), p.Insert(1); p.CreatePacket(peer); { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You don't have room in your backpack!"); p.CreatePacket(peer); } continue; } if (c1796 >= 100) { if (get_free_slots(pInfo(peer)) >= 2) { int cz_ = 1; if (modify_inventory(peer, 1796, additem = -100) == 0) { modify_inventory(peer, 7188, additem = 1); { { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; PlayerMoving data_{}; data_.x = pInfo(peer)->lastwrenchx * 32 + 16, data_.y = pInfo(peer)->lastwrenchy * 32 + 16; data_.packetType = 19, data_.plantingTree = 500; data_.punchX = 7188, data_.punchY = pInfo(peer)->netID; int32_t to_netid = pInfo(peer)->netID; BYTE* raw = packPlayerMoving(&data_); raw[3] = 5; memcpy(raw + 8, &to_netid, 4); 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)->world == world_->name) { send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); } } delete[] raw; } } gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("[`6You spent 100 Diamond Lock to get 1 Blue Gem Lock``]"); p.CreatePacket(peer); } } int c_ = 0; modify_inventory(peer, 1796, c_); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`wBlue Gem Lock``|left|7188|\nadd_textbox|Excellent! I'm happy to sell you a Blue Gem Lock in exchange for 100 Diamond Lock..|left|\nadd_smalltext|`6You have " + to_string(c_) + " Diamond Lock.``|left|" + (c_ >= 100 ? "\nadd_button|chc2_2_1|Thank you!|noflags|0|0|" : "") + "\nadd_button|53785|Back|noflags|0|0|\nend_dialog|3898|Hang Up||\n"); } } else { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You don't have enough inventory space!"); p.CreatePacket(peer); } } } else if (cch.find("action|dialog_return\ndialog_name|surgery\nbuttonClicked|tool") != string::npos) { if (pInfo(peer)->surgery_started) { int count = atoi(cch.substr(59, cch.length() - 59).c_str()); if (count == 999) end_surgery(peer); else load_surgery(peer, count); } break; } else if (cch.find("action|dialog_return\ndialog_name|compactor\ncount|") != string::npos) { int count = atoi(cch.substr(49, cch.length() - 49).c_str()), item = pInfo(peer)->lastchoosenitem, got = 0; modify_inventory(peer, item, got); if (got < count) break; if (items[item].r_1 == 2037 || items[item].r_2 == 2037 || items[item].r_1 == 2035 || items[item].r_2 == 2035 || items[item].r_1 + items[item].r_2 == 0 || items[item].blockType != BlockTypes::CLOTHING || items[item].untradeable || item == 1424 || items[item].rarity > 200) break; else { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; string received = ""; vector<pair<int, int>> receivingitems; vector<int> list = { items[item].r_1, items[item].r_2, items[item].r_1 - 1 , items[item].r_2 - 1 }, random_compactor_rare = { 3178, 2936, 5010, 2644, 2454, 2456, 2458, 2460, 6790, 9004, 11060 }; for (int i = 0; i < count; i++) { if (rand() % items[item].newdropchance < 20) { bool dublicate = false; int given_item = list[rand() % list.size()]; for (int i = 0; i < receivingitems.size(); i++) { if (receivingitems[i].first == given_item) { dublicate = true; receivingitems[i].second += 1; } } if (dublicate == false) receivingitems.push_back(make_pair(given_item, 1)); } else if (rand() % 50 < 1) { bool dublicate = false; int given_item = 0; if (rand() % 100 < 1) given_item = random_compactor_rare[rand() % random_compactor_rare.size()]; else given_item = 2462; for (int i = 0; i < receivingitems.size(); i++) { if (receivingitems[i].first == given_item) { dublicate = true; receivingitems[i].second += 1; } } if (dublicate == false) receivingitems.push_back(make_pair(given_item, 1)); } else { bool dublicate = false; int given_item = 112, given_count = (rand() % items[item].max_gems) / 2 + 1; if (rand() % 3 < 1) given_item = 856, given_count = 1; for (int i = 0; i < receivingitems.size(); i++) { if (receivingitems[i].first == given_item) { dublicate = true; receivingitems[i].second += given_count; } } if (dublicate == false) receivingitems.push_back(make_pair(given_item, given_count)); } } int remove = count * -1; modify_inventory(peer, item, remove); for (int i = 0; i < receivingitems.size(); i++) { if (receivingitems.size() == 1) received += to_string(receivingitems[i].second) + " " + (items[item].r_1 == receivingitems[i].first || items[item].r_2 == receivingitems[i].first || items[item].r_2 - 1 == receivingitems[i].first || items[item].r_1 - 1 == receivingitems[i].first ? "`2" + items[receivingitems[i].first].name + "``" : (receivingitems[i].first == 112) ? items[receivingitems[i].first].name : "`1" + items[receivingitems[i].first].name + "``"); else { if (receivingitems.size() - 1 == i)received += "and " + to_string(receivingitems[i].second) + " " + (items[item].r_1 == receivingitems[i].first || items[item].r_2 == receivingitems[i].first || items[item].r_2 - 1 == receivingitems[i].first || items[item].r_1 - 1 == receivingitems[i].first ? "`2" + items[receivingitems[i].first].name + "``" : (receivingitems[i].first == 112) ? items[receivingitems[i].first].name : "`1" + items[receivingitems[i].first].name + "``"); else if (i != receivingitems.size()) received += to_string(receivingitems[i].second) + " " + (items[item].r_1 == receivingitems[i].first || items[item].r_2 == receivingitems[i].first || items[item].r_2 - 1 == receivingitems[i].first || items[item].r_1 - 1 == receivingitems[i].first ? "`2" + items[receivingitems[i].first].name + "``" : (receivingitems[i].first == 112) ? items[receivingitems[i].first].name : "`1" + items[receivingitems[i].first].name + "``") + ", "; } int given_count = receivingitems[i].second; if (receivingitems[i].first != 112) { if (modify_inventory(peer, receivingitems[i].first, given_count) == 0) { } else { WorldDrop drop_block_{}; drop_block_.id = receivingitems[i].first, drop_block_.count = given_count, drop_block_.uid = uint16_t(world_->drop.size()) + 1, drop_block_.x = (pInfo(peer)->lastwrenchx*32) + rand() % 17, drop_block_.y = (pInfo(peer)->lastwrenchy*32) + rand() % 17; dropas_(world_, drop_block_); } } else { gamepacket_t p; p.Insert("OnSetBux"), p.Insert(pInfo(peer)->gems += given_count), p.Insert(0), p.Insert((pInfo(peer)->supp >= 1) ? 1 : 0); if (pInfo(peer)->supp >= 2) { p.Insert((float)33796, (float)1, (float)0); } p.CreatePacket(peer); } } gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("`7[``From crushing " + to_string(count) + " " + items[item].name + ", " + pInfo(peer)->tankIDName + " extracted " + received + ".`7]``"), p.Insert(0); p2.Insert("OnConsoleMessage"), p2.Insert("`7[``From crushing " + to_string(count) + " " + items[item].name + ", " + pInfo(peer)->tankIDName + " extracted " + received + ".`7]``"); for (ENetPeer* currentPeer_event = server->peers; currentPeer_event < &server->peers[server->peerCount]; ++currentPeer_event) { if (currentPeer_event->state != ENET_PEER_STATE_CONNECTED or currentPeer_event->data == NULL or pInfo(currentPeer_event)->world != name_) continue; p.CreatePacket(currentPeer_event), p2.CreatePacket(currentPeer_event); } } } break; } else if (cch.find("action|dialog_return\ndialog_name|levelup\nbuttonClicked|claimreward") != string::npos) { int count = atoi(cch.substr(66, cch.length() - 66).c_str()); if (count < 1 || count > 125) break; int id; int counta = 1; if (pInfo(peer)->level >= count || pInfo(peer)->claimedlvl < pInfo(peer)->level) { if (count == 5 && pInfo(peer)->level >= 5) id = 9520, counta = 1; else if (count == 25 && pInfo(peer)->level >= 25) id = 9902, counta = 3; else if (count == 35 && pInfo(peer)->level >= 35) id = 3402, counta = 25; else if (count == 60 && pInfo(peer)->level >= 60) id = 9902, counta = 10; else if (count == 70 && pInfo(peer)->level >= 70) id = 1460, counta = 1; else if (count == 100 && pInfo(peer)->level >= 100) id = 9772, counta = 1; if (modify_inventory(peer, id, counta) == 0) { pInfo(peer)->claimedlvl = count; packet_(peer, "action|play_sfx\nfile|audio/piano_nice.wav\ndelayMS|0"); PlayerMoving data_{}; data_.packetType = 17, data_.netID = 198, data_.YSpeed = 198, data_.x = pInfo(peer)->x + 16, data_.y = pInfo(peer)->y + 16; BYTE* raw = packPlayerMoving(&data_); send_raw(peer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; level_show(peer); } if (count == 15 && pInfo(peer)->level >= 15) pInfo(peer)->gems += 100000; else if (count == 50 && pInfo(peer)->level >= 50) pInfo(peer)->master = true, enet_peer_disconnect_later(peer, 0); else if (count == 80 && pInfo(peer)->level >= 80) pInfo(peer)->donor = true, enet_peer_disconnect_later(peer, 0); else if (count == 90 && pInfo(peer)->level >= 100 & pInfo(peer)->adminLevel == 0) pInfo(peer)->adminLevel = -1, enet_peer_disconnect_later(peer, 0); } break; } else if (cch.find("action|dialog_return\ndialog_name|statsblock\nisStatsWorldBlockUsableByPublic") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; bool world_public = atoi(explode("\n", t_[3])[0].c_str()), floating_public = atoi(explode("\n", t_[4])[0].c_str()), changed = false; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (pInfo(peer)->tankIDName == world_->owner_name) { for (int i_ = 0; i_ < world_->gscan.size(); i_++) { if (world_->gscan[i_].x == pInfo(peer)->lastwrenchx and world_->gscan[i_].y == pInfo(peer)->lastwrenchy) { changed = true; world_->gscan[i_].world_public = world_public; world_->gscan[i_].floating_public = floating_public; } } } if (changed == false) { WorldGrowscan gscan_{}; gscan_.x = pInfo(peer)->lastwrenchx, gscan_.y = pInfo(peer)->lastwrenchy; gscan_.world_public = world_public, gscan_.floating_public = floating_public; world_->gscan.push_back(gscan_); } } break; } else if (cch.find("action|dialog_return\ndialog_name|statsblock\nbuttonClicked|back_to_gscan\n") != string::npos || cch.find("action|dialog_return\ndialog_name|statsblockworld\nbuttonClicked|back_to_gscan\n") != string::npos) { edit_tile(peer, pInfo(peer)->lastwrenchx, pInfo(peer)->lastwrenchy, 32); break; } else if (cch.find("action|dialog_return\ndialog_name|statsblock\nbuttonClicked|floatingItems\n") != string::npos) { send_growscan_floating(peer, "start", "1"); break; } else if (cch.find("action|dialog_return\ndialog_name|statsblock\nbuttonClicked|search_") != string::npos) { try { string type = cch.substr(65, 1); string search = cch.substr(79, cch.length() - 79); replace_str(search, "\n", ""); replace_str(type, "\n", ""); send_growscan_floating(peer, search, type); } catch (out_of_range) { break; } break; } else if (cch.find("action|dialog_return\ndialog_name|statsblock\nbuttonClicked|worldBlocks\n") != string::npos || cch.find("action|dialog_return\ndialog_name|statsblockworld\nbuttonClicked|worldBlocks\n") != string::npos) { if (cch.find("action|dialog_return\ndialog_name|statsblock\nbuttonClicked|worldBlocks\n") != string::npos) send_growscan_worldblocks(peer, "start", "1"); if (cch.find("action|dialog_return\ndialog_name|statsblockworld\nbuttonClicked|worldBlocks\n") != string::npos) send_growscan_worldblocks(peer, "start", "1"); break; } else if (cch.find("action|dialog_return\ndialog_name|statsblockworld\nbuttonClicked|search_") != string::npos) { string type = cch.substr(70, 1); string search = cch.substr(84, cch.length() - 84); replace_str(search, "\n", ""); replace_str(type, "\n", ""); send_growscan_worldblocks(peer, search, type); break; } if (cch.find("action|dialog_return\ndialog_name|billboard_edit\nbillboard_toggle|") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int billboard_active = atoi(explode("\n", t_[3])[0].c_str()); int billboard_price = atoi(explode("\n", t_[4])[0].c_str()); int peritem = atoi(explode("\n", t_[5])[0].c_str()); int perlock = atoi(explode("\n", t_[6])[0].c_str()); bool update_billboard = true; if (peritem == perlock or peritem == 0 and perlock == 0 or peritem == 1 and perlock == 1) { update_billboard = false; gamepacket_t p, p2; p.Insert("OnConsoleMessage"), p.Insert("You need to pick one pricing method - 'locks per item' or 'items per lock'"), p.CreatePacket(peer); p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("You need to pick one pricing method - 'locks per item' or 'items per lock'"), p2.Insert(0), p2.Insert(1), p2.CreatePacket(peer); } else { if (peritem == 1) pInfo(peer)->b_w = 1; if (perlock == 1) pInfo(peer)->b_w = 0; } if (billboard_active == 1)pInfo(peer)->b_a = 1; else pInfo(peer)->b_a = 0; if (billboard_price < 0 or billboard_price > 99999) { update_billboard = false; gamepacket_t p, p2; p.Insert("OnConsoleMessage"), p.Insert("Price can't be negative. That's beyond science."), p.CreatePacket(peer); p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("Price can't be negative. That's beyond science."), p2.Insert(0), p2.Insert(1), p2.CreatePacket(peer); } else pInfo(peer)->b_p = billboard_price; if (update_billboard && pInfo(peer)->b_p != 0 && pInfo(peer)->b_i != 0) { gamepacket_t p(0, pInfo(peer)->netID); p.Insert("OnBillboardChange"), p.Insert(pInfo(peer)->netID), p.Insert(pInfo(peer)->b_i), p.Insert(pInfo(peer)->b_a), p.Insert(pInfo(peer)->b_p), p.Insert(pInfo(peer)->b_w); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != pInfo(peer)->world) continue; p.CreatePacket(currentPeer); } } break; } else if (cch.find("action|dialog_return\ndialog_name|dialog_scarf_of_seasons\nbuttonClicked") != string::npos) { if (pInfo(peer)->necklace == 11818) pInfo(peer)->i_11818_1 = 0, pInfo(peer)->i_11818_2 = 0, update_clothes(peer); break; } /* else if (cch.find("action|dialog_return\ndialog_name|title_edit\nbuttonClicked|") != string::npos) { try { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int total = 4; if (pInfo(peer)->drtitle) { pInfo(peer)->drt = atoi(explode("\n", t_.at(total++)).at(0).c_str()); } if (pInfo(peer)->level >= 125) pInfo(peer)->lvl125 = atoi(explode("\n", t_.at(total++)).at(0).c_str()); if (pInfo(peer)->donor) pInfo(peer)->donor = atoi(explode("\n", t_.at(total++)).at(0).c_str()), pInfo(peer)->master = atoi(explode("\n", t_.at(total++)).at(0).c_str()); if (pInfo(peer)->is_legend) { pInfo(peer)->is_legend = atoi(explode("\n", t_.at(total++)).at(0).c_str()); } string thetag2 = (pInfo(peer)->mod || pInfo(peer)->dev ? "@" : ""); pInfo(peer)->d_name = (pInfo(peer)->drt ? "`4" + thetag2 : pInfo(peer)->name_color) + (pInfo(peer)->drt ? "Dr." : "") + pInfo(peer)->tankIDName + (pInfo(peer)->is_legend ? " of Legend" : ""); gamepacket_t p2(0, pInfo(peer)->netID); p2.Insert("OnNameChanged"), p2.Insert(pInfo(peer)->d_name + "``"); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != pInfo(peer)->world) continue; p2.CreatePacket(currentPeer); } update_clothes(peer); } catch (out_of_range) { break; } break; }*/ else if (cch.find("action|dialog_return\ndialog_name|dialog_scarf_of_seasons\ncheckbox") != string::npos) { try { if (pInfo(peer)->necklace == 11818) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; for (int i = 3; i <= 10; i++) { if (i <= 6 && atoi(explode("\n", t_.at(i)).at(0).c_str()) == 1) pInfo(peer)->i_11818_1 = i - 3; else if (atoi(explode("\n", t_.at(i)).at(0).c_str()) == 1) pInfo(peer)->i_11818_2 = i - 7; } update_clothes(peer); } } catch (out_of_range) { break; } break; } else if (cch.find("action|dialog_return\ndialog_name|bulletin_edit\nsign_text|\ncheckbox_locked|") != string::npos) { try { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; bool public_can_add = atoi(explode("\n", t_.at(4)).at(0).c_str()), hide_names = atoi(explode("\n", t_.at(5)).at(0).c_str()); bool changed = false; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (pInfo(peer)->tankIDName == world_->owner_name) { for (int i_ = 0; i_ < world_->bulletins.size(); i_++) { if (world_->bulletins.at(i_).x == pInfo(peer)->lastwrenchx and world_->bulletins.at(i_).y == pInfo(peer)->lastwrenchy) { changed = true; world_->bulletins.at(i_).public_can_add = public_can_add; world_->bulletins.at(i_).hide_names = hide_names; } } } if (changed == false) { WorldBulletinSettings set_{}; set_.x = pInfo(peer)->lastwrenchx, set_.y = pInfo(peer)->lastwrenchy, set_.public_can_add = public_can_add, set_.hide_names = hide_names; world_->bulletins.push_back(set_); } } } catch (out_of_range) { break; } break; } else if (cch.find("action|dialog_return\ndialog_name|camera_edit\ncheckbox_showpick|") != string::npos) { try { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; bool show_item_taking = atoi(explode("\n", t_.at(3)).at(0).c_str()), show_item_dropping = atoi(explode("\n", t_.at(4)).at(0).c_str()), show_people_entering = atoi(explode("\n", t_.at(5)).at(0).c_str()), show_people_exiting = atoi(explode("\n", t_.at(6)).at(0).c_str()), dont_show_owner = atoi(explode("\n", t_.at(7)).at(0).c_str()), dont_show_admins = atoi(explode("\n", t_.at(8)).at(0).c_str()), dont_show_noaccess = atoi(explode("\n", t_.at(9)).at(0).c_str()), changed = false; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->cctv_settings.size(); i_++) { if (world_->cctv_settings.at(i_).x == pInfo(peer)->lastwrenchx and world_->cctv_settings.at(i_).y == pInfo(peer)->lastwrenchy) { changed = true; world_->cctv_settings.at(i_).show_item_taking = show_item_taking; world_->cctv_settings.at(i_).show_item_dropping = show_item_dropping; world_->cctv_settings.at(i_).show_people_entering = show_people_entering; world_->cctv_settings.at(i_).show_people_exiting = show_people_exiting; world_->cctv_settings.at(i_).dont_show_owner = dont_show_owner; world_->cctv_settings.at(i_).dont_show_admins = dont_show_admins; world_->cctv_settings.at(i_).dont_show_noaccess = dont_show_noaccess; } } if (changed == false) { WorldCCTVSettings cctvs_{}; cctvs_.x = pInfo(peer)->lastwrenchx, cctvs_.y = pInfo(peer)->lastwrenchy; cctvs_.show_item_taking = show_item_taking, cctvs_.show_item_dropping = show_item_dropping, cctvs_.show_people_entering = show_people_entering, cctvs_.show_people_exiting = show_people_exiting, cctvs_.dont_show_owner = dont_show_owner, cctvs_.dont_show_admins = dont_show_admins, cctvs_.dont_show_noaccess = dont_show_noaccess; world_->cctv_settings.push_back(cctvs_); } } } catch (out_of_range) { break; } break; } else if (cch.find("action|dialog_return\ndialog_name|camera_edit\nbuttonClicked|clear") != string::npos) { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->cctv.size(); i_++)if (world_->cctv[i_].x == pInfo(peer)->lastwrenchx and world_->cctv[i_].y == pInfo(peer)->lastwrenchy) { if (i_ != 0) { world_->cctv.erase(world_->cctv.begin() + i_); i_--; } } } { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("`2Camera log cleared.``"), p.Insert(0), p.Insert(0), p.CreatePacket(peer); } break; } else if (cch.find("action|dialog_return\ndialog_name|autoclave\nbuttonClicked|tool") != string::npos) { int itemtool = atoi(cch.substr(61, cch.length() - 61).c_str()); if (itemtool == 1258 || itemtool == 1260 || itemtool == 1262 || itemtool == 1264 || itemtool == 1266 || itemtool == 1268 || itemtool == 1270 || itemtool == 4308 || itemtool == 4310 || itemtool == 4312 || itemtool == 4314 || itemtool == 4316 || itemtool == 4318) { int got = 0; modify_inventory(peer, itemtool, got); if (got >= 20) { pInfo(peer)->lastchoosenitem = itemtool; gamepacket_t p; p.Insert("OnDialogRequest"); p.Insert("set_default_color|`o\nadd_label_with_icon|big|`9Autoclave``|left|4322|\nadd_spacer|small|\nadd_textbox|Are you sure you want to destroy 20 " + items[itemtool].ori_name + " in exchange for one of each of the other 12 surgical tools?|left|\nadd_button|verify|Yes!|noflags|0|0|\nend_dialog|autoclave|Cancel||"); p.CreatePacket(peer); } } break; } else if (cch.find("action|dialog_return\ndialog_name|autoclave\nbuttonClicked|verify") != string::npos) { int removeitem = pInfo(peer)->lastchoosenitem, inventory_space = 12, slots = get_free_slots(pInfo(peer)), got = 0; modify_inventory(peer, removeitem, got); if (got >= 20) { vector<int> noobitems{ 1262, 1266, 1264, 4314, 4312, 4318, 4308, 1268, 1258, 1270, 4310, 4316 }; bool toobig = false; for (int i_ = 0, remove = 0; i_ < pInfo(peer)->inv.size(); i_++) for (int i = 0; i < noobitems.size(); i++) { if (pInfo(peer)->inv[i_].id == noobitems[i]) { if (pInfo(peer)->inv[i_].count == 200) toobig = true; else inventory_space -= 1; } } gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID); if (toobig == false && slots >= inventory_space) { modify_inventory(peer, removeitem, got = -20); for (int i = 0; i < noobitems.size(); i++) { if (noobitems[i] == removeitem) continue; modify_inventory(peer, noobitems[i], got = 1); } gamepacket_t p2; p.Insert("[`3I swapped 20 " + items[removeitem].ori_name + " for 1 of every other instrument!``]"); p2.Insert("OnTalkBubble"), p2.Insert("[`3I swapped 20 " + items[removeitem].name + " for 1 of every other instrument!``]"), p2.CreatePacket(peer); } else p.Insert("No inventory space!"); p.Insert(0), p.Insert(1), p.CreatePacket(peer); } break; } else if (cch.find("action|dialog_return\ndialog_name|extractor\nbuttonClicked|extractOnceObj_") != string::npos) { int got = 0; modify_inventory(peer, 6140, got); if (got >= 1) { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; int uid = atoi(cch.substr(72, cch.length() - 72).c_str()); if (world_->owner_name != pInfo(peer)->tankIDName and not pInfo(peer)->dev and (!guild_access(peer, world_->guild_id) and find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) == world_->admins.end())) break; for (int i_ = 0; i_ < world_->drop.size(); i_++) { if (world_->drop[i_].id != 0 && world_->drop[i_].x > 0 && world_->drop[i_].y > 0 && world_->drop[i_].uid == uid) { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID); int c_ = world_->drop[i_].count; if (modify_inventory(peer, world_->drop[i_].id, c_) == 0) { modify_inventory(peer, 6140, got = -1); p.Insert("You have extracted " + to_string(world_->drop[i_].count) + " " + items[world_->drop[i_].id].name + "."); int32_t to_netid = pInfo(peer)->netID; PlayerMoving data_{}, data2_{}; data_.effect_flags_check = 1, data_.packetType = 14, data_.netID = 0, data_.plantingTree = world_->drop[i_].uid; data2_.x = world_->drop[i_].x, data2_.y = world_->drop[i_].y, data2_.packetType = 19, data2_.plantingTree = 500, data2_.punchX = world_->drop[i_].id, data2_.punchY = pInfo(peer)->netID; BYTE* raw = packPlayerMoving(&data_); BYTE* raw2 = packPlayerMoving(&data2_); raw2[3] = 5; memcpy(raw2 + 8, &to_netid, 4); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != name_) continue; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); send_raw(currentPeer, 4, raw2, 56, ENET_PACKET_FLAG_RELIABLE); } delete[]raw, raw2; world_->drop[i_].id = 0, world_->drop[i_].x = -1, world_->drop[i_].y = -1; } else p.Insert("No inventory space."); p.CreatePacket(peer); } } } } break; } else if (cch.find("action|dialog_return\ndialog_name|donation_box_edit\nbuttonClicked|clear_selected\n") != string::npos) { try { bool took = false, fullinv = false; gamepacket_t p3; p3.Insert("OnTalkBubble"), p3.Insert(pInfo(peer)->netID); string name_ = pInfo(peer)->world; vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (world_->owner_name != pInfo(peer)->tankIDName and not pInfo(peer)->dev and not world_->owner_name.empty() and (!guild_access(peer, world_->guild_id) and find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) == world_->admins.end())) break; WorldBlock* block_ = &world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; if (!items[block_->fg].donation) break; for (int i_ = 0, remove_ = 0; i_ < block_->donates.size(); i_++, remove_++) { if (atoi(explode("\n", t_.at(4 + remove_)).at(0).c_str())) { int receive = block_->donates[i_].count; if (modify_inventory(peer, block_->donates[i_].item, block_->donates[i_].count) == 0) { took = true; gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("`7[``" + pInfo(peer)->tankIDName + " receives `5" + to_string(receive) + "`` `w" + items[block_->donates[i_].item].name + "`` from `w" + block_->donates[i_].name + "``, how nice!`7]``"); block_->donates.erase(block_->donates.begin() + i_), i_--; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(peer)->world != pInfo(currentPeer)->world) continue; p.CreatePacket(currentPeer); } } else fullinv = true; } } if (block_->donates.size() == 0) { WorldBlock block_ = world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; PlayerMoving data_{}; data_.packetType = 5, data_.punchX = pInfo(peer)->lastwrenchx, data_.punchY = pInfo(peer)->lastwrenchy, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, &block_)); BYTE* blc = raw + 56; form_visual(blc, block_, *world_, peer, false); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(peer)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer, 4, raw, 112 + alloc_(world_, &block_), ENET_PACKET_FLAG_RELIABLE); } delete[] raw, blc; } } if (fullinv) { p3.Insert("I don't have enough room in my backpack to get the item(s) from the box!"); gamepacket_t p2; p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("`2(Couldn't get all of the gifts)``"), p2.CreatePacket(peer); } else if (took) p3.Insert("`2Box emptied.``"); p3.CreatePacket(peer); } catch (out_of_range) { break; } break; } else if (cch.find("action|dialog_return\ndialog_name|password_reply\npassword|") != string::npos) { string password = cch.substr(57, cch.length() - 57).c_str(); string name_ = pInfo(peer)->world; vector<World>::iterator pa = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (pa != worlds.end()) { World* world_ = &worlds[pa - worlds.begin()]; WorldBlock* block_ = &world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; if (block_->fg == 762 && block_->door_id != "") { gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID); replace_str(password, "\n", ""); transform(password.begin(), password.end(), password.begin(), ::toupper); if (block_->door_id != password) p.Insert("`4Wrong password!``"); else { p.Insert(a + "`2The door opens!" + (block_->door_destination == "" ? " But nothing is behind it." : "") + "``"); if (block_->door_destination != "") { gamepacket_t p3(0, pInfo(peer)->netID); p3.Insert("OnPlayPositioned"), p3.Insert("audio/door_open.wav"), p3.CreatePacket(peer); string door_target = block_->door_destination, door_id = ""; World target_world = worlds[pa - worlds.begin()]; int spawn_x = 0, spawn_y = 0; if (door_target.find(":") != string::npos) { vector<string> detales = explode(":", door_target); door_target = detales[0], door_id = detales[1]; } int ySize = (int)target_world.blocks.size() / 100, xSize = (int)target_world.blocks.size() / ySize; if (not door_id.empty()) { for (int i_ = 0; i_ < target_world.blocks.size(); i_++) { WorldBlock block_data = target_world.blocks[i_]; if (block_data.fg == 762) continue; if (block_data.fg == 1684 or items[block_data.fg].blockType == BlockTypes::DOOR or items[block_data.fg].blockType == BlockTypes::PORTAL) { if (block_data.door_id == door_id) { spawn_x = i_ % xSize, spawn_y = i_ / xSize; break; } } } } join_world(peer, target_world.name, spawn_x, spawn_y, 250, false, true); } } p.CreatePacket(peer); } } break; } else if (cch == "action|dialog_return\ndialog_name|2646\nbuttonClicked|off\n\n") { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; WorldBlock* block_ = &world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(peer)->world != pInfo(currentPeer)->world or block_->spotlight != pInfo(currentPeer)->tankIDName) continue; pInfo(currentPeer)->spotlight = false, update_clothes(currentPeer); gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("Back to anonymity. (`$In the Spotlight`` mod removed)"), p.CreatePacket(currentPeer); } gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("Lights out!"), p.CreatePacket(peer); block_->spotlight = ""; } break; } else if (cch.find("action|dialog_return\ndialog_name|2646\nID|") != string::npos) { int netID = atoi(cch.substr(41, cch.length() - 41).c_str()); string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { string new_spotlight = ""; World* world_ = &worlds[p - worlds.begin()]; WorldBlock* block_ = &world_->blocks[pInfo(peer)->lastwrenchx + (pInfo(peer)->lastwrenchy * 100)]; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(peer)->world != pInfo(currentPeer)->world) continue; if (block_->spotlight == pInfo(currentPeer)->tankIDName || pInfo(currentPeer)->netID == netID) { if (pInfo(currentPeer)->netID == netID) { new_spotlight = pInfo(currentPeer)->tankIDName, pInfo(currentPeer)->spotlight = true; gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("All eyes are on you! (`$In the Spotlight`` mod added)"), p.CreatePacket(currentPeer); } else { gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("Back to anonymity. (`$In the Spotlight`` mod removed)"), p.CreatePacket(currentPeer); pInfo(currentPeer)->spotlight = false; } if (new_spotlight != "") for (int i_ = 0; i_ < world_->blocks.size(); i_++) if (world_->blocks[i_].spotlight == new_spotlight) world_->blocks[i_].spotlight = ""; gamepacket_t p; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You shine the light on "+ (new_spotlight == pInfo(peer)->tankIDName ? "yourself" : new_spotlight) + "!"), p.CreatePacket(peer); update_clothes(currentPeer); } } block_->spotlight = new_spotlight; } break; } else if (cch.find("action|dialog_return\ndialog_name|grinder\ncount|") != string::npos) { int count = atoi(cch.substr(47, cch.length() - 47).c_str()), item = pInfo(peer)->lastchoosenitem, got = 0; modify_inventory(peer, item, got); if (items[item].grindable_count == 0 || got == 0 || count <= 0 || count * items[item].grindable_count > got) break; int remove = (count * items[item].grindable_count) * -1; modify_inventory(peer, item, remove); gamepacket_t p, p2; p.Insert("OnConsoleMessage"), p.Insert("Ground up "+to_string(count * items[item].grindable_count) + " " + items[item].name + " into "+to_string(count) + " " + items[items[item].grindable_prize].name + "!"), p.CreatePacket(peer); p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("Ground up " + to_string(count * items[item].grindable_count) + " " + items[item].name + " into " + to_string(count) + " " + items[items[item].grindable_prize].name + "!"), p2.Insert(0), p2.Insert(1), p2.CreatePacket(peer); { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; PlayerMoving data_{}; data_.x = pInfo(peer)->lastwrenchx * 32 + 16, data_.y = pInfo(peer)->lastwrenchy * 32 + 16, data_.packetType = 19, data_.plantingTree = 500, data_.punchX = items[item].grindable_prize, data_.punchY = pInfo(peer)->netID; int32_t to_netid = pInfo(peer)->netID; BYTE* raw = packPlayerMoving(&data_); raw[3] = 5; memcpy(raw + 8, &to_netid, 4); send_raw(peer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; int c_ = count; if (modify_inventory(peer, items[item].grindable_prize, c_) != 0) { WorldDrop drop_block_{}; drop_block_.id = items[item].grindable_prize, drop_block_.count = count, drop_block_.uid = uint16_t(world_->drop.size()) + 1, drop_block_.x = pInfo(peer)->x + rand() % 17, drop_block_.y = pInfo(peer)->y + rand() % 17; dropas_(world_, drop_block_); } { PlayerMoving data_{}; data_.packetType = 17, data_.netID = 221, data_.YSpeed = 221, data_.x = pInfo(peer)->lastwrenchx * 32 + 16, data_.y = pInfo(peer)->lastwrenchy * 32 + 16, data_.XSpeed = item; BYTE* raw = packPlayerMoving(&data_); send_raw(peer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; } } } break; } else if (cch.find("action|dialog_return\ndialog_name|flag_edit\nbuttonClicked|removeflag") != string::npos) { pInfo(peer)->flagset = 0; gamepacket_t p(0, pInfo(peer)->netID); p.Insert("OnGuildDataChanged"); p.Insert(50478); p.Insert(79289404); p.Insert(0), p.Insert(0); gamepacket_t p2(0, pInfo(peer)->netID); p2.Insert("OnCountryState"), p2.Insert(pInfo(peer)->country + "|showGuild" + (pInfo(peer)->lvl125 ? "|maxLevel" : "") + (pInfo(peer)->donor ? "|donor" : "") + (pInfo(peer)->master ? "|master" : "")); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != pInfo(peer)->world) continue; p.CreatePacket(currentPeer); p2.CreatePacket(currentPeer); } p.CreatePacket(peer); p2.CreatePacket(peer); } else if (cch.find("action|dialog_return\ndialog_name|flag_edit\nflag_item|") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int billboard_item = atoi(explode("\n", t_[3])[0].c_str()); if (billboard_item > 0 && billboard_item < items.size()) { int got = 0; modify_inventory(peer, billboard_item, got); if (got == 0) break; pInfo(peer)->flagset = billboard_item; gamepacket_t p(0, pInfo(peer)->netID); p.Insert("OnGuildDataChanged"); /*p.Insert(36095); p.Insert(63158650);*/ if (billboard_item != 0) { p.Insert(50478); p.Insert(79289404); p.Insert((65536 * pInfo(peer)->flagset) + 6864); p.Insert(0), p.Insert(0); } else { p.Insert("OnGuildDataChanged"); p.Insert(50478); p.Insert(79289404); p.Insert(0), p.Insert(0); } gamepacket_t p2(0, pInfo(peer)->netID); p2.Insert("OnCountryState"), p2.Insert(pInfo(peer)->country + "|showGuild" + (pInfo(peer)->lvl125 ? "|maxLevel" : "") + (pInfo(peer)->donor ? "|donor" : "") + (pInfo(peer)->master ? "|master" : "")); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != pInfo(peer)->world) continue; p.CreatePacket(currentPeer); p2.CreatePacket(currentPeer); } p.CreatePacket(peer); p2.CreatePacket(peer); } break; } else if (cch.find("action|dialog_return\ndialog_name|billboard_edit\nbillboard_item|") != string::npos) { vector<string> t_ = explode("|", cch); if (t_.size() < 4) break; int billboard_item = atoi(explode("\n", t_[3])[0].c_str()); if (billboard_item > 0 && billboard_item < items.size()) { int got = 0; modify_inventory(peer, billboard_item, got); if (got == 0) break; if (items[billboard_item].untradeable == 1 or billboard_item ==1424 or items[billboard_item].blockType == BlockTypes::LOCK or items[billboard_item].blockType == BlockTypes::FISH) { gamepacket_t p, p2; p.Insert("OnConsoleMessage"), p.Insert("Item can not be untradeable."), p.CreatePacket(peer); p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("Item can not be untradeable."), p2.Insert(0), p2.Insert(1), p2.CreatePacket(peer); } else { pInfo(peer)->b_i = billboard_item; if (pInfo(peer)->b_p != 0 && pInfo(peer)->b_i != 0) { gamepacket_t p(0, pInfo(peer)->netID); p.Insert("OnBillboardChange"), p.Insert(pInfo(peer)->netID), p.Insert(pInfo(peer)->b_i), p.Insert(pInfo(peer)->b_a), p.Insert(pInfo(peer)->b_p), p.Insert(pInfo(peer)->b_w); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != pInfo(peer)->world) continue; p.CreatePacket(currentPeer); } } showbill(peer); } } break; } else if (cch.find("action|dialog_return") != string::npos) { call_dialog(peer, cch); break; } } else if (cch.find("action|dialog_return") != string::npos) { call_dialog(peer, cch); break; } break; } case 3: // world/enter { //auto start = chrono::steady_clock::now(); if (pInfo(peer)->trading_with != -1) { cancel_trade(peer, false); break; } string cch = text_(event.packet); if (pInfo(peer)->lpps2 + 1000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->pps2 = 0; pInfo(peer)->lpps2 = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } else { pInfo(peer)->pps2++; if (pInfo(peer)->pps2 >= 10) { //cout << "Over packet 3 limit from " << pInfo(peer)->tankIDName << " in world " << pInfo(peer)->world << " packet was " << cch << endl; enet_peer_disconnect_later(peer, 0); break; } } //cout << cch << endl; if (cch == "action|quit") { // kai quit issaugo dar bus settings ar captcha bypassed disconnect if (not pInfo(peer)->tankIDName.empty()) // jeigu yra growid save_player(pInfo(peer)); // issaugoti zaidejo json if (pInfo(peer)->trading_with != -1) { cancel_trade(peer, false); } enet_peer_disconnect_later(peer, 0); // turetu nesuveikti tada antra karta save delete peer->data; peer->data = NULL; } else if (cch == "action|quit_to_exit") { exit_(peer); } else if (cch.find("action|join_request") != string::npos) { if (pInfo(peer)->last_world_enter + 500 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->last_world_enter = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); vector<string> t_ = explode("|", cch); if (t_.size() < 3) break; string world_name = explode("\n", t_[2])[0]; transform(world_name.begin(), world_name.end(), world_name.begin(), ::toupper); join_world(peer, world_name); } } //auto end = chrono::steady_clock::now(); //int uztruko = chrono::duration_cast<chrono::milliseconds>(end - start).count(); //if (uztruko >= 500) { //cout << "Lag case 3 warning: " << cch << " took " << uztruko << " ms\n"; //} break; } case 4: { //auto start = chrono::steady_clock::now(); if (pInfo(peer)->lpps23 + 1000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->pps23 = 0; pInfo(peer)->lpps23 = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } else { pInfo(peer)->pps23++; if (pInfo(peer)->pps23 >= 360) { //cout << "Over packet 4 limit from " << pInfo(peer)->tankIDName << " in world " << pInfo(peer)->world << endl; enet_peer_disconnect_later(peer, 0); break; } } if (pInfo(peer)->world.empty()) break; BYTE* data_ = get_struct(event.packet); if (data_ == nullptr) break; PlayerMoving* p_ = unpackPlayerMoving(data_); switch (p_->packetType) { case 0: /*Kai zaidejas pajuda*/ { if ((int)p_->characterState == 268435472 || (int)p_->characterState == 268435488 || (int)p_->characterState == 268435504 || (int)p_->characterState == 268435616 || (int)p_->characterState == 268435632 || (int)p_->characterState == 268435456 || (int)p_->characterState == 224 || (int)p_->characterState == 112 || (int)p_->characterState == 80 || (int)p_->characterState == 96 || (int)p_->characterState == 224 || (int)p_->characterState == 65584 || (int)p_->characterState == 65712 || (int)p_->characterState == 65696 || (int)p_->characterState == 65536 || (int)p_->characterState == 65552 || (int)p_->characterState == 65568 || (int)p_->characterState == 65680 || (int)p_->characterState == 192 || (int)p_->characterState == 65664 || (int)p_->characterState == 65600 || (int)p_->characterState == 67860 || (int)p_->characterState == 64) { if (pInfo(peer)->lava_time + 5000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->lavaeffect = 0; pInfo(peer)->lava_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); } else { if (pInfo(peer)->lavaeffect >= (pInfo(peer)->feet == 250 ? 7 : 3) || pInfo(peer)->lavaeffect >= (pInfo(peer)->necklace == 5426 ? 7 : 3)) { pInfo(peer)->lavaeffect = 0; SendRespawn(peer, false, 0, true); } else pInfo(peer)->lavaeffect++; } } if (pInfo(peer)->fishing_used != 0) { if (pInfo(peer)->f_xy != pInfo(peer)->x + pInfo(peer)->y) pInfo(peer)->move_warning++; if (pInfo(peer)->move_warning > 1) stop_fishing(peer, true, "Sit still if you wanna fish!"); if (p_->punchX > 0 && p_->punchY > 0) { pInfo(peer)->punch_warning++; if (pInfo(peer)->punch_warning >= 2) stop_fishing(peer, false, ""); } } string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; if (pInfo(peer)->x != -1 and pInfo(peer)->y != -1) { //try { int x_ = (pInfo(peer)->state == 16 ? (int)p_->x / 32 : round((double)p_->x / 32)); int y_ = (int)p_->y / 32; if (x_ < 0 or x_ >= 100 or y_ < 0 or y_ >= 60) continue; WorldBlock* block_ = &world_->blocks[x_ + (y_ * 100)]; if (block_->fg == 1256) pInfo(peer)->hospital_bed = true; else pInfo(peer)->hospital_bed = false; if (pInfo(peer)->c_x * 32 != (int)p_->x and pInfo(peer)->c_y * 32 != (int)p_->y and not pInfo(peer)->ghost) { bool impossible = ar_turi_noclipa(world_, pInfo(peer)->x, pInfo(peer)->y, block_, peer); if (impossible) { if (items[block_->fg].actionType != 31) { gamepacket_t p(0, pInfo(peer)->netID); p.Insert("OnSetPos"); p.Insert(pInfo(peer)->x, pInfo(peer)->y); p.CreatePacket(peer); pInfo(peer)->hack_++; if (pInfo(peer)->hack_ >= 3) { enet_peer_disconnect_later(peer, 0); //add_ban(peer, 604800, "Hacking", "System"); } break; } } } if (block_->fg == 1508 and not world_->name.empty()) { char blarney_world = world_->name.back(); if (isdigit(blarney_world)) { long long current_time = time(nullptr); vector<vector<long long>> av_blarneys = pInfo(peer)->completed_blarneys; for (int i_ = 0; i_ < av_blarneys.size(); i_++) { int t_blarney_world = av_blarneys[i_][0]; if ((int)blarney_world - 48 == t_blarney_world) { long long blarney_time = av_blarneys[i_][1]; if (blarney_time - current_time <= 0) { av_blarneys[i_][1] = current_time + 86400; vector<vector<int>> blarney_prizes{ //11712 11742 11710 11722 {11712, 1},{11742, 1},{11710, 1},{11722, 1}, {528, 1},{540, 1},{1514, 5},{1544, 1},{260, 1},{1546, 1},{2400, 1},{2404, 1},{2406, 1},{2414, 1},{2416, 1},{2464, 1},{3428, 1},{3426, 1},{4532, 1},{4528, 1},{4526, 5},{4520, 1},{5740, 1},{5734, 1},{7982, 1},{7992, 1},{7994, 1},{7980, 1},{7998, 1},{7984, 3},{7988, 1},{9416, 1},{9424, 1},{10704, 1},{10680, 1},{10670, 1},{10676, 1} }; vector<int> prize_ = blarney_prizes[rand() % blarney_prizes.size()]; uint32_t give_id = prize_[0]; uint32_t give_count = prize_[1]; int c_ = give_count; if (modify_inventory(peer, give_id, c_) != 0) { WorldDrop drop_block_{}; drop_block_.id = give_id, drop_block_.count = give_count, drop_block_.uid = uint16_t(world_->drop.size()) + 1, drop_block_.x = pInfo(peer)->x + rand() % 17, drop_block_.y = pInfo(peer)->y + rand() % 17; dropas_(world_, drop_block_); } int c_2 = 1; if (modify_inventory(peer, 1510, c_2) != 0) { WorldDrop drop_block_{}; drop_block_.id = 1510, drop_block_.count = c_2, drop_block_.uid = uint16_t(world_->drop.size()) + 1, drop_block_.x = pInfo(peer)->x + rand() % 17, drop_block_.y = pInfo(peer)->y + rand() % 17; dropas_(world_, drop_block_); } pInfo(peer)->remind_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("You kissed the " + items[block_->fg].name + " and got a `2" + items[1510].name + "`` and `2" + items[give_id].name + "``"); p.Insert(1); p.CreatePacket(peer); { gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You kissed the " + items[block_->fg].name + " and got a `2" + items[1510].name + "`` and `2" + items[give_id].name + "``"); p.CreatePacket(peer); } } else { if (pInfo(peer)->remind_time + 8000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->remind_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("You will be able to kiss the stone again in " + to_playmod_time(blarney_time - current_time) + ""); p.Insert(0); p.CreatePacket(peer); } } break; } } pInfo(peer)->completed_blarneys = av_blarneys; } } //} //catch (out_of_range) { // nuskrido uz worldo //cout << "failed to perform anticheat check for player " << pInfo(peer)->tankIDName + " invalid world??" << endl; //} } if (pInfo(peer)->hand == 2286) { if (rand() % 100 < 6) { pInfo(peer)->geiger_++; if (pInfo(peer)->geiger_ >= 100) { int c_ = -1; modify_inventory(peer, 2286, c_); int c_2 = 1; modify_inventory(peer, 2204, c_2); pInfo(peer)->hand = 2204; pInfo(peer)->geiger_ = 0; gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("You are detecting radiation... (`$Geiger Counting`` mod added)"); p.CreatePacket(peer); packet_(peer, "action|play_sfx\nfile|audio/dialog_confirm.wav\ndelayMS|0"); update_clothes(peer); } } } if (pInfo(peer)->gems > 0 && pInfo(peer)->back == 240) { if (pInfo(peer)->x != (int)p_->x) { if (pInfo(peer)->i240 + 750 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->i240 = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); pInfo(peer)->gems -= 1; WorldDrop item_{}; item_.id = 112, item_.count = 1, item_.x = (int)p_->x + rand() % 17, item_.y = (int)p_->y + rand() % 17, item_.uid = uint16_t(world_->drop.size()) + 1; dropas_(world_, item_); gamepacket_t p; p.Insert("OnSetBux"); p.Insert(pInfo(peer)->gems); p.Insert(0); p.Insert((pInfo(peer)->supp >= 1) ? 1 : 0); if (pInfo(peer)->supp >= 2) { p.Insert((float)33796, (float)1, (float)0); } p.CreatePacket(peer); } } } move_(peer, p_); if (pInfo(peer)->update) { if (pInfo(peer)->x == -1 and pInfo(peer)->y == -1) { pInfo(peer)->update = false; update_clothes(peer); } } if (pInfo(peer)->x == -1 and pInfo(peer)->y == -1) { /*Atnaujinti clothes nes uzejo i worlda*/ update_clothes(peer); uint32_t my_guild_role = -1; if (pInfo(peer)->guild_id != 0) { uint32_t guild_id = pInfo(peer)->guild_id; vector<Guild>::iterator find_guild = find_if(guilds.begin(), guilds.end(), [guild_id](const Guild& a) { return a.guild_id == guild_id; }); if (find_guild != guilds.end()) { Guild* guild_information = &guilds[find_guild - guilds.begin()]; for (GuildMember member_search : guild_information->guild_members) { if (member_search.member_name == pInfo(peer)->tankIDName) { my_guild_role = member_search.role_id; break; } } } } gamepacket_t p3(0, pInfo(peer)->netID); p3.Insert("OnSetRoleSkinsAndIcons"); p3.Insert(pInfo(peer)->roleSkin); p3.Insert(pInfo(peer)->roleIcon); p3.Insert(0); gamepacket_t p(0, pInfo(peer)->netID); if (pInfo(peer)->flagset > 0) { p.Insert("OnGuildDataChanged"); /*p.Insert(36095); p.Insert(63158650);*/ p.Insert(50478); p.Insert(79289404); p.Insert((65536 * pInfo(peer)->flagset) + 6864); p.Insert(0), p.Insert(0); } else { p.Insert("OnGuildDataChanged"); p.Insert(50478); p.Insert(79289404); p.Insert(0), p.Insert(0); } gamepacket_t p2(0, pInfo(peer)->netID); p2.Insert("OnCountryState"), p2.Insert(pInfo(peer)->country + "|showGuild" + (pInfo(peer)->lvl125 ? "|maxLevel" : "") + (pInfo(peer)->donor ? "|donor" : "") + (pInfo(peer)->master ? "|master" : "")); 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)->world == world_->name) { p3.CreatePacket(currentPeer); p.CreatePacket(currentPeer); p2.CreatePacket(currentPeer); if (pInfo(currentPeer)->netID != pInfo(peer)->netID) { if (pInfo(currentPeer)->roleSkin != 6 or pInfo(currentPeer)->roleIcon != 6) { gamepacket_t p_p(0, pInfo(currentPeer)->netID); p_p.Insert("OnSetRoleSkinsAndIcons"); p_p.Insert(pInfo(currentPeer)->roleSkin); p_p.Insert(pInfo(currentPeer)->roleIcon); p_p.Insert(0); p_p.CreatePacket(peer); } } if (pInfo(currentPeer)->netID != pInfo(peer)->netID and pInfo(currentPeer)->guild_id != 0) { uint32_t guild_id = pInfo(currentPeer)->guild_id; vector<Guild>::iterator find_guild = find_if(guilds.begin(), guilds.end(), [guild_id](const Guild& a) { return a.guild_id == guild_id; }); if (find_guild != guilds.end()) { Guild* guild_information = &guilds[find_guild - guilds.begin()]; uint32_t my_role = 0; for (GuildMember member_search : guild_information->guild_members) { if (member_search.member_name == pInfo(currentPeer)->tankIDName) { my_role = member_search.role_id; break; } } gamepacket_t p(0, pInfo(peer)->netID); if (pInfo(peer)->flagset >= 0) { p.Insert("OnGuildDataChanged"); /*p.Insert(36095); p.Insert(63158650);*/ p.Insert(50478); p.Insert(79289404); p.Insert((65536 * pInfo(peer)->flagset) + 6864); p.Insert(0), p.Insert(0); } else { p.Insert("OnGuildDataChanged"); p.Insert(50478); p.Insert(79289404); p.Insert(0), p.Insert(0); } { gamepacket_t p2(0, pInfo(currentPeer)->netID); p2.Insert("OnCountryState"), p2.Insert(pInfo(peer)->country + "|showGuild" + (pInfo(peer)->lvl125 ? "|maxLevel" : "") + (pInfo(peer)->donor ? "|donor" : "") + (pInfo(peer)->master ? "|master" : "")); p2.CreatePacket(peer); } } } } } long long ms_time = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count(); map<string, vector<WorldNPC>>::iterator it; for (it = active_npc.begin(); it != active_npc.end(); it++) { if (it->first == world_->name) { for (int i_ = 0; i_ < it->second.size(); i_++) { try { WorldNPC npc_ = it->second[i_]; if (npc_.uid == -1) continue; double per_sekunde_praeina_bloku = (double)npc_.projectile_speed / 32; double praejo_laiko = (double)(ms_time - npc_.started_moving) / 1000; double praejo_distancija = (double)per_sekunde_praeina_bloku * (double)praejo_laiko; double current_x = ((int)npc_.kryptis == 180 ? (((double)npc_.x - (double)praejo_distancija) * 32) + 16 : (((double)npc_.x + (double)praejo_distancija) * 32) + 16); double current_y = (double)npc_.y * 32; bool blocked_ = false; if ((int)npc_.kryptis == 180) { // check if it wasnt blocked vector<int> new_tiles{}; if (items[world_->blocks[(int)(current_x / 32) + ((int)(current_y / 32) * 100)].fg].collisionType != 1) { new_tiles.push_back((int)(current_x / 32) + ((int)(current_y / 32) * 100)); } int ySize = world_->blocks.size() / 100, xSize = world_->blocks.size() / ySize; vector<WorldBlock> shadow_copy = world_->blocks; for (int i2 = 0; i2 < new_tiles.size(); i2++) { int x_ = new_tiles[i2] % 100, y_ = new_tiles[i2] / 100; if (x_ < 99 and items[shadow_copy[x_ + 1 + (y_ * 100)].fg].collisionType != 1) { if (not shadow_copy[x_ + 1 + (y_ * 100)].scanned) { shadow_copy[x_ + 1 + (y_ * 100)].scanned = true; new_tiles.push_back(x_ + 1 + (y_ * 100)); } } else if (items[shadow_copy[x_ + 1 + (y_ * 100)].fg].collisionType == 1 and x_ < npc_.x) { blocked_ = true; break; } } } else { vector<int> new_tiles{}; if (items[world_->blocks[(int)(current_x / 32) + ((int)(current_y / 32) * 100)].fg].collisionType != 1) { new_tiles.push_back((int)(current_x / 32) + ((int)(current_y / 32) * 100)); } int ySize = world_->blocks.size() / 100, xSize = world_->blocks.size() / ySize; vector<WorldBlock> shadow_copy = world_->blocks; for (int i2 = 0; i2 < new_tiles.size(); i2++) { int x_ = new_tiles[i2] % 100, y_ = new_tiles[i2] / 100; if (x_ < 99 and items[shadow_copy[x_ - 1 + (y_ * 100)].fg].collisionType != 1) { if (not shadow_copy[x_ - 1 + (y_ * 100)].scanned) { shadow_copy[x_ - 1 + (y_ * 100)].scanned = true; new_tiles.push_back(x_ - 1 + (y_ * 100)); } } else if (items[shadow_copy[x_ - 1 + (y_ * 100)].fg].collisionType == 1 and x_ > npc_.x) { blocked_ = true; break; } } } if (blocked_) { continue; } PlayerMoving data_{}; data_.packetType = 34; data_.x = (current_x + 16); //nuo x data_.y = (current_y + (npc_.id == 8020 ? 6 : 16)); //nuo y data_.XSpeed = (current_x + 16); // iki x data_.YSpeed = (current_y + (npc_.id == 8020 ? 6 : 16)); // iki y data_.punchY = npc_.projectile_speed; BYTE* raw = packPlayerMoving(&data_); raw[1] = (npc_.id == 8020 ? 15 : 8), raw[2] = npc_.uid, raw[3] = 2; memcpy(raw + 40, &npc_.kryptis, 4); send_raw(peer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); delete[] raw; } catch (out_of_range) { continue; } } break; } } } pInfo(peer)->x = (int)p_->x, pInfo(peer)->y = (int)p_->y, pInfo(peer)->state = p_->characterState & 0x10; } break; } case 3: /*Kai zaidejas papunchina/wrenchina bloka*/ { if (p_->plantingTree <= 0 || p_->plantingTree >= items.size()) break; //if (items[p_->plantingTree].blocked_place == 1) break; // crash block if (p_->plantingTree != 18 and p_->plantingTree != 32) { int c_ = 0; modify_inventory(peer, p_->plantingTree, c_); if (c_ == 0) break; } if (p_->plantingTree == 18) { if (pInfo(peer)->punch_time + 100 > (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) break; pInfo(peer)->punch_time = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); //if (has_playmod(pInfo(peer), "Infected!") or pInfo(peer)->hand != 0) pInfo(peer)->last_infected = p_->punchX + (p_->punchY * 100); } if (pInfo(peer)->trading_with != -1 and p_->packetType != 0 and p_->packetType != 18) { cancel_trade(peer, false, true); break; } if (p_->plantingTree == 18 and (pInfo(peer)->hand == 5480 || pInfo(peer)->hand == 9772 || pInfo(peer)->hand == 9770 || pInfo(peer)->hand == 9912 || pInfo(peer)->hand == 9830 || pInfo(peer)->hand == 9536)) { // tingejau galvoti kaip kitaip daryt string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; WorldBlock* block_ = &world_->blocks[p_->punchX + (p_->punchY * 100)]; if (block_->fg == 0 and block_->bg == 0) break; } if (p_->punchY == pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY, p_->plantingTree); } } else if (p_->punchX == pInfo(peer)->x / 32) { if (p_->punchY > pInfo(peer)->y / 32) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY + 1, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY + 2, p_->plantingTree); } else if (p_->punchY < pInfo(peer)->y / 32) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY - 2, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); } } else if (p_->punchY < pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY - 2, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY - 2, p_->plantingTree); } } else if (p_->punchY < pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY - 2, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY - 2, p_->plantingTree); } } else if (p_->punchY > pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY + 1, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY + 2, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY + 1, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY + 2, p_->plantingTree); } } } else if (p_->plantingTree == 18 and pInfo(peer)->hand == 9906) { // tingejau galvoti kaip kitaip daryt string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; WorldBlock* block_ = &world_->blocks[p_->punchX + (p_->punchY * 100)]; if (block_->fg == 0 and block_->bg == 0) break; } if (p_->punchY == pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 3, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 4, p_->punchY, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 3, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 4, p_->punchY, p_->plantingTree); } } else if (p_->punchX == pInfo(peer)->x / 32) { if (p_->punchY > pInfo(peer)->y / 32) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY + 1, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY + 2, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY + 3, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY + 4, p_->plantingTree); } else if (p_->punchY < pInfo(peer)->y / 32) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY - 2, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY - 3, p_->plantingTree); edit_tile(peer, p_->punchX, p_->punchY - 4, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); } } else if (p_->punchY < pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY - 2, p_->plantingTree); edit_tile(peer, p_->punchX - 3, p_->punchY - 3, p_->plantingTree); edit_tile(peer, p_->punchX - 4, p_->punchY - 4, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY - 2, p_->plantingTree); edit_tile(peer, p_->punchX + 3, p_->punchY - 3, p_->plantingTree); edit_tile(peer, p_->punchX + 4, p_->punchY - 4, p_->plantingTree); } } else if (p_->punchY < pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY - 2, p_->plantingTree); edit_tile(peer, p_->punchX - 3, p_->punchY - 3, p_->plantingTree); edit_tile(peer, p_->punchX - 4, p_->punchY - 4, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY - 1, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY - 2, p_->plantingTree); edit_tile(peer, p_->punchX + 3, p_->punchY - 3, p_->plantingTree); edit_tile(peer, p_->punchX + 4, p_->punchY - 4, p_->plantingTree); } } else if (p_->punchY > pInfo(peer)->y / 32) { if (pInfo(peer)->state == 16) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY + 1, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY + 2, p_->plantingTree); edit_tile(peer, p_->punchX - 3, p_->punchY + 3, p_->plantingTree); edit_tile(peer, p_->punchX - 4, p_->punchY + 4, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY + 1, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY + 2, p_->plantingTree); edit_tile(peer, p_->punchX + 3, p_->punchY + 3, p_->plantingTree); edit_tile(peer, p_->punchX + 4, p_->punchY + 4, p_->plantingTree); } } } else { bool empty = false; if (p_->plantingTree == 5640) { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->machines.size(); i_++) { WorldMachines machine = world_->machines[i_]; if (machine.x == pInfo(peer)->magnetron_x and machine.y == pInfo(peer)->magnetron_y and machine.id == 5638) { if (machine.enabled) { WorldBlock* itemas = &world_->blocks[machine.x + (machine.y * 100)]; if (itemas->magnetron and itemas->id == pInfo(peer)->magnetron_id) { if (itemas->pr > 0) { p_->plantingTree = itemas->id; if (edit_tile(peer, p_->punchX, p_->punchY, itemas->id, true)) { itemas->pr--; if (itemas->pr <= 0) { PlayerMoving data_{}; data_.packetType = 5, data_.punchX = machine.x, data_.punchY = machine.y, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, itemas)); BYTE* blc = raw + 56; form_visual(blc, *itemas, *world_, NULL, false); 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)->world == world_->name) { send_raw(currentPeer, 4, raw, 112 + alloc_(world_, itemas), ENET_PACKET_FLAG_RELIABLE); } } delete[] raw, blc; } break; } } else { empty = true; gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("The `2" + items[machine.id].name + "`` is empty!"); p.Insert(0), p.Insert(0); p.CreatePacket(peer); } } } break; } } } if (p_->plantingTree == 5640 and not empty) { gamepacket_t p; p.Insert("OnTalkBubble"); p.Insert(pInfo(peer)->netID); p.Insert("There is no active `2" + items[5638].name + "``!"); p.Insert(0), p.Insert(0); p.CreatePacket(peer); } break; } if (pInfo(peer)->hand == 10020 || pInfo(peer)->hand == 9812 || pInfo(peer)->hand == 9772 || pInfo(peer)->hand == 9770 || pInfo(peer)->hand == 9874) { int bilmem = 0; int kesla = 0; int blockkoydu = p_->plantingTree; modify_inventory(peer, blockkoydu, bilmem); if (bilmem > 3) { if (p_->characterState & 0x10) { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 1, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX - 2, p_->punchY, p_->plantingTree); } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 1, p_->punchY, p_->plantingTree); edit_tile(peer, p_->punchX + 2, p_->punchY, p_->plantingTree); } } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); } } else { edit_tile(peer, p_->punchX, p_->punchY, p_->plantingTree); } } break; } case 7: /*Kai zaidejas ieina pro duris arba portal*/ /*2/16/2022 update: cia dar gali buti STEAM USE*/ { string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; //try { if (p_->punchX < 0 or p_->punchX >= 100 or p_->punchY < 0 or p_->punchY >= 60) break; WorldBlock* block_ = &world_->blocks[p_->punchX + (p_->punchY * 100)]; bool impossible = ar_turi_noclipa(world_, pInfo(peer)->x, pInfo(peer)->y, block_, peer); if (impossible) break; if (items[items[block_->fg ? block_->fg : block_->bg].id].blockType == BlockTypes::CHECKPOINT) { pInfo(peer)->c_x = p_->punchX, pInfo(peer)->c_y = p_->punchY; gamepacket_t p(0, pInfo(peer)->netID); p.Insert("SetRespawnPos"); p.Insert(pInfo(peer)->c_x + (pInfo(peer)->c_y * 100)); p.CreatePacket(peer); } else if (items[block_->fg ? block_->fg : block_->bg].id == 6) exit_(peer); else if (items[block_->fg].blockType == BlockTypes::DOOR or items[block_->fg].blockType == BlockTypes::PORTAL) { string door_target = block_->door_destination, door_id = ""; World target_world = worlds[p - worlds.begin()]; bool locked = (block_->open ? false : (target_world.owner_name == pInfo(peer)->tankIDName or pInfo(peer)->dev or target_world.open_to_public or target_world.owner_name.empty() or (guild_access(peer, target_world.guild_id) or find(target_world.admins.begin(), target_world.admins.end(), pInfo(peer)->tankIDName) != target_world.admins.end()) ? false : true)); int spawn_x = 0, spawn_y = 0; if (not locked && block_->fg != 762) { if (door_target.find(":") != string::npos) { vector<string> detales = explode(":", door_target); door_target = detales[0], door_id = detales[1]; } if (not door_target.empty() and door_target != world_->name) { if (not check_name(door_target)) { gamepacket_t p(250, pInfo(peer)->netID); p.Insert("OnSetFreezeState"); p.Insert(1); p.CreatePacket(peer); { gamepacket_t p(250); p.Insert("OnConsoleMessage"); p.Insert(door_target); p.CreatePacket(peer); } { gamepacket_t p(250); p.Insert("OnZoomCamera"); p.Insert((float)10000.000000); p.Insert(1000); p.CreatePacket(peer); } { gamepacket_t p(250, pInfo(peer)->netID); p.Insert("OnSetFreezeState"); p.Insert(0); p.CreatePacket(peer); } break; } target_world = get_world(door_target); } int ySize = (int)target_world.blocks.size() / 100, xSize = (int)target_world.blocks.size() / ySize, square = (int)target_world.blocks.size(); if (not door_id.empty()) { for (int i_ = 0; i_ < target_world.blocks.size(); i_++) { WorldBlock block_data = target_world.blocks[i_]; if (block_data.fg == 1684 or items[block_data.fg].blockType == BlockTypes::DOOR or items[block_data.fg].blockType == BlockTypes::PORTAL) { if (block_data.door_id == door_id) { spawn_x = i_ % xSize, spawn_y = i_ / xSize; break; } } } } } if (block_->fg == 762) { pInfo(peer)->lastwrenchx = p_->punchX, pInfo(peer)->lastwrenchy = p_->punchY; gamepacket_t p2; if (block_->door_id == "") p2.Insert("OnTalkBubble"), p2.Insert(pInfo(peer)->netID), p2.Insert("No password has been set yet!"), p2.Insert(0), p2.Insert(1); else p2.Insert("OnDialogRequest"), p2.Insert("set_default_color|`o\nadd_label_with_icon|big|`wPassword Door``|left|762|\nadd_textbox|The door requires a password.|left|\nadd_text_input|password|Password||24|\nend_dialog|password_reply|Cancel|OK|"); p2.CreatePacket(peer); gamepacket_t p(250, pInfo(peer)->netID), p3(250), p4(250, pInfo(peer)->netID); p.Insert("OnSetFreezeState"), p.Insert(1), p.CreatePacket(peer); p3.Insert("OnZoomCamera"),p3.Insert((float)10000.000000),p3.Insert(1000),p3.CreatePacket(peer); p4.Insert("OnSetFreezeState"), p4.Insert(0), p4.CreatePacket(peer); } if (block_->fg != 762) join_world(peer, target_world.name, spawn_x, spawn_y, 250, locked, true); } else { switch (block_->fg) { case 3270: case 3496: { Position2D steam_connector = track_steam(world_, block_, p_->punchX, p_->punchY); if (steam_connector.x != -1 and steam_connector.y != -1) { WorldBlock* block_s = &world_->blocks[steam_connector.x + (steam_connector.y * 100)]; switch (block_s->fg) { case 3286: //steam door { block_s->flags = (block_s->flags & 0x00400000 ? block_s->flags ^ 0x00400000 : block_s->flags | 0x00400000); PlayerMoving data_{}; data_.packetType = 5, data_.punchX = steam_connector.x, data_.punchY = steam_connector.y, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, block_s)); BYTE* blc = raw + 56; form_visual(blc, *block_s, *world_, peer, false); 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)->world == world_->name) { send_raw(currentPeer, 4, raw, 112 + alloc_(world_, block_s), ENET_PACKET_FLAG_RELIABLE); } } delete[] raw, blc; break; } case 3724: // spirit storage unit { uint32_t scenario = 20; { // check for ghost jars for (int i = 0; i < world_->drop.size(); i++) { WorldDrop* check_drop = &world_->drop[i]; Position2D dropped_at{ check_drop->x / 32, check_drop->y / 32 }; if (dropped_at.x == steam_connector.x and dropped_at.y == steam_connector.y) { if (check_drop->id == 3722) { uint32_t explo_chance = check_drop->count; // remove drop { PlayerMoving data_{}; data_.packetType = 14, data_.netID = -2, data_.plantingTree = check_drop->uid; BYTE* raw = packPlayerMoving(&data_); int32_t item = -1; memcpy(raw + 8, &item, 4); 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)->world == name_) { send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); } } world_->drop[i].id = 0, world_->drop[i].x = -1, world_->drop[i].y = -1; delete[] raw; } block_s->c_ += explo_chance; // explode or not { if (block_s->c_ * 5 >= 105) { float explosion_chance = (float)((block_s->c_ * 5) - 100) * 0.5; if (explosion_chance > rand() % 100) { //bam bam block_s->fg = 3726; // drop the prize { vector<int> all_p{ 3734, 3732, 3748, 3712, 3706, 3708, 3718, 11136, 3728, 10056, 3730, 3788, 3750, 3738, 6060, 3738, 6840, 3736, 7784 }; uint32_t prize = 0; if (block_s->c_ * 5 <= 115) prize = 3734; else if (block_s->c_ * 5 <= 130) prize = 3732; else if (block_s->c_ * 5 <= 140) prize = 3748; else if (block_s->c_ * 5 <= 170) { vector<int> p_drops = { 3712, 3706, 3708, 3718, 11136 }; prize = p_drops[rand() % p_drops.size()]; } else if (block_s->c_ * 5 <= 190) prize = 3728; else if (block_s->c_ * 5 <= 205) prize = 10056; else if (block_s->c_ * 5 <= 220) prize = 3730; else if (block_s->c_ * 5 == 225) prize = 3788; else if (block_s->c_ * 5 <= 240) prize = 3750; else if (block_s->c_ * 5 == 245) prize = 3738; else if (block_s->c_ * 5 <= 255) prize = 6060; else if (block_s->c_ * 5 <= 265 or explo_chance * 5 >= 265) { if (explo_chance * 5 >= 265) prize = all_p[rand() % all_p.size()]; else prize = 3738; } else { vector<int> p_drops = { 6840 }; if (block_s->c_ * 5 >= 270) p_drops.push_back(3736); if (block_s->c_ * 5 >= 295) p_drops.push_back(7784); prize = p_drops[rand() % p_drops.size()]; } if (prize != 0) { WorldDrop drop_block_{}; drop_block_.x = steam_connector.x * 32 + rand() % 17; drop_block_.y = steam_connector.y * 32 + rand() % 17; drop_block_.id = prize, drop_block_.count = 1, drop_block_.uid = uint16_t(world_->drop.size()) + 1; dropas_(world_, drop_block_); { PlayerMoving data_{}; data_.packetType = 0x11, data_.x = steam_connector.x * 32 + 16, data_.y = steam_connector.y * 32 + 16; data_.YSpeed = 97, data_.XSpeed = 3724; BYTE* raw = packPlayerMoving(&data_); PlayerMoving data_2{}; data_2.packetType = 0x11, data_2.x = steam_connector.x * 32 + 16, data_2.y = steam_connector.y * 32 + 16; data_2.YSpeed = 108; BYTE* raw2 = packPlayerMoving(&data_2); gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("`#[A `9Spirit Storage Unit`` exploded, bringing forth an `9" + items[prize].name + "`` from The Other Side!]``"); 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)->world == world_->name) { p.CreatePacket(currentPeer); send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); send_raw(currentPeer, 4, raw2, 56, ENET_PACKET_FLAG_RELIABLE); } } delete[] raw, raw2; } scenario = 22; } } block_s->c_ = 0; } } } // update visuals { PlayerMoving data_{}; data_.packetType = 5, data_.punchX = steam_connector.x, data_.punchY = steam_connector.y, data_.characterState = 0x8; BYTE* raw = packPlayerMoving(&data_, 112 + alloc_(world_, block_s)); BYTE* blc = raw + 56; form_visual(blc, *block_s, *world_, peer, false); 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)->world == world_->name) { send_raw(currentPeer, 4, raw, 112 + alloc_(world_, block_s), ENET_PACKET_FLAG_RELIABLE); } } delete[] raw, blc; } break; } } } } PlayerMoving data_{}; data_.packetType = 32; // steam update paketas data_.punchX = steam_connector.x; data_.punchY = steam_connector.y; BYTE* raw = packPlayerMoving(&data_); raw[3] = scenario; 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(peer)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); } delete[] raw; break; } default: break; } } PlayerMoving data_{}; data_.packetType = 32; // steam update paketas data_.punchX = p_->punchX; data_.punchY = p_->punchY; BYTE* raw = packPlayerMoving(&data_); 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(peer)->world != pInfo(currentPeer)->world) continue; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); } delete[] raw; break; } default: break; } } } //catch (out_of_range& klaida) { //cout << "case 7 klaida -> " << klaida.what() << endl; //} //} break; } case 10: /*Kai zaidejas paspaudzia du kartus ant inventory itemo*/ { if (pInfo(peer)->trading_with != -1) { cancel_trade(peer, false); break; } if (p_->plantingTree <= 0 or p_->plantingTree >= items.size()) break; int c_ = 0; modify_inventory(peer, p_->plantingTree, c_); if (c_ == 0) break; if (items[p_->plantingTree].blockType != BlockTypes::CLOTHING) { int free = get_free_slots(pInfo(peer)), slot = 1; int c242 = 242, c1796 = 1796, c6802 = 6802, c1486 = 1486, countofused = 0, getdl = 1, getwl = 100, removewl = -100, removedl = -1, countwl = 0, c4450 = 4450, c4452 = 4452; int c4298 = 4298, c4300 = 4300; int c7188 = 7188; modify_inventory(peer, p_->plantingTree, countofused); if (free >= slot) { if (p_->plantingTree == 242 || p_->plantingTree == 1796) { modify_inventory(peer, p_->plantingTree == 242 ? c1796 : c242, countwl); if (p_->plantingTree == 242 ? countwl <= 199 : countwl <= 100) { if (p_->plantingTree == 242 ? countofused >= 100 : countofused >= 1) { modify_inventory(peer, p_->plantingTree == 242 ? c242 : c1796, p_->plantingTree == 242 ? removewl : removedl); modify_inventory(peer, p_->plantingTree == 242 ? c1796 : c242, p_->plantingTree == 242 ? getdl : getwl); gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert(p_->plantingTree == 242 ? "You compressed 100 `2World Lock`` into a `2Diamond Lock``!" : "You shattered a `2Diamond Lock`` into 100 `2World Lock``!"), p.Insert(0), p.Insert(1), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert(p_->plantingTree == 242 ? "You compressed 100 `2World Lock`` into a `2Diamond Lock``!" : "You shattered a `2Diamond Lock`` into 100 `2World Lock``!"), p2.CreatePacket(peer); } } } else if (p_->plantingTree == 7188) { modify_inventory(peer, c1796, countwl); if (countwl <= 100) { if (countofused >= 1) { modify_inventory(peer, c7188, removedl); modify_inventory(peer, c1796, getwl); gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert("You shattered a `2Blue Gem Lock`` into 100 `2Diamond Lock``!"), p.Insert(0), p.Insert(1), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert("You shattered a `2Blue Gem Lock`` into 100 `2Diamond Lock``!"), p2.CreatePacket(peer); } } } else if (p_->plantingTree == 1486 || p_->plantingTree == 6802) { modify_inventory(peer, p_->plantingTree == 1486 ? c6802 : c1486, countwl); if (p_->plantingTree == 1486 ? countwl <= 199 : countwl <= 100) { if (p_->plantingTree == 1486 ? countofused >= 100 : countofused >= 1) { modify_inventory(peer, p_->plantingTree == 1486 ? c1486 : c6802, p_->plantingTree == 1486 ? removewl : removedl); modify_inventory(peer, p_->plantingTree == 1486 ? c6802 : c1486, p_->plantingTree == 1486 ? getdl : getwl); gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert(p_->plantingTree == 1486 ? "You compressed 100 `2Growtoken`` into a `2Mega Growtoken``!" : "You shattered a `2Mega Growtoken`` into 100 `2Growtoken``!"), p.Insert(0), p.Insert(1), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert(p_->plantingTree == 1486 ? "You compressed 100 `2Growtoken`` into a `2Mega Growtoken``!" : "You shattered a `2Mega Growtoken`` into 100 `2Growtoken``!"), p2.CreatePacket(peer); } } } else if (p_->plantingTree == 4450 || p_->plantingTree == 4452) { modify_inventory(peer, p_->plantingTree == 4450 ? c4452 : c4450, countwl); if (p_->plantingTree == 4450 ? countwl <= 199 : countwl <= 100) { if (p_->plantingTree == 4450 ? countofused >= 100 : countofused >= 1) { modify_inventory(peer, p_->plantingTree == 4450 ? c4450 : c4452, p_->plantingTree == 4450 ? removewl : removedl); modify_inventory(peer, p_->plantingTree == 4450 ? c4452 : c4450, p_->plantingTree == 4450 ? getdl : getwl); gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert(p_->plantingTree == 4450 ? "You compressed 100 `2Zombie Brain`` into a `2Pile of Zombie Brains``!" : "You shattered a `2Pile of Zombie Brains`` into 100 `2Zombie Brain``!"), p.Insert(0), p.Insert(1), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert(p_->plantingTree == 4450 ? "You compressed 100 `2Zombie Brain`` into a `2Pile of Zombie Brains``!" : "You shattered a `2Pile of Zombie Brains`` into 100 `2Zombie Brain``!"), p2.CreatePacket(peer); } } } else if (p_->plantingTree == 4298 || p_->plantingTree == 4300) { modify_inventory(peer, p_->plantingTree == 4298 ? c4300 : c4298, countwl); if (p_->plantingTree == 4298 ? countwl <= 199 : countwl <= 100) { if (p_->plantingTree == 4298 ? countofused >= 100 : countofused >= 1) { modify_inventory(peer, p_->plantingTree == 4298 ? c4298 : c4300, p_->plantingTree == 4298 ? removewl : removedl); modify_inventory(peer, p_->plantingTree == 4298 ? c4300 : c4298, p_->plantingTree == 4298 ? getdl : getwl); gamepacket_t p, p2; p.Insert("OnTalkBubble"), p.Insert(pInfo(peer)->netID), p.Insert(p_->plantingTree == 4298 ? "You compressed 100 `2Caduceus`` into a `2Golden Caduceus``!" : "You shattered a `2Golden Caduceus`` into 100 `2Caduceus``!"), p.Insert(0), p.Insert(1), p.CreatePacket(peer); p2.Insert("OnConsoleMessage"), p2.Insert(p_->plantingTree == 4298 ? "You compressed 100 `2Caduceus`` into a `2Golden Caduceus``!" : "You shattered a `2Golden Caduceus`` into 100 `2Caduceus``!"), p2.CreatePacket(peer); } } } } /*compress ir t.t*/ break; } /*equip*/ equip_clothes(peer, p_->plantingTree); break; } case 11: /*Kai zaidejas paema isdropinta itema*/ { if (p_->x < 0 || p_->y <0) break; bool displaybox = true; string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; for (int i_ = 0; i_ < world_->drop.size(); i_++) { if (world_->drop[i_].id == 0 or world_->drop[i_].x/32 < 0 or world_->drop[i_].x/32 > 99 or world_->drop[i_].y / 32 < 0 or world_->drop[i_].y / 32 > 59) continue; WorldBlock* block_ = &world_->blocks[world_->drop[i_].x / 32 + (world_->drop[i_].y / 32 * 100)]; if (world_->drop[i_].uid == p_->plantingTree) { if (block_->fg == 1422 || block_->fg == 2488) { displaybox = false; if (pInfo(peer)->superdev || world_->open_to_public || world_->owner_name == "" || world_->owner_name == pInfo(peer)->tankIDName || find(world_->admins.begin(), world_->admins.end(), pInfo(peer)->tankIDName) != world_->admins.end()) displaybox = true; } if (abs((int)p_->x / 32 - world_->drop[i_].x / 32) > 1 || abs((int)p_->x - world_->drop[i_].x) >= 32 or abs((int)p_->y - world_->drop[i_].y) >= 32) displaybox = false; if (displaybox && ar_turi_noclipa(world_, p_->x, p_->y, block_, peer) == false) { int c_ = world_->drop[i_].count; if (world_->drop[i_].id == world_->special_event_item && world_->special_event && world_->drop[i_].special) { world_->special_event_item_taken++; if (items[world_->special_event_item].event_total == world_->special_event_item_taken) { gamepacket_t p, p3; p.Insert("OnAddNotification"), p.Insert("interface/large/special_event.rttex"), p.Insert("`2" + items[world_->special_event_item].event_name + ":`` `oSuccess! " + (items[world_->special_event_item].event_total == 1 ? "`2" + pInfo(peer)->tankIDName + "`` found it!``" : "All items found!``") + ""), p.Insert("audio/cumbia_horns.wav"), p.Insert(0); p3.Insert("OnConsoleMessage"), p3.Insert("`2" + items[world_->special_event_item].event_name + ":`` `oSuccess!`` " + (items[world_->special_event_item].event_total == 1 ? "`2" + pInfo(peer)->tankIDName + "`` `ofound it!``" : "All items found!``") + ""); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != name_) continue; if (items[world_->special_event_item].event_total != 1) { gamepacket_t p2; p2.Insert("OnConsoleMessage"), p2.Insert("`2" + items[world_->special_event_item].event_name + ":`` `0" + pInfo(peer)->tankIDName + "`` found a " + items[world_->special_event_item].name + "! (" + to_string(world_->special_event_item_taken) + "/" + to_string(items[world_->special_event_item].event_total) + ")``"), p2.CreatePacket(currentPeer); } p.CreatePacket(currentPeer); p3.CreatePacket(currentPeer); } world_->last_special_event = 0, world_->special_event_item = 0, world_->special_event_item_taken = 0, world_->special_event = false; } else { gamepacket_t p2; p2.Insert("OnConsoleMessage"), p2.Insert("`2" + items[world_->special_event_item].event_name + ":`` `0" + pInfo(peer)->tankIDName + "`` found a " + items[world_->special_event_item].name + "! (" + to_string(world_->special_event_item_taken) + "/" + to_string(items[world_->special_event_item].event_total) + ")``"); for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != name_) continue; p2.CreatePacket(currentPeer); } } } if (modify_inventory(peer, world_->drop[i_].id, c_, false, true) == 0 or world_->drop[i_].id == 112) { PlayerMoving data_{}; data_.effect_flags_check = 1, data_.packetType = 14, data_.netID = pInfo(peer)->netID, data_.plantingTree = world_->drop[i_].uid; BYTE* raw = packPlayerMoving(&data_); if (world_->drop[i_].id == 112) pInfo(peer)->gems += c_; else { add_cctv(peer, "took", to_string(world_->drop[i_].count) + " " + items[world_->drop[i_].id].name); gamepacket_t p; p.Insert("OnConsoleMessage"), p.Insert("Collected `w" + to_string(world_->drop[i_].count) + ""+ (items[world_->drop[i_].id].blockType == BlockTypes::FISH ? "lb." : "") + " " + items[world_->drop[i_].id].ori_name + "``." + (items[world_->drop[i_].id].rarity > 363 ? "" : " Rarity: `w" + to_string(items[world_->drop[i_].id].rarity) + "``") + ""), p.CreatePacket(peer); } for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != name_) continue; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); } delete[]raw; world_->drop[i_].id = 0, world_->drop[i_].x = -1, world_->drop[i_].y = -1; } else { if (c_ < 200 and world_->drop[i_].count >(200 - c_)) { int b_ = 200 - c_; world_->drop[i_].count -= b_; if (modify_inventory(peer, world_->drop[i_].id, b_, false) == 0) { add_cctv(peer, "took", to_string(world_->drop[i_].count) + " " + items[world_->drop[i_].id].name); WorldDrop drop_{}; drop_.id = world_->drop[i_].id, drop_.count = world_->drop[i_].count, drop_.uid = uint16_t(world_->drop.size()) + 1, drop_.x = world_->drop[i_].x, drop_.y = world_->drop[i_].y; world_->drop.push_back(drop_); gamepacket_t p; p.Insert("OnConsoleMessage"); p.Insert("Collected `w" + to_string(200 - c_) + " " + items[world_->drop[i_].id].ori_name + "``." + (items[world_->drop[i_].id].rarity > 363 ? "" : " Rarity: `w" + to_string(items[world_->drop[i_].id].rarity) + "``") + ""); PlayerMoving data_{}; data_.packetType = 14, data_.netID = -1, data_.plantingTree = world_->drop[i_].id, data_.x = world_->drop[i_].x, data_.y = world_->drop[i_].y; int32_t item = -1; float val = world_->drop[i_].count; BYTE* raw = packPlayerMoving(&data_); data_.plantingTree = world_->drop[i_].id; memcpy(raw + 8, &item, 4); memcpy(raw + 16, &val, 4); val = 0; data_.netID = pInfo(peer)->netID; data_.plantingTree = world_->drop[i_].uid; data_.x = 0, data_.y = 0; BYTE* raw2 = packPlayerMoving(&data_); BYTE val2 = 0; memcpy(raw2 + 8, &item, 4); memcpy(raw2 + 16, &val, 4); memcpy(raw2 + 1, &val2, 1); world_->drop[i_].id = 0, world_->drop[i_].x = -1, world_->drop[i_].y = -1; for (ENetPeer* currentPeer = server->peers; currentPeer < &server->peers[server->peerCount]; ++currentPeer) { if (currentPeer->state != ENET_PEER_STATE_CONNECTED or currentPeer->data == NULL or pInfo(currentPeer)->world != name_) continue; send_raw(currentPeer, 4, raw, 56, ENET_PACKET_FLAG_RELIABLE); if (pInfo(currentPeer)->netID == pInfo(peer)->netID) p.CreatePacket(currentPeer); send_raw(currentPeer, 4, raw2, 56, ENET_PACKET_FLAG_RELIABLE); } delete[]raw, raw2; } } } } } } } break; } case 18: { //chat bubble kai raso move_(peer, p_); break; } case 23: /*Kai zaidejas papunchina kita*/ { if (pInfo(peer)->last_inf + 5000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count()) { pInfo(peer)->last_inf = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count(); string name_ = pInfo(peer)->world; vector<World>::iterator p = find_if(worlds.begin(), worlds.end(), [name_](const World& a) { return a.name == name_; }); if (p != worlds.end()) { World* world_ = &worlds[p - worlds.begin()]; bool can_cancel = true; if (find(world_->active_jammers.begin(), world_->active_jammers.end(), 1276) != world_->active_jammers.end()) can_cancel = false; if (can_cancel) { if (pInfo(peer)->trading_with != -1 and p_->packetType != 0 and p_->packetType != 18) { cancel_trade(peer, false, true); break; } } } } break; } default: { break; } } break; } default: break; } enet_event_destroy(event); break; } case ENET_EVENT_TYPE_DISCONNECT: { if (saving_) break; if (peer->data != NULL) { if (pInfo(peer)->trading_with != -1) cancel_trade(peer, false); if (not pInfo(peer)->world.empty()) exit_(peer, true); if (not pInfo(peer)->invalid_data) { save_player(pInfo(peer), (f_saving_ ? false : true)); } if (f_saving_) pInfo(peer)->saved_on_close = true; if (not f_saving_) { enet_host_flush(server); delete peer->data; peer->data = NULL; } } break; } case ENET_EVENT_TYPE_NONE: { break; } default: break; } std::vector<std::thread> threads; threads.emplace_back(checkauto); for (auto& thread : threads) { thread.join(); } } } return 0; }
Editor is loading...