Multiplayer platform
Revision | 743e5b381086d3cbb41a8d48390fd9e8a791231e (tree) |
---|---|
Time | 2017-05-22 02:56:26 |
Author | Face |
Commiter | Face |
OMPClient: added keyboard handler again including status send ping key "S"
@@ -0,0 +1,239 @@ | ||
1 | +// ============================================================== | |
2 | +// ORBITER MODULE: ASCENSIONULTRA | |
3 | +// Part of Ascension Ultra | |
4 | +// Copyright (C) 2010 Friedrich Kastner-Masilko | |
5 | +// All rights reserved | |
6 | +// | |
7 | +// KeyboardFilter.cpp | |
8 | +// Class implementation of keyboard filter. | |
9 | +// ============================================================== | |
10 | +#include <windows.h> | |
11 | +#include "KeyboardFilter.h" | |
12 | +#include <stdio.h> | |
13 | + | |
14 | +LRESULT CALLBACK Intercept(int nCode, WPARAM wParam, LPARAM lParam) | |
15 | +{ | |
16 | + KeyboardFilter filter=*KeyboardFilter::Current; | |
17 | + if (nCode < 0) return CallNextHookEx(filter.GetHook(), nCode, wParam, lParam); | |
18 | + filter.Preprocess(wParam, lParam); | |
19 | + filter.Process(wParam, (lParam & 0x80000000)==0); | |
20 | + return CallNextHookEx(filter.GetHook(), nCode, wParam, lParam); | |
21 | +} | |
22 | + | |
23 | +KeyboardFilter::KeyboardFilter(void *obj, int (*consumeDirectKey)(void*, char*), void (*prefilter)(void*, WPARAM &wparam, LPARAM &lparam)) | |
24 | +{ | |
25 | + //Install keyboard hook | |
26 | + if (Current==NULL) | |
27 | + { | |
28 | + Current=this; | |
29 | + ConsumeDirectKey=consumeDirectKey; | |
30 | + Prefilter=prefilter; | |
31 | + object=obj; | |
32 | + kstate=new char[256]; | |
33 | + for(int i=0;i<256;i++) kstate[i]=(char)0x00; | |
34 | + hhook=SetWindowsHookEx(WH_KEYBOARD, Intercept, NULL, GetCurrentThreadId()); | |
35 | + } | |
36 | +} | |
37 | + | |
38 | +KeyboardFilter::~KeyboardFilter(void) | |
39 | +{ | |
40 | + if (Current==this) | |
41 | + { | |
42 | + UnhookWindowsHookEx(hhook); | |
43 | + delete [] kstate; | |
44 | + ConsumeDirectKey=NULL; | |
45 | + Prefilter=NULL; | |
46 | + Current=NULL; | |
47 | + } | |
48 | +} | |
49 | + | |
50 | +void KeyboardFilter::Preprocess(WPARAM &wparam, LPARAM &lparam) | |
51 | +{ | |
52 | + if (Prefilter!=NULL) | |
53 | + { | |
54 | + Prefilter(object, wparam, lparam); | |
55 | + } | |
56 | +} | |
57 | + | |
58 | +int KeyboardFilter::Process(short key, bool down) | |
59 | +{ | |
60 | + bool edge=(kstate[VK2OAPI[key]] & 0x80)>0; | |
61 | + if (down) kstate[VK2OAPI[key]]=0x80; | |
62 | + else kstate[VK2OAPI[key]]=0x00; | |
63 | + return down ^ edge?ConsumeDirectKey(object, kstate):0; | |
64 | +} | |
65 | + | |
66 | +KeyboardFilter *KeyboardFilter::Current=NULL; | |
67 | + | |
68 | +HHOOK KeyboardFilter::GetHook(){return hhook;} | |
69 | + | |
70 | +//Convert OAPI key identifier to virtual key code | |
71 | +const short KeyboardFilter::OAPI2VK[256]= | |
72 | +{ | |
73 | + 0x00,//--- 0x00 | |
74 | + 0x1b,//#define OAPI_KEY_ESCAPE 0x01 | |
75 | + 0x31,//#define OAPI_KEY_1 0x02 | |
76 | + 0x32,//#define OAPI_KEY_2 0x03 | |
77 | + 0x33,//#define OAPI_KEY_3 0x04 | |
78 | + 0x34,//#define OAPI_KEY_4 0x05 | |
79 | + 0x35,//#define OAPI_KEY_5 0x06 | |
80 | + 0x36,//#define OAPI_KEY_6 0x07 | |
81 | + 0x37,//#define OAPI_KEY_7 0x08 | |
82 | + 0x38,//#define OAPI_KEY_8 0x09 | |
83 | + 0x39,//#define OAPI_KEY_9 0x0A | |
84 | + 0x30,//#define OAPI_KEY_0 0x0B | |
85 | + 0xBD,//#define OAPI_KEY_MINUS 0x0C // on main keyboard | |
86 | + 0x00,//#define OAPI_KEY_EQUALS 0x0D | |
87 | + 0x08,//#define OAPI_KEY_BACK 0x0E // backspace | |
88 | + 0x09,//#define OAPI_KEY_TAB 0x0F | |
89 | + 0x51,//#define OAPI_KEY_Q 0x10 | |
90 | + 0x57,//#define OAPI_KEY_W 0x11 | |
91 | + 0x45,//#define OAPI_KEY_E 0x12 | |
92 | + 0x52,//#define OAPI_KEY_R 0x13 | |
93 | + 0x54,//#define OAPI_KEY_T 0x14 | |
94 | + 0x59,//#define OAPI_KEY_Y 0x15 | |
95 | + 0x55,//#define OAPI_KEY_U 0x16 | |
96 | + 0x49,//#define OAPI_KEY_I 0x17 | |
97 | + 0x4F,//#define OAPI_KEY_O 0x18 | |
98 | + 0x50,//#define OAPI_KEY_P 0x19 | |
99 | + 0xDB,//#define OAPI_KEY_LBRACKET 0x1A | |
100 | + 0xDD,//#define OAPI_KEY_RBRACKET 0x1B | |
101 | + 0x0D,//#define OAPI_KEY_RETURN 0x1C // Enter on main keyboard | |
102 | + 0xA2,//#define OAPI_KEY_LCONTROL 0x1D | |
103 | + 0x41,//#define OAPI_KEY_A 0x1E | |
104 | + 0x53,//#define OAPI_KEY_S 0x1F | |
105 | + 0x44,//#define OAPI_KEY_D 0x20 | |
106 | + 0x46,//#define OAPI_KEY_F 0x21 | |
107 | + 0x47,//#define OAPI_KEY_G 0x22 | |
108 | + 0x48,//#define OAPI_KEY_H 0x23 | |
109 | + 0x4A,//#define OAPI_KEY_J 0x24 | |
110 | + 0x4B,//#define OAPI_KEY_K 0x25 | |
111 | + 0x4C,//#define OAPI_KEY_L 0x26 | |
112 | + 0xBA,//#define OAPI_KEY_SEMICOLON 0x27 | |
113 | + 0xDE,//#define OAPI_KEY_APOSTROPHE 0x28 | |
114 | + 0xC0,//#define OAPI_KEY_GRAVE 0x29 // accent grave | |
115 | + 0xA0,//#define OAPI_KEY_LSHIFT 0x2A | |
116 | + 0xDC,//#define OAPI_KEY_BACKSLASH 0x2B | |
117 | + 0x5A,//#define OAPI_KEY_Z 0x2C | |
118 | + 0x58,//#define OAPI_KEY_X 0x2D | |
119 | + 0x43,//#define OAPI_KEY_C 0x2E | |
120 | + 0x56,//#define OAPI_KEY_V 0x2F | |
121 | + 0x42,//#define OAPI_KEY_B 0x30 | |
122 | + 0x4E,//#define OAPI_KEY_N 0x31 | |
123 | + 0x4D,//#define OAPI_KEY_M 0x32 | |
124 | + 0xBC,//#define OAPI_KEY_COMMA 0x33 | |
125 | + 0xBE,//#define OAPI_KEY_PERIOD 0x34 // . on main keyboard | |
126 | + 0xBF,//#define OAPI_KEY_SLASH 0x35 // / on main keyboard | |
127 | + 0xA1,//#define OAPI_KEY_RSHIFT 0x36 | |
128 | + 0x6A,//#define OAPI_KEY_MULTIPLY 0x37 // * on numeric keypad | |
129 | + 0xA4,//#define OAPI_KEY_LALT 0x38 // left Alt | |
130 | + 0x20,//#define OAPI_KEY_SPACE 0x39 | |
131 | + 0x14,//#define OAPI_KEY_CAPITAL 0x3A // caps lock key | |
132 | + 0x70,//#define OAPI_KEY_F1 0x3B | |
133 | + 0x71,//#define OAPI_KEY_F2 0x3C | |
134 | + 0x72,//#define OAPI_KEY_F3 0x3D | |
135 | + 0x73,//#define OAPI_KEY_F4 0x3E | |
136 | + 0x74,//#define OAPI_KEY_F5 0x3F | |
137 | + 0x75,//#define OAPI_KEY_F6 0x40 | |
138 | + 0x76,//#define OAPI_KEY_F7 0x41 | |
139 | + 0x77,//#define OAPI_KEY_F8 0x42 | |
140 | + 0x78,//#define OAPI_KEY_F9 0x43 | |
141 | + 0x79,//#define OAPI_KEY_F10 0x44 | |
142 | + 0x90,//#define OAPI_KEY_NUMLOCK 0x45 | |
143 | + 0x91,//#define OAPI_KEY_SCROLL 0x46 // Scroll lock | |
144 | + 0x67,//#define OAPI_KEY_NUMPAD7 0x47 | |
145 | + 0x68,//#define OAPI_KEY_NUMPAD8 0x48 | |
146 | + 0x69,//#define OAPI_KEY_NUMPAD9 0x49 | |
147 | + 0x6D,//#define OAPI_KEY_SUBTRACT 0x4A // - on numeric keypad | |
148 | + 0x64,//#define OAPI_KEY_NUMPAD4 0x4B | |
149 | + 0x65,//#define OAPI_KEY_NUMPAD5 0x4C | |
150 | + 0x66,//#define OAPI_KEY_NUMPAD6 0x4D | |
151 | + 0x6B,//#define OAPI_KEY_ADD 0x4E // + on numeric keypad | |
152 | + 0x61,//#define OAPI_KEY_NUMPAD1 0x4F | |
153 | + 0x62,//#define OAPI_KEY_NUMPAD2 0x50 | |
154 | + 0x63,//#define OAPI_KEY_NUMPAD3 0x51 | |
155 | + 0x60,//#define OAPI_KEY_NUMPAD0 0x52 | |
156 | + 0x6E,//#define OAPI_KEY_DECIMAL 0x53 // . on numeric keypad | |
157 | + 0x00,//--- 0x54 | |
158 | + 0x00,//--- 0x55 | |
159 | + 0xE2,//#define OAPI_KEY_OEM_102 0x56 // | < > on UK/German keyboards | |
160 | + 0x7A,//#define OAPI_KEY_F11 0x57 | |
161 | + 0x7B,//#define OAPI_KEY_F12 0x58 | |
162 | + 0x00,//--- 0x59 | |
163 | + 0x00,//--- 0x5A | |
164 | + 0x00,//--- 0x5B | |
165 | + 0x00, 0x00, 0x00, 0x00, //5C,5D,5E,5F | |
166 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //60,61,62,63,64,65,66,67 | |
167 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //68,69,6A,6B,6C,6D,6E,6F | |
168 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //70,71,72,73,74,75,76,77 | |
169 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //78,79,7A,7B,7C,7D,7E,7F | |
170 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //80,81,82,83,84,85,86,87 | |
171 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //88,89,8A,8B,8C,8D,8E,8F | |
172 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //90,91,92,93,94,95,96,97 | |
173 | + 0x00, 0x00, 0x00, 0x00, //98,99,9A,9B | |
174 | + 0x6C,//#define OAPI_KEY_NUMPADENTER 0x9C // Enter on numeric keypad | |
175 | + 0xA3,//#define OAPI_KEY_RCONTROL 0x9D // right Control key | |
176 | + 0x00,//--- 0x9E | |
177 | + 0x00,//--- 0x9F | |
178 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //A0,A1,A2,A3,A4,A5,A6,A7 | |
179 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //A8,A9,AA,AB,AC,AD,AE,AF | |
180 | + 0x00, 0x00, 0x00, 0x00, //B0,B1,B2,B3 | |
181 | + 0x00,//--- 0xB4 | |
182 | + 0x6F,//#define OAPI_KEY_DIVIDE 0xB5 // / on numeric keypad | |
183 | + 0x00,//--- 0xB6 | |
184 | + 0x00,//--- 0xB7 | |
185 | + 0xA5,//#define OAPI_KEY_RALT 0xB8 // right Alt | |
186 | + 0x00,//--- 0xB9 | |
187 | + 0x00,//--- 0xBA | |
188 | + 0x00,//--- 0xBB | |
189 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //BC,BD,BE,BF,C0,C1,C2,C3 | |
190 | + 0x00,//--- 0xC4 | |
191 | + 0x00,//--- 0xC5 | |
192 | + 0x00,//--- 0xC6 | |
193 | + 0x24,//#define OAPI_KEY_HOME 0xC7 // Home on cursor keypad | |
194 | + 0x26,//#define OAPI_KEY_UP 0xC8 // up-arrow on cursor keypad | |
195 | + 0x21,//#define OAPI_KEY_PRIOR 0xC9 // PgUp on cursor keypad | |
196 | + 0x00,//--- 0xCA | |
197 | + 0x25,//#define OAPI_KEY_LEFT 0xCB // left-arrow on cursor keypad | |
198 | + 0x00,//--- 0xCC | |
199 | + 0x27,//#define OAPI_KEY_RIGHT 0xCD // right-arrow on cursor keypad | |
200 | + 0x00,//--- 0xCE | |
201 | + 0x23,//#define OAPI_KEY_END 0xCF // End on cursor keypad | |
202 | + 0x28,//#define OAPI_KEY_DOWN 0xD0 // down-arrow on cursor keypad | |
203 | + 0x22,//#define OAPI_KEY_NEXT 0xD1 // PgDn on cursor keypad | |
204 | + 0x2D,//#define OAPI_KEY_INSERT 0xD2 // Insert on cursor keypad | |
205 | + 0x2E //#define OAPI_KEY_DELETE 0xD3 // Delete on cursor keypad | |
206 | +}; | |
207 | + | |
208 | +const short KeyboardFilter::VK2OAPI[256]= | |
209 | +{ | |
210 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
211 | + 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, | |
212 | + 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, | |
213 | + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | |
214 | + 0x39, 0xC9, 0xD1, 0xCF, 0xC7, 0xCB, 0xC8, 0xCD, | |
215 | + 0xD0, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xD3, 0x00, | |
216 | + 0x0B, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, | |
217 | + 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
218 | + 0x00, 0x1E, 0x30, 0x2E, 0x20, 0x12, 0x21, 0x22, | |
219 | + 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, | |
220 | + 0x19, 0x10, 0x13, 0x1F, 0x14, 0x16, 0x2F, 0x11, | |
221 | + 0x2D, 0x15, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, | |
222 | + 0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47, | |
223 | + 0x48, 0x49, 0x37, 0x4E, 0x9C, 0x4A, 0x53, 0xB5, | |
224 | + 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, | |
225 | + 0x43, 0x44, 0x57, 0x58, 0x00, 0x00, 0x00, 0x00, | |
226 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
227 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
228 | + 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
229 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
230 | + 0x2A, 0x36, 0x1D, 0x9D, 0x38, 0xB8, 0x00, 0x00, | |
231 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
232 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
233 | + 0x00, 0x00, 0x27, 0x00, 0x33, 0x0C, 0x34, 0x35, | |
234 | + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
235 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
236 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
237 | + 0x00, 0x00, 0x00, 0x1A, 0x2B, 0x1B, 0x28, 0x00, | |
238 | + 0x00, 0x00, 0x56 | |
239 | +}; |
@@ -0,0 +1,28 @@ | ||
1 | +// ============================================================== | |
2 | +// ORBITER MODULE: ASCENSIONULTRA | |
3 | +// Part of Ascension Ultra | |
4 | +// Copyright (C) 2010 Friedrich Kastner-Masilko | |
5 | +// All rights reserved | |
6 | +// | |
7 | +// KeyboardFilter.h | |
8 | +// Class definition of keyboard filter. | |
9 | +// ============================================================== | |
10 | +#pragma once | |
11 | + | |
12 | +class KeyboardFilter | |
13 | +{ | |
14 | +public: | |
15 | + KeyboardFilter(void *obj, int (*consumeDirectKey)(void*, char*), void (*prefilter)(void*, WPARAM &wparam, LPARAM &lparam)=NULL); | |
16 | + ~KeyboardFilter(void); | |
17 | + HHOOK GetHook(); | |
18 | + int Process(short key, bool down); | |
19 | + void Preprocess(WPARAM &wparam, LPARAM &lparam); | |
20 | + static KeyboardFilter *Current; | |
21 | +private: | |
22 | + static const short OAPI2VK[256], VK2OAPI[256]; | |
23 | + int (*ConsumeDirectKey)(void*, char*); | |
24 | + void (*Prefilter)(void*, WPARAM &wparam, LPARAM &lparam); | |
25 | + HHOOK hhook; | |
26 | + void *object; | |
27 | + char *kstate; | |
28 | +}; |
@@ -90,6 +90,7 @@ | ||
90 | 90 | #include <map> |
91 | 91 | #include <vector> |
92 | 92 | #include "OMPModule.h" |
93 | +#include "KeyboardFilter.h" | |
93 | 94 | |
94 | 95 | // ============================================================== |
95 | 96 | // Global variables |
@@ -554,6 +555,9 @@ | ||
554 | 555 | bool quickLaunch; |
555 | 556 | bool quickLeave; |
556 | 557 | bool closeDialogOnceStarted; |
558 | + char statusPingKey; | |
559 | + OBJHANDLE statusPinger; | |
560 | + KeyboardFilter *filter; | |
557 | 561 | |
558 | 562 | //Missile toy |
559 | 563 | char missileLaunchKey; |
@@ -603,7 +607,8 @@ | ||
603 | 607 | double get_global_timestamp(); |
604 | 608 | double get_clock_acceleration(double T, double mjd, double stamp, double acceleration); |
605 | 609 | void MJDtoSystemTime(double MJD, LPSYSTEMTIME lpSystemTime); |
606 | -int keyhandler(VESSEL2 *me, DWORD key, bool down, char *keystate); | |
610 | +int keyhandler(void *null, char *keystate); | |
611 | +void keyfilter(void *null, WPARAM &wparam, LPARAM &lparam); | |
607 | 612 | void TakeSnapshots(double mjd); |
608 | 613 | |
609 | 614 | #pragma managed |
@@ -1361,7 +1366,9 @@ | ||
1361 | 1366 | //Additional things |
1362 | 1367 | dinfo.vesselclass=0; |
1363 | 1368 | dinfo.vesselname=0; |
1364 | - dinfo.vessellocation=0; | |
1369 | + dinfo.vessellocation=0; | |
1370 | + dinfo.statusPinger=NULL; | |
1371 | + dinfo.statusPingKey=OAPI_KEY_S; | |
1365 | 1372 | dinfo.missileLaunchKey=OAPI_KEY_SPACE; |
1366 | 1373 | dinfo.missileTargetKey=OAPI_KEY_C; |
1367 | 1374 | dinfo.missileModifiers=0x14; //Left Control + Alt |
@@ -1843,6 +1850,7 @@ | ||
1843 | 1850 | winfo.idcrender=hWnd; |
1844 | 1851 | winfo.hhook=SetWindowsHookEx(WH_CBT, intercept, NULL, GetWindowThreadProcessId(winfo.idcrender, NULL)); |
1845 | 1852 | CloseDlg(); |
1853 | + dinfo.filter=new KeyboardFilter(NULL, &keyhandler, &keyfilter); | |
1846 | 1854 | launchpad=false; |
1847 | 1855 | fullscreen=h==0;//mode==oapi::Module::RENDER_FULLSCREEN; |
1848 | 1856 | dinfo.missiles.clear(); |
@@ -1861,6 +1869,8 @@ | ||
1861 | 1869 | void CloseRenderViewport () |
1862 | 1870 | { |
1863 | 1871 | LeaveCriticalSection(&orbiter); |
1872 | + delete dinfo.filter; | |
1873 | + dinfo.filter=NULL; | |
1864 | 1874 | CloseDlg(); |
1865 | 1875 | winfo.hhook2=SetWindowsHookEx(WH_FOREGROUNDIDLE, dialogstarter, NULL, GetWindowThreadProcessId(winfo.idcorbiter, NULL)); |
1866 | 1876 | oapiDelAnnotation(dinfo.missileDisplay); |
@@ -7907,11 +7917,29 @@ | ||
7907 | 7917 | } |
7908 | 7918 | } |
7909 | 7919 | |
7910 | -int keyhandler(VESSEL2 *me, DWORD key, bool down, char *keystate) | |
7920 | +void keyfilter(void *null, WPARAM &wparam, LPARAM &lparam) | |
7911 | 7921 | { |
7922 | + switch (wparam) | |
7923 | + { | |
7924 | + case VK_SHIFT: | |
7925 | + wparam=VK_LSHIFT; | |
7926 | + break; | |
7927 | + case VK_CONTROL: | |
7928 | + wparam=VK_LCONTROL; | |
7929 | + break; | |
7930 | + case VK_MENU: | |
7931 | + wparam=VK_LMENU; | |
7932 | + break; | |
7933 | + } | |
7934 | +} | |
7935 | + | |
7936 | +int keyhandler(void *null, char *keystate) | |
7937 | +{ | |
7938 | + OBJHANDLE focobj=oapiGetFocusObject(); | |
7939 | + if (focobj==NULL || !oapiIsVessel(focobj)) return 0; | |
7940 | + VESSEL *me=oapiGetVesselInterface(focobj); | |
7912 | 7941 | //Check for missile key combinations |
7913 | - if (!down) return 0; | |
7914 | - if (key!=dinfo.missileLaunchKey && key!=dinfo.missileTargetKey) return 0; | |
7942 | + if (!KEYDOWN(keystate, dinfo.missileLaunchKey) && !KEYDOWN(keystate,dinfo.missileTargetKey) && !KEYDOWN(keystate, dinfo.statusPingKey)) return 0; | |
7915 | 7943 | if (!KEYMOD_LSHIFT(keystate) && (dinfo.missileModifiers & 0x01)>0) return 0; |
7916 | 7944 | if (!KEYMOD_RSHIFT(keystate) && (dinfo.missileModifiers & 0x02)>0) return 0; |
7917 | 7945 | if (!KEYMOD_LCONTROL(keystate)&&(dinfo.missileModifiers & 0x04)>0) return 0; |
@@ -7919,8 +7947,13 @@ | ||
7919 | 7947 | if (!KEYMOD_LALT(keystate) && (dinfo.missileModifiers & 0x10)>0) return 0; |
7920 | 7948 | if (!KEYMOD_RALT(keystate) && (dinfo.missileModifiers & 0x20)>0) return 0; |
7921 | 7949 | |
7922 | - OBJHANDLE obj=me->GetHandle(); | |
7923 | - if (key==dinfo.missileTargetKey) | |
7950 | + if (KEYDOWN(keystate, dinfo.statusPingKey)) | |
7951 | + { | |
7952 | + if (dinfo.statusPinger==NULL) dinfo.statusPinger=focobj; | |
7953 | + return 1; | |
7954 | + } | |
7955 | + | |
7956 | + if (KEYDOWN(keystate, dinfo.missileTargetKey)) | |
7924 | 7957 | { |
7925 | 7958 | OBJHANDLE target; |
7926 | 7959 | int i=0; |
@@ -7928,7 +7961,7 @@ | ||
7928 | 7961 | while (target=oapiGetVesselByIndex(i++)) |
7929 | 7962 | { |
7930 | 7963 | VECTOR3 g,l,n; |
7931 | - if (target==obj) continue; //Don't target yourself | |
7964 | + if (target==focobj) continue; //Don't target yourself | |
7932 | 7965 | oapiGetGlobalPos(target, &g); |
7933 | 7966 | me->Global2Local(g, l); |
7934 | 7967 | //Quick frustum culling |
@@ -7951,7 +7984,7 @@ | ||
7951 | 7984 | |
7952 | 7985 | //Launch missile |
7953 | 7986 | char line[LINESIZE]; |
7954 | - VESSELSTATUS2 state=dinfo.snapshot[obj]; | |
7987 | + VESSELSTATUS2 state=dinfo.snapshot[focobj]; | |
7955 | 7988 | VECTOR3 offset; |
7956 | 7989 | me->GlobalRot(dinfo.missileOffset, offset); |
7957 | 7990 | state.rpos+=offset; |
@@ -336,6 +336,10 @@ | ||
336 | 336 | </FileConfiguration> |
337 | 337 | </File> |
338 | 338 | <File |
339 | + RelativePath=".\KeyboardFilter.cpp" | |
340 | + > | |
341 | + </File> | |
342 | + <File | |
339 | 343 | RelativePath="OMPClient.cpp" |
340 | 344 | > |
341 | 345 | <FileConfiguration |
@@ -390,6 +394,10 @@ | ||
390 | 394 | > |
391 | 395 | </File> |
392 | 396 | <File |
397 | + RelativePath=".\KeyboardFilter.h" | |
398 | + > | |
399 | + </File> | |
400 | + <File | |
393 | 401 | RelativePath=".\Launcher.h" |
394 | 402 | > |
395 | 403 | </File> |