3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 4310|回复: 19
打印 上一主题 下一主题

[修改] 分享一下萌新发现的有效修改

[复制链接]

3

主题

89

帖子

130

积分

中级玩家

Rank: 3Rank: 3

贡献度
6
金元
1055
积分
130
精华
0
注册时间
2018-4-6
跳转到指定楼层
主题
发表于 2023-3-1 18:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 千古校长 于 2023-3-1 18:11 编辑

1.经验系数修改
OwnedByGravity.Game.Logic.XPManagement中的类名public class XPSystem里面有单位获取经验值的公式,位于方法名ApplyXPChange,它的代码是这样的
        public IEnumerator ApplyXPChange(LogicUnit unit, FactionId factionId, int delta, bool isLoading, bool isAiUpgrade = false)
        
{
            
if (unit.Properties.CannotGainExp)
            
{
               
yield break;
            
}
            
if (delta > 0)
            
{
               
if (isAiUpgrade)
               
{
                    
delta = Mathf.RoundToInt((float)delta * this.mDifficulty.Setup.Economy.XpGainMultiplier);
               
}
               
else
               
{
                    
delta = Mathf.RoundToInt((float)delta * (1f + unit.Properties.XPBonus) * this.mDifficulty.Setup.Economy.XpGainMultiplier * 3f);
               
}
            
}
            
(ref unit.Level.XP).Set(Mathf.Min(unit.Level.MaxXP(), Mathf.Max(unit.Level.XP + delta, 0)));
            
yield return this.ModifyLevelToMatchXP(unit, factionId, isLoading);
            
XPSystem.XPChangedCallback unitXPChanged = this.UnitXPChanged;
            
if (unitXPChanged != null)
            
{
               
unitXPChanged(unit, factionId, delta);
            
}
            
yield break;
        
}
其中
                else
                {
                    
delta = Mathf.RoundToInt((float)delta * (1f + unit.Properties.XPBonus) * this.mDifficulty.Setup.Economy.XpGainMultiplier * 3f);
               
}是我自己用的修改后的三倍经验系数(只限玩家),想要修改的话把里面的3换成你想要的数字就行(最好在1和10之间,不然我也不知道会发生什么事情)


2.战利品中金币和法力的系数(不影响材料掉落)
ChangeCurrencyEffect方法Apply中的公式是
        public IEnumerator Apply(WorldEffectContext context)
        
{
            
float num = 1f;
            
LootRollData lootRollData;
            
if (context.TryGet<LootRollData>(out lootRollData))
            
{
               
num += lootRollData.AdditionalLootDrop;
            
}
            
Faction faction;
            
if (context.WorldInstance.Factions.TryGetPlayerFaction(out faction))
            
{
               
CurrencyRewardDefinition reward = context.WorldInstance.ContentManager.LoadAsset<CurrencyRewardDefinition>(this.CurrencyReward, "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\Effects\\Effects\\ChangeCurrencyEffect.cs", 68);
               
if (this.Subtract)
               
{
                    
context.WorldInstance.CurrencySystem.Take(faction.Id, reward, HexPosition.Invalid);
               
}
               
else
               
{
                    
context.WorldInstance.CurrencySystem.Reward(faction.Id, reward, context.WorldInstance.DifficultyProvider.Setup.Economy.LootIncomeMultiplier * num * 6f, HexPosition.Invalid);
               
}
            
}
            
else
            
{
               
Log.Error("Unkown PlayerFaction", null, "Apply", "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\Effects\\Effects\\ChangeCurrencyEffect.cs", 80);
            
}
            
yield break;
        
}
其中修改
            float num = 1f;
或者
                else
                {
                    
context.WorldInstance.CurrencySystem.Reward(faction.Id, reward, context.WorldInstance.DifficultyProvider.Setup.Economy.LootIncomeMultiplier * num * 6f, HexPosition.Invalid);
               
}都是可以的
3.战利品中材料掉落的系数
OwnedByGravity.Game.Logic.LootTables中,类名public abstract class ALootItemEntry里面的方法Execute,它的代码是这样的
        public IEnumerator Execute(WorldEffectContext context)
        
{
            
SourceEntity sourceEntity;
            
if (!context.TryGet<SourceEntity>(out sourceEntity))
            
{
               
yield break;
            
}
            
AWorldEntity aworldEntity = sourceEntity;
            
Faction faction;
            
if (!context.WorldInstance.Factions.TryGet(aworldEntity.FactionId, out faction))
            
{
               
yield break;
            
}
            
float num = 5f;
            
LootRollData lootRollData;
            
if (this.UseLootChance && context.TryGet<LootRollData>(out lootRollData))
            
{
               
num += lootRollData.AdditionalLootDrop;
            
}
            
while (num > 0f && context.WorldInstance.Random.value <= num)
            
{
               
if (!context.WorldInstance.InventorySystem.TryChangeItem(faction.Id, faction.Inventory, this.SourceItem, 1))
               
{
                    
Log.Error(string.Format("Something went wrong in {0} for {1} with amount {2}!", "ALootItemEntry", this.SourceItem, 1), null, "Execute", "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\LootTables\\ALootItemEntry.cs", 63);
               
}
               
num -= 1f;
            
}
            
yield break;
        
}
其中
            float num = 5f;
是我自己用的修改后的五倍材料获取,但是修改这一项请慎重!因为





然后是我从大佬@liyun_1981那里听来的内容,在此鸣谢





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

1

查看全部评分

回复

使用道具 举报

1

主题

156

帖子

150

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1503
积分
150
精华
0
注册时间
2018-10-3
舒服的沙发
发表于 2023-3-2 08:56 | 只看该作者
研究出成果了啊,恭喜
回复 支持 反对

使用道具 举报

366

主题

1万

帖子

2万

积分

版主

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

贡献度
713
金元
253150
积分
28167
精华
0
注册时间
2009-2-18
QQ
硬硬的板凳
发表于 2023-3-3 21:49 | 只看该作者
等级上限跟 升级的特殊技能有没有研究出来呢
回复 支持 反对

使用道具 举报

0

主题

598

帖子

666

积分

超级玩家

Rank: 5Rank: 5

贡献度
0
金元
6658
积分
666
精华
0
注册时间
2010-10-9
冰凉的地板
发表于 2023-3-5 14:38 | 只看该作者
只能用IL指令修改吗 dnspy编译都失败了
回复 支持 反对

使用道具 举报

3

主题

89

帖子

130

积分

中级玩家

Rank: 3Rank: 3

贡献度
6
金元
1055
积分
130
精华
0
注册时间
2018-4-6
5#
 楼主| 发表于 2023-3-11 22:25 | 只看该作者
zc8526 发表于 2023-3-5 14:38
只能用IL指令修改吗 dnspy编译都失败了

是的,大部分方法都只能用IL指令修改,因为dnspy的反汇编似乎不是很靠谱
回复 支持 反对

使用道具 举报

347

主题

3393

帖子

8126

积分

游戏精英

南瓜刽子手~

Rank: 8Rank: 8

贡献度
1027
金元
40175
积分
8126
精华
0
注册时间
2008-6-9
6#
发表于 2023-3-22 01:34 | 只看该作者
千古校长 发表于 2023-3-11 22:25
是的,大部分方法都只能用IL指令修改,因为dnspy的反汇编似乎不是很靠谱
...

大佬有升级时获得技能数量的代码吗?找半天没找到...或像坛子里大佬那个升级可反复刷技能该怎么改~Thanks♪(・ω・)ノ
回复 支持 反对

使用道具 举报

3

主题

89

帖子

130

积分

中级玩家

Rank: 3Rank: 3

贡献度
6
金元
1055
积分
130
精华
0
注册时间
2018-4-6
7#
 楼主| 发表于 2023-3-25 23:20 | 只看该作者
zyzerg 发表于 2023-3-22 01:34
大佬有升级时获得技能数量的代码吗?找半天没找到...或像坛子里大佬那个升级可反复刷技能该怎么改~Thanks ...

在OwnedByGravity.Game.Logic.XPManagement.XPSystem.RollNextLevel这个方法内给state赋值成一个随机数,比如state = IntToUint.ConvertInt(UnityEngine.Random.Range(1, 100000));
升级的时候就可以重选技能了,如果要改升级时获得的技能数量,在同一个类的RollLevelUpChoices方法里面,  
    List<ValueTuple<ALevelUpEntry, int>> list3 = first.Concat(second).ToList<ValueTuple<ALevelUpEntry, int>>();
   
for (int i = 0; i < context.SourceLogic.Level.Progression.Asset.NumberOfProvidedRewards + additionalLevelUps; i++)
   
{
        
ValueTuple<ALevelUpEntry, int> valueTuple = context.Random.WeightedRandom(list3, (ValueTuple<ALevelUpEntry, int> e) => e.Item2);
        
if (!(valueTuple.Item1 == null))
        
{
            
list.Add(valueTuple.Item1);
            
list3.Remove(valueTuple);
        
}
   
}
   
return list;
改成
  List<ValueTuple<ALevelUpEntry, int>> list3 = first.Concat(second).ToList<ValueTuple<ALevelUpEntry, int>>();
    for (int i = 0; i < 你想要的数字; i++)
   
{
        
ValueTuple<ALevelUpEntry, int> valueTuple = context.Random.WeightedRandom(list3, (ValueTuple<ALevelUpEntry, int> e) => e.Item2);
        
if (!(valueTuple.Item1 == null))
        
{
            
list.Add(valueTuple.Item1);
            
list3.Remove(valueTuple);
        
}
   
}
   
return list;
推荐两个修改一起用,这样刷技能的时候方便一些,可以更快刷到想要的技能
回复 支持 1 反对 0

使用道具 举报

3

主题

89

帖子

130

积分

中级玩家

Rank: 3Rank: 3

贡献度
6
金元
1055
积分
130
精华
0
注册时间
2018-4-6
8#
 楼主| 发表于 2023-3-25 23:30 | 只看该作者
顺爷 发表于 2023-3-3 21:49
等级上限跟 升级的特殊技能有没有研究出来呢

等级上限跟升级特殊技能应该都是在XPsystem里面的,里面的代码不多,可以拿游戏原代码和论坛里面两个大佬的mod对照,你就知道怎么改了,但是这一块大家都没有做完善,会有各种奇奇怪怪的小bug(比如哥布林斗士可能会学到学徒小屋领域范围扩大,这个问题现在倒是解决了),还有会卡技能之类的(能学的技能都学完了,然后每个回合一直有让你去升级的提示),实现难度太大了,个人不太推荐修改这一块,等大佬做比较好
回复 支持 反对

使用道具 举报

1

主题

215

帖子

245

积分

中级玩家

Rank: 3Rank: 3

贡献度
2
金元
2368
积分
245
精华
0
注册时间
2010-5-18
9#
发表于 2023-5-30 23:46 | 只看该作者
就想改升级选项数量和刷技能,在你这完美解决,感谢
回复 支持 反对

使用道具 举报

24

主题

1363

帖子

1644

积分

游戏狂人

Rank: 6Rank: 6

贡献度
6
金元
16204
积分
1644
精华
0
注册时间
2016-2-4
10#
发表于 2023-11-4 23:55 | 只看该作者
改战利品掉落倍率时不知道为什么上面那几串……橙色(?)的RVA后的代码数字会自动抹掉,然后游戏就无限加载不能进入地图
回复 支持 反对

使用道具 举报

6

主题

1106

帖子

1269

积分

游戏狂人

Rank: 6Rank: 6

贡献度
9
金元
12332
积分
1269
精华
0
注册时间
2010-9-13
11#
发表于 2023-12-16 13:22 | 只看该作者
测了一下,楼主的都有效。感谢
回复 支持 反对

使用道具 举报

6

主题

1106

帖子

1269

积分

游戏狂人

Rank: 6Rank: 6

贡献度
9
金元
12332
积分
1269
精华
0
注册时间
2010-9-13
12#
发表于 2023-12-23 19:58 | 只看该作者
AlchemyProductionEntry;HireUnitProductionEntry;NecromancyProductionEntry;        RoomExtensionProductionEntry;        RunesmithingProductionEntry

这几个方法里面的GetDuration里面改为return1就能将制造时间全部改为1
回复 支持 反对

使用道具 举报

6

主题

1106

帖子

1269

积分

游戏狂人

Rank: 6Rank: 6

贡献度
9
金元
12332
积分
1269
精华
0
注册时间
2010-9-13
13#
发表于 2023-12-25 22:57 | 只看该作者
收获倍数的修改在:Game.Logic.Effects.Effects下的HarvestLocationEffect里面的Apply里面有个lootRolls,原始值应该是2,然后10倍就是+8
回复 支持 反对

使用道具 举报

6

主题

240

帖子

351

积分

高级玩家

Rank: 4

贡献度
0
金元
3508
积分
351
精华
0
注册时间
2015-9-11
14#
发表于 2023-12-25 23:59 | 只看该作者
feiyu_wind 发表于 2023-12-25 22:57
收获倍数的修改在:Game.Logic.Effects.Effects下的HarvestLocationEffect里面的Apply里面有个lootRolls, ...

    int lootRolls = this.NumberOfRolls;
   
ALogicEntity permanentEntity = context.WorldInstance.WorldGrid[stack.Position.PermanentEntity;
   
WorldEffectContext effectContext = new WorldEffectContext(context.WorldInstance, null)
   
{
        
new SourceEntity(stack),
        
new TargetPosition(stack.Position)
   
};
   
LogicLocationEntity logicLocationEntity = permanentEntity as LogicLocationEntity;
   
if (logicLocationEntity != null)
   
{
        
WorldLocationEntity worldLocationEntity;
        
if (!context.WorldInstance.VisualEntityRepository.TryGetVisual(logicLocationEntity, out worldLocationEntity))
        
{
            
yield break;
        
}
        
effectContext.Add(new LocationEntity(worldLocationEntity));
        
if (context.WorldInstance.FactionProvider.IsLocalPlayer(stack.FactionId))
        
{
            
context.WorldInstance.Research.Trigger<HarvestResearchEvent>(new HarvestResearchEvent(worldHarvestSkill.ValidProperty, logicLocationEntity.DefinitionReference));
        
}
        
yield return context.WorldInstance.ForgetEntity(worldLocationEntity);
   
}
   
if (this.LootTags.Any())
   
{
        
int num;
        
if (stack.Units.Any((LogicUnit u) => u.Properties.IncreasedHarvestYields.Any((IUnitModification.Modifiers.IncreasedHarvestYield y) => y.ApplyToLoottags.ContainsAny(this.LootTags))))
        
{
            
num = lootRolls;
            
lootRolls = num + 1;
        
}
        
for (int i = 0; i < lootRolls; i = num + 1)
        
{
            
yield return context.WorldInstance.Loot.RollLoot(effectContext, this.LootTags, faction.Definition.Asset.FactionTags, null);
            
num = i;
        
}
   
}
   
yield break;
}



大佬请问是把num+1改为num+10的意思么
回复 支持 反对

使用道具 举报

6

主题

1106

帖子

1269

积分

游戏狂人

Rank: 6Rank: 6

贡献度
9
金元
12332
积分
1269
精华
0
注册时间
2010-9-13
15#
发表于 2024-1-1 13:22 | 只看该作者
本帖最后由 feiyu_wind 于 2024-1-1 15:39 编辑

再做个备忘:Game.Logic.Locations里面的,下面的修改敌我都有效
ILocationModification类的operator方法
LocationProperties类的Update方法
可以修改全局的数据,可修改的有;
AdditionalInfluenceRange :领域距离,在ILocationModification里修改,+1=+1倍范围,在LocationProperties里修改+1=+1,下同
AdditionalLocationMiningTicks:资源持续时间
ReputationIncome:所有资源自带声望(原本没有的也会带)



回复 支持 反对

使用道具 举报

6

主题

1106

帖子

1269

积分

游戏狂人

Rank: 6Rank: 6

贡献度
9
金元
12332
积分
1269
精华
0
注册时间
2010-9-13
16#
发表于 2024-1-1 15:43 | 只看该作者
本帖最后由 feiyu_wind 于 2024-11-17 10:28 编辑

备忘:
1、主城移动速度
Game.Logic.Locations里
ILocationModification类的operator方法
LocationProperties类的Update方法
AdditionalSearchRange:移动速度,下回合生效
2、学徒小屋领域范围
Game.Logic里面
Lodge.Memory里的                private void LodgeLevelChanged(LogicLocationEntity lodge, int previousLevel, int newLevel)
updater.AddModification(lodgeLevel.Modifer);拷贝多做几次,做一次额外+3。已经生效的技能,不需要重建小屋(不需要重新升级)
3、特殊物品获取(1个那种)
Game.Logic.Inventory方法中,InventorySystem中TryChangeItem
if (content.Asset.IsStackable)
   
{
        
item = content.Asset.Create(content, quality, amount * 1);//这里用* N,可以翻倍,需要用IL语言,largi4  n;mul两行
        
inventory.Items.Add(item);
        
InventorySystem.ItemChangedCallback onItemChanged = this.OnItemChanged;
        
if (onItemChanged != null)
        
{
            
onItemChanged(factionId, inventory, item, amount);
        
}
        
return true;
   
}
4、梦通过战斗升级,次数加倍的地方:
Game.Logic.Inventory.Levelable.Conditions中的AcounterIncrementCondition方法中的
protected override void ModifyAmount(in TMessage message, ref int counter)
        
{
            
if (this.ShouldCount(message))
            
{
               
counter ++;//这里改成+n就是战斗胜利加多少次,其他的计算条件类同
            
}
        
}


5、对于类似恶魔皮等唯一装备类的修改
Game.Logic.Inventory方法中,InventorySystem中TryChangeItem
    for (int i = 0; i < amount; i++)
   
{
        
item = content.Asset.Create(content, quality, amount);
        
inventory.Items.Add(item);
        
InventorySystem.ItemChangedCallback onItemChanged2 = this.OnItemChanged;
        
if (onItemChanged2 != null)
        
{
            
onItemChanged2(factionId, inventory, item, amount);
        
}
   
}
这里直接修改amount的,IL编辑如下方
112        0125        ldloc.3
113        0126        ldarg.s        amount (4)
114        0128        blt.s        86 (00EF) ldloc.0
修改为,可以把唯一装备复制80次
112        0125        ldloc.3
113        0126        ldarg.s        amount (4)
114        0128        add
115        0129        ldc.i4        80
116        012E        blt.s        86 (00EF) ldloc.0


6、无限招募学徒
Game.World.WorldHeroesSystem方法下PlayerCanEmployMoreHeroes方法和HasFreeApprenticeSlots方法改成下面的内容


        public bool PlayerCanEmployMoreHeroes(int progession)
        
{
            
return this.mFactionProvider.GetPlayerFaction() != null;
        
}
        public bool HasFreeApprenticeSlots()
        
{
            
return this.mFactionProvider.GetPlayerFaction() != null;
        
}
IL指令为
0        0000        ldarg.0
1        0001        ldfld        class [OwnedByGravity.Game.dll]OwnedByGravity.Game.World.WorldControlledFactionProvider [OwnedByGravity.Game.dll]OwnedByGravity.Game.World.WorldHeroesSystem::mFactionProvider
2        0006        callvirt        instance class [OwnedByGravity.Game.dll]OwnedByGravity.Game.Logic.Factions.Faction [OwnedByGravity.Game.dll]OwnedByGravity.Game.World.WorldControlledFactionProvider::GetPlayerFaction()
3        000B        ldnull
4        000C        cgt.un
5        000E        ret



回复 支持 反对

使用道具 举报

24

主题

1363

帖子

1644

积分

游戏狂人

Rank: 6Rank: 6

贡献度
6
金元
16204
积分
1644
精华
0
注册时间
2016-2-4
17#
发表于 2024-2-21 17:31 | 只看该作者
傻傻的野兔 发表于 2023-11-4 23:55
改战利品掉落倍率时不知道为什么上面那几串……橙色(?)的RVA后的代码数字会自动抹掉,然后游戏就无限加载 ...

谁会整战利品掉落了和我说说吧,改了后直接无限加载了啊啊啊
回复 支持 反对

使用道具 举报

1

主题

43

帖子

114

积分

中级玩家

Rank: 3Rank: 3

贡献度
3
金元
1020
积分
114
精华
0
注册时间
2018-8-25
18#
发表于 2024-6-8 18:06 | 只看该作者
千古校长 发表于 2023-3-25 23:20
在OwnedByGravity.Game.Logic.XPManagement.XPSystem.RollNextLevel这个方法内给state赋值成一个随机数, ...

感谢,有用


回复 支持 反对

使用道具 举报

1

主题

43

帖子

114

积分

中级玩家

Rank: 3Rank: 3

贡献度
3
金元
1020
积分
114
精华
0
注册时间
2018-8-25
19#
发表于 2024-6-8 18:09 | 只看该作者
zc8526 发表于 2023-3-5 14:38
只能用IL指令修改吗 dnspy编译都失败了

我是直接打开了Managed下的所有dll,然后再编辑那个GAME.dll后,编译就没问题,只打开GAME.dll编译就会失败
用的github下的dnSpy-net-win64 6.1.8版本
回复 支持 反对

使用道具 举报

6

主题

1106

帖子

1269

积分

游戏狂人

Rank: 6Rank: 6

贡献度
9
金元
12332
积分
1269
精华
0
注册时间
2010-9-13
20#
发表于 2024-10-22 20:53 | 只看该作者
wang19941110 发表于 2023-12-25 23:59
int lootRolls = this.NumberOfRolls;
    ALogicEntity permanentEntity = context.WorldInstance.W ...

是的,这里+N就等于N个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2025-4-13 00:54 , Processed in 0.128982 second(s), 18 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表