Skip to content
48 changes: 15 additions & 33 deletions Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1076,6 +1076,13 @@ bool CStaticFunctionDefinitions::SetElementPosition(CClientEntity& Entity, const
{
RUN_CHILDREN(SetElementPosition(**iter, vecPosition))

if (Entity.GetType() == CCLIENTVEHICLE)
{
CClientPed* driver = static_cast<CClientVehicle&>(Entity).GetOccupant(0);
if (!Entity.IsLocalEntity() && !static_cast<CDeathmatchVehicle&>(Entity).IsSyncing() && (driver && !driver->IsLocalPlayer()))
return false;
}

if (bWarp)
Entity.Teleport(vecPosition);
else
Expand Down Expand Up @@ -1491,6 +1498,9 @@ bool CStaticFunctionDefinitions::SetElementHealth(CClientEntity& Entity, float f
{
RUN_CHILDREN(SetElementHealth(**iter, fHealth))

if (!Entity.IsLocalEntity())
return false;

switch (Entity.GetType())
{
case CCLIENTPED:
Expand Down Expand Up @@ -2907,41 +2917,13 @@ bool CStaticFunctionDefinitions::BlowVehicle(CClientEntity& Entity, std::optiona
return false;

CClientVehicle& vehicle = static_cast<CClientVehicle&>(Entity);
VehicleBlowFlags blow;
if (!vehicle.IsLocalEntity())
return false;

VehicleBlowFlags blow;

blow.withExplosion = withExplosion.value_or(true);

if (vehicle.IsLocalEntity())
{
vehicle.Blow(blow);
}
else
{
CVector position;
vehicle.GetPosition(position);

const auto type = vehicle.GetType();
const auto state = (blow.withExplosion ? VehicleBlowState::AWAITING_EXPLOSION_SYNC : VehicleBlowState::BLOWN);
eExplosionType explosion;

switch (type)
{
case CLIENTVEHICLE_CAR:
explosion = EXP_TYPE_CAR;
break;
case CLIENTVEHICLE_HELI:
explosion = EXP_TYPE_HELI;
break;
case CLIENTVEHICLE_BOAT:
explosion = EXP_TYPE_BOAT;
break;
default:
explosion = EXP_TYPE_CAR;
}

g_pClientGame->SendExplosionSync(position, explosion, &Entity, state);
}

vehicle.Blow(blow);
return true;
}

Expand Down
Loading