qweytr_1 发表于 2024-1-8 22:38

Mod笔记-抢救版

本帖最后由 qweytr_1 于 2024-1-8 22:39 编辑

这是用dnSpy修改的修改笔记
是19年老帖子的抢救版
这个游戏好几年没玩了,手头没有,别问我怎么改。
我只负责把老帖子消失的代码恢复一遍
看上去或许是page命令的锅
我把page删了
理应会好

---

抢救出的正文:

Flash插件坏了,没法上传dll文件
只好写笔记了
这是用dnSpy修改的修改笔记,dnSpy可以从https://github.com/0xd4d/dnSpy/releases下载,比如这是6.1.0版本的dnSpy:https://github.com/0xd4d/dnSpy/r ... y-netcore-win64.zip
由于代码众多,这里用翻页符号对不同代码进行分割

已知问题:
1、人物速度属性太高会造成卡顿
2、人物力量属性太高会在投掷手雷的时候卡顿
3、电脑有时会用CharacterProgression新建随机人物,所以修改时候最好不要直接对CharacterProgression下手这个是除移动与心灵控制外其他行动不消耗AP/意志点数
                  protected virtual void ApplyCosts(object parameter)
                  {
                            if (!this.ShouldApplyCosts(parameter))
                            {
                                    return;
                            }
                            if (!this.IsTacticalActor)
                            {
                                    return;
                            }
                            if ((base.Actor as TacticalActor).IsFromViewerFaction)
                            {
                                    return;
                            }
                            if (this.UsesActionPoints)
                            {
                                    this.TacticalActor.CharacterStats.ActionPoints.Subtract(this.ActionPointCost);
                            }
                            if (this.UsesWillPoints)
                            {
                                    this.TacticalActor.CharacterStats.WillPoints.Subtract(this.WillPointCost);
                            }
                  }
和平外交模式(需要改两处,一处保证正常外交关系都是向着有利于双方的方向进行,另一处保证如果外交的一方是玩家,保留扣分项免得大家没办法把结盟改成敌对——然而修改并没对派系之间的好感度生效,该敌对还是敌对)                public void ModifyDiplomacy(IDiplomaticParty withParty, int diplomacyChange)
                {
                        PartyDiplomacy.Relation relation = this.GetRelation(withParty);
                        if (relation == null)
                        {
                              throw new Exception(string.Format("{0} does not have diplomatic relations with {1}", this.Party, withParty));
                        }
                        relation.Diplomacy += ((diplomacyChange < 400) ? 200 : ((diplomacyChange < 600) ? (diplomacyChange - 600) : 200));
                }


                private void ApplyDiplomacy(GeoFaction faction)
                {
                        List<RewardSetDiplomaticObjective> setDiplomaticObjectives = this.SetDiplomaticObjectives;
                        if (setDiplomaticObjectives != null && setDiplomaticObjectives.Count > 0)
                        {
                              GeoLevelController component = GameUtl.CurrentLevel().GetComponent<GeoLevelController>();
                              foreach (RewardSetDiplomaticObjective rewardSetDiplomaticObjective in this.SetDiplomaticObjectives)
                              {
                                        GeoFaction faction2 = component.GetFaction(rewardSetDiplomaticObjective.WithFaction);
                                        GeoSite pointOfInterest = rewardSetDiplomaticObjective.PointOfInterest;
                                        if (pointOfInterest != null)
                                        {
                                                pointOfInterest.RevealSite(faction);
                                                this.ApplyResult.RevealedSites.Add(pointOfInterest);
                                        }
                                        faction2.Diplomacy.SetDiplomacyObjective(faction, rewardSetDiplomaticObjective.Title, rewardSetDiplomaticObjective.Description, pointOfInterest);
                                        if (faction2 != faction)
                                        {
                                                this.ApplyResult.FactionDiplomacyObjectiveChanged.AddNotContained(faction2);
                                        }
                              }
                        }
                        List<RewardMaxDiplomacyStateChange> setMaxDiplomacyState = this.SetMaxDiplomacyState;
                        if (setMaxDiplomacyState != null && setMaxDiplomacyState.Count > 0)
                        {
                              foreach (RewardMaxDiplomacyStateChange rewardMaxDiplomacyStateChange in this.SetMaxDiplomacyState)
                              {
                                        rewardMaxDiplomacyStateChange.Faction.Diplomacy.SetMaxDiplomacyState(faction, rewardMaxDiplomacyStateChange.State, true);
                              }
                              this.ApplyResult.ChangeMaxDiplomacyState.AddRange(this.SetMaxDiplomacyState);
                        }
                        List<RewardDiplomacyChange> diplomacy = this.Diplomacy;
                        if (diplomacy != null && diplomacy.Count > 0)
                        {
                              foreach (RewardDiplomacyChange rewardDiplomacyChange in this.Diplomacy)
                              {
                                        IDiplomaticParty diplomaticParty = rewardDiplomacyChange.Target ?? faction;
                                        rewardDiplomacyChange.Party.Diplomacy.ModifyDiplomacy(diplomaticParty, (faction.IsViewerFaction ? 600 : 0) + rewardDiplomacyChange.Value);
                                        this.ApplyResult.Diplomacy.Add(rewardDiplomacyChange);
                                        if (this.ApplySecondaryDiplomacyEffects && diplomaticParty is GeoFaction && rewardDiplomacyChange.Party is GeoFaction && diplomaticParty is GeoFaction)
                                        {
                                                this.ApplySecondaryDiplomcy(rewardDiplomacyChange.Value, (GeoFaction)rewardDiplomacyChange.Party, (GeoFaction)diplomaticParty);
                                        }
                              }
                        }
                }科研速度加快                private int GetResearchProduction(ResearchDef def)
                {
                        float num = (float)this.Faction.ResourceIncome.GetTotalResouce(ResourceType.Research).RoundedValue;
                        if (this.Faction.IsViewerFaction)
                        {
                              num *= 100f;
                        }
                        GeoFactionStatModifiers factionStatModifiers = this.Faction.FactionStatModifiers;
                        return (int)((num * ((factionStatModifiers != null) ? new float?(factionStatModifiers.GetResearchModifier(def)) : null)) ?? 1f);
                }飞船加强(似乎无效)
                public void UpdateBaseVehicleStats(GeoVehicle vehicle)
                {
                        if (vehicle.VehicleDef.BaseStats.SpaceForUnits != 6)
                        {
                              vehicle.Stats.MaximumRange = vehicle.VehicleDef.BaseStats.MaximumRange * (1f + this.ModData.RangeMultiplier);
                              vehicle.Stats.SpaceForUnits = vehicle.VehicleDef.BaseStats.SpaceForUnits + this.ModData.SpaceForUnits;
                              vehicle.Stats.Speed = vehicle.VehicleDef.BaseStats.Speed * (1f + this.ModData.SpeedMultiplier);
                              vehicle.Stats.MaxMaintenancePoints = (int)((float)vehicle.VehicleDef.BaseStats.MaxMaintenancePoints * (1f + this.ModData.MaxMaintenancePointsMultiplier));
                              vehicle.Range.Range = vehicle.Stats.MaximumRange;
                              return;
                        }
                        vehicle.Stats.MaximumRange = vehicle.VehicleDef.BaseStats.MaximumRange * (3f + this.ModData.RangeMultiplier);
                        vehicle.Stats.SpaceForUnits = 12;
                        vehicle.Stats.Speed = vehicle.VehicleDef.BaseStats.Speed * (5f + this.ModData.SpeedMultiplier);
                        vehicle.Stats.MaxMaintenancePoints = (int)((float)vehicle.VehicleDef.BaseStats.MaxMaintenancePoints * (6f + this.ModData.MaxMaintenancePointsMultiplier));
                        vehicle.Range.Range = vehicle.Stats.MaximumRange;
                }学习技能不消耗点数
                public void BuyAbility()
                {
                        if (this._boughtAbility != null)
                        {
                              this.ConsumeAbilityCost(0);
                              this.CommitStatChanges();
                              this._character.Progression.LearnAbility(this._boughtAbility);
                              this.ClearBoughtAbility();
                              this.RefreshStatPanel();
                              this.SetAbilityTracks();
                        }
                }生产速度加快      public class ItemManufacturing
......
                // Token: 0x06006161 RID: 24929 RVA: 0x0019512C File Offset: 0x0019332C
                public void Update()
                {
                        if (this.Current == null)
                        {
                              return;
                        }
                        ItemManufacturing.ManufactureQueueItem manufactureQueueItem = this.Current;
                        int production = Mathf.RoundToInt(this._faction.ResourceIncome.GetTotalResouce(ResourceType.Production).Value);
                        if (this._faction.IsViewerFaction)
                        {
                              production *= 100;
                        }
                        this.AddProduction(production, true);
                        if (this.Current != null && manufactureQueueItem != this.Current)
                        {
                              ItemManufacturing.ManufactureQueueEventHandler onItemStarted = this.OnItemStarted;
                              if (onItemStarted == null)
                              {
                                        return;
                              }
                              onItemStarted(this.Current);
                        }
                }增加基础属性不消耗点数,且增加属性的步长改成1000private int ChangeCharacterStat(CharacterBaseAttribute baseStat, int currentStatValue, int startingStatValue, bool increase)
{
      if (increase)
      {
                int num = 0;
                if (this._currentSkillPoints - num >= 0)
                {
                        this._currentSkillPoints -= num;
                        return 1000;
                }
                if (this._currentSkillPoints + this._currentFactionPoints - num >= 0)
                {
                        int num2 = this._currentSkillPoints - num;
                        this._currentSkillPoints = 0;
                        this._currentFactionPoints += num2;
                        return 1000;
                }
      }
      else if (currentStatValue - 1 >= startingStatValue)
      {
                int baseStatCost = this._character.Progression.GetBaseStatCost(baseStat, currentStatValue);
                if (this._currentFactionPoints + baseStatCost <= this._startingFactionPoints)
                {
                        this._currentFactionPoints += baseStatCost;
                        return -1;
                }
                if (this._currentFactionPoints == this._startingFactionPoints)
                {
                        this._currentSkillPoints += baseStatCost;
                        return -1;
                }
                if (this._currentFactionPoints + baseStatCost > this._startingFactionPoints)
                {
                        int num3 = this._currentFactionPoints + baseStatCost - this._startingFactionPoints;
                        this._currentFactionPoints = this._startingFactionPoints;
                        this._currentSkillPoints += num3;
                        return -1;
                }
      }
      return 0;
}修改最大属性限制                public int GetMaxAttribute(CharacterBaseAttribute stat)
                {
                        switch (stat)
                        {
                        case CharacterBaseAttribute.Strength:
                              return this.MaxStrength + 1000;
                        case CharacterBaseAttribute.Will:
                              return this.MaxWill + 1000;
                        case CharacterBaseAttribute.Speed:
                              return this.MaxSpeed;
                        default:
                              return 0;
                        }
                }一次任务满级                public bool AddExperience(int experience)
                {
                        this.ExperienceEarned += experience;
                        if (this.Level == this.Def.MaxLevel)
                        {
                              return false;
                        }
                        int level = this.Level;
                        this.Experience = this.Def.XPCap;
                        int num = this.Level - level;
                        for (int i = 1; i <= num; i++)
                        {
                              LevelProgression.LevelUpHandler levelUpCallback = this.LevelUpCallback;
                              if (levelUpCallback != null)
                              {
                                        levelUpCallback(i + level);
                              }
                              this.HasNewLevel = true;
                        }
                        return num > 0;
                }制造物品时候获得资源而非消耗资源public ItemManufacturing.ManufactureQueueItem ManufactureItem(IManufacturable item, Action<ItemManufacturing.ManufactureQueueItem, bool> itemAddedCallback = null)
{
      if (!this.UseFactoryManufacturing)
      {
                this._faction.Wallet.Give(item.ManufacturePrice, OperationReason.Purchase);
                AmplitudeWebClient instance = AmplitudeWebClient.Instance;
                if (instance.Enabled)
                {
                        instance.OnResourcesTaken(item.ManufacturePrice, "Manufacture");
                }
      }
      bool flag = item.GetCostInManufacturePoints(this._faction) == 0f;
      if (GameUtl.BuildInstant && this._faction.IsViewerFaction)
      {
                flag = true;
      }
      ItemManufacturing.ManufactureQueueItem manufactureQueueItem = new ItemManufacturing.ManufactureQueueItem(item, 0);
      if (flag)
      {
                this.FinishManufactureItem(manufactureQueueItem);
      }
      else
      {
                if (this.Current == null)
                {
                        ItemManufacturing.ManufactureQueueEventHandler onItemStarted = this.OnItemStarted;
                        if (onItemStarted != null)
                        {
                              onItemStarted(manufactureQueueItem);
                        }
                }
                this._queue.Add(manufactureQueueItem);
                ItemManufacturing.ManufactureOrderEventHandler onItemAdded = this.OnItemAdded;
                if (onItemAdded != null)
                {
                        onItemAdded(manufactureQueueItem, this._queue.Count - 1);
                }
      }
      if (itemAddedCallback != null)
      {
                itemAddedCallback(manufactureQueueItem, flag);
      }
      return manufactureQueueItem;
}经@十八文化 提醒,还有这个,新人随机7个技能,由于改这个的时候会dnSpy报错,修改时候或许需要改IL指令,看上去是删掉83行callvirt .........::get_MaxLevel后面的两行之后在83行之后新建一个指令dup
修改时候或许需要改IL指令,看上去是删掉83行callvirt .........::get_MaxLevel后面的两行,之后在83行之后新建一个指令dup
                public CharacterProgression(SpecializationDef specializationDef, LevelProgressionDef levelProgression, BaseStatSheetDef baseStatSheetDef, CharacterGenerationParams generationParams = null)
..............................................................................
                        AbilityTrack track2 = AbilityTrack.CreatePersonalAbilityTrack(new GameTagDef, levelProgression.MaxLevel, levelProgression.MaxLevel);
有空的可以研究一下怎么用AbilityTrack函数创建7个有用的技能(猛冲/吸雾恢复意志/鱼人的放雾/杀人恢复行动力/子弹带病毒/心灵冲击/自动显示15格内敌人位置)这个技术比较复杂,我只包教不包会      public CharacterProgression(SpecializationDef specializationDef, LevelProgressionDef levelProgression, BaseStatSheetDef baseStatSheetDef, CharacterGenerationParams generationParams = null)
      {
            this._abilityTracks = new List<AbilityTrack>();
            this._abilities = new List<TacticalAbilityDef>();
            this._baseStats = new List<int>();
            this._baseStats.Clear();
            int num = (generationParams != null) ? generationParams.EnduranceBonus : 0;
            this._baseStats.Add(baseStatSheetDef.Strength + num);
            int num2 = (generationParams != null) ? generationParams.WillBonus : 0;
            this._baseStats.Add(baseStatSheetDef.Will + num2);
            int num3 = (generationParams != null) ? generationParams.SpeedBonus : 0;
            this._baseStats.Add(baseStatSheetDef.Speed + num3);
            this.BaseStatSheet = baseStatSheetDef;
            this.SkillPoints = levelProgression.InitialSkillpoints;
            this.LevelProgression = new LevelProgression(levelProgression, 0);
            this.MainSpecDef = specializationDef;
            AbilityTrack track = new AbilityTrack(specializationDef.AbilityTrack, AbilityTrackSource.PrimaryClass);
            this.AddNewAbilityTrack(track, true);
            IEnumerable<GameTagDef> abilityFilter = new GameTagDef;
            int maxLevel = levelProgression.MaxLevel;
            AbilityTrack track2 = AbilityTrack.CreatePersonalAbilityTrack(abilityFilter, maxLevel, maxLevel);
            this.AddNewAbilityTrack(track2, false);
            List<AbilityTrackSlot> list = new List<AbilityTrackSlot>();
            DefRepository defRepository = GameUtl.GameComponent<DefRepository>();
            AbilityTrackSlot abilityTrackSlot = new AbilityTrackSlot();
            TacticalAbilityDef ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindCrush_AbilityDef", StringComparison.OrdinalIgnoreCase));
            abilityTrackSlot.Ability = ability;
            list.Add(abilityTrackSlot);
            abilityTrackSlot = new AbilityTrackSlot();
            ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindSense_AbilityDef", StringComparison.OrdinalIgnoreCase));
            abilityTrackSlot.Ability = ability;
            list.Add(abilityTrackSlot);
            abilityTrackSlot = new AbilityTrackSlot();
            ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("BioChemist_AbilityDef", StringComparison.OrdinalIgnoreCase));
            abilityTrackSlot.Ability = ability;
            list.Add(abilityTrackSlot);
            abilityTrackSlot = new AbilityTrackSlot();
            ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExtraMove_AbilityDef", StringComparison.OrdinalIgnoreCase));
            abilityTrackSlot.Ability = ability;
            list.Add(abilityTrackSlot);
            abilityTrackSlot = new AbilityTrackSlot();
            ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Heavy_ClassProficiency_AbilityDef", StringComparison.OrdinalIgnoreCase));
            abilityTrackSlot.Ability = ability;
            list.Add(abilityTrackSlot);
            abilityTrackSlot = new AbilityTrackSlot();
            ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Infiltrator_ClassProficiency_AbilityDef", StringComparison.OrdinalIgnoreCase));
            abilityTrackSlot.Ability = ability;
            list.Add(abilityTrackSlot);
            abilityTrackSlot = new AbilityTrackSlot();
            ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Priest_ClassProficiency_AbilityDef", StringComparison.OrdinalIgnoreCase));
            abilityTrackSlot.Ability = ability;
            list.Add(abilityTrackSlot);
            this.AddNewAbilityTrack(new AbilityTrack(list.ToArray(), AbilityTrackSource.Personal), false);
            this.Init();
      }代码如此,很可惜,这段代码并不能通过编译。
你需要在改这段代码的最开始(Ctrl+Home跳转到的第一行)粘贴这几行using Base.Defs;
using Base.Core;
using System.Linq;请注意,并不是每个技能都可以写进ability = defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("GrenadesTalent_AbilityDef", StringComparison.OrdinalIgnoreCase));里面的
另外,建议在贴好3个using之后用这种方式(或者第二页34#的方式)在(没记错是)AddSecondaryClass这个函数下添加技能:
                        DefRepository defRepository = GameUtl.GameComponent<DefRepository>();
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindCrush_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MindSense_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MotionDetection_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SenseLocate_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExtraMove_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Thief_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("BioChemist_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("AssaultRiflesTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("GrenadesTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("HandgunsTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("HeavyWeaponsTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MeleeWeaponTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("MountedWeaponTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("PDWTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ShotgunTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SilencedWeaponTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SniperTalent_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("IgnorePain_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertHealer_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertHeavyWeapons_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertLightWeapons_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertMelee_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertMountedWeapons_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertPacker_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertRunner_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("ExpertShooter_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("EnhancedVision_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("EagleEye_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("EagleEyed_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("DoublePerception_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Fishman_Regeneration_Passive_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("Regeneration_Torso_Passive_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("FastUse_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("AcidImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("FireImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("GooImmunity_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("PoisonImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("PsychicImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("SonicImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("StunStatusImmunity_AbilityDef", StringComparison.OrdinalIgnoreCase)));
                        this.AddAbility(defRepository.GetAllDefs<TacticalAbilityDef>().FirstOrDefault((TacticalAbilityDef itDef) => itDef.name.StartsWith("VirusImmunity_DamageMultiplierAbilityDef", StringComparison.OrdinalIgnoreCase)));BTW,第二页@ltcszk 给出了一个更漂亮的解法
(我并不会写C#,我都是胡乱玩的,专业解法参考这个是很不错的)

然而请注意,其实我们不能在.ctor那里改这些设置
电脑生成的NPC士兵也会调用这个.ctor
建议学双职业的时候加这些新技能
AI从来没有学双职业的。扫描到站点时候揭露站点内容(或许能借此避开“伏击”这种情况)                private void DetectSite(GeoSite site, GeoFaction owner)
                {
                        if (this.ScanDef.RevealSites && !site.GetVisible(this.Owner))
                        {
                              if (site.Type == GeoSiteType.AlienBase)
                              {
                                        GeoAlienBase component = site.GetComponent<GeoAlienBase>();
                                        if (component != null && component.IsPalace)
                                        {
                                                return;
                                        }
                              }
                              site.SetVisible(owner, true);
                              site.GeoLevel.View.OnScannerSiteReveal(site);
                              Action<GeoSite> onSiteRevealed = this.OnSiteRevealed;
                              if (onSiteRevealed != null)
                              {
                                        onSiteRevealed(site);
                              }
                        }
                        if ((this.ScanDef.InspectSites || owner.IsViewerFaction) && !site.GetInspected(this.Owner))
                        {
                              site.SetInspected(owner, true);
                        }
                }顺便附上扫描次数修改// PhoenixPoint.Geoscape.Entities.PhoenixBases.FacilityComponents.SatelliteUplinkFacilityComponent
// Token: 0x06005543 RID: 21827
public override void UpdateOutput()
{
      this.ScannerCapacity = 100 + (int)this.GetValueAfterAppliedModifiers((float)this.Def.ScannerCapacity, 0f, 1f);
      base.UpdateOutput();
}类似地,我们也可以修改能源——处于不明原因,基地经常会拉闸限电把总电量限制在20/30的样子——既然这么喜欢限电干脆把它改掉好了// PhoenixPoint.Geoscape.Entities.PhoenixBases.FacilityComponents.PowerFacilityComponent
// Token: 0x06005528 RID: 21800
public override void UpdateOutput()
{
      this.PowerOuput = (int)this.GetValueAfterAppliedModifiers((float)this.Def.PowerOutput, 0f, 1f) << 1;
      base.UpdateOutput();
}
先写这么多好了

其中不少代码我还没有测试

本来有部分代码昨天就能发出来的
结果flash插件把浏览器干掉了
而我没从其他地方记笔记……

��_____:) 发表于 2024-2-21 13:27

66666666,谢谢大佬恢复
页: [1]
查看完整版本: Mod笔记-抢救版