コード例 #1
0
ファイル: Default.aspx.cs プロジェクト: phiree/namename
    private List<Shop_Store> BuildTestData()
    {
        List<Shop_Store> stores = new List<Shop_Store>();

        for (int i = 0; i < 100; i++)
        {
            Account_Period ap = new Account_Period();
            ap.AccountID = Guid.NewGuid();
            ap.BeginDate = DateTime.Now;
            ap.EndDate = DateTime.Now;

            ProInfo pi = new ProInfo();
            pi.Name = "name" + i;
            pi.Unit = "jin";
            ShopInfo si = new ShopInfo();
            si.ShopName = "name" + i;

            Shop_Store ss = new Shop_Store();

            ss.Account_Period = ap;
            ss.ChkQty = i;
            ss.CurrQty = i;
            ss.ExpQty = i;
            ss.Id = i;
            ss.ImpQty = ss.PreQty = i;
            ss.ProInfo = pi;
            ss.ShopInfo = si;
            stores.Add(ss);
        }

        return stores;
    }
コード例 #2
0
ファイル: Edit.aspx.cs プロジェクト: phiree/namename
    protected void btnSave_Click(object sender, EventArgs e)
    {
        ProInfo pro;
        if (proid == null)
        {
            pro = new ProInfo();

        }
        else
        {
            pro = dpi.GetByProID(new Guid(proid));
        }
        pro.Unit = tbUnit.Text;
        pro.ProCate = string.IsNullOrEmpty(tbProCate.Text) ? ddlProCate.SelectedValue : tbProCate.Text;
        pro.Name = tbName.Text;
        pro.Memo = tbMemo.Text;

        pro.PicName = UpLoadFile1.FileName;

        Guid pid = dpi.Save(pro);
        if (proid == null)
        {
            Session[WebHint.Web_Hint] = new WebHint("保存成功", "/Product/edit.aspx?proid=" + pid, HintFlag.跳转);
        }
        else
        {
            Session[WebHint.Web_Hint] = new WebHint("保存成功", "/Product/Default.aspx", HintFlag.跳转);
        }

        Response.Redirect(WebHint.HintURL);
    }
コード例 #3
0
ファイル: Edit.aspx.cs プロジェクト: phiree/namename
 protected void Page_Load(object sender, EventArgs e)
 {
     proid = Request["ProID"];
     CurrentProInfo = dpi.GetByProID(new Guid(proid));
     if (!IsPostBack)
     {
         BindProCate();
         BindProInfo();
         BindLimit();
     }
 }
コード例 #4
0
        public static string Descrypt(string Content, string format = null)
        {
            if (string.IsNullOrEmpty(Content))
            {
                return(string.Empty);
            }
            string ResContent = string.Empty;
            string className  = string.Empty;

            string[]       temp     = Content.Split("\r\n".ToCharArray());
            List <string>  realtemp = new List <string>();
            List <ProInfo> pros     = new List <ProInfo>();

            //过滤非类名,非属性代码
            foreach (string item in temp)
            {
                if (item.Contains("private") || item.Contains(@"//") || item.Contains("class"))
                {
                    realtemp.Add(item.Trim());
                }
            }
            if (realtemp.Count == 0)
            {
                return(string.Empty);
            }

            //修正在代码行上面注释的代码
            for (int i = 0; i < realtemp.Count; i++)
            {
                if (!realtemp[i].Contains("class") && !(realtemp[i].Contains("private") && realtemp[i].Contains(@"//")))
                {
                    if (realtemp[i].Contains("private") && i - 1 >= 0 && realtemp[i - 1].Contains(@"//"))
                    {
                        realtemp[i] = realtemp[i].Trim() + realtemp[i - 1].Trim();
                    }
                }
            }

            //类名加工
            foreach (var item in realtemp)
            {
                Regex           reg    = new Regex(@"\s?public\s?class\s(\w+)\s.*");
                GroupCollection result = reg.Match(item).Groups;
                className = result[1].ToString();
                if (!string.IsNullOrEmpty(className))
                {
                    break;
                }
            }
            //属性加工
            foreach (var item in realtemp)
            {
                if (item.Contains("private") && item.Contains(@"//"))
                {
                    Regex           reg    = new Regex(@"\s?(private)\s?(\w+<?\w+>?)\s(\w+)\s?(=?.*);\s?//\s?(.*)");
                    GroupCollection result = reg.Match(item).Groups;
                    ProInfo         info   = new ProInfo()
                    {
                        Name         = result[3].ToString(),
                        Opening      = result[1].ToString(),
                        Typer        = result[2].ToString(),
                        Notes        = result[5].ToString(),
                        DefaultValue = result[4].ToString()
                    };
                    pros.Add(info);
                }
            }

            //属性代码生成
            foreach (var item in pros)
            {
                string res = string.Empty;
                try
                {
                    if (string.IsNullOrEmpty(format))
                    {
                        res = string.Format(@"
        /// <summary>
        /// {0}
        /// </summary>
        private {1} _{2} {4};
        /// <summary>
        /// 获取或设置{0}
        /// </summary>
        public {1} {3} 
        {{ 
            get {{ return _{2}; }}
            set {{ _{2} = value;}}
        }}
", item.Notes, item.Typer, item.Name, UpperFirst(item.Name), item.DefaultValue);
                    }
                    else
                    {
                        res = string.Format(format, item.Notes, item.Typer, item.Name, UpperFirst(item.Name), item.DefaultValue);
                    }

                    //替换ArrayList为List
                    res = res.Replace("ArrayList", "List");
                }
                catch (Exception)
                { }

                ResContent += res;
            }

            //生成类名
            if (!string.IsNullOrEmpty(className))
            {
                ResContent = string.Format(@"public class {0} 
{{
{1}
}}", UpperFirst(className), ResContent);
            }

            return(ResContent);
        }
コード例 #5
0
        private void UpdateEffect(HitEntity hitEnt, ProInfo info)
        {
            var grid = hitEnt.Entity as MyCubeGrid;

            if (grid == null || grid.MarkedForClose)
            {
                return;
            }
            Dictionary <AreaEffectType, GridEffect> effects;
            var attackerId = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Bypass ? grid.EntityId : info.Target.FiringCube.EntityId;
            var found      = false;

            if (_gridEffects.TryGetValue(grid, out effects))
            {
                GridEffect gridEffect;
                if (effects.TryGetValue(info.AmmoDef.AreaEffect.AreaEffect, out gridEffect))
                {
                    found                 = true;
                    gridEffect.Damage    += info.AreaEffectDamage;
                    gridEffect.Ai         = info.Ai;
                    gridEffect.AttackerId = attackerId;
                    gridEffect.Hits++;
                    if (hitEnt.HitPos != null)
                    {
                        gridEffect.HitPos = hitEnt.HitPos.Value / gridEffect.Hits;
                    }
                }
            }

            if (!found)
            {
                if (effects == null)
                {
                    effects = GridEffectsPool.Get();
                }
                GridEffect gridEffect;
                if (effects.TryGetValue(info.AmmoDef.AreaEffect.AreaEffect, out gridEffect))
                {
                    gridEffect.Damage    += info.AreaEffectDamage;
                    gridEffect.Ai         = info.Ai;
                    gridEffect.AmmoDef    = info.AmmoDef;
                    gridEffect.AttackerId = attackerId;
                    gridEffect.Hits++;
                    if (hitEnt.HitPos != null)
                    {
                        gridEffect.HitPos += hitEnt.HitPos.Value / gridEffect.Hits;
                    }
                }
                else
                {
                    gridEffect            = GridEffectPool.Get();
                    gridEffect.System     = info.System;
                    gridEffect.Damage     = info.AreaEffectDamage;
                    gridEffect.Ai         = info.Ai;
                    gridEffect.AmmoDef    = info.AmmoDef;
                    gridEffect.AttackerId = attackerId;
                    gridEffect.Hits++;
                    if (hitEnt.HitPos != null)
                    {
                        gridEffect.HitPos = hitEnt.HitPos.Value;
                    }
                    effects.Add(info.AmmoDef.AreaEffect.AreaEffect, gridEffect);
                }
                _gridEffects.Add(grid, effects);
            }
            info.BaseHealthPool = 0;
            info.BaseDamagePool = 0;
        }
コード例 #6
0
        private void DamageShield(HitEntity hitEnt, ProInfo info)
        {
            var shield = hitEnt.Entity as IMyTerminalBlock;

            if (shield == null || !hitEnt.HitPos.HasValue)
            {
                return;
            }
            info.ObjectsHit++;

            var damageScale = 1;
            var fallOff     = info.AmmoDef.Const.FallOffScaling && info.DistanceTraveled > info.AmmoDef.DamageScales.FallOff.Distance;

            if (info.AmmoDef.Const.VirtualBeams)
            {
                damageScale *= info.WeaponCache.Hits;
            }
            var damageType   = info.AmmoDef.DamageScales.Shields.Type;
            var energy       = damageType == ShieldDef.ShieldType.Energy;
            var heal         = damageType == ShieldDef.ShieldType.Heal;
            var shieldByPass = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Bypass;

            var areaEffect    = info.AmmoDef.AreaEffect;
            var detonateOnEnd = info.AmmoDef.AreaEffect.Detonation.DetonateOnEnd && areaEffect.AreaEffect != AreaEffectType.Disabled && !shieldByPass;
            var areaDamage    = areaEffect.AreaEffect != AreaEffectType.Disabled ? areaEffect.AreaEffectDamage * (areaEffect.AreaEffectRadius * 0.5f) : 0;
            var scaledDamage  = (((info.BaseDamagePool * damageScale) + areaDamage) * info.AmmoDef.Const.ShieldModifier) * info.AmmoDef.Const.ShieldBypassMod;

            if (fallOff)
            {
                var fallOffMultipler = MathHelperD.Clamp(1.0 - ((info.DistanceTraveled - info.AmmoDef.DamageScales.FallOff.Distance) / (info.AmmoDef.Const.MaxTrajectory - info.AmmoDef.DamageScales.FallOff.Distance)), info.AmmoDef.DamageScales.FallOff.MinMultipler, 1);
                scaledDamage *= fallOffMultipler;
            }

            var detonateDamage = detonateOnEnd ? (areaEffect.Detonation.DetonationDamage * (areaEffect.Detonation.DetonationRadius * 0.5f)) * info.AmmoDef.Const.ShieldModifier : 0;

            var combinedDamage = (float)(scaledDamage + detonateDamage);

            if (heal)
            {
                combinedDamage *= -1;
            }

            var hit = SApi.PointAttackShieldExt(shield, hitEnt.HitPos.Value, info.Target.FiringCube.EntityId, combinedDamage, energy, info.AmmoDef.AmmoGraphics.ShieldHitDraw);

            if (hit.HasValue)
            {
                if (heal)
                {
                    info.BaseDamagePool = 0;
                    return;
                }
                var objHp = hit.Value;
                if (info.EwarActive)
                {
                    info.BaseHealthPool -= 1;
                }
                else if (objHp > 0)
                {
                    if (!shieldByPass)
                    {
                        info.BaseDamagePool = 0;
                    }
                    else
                    {
                        info.BaseDamagePool *= info.AmmoDef.Const.ShieldBypassMod;
                    }
                }
                else
                {
                    info.BaseDamagePool = (objHp * -1);
                }
                if (info.AmmoDef.Mass <= 0)
                {
                    return;
                }

                var speed = info.AmmoDef.Trajectory.DesiredSpeed > 0 ? info.AmmoDef.Trajectory.DesiredSpeed : 1;
                ApplyProjectileForce((MyEntity)shield.CubeGrid, hitEnt.HitPos.Value, hitEnt.Intersection.Direction, info.AmmoDef.Mass * speed);
            }
        }
コード例 #7
0
        private static void PushPull(HitEntity hitEnt, ProInfo info)
        {
            var depletable = info.ConsumableDef.AreaEffect.EwarFields.Depletable;
            var healthPool = depletable && info.BaseHealthPool > 0 ? info.BaseHealthPool : float.MaxValue;

            if (healthPool <= 0)
            {
                return;
            }

            if (hitEnt.Entity.Physics == null || !hitEnt.Entity.Physics.Enabled || hitEnt.Entity.Physics.IsStatic || !hitEnt.HitPos.HasValue)
            {
                return;
            }

            var forceDef = info.ConsumableDef.AreaEffect.EwarFields.Force;

            Vector3D forceFrom     = Vector3D.Zero;
            Vector3D forceTo       = Vector3D.Zero;
            Vector3D forcePosition = Vector3D.Zero;

            if (forceDef.ForceFrom == Force.ProjectileLastPosition)
            {
                forceFrom = hitEnt.Intersection.From;
            }
            else if (forceDef.ForceFrom == Force.ProjectileOrigin)
            {
                forceFrom = info.Origin;
            }
            else if (forceDef.ForceFrom == Force.HitPosition)
            {
                forceFrom = hitEnt.HitPos.Value;
            }
            else if (forceDef.ForceFrom == Force.TargetCenter)
            {
                forceFrom = hitEnt.Entity.PositionComp.WorldAABB.Center;
            }
            else if (forceDef.ForceFrom == Force.TargetCenterOfMass)
            {
                forceFrom = hitEnt.Entity.Physics.CenterOfMassWorld;
            }

            if (forceDef.ForceTo == Force.ProjectileLastPosition)
            {
                forceTo = hitEnt.Intersection.From;
            }
            else if (forceDef.ForceTo == Force.ProjectileOrigin)
            {
                forceTo = info.Origin;
            }
            else if (forceDef.ForceTo == Force.HitPosition)
            {
                forceTo = hitEnt.HitPos.Value;
            }
            else if (forceDef.ForceTo == Force.TargetCenter)
            {
                forceTo = hitEnt.Entity.PositionComp.WorldAABB.Center;
            }
            else if (forceDef.ForceTo == Force.TargetCenterOfMass)
            {
                forceTo = hitEnt.Entity.Physics.CenterOfMassWorld;
            }

            if (forceDef.Position == Force.ProjectileLastPosition)
            {
                forcePosition = hitEnt.Intersection.From;
            }
            else if (forceDef.Position == Force.ProjectileOrigin)
            {
                forcePosition = info.Origin;
            }
            else if (forceDef.Position == Force.HitPosition)
            {
                forcePosition = hitEnt.HitPos.Value;
            }
            else if (forceDef.Position == Force.TargetCenter)
            {
                forcePosition = hitEnt.Entity.PositionComp.WorldAABB.Center;
            }
            else if (forceDef.Position == Force.TargetCenterOfMass)
            {
                forcePosition = hitEnt.Entity.Physics.CenterOfMassWorld;
            }

            var hitDir = forceTo - forceFrom;

            Vector3D normHitDir;

            Vector3D.Normalize(ref hitDir, out normHitDir);

            normHitDir = info.ConsumableDef.Const.AreaEffect == PushField ? normHitDir : -normHitDir;
            hitEnt.Entity.Physics.AddForce(MyPhysicsForceType.APPLY_WORLD_IMPULSE_AND_WORLD_ANGULAR_IMPULSE, normHitDir * (info.ConsumableDef.Const.AreaEffectDamage * hitEnt.Entity.Physics.Mass), forcePosition, Vector3.Zero);

            if (depletable)
            {
                info.BaseHealthPool -= healthPool;
            }
        }
コード例 #8
0
        private static void DamageProjectile(HitEntity hitEnt, ProInfo attacker)
        {
            var pTarget = hitEnt.Projectile;

            if (pTarget == null)
            {
                return;
            }

            attacker.ObjectsHit++;
            var objHp          = pTarget.Info.BaseHealthPool;
            var integrityCheck = attacker.AmmoDef.DamageScales.MaxIntegrity > 0;

            if (integrityCheck && objHp > attacker.AmmoDef.DamageScales.MaxIntegrity)
            {
                return;
            }

            float damageScale = 1;

            if (attacker.AmmoDef.Const.VirtualBeams)
            {
                damageScale *= attacker.WeaponCache.Hits;
            }

            var scaledDamage = attacker.BaseDamagePool * damageScale;

            var fallOff = attacker.AmmoDef.Const.FallOffScaling && attacker.DistanceTraveled > attacker.AmmoDef.DamageScales.FallOff.Distance;

            if (fallOff)
            {
                var fallOffMultipler = (float)MathHelperD.Clamp(1.0 - ((attacker.DistanceTraveled - attacker.AmmoDef.DamageScales.FallOff.Distance) / (attacker.AmmoDef.Const.MaxTrajectory - attacker.AmmoDef.DamageScales.FallOff.Distance)), attacker.AmmoDef.DamageScales.FallOff.MinMultipler, 1);
                scaledDamage *= fallOffMultipler;
            }

            if (scaledDamage >= objHp)
            {
                attacker.BaseDamagePool    -= objHp;
                pTarget.Info.BaseHealthPool = 0;
                pTarget.State = Projectile.ProjectileState.Destroy;
            }
            else
            {
                attacker.BaseDamagePool      = 0;
                pTarget.Info.BaseHealthPool -= scaledDamage;

                if (attacker.DetonationDamage > 0 && attacker.AmmoDef.AreaEffect.Detonation.DetonateOnEnd)
                {
                    var areaSphere = new BoundingSphereD(pTarget.Position, attacker.AmmoDef.AreaEffect.Detonation.DetonationRadius);
                    foreach (var sTarget in attacker.Ai.LiveProjectile)
                    {
                        if (areaSphere.Contains(sTarget.Position) != ContainmentType.Disjoint)
                        {
                            if (attacker.DetonationDamage >= sTarget.Info.BaseHealthPool)
                            {
                                sTarget.Info.BaseHealthPool = 0;
                                sTarget.State = Projectile.ProjectileState.Destroy;
                            }
                            else
                            {
                                sTarget.Info.BaseHealthPool -= attacker.DetonationDamage;
                            }
                        }
                    }
                }
            }
        }
コード例 #9
0
        private void DamageVoxel(HitEntity hitEnt, ProInfo info)
        {
            var entity  = hitEnt.Entity;
            var destObj = hitEnt.Entity as MyVoxelBase;

            if (destObj == null || entity == null || !hitEnt.HitPos.HasValue)
            {
                return;
            }
            var shieldHeal = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Heal;

            if (!info.AmmoDef.Const.VoxelDamage || shieldHeal)
            {
                info.BaseDamagePool = 0;
                return;
            }

            using (destObj.Pin())
            {
                var detonateOnEnd = info.AmmoDef.Const.AmmoAreaEffect && info.AmmoDef.AreaEffect.Detonation.DetonateOnEnd && info.AmmoDef.AreaEffect.AreaEffect != AreaEffectType.Radiant;

                info.ObjectsHit++;
                float damageScale = 1;
                if (info.AmmoDef.Const.VirtualBeams)
                {
                    damageScale *= info.WeaponCache.Hits;
                }

                var scaledDamage = info.BaseDamagePool * damageScale;
                var fallOff      = info.AmmoDef.Const.FallOffScaling && info.DistanceTraveled > info.AmmoDef.DamageScales.FallOff.Distance;
                if (fallOff)
                {
                    var fallOffMultipler = (float)MathHelperD.Clamp(1.0 - ((info.DistanceTraveled - info.AmmoDef.DamageScales.FallOff.Distance) / (info.AmmoDef.Const.MaxTrajectory - info.AmmoDef.DamageScales.FallOff.Distance)), info.AmmoDef.DamageScales.FallOff.MinMultipler, 1);
                    scaledDamage *= fallOffMultipler;
                }

                var oRadius       = info.AmmoDef.AreaEffect.AreaEffectRadius;
                var minTestRadius = info.DistanceTraveled - info.PrevDistanceTraveled;
                var tRadius       = oRadius < minTestRadius ? minTestRadius : oRadius;
                var objHp         = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(tRadius)), 1, double.MaxValue);
                var sync          = MpActive && IsServer;

                if (tRadius > 5)
                {
                    objHp *= 5;
                }
                if (scaledDamage < objHp)
                {
                    var reduceBy = objHp / scaledDamage;
                    oRadius /= reduceBy;
                    if (oRadius < 1)
                    {
                        oRadius = 1;
                    }

                    info.BaseDamagePool = 0;
                }
                else
                {
                    info.BaseDamagePool -= objHp;
                    if (oRadius < minTestRadius)
                    {
                        oRadius = minTestRadius;
                    }
                }
                destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, (float)oRadius, true);

                if (detonateOnEnd)
                {
                    var det     = info.AmmoDef.AreaEffect.Detonation;
                    var dRadius = det.DetonationRadius;
                    var dObjHp  = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(dRadius)), 1, double.MaxValue);
                    if (dRadius > 5)
                    {
                        dObjHp *= 5;
                    }
                    dObjHp *= 5;
                    var dDamage  = det.DetonationDamage;
                    var reduceBy = dObjHp / dDamage;

                    dRadius /= reduceBy;
                    if (dRadius < 1.5)
                    {
                        dRadius = 1.5f;
                    }
                    if (sync)
                    {
                        destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, dRadius, true);
                    }
                }
            }
        }
コード例 #10
0
        private void DamageDestObj(HitEntity hitEnt, ProInfo info)
        {
            var entity  = hitEnt.Entity;
            var destObj = hitEnt.Entity as IMyDestroyableObject;

            if (destObj == null || entity == null)
            {
                return;
            }
            var shieldHeal   = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Heal;
            var shieldByPass = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Bypass;
            var sync         = MpActive && IsServer;

            var attackerId = info.Target.FiringCube.EntityId;

            var objHp          = destObj.Integrity;
            var integrityCheck = info.AmmoDef.DamageScales.MaxIntegrity > 0;

            if (integrityCheck && objHp > info.AmmoDef.DamageScales.MaxIntegrity || shieldHeal)
            {
                info.BaseDamagePool = 0;
                return;
            }

            var   character   = hitEnt.Entity as IMyCharacter;
            float damageScale = 1;

            if (info.AmmoDef.Const.VirtualBeams)
            {
                damageScale *= info.WeaponCache.Hits;
            }
            if (character != null && info.AmmoDef.DamageScales.Characters >= 0)
            {
                damageScale *= info.AmmoDef.DamageScales.Characters;
            }

            var scaledDamage = info.BaseDamagePool * damageScale;

            var fallOff = info.AmmoDef.Const.FallOffScaling && info.DistanceTraveled > info.AmmoDef.DamageScales.FallOff.Distance;

            if (fallOff)
            {
                var fallOffMultipler = (float)MathHelperD.Clamp(1.0 - ((info.DistanceTraveled - info.AmmoDef.DamageScales.FallOff.Distance) / (info.AmmoDef.Const.MaxTrajectory - info.AmmoDef.DamageScales.FallOff.Distance)), info.AmmoDef.DamageScales.FallOff.MinMultipler, 1);
                scaledDamage *= fallOffMultipler;
            }

            if (scaledDamage < objHp)
            {
                info.BaseDamagePool = 0;
            }
            else
            {
                info.BaseDamagePool -= objHp;
            }

            if (!IsClient)
            {
                destObj.DoDamage(scaledDamage, !shieldByPass ? MyDamageType.Bullet : MyDamageType.Drill, sync, null, attackerId);
            }
            if (info.AmmoDef.Mass > 0)
            {
                var speed = info.AmmoDef.Trajectory.DesiredSpeed > 0 ? info.AmmoDef.Trajectory.DesiredSpeed : 1;
                ApplyProjectileForce(entity, entity.PositionComp.WorldAABB.Center, hitEnt.Intersection.Direction, (info.AmmoDef.Mass * speed));
            }
        }
コード例 #11
0
        private void DamageGrid(HitEntity hitEnt, ProInfo t)
        {
            var grid = hitEnt.Entity as MyCubeGrid;

            if (grid == null || grid.MarkedForClose || !hitEnt.HitPos.HasValue || hitEnt.Blocks == null)
            {
                hitEnt.Blocks?.Clear();
                return;
            }
            if (t.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Heal || (!t.AmmoDef.Const.SelfDamage || !MyAPIGateway.Session.SessionSettings.EnableTurretsFriendlyFire) && t.Ai.MyGrid.IsSameConstructAs(grid))
            {
                t.BaseDamagePool = 0;
                return;
            }

            _destroyedSlims.Clear();
            _destroyedSlimsClient.Clear();
            var largeGrid      = grid.GridSizeEnum == MyCubeSize.Large;
            var areaRadius     = largeGrid ? t.AmmoDef.Const.AreaRadiusLarge : t.AmmoDef.Const.AreaRadiusSmall;
            var detonateRadius = largeGrid ? t.AmmoDef.Const.DetonateRadiusLarge : t.AmmoDef.Const.DetonateRadiusSmall;
            var maxObjects     = t.AmmoDef.Const.MaxObjectsHit;
            var areaEffect     = t.AmmoDef.AreaEffect.AreaEffect;
            var explosive      = areaEffect == AreaEffectType.Explosive;
            var radiant        = areaEffect == AreaEffectType.Radiant;
            var detonateOnEnd  = t.AmmoDef.AreaEffect.Detonation.DetonateOnEnd;
            var detonateDmg    = t.DetonationDamage;
            var shieldBypass   = t.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Bypass;
            var attackerId     = shieldBypass ? grid.EntityId : t.Target.FiringCube.EntityId;
            var attacker       = shieldBypass ? (MyEntity)grid : t.Target.FiringCube;
            var areaEffectDmg  = areaEffect != AreaEffectType.Disabled ? t.AreaEffectDamage : 0;
            var hitMass        = t.AmmoDef.Mass;
            var sync           = MpActive && (DedicatedServer || IsServer);
            var hasAreaDmg     = areaEffectDmg > 0;
            var radiantCascade = radiant && !detonateOnEnd;
            var primeDamage    = !radiantCascade || !hasAreaDmg;
            var radiantBomb    = radiant && detonateOnEnd;
            var damageType     = explosive || radiant ? MyDamageType.Explosion : MyDamageType.Bullet;

            var fallOff          = t.AmmoDef.Const.FallOffScaling && t.DistanceTraveled > t.AmmoDef.DamageScales.FallOff.Distance;
            var fallOffMultipler = 1f;

            if (fallOff)
            {
                fallOffMultipler = (float)MathHelperD.Clamp(1.0 - ((t.DistanceTraveled - t.AmmoDef.DamageScales.FallOff.Distance) / (t.AmmoDef.Const.MaxTrajectory - t.AmmoDef.DamageScales.FallOff.Distance)), t.AmmoDef.DamageScales.FallOff.MinMultipler, 1);
            }

            var damagePool = t.BaseDamagePool;

            if (t.AmmoDef.Const.VirtualBeams)
            {
                var hits = t.WeaponCache.Hits;
                damagePool    *= hits;
                areaEffectDmg *= hits;
            }
            var objectsHit           = t.ObjectsHit;
            var countBlocksAsObjects = t.AmmoDef.ObjectsHit.CountBlocks;

            List <Vector3I> radiatedBlocks = null;

            if (radiant)
            {
                GetBlockSphereDb(grid, areaRadius, out radiatedBlocks);
            }

            var done     = false;
            var nova     = false;
            var outOfPew = false;

            for (int i = 0; i < hitEnt.Blocks.Count; i++)
            {
                if (done || outOfPew && !nova)
                {
                    break;
                }

                var rootBlock = hitEnt.Blocks[i];

                if (!nova)
                {
                    if (_destroyedSlims.Contains(rootBlock) || _destroyedSlimsClient.Contains(rootBlock))
                    {
                        continue;
                    }
                    if (rootBlock.IsDestroyed)
                    {
                        _destroyedSlims.Add(rootBlock);
                        if (IsClient)
                        {
                            _destroyedSlimsClient.Add(rootBlock);
                            if (_slimHealthClient.ContainsKey(rootBlock))
                            {
                                _slimHealthClient.Remove(rootBlock);
                            }
                        }
                        continue;
                    }
                }
                var door = rootBlock.FatBlock as MyDoorBase;
                if (door != null && door.Open && !HitDoor(hitEnt, door))
                {
                    continue;
                }

                var radiate  = radiantCascade || nova;
                var dmgCount = 1;
                if (radiate)
                {
                    if (nova)
                    {
                        GetBlockSphereDb(grid, detonateRadius, out radiatedBlocks);
                    }
                    if (radiatedBlocks != null)
                    {
                        ShiftAndPruneBlockSphere(grid, rootBlock.Position, radiatedBlocks, _slimsSortedList);
                    }

                    done     = nova;
                    dmgCount = _slimsSortedList.Count;
                }

                for (int j = 0; j < dmgCount; j++)
                {
                    var   block       = radiate ? _slimsSortedList[j].Slim : rootBlock;
                    var   blockHp     = !IsClient ? block.Integrity : _slimHealthClient.ContainsKey(block) ? _slimHealthClient[block] : block.Integrity;
                    float damageScale = 1;

                    if (t.AmmoDef.Const.DamageScaling)
                    {
                        var d = t.AmmoDef.DamageScales;
                        if (d.MaxIntegrity > 0 && blockHp > d.MaxIntegrity)
                        {
                            outOfPew   = true;
                            damagePool = 0;
                            continue;
                        }

                        if (d.Grids.Large >= 0 && largeGrid)
                        {
                            damageScale *= d.Grids.Large;
                        }
                        else if (d.Grids.Small >= 0 && !largeGrid)
                        {
                            damageScale *= d.Grids.Small;
                        }

                        MyDefinitionBase blockDef = null;
                        if (t.AmmoDef.Const.ArmorScaling)
                        {
                            blockDef = block.BlockDefinition;
                            var isArmor = AllArmorBaseDefinitions.Contains(blockDef);
                            if (isArmor && d.Armor.Armor >= 0)
                            {
                                damageScale *= d.Armor.Armor;
                            }
                            else if (!isArmor && d.Armor.NonArmor >= 0)
                            {
                                damageScale *= d.Armor.NonArmor;
                            }

                            if (isArmor && (d.Armor.Light >= 0 || d.Armor.Heavy >= 0))
                            {
                                var isHeavy = HeavyArmorBaseDefinitions.Contains(blockDef);
                                if (isHeavy && d.Armor.Heavy >= 0)
                                {
                                    damageScale *= d.Armor.Heavy;
                                }
                                else if (!isHeavy && d.Armor.Light >= 0)
                                {
                                    damageScale *= d.Armor.Light;
                                }
                            }
                        }
                        if (t.AmmoDef.Const.CustomDamageScales)
                        {
                            if (blockDef == null)
                            {
                                blockDef = block.BlockDefinition;
                            }
                            float modifier;
                            var   found = t.AmmoDef.Const.CustomBlockDefinitionBasesToScales.TryGetValue(blockDef, out modifier);

                            if (found)
                            {
                                damageScale *= modifier;
                            }
                            else if (t.AmmoDef.DamageScales.Custom.IgnoreAllOthers)
                            {
                                continue;
                            }
                        }
                        if (fallOff)
                        {
                            damageScale *= fallOffMultipler;
                        }
                    }

                    var blockIsRoot   = block == rootBlock;
                    var primaryDamage = primeDamage || blockIsRoot;

                    if (damagePool <= 0 && primaryDamage || objectsHit >= maxObjects)
                    {
                        break;
                    }

                    var scaledDamage = damagePool * damageScale;
                    if (primaryDamage)
                    {
                        if (countBlocksAsObjects)
                        {
                            objectsHit++;
                        }

                        if (scaledDamage <= blockHp)
                        {
                            outOfPew   = true;
                            damagePool = 0;
                        }
                        else
                        {
                            _destroyedSlims.Add(block);
                            if (IsClient)
                            {
                                _destroyedSlimsClient.Add(block);
                                if (_slimHealthClient.ContainsKey(block))
                                {
                                    _slimHealthClient.Remove(block);
                                }
                            }
                            damagePool -= blockHp;
                        }
                    }
                    else
                    {
                        scaledDamage = areaEffectDmg * damageScale;
                        if (scaledDamage >= blockHp)
                        {
                            _destroyedSlims.Add(block);
                            if (IsClient)
                            {
                                _destroyedSlimsClient.Add(block);
                                if (_slimHealthClient.ContainsKey(block))
                                {
                                    _slimHealthClient.Remove(block);
                                }
                            }
                        }
                    }

                    if (!IsClient)
                    {
                        block.DoDamage(scaledDamage, damageType, sync, null, attackerId);
                    }
                    else
                    {
                        var hasBlock = _slimHealthClient.ContainsKey(block);
                        if (hasBlock && _slimHealthClient[block] - scaledDamage > 0)
                        {
                            _slimHealthClient[block] -= scaledDamage;
                        }
                        else if (hasBlock)
                        {
                            _slimHealthClient.Remove(block);
                        }
                        else if (block.Integrity - scaledDamage > 0)
                        {
                            _slimHealthClient[block] = blockHp - scaledDamage;
                        }
                    }

                    var theEnd = damagePool <= 0 || objectsHit >= maxObjects;

                    if (explosive && (!detonateOnEnd && blockIsRoot || detonateOnEnd && theEnd))
                    {
                        var rootPos = grid.GridIntegerToWorld(rootBlock.Position);
                        if (areaEffectDmg > 0)
                        {
                            SUtils.CreateMissileExplosion(this, areaEffectDmg * damageScale, areaRadius, rootPos, hitEnt.Intersection.Direction, attacker, grid, t.AmmoDef, true);
                        }
                        if (detonateOnEnd && theEnd)
                        {
                            SUtils.CreateMissileExplosion(this, detonateDmg * damageScale, detonateRadius, rootPos, hitEnt.Intersection.Direction, attacker, grid, t.AmmoDef, true);
                        }
                    }
                    else if (!nova)
                    {
                        if (hitMass > 0 && blockIsRoot)
                        {
                            var speed = t.AmmoDef.Trajectory.DesiredSpeed > 0 ? t.AmmoDef.Trajectory.DesiredSpeed : 1;
                            ApplyProjectileForce(grid, grid.GridIntegerToWorld(rootBlock.Position), hitEnt.Intersection.Direction, (hitMass * speed));
                        }

                        if (radiantBomb && theEnd)
                        {
                            nova = true;
                            i--;
                            t.BaseDamagePool = 0;
                            t.ObjectsHit     = maxObjects;
                            objectsHit       = int.MinValue;
                            var aInfo = t.AmmoDef.AreaEffect;
                            var dInfo = aInfo.Detonation;

                            if (dInfo.DetonationDamage > 0)
                            {
                                damagePool = detonateDmg;
                            }
                            else if (aInfo.AreaEffectDamage > 0)
                            {
                                damagePool = areaEffectDmg;
                            }
                            else
                            {
                                damagePool = scaledDamage;
                            }
                            break;
                        }
                    }
                }
            }
            if (!countBlocksAsObjects)
            {
                t.ObjectsHit += 1;
            }
            if (!nova)
            {
                t.BaseDamagePool = damagePool;
                t.ObjectsHit     = objectsHit;
            }
            if (radiantCascade || nova)
            {
                _slimsSortedList.Clear();
            }
            hitEnt.Blocks.Clear();
        }
コード例 #12
0
ファイル: ProjectileHits.cs プロジェクト: keleios/WeaponCore
        internal int GetEntityCompareDist(HitEntity x, HitEntity y, ProInfo info)
        {
            var xDist        = double.MaxValue;
            var yDist        = double.MaxValue;
            var beam         = x.Intersection;
            var count        = y != null ? 2 : 1;
            var eWarPulse    = info.AmmoDef.Const.Ewar && info.AmmoDef.Const.Pulse;
            var triggerEvent = eWarPulse && !info.EwarAreaPulse && info.AmmoDef.Const.EwarTriggerRange > 0;

            for (int i = 0; i < count; i++)
            {
                var isX = i == 0;

                MyEntity  ent;
                HitEntity hitEnt;
                HitEntity otherHit;
                if (isX)
                {
                    hitEnt   = x;
                    otherHit = y;
                    ent      = hitEnt.Entity;
                }
                else
                {
                    hitEnt   = y;
                    otherHit = x;
                    ent      = hitEnt.Entity;
                }

                var dist   = double.MaxValue;
                var shield = ent as IMyTerminalBlock;
                var grid   = ent as MyCubeGrid;
                var voxel  = ent as MyVoxelBase;

                if (triggerEvent && (info.Ai.Targets.ContainsKey(ent) || shield != null))
                {
                    hitEnt.PulseTrigger = true;
                }
                else if (hitEnt.Projectile != null)
                {
                    dist = hitEnt.HitDist.Value;
                }
                else if (shield != null)
                {
                    hitEnt.Hit = true;
                    dist       = hitEnt.HitDist.Value;
                }
                else if (grid != null)
                {
                    /*
                     * var otherGrid = otherHit?.Entity as MyCubeGrid;
                     * if (otherGrid != null && otherGrid.IsInSameLogicalGroupAs(grid))
                     *  hitEnt.SubGrids.Add(otherHit);
                     */

                    if (hitEnt.Hit)
                    {
                        dist           = Vector3D.Distance(hitEnt.Intersection.From, hitEnt.HitPos.Value);
                        hitEnt.HitDist = dist;
                    }
                    else if (hitEnt.HitPos != null)
                    {
                        dist           = Vector3D.Distance(hitEnt.Intersection.From, hitEnt.HitPos.Value);
                        hitEnt.HitDist = dist;
                        hitEnt.Hit     = true;
                    }
                    else
                    {
                        if (hitEnt.SphereCheck || info.EwarActive && eWarPulse)
                        {
                            var ewarActive = hitEnt.EventType == Field || hitEnt.EventType == Effect;

                            var hitPos = !ewarActive ? hitEnt.PruneSphere.Center + (hitEnt.Intersection.Direction * hitEnt.PruneSphere.Radius) : hitEnt.PruneSphere.Center;
                            if (hitEnt.SelfHit && Vector3D.DistanceSquared(hitPos, hitEnt.Info.Origin) <= grid.GridSize * grid.GridSize)
                            {
                                continue;
                            }

                            if (!ewarActive)
                            {
                                GetAndSortBlocksInSphere(hitEnt.Info.AmmoDef, hitEnt.Info.System, grid, hitEnt.PruneSphere, false, hitEnt.Blocks);
                            }

                            if (hitEnt.Blocks.Count > 0 || ewarActive)
                            {
                                dist           = 0;
                                hitEnt.HitDist = dist;
                                hitEnt.Hit     = true;
                                hitEnt.HitPos  = hitPos;
                            }
                        }
                        else
                        {
                            var closestBlockFound = false;
                            for (int j = 0; j < hitEnt.Vector3ICache.Count; j++)
                            {
                                var     firstBlock = grid.GetCubeBlock(hitEnt.Vector3ICache[j]) as IMySlimBlock;
                                MatrixD transform  = grid.WorldMatrix;
                                if (firstBlock != null && !firstBlock.IsDestroyed && firstBlock != hitEnt.Info.Target.FiringCube.SlimBlock)
                                {
                                    hitEnt.Blocks.Add(firstBlock);
                                    if (closestBlockFound)
                                    {
                                        continue;
                                    }
                                    MyOrientedBoundingBoxD obb;
                                    var fat = firstBlock.FatBlock;
                                    if (fat != null)
                                    {
                                        obb = new MyOrientedBoundingBoxD(fat.Model.BoundingBox, fat.PositionComp.WorldMatrixRef);
                                    }
                                    else
                                    {
                                        Vector3 halfExt;
                                        firstBlock.ComputeScaledHalfExtents(out halfExt);
                                        var blockBox = new BoundingBoxD(-halfExt, halfExt);
                                        transform.Translation = grid.GridIntegerToWorld(firstBlock.Position);
                                        obb = new MyOrientedBoundingBoxD(blockBox, transform);
                                    }

                                    var hitDist = obb.Intersects(ref beam) ?? Vector3D.Distance(beam.From, obb.Center);
                                    var hitPos  = beam.From + (beam.Direction * hitDist);

                                    if (hitEnt.SelfHit)
                                    {
                                        if (Vector3D.DistanceSquared(hitPos, hitEnt.Info.Origin) <= grid.GridSize * 3)
                                        {
                                            hitEnt.Blocks.Clear();
                                        }
                                        else
                                        {
                                            dist           = hitDist;
                                            hitEnt.HitDist = dist;
                                            hitEnt.Hit     = true;
                                            hitEnt.HitPos  = hitPos;
                                        }
                                        break;
                                    }

                                    dist              = hitDist;
                                    hitEnt.HitDist    = dist;
                                    hitEnt.Hit        = true;
                                    hitEnt.HitPos     = hitPos;
                                    closestBlockFound = true;
                                }
                            }
                        }
                    }
                }
                else if (voxel != null)
                {
                    hitEnt.Hit     = true;
                    dist           = hitEnt.HitDist.Value;
                    hitEnt.HitDist = dist;
                }
                else if (ent is IMyDestroyableObject)
                {
                    if (hitEnt.Hit)
                    {
                        dist = Vector3D.Distance(hitEnt.Intersection.From, hitEnt.HitPos.Value);
                    }
                    else
                    {
                        if (hitEnt.SphereCheck || info.EwarActive && eWarPulse)
                        {
                            var ewarActive = hitEnt.EventType == Field || hitEnt.EventType == Effect;
                            dist           = 0;
                            hitEnt.HitDist = dist;
                            hitEnt.Hit     = true;
                            var hitPos = !ewarActive ? hitEnt.PruneSphere.Center + (hitEnt.Intersection.Direction * hitEnt.PruneSphere.Radius) : hitEnt.PruneSphere.Center;
                            hitEnt.HitPos = hitPos;
                        }
                        else
                        {
                            var transform = ent.PositionComp.WorldMatrixRef;
                            var box       = ent.PositionComp.LocalAABB;
                            var obb       = new MyOrientedBoundingBoxD(box, transform);
                            dist = obb.Intersects(ref beam) ?? double.MaxValue;
                            if (dist < double.MaxValue)
                            {
                                hitEnt.Hit     = true;
                                hitEnt.HitPos  = beam.From + (beam.Direction * dist);
                                hitEnt.HitDist = dist;
                            }
                        }
                    }
                }

                if (isX)
                {
                    xDist = dist;
                }
                else
                {
                    yDist = dist;
                }
            }
            return(xDist.CompareTo(yDist));
        }
コード例 #13
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="ProjeIn"></param>
 public void UpdataLevelOfLine(ProInfo projeIn)
 {
     LevelOfLine = ElecCalsToolBox.GetLevelOfLine(projeIn.Volt, projeIn.ACorDC);
 }
コード例 #14
0
        private void DamageVoxel(HitEntity hitEnt, ProInfo info, bool canDamage)
        {
            var entity  = hitEnt.Entity;
            var destObj = hitEnt.Entity as MyVoxelBase;

            if (destObj == null || entity == null || !hitEnt.HitPos.HasValue)
            {
                return;
            }
            var shieldHeal = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Heal;

            if (!info.AmmoDef.Const.VoxelDamage || shieldHeal)
            {
                info.BaseDamagePool = 0;
                return;
            }

            using (destObj.Pin())
            {
                var detonateOnEnd = info.AmmoDef.Const.AmmoAreaEffect && info.AmmoDef.AreaEffect.Detonation.DetonateOnEnd && info.AmmoDef.AreaEffect.AreaEffect != AreaEffectType.Radiant;

                info.ObjectsHit++;
                float damageScale = 1;
                if (info.AmmoDef.Const.VirtualBeams)
                {
                    damageScale *= info.WeaponCache.Hits;
                }

                var scaledDamage = info.BaseDamagePool * damageScale;
                var fallOff      = info.AmmoDef.Const.FallOffScaling && info.DistanceTraveled > info.AmmoDef.DamageScales.FallOff.Distance;
                if (fallOff)
                {
                    var fallOffMultipler = (float)MathHelperD.Clamp(1.0 - ((info.DistanceTraveled - info.AmmoDef.DamageScales.FallOff.Distance) / (info.AmmoDef.Const.MaxTrajectory - info.AmmoDef.DamageScales.FallOff.Distance)), info.AmmoDef.DamageScales.FallOff.MinMultipler, 1);
                    scaledDamage *= fallOffMultipler;
                }

                var oRadius       = info.AmmoDef.AreaEffect.AreaEffectRadius;
                var minTestRadius = info.DistanceTraveled - info.PrevDistanceTraveled;
                var tRadius       = oRadius < minTestRadius ? minTestRadius : oRadius;
                var objHp         = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(tRadius)), 5000, double.MaxValue);


                if (tRadius > 5)
                {
                    objHp *= 5;
                }
                if (scaledDamage < objHp)
                {
                    var reduceBy = objHp / scaledDamage;
                    oRadius /= reduceBy;
                    if (oRadius < 1)
                    {
                        oRadius = 1;
                    }

                    info.BaseDamagePool = 0;
                }
                else
                {
                    info.BaseDamagePool -= objHp;
                    if (oRadius < minTestRadius)
                    {
                        oRadius = minTestRadius;
                    }
                }

                destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, (float)oRadius, true);
                //Log.Line($"TestHealth: {objHp} - tRadius:{tRadius} - oRadius:{oRadius} - travel:{minTestRadius} - base:{info.BaseDamagePool} - det:{detonateOnEnd}");

                if (detonateOnEnd && info.BaseDamagePool <= 0)
                {
                    var det     = info.AmmoDef.AreaEffect.Detonation;
                    var dRadius = det.DetonationRadius;
                    var dDamage = det.DetonationDamage;

                    //var dObjHp = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(dRadius)), 5000, double.MaxValue);
                    //if (dRadius > 5) dObjHp *= 5;
                    //dObjHp *= 5;
                    //var reduceBy = dObjHp / dDamage;
                    //dRadius /= reduceBy;

                    if (dRadius < 1.5)
                    {
                        dRadius = 1.5f;
                    }

                    //Log.Line($"radius: {det.DetonationRadius} - dRadius:{dRadius} - reduceBy:{reduceBy} - dObjHp:{dObjHp}");
                    if (canDamage)
                    {
                        //destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, dRadius, true);
                        SUtils.CreateMissileExplosion(this, dDamage, dRadius, hitEnt.HitPos.Value, hitEnt.Intersection.Direction, info.Target.FiringCube, destObj, info.AmmoDef, true);
                    }
                }
            }
        }