From 51afb56d355bc329657ab956d91887bf53fe1e1b Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Fri, 10 Feb 2023 19:05:39 +0800 Subject: [PATCH] MechaDronesTweaks 1.0.0 --- MechaDronesTweaks/MechaDronesTweaks.cs | 172 ++++++++++++++++++------- MechaDronesTweaks/README.md | 28 ++++ MechaDronesTweaks/package/icon.png | Bin 0 -> 25677 bytes README.md | 5 + 4 files changed, 159 insertions(+), 46 deletions(-) create mode 100644 MechaDronesTweaks/package/icon.png diff --git a/MechaDronesTweaks/MechaDronesTweaks.cs b/MechaDronesTweaks/MechaDronesTweaks.cs index ad01d3a..ae4e48c 100644 --- a/MechaDronesTweaks/MechaDronesTweaks.cs +++ b/MechaDronesTweaks/MechaDronesTweaks.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection.Emit; using BepInEx; using BepInEx.Configuration; @@ -36,9 +37,12 @@ public class MechaDronesTweaksPlugin : BaseUnityPlugin { MechaDronesTweaks.UseFixedSpeed = Config.Bind("MechaDrones", "UseFixedSpeed", MechaDronesTweaks.UseFixedSpeed, "Use fixed speed for mecha drones").Value; + MechaDronesTweaks.SkipStage1 = Config.Bind("MechaDrones", "SkipStage1", + MechaDronesTweaks.SkipStage1, + "Skip mecha drones' 1st stage (flying away from mecha in ~1/3 speed for several frames)").Value; MechaDronesTweaks.RemoveSpeedLimitForStage1 = Config.Bind("MechaDrones", "RemoveSpeedLimitForStage1", MechaDronesTweaks.RemoveSpeedLimitForStage1, - "Remove speed limit for 1st stage (flying away from mecha in ~1/3 speed for several frames)").Value; + "Remove speed limit for 1st stage (has a speed limit @ ~10m/s originally)").Value; MechaDronesTweaks.FixedSpeed = Config.Bind("MechaDrones", "FixedSpeed", MechaDronesTweaks.FixedSpeed, new ConfigDescription("Fixed speed for mecha drones, working only when UseFixedSpeed is enabled", new AcceptableValueRange(6f, 1000f))).Value; @@ -49,29 +53,94 @@ public class MechaDronesTweaksPlugin : BaseUnityPlugin MechaDronesTweaks.EnergyMultiplier = Config.Bind("MechaDrones", "EnergyMultiplier", MechaDronesTweaks.EnergyMultiplier, new ConfigDescription("Energy consumption multiplier for mecha drones", - new AcceptableValueRange(0.01f, 1f))).Value; + new AcceptableValueRange(0f, 1f))).Value; _harmony.PatchAll(typeof(MechaDronesTweaks)); } } -[HarmonyPatch] public static class MechaDronesTweaks { public static bool UseFixedSpeed = false; + public static bool SkipStage1 = false; public static bool RemoveSpeedLimitForStage1 = true; - public static float FixedSpeed = 500f; - public static float SpeedMultiplier = 5f; + public static float FixedSpeed = 300f; + public static float SpeedMultiplier = 4f; public static float EnergyMultiplier = 0.1f; + [HarmonyTranspiler, HarmonyPatch(typeof(UITechTree), "RefreshDataValueText")] + private static IEnumerable UITechTreeRefreshDataValueText_Transpiler(IEnumerable instructions) + { + foreach (var instr in instructions) + { + if (instr.opcode == OpCodes.Callvirt && instr.OperandIs(AccessTools.Method(typeof(Mecha), "get_droneSpeed"))) + { + if (UseFixedSpeed) + { + yield return new CodeInstruction(OpCodes.Pop); + yield return new CodeInstruction(OpCodes.Ldc_R4, FixedSpeed); + } + else + { + yield return instr; + yield return new CodeInstruction(OpCodes.Ldc_R4, SpeedMultiplier); + yield return new CodeInstruction(OpCodes.Mul); + } + } + else + { + yield return instr; + } + } + } + + [HarmonyTranspiler, HarmonyPatch(typeof(MechaDroneLogic), "UpdateTargets")] + private static IEnumerable MechaUpdateTargets_Transpiler(IEnumerable instructions) + { + if (SkipStage1) + { + var ilist = instructions.ToList(); + for (var i = 0; i < ilist.Count; i++) + { + var instr = ilist[i]; + if (instr.opcode == OpCodes.Ldc_I4_1) + { + var instrNext = ilist[i + 1]; + if (instrNext.opcode == OpCodes.Stfld && + instrNext.OperandIs(AccessTools.Field(typeof(MechaDrone), "stage"))) + { + instr.opcode = OpCodes.Ldc_I4_2; + } + } + yield return instr; + } + } + else + { + foreach (var instr in instructions) + { + yield return instr; + } + } + } + [HarmonyTranspiler, HarmonyPatch(typeof(MechaDroneLogic), "UpdateDrones")] private static IEnumerable MechaUpdateDrones_Transpiler(IEnumerable instructions) { - foreach (var instr in instructions) + if (EnergyMultiplier >= 1f) { - yield return instr; - if (instr.opcode == OpCodes.Ldfld && instr.OperandIs(AccessTools.Field(typeof(Mecha), "droneEnergyPerMeter"))) + foreach (var instr in instructions) { + yield return instr; + } + } + else + { + foreach (var instr in instructions) + { + yield return instr; + if (instr.opcode != OpCodes.Ldfld || + !instr.OperandIs(AccessTools.Field(typeof(Mecha), "droneEnergyPerMeter"))) continue; yield return new CodeInstruction(OpCodes.Ldc_R8, (double)EnergyMultiplier); yield return new CodeInstruction(OpCodes.Mul); } @@ -81,60 +150,75 @@ public static class MechaDronesTweaks [HarmonyTranspiler, HarmonyPatch(typeof(MechaDrone), "Update")] private static IEnumerable MechaDroneUpdate_Transpiler(IEnumerable instructions) { - var lastIsLdarg0 = false; - CodeInstruction lastInstr = null; - foreach (var instr in instructions) + var ilist = instructions.ToList(); + for (var i = 0; i < ilist.Count; i++) { + var instr = ilist[i]; if (instr.opcode == OpCodes.Ldarg_0) { - if (lastIsLdarg0) - { - yield return lastInstr; - continue; - } - - lastIsLdarg0 = true; - lastInstr = instr; - continue; - } - - if (lastIsLdarg0) - { - lastIsLdarg0 = false; - if (instr.opcode == OpCodes.Ldfld && - instr.OperandIs(AccessTools.Field(typeof(MechaDrone), "speed"))) + var instrNext = ilist[i + 1]; + if (instrNext.opcode == OpCodes.Ldfld && + instrNext.OperandIs(AccessTools.Field(typeof(MechaDrone), "speed"))) { if (UseFixedSpeed) { - lastInstr.opcode = OpCodes.Ldc_R4; - lastInstr.operand = FixedSpeed; - yield return lastInstr; + var newInstr = new CodeInstruction(instr) + { + opcode = OpCodes.Ldc_R4, + operand = FixedSpeed + }; + yield return newInstr; } else { - yield return lastInstr; yield return instr; + yield return instrNext; yield return new CodeInstruction(OpCodes.Ldc_R4, SpeedMultiplier); yield return new CodeInstruction(OpCodes.Mul); } - + i++; continue; } - - yield return lastInstr; - yield return instr; - continue; + if (instrNext.opcode == OpCodes.Ldc_R4) + { + if (instrNext.OperandIs(0f)) + { + var instrNext2 = ilist[i + 2]; + if (instrNext2.opcode == OpCodes.Stfld && + instrNext2.OperandIs(AccessTools.Field(typeof(MechaDrone), "progress"))) + { + ilist[i + 3].labels = instr.labels; + i += 2; + continue; + } + } + else if (instrNext.OperandIs(1f)) + { + var instrNext2 = ilist[i + 2]; + if (instrNext2.opcode == OpCodes.Stfld && + instrNext2.OperandIs(AccessTools.Field(typeof(MechaDrone), "progress"))) + { + instrNext.operand = 0f; + yield return instr; + yield return instrNext; + yield return instrNext2; + i += 2; + continue; + } + } + } } - - if (instr.opcode == OpCodes.Ldc_R4) + else if (instr.opcode == OpCodes.Ldc_R4) { if (instr.OperandIs(0.5f)) { - if (FixedSpeed > 59f) + if (UseFixedSpeed) { - instr.operand = 0.5f * FixedSpeed / 50f; - yield return instr; - continue; + if (FixedSpeed > 75f) { instr.operand = 0.5f * FixedSpeed / 75f; } + } + else + { + instr.operand = 0.5f * SpeedMultiplier; } } else if (instr.OperandIs(3f)) @@ -143,12 +227,8 @@ public static class MechaDronesTweaks { instr.operand = 10000f; } - - yield return instr; - continue; } } - yield return instr; } } diff --git a/MechaDronesTweaks/README.md b/MechaDronesTweaks/README.md index 47b4714..dcdefc5 100644 --- a/MechaDronesTweaks/README.md +++ b/MechaDronesTweaks/README.md @@ -4,5 +4,33 @@ #### 机甲建设机调整(FastDrones MOD的后继者) ## Usage +* Inspired by [FastDrones](https://dsp.thunderstore.io/package/dkoppstein/FastDrones/), but patching IL codes, consuming less CPU to reduce lags on massive builds especially blueprints' put. +* Does not affect current game-saves, which means: + * All values are patched in memory but written to game-saves so that you can play with normal mecha drone parameters while disabling this MOD. + * You can take benefit from this MOD on any game-saves after enabling this MOD. +* Config entries: + * `UseFixedSpeed` [Default Value: false]: + * If enabled: Use `FixedSpeed` for mecha drones, which makes related Upgrades not used any more. + * If disabled: Use `SpeedMultiplier` for mecha drones. + * `SkipStage1` [Default Value: false]: Skip mecha drones' 1st stage (flying away from mecha in ~1/3 speed for several frames). + * `RemoveSpeedLimitForStage1` [Default Value: true]: Remove speed limit for 1st stage (has a speed limit @ ~10m/s originally). + * `FixedSpeed` [Default Value: 300]: Fixed flying speed for mecha drones. + * `SpeedMultiplier` [Default Value: 4]: Speed multiplier for mecha drones. + * `EnergyMultiplier` [Default Value: 0.1]: Energy consumption multiplier for mecha drones. +* Note: This MOD will disable `FastDrones` if the MOD is installed, to avoid conflict in functions. ## 使用说明 +* 功能参考 [FastDrones](https://dsp.thunderstore.io/package/dkoppstein/FastDrones/),但主要对IL代码进行Patch因此消耗更少的CPU,尤其在大规模建造比如放置蓝图的时候可以大大减少卡顿。 +* 不影响当前游戏存档: + * 所有修改参数都在内存中Patch不会写入存档,禁用此MOD后可恢复正常建设机参数。 + * 启用本MOD后可以在已经游玩的游戏存档上享受参数的改动。 +* 设置选项: + * `UseFixedSpeed` [默认值: false]: + * 启用: 使用 `FixedSpeed`,固定速度,这将覆盖对应机甲建设机速度的升级数值。 + * 禁用: 使用 `SpeedMultiplier` + * `SkipStage1` [默认值: false]: 跳过建设机起飞的第一阶段(以大约1/3速度从机甲身上飞出,持续若干帧). + * `RemoveSpeedLimitForStage1` [默认值: true]: 移除第一阶段的速度限制 (原本大约有10m/s的限制). + * `FixedSpeed` [默认值: 300]: 固定速度。 + * `SpeedMultiplier` [默认值: 4]: 速度倍数。 + * `EnergyMultiplier` [默认值: 0.1]: 能量消耗倍数。 +* 说明: 如果安装了`FastDrones`本MOD会将其禁用避免功能冲突。 diff --git a/MechaDronesTweaks/package/icon.png b/MechaDronesTweaks/package/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1998c44e94216dc585842a54029f0d6f8681b0e GIT binary patch literal 25677 zcmcF~^-~+p^LLUakl+%m6ff@3;_j}+9ZG>x+&u&>PK%b}+Tz9Cb%7uCkJx4gdiBw*>;A82=Vi_p*2YqdasJ zWdK!UFLwVCU^{7bX#k)$5&PZ>@{fkODj9hI0C;`>o4_HLvbO+$&APIj^c!FE!=;-h zIWuE2?^YNnhG>G;8tEYy$HdDk&4?$&uY?@k%-uGA{A>L2Sz#ywry4%MF6SRcu=WppQ+VgIHd=6me_HKX};98v=EM3_O{-Ct+ju;nw(=@+u~2KzXB7k4r7 z8-R&ATo%-3eSgS`@?QJpa^!X{d2zHUG4tc}{rP=V>{Uwl8>~BW${_1?+63s6?^CCv z&?ZH%$TIU34VSd{qHOB1%{~ESb%_P>4UA`5KEcf73@Vo~4iCb*+~6VUX77Hsbe167 z<+OC1<|!;uI>)fZ3#YPR~i^NB_Te=wls2;H{2BD~^0 z#QpI*nt5u?hxFm9U`6L5OTNqS;*o8%de&`S?gMXse}7?ZehS{{+)NPG0Qs_Ej%D3Z z_}y%bp%40Tzd)1o)@8=S9FYGMQIN}d+d@CGI_t;6it;@Y;w9-GaP1etENy(4@mRv@ zf<{)|66yE9MhQ#f5gtH&s?JTBkBL3?m-)d@>9Nq36~jkO_5!d(%dlw94N9Jdb)b57plQez zvB5~oT|P^s*zvGG8hzWQ4WQwmUrc~w=0Azcca`rnkpj6xrJmkTpvWHD3PMaS9^~P@ z)o=$%xn$oXL4VQRuBIJ|I2=JY>94CKVif6?>w4o1^=5e<>PfH-7xvqt%NO!6g008S zeQ3z?{;@ymcs}-y1_H>rNuiICYMDycD}C{m66;=RqN!SrqP;qLoH&>|^dgN;hKfuL za-wjeMAv?tO|{VuXZr3>6x}>6%*+!t%%5+%{lL`^=I{Nwauz^#4|NMhiE4v}kNpH< zq(m5?Lh^v%u4+lc`(yUou}dX7a#C`l`=J60wsqhEGJP$!sRX&9e(P3A#jsc=nH5mGTszn@c1)=MGUV|0!f?x7(!U!?CTzC^v(=wx%p{Tq z*-XsBgA^wc$+Q7dtL3a@%Tl^PHB*d%w;bk8$b@_z%P#7WW75w&M9W+mH{xiR3s|!E zD_RRI?9e>hfpILPLonj%Kp;lif^F%NPMbyGt26)*Ui~Euuns4sNe1yXHWac6$H^oqYmmY(=w*4H!KiQp~s!cx6{ne3U zw=+*pB9&qhwUWq+s5hWJK|hf^Y!p;;Qxo7fhwU*RhhF$x%%^sn=m2Uww~9p?&JIA+ z5v-&QCYxNtegdHEbHmjMMpQt~c~xLrjZiDzrijxI`3(B?++r^bT?=~ zF!SA_)h6qWhz?h50W|UTW{qBsrQcOCTcQo5i}l6tsY}Yi-71f89~o}PlpmEx&i1XF7=8!X6#20@(;EwXWVmD7qmjH)U)eabHFl}0$Zet- zJFdcwjo^S60Dj_S(BJ12(0Es0E0~MISM1S$i6K0VJ%(3!C@z#H#1*0i>d4>!!b7CL zKg3DZ;Lm|0XPIsH9mga8ev4eeL!2%CG+PyWHz9MLP+?GHsuX>BX|oc5m6ENc9ZfZO zSn+zjmsri|sV!C_h%soMj>=a4pPJkbj7T|xIf(c;T>sLMKi4Aa(hrndwGij}(_+xW za-*6B{5MJ-XOO=*o~E1PcIGd?MO+JDk6F}(u4IY?UciueZyEAGHE{-;k> zJN&Va+Xa$F7k4pGv69#}viw=;3?8+Vb5HZCjde+8g`O__#NBPjlgQxc)xBpm$m6!y z&d#0vn9jmm^!9hn%im9i7lN^!HPJ*nJdv}Cw|0a-3L+$98WDEweG99$S|V`iNXUxr zjSfLTnY)st!|kg-+L~6I6DN2qvr#1=p=UFL(={U2%s5`TSsHUszJ#%-+cSk$Qc)Vd z6+F3Yfto$)XcSORsA+ylD4YF}JGNr+u657A`3AW+`_zbMVS0g%xp0VblUS2u@VD6Y znBDNO#yexWZ^u`SVhzi!F zbG7n3m`W$@Y$EtSgM~KgP>V;Y2|JPp7x|Fd9go<@K-je%$sgoBjIx);TvuR)MTtW4 zTkuB13%Lhps!Q63NK?e2v$<@YFtx%yy}Gd_`(eb9Mftb+H`_-Fh;YGZck3ZTo-enN!SJ zc(2-($#^197uu^v^C(5=fFG3 z(m)}z-jy{xOH-hM1Jpk(KK+poU(rI`u_R4NXQ|q(`$waHS2CU6=(YgoLqFse$vR|%mSRW|l>2QaBDnu(omA>%u*eVGR#};p!J$H@~KE;@d z5VR4H&YQqg2`o8yrpMjIX-ER_pP7!V)&pL@g^!}F?=|HsBstZAZx2fO3jmW8R3=Wp zkEuj*=c0l?F0|WbR}S7S)6YDOey4eg$kKXX;mHUt`soJ@SC7N=ZyW8qWDUw!i=G?~ zxTc-z`9kckA|>nxe#b~_!CU}t#Y8ksIo@bF5JD`4WGR{-2dZ!^H#f`K!?NBjGGGBd zTV`}=^%L{pD#_M~>{?QJsR84JF7DKu)=2U!3O)?gieis`|M58Zu%iEaCpq3OBA(=!MRyxi@{dbg|xRzPB-~f3NG-58Jc%;bf*ZIcB z;D`-!`1t^}=w)Z)&O$jpEd9}Djn!!+Yrh)*>5d-Qh`3ZRbH%^h(7iMG!{4~QTq+SR zurHg^Bc7Cd?n@2_;v-HLlKMw)mcJi6>*`EXxHvyzsx>C=5-Fvo5>z2im`K!pKQ+CFDY{mDcPu@+guO9C(oJVChBNeumg>xS z|CUHPiN~WN^ARdb%oY0DRV*kB=;{H>m zdi;=d`SPpp_72A9dTlQ9xZ6(wgy1RAb7@~WrzS%7sH0+DFD%(d+osfx>)9B7%)P8=hr;> z-BT?+Xi{4Hr7!k1ngCz2*rE*(Y4IAlqq|IS6Ca_MlCJpO)~n@R(j1+~&u;rz zQrjOK(9kZ7WgURYv6>i_!z^@sZp<`@8sX4D!_vciPxuaG)w%LBzD&}#hVcbq++W~B zI|I5YH~^YLDBmr*Dd>eOEr~yzWhi3}#vyUB;aJff4d8Ru0pf7|HfN}|Ve28omS+hi z?69et8Fzs?n6wuMnbk#SV%+6l3OUyklJifeH&B|nVY-cqu8eHZU62na=55WP?m9F^ zl;=dLvz`XVDbJW{=r5#j)Lu{G(!dW@qcW5HmJZr6($TD9p7S zE6;Ie>FhsiCL8u%?r}c8NmBo)xL5z=55!>-<<|AN{{(18(gWO)ssO7$-sR)S zf?HX|#={U>M%~&LiBwo?4Ln7PW6(a{u#Cs)d6xwP>P2DPN={beh_{AHz>6?XZd4&&~YH=&;JTm$1vSYouE-IhK zZ8GWjnLwVlWMV;@>X;qfu;)cktqinROQV;jn6-(zYB5&JIoEm;pJkxBJEWUB_rno? zovppv6x@cNvpXZ=iZboe^bhiaNuon~-rqbW7Ic})!3csMNOqbo)?SAi$WZNVIZB6% z<+7a%+B_BQl*imdT3lfBJn&*j6dVz-lYtcSd^+$|$C5JRQEx~1f~cwjrUZ_|?`Qry zk7Dr?OKY4A#EG|+NcHa+YHgDk%##kO?n^Ur?n10|86Uy**X%BxCeM_)r6sfK70S}< ztC^tejc`DI~3CTjSqaLrnRnOR`$k8mLGUJ%CAk2^YB{juh>< z*jY0kppdAOXSQgg9-^PS4V>2w@R8sXX#ANzjSlKakTiaqAW7puctKqKk(sbsc6oM7 zy_fR1RMu>O>w~Edb05Xs4XoWzs`HB2Hn407x!j2s4{%#700~XmAMGP5eh|gEOSnnM zDM1I)@(6rwY-ld-XBl4xeNLp!t-c`$+)lfRd{U4I#OvAd+FzabIBj`aG4k5$+Tbr& z=REW(0!u9@IgT0G8q<1f->jz`A}YlgG2pZTn9$gU43n~egWh+DCVL zADR=EpgAOTJj;?D;f~vanJA92aS83pmEoZd3qCY8tAAEZR!%ZYO&BBV02v%!43@5~ z{?_@Y<#C$ZyVLD1C|`LTr6RdtUA#p1RDan(Ag#Aj>s)eo2E?cSC8}55=}(yWkXq1X z{I|~b!G;lr5t#@=`w$NEH?DHh zInhVTxV=}cI_yo7KihRhr91z;3{jmBBz-8~%i7HHn`S;^z9+qlz7-Wb@(Bs&i`#5} zbpjmtd>W9)0e;iJk~9cn$|(?WcosnV!MI?GoC5nxt4u6rrUcgCA>EM>d??!&{e!H6 ze@<(p9&qvIcSP!+xEt0`p6c36JlczJ8k;kKXA(O3qJ3X@=xdbeHpS5Ci+{0;=9l~& z&0tg=-7v3fHkub&g4?3d@zX}aX8vef{AapV(w(Vi+o{}cP#i<3h=cdsY9G?-?NOJ< z&kxtdn$XBHNmXT-)(923*ruw5DKVIcBEdcip>ytc7GiwSphxo?f&E>hLcClPc#RKq zDh`@r(BeMaGT;*ps)%>R$UVH*;uDmpZaTrW!3`XS!Ys3kDkgFR!*Q~Mv2Z;t23iq0hTxj#9w-}M=NDQmJk+9#eOlS{QiN9;%7P9p z>2|y?BI9TWiLBqRR5R3PEV_<}Qsul(8)(gF!=Dj%Ecx>X+9 zaE#8^JuZ6TaR2)t;5>4)@bKJAi_U!mTar0rEr-l48@jH%;h3&Re2Hada`O8x`dwjp z#WQR5 znR&9%H)=c4B@d_8rZu~k?vR<4L-7aAtc5W~zLL

g&*m@Rd&~$cW@7i@!t`26fP* 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%0Aa5q`jYMau$TueW*M)KDiLA?phccj;}UEdgv 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 0e70068..1f81b26 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,8 @@ Batch build Orbital Collectors Universe Generator Tweak 宇宙生成参数调节 + +# [MechaDronesTweaks](MechaDronesTweaks) + +Some tweaks for mecha drones(Successor to FastDrones MOD) +机甲建设机调整(FastDrones MOD的后继者)