From a05d8cc9a4e4f455097967e3a50147d220e5203b Mon Sep 17 00:00:00 2001 From: Arnaud Jamin Date: Mon, 13 Jan 2025 03:06:41 -0500 Subject: [PATCH] Replace CogAbilityCheat window with CogEngineCheat window CogEngineCheat window relies on an Execution to execute the cheat which can be extended. One implementation is implemented in CogAbility which applies an effect on the selected target (same logic as the previous CogAbilityCheat window) --- .../Debug/Cheats/GE_Cheat_MoveSpeed.uasset | Bin 0 -> 19068 bytes .../Core/Debug/Cheats/GE_Cheat_Speed.uasset | Bin 17108 -> 0 bytes Content/Core/Debug/DA_Debug_Ability.uasset | Bin 13706 -> 14077 bytes Content/Core/Debug/DA_Debug_Engine.uasset | Bin 4664 -> 10776 bytes .../CogEngine/Private/CogEngineDataAsset.cpp | 18 + .../CogEngine/Private/CogEngineReplicator.cpp | 23 + .../Private/CogEngineWindow_Cheats.cpp | 485 ++++++++++++++++++ .../CogEngine/Public/CogEngineDataAsset.h | 65 +++ .../CogEngine/Public/CogEngineReplicator.h | 6 + .../CogEngine/Public/CogEngineWindow_Cheats.h | 90 ++++ .../Source/CogAbility/CogAbility.Build.cs | 4 +- .../CogAbilityCheat_Execution_ApplyEffect.cpp | 111 ++++ .../CogAbilityCheat_Execution_ApplyEffect.h | 24 + .../CogAll/Source/CogAll/Private/CogAll.cpp | 6 +- 14 files changed, 828 insertions(+), 4 deletions(-) create mode 100644 Content/Core/Debug/Cheats/GE_Cheat_MoveSpeed.uasset delete mode 100644 Content/Core/Debug/Cheats/GE_Cheat_Speed.uasset create mode 100644 Plugins/Cog/Source/CogEngine/Private/CogEngineDataAsset.cpp create mode 100644 Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp create mode 100644 Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h create mode 100644 Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp create mode 100644 Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h diff --git a/Content/Core/Debug/Cheats/GE_Cheat_MoveSpeed.uasset b/Content/Core/Debug/Cheats/GE_Cheat_MoveSpeed.uasset new file mode 100644 index 0000000000000000000000000000000000000000..511705b410bb1e3f6ec122515541d287cceec519 GIT binary patch literal 19068 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 S^Pwqoy6yXq)C>Ut{r>^zHPq_> literal 0 HcmV?d00001 diff --git a/Content/Core/Debug/Cheats/GE_Cheat_Speed.uasset b/Content/Core/Debug/Cheats/GE_Cheat_Speed.uasset deleted file mode 100644 index a7f64766b6c2d2d76de1a81edca23e814a0608f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17108 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 E18OhR%m4rY diff --git a/Content/Core/Debug/DA_Debug_Ability.uasset b/Content/Core/Debug/DA_Debug_Ability.uasset index 4f0a77dc77d42215787c440997bde373285a26cf..36ddae4efa00c48c1779c5870430024c78feefa3 100644 GIT binary patch literal 14077 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 literal 13706 zcmds833wDm7A{0U5SGgzBGDiULST{*B19BsGC6^SkV(KV9-))zOj_nhx_c6WSHOsT ztGl8BMOM@WRAkvtS3EvGRuPt{Tq=vmdTgcfM-oa1)bo%t^DQyYqbO9mXLWv2BS-lgdG*56Y-?_EdvJc-r*rga~S8XeO z;*ALdmgaWoH~0OSFH1v!cBtmXeP3qHJ$CWOX^U*DaxK>a?N}ecLYa~$dE^wkPnA=$ zid)ee0RxgCKhTCgl0{t!=?9M^Mx^Bq8yChi=Rdl$X+crx8m}8 zWUp>1l3kLn)XU^q&yhtj5inK?MKoCIHuMbg$d+`;V)OX?UY$JM=a3hNHdm3|&SFWg z2@GQ1<@fZ#Ay{dAeCSAK@=FVGjCf6{w1`QZ!edUR2 ztS)eQ!S9_QN+a*(t2g2x7kD*Y^6G~9G@_08ZZbm0gG@;^rqd;ME%!p86-v`c-+Kn$ zgwqI~lbG=8%!1?C1W68E@+e-3EE+#`KF&#?F;sEsl_?z!ilbJRouu;Am8%#h-s;ei zZmm?1;w9hD*fNgd6|aHs+6b}R@rF_|eF4%`cU%iZjoMa&Vb@Q?*GU#{*uV|fx z#-o0enK<&JF6<>RQZtWUG!{pS&lAHSI4Vc$Utf>Yp-A@Ys^m5*49lE!4N9PFeO{Ry zYuie-nNWE<%)|g=+b1gyCPMRKa8Gc=@xCg_txSix=<}jBTCG%t4&OK%r5DSprf53! zg%8LZ$Ct0bsgEwGk?zw@rc)f7t3fT-cV69sIAidauHKl4T`ZC7{0blPu36&}5aIw0 zWU{enaXq@NL)Nnz?ULIqtA&!wtLT2GjNNv1gf9Jhkc~L^IPb-$*nRz}^k1 zb+dQTY3R_^K=((jQLn}^0-8U>Dyig&lgJMw(J{GUTKgB#eQ4-_#uyqjk~q)N2B$ft zYNTOD#y8yquPne|Y__aew**_4f%+D^3PH@T%A{NVjD0u>DK%eKeI()JGjp&{MpRjp znznQxys;&*MpC6J9R?t!!U4~+vmzy{xWdlKq)=X|gusI(eNAw&r)1u-n{!44;BI2VH!An4PN5y`N*mPVl6bC9O*mxA>0K-t^Qnht_)i( z{^po?sStM>gWIgFJrvh6oO@mktcPURqkE?cStiftBy-p&Z8=GP4mR{4G z9BZT^+XR;oTeq}AAu-T|$0_fd3pdBKP^1_mD1N*$X}B1i8g$dUcOA#2A;nRpDz!Rn ztNBifSpIpu7e?xkDu?8$g}|F!vu4jFVKu5;W-J=yr-GrQF4R_UjsqH?8xt97dP*nShqb_<2=rca@9#*p;=*b8 zgNn8r%AH|aL7)Tj_)i}EG>i{g4d@HIcU;mdRB|wQLGA4~ciI}(3d0o8`;@h)Vfq>Y z32L5vXhQF>78rVfJ~pFk-!Oe?kb#N?kLRU_SK#c2iaQUsMsR|_0rbX4^M)~vBOM=V zlNQ*@={A>#g@B7go-%Gzzj8j*c>W z9>z*6B5|Jq&Le=^130e$Za3h30=Qj(s};cQ1YDf}ZU^900oLmjG@H z;O-W{y$`s11aR*Gu1Ns*F5qUwz)6f&&C1Pya|z%!0j@?6rwHP17sO2!z-HT%#tGua3*rg|aYcf-34*v{LEJ<^T!|pgA&4s##FYu+CJEvu3*v4P z#FY!;ZWhGdB8aQpc_=< z*Uet=Dy$!CfLGjRsSQ+M#ssXwcp+_H1g#l~kS>61qfdk+WUvP)Liq)$##1c*xa&Iw z6+c2g4jI3KoP>M=^0$z`hx`rXqmX}rd<61$kbi)D4D!#Azk+-a@*&8FA%6`S6G}yW z*28luESk<>tc1uTPN@Zt^6;F$OzaPb8FlXotXOGl#(ezRlWXH40k zi<_~*TU(m&g2K2oH06U~!i*1|-)KU;_!-~4XBchFScUb>j@Ou`8ezaPV-wah>f~$ZT zmvBSV+fq|LxRP)_{g_?(bT7lm4arJ>;Rh=?h!c|-NZ8u~zz)ET-4vUuhl?CnFRsJU zD{xabxK0YOq4(UTY;dVHV-wabcF}9f2-j=Q=sGY1CT{gzY)V=w6@DVMxNn17|Fz82vEeXKzeA=F>e0-jZVa0{V}`k15?K z0{y3z+&F_+rInR@lPIhrw<>KPsawF^7?leW5yVtIwP$Z0AeJ#f{78<6Zd48tn@cHU*hf& z>gLS3@sYWgjMkc(M)N@wX0YJ#%SQ8zn+-m$kuDSPEtJ4NszmyX#?%%zYfP?jO?o2} zaUh=4U?uNJq|?-&t&U+UY+>+^4&thre70&v`q8gcGx*^vuA0}Lt(uXJ#P36eN1V@a zLa)?~KOzwDq|s-qD3@bp4Y^;&^`!J2{l{E1Y1<9ZX3Tl>r0@+1{d^edM|DhTVXMaA z8F$>VhnV)q^CGM?^CEsvFRWqM4jjFRc08_2K&PqnJ6ZtmM)A><{+67zaLsFJSLcJFL%Pn%h|=-yprh&{jsL+Yt`p z#3lv`Ol=P4C0|3ME*-9C2-7VwUSADmpx&(Hx{*%X``^&ktP<(G%ck;&u-2yX@#^ec z@pBJ1CiM~e*L7Ditd*7L?!^51mCtB)ypBF5fxS*=Mu_E`%gY%(sz7dB zLK3UBvXa}(v@zn&Ic_#L;juB=Q@BmLFf9lgH}H3iznxuk82|HUS1uumNwTu?eA%^W zOf%RNbEsXjBBU;6ans7^1SdNOaiW)j0vmr0<|X%lsJPaHA^1wcJL_TdmP?>wIfxTS zG7#UXa%q9mG+JY{AYvbafpf5R5kjqAuu9Hh`^d`FiVjt`LfK|bSuOYXzkGONN$pa&A#n>FTr&> zoy;(8aMZCDuz%>Z7N#>or!qMGkrpOxsnn@X9j$;^v5-9z zRlTpa_;%v${}f|0=({AUwDXd%s_~K(*j9E2lLF1 zk;?K=RX7}~2v>#5Dk`h0Dk{q7SBJvY<)u}j^0IOVJb|uuev+{}tj?2f7ESCc^o>u9 zJ`=X@994ICZRok850o44WBq^K^rt=fzu2*4`@%!Jj?BE22i=eZLq^lz2zK@-%dRV+ zyP~31k;fVZ_t~Ta({?7{=8lbVErPCQfJi{PU}CB=&NOBt;7gS(Czg?P%hy zq`+efr!6=tZd3}j3nLHaLx|}*$63|K_V!I9cD>THL22d7)g~n#dq9C+$k3BY6K4fR zYBQcrJ=gS@Zt%1X`>*WY3me41#o%-{wfpNG7?0rT?8|DgAs~k4XkFB!&4e)xhSt$! zIP7_B`}>$b*1Ty`G^NQPoh4z79$tsWOG`rajm`~wB24XOq8_ zYpRefF4z&}z^{FALMCu!tV=oiv(KgFrRTYb9=#+QX%ttDp;#;1wypc8b7a6_RgE{R z8xt%s@w@wOlk1@y>|EjMM_tbFH>O5urzg#JHQaNPl=O(Ar`U+!C(q83u_fB3k}=00 zKe<85Gf}mfZGHYjP0Es`T#2(&FaLZr(%qos>UDZud%LW0Ze&v*+Iw2c`3>y~+5gD* z*QVrz8yyLDFdVIwTCDmGtw~LUThckY8vdn}Tm0KAQ!t6UFbm}oIgiB(W@;=GFml>Sh` z3=E!fvSpn)1)X%-Se;D9Q+BfLd2k!X^YHH>`WzUB<8Xkrn2`LT!J$dH36MEoZv zs6t{ZxS`-dvEHs{w|s&a*6PLd=;q1jXx%%wC+^t6=Mo=OY<{sbRECsT*XU!D7k8R) z^Q^|9aQ`A)sRZs6;mRa%|0GB+~*~5ZxL>h1nxND z?v%j2Nw_aa;Qmgy#S*wT2zQqR?ik^gNZ?*4T(t!5DB(g9xFduMOW+O@t|ki(9@T z(?@$F8Tw8KtPi!Hdwd0ULhu?*_rozhyvMrr-5IdHe2>1Cfc0TB#XY|71gsAgt6Sf5 z0qetjaqH_1SReKY-TKDa3lZ_XG#v3ciiEoLEeKfO7>~Yn0qeWoqwnE>_2J#Z?ayBZ ztPi@}`rZmyANCpD`o`J?5b?cqwek6H&l*x`2}I6LAh8iuv z7}g}a&VFjP#iTFDw&ka}=G9R8;IE(v_V{c^Aa!}SBGynn{j{~jqH8vc*o8~)*qA#r z#aZ?{kUJni?0$qg63uZg-m!_ru>YZ}(CCma z@{%<2qBQcnH1e!8@;}nZ_oR{i(ny?<$@%lY(#Q+a$p1+r&q*V%NF(3%B1MEzWFh~6 zFhOya1j4l)p}2O_H;|Ok3B?fz`*b#8A~LK>_8}0m1;|eeR%nn{%iGuvK)7eq0tF2A zV|QMtr0YSm2O?oB$UQI=ks!3Y)gm%Tau;p3q(64JWHUo#TG%O0Abjn>&;zwY2!|uh zvkhNEQ0)b3h*;_16?<>l|KY%&f!g9coG{LNe0_po2-FS{I0$6yMNcHTzn-(ZFXYK`-Z8gS6#>lI9~Yh(vbvwZEq6bsZ2C$Hf=*4GRq=0MF5!ZBF$xX#xQ zm^*BSSXJ^>FBG>Uy&_VxWoS_^!C%&~rteTNjA0u}HcOmP7iYx2cEI3kV~03N_O$~I zf!g6b8SAv)*Ah5x*en@pH5W<{^{Z7a-Yg1uy1D9joP?6XuRL;etcDyvAvIT zXpoSeMBLCnJa+sV0W^a?Ie$^vL%;F--o>3=#f$#< YGGfZRGu8R#f_p~2aA5X4NF)OO|DD(%wkLrA4%_x2%Luu>5Dq3i8-?B2TUUGKdME+(WA z9~gp3qeu*oh+<5o1_(rHfB-=V8k$H*6eRJ75)vCV5Rul3)bq`~vt5?mw%d4;>CBw- z%{en?&N*|pCpXUB)!E(M{o)YDMh#}{8ug$-)P4`_zw)d1{Triy%=_4Lq#}1V@rI9L zY&!L>N_7o)DZ0U3WxO_0?<({7#K2b`s@FoCAdJnYRtrr;*N52)%M0_pMT+7rP>Q_n zg2JMrf`a_VJYL0A5(9>&HviI;?c-ribN z@Kj*?cN@B$vKWd_l_WtEmaA>q6xr%ZRcJZEU5pE>2cy=#emcsr}FeVL=b- z25V{J^`pr`xuWQ7Qh-K=cuS7UHc*r}#{vfUFeYxhY;AZluU)2r7-Sxcn21)%}pvpk^r$#Cno+1JKO z9yy^_3u@%=-KPQ{%8jnljbL3_G^DQ4{A}~8%*#@@5Y$+zMf}(I9R2{eSALf>s{-!9 zuv$eSt{NmJ*Nj)p3JPwvjE>3{PFZkCOmxbD8$(WKU_VdSHgLZcyIjxZgY8p@U9I|G zR_l3{?pK4_da|sCpu-H4yI7_b-2_YGw#1E?Y|`7WL?|O{9>sv3YYB*D#B>**G-kkL zjkt~&dp_H7Yc{c+v<;|qB^EbKmtt_$iWof4<*oL`CTz>a&Lh3z-SK!g`>0jV%1WmH z32x{@w-~UC>hZ%VaY83>Zq}$?`mA4Nrv2>mQCyX)#&2k0iz-sRQ-CTu4t$T;?vWUL zrF|2ub4gAKyd-7LlD8JWx#U4&dxH@kHnfmc$wL(B7O%6@Y|i#@4wl8c%BQdmEq_!d zu-(L-=AXJ1DMM&+cw%Li{rqPf3n+7Q=Jfjs729~3YN>W*SlZrs8sV8(S}Shu{Tw;6 zlv^s$>`LRI_fRdIfMRClrU_W+%wxEn^Y-vZi4U4-ckFK}S+kt+15S@F5r; zv2@Ihjd~Ijd&Ci|4Q-8TL`Al)h=zHp4JBg5OOb2`;0bNsNT@EzMRF5Md;=|`2VyO^ z3(;cY_3SiO*K&n)R*%G~g-OmZOX%!I*&>=`cd@@`aGOMUr37IvL6X_zfKYjo5?*=G zWV>SsK|u&ZltgYa=SpIh-~rGCyG!=Bv6Qi%_HY8E)tSp(iold0$$Y~BIr)&Ff~KW z)Ba~qk{kNxhm@W~X-LbHv0HRb*6c81Cxk~ONHQ&lfp6iY9JT<((g0MHzsY1 zu-10&C|SiB)37LC%>h|#=qMIhmX<}QJP#ytaLUHgv9Db(Nz0& Targets) const +{ +} + +//-------------------------------------------------------------------------------------------------------------------------- +ECogEngineCheat_ActiveState UCogEngineCheat_Execution::IsActiveOnTargets_Implementation(const TArray& Targets) const +{ + return ECogEngineCheat_ActiveState::Inactive; +} + +//-------------------------------------------------------------------------------------------------------------------------- +bool UCogEngineCheat_Execution::GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const +{ + return false; +} diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp index ef20cb5..404ff8f 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp @@ -220,3 +220,26 @@ void ACogEngineReplicator::Server_DeleteActor_Implementation(AActor* Actor) #endif // !UE_BUILD_SHIPPING } + + +//-------------------------------------------------------------------------------------------------------------------------- +void ACogEngineReplicator::Server_ApplyCheat_Implementation(const AActor* CheatInstigator, const TArray& Targets, const FCogEngineCheat& Cheat) const +{ + if (Cheat.Execution == nullptr) + { + return; + } + + Cheat.Execution->Execute(CheatInstigator, Targets); +} + +//-------------------------------------------------------------------------------------------------------------------------- +ECogEngineCheat_ActiveState ACogEngineReplicator::IsCheatActiveOnTargets(const TArray& Targets, const FCogEngineCheat& Cheat) +{ + if (Cheat.Execution == nullptr) + { + return ECogEngineCheat_ActiveState::Inactive; + } + + return Cheat.Execution->IsActiveOnTargets(Targets); +} diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp new file mode 100644 index 0000000..0e7cc21 --- /dev/null +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp @@ -0,0 +1,485 @@ +#include "CogEngineWindow_Cheats.h" + +#include "CogEngineDataAsset.h" +#include "CogEngineReplicator.h" +#include "CogCommonAllegianceActorInterface.h" +#include "CogImguiHelper.h" +#include "CogWindowConsoleCommandManager.h" +#include "CogWindowWidgets.h" +#include "EngineUtils.h" +#include "GameFramework/Character.h" +#include "imgui.h" +#include "imgui_internal.h" + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::RenderHelp() +{ + ImGui::Text( + "This window can be used to apply cheats to the selected actor (by default). " + "The cheats can be configured in the '%s' data asset. " + "When clicking a cheat button, press:\n" + " [CTRL] to apply the cheat to controlled actor\n" + " [ALT] to apply the cheat to the allies of the selected actor\n" + " [SHIFT] to apply the cheat to the enemies of the selected actor\n" + , TCHAR_TO_ANSI(*GetNameSafe(Asset.Get())) + ); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::Initialize() +{ + Super::Initialize(); + + bHasMenu = true; + + Asset = GetAsset(); + Config = GetConfig(); + + FCogWindowConsoleCommandManager::RegisterWorldConsoleCommand( + TEXT("Cog.Cheat"), + TEXT("Apply a cheat to the selection. Cog.Cheat -Allies -Enemies -Controlled"), + GetWorld(), + FCogWindowConsoleCommandDelegate::CreateLambda([this](const TArray& InArgs, UWorld* InWorld) + { + if (InArgs.Num() > 0) + { + if (const FCogEngineCheat* cheat = FindCheatByName(InArgs[0], false)) + { + const bool ApplyToEnemies = InArgs.Contains("-Enemies"); + const bool ApplyToAllies = InArgs.Contains("-Allies"); + const bool ApplyToControlled = InArgs.Contains("-Controlled"); + + RequestCheat(GetLocalPlayerPawn(), GetSelection(), *cheat, ApplyToEnemies, ApplyToAllies, ApplyToControlled); + } + else + { + UE_LOG(LogCogImGui, Warning, TEXT("Cog.Cheat %s | Cheat not found"), *InArgs[0]); + } + } + })); + + + for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories) + { + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + { + UpdateCheatColor(Cheat); + } + + for (const FCogEngineCheat& Cheat : CheatCategory.InstantEffects) + { + UpdateCheatColor(Cheat); + } + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::UpdateCheatColor(const FCogEngineCheat& Cheat) const +{ + FLinearColor CustomColor; + if (Cheat.Execution != nullptr && Cheat.Execution->GetColor(*this, CustomColor)) + { + Cheat.CustomColor = CustomColor; + } + else + { + Cheat.CustomColor = Cheat.Color; + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::ResetConfig() +{ + Super::ResetConfig(); + + Config->Reset(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::GameTick(float DeltaTime) +{ + Super::GameTick(DeltaTime); + + TryReapplyCheats(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::TryReapplyCheats() +{ + if (Config == nullptr) + { return; } + + if (bHasReappliedCheats) + { return; } + + if (Config->bReapplyCheatsBetweenPlays == false) + { return; } + + static int32 IsFirstLaunch = true; + if (IsFirstLaunch && Config->bReapplyCheatsBetweenLaunches == false) + { return; } + IsFirstLaunch = false; + + if (Asset == nullptr) + { return; } + + APawn* ControlledActor = GetLocalPlayerPawn(); + if (ControlledActor == nullptr) + { return; } + + const ACogEngineReplicator* Replicator = ACogEngineReplicator::GetLocalReplicator(*GetWorld()); + if (Replicator == nullptr) + { return; } + + TArray Targets { ControlledActor }; + + for (int32 i = Config->AppliedCheats.Num() - 1; i >= 0; i--) + { + if (const FCogEngineCheat* Cheat = FindCheatByName(Config->AppliedCheats[i], true)) + { + Replicator->Server_ApplyCheat(ControlledActor, Targets, *Cheat); + } + else + { + //----------------------------------------------------- + // This cheat doesn't exist anymore. We can remove it. + //----------------------------------------------------- + Config->AppliedCheats.RemoveAt(i); + } + } + + bHasReappliedCheats = true; +} + +//-------------------------------------------------------------------------------------------------------------------------- +bool FCogEngineWindow_Cheats::DrawTable() +{ + const bool Open = ImGui::BeginTable("Cheats", 2, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_NoBordersInBodyUntilResize); + ImGui::TableSetupColumn("Toggle", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("Instant", ImGuiTableColumnFlags_WidthStretch); + return Open; +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::RenderContent() +{ + Super::RenderContent(); + + if (Config == nullptr) + { + ImGui::TextDisabled("Invalid Config"); + return; + } + + AActor* SelectedActor = GetSelection(); + if (SelectedActor == nullptr) + { + ImGui::TextDisabled("Invalid Selection"); + return; + } + + if (Asset == nullptr) + { + ImGui::TextDisabled("Invalid Asset"); + return; + } + + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("Options")) + { + ImGui::Checkbox("Group By Category", &Config->bGroupByCategories); + + ImGui::Checkbox("Use Two Columns", &Config->bUseTwoColumns); + + ImGui::Separator(); + + ImGui::Checkbox("Reapply Cheats Between Plays", &Config->bReapplyCheatsBetweenPlays); + if (Config->bReapplyCheatsBetweenPlays == false) + { + ImGui::BeginDisabled(); + } + + ImGui::Checkbox("Reapply Cheats Between Launches", &Config->bReapplyCheatsBetweenLaunches); + if (Config->bReapplyCheatsBetweenPlays == false) + { + ImGui::EndDisabled(); + } + + ImGui::Separator(); + if (ImGui::MenuItem("Reset Settings")) + { + ResetConfig(); + } + + ImGui::EndMenu(); + } + + ImGui::SameLine(); + + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 7); + + FString CategoryPreview; + if (Config->SelectedCategories.Num() == 0) + { + CategoryPreview = "None"; + } + else if (Config->SelectedCategories.Num() == 1) + { + CategoryPreview = *Config->SelectedCategories.CreateIterator(); + } + else + { + CategoryPreview = "Multiple"; + } + + const auto CategoryPreviewStr = StringCast(*CategoryPreview); + if (ImGui::BeginCombo("##Categories", CategoryPreviewStr.Get())) + { + for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories) + { + const auto CategoryStr = StringCast(*CheatCategory.Name); + bool IsSelected = Config->SelectedCategories.Contains(CheatCategory.Name); + if (ImGui::Checkbox(CategoryStr.Get(), &IsSelected)) + { + if (IsSelected) + { + Config->SelectedCategories.Add(CheatCategory.Name); + } + else + { + Config->SelectedCategories.Remove(CheatCategory.Name); + } + } + } + ImGui::EndCombo(); + } + + FCogWindowWidgets::SearchBar(Filter); + + ImGui::EndMenuBar(); + } + + APawn* ControlledActor = GetLocalPlayerPawn(); + + bool OpenTable = false; + if (Config->bGroupByCategories == false && Config->bUseTwoColumns) + { + OpenTable = DrawTable(); + } + + for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories) + { + const auto CategoryStr = StringCast(*CheatCategory.Name); + + if (Config->SelectedCategories.Num() != 0 && Config->SelectedCategories.Contains(CheatCategory.Name) == false) + { continue; } + + bool Open = true; + if (Config->bGroupByCategories) + { + ImGui::PushStyleColor(ImGuiCol_Header, IM_COL32(66, 66, 66, 79)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, IM_COL32(62, 62, 62, 204)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, IM_COL32(86, 86, 86, 255)); + + Open = ImGui::CollapsingHeader(CategoryStr.Get(), ImGuiTreeNodeFlags_DefaultOpen); + + ImGui::PopStyleColor(3); + + if (Open && Config->bUseTwoColumns) + { + DrawTable(); + } + } + + + if (Open) + { + if (Config->bUseTwoColumns) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + } + + int Index = 0; + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + { + AddCheat(Index, ControlledActor, SelectedActor, Cheat, true); + Index++; + } + + //---------------------------------------------------------------------------- + // Update the config of applied cheat to reapply them on the next launch. + // We do not update them only when the user input is pressed because + // the state of the cheat is lagging when connected to a server. + // So we check if the array should be updated all the time. + //---------------------------------------------------------------------------- + if (SelectedActor == ControlledActor) + { + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + { + TArray Targets = { SelectedActor }; + if (ACogEngineReplicator::IsCheatActiveOnTargets(Targets, Cheat) == ECogEngineCheat_ActiveState::Active) + { + Config->AppliedCheats.AddUnique(Cheat.Name); + } + else + { + Config->AppliedCheats.Remove(Cheat.Name); + } + } + } + + ImGui::TableNextColumn(); + + Index = 0; + for (const FCogEngineCheat& Cheat : CheatCategory.InstantEffects) + { + AddCheat(Index, ControlledActor, SelectedActor, Cheat, false); + Index++; + } + + if (Config->bGroupByCategories && Config->bUseTwoColumns) + { + ImGui::EndTable(); + } + } + } + + if (OpenTable) + { + ImGui::EndTable(); + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +bool FCogEngineWindow_Cheats::AddCheat(const int32 Index, AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool IsPersistent) +{ + const auto CheatName = StringCast(*Cheat.Name); + + if (Filter.PassFilter(CheatName.Get()) == false) + { return false; } + + ImGui::PushID(Index); + + FCogWindowWidgets::PushBackColor(FCogImguiHelper::ToImVec4(Cheat.CustomColor)); + + const bool IsShiftDown = (ImGui::GetCurrentContext()->IO.KeyMods & ImGuiMod_Shift) != 0; + const bool IsAltDown = (ImGui::GetCurrentContext()->IO.KeyMods & ImGuiMod_Alt) != 0; + const bool IsControlDown = (ImGui::GetCurrentContext()->IO.KeyMods & ImGuiMod_Ctrl) != 0; + + bool bIsPressed = false; + if (IsPersistent) + { + TArray Targets = { SelectedActor }; + bool isEnabled = ACogEngineReplicator::IsCheatActiveOnTargets(Targets, Cheat) == ECogEngineCheat_ActiveState::Active; + if (ImGui::Checkbox(CheatName.Get(), &isEnabled)) + { + RequestCheat(ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); + bIsPressed = true; + } + } + else + { + if (ImGui::Button(CheatName.Get(), ImVec2(-1, 0))) + { + RequestCheat(ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); + bIsPressed = true; + } + } + + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown || IsAltDown || IsControlDown ? 0.5f : 1.0f), "On Selection"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown ? 1.0f : 0.5f), "On Enemies [SHIFT]"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsAltDown ? 1.0f : 0.5f), "On Allies [ALT]"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsControlDown ? 1.0f : 0.5f), "On Controlled [CTRL]"); + ImGui::EndTooltip(); + } + + FCogWindowWidgets::PopBackColor(); + + ImGui::PopID(); + + return bIsPressed; +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_Cheats::RequestCheat(AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled) +{ + TArray Actors; + + if (ApplyToControlled) + { + Actors.Add(ControlledActor); + } + + if (ApplyToEnemies || ApplyToAllies) + { + for (TActorIterator It(GetWorld(), ACharacter::StaticClass()); It; ++It) + { + if (AActor* OtherActor = *It) + { + ECogCommonAllegiance Allegiance = ECogCommonAllegiance::Enemy; + + if (ICogCommonAllegianceActorInterface* AllegianceInterface = Cast(OtherActor)) + { + Allegiance = AllegianceInterface->GetAllegianceWithOtherActor(ControlledActor); + } + + if ((ApplyToEnemies && (Allegiance == ECogCommonAllegiance::Enemy)) + || (ApplyToAllies && (Allegiance == ECogCommonAllegiance::Friendly))) + { + Actors.Add(OtherActor); + } + } + } + } + + if ((ApplyToControlled || ApplyToEnemies || ApplyToAllies) == false) + { + Actors.Add(SelectedActor); + } + + if (ACogEngineReplicator* Replicator = ACogEngineReplicator::GetLocalReplicator(*GetWorld())) + { + Replicator->Server_ApplyCheat(ControlledActor, Actors, Cheat); + } + else + { + UE_LOG(LogCogImGui, Warning, TEXT("FCogAbilityWindow_Cheats::RequestCheat | Replicator not found")); + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +const FCogEngineCheat* FCogEngineWindow_Cheats::FindCheatByName(const FString& CheatName, const bool OnlyPersistentCheats) +{ + for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories) + { + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + { + if (Cheat.Name == CheatName) + { + return &Cheat; + } + } + + if (OnlyPersistentCheats) + { + continue; + } + + for (const FCogEngineCheat& Cheat : CheatCategory.InstantEffects) + { + if (Cheat.Name == CheatName) + { + return &Cheat; + } + } + + + } + + return nullptr; +} diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h index 8462ebd..c395a0a 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h @@ -5,6 +5,68 @@ #include "Engine/EngineTypes.h" #include "CogEngineDataAsset.generated.h" +class FCogWindow; +//-------------------------------------------------------------------------------------------------------------------------- +UENUM(BlueprintType) +enum class ECogEngineCheat_ActiveState : uint8 +{ + Inactive, + Partial, + Active, +}; + +//-------------------------------------------------------------------------------------------------------------------------- +UCLASS(BlueprintType, Abstract, Const, DefaultToInstanced, EditInlineNew, CollapseCategories) +class COGENGINE_API UCogEngineCheat_Execution + : public UObject +{ + GENERATED_BODY() + +public: + + UFUNCTION(BlueprintNativeEvent) + void Execute(const AActor* Instigator, const TArray& Targets) const; + + UFUNCTION(BlueprintNativeEvent) + ECogEngineCheat_ActiveState IsActiveOnTargets(const TArray& Targets) const; + + virtual bool GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const; +}; + +//-------------------------------------------------------------------------------------------------------------------------- +USTRUCT() +struct COGENGINE_API FCogEngineCheat +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere) + FString Name; + + UPROPERTY(EditAnywhere, Instanced) + TObjectPtr Execution; + + UPROPERTY(EditAnywhere) + FLinearColor Color = FLinearColor::White; + + mutable FLinearColor CustomColor = FLinearColor::White; +}; + +//-------------------------------------------------------------------------------------------------------------------------- +USTRUCT() +struct COGENGINE_API FCogEngineCheatCategory +{ + GENERATED_BODY() + + UPROPERTY(Category = "Cheats", EditAnywhere) + FString Name; + + UPROPERTY(Category = "Cheats", EditAnywhere, meta = (TitleProperty = "Name")) + TArray PersistentEffects; + + UPROPERTY(Category = "Cheats", EditAnywhere, meta = (TitleProperty = "Name")) + TArray InstantEffects; +}; + //-------------------------------------------------------------------------------------------------------------------------- USTRUCT() struct COGENGINE_API FCogEngineSpawnEntry @@ -44,6 +106,9 @@ public: UCogEngineDataAsset() {} + UPROPERTY(Category = "Cheats", EditAnywhere, meta = (TitleProperty = "Name")) + TArray CheatCategories; + UPROPERTY(Category = "Spawns", EditAnywhere, meta = (TitleProperty = "Name")) TArray SpawnGroups; }; diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h index 953712a..be13be5 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h @@ -1,6 +1,7 @@ #pragma once #include "CoreMinimal.h" +#include "CogEngineDataAsset.h" #include "GameFramework/Actor.h" #include "UObject/Class.h" #include "UObject/ObjectMacros.h" @@ -50,6 +51,11 @@ public: UFUNCTION(Server, Reliable) void Server_DeleteActor(AActor* Actor); + UFUNCTION(Reliable, Server) + void Server_ApplyCheat(const AActor* CheatInstigator, const TArray& TargetActors, const FCogEngineCheat& Cheat) const; + + static ECogEngineCheat_ActiveState IsCheatActiveOnTargets(const TArray& Targets, const FCogEngineCheat& Cheat); + protected: UFUNCTION(Server, Reliable) diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h new file mode 100644 index 0000000..712c04d --- /dev/null +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h @@ -0,0 +1,90 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CogCommonConfig.h" +#include "CogWindow.h" +#include "CogEngineWindow_Cheats.generated.h" + +class AActor; +class UCogEngineConfig_Cheats; +class UCogEngineDataAsset; +struct FCogEngineCheat; + +//-------------------------------------------------------------------------------------------------------------------------- +class COGENGINE_API FCogEngineWindow_Cheats : public FCogWindow +{ + typedef FCogWindow Super; + +public: + + virtual void Initialize() override; + +protected: + + virtual void GameTick(float DeltaTime) override; + + virtual void ResetConfig() override; + + virtual void RenderHelp() override; + + virtual void RenderContent() override; + + virtual void TryReapplyCheats(); + + virtual bool AddCheat(const int32 Index, AActor* ControlledActor, AActor* TargetActor, const FCogEngineCheat& CheatEffect, bool IsPersistent); + + virtual void RequestCheat(AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled); + + virtual const FCogEngineCheat* FindCheatByName(const FString& CheatName, const bool OnlyPersistentCheats); + + static bool DrawTable(); + + void UpdateCheatColor(const FCogEngineCheat& Cheat) const; + + TObjectPtr Asset = nullptr; + + TObjectPtr Config = nullptr; + + bool bHasReappliedCheats = false; + + ImGuiTextFilter Filter; + + TArray AllCheats; +}; + +//-------------------------------------------------------------------------------------------------------------------------- +UCLASS(Config = Cog) +class UCogEngineConfig_Cheats : public UCogCommonConfig +{ + GENERATED_BODY() + +public: + + UPROPERTY(Config) + bool bGroupByCategories = true; + + UPROPERTY(Config) + bool bReapplyCheatsBetweenPlays = true; + + UPROPERTY(Config) + bool bReapplyCheatsBetweenLaunches = true; + + UPROPERTY(Config) + bool bUseTwoColumns = true; + + UPROPERTY(Config) + TArray AppliedCheats; + + UPROPERTY(Config) + TSet SelectedCategories; + + virtual void Reset() override + { + Super::Reset(); + + bReapplyCheatsBetweenPlays = true; + bReapplyCheatsBetweenLaunches = true; + AppliedCheats.Empty(); + SelectedCategories.Empty(); + } +}; diff --git a/Plugins/CogAbility/Source/CogAbility/CogAbility.Build.cs b/Plugins/CogAbility/Source/CogAbility/CogAbility.Build.cs index 16e7478..b81d069 100644 --- a/Plugins/CogAbility/Source/CogAbility/CogAbility.Build.cs +++ b/Plugins/CogAbility/Source/CogAbility/CogAbility.Build.cs @@ -1,5 +1,4 @@ using UnrealBuildTool; -using UnrealBuildTool.Rules; public class CogAbility : ModuleRules { @@ -26,10 +25,11 @@ public class CogAbility : ModuleRules "CogImgui", "CogCommon", "CogDebug", + "CogEngine", "CogWindow", "GameplayAbilities", "GameplayTags", - "NetCore", + "NetCore", } ); diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp new file mode 100644 index 0000000..1636fee --- /dev/null +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp @@ -0,0 +1,111 @@ +#include "CogAbilityCheat_Execution_ApplyEffect.h" + +#include "CogAbilityDataAsset.h" + +#include "AbilitySystemComponent.h" +#include "AbilitySystemGlobals.h" +#include "CogAbilityConfig_Alignment.h" +#include "CogImguiHelper.h" +#include "CogWindow.h" + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogAbilityCheat_Execution_ApplyEffect::Execute_Implementation(const AActor* Instigator, const TArray& Targets) const +{ + UAbilitySystemComponent* DefaultInstigatorAbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Instigator, true); + + for (AActor* Target : Targets) + { + UAbilitySystemComponent* TargetAbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Target, true); + if (TargetAbilitySystem == nullptr) + { + UE_LOG(LogCogImGui, Warning, TEXT("ACogAbilityReplicator::Server_ApplyCheat_Implementation | Target:%s | Invalid Target AbilitySystem"), *GetNameSafe(Target)); + continue; + } + + if (TargetAbilitySystem->GetGameplayEffectCount(Effect, nullptr) > 0) + { + TargetAbilitySystem->RemoveActiveGameplayEffectBySourceEffect(Effect, nullptr); + } + else + { + //----------------------------------------------------------------------------------- + // When executing a cheat directly on the game server, there is not an obvious + // local player to use as the instigator. Instead, we use the target ability system. + //----------------------------------------------------------------------------------- + UAbilitySystemComponent* InstigatorAbilitySystem = (DefaultInstigatorAbilitySystem != nullptr) ? DefaultInstigatorAbilitySystem : TargetAbilitySystem; + + FGameplayEffectContextHandle ContextHandle = InstigatorAbilitySystem->MakeEffectContext(); + ContextHandle.AddSourceObject(InstigatorAbilitySystem); + FGameplayEffectSpecHandle SpecHandle = InstigatorAbilitySystem->MakeOutgoingSpec(Effect, 1, ContextHandle); + + if (const FGameplayEffectSpec* EffectSpec = SpecHandle.Data.Get()) + { + FHitResult HitResult; + HitResult.HitObjectHandle = FActorInstanceHandle(Target); + HitResult.Normal = FVector::ForwardVector; + HitResult.ImpactNormal = FVector::ForwardVector; + HitResult.Location = Target->GetActorLocation(); + HitResult.ImpactPoint = Target->GetActorLocation(); + HitResult.PhysMaterial = nullptr; + ContextHandle.AddHitResult(HitResult, true); + + InstigatorAbilitySystem->ApplyGameplayEffectSpecToTarget(*EffectSpec, TargetAbilitySystem); + } + } + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +ECogEngineCheat_ActiveState UCogAbilityCheat_Execution_ApplyEffect::IsActiveOnTargets_Implementation(const TArray& Targets) const +{ + if (Effect == nullptr) + { + return ECogEngineCheat_ActiveState::Inactive; + } + + int32 NumWithEffect = 0; + for (const AActor* Target : Targets) + { + const UAbilitySystemComponent* AbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Target, true); + if (AbilitySystem == nullptr) + { + continue; + } + + const int32 Count = AbilitySystem->GetGameplayEffectCount(Effect, nullptr); + if (Count > 0) + { + NumWithEffect++; + } + } + + if (NumWithEffect == 0) + { + return ECogEngineCheat_ActiveState::Inactive; + } + + if (NumWithEffect == Targets.Num()) + { + return ECogEngineCheat_ActiveState::Active; + } + + return ECogEngineCheat_ActiveState::Partial; +} + + +//-------------------------------------------------------------------------------------------------------------------------- +bool UCogAbilityCheat_Execution_ApplyEffect::GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const +{ + if (Effect == nullptr) + { return false; } + + const UGameplayEffect* GameplayEffect = Effect->GetDefaultObject(); + if (GameplayEffect == nullptr) + { return false; } + + const UCogAbilityConfig_Alignment* Config = InCallingWindow.GetConfig(); + const UCogAbilityDataAsset* Asset = InCallingWindow.GetAsset(); + + OutColor = Config->GetEffectColor(Asset, *GameplayEffect); + return true; +} diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h new file mode 100644 index 0000000..fd388e9 --- /dev/null +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h @@ -0,0 +1,24 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CogEngineDataAsset.h" +#include "GameplayEffect.h" +#include "CogAbilityCheat_Execution_ApplyEffect.generated.h" + +//-------------------------------------------------------------------------------------------------------------------------- +UCLASS(DisplayName = "Apply Effect") +class COGABILITY_API UCogAbilityCheat_Execution_ApplyEffect + : public UCogEngineCheat_Execution +{ + GENERATED_BODY() + +public: + void Execute_Implementation(const AActor* Instigator, const TArray& Targets) const override; + + ECogEngineCheat_ActiveState IsActiveOnTargets_Implementation(const TArray& Targets) const override; + + virtual bool GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const override; + + UPROPERTY(EditAnywhere) + TSubclassOf Effect; +}; diff --git a/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp b/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp index 6425a08..ad4b176 100644 --- a/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp +++ b/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp @@ -2,7 +2,6 @@ #include "CogAbilityWindow_Abilities.h" #include "CogAbilityWindow_Attributes.h" -#include "CogAbilityWindow_Cheats.h" #include "CogAbilityWindow_Effects.h" #include "CogAbilityWindow_Pools.h" #include "CogAbilityWindow_Tags.h" @@ -10,6 +9,7 @@ #include "CogAbilityWindow_Tweaks.h" #include "CogAIWindow_BehaviorTree.h" #include "CogAIWindow_Blackboard.h" +#include "CogEngineWindow_Cheats.h" #include "CogEngineWindow_CollisionTester.h" #include "CogEngineWindow_CollisionViewer.h" #include "CogEngineWindow_CommandBindings.h" @@ -103,7 +103,9 @@ void Cog::AddAllWindows(UCogWindowManager& CogWindowManager) CogWindowManager.AddWindow("Gameplay.Blocking Tags"); - CogWindowManager.AddWindow("Gameplay.Cheats"); + //CogWindowManager.AddWindow("Gameplay.Cheats"); + + CogWindowManager.AddWindow("Gameplay.Cheats"); CogWindowManager.AddWindow("Gameplay.Effects");