Ejemplo n.º 1
0
        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, "");
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }