@@ -1607,6 +1607,7 @@ void CGame::AddBuiltInEvents()
16071607 m_Events.AddEvent (" onPlayerTriggerEventThreshold" , " " , nullptr , false );
16081608 m_Events.AddEvent (" onPlayerTeamChange" , " oldTeam, newTeam" , nullptr , false );
16091609 m_Events.AddEvent (" onPlayerTriggerInvalidEvent" , " eventName, isAdded, isRemote" , nullptr , false );
1610+ m_Events.AddEvent (" onPlayerChangesProtectedData" , " element, key, value" , nullptr , false );
16101611
16111612 // Ped events
16121613 m_Events.AddEvent (" onPedVehicleEnter" , " vehicle, seat, jacked" , NULL , false );
@@ -2652,7 +2653,24 @@ void CGame::Packet_CustomData(CCustomDataPacket& Packet)
26522653 }
26532654
26542655 ESyncType lastSyncType = ESyncType::BROADCAST;
2655- pElement->GetCustomData (szName, false , &lastSyncType);
2656+ eCustomDataClientTrust clientChangesMode{};
2657+
2658+ pElement->GetCustomData (szName, false , &lastSyncType, &clientChangesMode);
2659+
2660+ const bool changesAllowed = clientChangesMode == eCustomDataClientTrust::UNSET ? !m_pMainConfig->IsElementDataWhitelisted ()
2661+ : clientChangesMode == eCustomDataClientTrust::ALLOW;
2662+ if (!changesAllowed)
2663+ {
2664+ CLogger::ErrorPrintf (" Client trying to change protected element data %s (%s)" , Packet.GetSourcePlayer ()->GetNick (),
2665+ szName);
2666+
2667+ CLuaArguments arguments;
2668+ arguments.PushElement (pElement);
2669+ arguments.PushString (szName);
2670+ arguments.PushArgument (Value);
2671+ pSourcePlayer->CallEvent (" onPlayerChangesProtectedData" , arguments);
2672+ return ;
2673+ }
26562674
26572675 if (lastSyncType != ESyncType::LOCAL)
26582676 {
0 commit comments