예제 #1
0
        public LevelCell(BlockCell block)
        {
            WorldPosition = block.Position;
            Explored      = false;
            Walkable      = block.Walkable;
            for (int i = 0; i < block.WallTypes.Length; i++)
            {
                switch (block.WallTypes[i])
                {
                case BlockCell.WallType.Blocked:
                    _borders[i] = BlockBorder.Impassable;
                    break;

                case BlockCell.WallType.Doorway:
                case BlockCell.WallType.LockedDoorway:
                    _borders[i] = BlockBorder.Doorway;
                    break;

                case BlockCell.WallType.Wall:
                    _borders[i] = BlockBorder.InsideWall;
                    break;

                case BlockCell.WallType.None:
                    _borders[i] = BlockBorder.None;
                    break;
                }
            }
        }
예제 #2
0
    private void InitBlockCells(SceneConfigData configData, byte[] data)
    {
        //Block文件的文件头,跳过指定字节数(char[5]+float = 9)//
        //struct SMapFileDataInfo
        //{
        //    char	fileHeader[5];
        //    float	Virsion;
        //    int		dwMapHeight;   //高度格子数量
        //    int		dwMapWidth;	   //宽度格子数量

        //    SMapFileDataInfo()
        //    {
        //        //TileBlock = NULL;
        //        Virsion = 0;
        //        dwMapHeight = 0;
        //        dwMapWidth = 0;
        //        memset(fileHeader, 0, sizeof(fileHeader));
        //    }
        //};
        int offset = 9, dwMapHeight, dwMapWidth;

        offset += PackageHelper.ReadData(data.Skip(offset).ToArray(), out dwMapWidth);
        offset += PackageHelper.ReadData(data.Skip(offset).ToArray(), out dwMapHeight);
        //计算地图上的宫格数
        //TraceUtil.Log(dwMapHeight + "  " + dwMapWidth);
        m_heightBound = dwMapHeight;
        m_widthBound  = dwMapWidth;
        m_blockCells  = new BlockCell[m_heightBound, m_widthBound];
        int blockIndex = 0;

        for (int v = 0; v < dwMapHeight; v++)
        {
            for (int h = 0; h < dwMapWidth; h++)
            {
                m_blockCells[v, h] = new BlockCell()
                {
                    Index = blockIndex++, VIndex = v, HIndex = h, BlockValue = data[offset]
                };
                //if (m_blockCells[v, h].IsBlock)
                //{
                //    Debug.Log(blockIndex + "   " + v + "  " + h);
                //GameObject.Instantiate(Block, new Vector3(h * TILEPOSX_WIDTH / 2, 1, v * TILEPOSY_HEIGHT / 2), Quaternion.identity);
                //}
                //this.m_blockCells.Add(new BlockCell() { VIndex = v, HIndex = h, BlockValue = data[offset] });
                offset++;
                if (GameManager.Instance.m_showBlock)
                {
                    if (m_blockCells[v, h].IsBlock)
                    {
                        Vector3 pos = new Vector3((float)(h + 0.5f) * TILEPOSX_WIDTH, 1, -(float)(v + 0.5f) * TILEPOSY_HEIGHT);
                        GameManager.Instance.AddBlockCell(pos);
                    }
                }
            }
        }
    }
예제 #3
0
        public void ClearInstance(ulong iBlockCell)
        {
            var landblock = BlockCell.GetLandblock(iBlockCell);
            var instance  = BlockCell.GetInstance(iBlockCell);

            var deleteObjs = PhysicsObj.ObjMaint.GetKnownObjectsValuesWhere(i => (i.CurCell?.ID | 0xFFFF) == landblock && i.CurCell.CurLandblock.Instance == instance);

            foreach (var deleteObj in deleteObjs)
            {
                //Console.WriteLine($"Clearing {deleteObj.Name} ({deleteObj.ID:X8})");
                RemoveTrackedObject(deleteObj.WeenieObj.WorldObject, false);
                PhysicsObj.ObjMaint.RemoveObject(deleteObj);
            }
        }
예제 #4
0
    private void InitDynamicBlockCells(byte[] data)
    {
        int  offset = 9, blockNum;
        byte dblockGroupNum, groudId;

        m_dynamicBlockCell.Clear();
        offset         += PackageHelper.ReadData(data, out dblockGroupNum, offset); //动态阻挡组数
        CacheInitBlocks = new List <SMsgEctypeUpDateBlock> ();
        for (int i = 0; i < dblockGroupNum; i++)
        {
            offset += PackageHelper.ReadData(data, out groudId, offset);  //动态阻挡组Id
            offset += PackageHelper.ReadData(data, out blockNum, offset); //动态阻挡组包含的动态阻挡点数量

            var dynamicData = GetMapDynamicBlockData(groudId);

            m_dynamicBlockCell.Add(groudId, new BlockCell[blockNum]);

            int  nIndex;
            byte byBlock;
            for (int j = 0; j < blockNum; j++)
            {
                offset += PackageHelper.ReadData(data, out nIndex, offset);  //动态阻挡点序号
                offset += PackageHelper.ReadData(data, out byBlock, offset); //动态阻挡点属性
                m_dynamicBlockCell[groudId][j] = new BlockCell()
                {
                    Index = nIndex, BlockValue = (byte)(dynamicData.BlockState == 0?2:1)
                };                                                                                                                       //初始化所有动态阻挡都为开放状态

                //print dynamic block
                if (GameManager.Instance.ShowDynamicBlock)
                {
                    int     h   = nIndex % m_widthBound;
                    int     v   = Mathf.CeilToInt(nIndex / m_widthBound);
                    Vector3 pos = new Vector3((float)(h + 0.5f) * TILEPOSX_WIDTH, 1, -(float)(v + 0.5f) * TILEPOSY_HEIGHT);
                    GameManager.Instance.AddBlockCell(pos);
                }
            }

            if (dynamicData.BlockState != 0)
            {
                if (!CacheInitBlocks.Exists(P => P.dwblockGroupID == groudId))
                {
                    CacheInitBlocks.Add(new SMsgEctypeUpDateBlock()
                    {
                        dwareaId = dynamicData.AreaID, dwblockGroupID = groudId, byBlockState = 1
                    });
                }
            }
        }
    }
예제 #5
0
    public List <BlockCell> GetBlockTable()
    {
        DataRowCollection collect = ExcelAccess.GetCollection("Block.xls");
        List <BlockCell>  list    = new List <BlockCell>();

        for (int i = 1; i < collect.Count; i++)
        {
            if (collect[i][1].ToString() == "")
            {
                continue;
            }

            BlockCell cell = new BlockCell();
            cell._id          = int.Parse(collect[i][0].ToString());
            cell._name        = collect[i][1].ToString();
            cell._description = collect[i][2].ToString();
            cell._gold        = int.Parse(collect[i][3].ToString());
            list.Add(cell);
        }
        return(list);
    }
예제 #6
0
        /// <summary>
        /// Loads the backing store landblock structure<para />
        /// This function is thread safe
        /// </summary>
        /// <param name="iBlockCellID">Any instance + landblock + cell ID within the landblock</param>
        public static Landblock get_landblock(ulong iBlockCellID)
        {
            /*if ((iBlockCellID | 0xFFFF) == 0x1D9FFFF)
             * {
             *  Console.WriteLine(System.Environment.StackTrace);
             *  var debug = true;
             * }*/

            if (PhysicsEngine.Instance.Server)
            {
                var lbmLandblock = LandblockManager.GetLandblock(iBlockCellID, false, false);

                return(lbmLandblock.PhysicsLandblock);
            }

            // client implementation

            /*if (Landblocks == null || Landblocks.Count == 0)
             *  return null;
             *
             * if (!LandDefs.inbound_valid_cellid(cellID) || cellID >= 0x100)
             *  return null;
             *
             * var local_lcoord = LandDefs.blockid_to_lcoord(LoadedCellID);
             * var global_lcoord = LandDefs.gid_to_lcoord(cellID);
             *
             * var xDiff = ((int)global_lcoord.Value.X + 8 * MidRadius - (int)local_lcoord.Value.X) / 8;
             * var yDiff = ((int)global_lcoord.Value.Y + 8 * MidRadius - (int)local_lcoord.Value.Y) / 8;
             *
             * if (xDiff < 0 || yDiff < 0 || xDiff < MidWidth || yDiff < MidWidth)
             *  return null;
             *
             * return Landblocks[yDiff + xDiff * MidWidth];*/

            var iLandblockID = iBlockCellID | 0xFFFF;

            // check if landblock is already cached
            if (Landblocks.TryGetValue(iLandblockID, out var landblock))
            {
                return(landblock);
            }

            lock (landblockMutex)
            {
                // check if landblock is already cached, this time under the lock.
                if (Landblocks.TryGetValue(iLandblockID, out landblock))
                {
                    return(landblock);
                }

                // if not, load into cache
                var instance = BlockCell.GetInstance(iLandblockID);

                landblock = new Landblock(DBObj.GetCellLandblock((uint)iLandblockID), instance);
                if (Landblocks.TryAdd(iLandblockID, landblock))
                {
                    landblock.PostInit();
                }
                else
                {
                    Landblocks.TryGetValue(iLandblockID, out landblock);
                }

                return(landblock);
            }
        }
예제 #7
0
        public static Landblock get_landblock(uint blockCellID, uint instance)
        {
            var iBlockCell = BlockCell.GetLongCell(blockCellID, instance);

            return(get_landblock(iBlockCell));
        }
예제 #8
0
        public static ObjCell get_landcell(uint blockCellID, uint instance)
        {
            var iBlockCell = BlockCell.GetLongCell(blockCellID, instance);

            return(get_landcell(iBlockCell));
        }