void OnTerrainMeshCreated(IntVector4 node) { if (CSMain.s_MgCreator.Assembly == null) { return; } if (!VFVoxelTerrain.TerrainColliderComplete) { return; } if (node.w == 0 && automaticData != null) { float dx = CSMain.s_MgCreator.Assembly.Position.x - node.x; float dy = CSMain.s_MgCreator.Assembly.Position.y - node.y; float dz = CSMain.s_MgCreator.Assembly.Position.z - node.z; float side = VoxelTerrainConstants._numVoxelsPerAxis << node.w; if (dx >= PETools.PEMath.Epsilon && dx <= side && dy >= PETools.PEMath.Epsilon && dy <= side && dz >= PETools.PEMath.Epsilon && dz <= side) { //To do : destroy block foreach (KeyValuePair <int, CSCommon> kp in CSMain.s_MgCreator.GetCommonEntities()) { if (Random.value < 0.5f) { DigTerrainManager.DestroyTerrainInRange(1, kp.Value.Position, 255.0f, 10.0f); } } } } }
void CacheDelGrass() { if (delGrassPos.Count != 0) { DigTerrainManager.CacheDeleteGrass(delGrassPos); } }
void CacheDelTree() { if (delTreePos.Count != 0) { DigTerrainManager.CacheDeleteTree(delTreePos); } }
public static void RPC_S2C_TerrainDestroyInRange(uLink.BitStream stream, uLink.NetworkMessageInfo info) { Vector3 pos = stream.Read <Vector3>(); float power = stream.Read <float>(); float radius = stream.Read <float>(); DigTerrainManager.TerrainDestroyInRangeNetReturn(pos, power, radius); }
public static void RPC_SKChangeTerrain(uLink.BitStream stream, uLink.NetworkMessageInfo info) { IntVector3 intPos = stream.Read <IntVector3>(); float radius = stream.Read <float>(); byte targetType = stream.Read <byte>(); byte[] data = stream.Read <byte[]>(); DigTerrainManager.ChangeTerrainNetReturn(intPos, radius, targetType, data); }
public static void RPC_SKDigTerrain(uLink.BitStream stream, uLink.NetworkMessageInfo info) { IntVector3 pos = stream.Read <IntVector3>(); float durDec = stream.Read <float>(); float radius = stream.Read <float>(); float height = stream.Read <float>(); bool bReturnItem = stream.Read <bool>(); DigTerrainManager.DigTerrainNetReturn(pos, durDec, radius, height, bReturnItem); }
private void ProcDigB45s(SkEntity caster) { SkInst inst = SkRuntimeInfo.Current as SkInst; IDigTerrain digTerrain = caster as IDigTerrain; IntVector4 digPos = null; if (null == digTerrain || (digPos = digTerrain.digPosType) == IntVector4.Zero || (inst != null && !(inst._target is Block45Man))) { return; } float damage = caster.GetAttribute((int)AttribType.Atk); float radius = caster.GetAttribute((int)AttribType.ResRange); float height = caster.GetAttribute((int)AttribType.ResRange); // float resourceBonus = caster.GetAttribute((int)AttribType.ResBouns); // bool returnResource = digPos.w == 1; PeEntity entity = caster != null?caster.GetComponent <PeEntity>() : null; if (entity != null && entity.monster != null) { radius = entity.bounds.extents.x + 1; height = entity.bounds.extents.y + 1; } if (null != inst && null != inst._colInfo) { int effecID = 0; if (radius < 3) { effecID = 258; } else if (radius < 5f) { effecID = 259; } else { effecID = 260; } Pathea.Effect.EffectBuilder.Instance.Register(effecID, null, inst._colInfo.hitPos, Quaternion.identity); } if (!GameConfig.IsMultiMode) { List <B45Block> removeList = new List <B45Block>(); DigTerrainManager.DigBlock45(digPos.ToIntVector3(), damage * 0.2f, radius, height, ref removeList, false); } else { /// TODO : code for multiplayer } }
void PeLauncher.ILaunchable.Launch() { AIErodeMap.ResetErodeData(); PeGameSummary.Mgr.Instance.Init(); DigTerrainManager.ClearBlockInfo(); //lz-2016.09.01 重置技能树可使用状态 if (!Pathea.PeGameMgr.IsAdventure) { RandomMapConfig.useSkillTree = false; RandomMapConfig.openAllScripts = false; } }
void RemoveTrees() { Vector3 dir = m_LinkPos1 - m_LinkPos2; Vector3 normalDir = dir.normalized; RaycastHit[] hitTreeCols = Physics.RaycastAll(m_LinkPos2, normalDir, dir.magnitude, 1 << Pathea.Layer.NearTreePhysics, QueryTriggerInteraction.Ignore); for (int i = 0; i < hitTreeCols.Length; ++i) { GlobalTreeInfo gTreeinfo = PETools.PEUtil.GetTreeinfo(hitTreeCols[i].collider); if (null != gTreeinfo) { DigTerrainManager.RemoveTree(gTreeinfo); } } }
void OnDestroy() { if (_airborne != null) { MonsterAirborne.DestroyAirborne(_airborne, false); } #if DestroyLeftMonster if (!isSweep) { for (int i = 0; i < _agents.Count; i++) { MonEscape(_agents [i] as SceneEntityPosAgent, transform.position); } } #endif SceneMan.RemoveSceneObjs(_agents); _agents.Clear(); if (UITowerInfo.Instance != null && _uiData != null) { UITowerInfo.Instance.Hide(); } s_Beacons.Remove(this); if (!PeGameMgr.IsMulti && null != m_Mark) { PeMap.LabelMgr.Instance.Remove(m_Mark); m_Mark = null; } if (null != CSMain.Instance) { List <CSAssembly> assemblyList = CSMain.Instance.GetAllAssemblies(); if (0 < assemblyList.Count) { for (int i = 0; i < assemblyList.Count; ++i) { CSAssembly assembly = assemblyList[i]; if (null != assembly && assembly.InRange(_position)) { DigTerrainManager.ClearColonyBlockInfo(assembly); } } } } }
private void ProcChangeTypes(SkEntity caster) { IDigTerrain digTerrain = caster as IDigTerrain; IntVector4 digPos = null; if (null == digTerrain || (digPos = digTerrain.digPosType) == IntVector4.Zero) { return; } float radius = 2; byte targetType = (byte)Mathf.RoundToInt(_attribs.sums[0]); IntVector3 intPos = digPos.XYZ; if (caster is Pathea.Projectile.SkProjectile) { SkEntity trueCaster = ((Pathea.Projectile.SkProjectile)caster).GetSkEntityCaster(); DigTerrainManager.ChangeTerrain(intPos, radius, targetType, trueCaster); } else { DigTerrainManager.ChangeTerrain(intPos, radius, targetType, caster); } }
private void ProcDigVoxels(SkEntity caster) { SkInst inst = SkRuntimeInfo.Current as SkInst; IDigTerrain digTerrain = caster as IDigTerrain; IntVector4 digPos = null; if (null == digTerrain || (digPos = digTerrain.digPosType) == IntVector4.Zero || (inst != null && !(inst._target is VFVoxelTerrain))) { return; } float damage = caster.GetAttribute((int)AttribType.Atk) * (1f + caster.GetAttribute((int)AttribType.ResDamage)); float radius = caster.GetAttribute((int)AttribType.ResRange); float resourceBonus = caster.GetAttribute((int)AttribType.ResBouns); float height = caster.GetAttribute((int)AttribType.ResDamage); bool returnResource = digPos.w == 1; IntVector3 intPos = digPos.XYZ; if (!GameConfig.IsMultiMode) { //VFVoxel getVoxel = VFVoxelTerrain.self.Voxels.SafeRead(intPos.x, intPos.y, intPos.z); List <VFVoxel> removeList = new List <VFVoxel>(); DigTerrainManager.DigTerrain(intPos, damage * (returnResource ? 5f : 1f), radius, height, ref removeList, returnResource); if (returnResource) { bool bGetSpItems = false; if (caster is SkAliveEntity) { SkAliveEntity alive = (SkAliveEntity)caster; SkillTreeUnitMgr mgr = alive.Entity.GetCmpt <SkillTreeUnitMgr>(); bGetSpItems = mgr.CheckMinerGetRare(); } Dictionary <int, int> itemGet = DigTerrainManager.GetResouce(removeList, resourceBonus, bGetSpItems); if (itemGet.Count > 0) { List <int> itemsArray = new List <int>(itemGet.Count * 2); foreach (int intemID in itemGet.Keys) { itemsArray.Add(intemID); itemsArray.Add(itemGet[intemID]); } caster.Pack += itemsArray.ToArray(); } } } else { if (caster != null && caster._net != null) { //VFVoxel getVoxel = VFVoxelTerrain.self.Voxels.SafeRead(intPos.x,intPos.y, intPos.z); bool bGetSpItems = false; if (returnResource) { if (caster is SkAliveEntity) { SkAliveEntity alive = (SkAliveEntity)caster; SkillTreeUnitMgr mgr = alive.Entity.GetCmpt <SkillTreeUnitMgr>(); bGetSpItems = mgr.CheckMinerGetRare(); } } DigTerrainManager.DigTerrainNetwork((SkNetworkInterface)(caster._net), intPos, damage * (returnResource ? 5f : 1f), radius, resourceBonus, returnResource, bGetSpItems, 0.3f); } } }
public static void RPC_S2C_BlockDestroyInRange(uLink.BitStream stream, uLink.NetworkMessageInfo info) { byte[] data = stream.Read <byte[]>(); DigTerrainManager.BlockDestroyInRangeNetReturn(data); }
public static void RPC_S2C_BuildBlock(uLink.BitStream stream, uLink.NetworkMessageInfo info) { byte[] binData = stream.Read <byte[]>(); DigTerrainManager.ApplyBSVoxelData(binData); }
public static void RPC_S2C_BlockData(uLink.BitStream stream, uLink.NetworkMessageInfo info) { /*int index = */ stream.Read <int>(); byte[] data = stream.Read <byte[]>(); DigTerrainManager.ApplyBlockData(data); }
/// <summary> /// voxel modify check event before really undo and redo. Call by BSVoxelModify /// </summary> bool OnCheckVoxelModify(int opType, IntVector3[] indexes, BSVoxel[] voxels, BSVoxel[] oldvoxels, EBSBrushMode mode, IBSDataSource ds) { if (IsGod) { return(true); } if (Pathea.PeCreature.Instance.mainPlayer == null) { return(false); } bool result = true; if (mode == EBSBrushMode.Add) { Dictionary <int, int> items = new Dictionary <int, int>(); // Calculate the needed items; int adder = 1; foreach (BSVoxel voxel in voxels) { int id = 0; if (ds == BuildingMan.Blocks) { if (voxel.IsExtendable()) { if (!voxel.IsExtendableRoot()) { id = GetBlockItemProtoID((byte)(voxel.materialType >> 2)); adder = 1; } else { adder = 0; } } else { id = GetBlockItemProtoID(voxel.materialType); } } else if (ds == BuildingMan.Voxels) { id = GetVoxelItemProtoID(voxel.materialType); } if (id <= 0) { continue; } if (id != 0) { if (items.ContainsKey(id)) { items[id] += adder; } else { items.Add(id, adder); } } } _costsItems = items; float divisor = 1.0f; if (ds == BuildingMan.Blocks) { divisor = (float)(1 << BSBlock45Data.s_ScaleInverted); } // Has player enough items ? Pathea.PackageCmpt pkg = Pathea.PeCreature.Instance.mainPlayer.GetCmpt <Pathea.PackageCmpt>(); _playerItems.Clear(); foreach (KeyValuePair <int, int> kvp in items) { _playerItems.Add(kvp.Key, pkg.GetItemCount(kvp.Key)); if (pkg.GetItemCount(kvp.Key) < Mathf.CeilToInt(kvp.Value / divisor)) { result = false; } } // now delete if (result) { if (GameConfig.IsMultiMode) { if (null == PlayerNetwork.mainPlayer) { return(false); } if (!Pathea.PeGameMgr.IsMultiCoop && VArtifactUtil.IsInTownBallArea(PlayerNetwork.mainPlayer._pos)) { new PeTipMsg(PELocalization.GetString(8000864), PeTipMsg.EMsgLevel.Warning); return(false); } //if (!PlayerNetwork.OnLimitBoundsCheck(brushBound)) //{ // new PeTipMsg(PELocalization.GetString(8000864), PeTipMsg.EMsgLevel.Warning); // return false; //} PlayerNetwork.mainPlayer.RequestRedo(opType, indexes, oldvoxels, voxels, mode, ds.DataType, ds.Scale); DigTerrainManager.BlockClearGrass(ds, indexes); return(true); } else { string debug_log = ""; foreach (KeyValuePair <int, int> kvp in items) { if (pkg.Destory(kvp.Key, Mathf.CeilToInt(kvp.Value / divisor))) { debug_log += "\r\n Rmove Item from player package ID[" + kvp.Key.ToString() + "]" + " count - " + kvp.Value.ToString(); } } if (ds == BuildingMan.Blocks) { for (int i = 0; i < indexes.Length; i++) { Vector3 pos = new Vector3(indexes[i].x * ds.Scale, indexes[i].y * ds.Scale, indexes[i].z * ds.Scale) - ds.Offset; PeGrassSystem.DeleteAtPos(pos); PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y - 1, pos.z)); //PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y + 1, pos.z)); } } else if (ds == BuildingMan.Voxels) { for (int i = 0; i < indexes.Length; i++) { Vector3 pos = new Vector3(indexes[i].x, indexes[i].y, indexes[i].z); PeGrassSystem.DeleteAtPos(pos); PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y - 1, pos.z)); //PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y + 1, pos.z)); } } //Debug.LogWarning(debug_log); } } else { new PeTipMsg(PELocalization.GetString(821000001), PeTipMsg.EMsgLevel.Warning); } } else if (mode == EBSBrushMode.Subtract) { Dictionary <int, int> items = new Dictionary <int, int>(); // Calculate the needed items; int adder = 1; foreach (BSVoxel voxel in oldvoxels) { int id = 0; if (ds == BuildingMan.Blocks) { if (voxel.IsExtendable()) { if (!voxel.IsExtendableRoot()) { id = GetBlockItemProtoID((byte)(voxel.materialType >> 2)); adder = 1; } else { adder = 0; } } else { if (!BuildingMan.Blocks.VoxelIsZero(voxel, 0)) { id = GetBlockItemProtoID((byte)(voxel.materialType)); } } } else if (ds == BuildingMan.Voxels) { if (!BuildingMan.Voxels.VoxelIsZero(voxel, 1)) { id = GetVoxelItemProtoID(voxel.materialType); } } if (id <= 0) { continue; } if (items.ContainsKey(id)) { items[id] += adder; } else { items.Add(id, adder); } } float divisor = 1.0f; if (ds == BuildingMan.Blocks) { divisor = (float)(1 << BSBlock45Data.s_ScaleInverted); } // Has player enough package ? Pathea.PlayerPackageCmpt pkg = Pathea.PeCreature.Instance.mainPlayer.GetCmpt <Pathea.PlayerPackageCmpt>(); MaterialItem[] array = new MaterialItem[items.Count]; int i = 0; foreach (KeyValuePair <int, int> kvp in items) { array[i] = new MaterialItem() { protoId = kvp.Key, count = Mathf.FloorToInt(kvp.Value / divisor) }; i++; } result = pkg.package.CanAdd(array); // Really add if (result) { if (GameConfig.IsMultiMode) { if (null == PlayerNetwork.mainPlayer) { return(false); } //if (!PlayerNetwork.OnLimitBoundsCheck(brushBound)) //{ // new PeTipMsg(PELocalization.GetString(8000864), PeTipMsg.EMsgLevel.Warning); // return false; //} PlayerNetwork.mainPlayer.RequestRedo(opType, indexes, oldvoxels, voxels, mode, ds.DataType, ds.Scale); return(true); } else { string debug_log = ""; foreach (MaterialItem mi in array) { if (mi.count != 0) { pkg.Add(mi.protoId, mi.count); } debug_log += "Add Item from player package ID[" + mi.protoId.ToString() + "]" + " count - " + mi.count.ToString() + "\r\n"; } Debug.LogWarning(debug_log); } } } if (result) { if (onVoxelMotify != null) { onVoxelMotify(indexes, voxels, oldvoxels, mode, ds); } } return(result); }
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); } } } } }
private void onAlterAttribs(int idx, float oldValue, float newValue) { // if(_targetTree == null) return; // Debug.Log("Cutting a tree........"); /* when the tree's hp has been cut to zero * if (null != LSubTerrainMgr.Instance) * { * LSubTerrainMgr.DeleteTree(mGroundItem); * LSubTerrainMgr.RefreshAllLayerTerrains(); * } * else if (null != RSubTerrainMgr.Instance) * { * RSubTerrainMgr.DeleteTree(mGroundItem._treeInfo); * RSubTerrainMgr.RefreshAllLayerTerrains(); * } */ if (idx != 2) { return; } float damage = _attribs.sums[0]; float resourceBonus = _attribs.sums[1]; bool returnResource = _attribs.sums[2] > 0.0f; SkEntity caster = GetCasterToModAttrib(idx); if (null != caster) { ISkSubTerrain subTerrain = caster as ISkSubTerrain; if (null != subTerrain && null != subTerrain.treeInfo) { treeHPInfos[subTerrain.treeInfo.WorldPos] = DigTerrainManager.Fell(subTerrain.treeInfo, damage, GetTreeHP(subTerrain.treeInfo.WorldPos)); if (GameConfig.IsMultiMode) { caster.SendFellTree(subTerrain.treeInfo._treeInfo.m_protoTypeIdx, subTerrain.treeInfo.WorldPos, subTerrain.treeInfo._treeInfo.m_heightScale, subTerrain.treeInfo._treeInfo.m_widthScale); } else { if (treeHPInfos[subTerrain.treeInfo.WorldPos] <= 0) { OnTreeCutDown(caster, subTerrain.treeInfo); DigTerrainManager.RemoveTree(subTerrain.treeInfo); if (returnResource) { bool bGetSpItems = false; if (caster is SkAliveEntity) { SkAliveEntity alive = (SkAliveEntity)caster; if (alive.Entity.proto == EEntityProto.Player) { SkillTreeUnitMgr mgr = alive.Entity.GetCmpt <SkillTreeUnitMgr>(); bGetSpItems = mgr.CheckMinerGetRare(); } } Dictionary <int, int> itemGet = DigTerrainManager.GetTreeResouce(subTerrain.treeInfo, resourceBonus, bGetSpItems); if (itemGet.Count > 0) { List <int> itemsArray = new List <int>(itemGet.Count * 2); foreach (int intemID in itemGet.Keys) { itemsArray.Add(intemID); itemsArray.Add(itemGet[intemID]); } GetSpecialItem.PlantItemAdd(ref itemsArray); //植物特殊道具添加 caster._attribs.pack += itemsArray.ToArray(); } } } } } } }