Пример #1
0
        /// <summary>
        /// Handles account checking.
        /// </summary>
        /// <param name="ch"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        static Character Scan_AccountScanned(Character ch, System.ComponentModel.CancelEventArgs e)
        {
            //nothing to scan against
            if (!Universe.IsAttached)
            {
                e.Cancel = true;
                return ch;
            }

            //indicates if character was altered in any way
            var changedAcc = false;

            //get the ship of character
            var shipdata = Universe.Gis.Ships.FindByHash(
                ch.ShipArch
                );

            if (shipdata == null)
            {
                _log.NewMessage(LogType.Warning, "Unknown shiparch: {0} for {1}",
                    ch.ShipArch,
                ch.Name);
                e.Cancel = true;
                //TODO: add to non-parsed charlist
                return ch;
            }

            //var acc = meta.GetCharacter(Properties.Settings.Default.FLDBPath,_log);
            var defaults = shipdata.GetShipDefaultInternalsRows();

            //probably shouldn't fire at all in stable mod builds
            if (defaults.Length == 0)
            {
                _log.NewMessage(LogType.Error,"No default loadout for {0} {1} ({2})",ch.Name,shipdata.Nickname,shipdata.Name);
                return ch;
            }

            var hpData = Universe.Gis.Ships.FindByHash(ch.ShipArch).GetHardpointsRows();

            if (hpData == null)
            {
                _log.NewMessage(LogType.Error, "No hardpoint data for {0} {1} ({2})", ch.Name, shipdata.Nickname, shipdata.Name);
                return ch;
            }

            var foundEngine = false;
            var foundPower = false;
            Tuple<uint, string, float> powerToReplace = null;
            var equipToRemove = new List<Tuple<uint, string, float>>();

            foreach (var equip in ch.EquipmentList)
            {
                var eqItem = Universe.Gis.Equipment.FindByHash(equip.Item1);

                if (eqItem == null)
                {
                    _log.NewMessage(LogType.Error, "Unknown equipment: {0} {1} on {2}", ch.Name, equip.Item1, equip.Item2);
                    continue;
                }

                if (eqItem.Type == EquipTypes.Engine.ToString())
                {
                    //remove engine on standard hardpoint if
                    if (equip.Item2 == "")
                        if (hpData.FirstOrDefault(w => w.HPType == EquipTypes.Engine.ToString()) != null)
                        {
                            equipToRemove.Add(equip);
                            continue;
                        }
                    foundEngine = true;
                }
                else if (eqItem.Type == EquipTypes.Powerplant.ToString())
                {
                    foundPower = true;
                    if (eqItem.Hash != defaults[0].DPower)
                    {
                        _log.NewMessage(LogType.Warning,
                        "Non-standard powerplant for {0}: {1}, should be {2}",
                        ch.Name,
                        eqItem.Nickname,
                        Universe.Gis.Equipment.FindByHash(defaults[0].DPower).Nickname
                        );
                        if (Properties.Settings.Default.FLDBGoForDefaultPPlant)
                            powerToReplace = equip;

                    }
                }

                if (!Properties.Settings.Default.FLDBCheckIncompatibleHardpoints) continue;

                if (equip.Item2 == "") continue;
                var firstOrDefault = hpData.FirstOrDefault(row => row.Name == equip.Item2);
                if (firstOrDefault == null) continue;
                if (firstOrDefault.HPType.Contains(eqItem.Hardpoint)) continue;

                //Unmount incompatible equip
                equipToRemove.Add(equip);
                _log.NewMessage(LogType.Info, "Unmounting {0} on {1} ({2}), ship {3} ({4})...",eqItem.Nickname,equip.Item2,ch.Name,shipdata.Nickname,shipdata.Name);
                ch.Cargo.Add(new WTuple<uint, uint>(equip.Item1,1));
                changedAcc = true;
            }

            if (!foundEngine)
            {
                _log.NewMessage(LogType.Warning,"No engine for char {0}! Adding default...",ch.Name);
                // Get first engine HP available
                var engineHp = shipdata.GetHardpointsRows().FirstOrDefault(w => w.EquipType == EquipTypes.Engine.ToString());

                //fallback to internal if none found
                var hp = "";

                if (engineHp != null)
                    hp = engineHp.Name;
                ch.EquipmentList.Add(new Tuple<uint, string, float>(defaults[0].DEngine,hp,1));
                changedAcc = true;
            }

            if (!foundPower | (powerToReplace != null))
            {
                if (powerToReplace != null)
                    ch.EquipmentList.Remove(powerToReplace);

                _log.NewMessage(LogType.Warning, "Adding default powerplant for char {0}...", ch.Name);

                var powerHp =
                    shipdata.GetHardpointsRows().FirstOrDefault(w => w.EquipType == EquipTypes.Powerplant.ToString());
                var hp = "";

                if (powerHp != null)
                    hp = powerHp.Name;
                ch.EquipmentList.Add(new Tuple<uint, string, float>(defaults[0].DPower, hp, 1));
                changedAcc = true;
            }

            if ((!changedAcc) | Properties.Settings.Default.FLDBReadOnlyChecks) return ch;

            //remove everything we marked
            foreach (var rEq in equipToRemove)
                ch.EquipmentList.Remove(rEq);

            ch.SaveCharacter(Properties.Settings.Default.FLDBPath, _log);
            return ch;
        }