@@ -2712,85 +2712,134 @@ void CGame::Packet_LuaEvent(CLuaEventPacket& Packet)
27122712 }
27132713}
27142714
2715- void CGame::Packet_CustomData (CCustomDataPacket& Packet )
2715+ void CGame::Packet_CustomData (CCustomDataPacket& packet )
27162716{
27172717 // Got a valid source?
2718- CPlayer* pSourcePlayer = Packet .GetSourcePlayer ();
2719- if (pSourcePlayer )
2718+ auto * sourcePlayer = packet .GetSourcePlayer ();
2719+ if (sourcePlayer )
27202720 {
27212721 // Grab the element
2722- ElementID ID = Packet .GetElementID ();
2723- CElement* pElement = CElementIDs::GetElement (ID );
2724- if (pElement )
2722+ ElementID elementId = packet .GetElementID ();
2723+ auto * element = CElementIDs::GetElement (elementId );
2724+ if (element )
27252725 {
27262726 // Change the data
2727- const char * szName = Packet.GetName ();
2728- CLuaArgument& Value = Packet.GetValue ();
2727+ const char * name = packet.GetName ();
2728+ CLuaArgument& value = packet.GetValue ();
2729+ const bool isDelete = packet.IsDelete ();
27292730
27302731 // Ignore if the wrong length
2731- if (strlen (szName ) > MAX_CUSTOMDATA_NAME_LENGTH )
2732+ if (strlen (name ) > MAX_CUSTOMDATA_NAME_LENGTH )
27322733 {
2733- CLogger::ErrorPrintf (" Received oversized custom data name from %s (%s)\n " , Packet. GetSourcePlayer () ->GetNick (),
2734- *SStringX (szName ).Left (MAX_CUSTOMDATA_NAME_LENGTH + 1 ));
2734+ CLogger::ErrorPrintf (" Received oversized custom data name from %s (%s)\n " , sourcePlayer ->GetNick (),
2735+ *SStringX (name ).Left (MAX_CUSTOMDATA_NAME_LENGTH + 1 ));
27352736 return ;
27362737 }
27372738
27382739 ESyncType lastSyncType = ESyncType::BROADCAST ;
27392740 eCustomDataClientTrust clientChangesMode{};
27402741
2741- pElement ->GetCustomData (szName , false , &lastSyncType, &clientChangesMode);
2742+ element ->GetCustomData (name , false , &lastSyncType, &clientChangesMode);
27422743
27432744 const bool changesAllowed = clientChangesMode == eCustomDataClientTrust::UNSET ? !m_pMainConfig->IsElementDataWhitelisted ()
27442745 : clientChangesMode == eCustomDataClientTrust::ALLOW ;
27452746 if (!changesAllowed)
27462747 {
2747- CLogger::ErrorPrintf (" Client trying to change protected element data %s (%s)\n " , Packet. GetSourcePlayer () ->GetNick (), szName );
2748+ CLogger::ErrorPrintf (" Client trying to change protected element data %s (%s)\n " , sourcePlayer ->GetNick (), name );
27482749
27492750 CLuaArguments arguments;
2750- arguments.PushElement (pElement );
2751- arguments.PushString (szName );
2752- arguments.PushArgument (Value );
2753- pSourcePlayer ->CallEvent (" onPlayerChangesProtectedData" , arguments);
2751+ arguments.PushElement (element );
2752+ arguments.PushString (name );
2753+ arguments.PushArgument (value );
2754+ sourcePlayer ->CallEvent (" onPlayerChangesProtectedData" , arguments);
27542755 return ;
27552756 }
27562757
2757- if (pElement-> SetCustomData (szName, Value, lastSyncType, pSourcePlayer) )
2758+ if (isDelete )
27582759 {
2759- if (lastSyncType != ESyncType:: LOCAL )
2760+ if (element-> DeleteCustomData (name, sourcePlayer) )
27602761 {
2761- // Tell our clients to update their data. Send to everyone but the one we got this packet from.
2762- unsigned short usNameLength = static_cast <unsigned short >(strlen (szName));
2763- CBitStream BitStream;
2764- BitStream.pBitStream ->WriteCompressed (usNameLength);
2765- BitStream.pBitStream ->Write (szName, usNameLength);
2766- Value.WriteToBitStream (*BitStream.pBitStream );
2767- if (lastSyncType == ESyncType::BROADCAST )
2768- m_pPlayerManager->BroadcastOnlyJoined (CElementRPCPacket (pElement, SET_ELEMENT_DATA , *BitStream.pBitStream ), pSourcePlayer);
2769- else
2770- m_pPlayerManager->BroadcastOnlySubscribed (CElementRPCPacket (pElement, SET_ELEMENT_DATA , *BitStream.pBitStream ), pElement, szName,
2771- pSourcePlayer);
2762+ if (lastSyncType != ESyncType::LOCAL )
2763+ {
2764+ // Tell our clients to remove their data. Send to everyone but the one we got this packet from.
2765+ std::uint16_t nameLength = static_cast <std::uint16_t >(strlen (name));
2766+ CBitStream bitStream;
2767+ bitStream.pBitStream ->WriteCompressed (nameLength);
2768+ bitStream.pBitStream ->Write (name, nameLength);
2769+ bitStream.pBitStream ->WriteBit (false ); // Unused (was recursive flag)
2770+ if (lastSyncType == ESyncType::BROADCAST )
2771+ m_pPlayerManager->BroadcastOnlyJoined (CElementRPCPacket (element, REMOVE_ELEMENT_DATA , *bitStream.pBitStream ), sourcePlayer);
2772+ else
2773+ m_pPlayerManager->BroadcastOnlySubscribed (CElementRPCPacket (element, REMOVE_ELEMENT_DATA , *bitStream.pBitStream ), element, name,
2774+ sourcePlayer);
27722775
2773- CPerfStatEventPacketUsage::GetSingleton ()->UpdateElementDataUsageRelayed (szName, m_pPlayerManager->Count (),
2774- BitStream.pBitStream ->GetNumberOfBytesUsed ());
2776+ CPerfStatEventPacketUsage::GetSingleton ()->UpdateElementDataUsageRelayed (name, m_pPlayerManager->Count (),
2777+ bitStream.pBitStream ->GetNumberOfBytesUsed ());
2778+ }
2779+
2780+ if (lastSyncType == ESyncType::SUBSCRIBE )
2781+ m_pPlayerManager->ClearElementData (element, name);
2782+ }
2783+ else
2784+ {
2785+ // Restore the element data on the client, because the server cancelled the change in onElementDataChange.
2786+ std::uint16_t nameLength = static_cast <std::uint16_t >(strlen (name));
2787+ CBitStream bitStream;
2788+ bitStream.pBitStream ->WriteCompressed (nameLength);
2789+ bitStream.pBitStream ->Write (name, nameLength);
2790+
2791+ if (auto * serverValue = element->GetCustomData (name, false ))
2792+ {
2793+ serverValue->WriteToBitStream (*bitStream.pBitStream );
2794+ sourcePlayer->Send (CElementRPCPacket (element, SET_ELEMENT_DATA , *bitStream.pBitStream ));
2795+ }
2796+ else
2797+ {
2798+ bitStream.pBitStream ->WriteBit (false );
2799+ sourcePlayer->Send (CElementRPCPacket (element, REMOVE_ELEMENT_DATA , *bitStream.pBitStream ));
2800+ }
27752801 }
27762802 }
27772803 else
27782804 {
2779- // Event was cancelled; sync the authoritative value back to the source player
2780- unsigned short usNameLength = static_cast <unsigned short >(strlen (szName));
2781- CBitStream BitStream;
2782- BitStream.pBitStream ->WriteCompressed (usNameLength);
2783- BitStream.pBitStream ->Write (szName, usNameLength);
2784-
2785- if (CLuaArgument* pServerValue = pElement->GetCustomData (szName, false ))
2805+ if (element->SetCustomData (name, value, lastSyncType, sourcePlayer))
27862806 {
2787- pServerValue->WriteToBitStream (*BitStream.pBitStream );
2788- pSourcePlayer->Send (CElementRPCPacket (pElement, SET_ELEMENT_DATA , *BitStream.pBitStream ));
2807+ if (lastSyncType != ESyncType::LOCAL )
2808+ {
2809+ // Tell our clients to update their data. Send to everyone but the one we got this packet from.
2810+ std::uint16_t nameLength = static_cast <std::uint16_t >(strlen (name));
2811+ CBitStream bitStream;
2812+ bitStream.pBitStream ->WriteCompressed (nameLength);
2813+ bitStream.pBitStream ->Write (name, nameLength);
2814+ value.WriteToBitStream (*bitStream.pBitStream );
2815+ if (lastSyncType == ESyncType::BROADCAST )
2816+ m_pPlayerManager->BroadcastOnlyJoined (CElementRPCPacket (element, SET_ELEMENT_DATA , *bitStream.pBitStream ), sourcePlayer);
2817+ else
2818+ m_pPlayerManager->BroadcastOnlySubscribed (CElementRPCPacket (element, SET_ELEMENT_DATA , *bitStream.pBitStream ), element, name,
2819+ sourcePlayer);
2820+
2821+ CPerfStatEventPacketUsage::GetSingleton ()->UpdateElementDataUsageRelayed (name, m_pPlayerManager->Count (),
2822+ bitStream.pBitStream ->GetNumberOfBytesUsed ());
2823+ }
27892824 }
27902825 else
27912826 {
2792- BitStream.pBitStream ->WriteBit (false );
2793- pSourcePlayer->Send (CElementRPCPacket (pElement, REMOVE_ELEMENT_DATA , *BitStream.pBitStream ));
2827+ // Restore the element data on the client, because the server cancelled the change in onElementDataChange.
2828+ std::uint16_t nameLength = static_cast <std::uint16_t >(strlen (name));
2829+ CBitStream bitStream;
2830+ bitStream.pBitStream ->WriteCompressed (nameLength);
2831+ bitStream.pBitStream ->Write (name, nameLength);
2832+
2833+ if (auto * serverValue = element->GetCustomData (name, false ))
2834+ {
2835+ serverValue->WriteToBitStream (*bitStream.pBitStream );
2836+ sourcePlayer->Send (CElementRPCPacket (element, SET_ELEMENT_DATA , *bitStream.pBitStream ));
2837+ }
2838+ else
2839+ {
2840+ bitStream.pBitStream ->WriteBit (false );
2841+ sourcePlayer->Send (CElementRPCPacket (element, REMOVE_ELEMENT_DATA , *bitStream.pBitStream ));
2842+ }
27942843 }
27952844 }
27962845 }
0 commit comments