Skip to content

Commit 249c2d7

Browse files
committed
Implements IsMultiplayerOnly for ViniferaCommandClass.
1 parent 68c2bde commit 249c2d7

File tree

2 files changed

+96
-14
lines changed

2 files changed

+96
-14
lines changed

src/extensions/command/commandext.h

+22-14
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,24 @@ class HouseClass;
4141
class ViniferaCommandClass : public CommandClass
4242
{
4343
public:
44-
ViniferaCommandClass() : CommandClass(), IsDeveloper(false) {}
44+
ViniferaCommandClass() : CommandClass(), IsDeveloper(false), IsMultiplayerOnly(false) {}
4545
virtual ~ViniferaCommandClass() {}
4646

4747
virtual KeyNumType Default_Key() const = 0;
4848

49+
bool Developer_Only() const { return IsDeveloper; }
50+
bool Multiplayer_Only() const { return IsMultiplayerOnly; }
51+
4952
public:
5053
/**
5154
* Is this command only available in developer mode?
5255
*/
5356
bool IsDeveloper;
57+
58+
/**
59+
* Is this command only available in multiplayer games?
60+
*/
61+
bool IsMultiplayerOnly;
5462
};
5563

5664

@@ -60,7 +68,7 @@ class ViniferaCommandClass : public CommandClass
6068
class PNGScreenCaptureCommandClass : public ViniferaCommandClass
6169
{
6270
public:
63-
PNGScreenCaptureCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
71+
PNGScreenCaptureCommandClass() : ViniferaCommandClass() {}
6472
virtual ~PNGScreenCaptureCommandClass() {}
6573

6674
virtual const char *Get_Name() const override;
@@ -80,7 +88,7 @@ class PNGScreenCaptureCommandClass : public ViniferaCommandClass
8088
class ManualPlaceCommandClass : public ViniferaCommandClass
8189
{
8290
public:
83-
ManualPlaceCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
91+
ManualPlaceCommandClass() : ViniferaCommandClass() {}
8492
virtual ~ManualPlaceCommandClass() {}
8593

8694
virtual const char *Get_Name() const override;
@@ -99,7 +107,7 @@ class ManualPlaceCommandClass : public ViniferaCommandClass
99107
class PrevThemeCommandClass : public ViniferaCommandClass
100108
{
101109
public:
102-
PrevThemeCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
110+
PrevThemeCommandClass() : ViniferaCommandClass() {}
103111
virtual ~PrevThemeCommandClass() {}
104112

105113
virtual const char *Get_Name() const override;
@@ -118,7 +126,7 @@ class PrevThemeCommandClass : public ViniferaCommandClass
118126
class NextThemeCommandClass : public ViniferaCommandClass
119127
{
120128
public:
121-
NextThemeCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
129+
NextThemeCommandClass() : ViniferaCommandClass() {}
122130
virtual ~NextThemeCommandClass() {}
123131

124132
virtual const char *Get_Name() const override;
@@ -137,7 +145,7 @@ class NextThemeCommandClass : public ViniferaCommandClass
137145
class ScrollNECommandClass : public ViniferaCommandClass
138146
{
139147
public:
140-
ScrollNECommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
148+
ScrollNECommandClass() : ViniferaCommandClass() {}
141149
virtual ~ScrollNECommandClass() {}
142150

143151
virtual const char *Get_Name() const override;
@@ -156,7 +164,7 @@ class ScrollNECommandClass : public ViniferaCommandClass
156164
class ScrollSECommandClass : public ViniferaCommandClass
157165
{
158166
public:
159-
ScrollSECommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
167+
ScrollSECommandClass() : ViniferaCommandClass() {}
160168
virtual ~ScrollSECommandClass() {}
161169

162170
virtual const char *Get_Name() const override;
@@ -175,7 +183,7 @@ class ScrollSECommandClass : public ViniferaCommandClass
175183
class ScrollSWCommandClass : public ViniferaCommandClass
176184
{
177185
public:
178-
ScrollSWCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
186+
ScrollSWCommandClass() : ViniferaCommandClass() {}
179187
virtual ~ScrollSWCommandClass() {}
180188

181189
virtual const char *Get_Name() const override;
@@ -194,7 +202,7 @@ class ScrollSWCommandClass : public ViniferaCommandClass
194202
class ScrollNWCommandClass : public ViniferaCommandClass
195203
{
196204
public:
197-
ScrollNWCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
205+
ScrollNWCommandClass() : ViniferaCommandClass() {}
198206
virtual ~ScrollNWCommandClass() {}
199207

200208
virtual const char *Get_Name() const override;
@@ -213,7 +221,7 @@ class ScrollNWCommandClass : public ViniferaCommandClass
213221
class JumpCameraWestCommandClass : public ViniferaCommandClass
214222
{
215223
public:
216-
JumpCameraWestCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
224+
JumpCameraWestCommandClass() : ViniferaCommandClass() {}
217225
virtual ~JumpCameraWestCommandClass() {}
218226

219227
virtual const char *Get_Name() const override;
@@ -232,7 +240,7 @@ class JumpCameraWestCommandClass : public ViniferaCommandClass
232240
class JumpCameraEastCommandClass : public ViniferaCommandClass
233241
{
234242
public:
235-
JumpCameraEastCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
243+
JumpCameraEastCommandClass() : ViniferaCommandClass() {}
236244
virtual ~JumpCameraEastCommandClass() {}
237245

238246
virtual const char *Get_Name() const override;
@@ -251,7 +259,7 @@ class JumpCameraEastCommandClass : public ViniferaCommandClass
251259
class JumpCameraNorthCommandClass : public ViniferaCommandClass
252260
{
253261
public:
254-
JumpCameraNorthCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
262+
JumpCameraNorthCommandClass() : ViniferaCommandClass() {}
255263
virtual ~JumpCameraNorthCommandClass() {}
256264

257265
virtual const char *Get_Name() const override;
@@ -270,7 +278,7 @@ class JumpCameraNorthCommandClass : public ViniferaCommandClass
270278
class JumpCameraSouthCommandClass : public ViniferaCommandClass
271279
{
272280
public:
273-
JumpCameraSouthCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
281+
JumpCameraSouthCommandClass() : ViniferaCommandClass() {}
274282
virtual ~JumpCameraSouthCommandClass() {}
275283

276284
virtual const char *Get_Name() const override;
@@ -289,7 +297,7 @@ class JumpCameraSouthCommandClass : public ViniferaCommandClass
289297
class ToggleSuperTimersCommandClass : public ViniferaCommandClass
290298
{
291299
public:
292-
ToggleSuperTimersCommandClass() : ViniferaCommandClass() { IsDeveloper = false; }
300+
ToggleSuperTimersCommandClass() : ViniferaCommandClass() {}
293301
virtual ~ToggleSuperTimersCommandClass() {}
294302

295303
virtual const char *Get_Name() const override;

src/extensions/command/commandext_hooks.cpp

+74
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "commandext.h"
2929
#include "vinifera_globals.h"
3030
#include "tibsun_functions.h"
31+
#include "tibsun_globals.h"
32+
#include "session.h"
3133
#include "ccfile.h"
3234
#include "ccini.h"
3335
#include "object.h"
@@ -37,6 +39,76 @@
3739
#include "debughandler.h"
3840

3941

42+
// This can not be in client compatabile builds currently as the additional
43+
// commands added do not have runtime type information.
44+
#if !defined(TS_CLIENT)
45+
/**
46+
* This function reimplements the chunk of code that populates the keyboard
47+
* command list box. This allows us to enforce limits on what commands
48+
* to show depending on the current game mode.
49+
*
50+
* @author: CCHyper
51+
*/
52+
static void Populate_Command_Categories(HWND hWnd, const char *category)
53+
{
54+
for (int i = 0; i < Commands.Count(); ++i) {
55+
CommandClass *cmd = Commands[i];
56+
if (!cmd) {
57+
continue;
58+
}
59+
60+
/**
61+
* Any Vinifera commands are subject to game mode checks. We only need
62+
* to check these if are actually "in game".
63+
*/
64+
if (bool_007E4040 || bool_007E48FC) {
65+
66+
ViniferaCommandClass *vcmd = dynamic_cast<ViniferaCommandClass *>(cmd);
67+
if (vcmd) {
68+
if (vcmd->Multiplayer_Only() && (Session.Type == GAME_NORMAL || Session.Type == GAME_SKIRMISH || Session.Type == GAME_WDT)) {
69+
continue;
70+
}
71+
if (vcmd->Developer_Only() && !Vinifera_DeveloperMode) {
72+
continue;
73+
}
74+
}
75+
76+
}
77+
78+
if (strcmpi(cmd->Get_Category(), category) != 0) {
79+
continue;
80+
}
81+
82+
/**
83+
* Add the string and data pair to the list box.
84+
*/
85+
LRESULT result = SendMessage(hWnd, LB_ADDSTRING, 0, (LPARAM)cmd->Get_UI_Name());
86+
if (result != LB_ERR && result != LB_ERRSPACE) {
87+
UINT index = (UINT)result;
88+
SendMessage(hWnd, LB_SETITEMDATA, index, (LPARAM)cmd);
89+
}
90+
91+
}
92+
}
93+
#endif
94+
95+
96+
/**
97+
* Patch to intercept the populating of the keyboard command list box.
98+
*
99+
* @author: CCHyper
100+
*/
101+
DECLARE_PATCH(_OptionsClass_Keyboard_Options_Dialog_Populate_Intercept_Patch)
102+
{
103+
GET_REGISTER_STATIC(HWND, hWnd, ebp);
104+
LEA_STACK_STATIC(const char *, category, esp, 0x0A4);
105+
106+
Populate_Command_Categories(hWnd, category);
107+
108+
JMP(0x0058A79C);
109+
}
110+
111+
40112
/**
41113
* #issue-#53
42114
*
@@ -463,4 +535,6 @@ void CommandExtension_Hooks()
463535
Hook_Virtual(0x004EAB00, PNGScreenCaptureCommandClass::Process);
464536

465537
Patch_Jump(0x004E95C2, &_GuardCommandClass_Process_Harvesters_Set_Mission_Patch);
538+
539+
Patch_Jump(0x0058A72E, &_OptionsClass_Keyboard_Options_Dialog_Populate_Intercept_Patch);
466540
}

0 commit comments

Comments
 (0)