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; } } }
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); } } } } }
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); } }
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 }); } } } }
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); }
/// <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); } }
public static Landblock get_landblock(uint blockCellID, uint instance) { var iBlockCell = BlockCell.GetLongCell(blockCellID, instance); return(get_landblock(iBlockCell)); }
public static ObjCell get_landcell(uint blockCellID, uint instance) { var iBlockCell = BlockCell.GetLongCell(blockCellID, instance); return(get_landcell(iBlockCell)); }