From 02d1528d81954d6e71ddcc96be2d6a1e91257836 Mon Sep 17 00:00:00 2001 From: "Felipe A." <73603452+imfelipedev@users.noreply.github.com> Date: Thu, 9 Jan 2025 22:55:58 -0300 Subject: [PATCH 1/9] Add new event onPlayerTeleport --- Server/mods/deathmatch/logic/CGame.cpp | 1 + Server/mods/deathmatch/logic/CMainConfig.cpp | 1 + Server/mods/deathmatch/logic/CPlayer.cpp | 12 ++++++++++++ .../deathmatch/logic/CStaticFunctionDefinitions.cpp | 6 ++++++ .../logic/packets/CPlayerPuresyncPacket.cpp | 10 ++++++++++ Server/mods/deathmatch/mtaserver.conf | 4 ++++ Server/mods/deathmatch/mtaserver.conf.template | 4 ++++ Shared/mods/deathmatch/logic/CTickRateSettings.h | 2 ++ 8 files changed, 40 insertions(+) diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index fe8d5397fe..d5a799d8de 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -1638,6 +1638,7 @@ void CGame::AddBuiltInEvents() m_Events.AddEvent("onPlayerTriggerInvalidEvent", "eventName, isAdded, isRemote", nullptr, false); m_Events.AddEvent("onPlayerChangesProtectedData", "element, key, value", nullptr, false); m_Events.AddEvent("onPlayerChangesWorldSpecialProperty", "property, enabled", nullptr, false); + m_Events.AddEvent("onPlayerTeleport", "", NULL, false); // Ped events m_Events.AddEvent("onPedVehicleEnter", "vehicle, seat, jacked", NULL, false); diff --git a/Server/mods/deathmatch/logic/CMainConfig.cpp b/Server/mods/deathmatch/logic/CMainConfig.cpp index ec5bf9b9d9..ca687365d8 100644 --- a/Server/mods/deathmatch/logic/CMainConfig.cpp +++ b/Server/mods/deathmatch/logic/CMainConfig.cpp @@ -1520,6 +1520,7 @@ const std::vector& CMainConfig::GetIntSettingList() {true, true, 50, 100, 400, "ped_syncer_distance", &g_TickRateSettings.iPedSyncerDistance, &CMainConfig::OnTickRateChange}, {true, true, 50, 130, 400, "unoccupied_vehicle_syncer_distance", &g_TickRateSettings.iUnoccupiedVehicleSyncerDistance, &CMainConfig::OnTickRateChange}, {true, true, 0, 30, 130, "vehicle_contact_sync_radius", &g_TickRateSettings.iVehicleContactSyncRadius, &CMainConfig::OnTickRateChange}, + {true, true, 50, 100, 500, "player_teleport_alert", &g_TickRateSettings.iPlayerTeleportAlert, &CMainConfig::OnTickRateChange}, {false, false, 0, 1, 2, "compact_internal_databases", &m_iCompactInternalDatabases, NULL}, {true, true, 0, 1, 2, "minclientversion_auto_update", &m_iMinClientVersionAutoUpdate, NULL}, {true, true, 0, 0, 100, "server_logic_fps_limit", &m_iServerLogicFpsLimit, NULL}, diff --git a/Server/mods/deathmatch/logic/CPlayer.cpp b/Server/mods/deathmatch/logic/CPlayer.cpp index bf9d6b07d4..143ef6e6e1 100644 --- a/Server/mods/deathmatch/logic/CPlayer.cpp +++ b/Server/mods/deathmatch/logic/CPlayer.cpp @@ -99,6 +99,8 @@ CPlayer::CPlayer(CPlayerManager* pPlayerManager, class CScriptDebugging* pScript m_ucBlurLevel = 36; // Default + m_bTeleported = false; + // Sync stuff m_bSyncingVelocity = false; m_uiPuresyncPackets = 0; @@ -1115,6 +1117,16 @@ void CPlayer::SetPlayerStat(unsigned short usStat, float fValue) CPed::SetPlayerStat(usStat, fValue); } +bool CPlayer::GetTeleported() +{ + return m_bTeleported; +} + +void CPlayer::SetTeleported(bool bState) +{ + m_bTeleported = bState; +} + // Calculate weapon range using efficient stuffs float CPlayer::GetWeaponRangeFromSlot(uint uiSlot) { diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index e80745b184..a2dfa51811 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1274,6 +1274,12 @@ bool CStaticFunctionDefinitions::SetElementPosition(CElement* pElement, const CV assert(pElement); RUN_CHILDREN(SetElementPosition(*iter, vecPosition, bWarp)) + if (IS_PLAYER(pElement)) + { + CPlayer* pPlayer = static_cast(pElement); + pPlayer->SetTeleported(true); + } + // Update our position for that entity. pElement->SetPosition(vecPosition); diff --git a/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp index 399d3c0b35..1ab23c2a3d 100644 --- a/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp @@ -129,6 +129,16 @@ bool CPlayerPuresyncPacket::Read(NetBitStreamInterface& BitStream) position.data.vecPosition += vecTempPos; } + CVector vecPlayerPosition = pSourcePlayer->GetPosition(); + float fPlayerDistancePosition = DistanceBetweenPoints3D(vecPlayerPosition, position.data.vecPosition); + if (fPlayerDistancePosition >= g_TickRateSettings.iPlayerTeleportAlert) { + if (!pSourcePlayer->GetTeleported()) { + pSourcePlayer->CallEvent("onPlayerTeleport") + } + + pSourcePlayer->SetTeleported(false) + } + pSourcePlayer->SetPosition(position.data.vecPosition); // Player rotation diff --git a/Server/mods/deathmatch/mtaserver.conf b/Server/mods/deathmatch/mtaserver.conf index 79a306fc19..85ed3b0cfc 100644 --- a/Server/mods/deathmatch/mtaserver.conf +++ b/Server/mods/deathmatch/mtaserver.conf @@ -161,6 +161,10 @@ Available range: 0 to 130. Default - 30 --> 30 + + 100 + 30 + + 100 + + Available range: 5 to 500. Default - 100 --> 100 + Available range: 5 to 500. Default - 100 --> 100