_Object.h
上传用户:jxpjxmjjw
上传日期:2009-12-07
资源大小:5877k
文件大小:7k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // Copyright (C) 2004 Team Python
  2. //  
  3. // This program is free software; you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation; either version 2 of the License, or
  6. // (at your option) any later version.
  7. // 
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. // GNU General Public License for more details.
  12. // 
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program; if not, write to the Free Software 
  15. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. #ifndef WOWPYTHONSERVER_OBJECT_H
  17. #define WOWPYTHONSERVER_OBJECT_H
  18. #include "Common.h"
  19. #include "UpdateMask.h"
  20. #include "GameClient.h"
  21. enum TYPE {
  22.     TYPE_OBJECT = 1,
  23.     TYPE_ITEM = 2,
  24.     TYPE_CONTAINER = 4,
  25.     TYPE_UNIT = 8,
  26.     TYPE_PLAYER = 16,
  27.     TYPE_GAMEOBJECT = 32,
  28.     TYPE_DYNAMICOBJECT = 64,
  29.     TYPE_CORPSE = 128,
  30.     TYPE_AIGROUP = 256,
  31.     TYPE_AREATRIGGER = 512,
  32. };
  33. struct UpdateMask;
  34. struct wowWData;
  35. class GameClient;
  36. //====================================================================
  37. //  Object
  38. //  Base object for every item, unit, player, corpse, container, etc
  39. //
  40. //====================================================================
  41. class Object
  42. {
  43.     friend class WorldServer;
  44. public:
  45.     Object ( );
  46.     virtual ~Object ( );
  47.     virtual void Update ( float time ) { }
  48.     virtual void Create (uint32 guidlow);
  49.     virtual void Create (uint32 guidlow, float x, float y, float z, float ang);
  50.     inline uint32 & getGUID() { return m_guid[0]; };
  51.     inline uint32 & getGUIDHigh() { return m_guid[1]; };
  52.     inline uint8 getObjectTypeId() { return m_objectTypeId; };
  53.     // These functions send a specific type of A9 packet based on current state
  54.     void UpdateObject( GameClient *pSelf = NULL );
  55.     void CreateObject( uint32 flags, GameClient *pSelf = NULL );
  56.     
  57.     // These functions build a specific type of A9 packet
  58.     virtual void UpdateObject(UpdateMask* updateMask, wowWData * p_data);
  59.     virtual void UpdateMovement(uint32 flags, wowWData * p_data);
  60.     virtual void CreateObject(UpdateMask* updateMask, wowWData * p_data, uint32 flags);
  61.     // These functions construct a specific block of a specific A9 packet
  62.     virtual void BuildMoveUpdate( uint32 flags, uint32 flags2, uint8 * data, int* length );
  63.     virtual void BuildUpdateBlock(UpdateMask *updateMask, uint8 * data, int* length);
  64.     // fill UpdateValues with data from a space seperated string of uint32s
  65.     virtual void LoadUpdateValues(uint8* data);
  66.     void BuildHeartBeat(wowWData *data);
  67.     void TeleportAck(wowWData *data, float x, float y, float z);
  68.     bool setPosition( uint8 *data, bool allowPorting = false );
  69.     bool setPosition( float newX, float newY, float newZ, float newOrientation, bool allowPorting = false );
  70.     float getPositionX( ) const;
  71.     float getPositionY( ) const;
  72.     float getPositionZ( ) const;
  73.     float getOrientation( ) const;
  74.     void getPosition( uint8 *data ) const;
  75.     inline void setMapId(uint16 newMap) { m_mapId = newMap; }
  76.     inline void setZone(uint16 newZone) { m_zoneId = newZone; }
  77.     inline const uint16 & getMapId( ) const { return m_mapId; }
  78.     inline const uint16 & getZone( ) const { return m_zoneId; }
  79.     inline bool setUpdateMaskBit( const uint16 &index ) {
  80.         if( !getUpdateMaskBit( index ) ) {
  81.             m_updateMask[ index >> 3 ] |= 1 << ( index & 0x7 );
  82.             m_updateMaskSum ++;
  83.             if( (index >> 5)+1 > m_updateMaskBlockCount )
  84.                 m_updateMaskBlockCount = (index >> 5)+1;
  85.             return true;
  86.         }
  87.         return false;
  88.     }
  89.     inline bool unsetUpdateMaskBit( const uint16 &index ) {
  90.         if( getUpdateMaskBit( index ) ) {
  91.             m_updateMaskSum --;
  92.             m_updateMask[ index >> 3 ] ^= 1 << ( index & 0x7 );
  93.             return true;
  94.         }
  95.         return false;
  96.     }
  97.     inline void clearUpdateMask(){
  98.         m_updateMaskBlockCount = 0;
  99.         m_updateMaskSum = 0;
  100.         memset( m_updateMaskBlocks, 0, sizeof( m_updateMaskBlocks ) );
  101.     }
  102.     inline void setUpdateValue( const uint16 &index, const uint32 &value ) {
  103.         m_updateValues[ index ] = value;
  104.         setUpdateMaskBit( index );
  105.     }
  106.     inline void setUpdateValue( const uint16 &index, const uint32 &value, void * updatemask ) {
  107.         m_updateValues[ index ] = value;
  108.         setUpdate( index, updatemask );
  109.     }
  110.     inline void setUpdateFloatValue( const uint16 &index, const float &value ) {
  111.         m_updateFloats[ index ] = value;
  112.         setUpdateMaskBit( index );
  113.     }
  114.     inline void setUpdateFloatValue( const uint16 &index, const float &value, void * updatemask ) {
  115.         m_updateFloats[ index ] = value;
  116.         setUpdate( index, updatemask );
  117.     }
  118.     inline void setUpdate( const uint16 &index, void * updatemask ) {
  119.         ( (uint8 *)updatemask )[ index >> 3 ] |= 1 << ( index & 0x7 );
  120.     }
  121.     inline const bool getUpdateMaskBit( const uint16 &index ) const {
  122.         return (m_updateMask[ index >> 3 ] & ( 1 << ( index & 0x7 ) ))!=0;
  123.     }
  124.     inline const uint32 getUpdateValue( const uint16 &index ) const { return m_updateValues[ index ]; }
  125.     inline const float getUpdateFloatValue( const uint16 &index ) const { return m_updateFloats[ index ]; }
  126.     inline float getDistanceSq(Object* pObj) {
  127.         float x  = pObj->getPositionX() - getPositionX();
  128.         float y  = pObj->getPositionY() - getPositionY();
  129.         float z  = pObj->getPositionZ() - getPositionZ();
  130.         return ((x*x) + (y*y) + (z*z));
  131.     };
  132.     // In Range Object management
  133.     void UpdateInRangeSet();    // checks if objects in the set are no longer in range
  134.     inline bool IsInRangeSet(Object* pObj) { return !(m_objectsInRange.find(pObj) == m_objectsInRange.end()); }
  135.     inline void AddInRangeObject(Object* pObj) { m_objectsInRange.insert(pObj); }
  136.     inline void RemoveInRangeObject(Object* pObj) { m_objectsInRange.erase(pObj); }
  137.     inline void ClearInRangeSet() { m_objectsInRange.clear(); }
  138.     void SendMessageToSet(wowWData *data, bool pToSelf);
  139. protected:
  140. // <WoW Chile Dev Team> Start Change
  141. // Respawn Coordenates,Yum...
  142. float respawn_cord[3][3];
  143. // <WoW Chile Dev Team> Finish Change
  144.     // pretty much just guessing what would be common in all objects
  145.     uint16 m_objectType; // Types.  Bitmasked together by subclasses
  146.     uint8 m_objectTypeId; // 4 = player
  147.     //uint32 m_guid[2]; // supposed to be uint64
  148.     uint32 * m_guid; // now references m_updateValues;
  149.     uint16 m_zoneId;
  150.     uint16 m_mapId;
  151.     float m_positionX;
  152.     float m_positionY;
  153.     float m_positionZ;
  154.     float m_orientation;
  155.     float m_lastUpdateTime;
  156. //    float m_maxHorizontalSpeed;
  157.     float m_minZ;
  158.     union {
  159.         uint32 m_updateValues[ UPDATE_BLOCKS ];
  160.         float m_updateFloats[ UPDATE_BLOCKS ];
  161.     };
  162.     union {
  163.         uint32 m_updateMaskBlocks[ 0x1b ];
  164.         uint8 m_updateMask[ 0x1b * 4 ];
  165.     };
  166.     uint8 m_updateMaskBlockCount;
  167.     uint16 m_updateMaskSum;
  168.     // Set of Objects receiving updates from this object
  169.     std::set<Object*> m_objectsInRange;
  170. };
  171. #endif