1
2
3 #pragma once
4
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14
15 #define TRACK_CONSOLE_FIND_COUNT !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
16
17 #if DO_CHECK && (!UE_BUILD_SHIPPING)
18 #define cvarCheckCode( Code ) checkCode( Code )
19 #else
20 #define cvarCheckCode(...)
21 #endif
22
23 template <class T> class TConsoleVariableData;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 enum EConsoleVariableFlags
50 {
51
52 ECVF_FlagMask = 0x0000ffff,
53
54
55
56
57 ECVF_Default = 0x0,
58
59
60
61
62 ECVF_Cheat = 0x1,
63
64
65
66
67 ECVF_ReadOnly = 0x4,
68
69
70
71
72 ECVF_Unregistered = 0x8,
73
74
75
76
77 ECVF_CreatedFromIni = 0x10,
78
79
80
81
82
83
84 ECVF_RenderThreadSafe = 0x20,
85
86
87 ECVF_Scalability = 0x40,
88
89
90 ECVF_ScalabilityGroup = 0x80,
91
92
93
94
95 ECVF_SetFlagMask = 0x00ff0000,
96
97
98 ECVF_Set_NoSinkCall_Unsafe = 0x00010000,
99
100
101
102
103 ECVF_SetByMask = 0xff000000,
104
105
106
107
108 ECVF_SetByConstructor = 0x00000000,
109
110 ECVF_SetByScalability = 0x01000000,
111
112 ECVF_SetByGameSetting = 0x02000000,
113
114 ECVF_SetByProjectSetting = 0x03000000,
115
116 ECVF_SetBySystemSettingsIni = 0x04000000,
117
118 ECVF_SetByDeviceProfile = 0x05000000,
119
120 ECVF_SetByConsoleVariablesIni = 0x06000000,
121
122 ECVF_SetByCommandline = 0x07000000,
123
124 ECVF_SetByCode = 0x08000000,
125
126 ECVF_SetByConsole = 0x09000000,
127
128
129 };
130
131 class IConsoleVariable;
132
133 #if !NO_CVARS
134
135
136 DECLARE_DELEGATE_OneParam(FConsoleVariableDelegate, IConsoleVariable*);
137
138
139 DECLARE_MULTICAST_DELEGATE_OneParam(FConsoleVariableMulticastDelegate, IConsoleVariable*);
140
141
142 DECLARE_DELEGATE( FConsoleCommandDelegate );
143
144
145 DECLARE_DELEGATE_OneParam( FConsoleCommandWithArgsDelegate, const TArray< FString >& );
146
147
148 DECLARE_DELEGATE_OneParam( FConsoleCommandWithWorldDelegate, UWorld* );
149
150
151 DECLARE_DELEGATE_TwoParams(FConsoleCommandWithWorldAndArgsDelegate, const TArray< FString >&, UWorld*);
152
153
154 DECLARE_DELEGATE_ThreeParams(FConsoleCommandWithWorldArgsAndOutputDeviceDelegate, const TArray< FString >&, UWorld*, FOutputDevice&);
155
156
157 DECLARE_DELEGATE_OneParam( FConsoleCommandWithOutputDeviceDelegate, FOutputDevice& );
158
159 #else
160
161 template <typename DerivedType, typename... ParamTypes>
162 struct FNullConsoleVariableDelegate
163 {
164
165
166
167 template <typename... VarTypes>
168 inline static DerivedType CreateStatic(typename TIdentity<void (*)(ParamTypes..., VarTypes...)>::Type, VarTypes...)
169 {
170 return {};
171 }
172
173 template<typename FunctorType, typename... VarTypes>
174 inline static DerivedType CreateLambda(FunctorType&&, VarTypes...)
175 {
176 return {};
177 }
178
179 template<typename UserClass, typename FunctorType, typename... VarTypes>
180 inline static DerivedType CreateWeakLambda(UserClass*, FunctorType&&, VarTypes...)
181 {
182 return {};
183 }
184
185 template <typename UserClass, typename... VarTypes>
186 inline static DerivedType CreateRaw(UserClass*, typename TMemFunPtrType<false, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
187 {
188 return {};
189 }
190 template <typename UserClass, typename... VarTypes>
191 inline static DerivedType CreateRaw(UserClass*, typename TMemFunPtrType<true, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
192 {
193 return {};
194 }
195
196 template <typename UserClass, typename... VarTypes>
197 inline static DerivedType CreateSP(const TSharedRef<UserClass, ESPMode::Fast>&, typename TMemFunPtrType<false, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
198 {
199 return {};
200 }
201 template <typename UserClass, typename... VarTypes>
202 inline static DerivedType CreateSP(const TSharedRef<UserClass, ESPMode::Fast>&, typename TMemFunPtrType<true, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
203 {
204 return {};
205 }
206
207 template <typename UserClass, typename... VarTypes>
208 inline static DerivedType CreateSP(UserClass*, typename TMemFunPtrType<false, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
209 {
210 return {};
211 }
212 template <typename UserClass, typename... VarTypes>
213 inline static DerivedType CreateSP(UserClass*, typename TMemFunPtrType<true, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
214 {
215 return {};
216 }
217
218 template <typename UserClass, typename... VarTypes>
219 inline static DerivedType CreateThreadSafeSP(const TSharedRef<UserClass, ESPMode::ThreadSafe>&, typename TMemFunPtrType<false, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
220 {
221 return {};
222 }
223 template <typename UserClass, typename... VarTypes>
224 inline static DerivedType CreateThreadSafeSP(const TSharedRef<UserClass, ESPMode::ThreadSafe>&, typename TMemFunPtrType<true, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
225 {
226 return {};
227 }
228
229 template <typename UserClass, typename... VarTypes>
230 inline static DerivedType CreateThreadSafeSP(UserClass*, typename TMemFunPtrType<false, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
231 {
232 return {};
233 }
234 template <typename UserClass, typename... VarTypes>
235 inline static DerivedType CreateThreadSafeSP(UserClass*, typename TMemFunPtrType<true, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
236 {
237 return {};
238 }
239
240 template <typename UObjectTemplate, typename... VarTypes>
241 inline static DerivedType CreateUFunction(UObjectTemplate*, const FName&, VarTypes...)
242 {
243 return {};
244 }
245
246 template <typename UserClass, typename... VarTypes>
247 inline static DerivedType CreateUObject(UserClass*, typename TMemFunPtrType<false, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
248 {
249 return {};
250 }
251 template <typename UserClass, typename... VarTypes>
252 inline static DerivedType CreateUObject(UserClass*, typename TMemFunPtrType<true, UserClass, void (ParamTypes..., VarTypes...)>::Type, VarTypes...)
253 {
254 return {};
255 }
256
257 FDelegateHandle GetHandle() const
258 {
259 return {};
260 }
261
262 bool ExecuteIfBound(ParamTypes...)
263 {
264 return false;
265 }
266 };
267
268 struct FConsoleVariableDelegate : FNullConsoleVariableDelegate<FConsoleVariableDelegate, IConsoleVariable*> {};
269 struct FConsoleCommandDelegate : FNullConsoleVariableDelegate<FConsoleCommandDelegate> {};
270 struct FConsoleCommandWithArgsDelegate : FNullConsoleVariableDelegate<FConsoleCommandWithArgsDelegate, const TArray<FString>&> {};
271 struct FConsoleCommandWithWorldDelegate : FNullConsoleVariableDelegate<FConsoleCommandWithWorldDelegate, UWorld*> {};
272 struct FConsoleCommandWithWorldAndArgsDelegate : FNullConsoleVariableDelegate<FConsoleCommandWithWorldAndArgsDelegate, const TArray<FString>&, UWorld*> {};
273 struct FConsoleCommandWithWorldArgsAndOutputDeviceDelegate : FNullConsoleVariableDelegate<FConsoleCommandWithWorldArgsAndOutputDeviceDelegate, const TArray<FString>&, UWorld*, FOutputDevice&> {};
274 struct FConsoleCommandWithOutputDeviceDelegate : FNullConsoleVariableDelegate<FConsoleCommandWithOutputDeviceDelegate, FOutputDevice&> {};
275
276 #endif
277
278 template <class T> class TConsoleVariableData;
279
280
281
282
283 class IConsoleObject
284 {
285
286 public:
287
288 IConsoleObject()
289 #if TRACK_CONSOLE_FIND_COUNT
290 : FindCallCount(0)
291 #endif
292 {}
293
294 virtual ~IConsoleObject() {}
295
296
297
298
299 virtual const TCHAR* GetHelp() const = 0;
300
301
302
303 virtual void SetHelp(const TCHAR* Value) = 0;
304
305
306
307 virtual EConsoleVariableFlags GetFlags() const = 0;
308
309
310
311 virtual void SetFlags(const EConsoleVariableFlags Value) = 0;
312
313
314
315
316
317
318 void ClearFlags(const EConsoleVariableFlags Value)
319 {
320 uint32 New = (uint32)GetFlags() & ~(uint32)Value;
321
322 SetFlags((EConsoleVariableFlags)New);
323 }
324
325
326
327 bool TestFlags(const EConsoleVariableFlags Value) const
328 {
329 return ((uint32)GetFlags() & (uint32)Value) != 0;
330 }
331
332
333
334
335 virtual class IConsoleVariable* AsVariable()
336 {
337 return 0;
338 }
339
340 virtual bool IsVariableBool() const { return false; }
341 virtual bool IsVariableInt() const { return false; }
342 virtual bool IsVariableFloat() const { return false; }
343 virtual bool IsVariableString() const { return false; }
344
345 virtual class TConsoleVariableData<bool>* AsVariableBool()
346 {
347 ensureMsgf(false, TEXT("Attempted to access variable data of a console variable type that doesn't support it. For example FindTConsoleVariableData* on a FAutoConsoleVariableRef."));
348 return 0;
349 }
350
351 virtual class TConsoleVariableData<int32>* AsVariableInt()
352 {
353 ensureMsgf(false, TEXT("Attempted to access variable data of a console variable type that doesn't support it. For example FindTConsoleVariableData* on a FAutoConsoleVariableRef."));
354 return 0;
355 }
356
357 virtual class TConsoleVariableData<float>* AsVariableFloat()
358 {
359 ensureMsgf(false, TEXT("Attempted to access variable data of a console variable type that doesn't support it. For example FindTConsoleVariableData* on a FAutoConsoleVariableRef."));
360 return 0;
361 }
362
363 virtual class TConsoleVariableData<FString>* AsVariableString()
364 {
365 ensureMsgf(false, TEXT("Attempted to access variable data of a console variable type that doesn't support it. For example FindTConsoleVariableData* on a FAutoConsoleVariableRef."));
366 return 0;
367 }
368
369
370
371
372 virtual struct IConsoleCommand* AsCommand()
373 {
374 return 0;
375 }
376
377 private:
378
379 #if TRACK_CONSOLE_FIND_COUNT
380
381
382 uint32 FindCallCount;
383 #endif
384
385
386
387
388 virtual void Release() = 0;
389
390 friend class FConsoleManager;
391 };
392
393
394
395
396 class IConsoleVariable : public IConsoleObject
397 {
398 public:
399
400
401
402
403
404 virtual void Set(const TCHAR* InValue, EConsoleVariableFlags SetBy = ECVF_SetByCode) = 0;
405
406
407
408
409 virtual bool GetBool() const = 0;
410
411
412
413
414 virtual int32 GetInt() const = 0;
415
416 virtual float GetFloat() const = 0;
417
418 virtual FString GetString() const = 0;
419
420
421 void GetValue(int32& OutIntValue)
422 {
423 OutIntValue = GetInt();
424 }
425 void GetValue(bool& OutBoolValue)
426 {
427 OutBoolValue = GetBool();
428 }
429 void GetValue(float& OutFloatValue)
430 {
431 OutFloatValue = GetFloat();
432 }
433 void GetValue(FString& OutStringValue)
434 {
435 OutStringValue = GetString();
436 }
437
438
439
440
441
442
443
444
445
446
447
448 virtual void SetOnChangedCallback(const FConsoleVariableDelegate& Callback) = 0;
449
450 virtual FConsoleVariableMulticastDelegate& OnChangedDelegate() = 0;
451
452
453
454
455 void Set(bool InValue, EConsoleVariableFlags SetBy = ECVF_SetByCode)
456 {
457
458
459
460
461 Set(InValue ? TEXT("1") : TEXT("0"), SetBy);
462 }
463
464 void Set(int32 InValue, EConsoleVariableFlags SetBy = ECVF_SetByCode)
465 {
466
467 Set(*FString::Printf(TEXT("%d"), InValue), SetBy);
468 }
469
470 void Set(float InValue, EConsoleVariableFlags SetBy = ECVF_SetByCode)
471 {
472
473 Set(*FString::Printf(TEXT("%g"), InValue), SetBy);
474 }
475
476 void SetWithCurrentPriority(bool InValue)
477 {
478 EConsoleVariableFlags CurFlags = (EConsoleVariableFlags)(GetFlags() & ECVF_SetByMask);
479 Set(InValue, CurFlags);
480 }
481 void SetWithCurrentPriority(int32 InValue)
482 {
483 EConsoleVariableFlags CurFlags = (EConsoleVariableFlags)(GetFlags() & ECVF_SetByMask);
484 Set(InValue, CurFlags);
485 }
486 void SetWithCurrentPriority(float InValue)
487 {
488 EConsoleVariableFlags CurFlags = (EConsoleVariableFlags)(GetFlags() & ECVF_SetByMask);
489 Set(InValue, CurFlags);
490 }
491 void SetWithCurrentPriority(const TCHAR* InValue)
492 {
493 EConsoleVariableFlags CurFlags = (EConsoleVariableFlags)(GetFlags() & ECVF_SetByMask);
494 Set(InValue, CurFlags);
495 }
496 };
497
498
499
500
501 struct IConsoleCommand : public IConsoleObject
502 {
503
504
505
506
507
508
509
510 virtual bool Execute( const TArray< FString >& Args, UWorld* InWorld, class FOutputDevice& OutputDevice ) = 0;
511 };
512
513
514
515
516 struct IConsoleThreadPropagation
517 {
518 virtual void OnCVarChange(int32& Dest, int32 NewValue) = 0;
519 virtual void OnCVarChange(float& Dest, float NewValue) = 0;
520 virtual void OnCVarChange(bool& Dest, bool NewValue) = 0;
521 virtual void OnCVarChange(FString& Dest, const FString& NewValue) = 0;
522 };
523
524
525
526
527
528
529
530
531 DECLARE_DELEGATE_TwoParams( FConsoleObjectVisitor, const TCHAR*, IConsoleObject* );
532
533
534
535
536
537 class FConsoleVariableSinkHandle
538 {
539 public:
540 FConsoleVariableSinkHandle()
541 {
542 }
543
544 explicit FConsoleVariableSinkHandle(FDelegateHandle InHandle)
545 : Handle(InHandle)
546 {
547 }
548
549 template <typename MulticastDelegateType>
550 void RemoveFromDelegate(MulticastDelegateType& MulticastDelegate)
551 {
552 MulticastDelegate.Remove(Handle);
553 }
554
555 template <typename DelegateType>
556 bool HasSameHandle(const DelegateType& Delegate) const
557 {
558 return Delegate.GetHandle() == Handle;
559 }
560
561 private:
562 FDelegateHandle Handle;
563 };
564
565
566
567
568
569 class IConsoleCommandExecutor : public IModularFeature
570 {
571 public:
572 virtual ~IConsoleCommandExecutor() = default;
573
574
575
576
577 static FName ModularFeatureName()
578 {
579 static const FName Name = TEXT("ConsoleCommandExecutor");
580 return Name;
581 }
582
583
584
585
586 virtual FName GetName() const = 0;
587
588
589
590
591 virtual FText GetDisplayName() const = 0;
592
593
594
595
596 virtual FText GetDescription() const = 0;
597
598
599
600
601 virtual FText GetHintText() const = 0;
602
603
604
605
606 virtual void GetAutoCompleteSuggestions(const TCHAR* Input, TArray<FString>& Out) = 0;
607
608
609
610
611 virtual void GetExecHistory(TArray<FString>& Out) = 0;
612
613
614
615
616
617 virtual bool Exec(const TCHAR* Input) = 0;
618
619
620
621
622
623 virtual bool AllowHotKeyClose() const = 0;
624
625
626
627
628 virtual bool AllowMultiLine() const = 0;
629
630
631
632
633 virtual struct FInputChord GetHotKey() const = 0;
634 };
635
636
637
638
639
640 struct CORE_API IConsoleManager
641 {
642
643
644
645
646
647
648 virtual IConsoleVariable* RegisterConsoleVariable(const TCHAR* Name, bool DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
649
650
651
652
653
654
655 virtual IConsoleVariable* RegisterConsoleVariable(const TCHAR* Name, int32 DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
656
657
658
659
660
661
662 virtual IConsoleVariable* RegisterConsoleVariable(const TCHAR* Name, float DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
663
664
665
666
667
668
669 virtual IConsoleVariable* RegisterConsoleVariable(const TCHAR* Name, const TCHAR* DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
670
671
672
673
674
675
676 virtual IConsoleVariable* RegisterConsoleVariable(const TCHAR* Name, const FString& DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
677
678
679
680
681
682
683 virtual IConsoleVariable* RegisterConsoleVariableRef(const TCHAR* Name, bool& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
684
685
686
687
688
689
690 virtual IConsoleVariable* RegisterConsoleVariableRef(const TCHAR* Name, int32& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
691
692
693
694
695
696
697 virtual IConsoleVariable* RegisterConsoleVariableRef(const TCHAR* Name, float& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
698
699
700
701
702
703
704 virtual IConsoleVariable* RegisterConsoleVariableRef(const TCHAR* Name, FString& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
705
706
707
708
709
710
711
712
713
714
715 virtual IConsoleVariable* RegisterConsoleVariableBitRef(const TCHAR* CVarName, const TCHAR* FlagName, uint32 BitNumber, uint8* Force0MaskPtr, uint8* Force1MaskPtr, const TCHAR* Help, uint32 Flags = ECVF_Default) = 0;
716
717
718
719
720
721
722
723
724
725
726
727 virtual void CallAllConsoleVariableSinks() = 0;
728
729
730
731
732
733 virtual FConsoleVariableSinkHandle RegisterConsoleVariableSink_Handle(const FConsoleCommandDelegate& Command) = 0;
734
735
736
737
738
739 virtual void UnregisterConsoleVariableSink_Handle(FConsoleVariableSinkHandle Handle) = 0;
740
741
742
743
744
745
746
747
748
749
750
751 virtual IConsoleCommand* RegisterConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandDelegate& Command, uint32 Flags = ECVF_Default) = 0;
752
753
754
755
756
757
758
759
760
761 virtual IConsoleCommand* RegisterConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithArgsDelegate& Command, uint32 Flags = ECVF_Default) = 0;
762
763
764
765
766
767
768
769
770
771 virtual IConsoleCommand* RegisterConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldDelegate& Command, uint32 Flags = ECVF_Default) = 0;
772
773
774
775
776
777
778
779
780
781 virtual IConsoleCommand* RegisterConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldAndArgsDelegate& Command, uint32 Flags = ECVF_Default) = 0;
782
783
784
785
786
787
788
789
790
791 virtual IConsoleCommand* RegisterConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldArgsAndOutputDeviceDelegate& Command, uint32 Flags = ECVF_Default) = 0;
792
793
794
795
796
797
798
799
800
801 virtual IConsoleCommand* RegisterConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithOutputDeviceDelegate& Command, uint32 Flags = ECVF_Default) = 0;
802
803
804
805
806
807
808
809
810 virtual IConsoleCommand* RegisterConsoleCommand(const TCHAR* Name, const TCHAR* Help, uint32 Flags = (uint32)ECVF_Default) = 0;
811
812
813
814
815
816
817
818 virtual void UnregisterConsoleObject( IConsoleObject* ConsoleObject, bool bKeepState = true) = 0;
819
820
821
822
823
824
825
826 virtual void UnregisterConsoleObject(const TCHAR* Name, bool bKeepState = true) = 0;
827
828
829
830
831
832
833 virtual IConsoleVariable* FindConsoleVariable(const TCHAR* Name, bool bTrackFrequentCalls = true) const = 0;
834
835
836
837
838
839
840 virtual IConsoleObject* FindConsoleObject(const TCHAR* Name, bool bTrackFrequentCalls = true) const = 0;
841
842
843
844
845
846
847 TConsoleVariableData<int32>* FindTConsoleVariableDataInt(const TCHAR* Name) const
848 {
849 IConsoleVariable* P = FindConsoleVariable(Name);
850
851 return P ? P->AsVariableInt() : 0;
852 }
853
854
855
856
857
858
859 TConsoleVariableData<float>* FindTConsoleVariableDataFloat(const TCHAR* Name) const
860 {
861 IConsoleVariable* P = FindConsoleVariable(Name);
862
863 return P ? P->AsVariableFloat() : 0;
864 }
865
866
867
868
869
870
871
872 virtual void ForEachConsoleObjectThatStartsWith( const FConsoleObjectVisitor& Visitor, const TCHAR* ThatStartsWith = TEXT("")) const = 0;
873
874
875
876
877
878
879 virtual void ForEachConsoleObjectThatContains(const FConsoleObjectVisitor& Visitor, const TCHAR* ThatContains) const = 0;
880
881
882
883
884
885
886
887
888
889
890
891
892 virtual bool ProcessUserConsoleInput(const TCHAR* Input, FOutputDevice& Ar, UWorld* InWorld) = 0;
893
894
895
896
897 virtual void AddConsoleHistoryEntry(const TCHAR* Key, const TCHAR* Input) = 0;
898
899
900
901 virtual void GetConsoleHistory(const TCHAR* Key, TArray<FString>& Out) = 0;
902
903
904
905
906
907 virtual bool IsNameRegistered(const TCHAR* Name) const = 0;
908
909
910
911 virtual void RegisterThreadPropagation(uint32 ThreadId = 0, IConsoleThreadPropagation* InCallback = 0) = 0;
912
913
914 FORCEINLINE static IConsoleManager& Get()
915 {
916 if (!Singleton)
917 {
918 SetupSingleton();
919 check(Singleton != nullptr);
920 }
921 return *Singleton;
922 }
923
924 protected:
925 virtual ~IConsoleManager() { }
926
927 private:
928
929 static IConsoleManager* Singleton;
930
931
932 static void SetupSingleton();
933 };
934
935
936
937
938
939 class CORE_API FAutoConsoleVariableSink
940 {
941 public:
942
943 FAutoConsoleVariableSink(const FConsoleCommandDelegate& InCommand)
944 : Command(InCommand)
945 {
946 Handle = IConsoleManager::Get().RegisterConsoleVariableSink_Handle(Command);
947 }
948
949 virtual ~FAutoConsoleVariableSink()
950 {
951
952 }
953
954 const FConsoleCommandDelegate& Command;
955 FConsoleVariableSinkHandle Handle;
956 };
957
958
959
960
961
962 class CORE_API FAutoConsoleObject
963 {
964 protected:
965
966 FAutoConsoleObject(IConsoleObject* InTarget)
967 : Target(InTarget)
968 {
969 check(Target);
970 }
971
972 virtual ~FAutoConsoleObject()
973 {
974 IConsoleManager::Get().UnregisterConsoleObject(Target);
975 }
976
977 public:
978
979 FORCEINLINE IConsoleVariable* AsVariable()
980 {
981 checkSlow(Target->AsVariable());
982 return static_cast<IConsoleVariable*>(Target);
983 }
984
985 FORCEINLINE const IConsoleVariable* AsVariable() const
986 {
987 checkSlow(Target->AsVariable());
988 return static_cast<const IConsoleVariable*>(Target);
989 }
990
991 private:
992
993 IConsoleObject* Target;
994 };
995
996 #if !NO_CVARS
997
998
999
1000 class CORE_API FAutoConsoleVariable : private FAutoConsoleObject
1001 {
1002 public:
1003
1004
1005
1006
1007
1008
1009 FAutoConsoleVariable(const TCHAR* Name, bool DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1010 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1011 {
1012 }
1013
1014
1015
1016
1017
1018
1019 FAutoConsoleVariable(const TCHAR* Name, int32 DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1020 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1021 {
1022 }
1023
1024
1025
1026
1027
1028
1029 FAutoConsoleVariable(const TCHAR* Name, float DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1030 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1031 {
1032 }
1033
1034
1035
1036
1037
1038
1039 FAutoConsoleVariable(const TCHAR* Name, const TCHAR* DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1040 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1041 {
1042 }
1043
1044
1045
1046
1047
1048
1049
1050
1051 FAutoConsoleVariable(const TCHAR* Name, bool DefaultValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1052 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1053 {
1054 AsVariable()->SetOnChangedCallback(Callback);
1055 }
1056
1057
1058
1059
1060
1061
1062
1063
1064 FAutoConsoleVariable(const TCHAR* Name, int32 DefaultValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1065 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1066 {
1067 AsVariable()->SetOnChangedCallback(Callback);
1068 }
1069
1070
1071
1072
1073
1074
1075
1076
1077 FAutoConsoleVariable(const TCHAR* Name, float DefaultValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1078 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1079 {
1080 AsVariable()->SetOnChangedCallback(Callback);
1081 }
1082
1083
1084
1085
1086
1087
1088
1089
1090 FAutoConsoleVariable(const TCHAR* Name, const TCHAR* DefaultValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1091 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1092 {
1093 AsVariable()->SetOnChangedCallback(Callback);
1094 }
1095
1096
1097 FORCEINLINE IConsoleVariable& operator*()
1098 {
1099 return *AsVariable();
1100 }
1101 FORCEINLINE const IConsoleVariable& operator*() const
1102 {
1103 return *AsVariable();
1104 }
1105
1106 FORCEINLINE IConsoleVariable* operator->()
1107 {
1108 return AsVariable();
1109 }
1110 FORCEINLINE const IConsoleVariable* operator->() const
1111 {
1112 return AsVariable();
1113 }
1114 };
1115 #else
1116 class CORE_API FAutoConsoleVariable
1117 {
1118 public:
1119 FAutoConsoleVariable(const TCHAR* Name, int32 DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1120 {
1121 }
1122
1123 FAutoConsoleVariable(const TCHAR* Name, float DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1124 {
1125 }
1126
1127 FAutoConsoleVariable(const TCHAR* Name, const TCHAR* DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1128 {
1129 }
1130 };
1131 #endif
1132
1133 #if !NO_CVARS
1134
1135
1136
1137 class CORE_API FAutoConsoleVariableRef : private FAutoConsoleObject
1138 {
1139 public:
1140
1141
1142
1143
1144
1145
1146 FAutoConsoleVariableRef(const TCHAR* Name, int32& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1147 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1148 {
1149 }
1150
1151
1152
1153
1154
1155
1156 FAutoConsoleVariableRef(const TCHAR* Name, float& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1157 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1158 {
1159 }
1160
1161
1162
1163
1164
1165
1166 FAutoConsoleVariableRef(const TCHAR* Name, bool& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1167 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1168 {
1169 }
1170
1171
1172
1173
1174
1175
1176 FAutoConsoleVariableRef(const TCHAR* Name, FString& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1177 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1178 {
1179 }
1180
1181
1182
1183
1184
1185
1186
1187
1188 FAutoConsoleVariableRef(const TCHAR* Name, int32& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1189 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1190 {
1191 AsVariable()->SetOnChangedCallback(Callback);
1192 }
1193
1194
1195
1196
1197
1198
1199
1200
1201 FAutoConsoleVariableRef(const TCHAR* Name, float& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1202 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1203 {
1204 AsVariable()->SetOnChangedCallback(Callback);
1205 }
1206
1207
1208
1209
1210
1211
1212
1213
1214 FAutoConsoleVariableRef(const TCHAR* Name, bool& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1215 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1216 {
1217 AsVariable()->SetOnChangedCallback(Callback);
1218 }
1219
1220
1221
1222
1223
1224
1225
1226
1227 FAutoConsoleVariableRef(const TCHAR* Name, FString& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1228 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariableRef(Name, RefValue, Help, Flags))
1229 {
1230 AsVariable()->SetOnChangedCallback(Callback);
1231 }
1232
1233 virtual ~FAutoConsoleVariableRef()
1234 {
1235 }
1236
1237 FORCEINLINE IConsoleVariable& operator*()
1238 {
1239 return *AsVariable();
1240 }
1241 FORCEINLINE const IConsoleVariable& operator*() const
1242 {
1243 return *AsVariable();
1244 }
1245
1246 FORCEINLINE IConsoleVariable* operator->()
1247 {
1248 return AsVariable();
1249 }
1250 FORCEINLINE const IConsoleVariable* operator->() const
1251 {
1252 return AsVariable();
1253 }
1254 };
1255 #else
1256 class CORE_API FAutoConsoleVariableRef
1257 {
1258 public:
1259 FAutoConsoleVariableRef(const TCHAR* Name, int32& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1260 {
1261 }
1262
1263 FAutoConsoleVariableRef(const TCHAR* Name, float& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1264 {
1265 }
1266
1267 FAutoConsoleVariableRef(const TCHAR* Name, bool& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1268 {
1269 }
1270
1271 FAutoConsoleVariableRef(const TCHAR* Name, FString& RefValue, const TCHAR* Help, uint32 Flags = ECVF_Default)
1272 {
1273 }
1274
1275 FAutoConsoleVariableRef(const TCHAR* Name, int32& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1276 {
1277 }
1278
1279 FAutoConsoleVariableRef(const TCHAR* Name, float& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1280 {
1281 }
1282
1283 FAutoConsoleVariableRef(const TCHAR* Name, bool& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1284 {
1285 }
1286
1287 FAutoConsoleVariableRef(const TCHAR* Name, FString& RefValue, const TCHAR* Help, const FConsoleVariableDelegate& Callback, uint32 Flags = ECVF_Default)
1288 {
1289 }
1290 };
1291 #endif
1292
1293
1294
1295
1296
1297 template <class T>
1298 class TConsoleVariableData
1299 {
1300 public:
1301
1302 TConsoleVariableData(const T DefaultValue)
1303 {
1304 for(uint32 i = 0; i < UE_ARRAY_COUNT(ShadowedValue); ++i)
1305 {
1306 ShadowedValue[i] = DefaultValue;
1307 }
1308 }
1309
1310
1311 T GetValueOnGameThread() const
1312 {
1313
1314 cvarCheckCode(ensure(GetShadowIndex() == 0));
1315 return ShadowedValue[0];
1316 }
1317
1318
1319 T GetValueOnRenderThread() const
1320 {
1321 #if !defined(__clang__)
1322
1323 cvarCheckCode(ensure(IsInParallelRenderingThread()));
1324 #endif
1325 return ShadowedValue[1];
1326 }
1327
1328
1329 T GetValueOnAnyThread(bool bForceGameThread = false) const
1330 {
1331 return ShadowedValue[GetShadowIndex(bForceGameThread)];
1332 }
1333
1334 private:
1335
1336
1337 T ShadowedValue[2];
1338
1339
1340 static uint32 GetShadowIndex(bool bForceGameThread = false)
1341 {
1342 if (bForceGameThread)
1343 {
1344 cvarCheckCode(ensure(!IsInActualRenderingThread()));
1345 return 0;
1346 }
1347 return IsInGameThread() ? 0 : 1;
1348 }
1349
1350
1351 T& GetReferenceOnAnyThread(bool bForceGameThread = false)
1352 {
1353 return ShadowedValue[GetShadowIndex(bForceGameThread)];
1354 }
1355
1356 template<class T2> friend class FConsoleVariable;
1357 template<class T2> friend class TAutoConsoleVariable;
1358 };
1359
1360 #if !NO_CVARS
1361
1362
1363
1364 template <class T>
1365 class TAutoConsoleVariable : public FAutoConsoleObject
1366 {
1367 public:
1368
1369
1370
1371
1372
1373
1374 TAutoConsoleVariable(const TCHAR* Name, const T& DefaultValue, const TCHAR* Help, uint32 Flags = ECVF_Default);
1375
1376 T GetValueOnGameThread() const
1377 {
1378 return Ref->GetValueOnGameThread();
1379 }
1380
1381 T GetValueOnRenderThread() const
1382 {
1383 return Ref->GetValueOnRenderThread();
1384 }
1385
1386 T GetValueOnAnyThread(bool bForceGameThread = false) const
1387 {
1388 return Ref->GetValueOnAnyThread(bForceGameThread);
1389 }
1390
1391
1392 FORCEINLINE IConsoleVariable& operator*()
1393 {
1394 return *AsVariable();
1395 }
1396 FORCEINLINE const IConsoleVariable& operator*() const
1397 {
1398 return *AsVariable();
1399 }
1400
1401 FORCEINLINE IConsoleVariable* operator->()
1402 {
1403 return AsVariable();
1404 }
1405 FORCEINLINE const IConsoleVariable* operator->() const
1406 {
1407 return AsVariable();
1408 }
1409 private:
1410 TConsoleVariableData<T>* Ref;
1411 };
1412
1413 template <>
1414 inline TAutoConsoleVariable<bool>::TAutoConsoleVariable(const TCHAR* Name, const bool& DefaultValue, const TCHAR* Help, uint32 Flags)
1415 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1416 {
1417 Ref = AsVariable()->AsVariableBool();
1418 }
1419
1420 template <>
1421 inline TAutoConsoleVariable<int32>::TAutoConsoleVariable(const TCHAR* Name, const int32& DefaultValue, const TCHAR* Help, uint32 Flags)
1422 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1423 {
1424 Ref = AsVariable()->AsVariableInt();
1425 }
1426
1427 template <>
1428 inline TAutoConsoleVariable<float>::TAutoConsoleVariable(const TCHAR* Name, const float& DefaultValue, const TCHAR* Help, uint32 Flags)
1429 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1430 {
1431 Ref = AsVariable()->AsVariableFloat();
1432 }
1433
1434 template <>
1435 inline TAutoConsoleVariable<FString>::TAutoConsoleVariable(const TCHAR* Name, const FString& DefaultValue, const TCHAR* Help, uint32 Flags)
1436 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleVariable(Name, DefaultValue, Help, Flags))
1437 {
1438 Ref = AsVariable()->AsVariableString();
1439 }
1440 #else
1441 template <class T>
1442 class TAutoConsoleVariable : public IConsoleVariable
1443 {
1444 public:
1445 TAutoConsoleVariable(const TCHAR* Name, const T& DefaultValue, const TCHAR* InHelp, uint32 InFlags = ECVF_Default)
1446 : Value(DefaultValue), Flags((EConsoleVariableFlags)InFlags)
1447 {
1448 }
1449
1450 T GetValueOnGameThread() const
1451 {
1452 return Value.GetValueOnGameThread();
1453 }
1454
1455 T GetValueOnRenderThread() const
1456 {
1457 return Value.GetValueOnRenderThread();
1458 }
1459
1460 T GetValueOnAnyThread(bool bForceGameThread = false) const
1461 {
1462 return Value.GetValueOnAnyThread(bForceGameThread);
1463 }
1464
1465 IConsoleVariable& operator*()
1466 {
1467 return *AsVariable();
1468 }
1469
1470 const IConsoleVariable& operator*() const
1471 {
1472 return *AsVariable();
1473 }
1474
1475 IConsoleVariable* operator->()
1476 {
1477 return AsVariable();
1478 }
1479
1480 const IConsoleVariable* operator->() const
1481 {
1482 return AsVariable();
1483 }
1484
1485 IConsoleVariable* AsVariable() { return this; }
1486 const IConsoleVariable* AsVariable() const { return this; }
1487
1488 virtual class TConsoleVariableData<int32>* AsVariableInt() override { return AsImpl<int32>(); }
1489 virtual class TConsoleVariableData<float>* AsVariableFloat() override { return AsImpl<float>(); }
1490 virtual class TConsoleVariableData<FString>* AsVariableString() override { return AsImpl<FString>(); }
1491
1492 virtual bool IsVariableInt() const override { return TIsSame<int32, T>::Value; }
1493 virtual int32 GetInt() const override { return GetImpl<int32>(); }
1494 virtual float GetFloat() const override { return GetImpl<float>(); }
1495 virtual FString GetString() const override { return GetImpl<FString>(); }
1496 virtual bool GetBool() const override { return GetImpl<bool>(); }
1497
1498 virtual const TCHAR* GetHelp() const override
1499 {
1500 return TEXT("NO_CVARS, no help");
1501 }
1502
1503 virtual void SetHelp(const TCHAR* InHelp) override
1504 {
1505 check(false);
1506 }
1507
1508 virtual void Release() override
1509 {
1510 check(false);
1511 }
1512
1513 virtual void SetOnChangedCallback(const FConsoleVariableDelegate &) override
1514 {
1515 check(false);
1516 }
1517
1518 virtual FConsoleVariableMulticastDelegate& OnChangedDelegate()override
1519 {
1520 static FConsoleVariableMulticastDelegate Dummy;
1521 check(false);
1522 return Dummy;
1523 }
1524
1525 virtual EConsoleVariableFlags GetFlags() const override
1526 {
1527 return Flags;
1528 }
1529
1530 virtual void SetFlags(const EConsoleVariableFlags InFlags) override
1531 {
1532 Flags = InFlags;
1533 }
1534
1535 virtual void Set(const TCHAR* InValue, EConsoleVariableFlags SetBy) override
1536 {
1537 LexFromString(Value.ShadowedValue[0], InValue);
1538 }
1539
1540 private:
1541 TConsoleVariableData<T> Value;
1542 FString Help;
1543 EConsoleVariableFlags Flags = EConsoleVariableFlags::ECVF_Default;
1544
1545 template<class Y>
1546 typename TEnableIf<!TIsSame<T, Y>::Value, Y>::Type GetImpl() const
1547 {
1548 check(false);
1549 return Y();
1550 }
1551
1552 template<class Y>
1553 typename TEnableIf<TIsSame<T, Y>::Value, Y>::Type GetImpl() const
1554 {
1555 return GetValueOnAnyThread();
1556 }
1557
1558 template<class Y>
1559 typename TEnableIf<!TIsSame<T, Y>::Value, TConsoleVariableData<Y>*>::Type AsImpl()
1560 {
1561 check(false);
1562 return nullptr;
1563 }
1564
1565 template<class Y>
1566 typename TEnableIf<TIsSame<T, Y>::Value, TConsoleVariableData<T>*>::Type AsImpl()
1567 {
1568 return &Value;
1569 }
1570 };
1571 #endif
1572
1573 #if !NO_CVARS
1574
1575
1576
1577 class CORE_API FAutoConsoleCommand : private FAutoConsoleObject
1578 {
1579 public:
1580
1581
1582
1583
1584
1585
1586
1587
1588 FAutoConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandDelegate& Command, uint32 Flags = ECVF_Default)
1589 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleCommand(Name, Help, Command, Flags))
1590 {
1591 }
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601 FAutoConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithArgsDelegate& Command, uint32 Flags = ECVF_Default)
1602 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleCommand(Name, Help, Command, Flags))
1603 {
1604 }
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614 FAutoConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldArgsAndOutputDeviceDelegate& Command, uint32 Flags = ECVF_Default)
1615 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleCommand(Name, Help, Command, Flags))
1616 {
1617 }
1618 };
1619 #else
1620 class CORE_API FAutoConsoleCommand
1621 {
1622 public:
1623 FAutoConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandDelegate& Command, uint32 Flags = ECVF_Default)
1624 {
1625 }
1626
1627 FAutoConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithArgsDelegate& Command, uint32 Flags = ECVF_Default)
1628 {
1629 }
1630
1631 FAutoConsoleCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldArgsAndOutputDeviceDelegate& Command, uint32 Flags = ECVF_Default)
1632 {
1633 }
1634 };
1635 #endif
1636
1637
1638 #if !NO_CVARS
1639
1640
1641
1642 class CORE_API FAutoConsoleCommandWithWorld : private FAutoConsoleObject
1643 {
1644 public:
1645
1646
1647
1648
1649
1650
1651
1652
1653 FAutoConsoleCommandWithWorld(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldDelegate& Command, uint32 Flags = ECVF_Default)
1654 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleCommand(Name, Help, Command, Flags))
1655 {
1656 }
1657
1658
1659 };
1660
1661
1662
1663
1664 class CORE_API FAutoConsoleCommandWithWorldAndArgs : private FAutoConsoleObject
1665 {
1666 public:
1667
1668
1669
1670
1671
1672
1673
1674
1675 FAutoConsoleCommandWithWorldAndArgs(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldAndArgsDelegate& Command, uint32 Flags = ECVF_Default)
1676 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleCommand(Name, Help, Command, Flags))
1677 {
1678 }
1679 };
1680
1681
1682
1683
1684 class CORE_API FAutoConsoleCommandWithOutputDevice : private FAutoConsoleObject
1685 {
1686 public:
1687
1688
1689
1690
1691
1692
1693
1694
1695 FAutoConsoleCommandWithOutputDevice(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithOutputDeviceDelegate& Command, uint32 Flags = ECVF_Default)
1696 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleCommand(Name, Help, Command, Flags))
1697 {
1698 }
1699 };
1700
1701
1702
1703
1704 class CORE_API FAutoConsoleCommandWithWorldArgsAndOutputDevice : private FAutoConsoleObject
1705 {
1706 public:
1707
1708
1709
1710
1711
1712
1713
1714
1715 FAutoConsoleCommandWithWorldArgsAndOutputDevice(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithWorldArgsAndOutputDeviceDelegate& Command, uint32 Flags = ECVF_Default)
1716 : FAutoConsoleObject(IConsoleManager::Get().RegisterConsoleCommand(Name, Help, Command, Flags))
1717 {
1718 }
1719 };
1720
1721 #else
1722
1723 class FAutoConsoleCommandWithWorld
1724 {
1725 public:
1726 template<class... Args> FAutoConsoleCommandWithWorld(const Args&...) {}
1727 };
1728
1729 class FAutoConsoleCommandWithWorldAndArgs
1730 {
1731 public:
1732 template<class... Args> FAutoConsoleCommandWithWorldAndArgs(const Args&...) {}
1733 };
1734
1735 class FAutoConsoleCommandWithOutputDevice
1736 {
1737 public:
1738 template<class... Args> FAutoConsoleCommandWithOutputDevice(const Args&...) {}
1739 };
1740
1741 class FAutoConsoleCommandWithWorldArgsAndOutputDevice
1742 {
1743 public:
1744 template<class... Args> FAutoConsoleCommandWithWorldArgsAndOutputDevice(const Args&...) {}
1745 };
1746
1747 #endif
1748
1749 CORE_API DECLARE_LOG_CATEGORY_EXTERN(LogConsoleResponse, Log, All);