private void CutTree(int itemInstanceId, Vector3D hitWorldPosition, Vector3 hitNormal, float forceMultiplier = 1f) { int num; HkStaticCompoundShape shape = (HkStaticCompoundShape)base.Physics.RigidBody.GetShape(); if (base.m_localIdToPhysicsShapeInstanceId.TryGetValue(itemInstanceId, out num)) { MyEnvironmentItems.MyEnvironmentItemData itemData = base.m_itemsData[itemInstanceId]; MyDefinitionId id = new MyDefinitionId(base.Definition.ItemDefinitionType, itemData.SubtypeId); MyTreeDefinition environmentItemDefinition = (MyTreeDefinition)MyDefinitionManager.Static.GetEnvironmentItemDefinition(id); if ((base.RemoveItem(itemInstanceId, num, true, true) && ((environmentItemDefinition != null) && (environmentItemDefinition.BreakSound != null))) && (environmentItemDefinition.BreakSound.Length > 0)) { EndpointId targetEndpoint = new EndpointId(); MyMultiplayer.RaiseStaticEvent <Vector3D, string>(s => new Action <Vector3D, string>(MyTrees.PlaySound), hitWorldPosition, environmentItemDefinition.BreakSound, targetEndpoint, new Vector3D?(hitWorldPosition)); } if (MyPerGameSettings.Destruction && (MyModels.GetModelOnlyData(environmentItemDefinition.Model).HavokBreakableShapes != null)) { if ((environmentItemDefinition.FallSound != null) && (environmentItemDefinition.FallSound.Length > 0)) { this.CreateBreakableShape(environmentItemDefinition, ref itemData, ref hitWorldPosition, hitNormal, forceMultiplier, environmentItemDefinition.FallSound); } else { this.CreateBreakableShape(environmentItemDefinition, ref itemData, ref hitWorldPosition, hitNormal, forceMultiplier, ""); } } } }
public override unsafe void DoDamage(float damage, int itemInstanceId, Vector3D position, Vector3 normal, MyStringHash type) { MyParticleEffect effect; MyEnvironmentItems.MyEnvironmentItemData data = base.m_itemsData[itemInstanceId]; MyDefinitionId id = new MyDefinitionId(base.Definition.ItemDefinitionType, data.SubtypeId); MyTreeDefinition environmentItemDefinition = (MyTreeDefinition)MyDefinitionManager.Static.GetEnvironmentItemDefinition(id); MyParticlesManager.TryCreateParticleEffect(environmentItemDefinition.CutEffect, MatrixD.CreateWorld(position, Vector3.CalculatePerpendicularVector(normal), normal), out effect); if (Sync.IsServer) { MyCutTreeInfo item = new MyCutTreeInfo(); int index = -1; int num2 = 0; while (true) { if (num2 < this.m_cutTreeInfos.Count) { item = this.m_cutTreeInfos[num2]; if (itemInstanceId != item.ItemInstanceId) { num2++; continue; } index = num2; } if (index == -1) { item = new MyCutTreeInfo { ItemInstanceId = itemInstanceId }; MyCutTreeInfo *infoPtr1 = (MyCutTreeInfo *)ref item; infoPtr1->MaxPoints = item.HitPoints = environmentItemDefinition.HitPoints; index = this.m_cutTreeInfos.Count; this.m_cutTreeInfos.Add(item); } item.LastHit = MySandboxGame.TotalGamePlayTimeInMilliseconds; float *singlePtr1 = (float *)ref item.HitPoints; singlePtr1[0] -= damage; if (item.Progress < 1f) { this.m_cutTreeInfos[index] = item; return; } this.CutTree(itemInstanceId, position, normal, (type == MyDamageType.Drill) ? 1f : 4f); this.m_cutTreeInfos.RemoveAtFast <MyCutTreeInfo>(index); return; } } }