| 18648 | std::map<int, std::string> Compendium_t::Events_t::clientDataStrings[MAXPLAYERS]; |
| 18649 | std::map<int, std::map<int, std::string>> Compendium_t::Events_t::clientReceiveData; |
| 18650 | void Compendium_t::Events_t::sendClientDataOverNet(const int playernum) |
| 18651 | { |
| 18652 | if ( multiplayer == SERVER ) { |
| 18653 | if ( playernum == 0 || client_disconnected[playernum] ) { |
| 18654 | return; |
| 18655 | } |
| 18656 | |
| 18657 | if ( serverPlayerEvents[playernum].empty() ) |
| 18658 | { |
| 18659 | return; |
| 18660 | } |
| 18661 | |
| 18662 | rapidjson::Document d; |
| 18663 | d.SetObject(); |
| 18664 | CustomHelpers::addMemberToRoot(d, "seq", rapidjson::Value(clientSequence)); |
| 18665 | rapidjson::Value data(rapidjson::kObjectType); |
| 18666 | for ( auto& p1 : serverPlayerEvents[playernum] ) |
| 18667 | { |
| 18668 | std::string key = std::to_string(p1.first); |
| 18669 | rapidjson::Value namekey(key.c_str(), d.GetAllocator()); |
| 18670 | data.AddMember(namekey, rapidjson::Value(rapidjson::kObjectType), d.GetAllocator()); |
| 18671 | auto& obj = data[key.c_str()]; |
| 18672 | for ( auto& itemsData : p1.second ) |
| 18673 | { |
| 18674 | rapidjson::Value itemKey(std::to_string(itemsData.first).c_str(), d.GetAllocator()); |
| 18675 | obj.AddMember(itemKey, itemsData.second.value, d.GetAllocator()); |
| 18676 | } |
| 18677 | } |
| 18678 | CustomHelpers::addMemberToRoot(d, "item", data); |
| 18679 | |
| 18680 | rapidjson::StringBuffer os; |
| 18681 | rapidjson::Writer<rapidjson::StringBuffer> writer(os); |
| 18682 | d.Accept(writer); |
| 18683 | clientDataStrings[playernum][clientSequence] = os.GetString(); |
| 18684 | auto& dataStr = clientDataStrings[playernum][clientSequence]; |
| 18685 | |
| 18686 | const size_t len = dataStr.size(); |
| 18687 | if ( len == 0 ) |
| 18688 | { |
| 18689 | return; |
| 18690 | } |
| 18691 | |
| 18692 | serverPlayerEvents[playernum].clear(); |
| 18693 | |
| 18694 | // packet header |
| 18695 | memset(net_packet->data, 0, NET_PACKET_SIZE); |
| 18696 | memcpy(net_packet->data, "CMPD", 4); |
| 18697 | Uint8 sequence = 0; |
| 18698 | // encode name |
| 18699 | int chunksize = 256; |
| 18700 | const int numchunks = 1 + (len / chunksize); |
| 18701 | for ( int c = 0; c < len; c += chunksize ) |
| 18702 | { |
| 18703 | sequence += 1; |
| 18704 | |
| 18705 | if ( c + chunksize > len ) |
| 18706 | { |
| 18707 | chunksize = len - c; |
nothing calls this directly
no test coverage detected