protected override void SetData(byte[] data) { if (null != data) { RSubTerrSL.Import(data); } }
void Load() { string prefabName = "Layered Random SubTerrain Group"; GameObject objGrass = Object.Instantiate(Resources.Load <GameObject>(prefabName)) as GameObject; if (null == objGrass) { Debug.LogError("can't find tree prefab:" + prefabName); return; } RSubTerrainMgr.Instance.CameraTransform = Camera.main.transform; RSubTerrainMgr.Instance.VEditor = VoxelEditor.Get(); RSubTerrSL.Init(); }
protected void RPC_SKFellTree(uLink.BitStream stream, uLink.NetworkMessageInfo info) { /*int typeIndex = */ stream.Read <int> (); Vector3 pos = stream.Read <Vector3> (); /*float maxHP = */ stream.Read <float> (); float hp = stream.Read <float> (); TreeInfo tree = null; // = RSubTerrainMgr.TreesAtPosF(pos); if (null != LSubTerrainMgr.Instance) { int x = Mathf.FloorToInt(pos.x); int y = Mathf.FloorToInt(pos.y); int z = Mathf.FloorToInt(pos.z); List <GlobalTreeInfo> tree_list = LSubTerrainMgr.Picking(new IntVector3(x, y, z), true); if (tree_list.Count > 0) { foreach (var iter in tree_list) { if (hp <= 0) { PeEntity entity = EntityMgr.Instance.Get(Id); SkEntity skEntity = null == entity ? null : entity.skEntity; SkEntitySubTerrain.Instance.OnTreeCutDown(skEntity, iter); DigTerrainManager.RemoveTree(iter); if (IsOwner) { SkEntitySubTerrain.Instance.SetTreeHp(iter.WorldPos, hp); } } else { if (IsOwner) { SkEntitySubTerrain.Instance.SetTreeHp(iter.WorldPos, hp); } } } } } else if (null != RSubTerrainMgr.Instance) { RSubTerrSL.AddDeletedTree(pos); tree = RSubTerrainMgr.TreesAtPosF(pos); if (null != tree) { GlobalTreeInfo gTree = new GlobalTreeInfo(-1, tree); if (hp <= 0) { PeEntity entity = EntityMgr.Instance.Get(Id); SkEntity skEntity = null == entity ? null : entity.skEntity; SkEntitySubTerrain.Instance.OnTreeCutDown(skEntity, gTree); DigTerrainManager.RemoveTree(gTree); if (IsOwner) { SkEntitySubTerrain.Instance.SetTreeHp(gTree.WorldPos, hp); } } else { if (IsOwner) { SkEntitySubTerrain.Instance.SetTreeHp(gTree.WorldPos, hp); } } } } }
protected override void WriteData(BinaryWriter bw) { RSubTerrSL.Export(bw); }
public static void DeleteTree(TreeInfo treeinfo) { if (s_Instance == null) { return; } if (treeinfo == null) { return; } // For two feet trees TreeInfo SecondFoot = null; // Delete it in Mgr's m_map32Trees int idx32 = RSubTerrUtils.Tree32PosTo32Index(Mathf.FloorToInt(treeinfo.m_pos.x / 32), Mathf.FloorToInt(treeinfo.m_pos.z / 32)); if (s_Instance.m_map32Trees.ContainsKey(idx32)) { s_Instance.m_map32Trees[idx32].Remove(treeinfo); if (s_Instance.m_map32Trees[idx32].Count == 0) { s_Instance.m_map32Trees.Remove(idx32); } } // Delete it in Mgr's m_mapExistTempTrees and m_mapTempTreeInfos if (s_Instance.m_mapExistTempTrees.ContainsKey(idx32)) { GameObject gameobject_to_delete = null; foreach (GameObject go in s_Instance.m_mapExistTempTrees[idx32]) { if (s_Instance.m_mapTempTreeInfos.ContainsKey(go)) { if (s_Instance.m_mapTempTreeInfos[go] == treeinfo) { // Found it! gameobject_to_delete = go; GameObject.Destroy(go); s_Instance.m_mapTempTreeInfos.Remove(go); } } else { Debug.LogError("Can not find the GameObject key in m_mapTempTreeInfos when delete tree"); } } if (gameobject_to_delete != null) { s_Instance.m_mapExistTempTrees[idx32].Remove(gameobject_to_delete); } } // Delete it in Node's m_mapTrees and m_listTrees int X = Mathf.FloorToInt(treeinfo.m_pos.x / RSubTerrConstant.ChunkSizeF); int Z = Mathf.FloorToInt(treeinfo.m_pos.z / RSubTerrConstant.ChunkSizeF); int del_count = 0; for (int x = X - 1; x <= X + 1; ++x) { for (int z = Z - 1; z <= Z + 1; ++z) { int idx = RSubTerrUtils.ChunkPosToIndex(x, z); int treeidx = RSubTerrUtils.TreeWorldPosToChunkIndex(treeinfo.m_pos, idx); if (s_Instance.m_Chunks.ContainsKey(idx)) { RSubTerrainChunk chunk = s_Instance.m_Chunks[idx]; if (chunk.TreeList.Remove(treeinfo)) { del_count++; } if (TreeInfo.RemoveTiFromDict(chunk.m_mapTrees, treeidx, treeinfo)) { del_count++; } } } } if (del_count != 2) { Debug.LogError("RSubTerrain Remove: count doesn't match"); } // Delete it in layers foreach (RSubTerrCreator creator in s_Instance.LayerCreators) { creator.m_allTreesInLayer.Remove(treeinfo); } RSubTerrSL.AddDeletedTree(treeinfo); // Delete 2nd foot if (SecondFoot != null) { DeleteTree(SecondFoot); } }