/* ==================================================================== * ÆÄ ÀÏ : * ¸ñ Àû : * ÀÛ ¼º ÀÚ : Á¤¼º´ë * ÀÛ ¼º ÀÏ : 2006.08.29 * * Ãß°¡³»¿ë : * Ãß°¡³¯Â¥ ÀÛ¾÷ÀÚ Ãß°¡³»¿ë * 2006.08.29 Á¤¼º´ë »ý¼º * * ÁÖÀÇ»çÇ× : * =================================================================== */ #pragma once #include "BaseObject_Common.h" enum eGRID_MATRIX_TYPE { _E_GMT_NONE_ = 0, // »ç¿ë¾ÈÇÔ _E_GMT_3X3_, // 3x3 Çà·Ä _E_GMT_5X5_, // 5x5 Çà·Ä _E_GMT_7X7_, // 7x7 Çà·Ä }; #define DEF_GRID_POS 0 // default grid pos // 16 x 16 Grid = ½Ã¾ß ³ÐÀÌ #define MAP_SIZE 1024 // 1024 = 32 * 32 #define MAP_SIZE_SHIFT 10 // 1024 = 1 << 10 #define TRACK_SIZE (+32) // TRACK_SIZE = MAP_SIZE / 16 #define TRACK_SIZE_SHIFT 5 // 32 = 1 << 5 #define TRACK_POS_SHIFT 4 // 1/16 = 1 >> 4 // 32 x 32 Grid = ½Ã¾ß ³ÐÀÌ //#define MAP_SIZE 256 // 256 = 16 * 16 //#define MAP_SIZE_SHIFT 8 // 512 = 1 << 9 // //#define TRACK_SIZE (+16) // TRACK_SIZE = MAP_SIZE / 32 //#define TRACK_SIZE_SHIFT 4 // 16 = 1 << 4 //#define TRACK_YPOS_SHIFT 5 // 1/32 = 1 >> 5 #define DELAY_CHANGE_GRID 100 // 1000 / DELAY_CHANGE_GRID #define INDUN_MAP_MAX 4096 /// Àδø ¸Ê(¹æ) ÃÖ´ë ¼³Á¤¼ö class cGridManager; class cBaseObject; // defined baseobject.h file class cPlayer; // " player.h " class cMonster; // " monster.h " class cNpc; // " npc.h " class cItem; // " item.h " class cTotem; // " totem.h " class cGathering; // " gathering.h " class cUserPortal; // " UserPortal.h " class cBaseSkillObject; struct GridMinMax { int minTrack; int maxTrack; }; struct GridMatrix { int status; int pos; }; struct PerGrid { long objectId; // sObject::Index cBaseObject* baseObject; // cBaseObject Class int lastPos; // Last Position int currentPos; // Current Position DWORD lastTickCount; // Last Tick Count GridMatrix* matrix; struct PerGrid* next; struct PerGrid* prev; struct PerGrid* parent; struct PerGrid* left; struct PerGrid* right; }; class GridPool { friend class cGridManager; private: PerGrid** mPagedPoolUsage; // ÆäÀÌÁö µÈ Ç®. PerGrid* mNonPagedPoolUsage; // ÆäÀÌÁö ¾ÈµÈ Ç®. PerGrid* mBstRoot; // BST ·çÆ®. int mMinGrid; int mMaxGrid; int mMatrixSize; GridMinMax mMinMax; // ±×¸®µå ÃÖ¼Ò & ÃÖ´ë »ç¿ë¿µ¿ª. int mSkipMax; int* mSkipMap; SIZE_T mQuotaPagedPoolUsage; // ÇöÀç ÆäÀÌÁö µÈ Ç® - »ç¿ë·®. SIZE_T mQuotaNonPagedPoolUsage; // ÇöÀç ÆäÀÌÁö ¾ÈµÈ Ç® - »ç¿ë·®. SIZE_T mWorkingSetSize; // ÇöÀç ÀÛ¾÷ ¼³Á¤Å©±â. int CalcPos ( float fx, float fy, unsigned int map ); int CalcPos ( unsigned int map ); PerGrid* AllocGrid ( ); void FreeGrid ( PerGrid** perGrid ); int CompareObjectId ( PerGrid* perGrid1, PerGrid* perGrid2); int CompareObjectId ( long objectId1, long objectId2 ); void AttachPool ( PerGrid** pool, PerGrid* perGrid ); void DetachPool ( PerGrid** pool, PerGrid* perGrid ); bool AttachBst ( PerGrid* perGrid ); bool DetachBst ( PerGrid* perGrid ); PerGrid* GetPool ( long objectId, int pos ); void ReleasePool ( PerGrid* perGrid, int pos, bool isDelete=false ); public: GridPool(int minGrid, int maxGrid, int matrixSize); void Shutdown ( ); PerGrid* SearchObjectId ( long objectId ); PerGrid* GetGrid ( cBaseObject* baseObject ); void ReleaseGrid ( PerGrid* perGrid, bool isDelete=false ); bool ChangeGrid ( PerGrid* perGrid, DWORD tickCount ); public: virtual ~GridPool(void); }; inline int GridPool::CalcPos(float fx, float fy, unsigned int map) { int ix = (int)(fx * 0.01f) >> TRACK_POS_SHIFT; int iy = (int)(fy * 0.01f) >> TRACK_POS_SHIFT; return (unsigned int)((iy<