Skip to content

Commit 2c1a4a4

Browse files
Synchronize changes from 1.6 master branch [ci skip]
17c2b28 Attach events & rotation fix (PR #3353, Fixes #3273)
2 parents c8c8a46 + 17c2b28 commit 2c1a4a4

File tree

5 files changed

+190
-65
lines changed

5 files changed

+190
-65
lines changed

Client/mods/deathmatch/logic/CClientGame.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2630,6 +2630,8 @@ void CClientGame::AddBuiltInEvents()
26302630
m_Events.AddEvent("onClientElementModelChange", "oldModel, newModel", nullptr, false);
26312631
m_Events.AddEvent("onClientElementDimensionChange", "oldDimension, newDimension", nullptr, false);
26322632
m_Events.AddEvent("onClientElementInteriorChange", "oldInterior, newInterior", nullptr, false);
2633+
m_Events.AddEvent("onClientElementAttach", "attachSource, attachOffsetX, attachOffsetY, attachOffsetZ, attachOffsetRX, attachOffsetRY, attachOffsetRZ", nullptr, false);
2634+
m_Events.AddEvent("onClientElementDetach", "detachSource, detachWorldX, detachWorldY, detachWorldZ, detachWorldRX, detachWorldRY, detachWorldRZ", nullptr, false);
26332635

26342636
// Player events
26352637
m_Events.AddEvent("onClientPlayerJoin", "", NULL, false);

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,35 +1371,64 @@ bool CStaticFunctionDefinitions::AttachElements(CClientEntity& Entity, CClientEn
13711371
RUN_CHILDREN(AttachElements(**iter, AttachedToEntity, vecPosition, vecRotation))
13721372

13731373
// Can these elements be attached?
1374-
if (Entity.IsAttachToable() && AttachedToEntity.IsAttachable() && !AttachedToEntity.IsAttachedToElement(&Entity) &&
1375-
Entity.GetDimension() == AttachedToEntity.GetDimension())
1374+
if (!Entity.IsAttachToable() || !AttachedToEntity.IsAttachable() || AttachedToEntity.IsAttachedToElement(&Entity) ||
1375+
Entity.GetDimension() != AttachedToEntity.GetDimension())
13761376
{
1377-
ConvertDegreesToRadians(vecRotation);
1377+
return false;
1378+
}
13781379

1379-
Entity.SetAttachedOffsets(vecPosition, vecRotation);
1380-
Entity.AttachTo(&AttachedToEntity);
1380+
CLuaArguments Arguments;
1381+
Arguments.PushElement(&AttachedToEntity);
1382+
Arguments.PushNumber(vecPosition.fX);
1383+
Arguments.PushNumber(vecPosition.fY);
1384+
Arguments.PushNumber(vecPosition.fZ);
1385+
Arguments.PushNumber(vecRotation.fX);
1386+
Arguments.PushNumber(vecRotation.fY);
1387+
Arguments.PushNumber(vecRotation.fZ);
1388+
1389+
if (!Entity.CallEvent("onClientElementAttach", Arguments, true))
1390+
return false;
13811391

1382-
return true;
1383-
}
1392+
ConvertDegreesToRadians(vecRotation);
13841393

1385-
return false;
1394+
Entity.SetAttachedOffsets(vecPosition, vecRotation);
1395+
Entity.AttachTo(&AttachedToEntity);
1396+
1397+
return true;
13861398
}
13871399

13881400
bool CStaticFunctionDefinitions::DetachElements(CClientEntity& Entity, CClientEntity* pAttachedToEntity)
13891401
{
13901402
RUN_CHILDREN(DetachElements(**iter, pAttachedToEntity))
13911403

13921404
CClientEntity* pActualAttachedToEntity = Entity.GetAttachedTo();
1393-
if (pActualAttachedToEntity)
1405+
if (!pActualAttachedToEntity || (pAttachedToEntity && pActualAttachedToEntity != pAttachedToEntity))
13941406
{
1395-
if (pAttachedToEntity == NULL || pActualAttachedToEntity == pAttachedToEntity)
1396-
{
1397-
Entity.AttachTo(NULL);
1398-
return true;
1399-
}
1407+
return false;
14001408
}
14011409

1402-
return false;
1410+
CVector vecPosition;
1411+
CVector vecRotation;
1412+
1413+
Entity.GetPosition(vecPosition);
1414+
Entity.GetRotationDegrees(vecRotation);
1415+
1416+
CLuaArguments Arguments;
1417+
Arguments.PushElement(pActualAttachedToEntity);
1418+
Arguments.PushNumber(vecPosition.fX);
1419+
Arguments.PushNumber(vecPosition.fY);
1420+
Arguments.PushNumber(vecPosition.fZ);
1421+
Arguments.PushNumber(vecRotation.fX);
1422+
Arguments.PushNumber(vecRotation.fY);
1423+
Arguments.PushNumber(vecRotation.fZ);
1424+
1425+
if (!Entity.CallEvent("onClientElementDetach", Arguments, true))
1426+
{
1427+
return false;
1428+
}
1429+
1430+
Entity.AttachTo(NULL);
1431+
return true;
14031432
}
14041433

14051434
bool CStaticFunctionDefinitions::SetElementAttachedOffsets(CClientEntity& Entity, CVector& vecPosition, CVector& vecRotation)

Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp

Lines changed: 75 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -313,32 +313,90 @@ void CElementRPCs::SetElementDimension(CClientEntity* pSource, NetBitStreamInter
313313
void CElementRPCs::AttachElements(CClientEntity* pSource, NetBitStreamInterface& bitStream)
314314
{
315315
ElementID usAttachedToID;
316-
CVector vecPosition, vecRotation;
317-
if (bitStream.Read(usAttachedToID) && bitStream.Read(vecPosition.fX) && bitStream.Read(vecPosition.fY) && bitStream.Read(vecPosition.fZ) &&
318-
bitStream.Read(vecRotation.fX) && bitStream.Read(vecRotation.fY) && bitStream.Read(vecRotation.fZ))
316+
317+
CVector vecPosition;
318+
CVector vecRotation;
319+
320+
if (!(bitStream.Read(usAttachedToID) && bitStream.Read(vecPosition.fX) && bitStream.Read(vecPosition.fY) && bitStream.Read(vecPosition.fZ) &&
321+
bitStream.Read(vecRotation.fX) && bitStream.Read(vecRotation.fY) && bitStream.Read(vecRotation.fZ)))
319322
{
320-
CClientEntity* pAttachedToEntity = CElementIDs::GetElement(usAttachedToID);
321-
if (pAttachedToEntity)
322-
{
323-
pSource->SetAttachedOffsets(vecPosition, vecRotation);
324-
pSource->AttachTo(pAttachedToEntity);
325-
}
323+
return;
324+
}
325+
326+
CClientEntity* pAttachedToEntity = CElementIDs::GetElement(usAttachedToID);
327+
if (!pAttachedToEntity)
328+
{
329+
return;
326330
}
331+
332+
ConvertRadiansToDegrees(vecRotation);
333+
334+
CLuaArguments Arguments;
335+
Arguments.PushElement(pAttachedToEntity);
336+
Arguments.PushNumber(vecPosition.fX);
337+
Arguments.PushNumber(vecPosition.fY);
338+
Arguments.PushNumber(vecPosition.fZ);
339+
Arguments.PushNumber(vecRotation.fX);
340+
Arguments.PushNumber(vecRotation.fY);
341+
Arguments.PushNumber(vecRotation.fZ);
342+
343+
if (!pSource->CallEvent("onClientElementAttach", Arguments, true))
344+
{
345+
return;
346+
}
347+
348+
ConvertDegreesToRadians(vecRotation);
349+
350+
pSource->SetAttachedOffsets(vecPosition, vecRotation);
351+
pSource->AttachTo(pAttachedToEntity);
327352
}
328353

329354
void CElementRPCs::DetachElements(CClientEntity* pSource, NetBitStreamInterface& bitStream)
330355
{
331356
unsigned char ucTimeContext;
332-
if (bitStream.Read(ucTimeContext))
357+
if (!bitStream.Read(ucTimeContext))
333358
{
334-
pSource->SetSyncTimeContext(ucTimeContext);
335-
pSource->AttachTo(NULL);
359+
return;
360+
}
336361

337-
CVector vecPosition;
338-
if (bitStream.Read(vecPosition.fX) && bitStream.Read(vecPosition.fY) && bitStream.Read(vecPosition.fZ))
339-
{
340-
pSource->SetPosition(vecPosition);
341-
}
362+
ElementID usAttachedToID;
363+
CClientEntity* pAttachedToEntity = CElementIDs::GetElement(usAttachedToID);
364+
365+
CVector vecPosition;
366+
CVector vecRotation;
367+
368+
bitStream.Read(vecPosition.fX);
369+
bitStream.Read(vecPosition.fY);
370+
bitStream.Read(vecPosition.fZ);
371+
bitStream.Read(vecRotation.fX);
372+
bitStream.Read(vecRotation.fY);
373+
bitStream.Read(vecRotation.fZ);
374+
375+
CLuaArguments Arguments;
376+
Arguments.PushElement(pAttachedToEntity);
377+
Arguments.PushNumber(vecPosition.fX);
378+
Arguments.PushNumber(vecPosition.fY);
379+
Arguments.PushNumber(vecPosition.fZ);
380+
Arguments.PushNumber(vecRotation.fX);
381+
Arguments.PushNumber(vecRotation.fY);
382+
Arguments.PushNumber(vecRotation.fZ);
383+
384+
if (!pSource->CallEvent("onClientElementDetach", Arguments, true))
385+
{
386+
return;
387+
}
388+
389+
pSource->SetSyncTimeContext(ucTimeContext);
390+
pSource->AttachTo(NULL);
391+
392+
if (vecPosition.fX != 0.0f || vecPosition.fY != 0.0f || vecPosition.fZ != 0.0f)
393+
{
394+
pSource->SetPosition(vecPosition);
395+
}
396+
397+
if (vecRotation.fX != 0.0f || vecRotation.fY != 0.0f || vecRotation.fZ != 0.0f)
398+
{
399+
pSource->SetRotationDegrees(vecRotation);
342400
}
343401
}
344402

Server/mods/deathmatch/logic/CGame.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,6 +1668,8 @@ void CGame::AddBuiltInEvents()
16681668
m_Events.AddEvent("onElementModelChange", "oldModel, newModel", NULL, false);
16691669
m_Events.AddEvent("onElementDimensionChange", "oldDimension, newDimension", nullptr, false);
16701670
m_Events.AddEvent("onElementInteriorChange", "oldInterior, newInterior", nullptr, false);
1671+
m_Events.AddEvent("onElementAttach", "attachSource, attachOffsetX, attachOffsetY, attachOffsetZ, attachOffsetRX, attachOffsetRY, attachOffsetRZ", nullptr, false);
1672+
m_Events.AddEvent("onElementDetach", "detachSource, detachWorldX, detachWorldY, detachWorldZ, detachWorldRX, detachWorldRY, detachWorldRZ", nullptr, false);
16711673

16721674
// Radar area events
16731675

Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 67 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,56 +1598,90 @@ bool CStaticFunctionDefinitions::AttachElements(CElement* pElement, CElement* pA
15981598
assert(pElement);
15991599
assert(pAttachedToElement);
16001600

1601-
if (pElement->IsAttachToable() && pAttachedToElement->IsAttachable() && !pAttachedToElement->IsAttachedToElement(pElement) &&
1602-
pElement->GetDimension() == pAttachedToElement->GetDimension())
1601+
if (!pElement->IsAttachToable() || !pAttachedToElement->IsAttachable() || pAttachedToElement->IsAttachedToElement(pElement) ||
1602+
pElement->GetDimension() != pAttachedToElement->GetDimension())
16031603
{
1604-
pElement->SetAttachedOffsets(vecPosition, vecRotation);
1605-
ConvertDegreesToRadians(vecRotation);
1606-
pElement->AttachTo(pAttachedToElement);
1604+
return false;
1605+
}
16071606

1608-
CBitStream BitStream;
1609-
BitStream.pBitStream->Write(pAttachedToElement->GetID());
1610-
BitStream.pBitStream->Write(vecPosition.fX);
1611-
BitStream.pBitStream->Write(vecPosition.fY);
1612-
BitStream.pBitStream->Write(vecPosition.fZ);
1613-
BitStream.pBitStream->Write(vecRotation.fX);
1614-
BitStream.pBitStream->Write(vecRotation.fY);
1615-
BitStream.pBitStream->Write(vecRotation.fZ);
1616-
m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pElement, ATTACH_ELEMENTS, *BitStream.pBitStream));
1607+
CLuaArguments Arguments;
1608+
Arguments.PushElement(pAttachedToElement);
1609+
Arguments.PushNumber(vecPosition.fX);
1610+
Arguments.PushNumber(vecPosition.fY);
1611+
Arguments.PushNumber(vecPosition.fZ);
1612+
Arguments.PushNumber(vecRotation.fX);
1613+
Arguments.PushNumber(vecRotation.fY);
1614+
Arguments.PushNumber(vecRotation.fZ);
16171615

1618-
return true;
1616+
if (!pElement->CallEvent("onElementAttach", Arguments))
1617+
{
1618+
return false;
16191619
}
16201620

1621-
return false;
1621+
ConvertDegreesToRadians(vecRotation);
1622+
1623+
pElement->SetAttachedOffsets(vecPosition, vecRotation);
1624+
pElement->AttachTo(pAttachedToElement);
1625+
1626+
CBitStream BitStream;
1627+
BitStream.pBitStream->Write(pAttachedToElement->GetID());
1628+
BitStream.pBitStream->Write(vecPosition.fX);
1629+
BitStream.pBitStream->Write(vecPosition.fY);
1630+
BitStream.pBitStream->Write(vecPosition.fZ);
1631+
BitStream.pBitStream->Write(vecRotation.fX);
1632+
BitStream.pBitStream->Write(vecRotation.fY);
1633+
BitStream.pBitStream->Write(vecRotation.fZ);
1634+
m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pElement, ATTACH_ELEMENTS, *BitStream.pBitStream));
1635+
1636+
return true;
16221637
}
16231638

16241639
bool CStaticFunctionDefinitions::DetachElements(CElement* pElement, CElement* pAttachedToElement)
16251640
{
16261641
assert(pElement);
16271642

16281643
CElement* pActualAttachedToElement = pElement->GetAttachedToElement();
1629-
if (pActualAttachedToElement)
1644+
if (!pActualAttachedToElement || (pAttachedToElement && pActualAttachedToElement != pAttachedToElement))
16301645
{
1631-
if (pAttachedToElement == NULL || pActualAttachedToElement == pAttachedToElement)
1632-
{
1633-
// Detach it. Also generate a new time context to prevent sync screwup from
1634-
// old packes arriving.
1635-
CVector vecPosition = pElement->GetPosition();
1636-
pElement->AttachTo(NULL);
1637-
pElement->GenerateSyncTimeContext();
1646+
return false;
1647+
}
16381648

1639-
CBitStream BitStream;
1640-
BitStream.pBitStream->Write(pElement->GetSyncTimeContext());
1641-
BitStream.pBitStream->Write(vecPosition.fX);
1642-
BitStream.pBitStream->Write(vecPosition.fY);
1643-
BitStream.pBitStream->Write(vecPosition.fZ);
1644-
m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pElement, DETACH_ELEMENTS, *BitStream.pBitStream));
1649+
CVector vecPosition = pElement->GetPosition();
1650+
CVector vecRotation;
16451651

1646-
return true;
1647-
}
1652+
pElement->GetRotation(vecRotation);
1653+
ConvertRadiansToDegrees(vecRotation);
1654+
1655+
CLuaArguments Arguments;
1656+
Arguments.PushElement(pActualAttachedToElement);
1657+
Arguments.PushNumber(vecPosition.fX);
1658+
Arguments.PushNumber(vecPosition.fY);
1659+
Arguments.PushNumber(vecPosition.fZ);
1660+
Arguments.PushNumber(vecRotation.fX);
1661+
Arguments.PushNumber(vecRotation.fY);
1662+
Arguments.PushNumber(vecRotation.fZ);
1663+
1664+
if (!pElement->CallEvent("onElementDetach", Arguments))
1665+
{
1666+
return false;
16481667
}
16491668

1650-
return false;
1669+
// Detach it. Also generate a new time context to prevent sync screwup from
1670+
// old packets arriving.
1671+
pElement->AttachTo(NULL);
1672+
pElement->GenerateSyncTimeContext();
1673+
1674+
CBitStream BitStream;
1675+
BitStream.pBitStream->Write(pElement->GetSyncTimeContext());
1676+
BitStream.pBitStream->Write(vecPosition.fX);
1677+
BitStream.pBitStream->Write(vecPosition.fY);
1678+
BitStream.pBitStream->Write(vecPosition.fZ);
1679+
BitStream.pBitStream->Write(vecRotation.fX);
1680+
BitStream.pBitStream->Write(vecRotation.fY);
1681+
BitStream.pBitStream->Write(vecRotation.fZ);
1682+
m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pElement, DETACH_ELEMENTS, *BitStream.pBitStream));
1683+
1684+
return true;
16511685
}
16521686

16531687
bool CStaticFunctionDefinitions::SetElementAlpha(CElement* pElement, unsigned char ucAlpha)

0 commit comments

Comments
 (0)