123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include "StdAfx.h"
- #include "PhysicsObj.h"
- #include "World.h"
- #include "ObjectMsgs.h"
- void CPhysicsObj::Movement_Init()
- {
- m_fMoveThink = g_pGlobals->Time();
- }
- void CPhysicsObj::Movement_Shutdown()
- {
- }
- void CPhysicsObj::Movement_Think()
- {
- if (HasOwner())
- return;
- if ((m_fMoveThink + 0.05f) < g_pGlobals->Time())
- {
- if (m_lastMoveOrigin.landcell != m_Origin.landcell ||
- m_lastMoveOrigin.x != m_Origin.x ||
- m_lastMoveOrigin.y != m_Origin.y ||
- m_lastMoveOrigin.z != m_Origin.z)
- {
- Movement_UpdatePos();
- }
- else if (m_lastMoveAngles.w != m_Angles.w ||
- m_lastMoveAngles.x != m_Angles.x ||
- m_lastMoveAngles.y != m_Angles.y ||
- m_lastMoveAngles.z != m_Angles.z)
- {
- Movement_UpdatePos();
- }
- m_fMoveThink = g_pGlobals->Time();
- }
- }
- void CPhysicsObj::Movement_Teleport(loc_t origin, heading_t angles)
- {
- m_wNumPortals++;
- m_Origin = origin;
- m_Angles = angles;
- if (IsPlayer())
- ((CBasePlayer *)this)->EnterPortal();
- Movement_UpdatePos();
- }
- void CPhysicsObj::Movement_SendUpdate(DWORD dwCell)
- {
- //According to my reading of the ASM
- //The flags (which are only processed as 1 BYTE) work as follows:
- //0x08 0x10 0x20 and 0x40 are X Y Z W for angles, respectively
- //if flagged it means to default to zero, otherwise the message contains the value
- //0x01
- //reads in 3 floats for unknown purpose, these come if you jump.. i know that much
- //0x02
- //reads in float for unknown purpose
- //0x04
- //sets some sort of boolean relating to the update
- //----
- BinaryWriter* poo = MoveUpdate(this);
- g_pWorld->BroadcastPVS(dwCell, poo->GetData(), poo->GetSize());
- delete poo;
- }
- void CPhysicsObj::Movement_UpdatePos()
- {
- if (HasOwner())
- return;
- //QUICKFIX: Broadcast to the old landblock that we've moved from.
- //This sends duplicates if the block is near the other.
- m_wNumMovements++;
- DWORD dwNewCell = GetLandcell();
- DWORD dwOldCell = m_lastMoveOrigin.landcell;
- if (BLOCK_WORD(dwOldCell) != BLOCK_WORD(dwNewCell))
- {
- Movement_SendUpdate(dwOldCell);
- }
- Movement_SendUpdate(dwNewCell);
- m_lastMoveOrigin = m_Origin;
- m_lastMoveAngles = m_Angles;
- }
|