2 #include <RakNetStatistics.h> 3 #include "PacketPriority.h" 19 serverC = RakNet::UNASSIGNED_SYSTEM_ADDRESS;
25 rakPeer = RakNet::RakPeerInterface::GetInstance();
27 RakNet::SocketDescriptor socketdesc;
29 socketdesc.hostAddress[0] = 0;
30 const RakNet::StartupResult startupResult =
rakPeer->Startup(1, &socketdesc, 1);
31 if (startupResult != RakNet::StartupResult::RAKNET_STARTED)
32 game->
logger->
Log(
"NetFactory->Startup", Logger::Level::Fatal);
34 Trace(
"Connecting to server...");
35 const RakNet::ConnectionAttemptResult connectResult =
Connect();
36 if (connectResult != RakNet::ConnectionAttemptResult::CONNECTION_ATTEMPT_STARTED)
37 DXUT_ERR_MSGBOX(L
"NetFactory->Connect", NULL);
44 sprintf_s(newmsg,
sizeof newmsg,
"NETWORK: %s", msg);
53 Trace(
"Shutting down network factory...");
55 RakNet::RakPeerInterface::DestroyInstance(
rakPeer);
62 #pragma warning( disable : 4309 ) 63 newdata[0] =
static_cast<char>(ID_USER_PACKET_ENUM);
64 #pragma warning( disable : 4309 ) 65 memcpy_s(&newdata[1], 998, pData, dwSize);
67 PacketReliability reliability;
70 if (order == ORDERING_NONE)
71 reliability = RELIABLE;
73 reliability = RELIABLE_ORDERED;
77 reliability = UNRELIABLE;
80 rakPeer->Send(newdata, dwSize + 1, MEDIUM_PRIORITY, reliability, ORDERING_NONE,
serverC,
false);
86 #pragma warning( disable : 4309 ) 87 newdata[0] =
static_cast<char>(ID_USER_PACKET_TELEMETRY);
88 #pragma warning( disable : 4309 ) 89 memcpy_s(&newdata[1], 998, pData,
sizeof SClientPacketNew);
90 rakPeer->Send(newdata,
sizeof SClientPacketNew + 1, MEDIUM_PRIORITY, UNRELIABLE_SEQUENCED, ORDERING_TELEMETRY,
serverC,
false);
99 #pragma warning( disable : 4309 ) 100 newdata[0] =
static_cast<char>(ID_USER_PACKET_ERROR);
101 #pragma warning( disable : 4309 ) 102 memcpy_s(&newdata[1], 998, pData,
sizeof SErrorPacket);
103 rakPeer->Send(newdata,
sizeof SErrorPacket + 1, IMMEDIATE_PRIORITY, RELIABLE_ORDERED, ORDERING_ERRORS,
serverC,
false);
116 SClientPacket outpacket;
118 outpacket.f_x = extent;
119 outpacket.f_y = 0.0f;
120 outpacket.f_w =
static_cast<float>(eventType);
121 outpacket.f_z = 0.0f;
130 const int length = strlen(fileContents);
131 char* newdata =
new char[length + 2];
132 newdata[0] =
static_cast<char>(ID_USER_PACKET_LOGFILE);
133 memcpy_s(&newdata[1], length, fileContents, length);
134 newdata[length + 1] = 0;
135 rakPeer->Send(newdata, length + 2, IMMEDIATE_PRIORITY, RELIABLE, ORDERING_NONE,
serverC,
false);
137 SAFE_DELETE_ARRAY(newdata);
145 rakPeer->Send(fileContents, length, LOW_PRIORITY, RELIABLE, ORDERING_NONE,
serverC,
false);
160 RakNet::RakNetStatistics* stats;
165 }
while (stats->messageInSendBuffer[0] || stats->messageInSendBuffer[1] || stats->messageInSendBuffer[2] || stats->messageInSendBuffer[3]);
170 SClientPacket outpacket;
172 outpacket.f_x =
static_cast<float>(helpId);
174 outpacket.f_z = 0.0f;
175 outpacket.f_w = 0.0f;
181 char newdata[TRANSMIT_CHAT_SIZE * 2 + 3];
182 #pragma warning( disable : 4309 ) 183 newdata[0] =
static_cast<char>(ID_USER_PACKET_CHAT);
184 #pragma warning( disable : 4309 ) 185 newdata[1] = channel;
187 memcpy_s(&newdata[3], TRANSMIT_CHAT_SIZE * 2, message, (wcslen(message) + 1) * 2);
188 rakPeer->Send(newdata, (static_cast<int>(wcslen(message)) + 1) * 2 + 3, MEDIUM_PRIORITY, RELIABLE_ORDERED, ORDERING_CHAT,
serverC,
false);
194 sprintf_s(msg,
sizeof msg,
"Networking::FrameMove (displaystage %i)", displaystage);
203 switch (displaystage)
208 case ID_CONNECTION_REQUEST_ACCEPTED:
212 rakPeer->SetOccasionalPing(
true);
213 rakPeer->SetTimeoutTime(30000, RakNet::UNASSIGNED_SYSTEM_ADDRESS);
217 case ID_USER_PACKET_ENUM:
219 switch (
p->length - 1)
221 case sizeof SServerPacket:
223 SServerPacket datapacket;
224 memcpy_s(&datapacket,
sizeof SServerPacket, &
p->data[1],
p->length - 1);
225 switch (datapacket.type)
231 const float average_ping =
static_cast<float>(
rakPeer->GetAveragePing(
serverC)) * 0.001f;
233 DXUTGetGlobalTimer()->Reset();
234 DXUTGetGlobalTimer()->GetElapsedTime();
235 Trace(
"Configuration received!");
236 sprintf_s(msg,
sizeof msg,
" g_UniverseTime: %f", datapacket.f_x);
238 sprintf_s(msg,
sizeof msg,
" ping to server: %f", average_ping);
240 sprintf_s(msg,
sizeof msg,
" ping to client: %f", datapacket.f_y);
242 sprintf_s(msg,
sizeof msg,
" adjustment: %f", average_ping);
244 sprintf_s(msg,
sizeof msg,
" f_Uphours: %f", datapacket.f_z);
264 if (datapacket.f_y == 4.0f)
274 sprintf_s(msg,
sizeof msg,
"Unexpected conclusion Y type: %.0f", datapacket.f_y);
275 Trace(msg, Logger::Level::Warn);
285 patchbytes =
static_cast<unsigned long>(datapacket.f_x);
287 sprintf_s(msg,
sizeof msg,
"STATUS_SPLASH autopatcher expecting total bytes: %i",
patchbytes);
294 sprintf_s(msg,
sizeof msg,
"STATUS_SPLASH unknown SServerPacket packet type: %i", datapacket.type);
295 Trace(msg, Logger::Level::Warn);
302 case sizeof SPacketBig:
304 SPacketBig datapacket;
305 memcpy_s(&datapacket,
sizeof SPacketBig, &
p->data[1],
p->length - 1);
306 switch (datapacket.type)
312 Trace(
"Patching finished!");
320 char newpatchdate[99];
321 sprintf_s(newpatchdate,
sizeof newpatchdate,
"STATUS_SPLASH autopatcher patchdate.txt now: %s",
game->
config.
patchdate);
326 sprintf_s(msg,
sizeof msg,
"STATUS_SPLASH unknown SPacketBig packet type: %i", datapacket.type);
327 Trace(msg, Logger::Level::Warn);
334 sprintf_s(msg,
sizeof msg,
"STATUS_SPLASH unknown packet length: %i",
p->length - 1);
335 Trace(msg, Logger::Level::Warn);
341 case ID_CONNECTION_ATTEMPT_FAILED:
342 case ID_NO_FREE_INCOMING_CONNECTIONS:
344 const RakNet::ConnectionAttemptResult result =
Connect();
345 if (result != RakNet::ConnectionAttemptResult::CONNECTION_ATTEMPT_STARTED)
346 game->
logger->
Log(
"NetFactory->Connect", Logger::Level::Fatal);
349 if (
p->data[0] == ID_CONNECTION_ATTEMPT_FAILED)
350 Trace(
"Retrying (ID_CONNECTION_ATTEMPT_FAILED)...", Logger::Level::Info);
352 Trace(
"Retrying (ID_NO_FREE_INCOMING_CONNECTIONS)...", Logger::Level::Info);
358 case ID_USER_PACKET_PATCH:
363 const char actionCode =
p->data[1];
366 char pathAndFileName[128];
367 memcpy_s(pathAndFileName, 128, &
p->data[2], 128);
370 const int fileLength =
p->length - 130;
373 sprintf_s(msg,
sizeof msg,
"STATUS_SPLASH autopatcher action %i bytes %i: %s", actionCode, fileLength, pathAndFileName);
378 const int result = _unlink(pathAndFileName);
379 if (result == -1 && errno != ENOENT)
381 sprintf_s(msg,
sizeof msg,
"Autopatcher could not delete file \"%s\": %i", pathAndFileName, errno);
382 Trace(msg, Logger::Level::Error);
385 else if (actionCode == 1)
387 for (
size_t endIndex = 1; endIndex < strlen(pathAndFileName); endIndex++)
389 if (pathAndFileName[endIndex] ==
'\\')
391 pathAndFileName[endIndex] = 0;
392 _mkdir(pathAndFileName);
393 pathAndFileName[endIndex] =
'\\';
398 _sopen_s(&file, pathAndFileName, _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY | _O_SEQUENTIAL, _SH_SECURE, _S_IWRITE);
403 case EACCES: sprintf_s(msg,
sizeof msg,
"Autopatcher could not create file \"%s\": EACCES", pathAndFileName);
break;
404 case EEXIST: sprintf_s(msg,
sizeof msg,
"Autopatcher could not create file \"%s\": EEXIST", pathAndFileName);
break;
405 case EINVAL: sprintf_s(msg,
sizeof msg,
"Autopatcher could not create file \"%s\": EINVAL", pathAndFileName);
break;
406 case EMFILE: sprintf_s(msg,
sizeof msg,
"Autopatcher could not create file \"%s\": EMFILE", pathAndFileName);
break;
407 case ENOENT: sprintf_s(msg,
sizeof msg,
"Autopatcher could not create file \"%s\": ENOENT", pathAndFileName);
break;
408 default: sprintf_s(msg,
sizeof msg,
"Autopatcher could not create file \"%s\": %i", pathAndFileName, errno);
410 Trace(msg, Logger::Level::Fatal);
412 _write(file, &
p->data[130], fileLength);
415 else if (actionCode == 2)
417 bool restart =
false;
418 if (strcmp(pathAndFileName,
"Rise.exe") == 0)
421 strcpy_s(pathAndFileName, 128,
"Rise1.exe");
423 if (strcmp(pathAndFileName,
"steam_api.dll") == 0)
426 strcpy_s(pathAndFileName, 128,
"steam_api1.dll");
428 if (strcmp(pathAndFileName,
"bass.dll") == 0)
431 strcpy_s(pathAndFileName, 128,
"bass1.dll");
433 if (strcmp(pathAndFileName,
"bass_fx.dll") == 0)
436 strcpy_s(pathAndFileName, 128,
"bass_fx1.dll");
438 if (strcmp(pathAndFileName,
"RakNet.dll") == 0)
441 strcpy_s(pathAndFileName, 128,
"RakNet1.dll");
443 if (strcmp(pathAndFileName,
"discord-rpc.dll") == 0)
446 strcpy_s(pathAndFileName, 128,
"discord-rpc1.dll");
448 if (strcmp(pathAndFileName,
"FreeTrackClient.dll") == 0)
451 strcpy_s(pathAndFileName, 128,
"FreeTrackClient1.dll");
454 for (
size_t endIndex = 1; endIndex < strlen(pathAndFileName); endIndex++)
456 if (pathAndFileName[endIndex] ==
'\\')
458 pathAndFileName[endIndex] = 0;
459 _mkdir(pathAndFileName);
460 pathAndFileName[endIndex] =
'\\';
465 _sopen_s(&file, pathAndFileName, _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY | _O_SEQUENTIAL, _SH_SECURE, _S_IWRITE);
469 sprintf_s(msg,
sizeof msg,
"Autopatcher could not modify file \"%s\": Permission denied", pathAndFileName);
471 sprintf_s(msg,
sizeof msg,
"Autopatcher could not modify file \"%s\": %i", pathAndFileName, errno);
472 Trace(msg, Logger::Level::Fatal);
474 _write(file, &
p->data[130], fileLength);
479 Trace(
"The Rise binaries have been updated and must be restarted!");
480 MessageBox(DXUTGetHWND(), L
"The Rise binaries have been updated and must be restarted!", L
"Finished Patching", MB_ICONINFORMATION | MB_OK);
489 case ID_USER_PACKET_HELP:
491 Trace(
"Got MOTD through ID_USER_PACKET_HELP!");
494 memcpy_s(newchat,
sizeof newchat, &
p->data[1],
sizeof newchat);
522 size_t startOfLine = 0;
523 size_t lastGoodSpaceIndex = 0;
524 for (
size_t i = 0; i < wcslen(newchat) - startOfLine; i++)
526 size_t i1 = wcslen(newchat) - startOfLine - 1;
529 wcscpy_s(tempStr, 510, &newchat[startOfLine]);
543 if (rect.right < 210 && i != i1)
545 if (tempStr[i] == L
' ' || tempStr[i] == L
'!' || tempStr[i] == L
'。' || tempStr[i] == L
',')
546 lastGoodSpaceIndex = i;
551 if (lastGoodSpaceIndex != 0 && i != i1)
553 if (tempStr[lastGoodSpaceIndex] == L
' ')
554 tempStr[lastGoodSpaceIndex] = 0;
556 tempStr[lastGoodSpaceIndex + 1] = 0;
561 if (lastGoodSpaceIndex != 0)
562 startOfLine += lastGoodSpaceIndex + 1;
564 startOfLine += wcslen(tempStr) + 1;
566 lastGoodSpaceIndex = 0;
572 case ID_RAKVOICE_DATA:
577 sprintf_s(msg,
sizeof msg,
"STATUS_SPLASH unknown packet ID: %i",
p->data[0]);
578 Trace(msg, Logger::Level::Warn);
588 case ID_USER_PACKET_ENUM:
590 switch (
p->length - 1)
592 case sizeof SServerPacket:
594 SServerPacket datapacket;
595 memcpy_s(&datapacket,
sizeof SServerPacket, &
p->data[1],
p->length - 1);
596 switch (datapacket.type)
602 if (datapacket.array == 0 || datapacket.array == 3)
604 char* newdata =
new char[
game->
GUI->
pBuffer->GetBufferSize() + 1];
605 newdata[0] =
static_cast<char>(ID_USER_PACKET_AVATAR);
610 SAFE_DELETE_ARRAY(newdata);
617 if (datapacket.array == 0)
619 SClientPacket outpacket;
621 outpacket.f_x = 0.0f;
622 outpacket.f_y = 0.0f;
623 outpacket.f_z = 0.0f;
624 outpacket.f_w = 0.0f;
630 else if (datapacket.array == 4)
633 if (datapacket.f_x == 0.0f)
635 if (datapacket.f_y == 1.0f)
640 if (datapacket.f_z == 1.0f)
642 else if (datapacket.f_z == 2.0f)
644 else if (datapacket.f_z == 3.0f)
646 else if (datapacket.f_z == 4.0f)
648 else if (datapacket.f_z == 6.0f)
650 else if (datapacket.f_z == 9.0f)
654 else if (datapacket.f_x == 1.0f)
656 if (datapacket.f_y == 1.0f)
661 if (datapacket.f_z == 5.0f)
665 else if (datapacket.f_x == 2.0f)
667 if (datapacket.f_y == 1.0f)
672 if (datapacket.f_z == 2.0f)
674 else if (datapacket.f_z == 3.0f)
676 else if (datapacket.f_z == 6.0f)
678 else if (datapacket.f_z == 7.0f)
682 else if (datapacket.f_x == 3.0f)
684 if (datapacket.f_y == 1.0f)
689 if (datapacket.f_z == 3.0f)
691 else if (datapacket.f_z == 8.0f)
709 case sizeof SPacketBig:
712 SPacketBig datapacket;
713 memcpy_s(&datapacket,
sizeof(SPacketBig), &
p->data[1],
p->length - 1);
714 switch (datapacket.type)
725 swprintf_s(str, 199, L
"%S", datapacket.msg);
735 swprintf_s(str, 199, L
"%S", datapacket.msg);
801 if (command.
name ==
"UnloadCargoBay")
803 SClientPacket outpacket = SClientPacket();
805 outpacket.f_x = 0.0f;
806 outpacket.f_y =
static_cast<float>(command.
ivalues[0]);
807 outpacket.f_z = 0.0f;
808 outpacket.f_w =
static_cast<float>(command.
ivalues[1]);
813 else if (command.
name ==
"UpdateMfdPage")
823 sprintf_s(msg,
sizeof msg,
"Networking::FrameMove END (displaystage %i)", displaystage);
831 sprintf_s(msg,
sizeof msg,
"Networking::RakNetMessageHandler (type %i)", packet->data[0]);
834 switch (packet->data[0])
836 case ID_RAKVOICE_DATA:
847 Trace(
"Received audio data! Playing...", Logger::Level::Info);
853 case ID_USER_PACKET_SUPER:
855 Trace(
"ID_USER_PACKET_SUPER received!");
859 SSuperPacket datapacket = SSuperPacket();
860 memcpy_s(&datapacket,
sizeof SSuperPacket, &packet->data[1], packet->length - 1);
862 sprintf_s(msg,
sizeof msg,
" Our reference %i!", datapacket.reference);
865 if (datapacket.reference >= REF_DOCKCPOC)
917 static int oldPlayerFrame = -1;
920 if (datapacket.playerFrame == REF_INANOTHER)
939 if (datapacket.playerFrame == REF_SIMBAY)
947 else if (
playerships[0].type == VehicleType::W6Manx)
963 westEntrance.left = -948; westEntrance.right = -648;
964 westEntrance.bottom = -336; westEntrance.top = -114;
967 westHall.left = -648; westHall.right = 350;
968 westHall.bottom = -336; westHall.top = -114;
971 bay1.left = 350; bay1.right = 650;
972 bay1.bottom = -336; bay1.top = -114;
975 hall2.left = 650; hall2.right = 1350;
976 hall2.bottom = -336; hall2.top = -114;
979 bay2.left = 1350; bay2.right = 1650;
980 bay2.bottom = -336; bay2.top = -114;
983 hall3.left = 1650; hall3.right = 2350;
984 hall3.bottom = -336; hall3.top = -114;
987 bay3.left = 2350; bay3.right = 2650;
988 bay3.bottom = -336; bay3.top = -114;
991 eastHall.left = 2650; eastHall.right = 3670;
992 eastHall.bottom = -336; eastHall.top = -114;
995 eastEntrance.left = 3670; eastEntrance.right = 3970;
996 eastEntrance.bottom = -336; eastEntrance.top = -114;
999 else if (datapacket.playerFrame == REF_BUILDING)
1001 switch (datapacket.playerBldg)
1006 if (oldPlayerFrame != -1)
1019 const LONG buffer = 31;
1020 const LONG centerX = 0;
1021 const LONG centerY = -129;
1024 livingRoom.left = -1042 + buffer + centerX; livingRoom.right = 100 - buffer + centerX;
1025 livingRoom.top = 739 - buffer + centerY; livingRoom.bottom = 51 + buffer + centerY;
1028 hall.left = -100 + buffer + centerX; hall.right = 100 - buffer + centerX;
1029 hall.top = 51 + buffer + centerY; hall.bottom = -862 + buffer + centerY;
1032 hallToKitchen.left = -124 - buffer + centerX; hallToKitchen.right = -100 + buffer + centerX;
1033 hallToKitchen.top = -662 - buffer + centerY; hallToKitchen.bottom = -862 + buffer + centerY;
1036 northKitchen.left = -1042 + buffer + centerX; northKitchen.right = -124 - buffer + centerX;
1037 northKitchen.top = -662 - buffer + centerY; northKitchen.bottom = -968 + buffer + centerY;
1040 middleKitchen.left = -932 + buffer + centerX; middleKitchen.right = -124 - buffer + centerX;
1041 middleKitchen.top = -968 + buffer + centerY; middleKitchen.bottom = -1115 - buffer + centerY;
1044 leftKitchen.left = -932 + centerX; leftKitchen.right = -589 + buffer + centerX;
1045 leftKitchen.top = -1115 - buffer + centerY; leftKitchen.bottom = -1456 + centerY;
1048 rightKitchen.left = -589 + buffer + centerX; rightKitchen.right = -124 - buffer + centerX;
1049 rightKitchen.top = -1115 - buffer + centerY; rightKitchen.bottom = -1573 + buffer + centerY;
1052 foyer.left = -124 - buffer + centerX; foyer.right = 100 - buffer + centerX;
1053 foyer.top = -1373 - buffer + centerY; foyer.bottom = -1573 + buffer + centerY;
1055 RECT livingToBedroom;
1056 livingToBedroom.left = -825 + buffer + centerX; livingToBedroom.right = -659 - buffer + centerX;
1057 livingToBedroom.top = 51 + buffer + centerY; livingToBedroom.bottom = 27 - buffer + centerY;
1060 northBedroom.left = -903 + buffer + centerX; northBedroom.right = -547 + centerX;
1061 northBedroom.top = 27 - buffer + centerY; northBedroom.bottom = -106 + centerY;
1064 midBedroom.left = -903 + buffer + centerX; midBedroom.right = -442 + centerX;
1065 midBedroom.top = -106 + centerY; midBedroom.bottom = -255 + centerY;
1068 dresser.left = -903 + buffer + centerX; dresser.right = -684 + centerX;
1069 dresser.top = -255 + centerY; dresser.bottom = -321 + centerY;
1072 southBedroom.left = -684 + centerX; southBedroom.right = -183 + centerX;
1073 southBedroom.top = -255 + centerY; southBedroom.bottom = -387 + buffer + centerY;
1076 bedToBath.left = -632 + buffer + centerX; bedToBath.right = -495 - buffer + centerX;
1077 bedToBath.top = -387 + centerY; bedToBath.bottom = -556 + centerY;
1080 toilet.left = -495 - buffer + centerX; toilet.right = -396 + centerX;
1081 toilet.top = -411 - buffer + centerY; toilet.bottom = -523 + centerY;
1084 shower.left = -396 + centerX; shower.right = -252 - buffer + centerX;
1085 shower.top = -411 - buffer + centerY; shower.bottom = -638 + buffer + centerY;
1096 Trace(
"Unhandled building number!", Logger::Level::Error);
1120 oldPlayerFrame = datapacket.playerFrame;
1122 if (datapacket.reference == REF_INANOTHER)
1124 if (datapacket.inarray == 0)
1125 Trace(
"datapacket.inarray is 0!", Logger::Level::Warn);
1145 playerships[datapacket.inarray].
pitch = datapacket.pitch1 / 32767.0f * rotlimitC;
1146 playerships[datapacket.inarray].
roll = datapacket.roll1 / 32767.0f * rotlimitC;
1147 playerships[datapacket.inarray].
yaw = datapacket.yaw1 / 32767.0f * rotlimitC;
1173 #pragma region Old ship type = 9 data 1175 int vehicleType, allegiance;
1176 unsigned int vehicleId;
1177 char bitstring[99], trimcolor[8];
1182 sprintf_s(msg,
sizeof msg,
"Released m_pddsHullDynamicTexture slot %i!", 0);
1185 sprintf_s(msg,
sizeof msg,
"m_pddsHullDynamicTexture[%i]", 0);
1189 Trace(datapacket.oldShipData);
1192 const int results = sscanf_s(datapacket.oldShipData,
"%[^,],%[^,],%d,%[^,],%[^,],%[^,],%d,%u,%d,%d,%[^\n]",
1193 playerships[0].
IVR, 6, bitstring,
sizeof bitstring, &vehicleType,
playerships[0].
owner, 13, trimcolor, 8,
playerships[0].
logofile, 8, &reference, &vehicleId, &allegiance, &
playerships[0].
ownerId,
playerships[0].
hullname, 23);
1198 sprintf_s(msg,
sizeof msg,
"Could only parse %i of 10 required (11 optional) items from type 9 data SUPER_PACKET!", results);
1218 sprintf_s(hexcolor, 11,
"0x00%s", &trimcolor[1]);
1223 sprintf_s(msg,
sizeof msg,
"ship data IVR %s vehicleId %i slot %i",
playerships[0].IVR, vehicleId, 0);
1259 #pragma region Things the server persists about our vehicle 1281 sprintf_s(msg,
sizeof msg,
"Looking for a flap setting %.3f (%i settings)", datapacket.flapsDown,
ourcockpit.
flapSettings.size());
1312 #pragma region Things that are not saved on the server that need to be persisted! 1325 #pragma region Things that are not saved on the server that need to be reset! 1347 if (datapacket.selectedTarget >= 0)
1351 for (
short i = 0; i < MAX_SCAN; i++)
1367 game->
bus->
targetC =
static_cast<short>(datapacket.selectedTarget);
1382 case ID_USER_PACKET_TELEMETRY:
1386 SServerPacketNew datapacket;
1387 memcpy_s(&datapacket,
sizeof SServerPacketNew, &packet->data[1], packet->length - 1);
1391 if (datapacket.array >= MAX_SCAN)
1393 sprintf_s(msg,
sizeof msg,
"Telemetry tried accessing array element %i!", datapacket.array);
1394 Trace(msg, Logger::Level::Fatal);
1396 else if (datapacket.array == 0)
1398 Trace(
"Got telemetry about us!", Logger::Level::Error);
1403 sprintf_s(msg,
sizeof msg,
"Telemetry discarded old out-of-sequence packet for slot %i!", datapacket.array);
1414 sprintf_s(msg,
sizeof msg,
"Telemetry for vehicle not yet initialized (%i)...", datapacket.array);
1435 acc.x =
static_cast<float>(datapacket.ai) / 32767.0f *
MaxAcceleration;
1436 acc.y =
static_cast<float>(datapacket.aj) / 32767.0f *
MaxAcceleration;
1437 acc.z =
static_cast<float>(datapacket.ak) / 32767.0f *
MaxAcceleration;
1447 playerships[datapacket.array].
tx =
static_cast<float>(datapacket.tx) / 127.0f;
1448 playerships[datapacket.array].
ty =
static_cast<float>(datapacket.ty) / 127.0f;
1449 playerships[datapacket.array].
tz =
static_cast<float>(datapacket.tz) / 127.0f;
1464 bool tofromdock =
false;
1465 static char oldreference[MAX_SCAN];
1538 playerships[datapacket.array].
pitch =
static_cast<float>(datapacket.pitch1) / 32767.0f * rotlimitC;
1539 playerships[datapacket.array].
roll =
static_cast<float>(datapacket.roll1) / 32767.0f * rotlimitC;
1540 playerships[datapacket.array].
yaw =
static_cast<float>(datapacket.yaw1) / 32767.0f * rotlimitC;
1564 sprintf_s(msg,
sizeof msg,
"First telemetry for slot %i received!", datapacket.array);
1571 sprintf_s(msg,
sizeof msg,
"Got telemetry for vehicle that is inside our bay!");
1581 case ID_USER_PACKET_ENUM:
1583 sprintf_s(msg,
sizeof msg,
"RakNetMessageHandler ID_USER_PACKET_ENUM (size %i)", packet->length - 1);
1586 switch (packet->length - 1)
1588 case sizeof SServerPacket:
1590 SServerPacket datapacket;
1591 memcpy_s(&datapacket,
sizeof SServerPacket, &packet->data[1], packet->length - 1);
1593 sprintf_s(msg,
sizeof msg,
"SServerPacket %i %.1f %.1f %.1f %.1f %i", datapacket.type, datapacket.f_x, datapacket.f_y, datapacket.f_z, datapacket.f_w, datapacket.array);
1596 switch (datapacket.type)
1600 if (datapacket.array == 255)
1611 sprintf_s(msg,
sizeof msg,
"Server sent dock assignment (%.0f, %.0f)", datapacket.f_x, datapacket.f_y);
1621 if (datapacket.f_y == 0.0f)
1623 sprintf_s(msg,
sizeof msg,
"Server sent data conclusion (ourshipC %.0f, g_bEnabled %i)", datapacket.f_x,
g_bEnabled);
1629 SClientPacket outpacket;
1631 outpacket.f_x = 1.0f;
1632 outpacket.f_y = 0.0f;
1633 outpacket.f_z = 1.0f;
1634 outpacket.f_w = 1.0f;
1640 SDeviceMessage deviceMessage;
1641 ZeroMemory(&deviceMessage,
sizeof SDeviceMessage);
1643 wcscpy_s(deviceMessage.name, 160, deviceInstance.tszInstanceName);
1644 deviceMessage.deviceType = LOBYTE(deviceInstance.dwDevType);
1645 deviceMessage.deviceSubtype = HIBYTE(deviceInstance.dwDevType);
1646 deviceMessage.forceFeedback = deviceInstance.guidFFDriver !=
MYGUID_NULL ? 1 : 0;
1654 deviceMessage.channelAxisLookLateral = -1;
1662 deviceMessage.channelAxisLookVertical = -1;
1670 deviceMessage.channelAxisTurn = -1;
1678 deviceMessage.channelAxisWalk = -1;
1686 deviceMessage.channelAxisPitch = -1;
1694 deviceMessage.channelAxisPitchTrim = -1;
1702 deviceMessage.channelAxisRoll = -1;
1710 deviceMessage.channelAxisYaw = -1;
1719 deviceMessage.channelAxisThrustLeft = -1;
1728 deviceMessage.channelAxisThrustRight = -1;
1737 deviceMessage.channelAxisLeftToeBrake = -1;
1746 deviceMessage.channelAxisRightToeBrake = -1;
1754 deviceMessage.channelAxisSteer = -1;
1764 deviceMessage.channelAxisGas = -1;
1773 deviceMessage.channelAxisBrake = -1;
1775 deviceMessage.testMarker = 18;
1777 char newdata[
sizeof SDeviceMessage + 1];
1778 #pragma warning( disable : 4309 ) 1779 newdata[0] =
static_cast<char>(ID_USER_PACKET_DEVICE);
1780 #pragma warning( disable : 4309 ) 1781 memcpy_s(&newdata[1],
sizeof SDeviceMessage, &deviceMessage,
sizeof deviceMessage);
1782 rakPeer->Send(newdata,
sizeof SDeviceMessage + 1, MEDIUM_PRIORITY, RELIABLE, ORDERING_NONE,
serverC,
false);
1786 SPacketBig bigpacket;
1788 sprintf_s(bigpacket.msg, 78,
"%.77S", DXUTGetDeviceStats());
1789 bigpacket.ship = bigpacket.array = bigpacket.inarray = 0;
1794 DWORD bufferSize = 78;
1795 GetUserNameA(bigpacket.msg, &bufferSize);
1796 bigpacket.array = 0;
1797 bigpacket.inarray =
static_cast<unsigned char>(GetActiveProcessorCount(ALL_PROCESSOR_GROUPS));
1804 GetComputerNameA(bigpacket.msg, &bufferSize);
1805 MEMORYSTATUSEX statex;
1806 statex.dwLength =
sizeof statex;
1807 GlobalMemoryStatusEx(&statex);
1808 bigpacket.array =
static_cast<unsigned char>(round(static_cast<double>(statex.ullTotalPhys) / 1073741824));
1809 bigpacket.inarray =
static_cast<unsigned char>(round(static_cast<double>(statex.ullAvailPhys) / 1073741824));
1810 bigpacket.ship =
static_cast<unsigned char>(statex.dwMemoryLoad);
1814 outpacket.type = 32;
1821 else if (datapacket.f_y == 2.0f)
1823 if (datapacket.f_x == 1.0f)
1825 SClientPacket outpacket;
1827 outpacket.f_x = 0.0f;
1828 outpacket.f_y = 0.0f;
1829 outpacket.f_z = 0.0f;
1830 outpacket.f_w = 0.0f;
1833 else if (datapacket.f_x == 0.0f ||
1834 datapacket.f_x == 2.0f ||
1835 datapacket.f_x == 3.0f)
1838 if (datapacket.f_x == 0.0f)
1840 else if (datapacket.f_x == 2.0f)
1842 else if (datapacket.f_x == 3.0f)
1846 else if (datapacket.f_y == 3.0f)
1853 sprintf_s(msg,
sizeof msg,
"Unexpected conclusion Y type: %.0f", datapacket.f_y);
1854 Trace(msg, Logger::Level::Warn);
1860 sprintf_s(msg,
sizeof msg,
"Type 4 received payload %.1f, fuel %.1f (%.1f), utilization %.1f",
1861 datapacket.f_y, datapacket.f_x, datapacket.f_w, datapacket.f_z);
1864 fuel = datapacket.f_x;
1875 if (datapacket.array != 0)
1877 sprintf_s(msg,
sizeof msg,
"Server removed slot %i (vehicleId %i) from our scanner!", datapacket.array,
playerships[datapacket.array].
vehicleId);
1897 Trace(
"Server tried to remove our vehicle from active memory!", Logger::Level::Error);
1904 Trace(
"Vehicle animation data packet received");
1917 sprintf_s(msg,
sizeof msg,
"Released m_pddsHullDynamicTexture slot %i!", MAX_SCAN - 1);
1920 sprintf_s(msg,
sizeof msg,
"m_pddsHullDynamicTexture[%i]", MAX_SCAN - 1);
1924 if (datapacket.array == 1)
1929 else if (datapacket.array == 2)
1932 sprintf_s(
playerships[MAX_SCAN - 1].hullname,
sizeof playerships[MAX_SCAN - 1].hullname,
"VALLEY FORGE");
1945 if (datapacket.f_y == 0.0f)
1983 switch (datapacket.array)
1986 MessageBoxW(
nullptr, L
"We are applying a patch to the game server. Please try connecting again in a minute or two.", L
"Server Upgrade!", MB_ICONERROR | MB_OK);
1989 MessageBoxW(
nullptr, L
"You have been kicked from the server. Contact support@risetvp for more information.", L
"Session Disconnected!", MB_ICONERROR | MB_OK);
1992 MessageBoxW(
nullptr, L
"Sorry, we require a valid email address in order to play Rise: The Vieneo Province.", L
"Account Terminated!", MB_ICONERROR | MB_OK);
2016 Trace(
"Event from server!");
2054 sprintf_s(msg,
sizeof msg,
"Achievement ID %.0f level %.0f", datapacket.f_x, datapacket.f_y);
2057 if (datapacket.f_x == 15.0f)
2061 else if (datapacket.f_x == 17.0f && datapacket.f_z == 14.0f)
2066 else if (datapacket.f_x == 18.0f)
2071 else if (datapacket.f_x == 2.0f)
2076 else if (datapacket.f_x == 57.0f)
2096 if (datapacket.array == 0)
2098 Trace(
"We should NOT be getting type 16 reference change for our slot!",
Logger::Error);
2102 sprintf_s(msg,
sizeof msg,
"Change reference of vehicle %i slot %i from %i to %.0f",
2111 const D3DXVECTOR3 position = D3DXVECTOR3(datapacket.f_y, datapacket.f_z, datapacket.f_w);
2123 if (datapacket.array < 1 || datapacket.array > MAX_PODSPERSHIP)
2125 sprintf_s(msg,
sizeof msg,
"Error! Type 17 tried to clear bay %i", datapacket.array);
2132 if (bayVehicleId != 0)
2134 sprintf_s(msg,
sizeof msg,
"Removed cargo from bay %i", datapacket.array);
2138 modeAC.
location.x = datapacket.f_x;
2139 modeAC.
location.y = datapacket.f_y;
2140 modeAC.
location.z = datapacket.f_z;
2141 modeAC.
reference =
static_cast<char>(datapacket.f_w);
2158 float r = floorf(datapacket.f_w / 10000.0f);
2159 datapacket.f_w -= r * 10000.0f;
2160 float g = floorf(datapacket.f_w / 100.0f);
2161 datapacket.f_w -= g * 100.0f;
2162 float b = floorf(datapacket.f_w);
2164 sprintf_s(msg,
sizeof msg,
"Firework: r%.0f g%.0f b%.0f ", r, g, b);
2168 if (r >= g && r >= b)
2170 const float f_temp = 255.0f / r;
2171 r *= f_temp; g *= f_temp; b *= f_temp;
2173 else if (g >= r && g >= b)
2175 const float f_temp = 255.0f / g;
2176 r *= f_temp; g *= f_temp; b *= f_temp;
2178 else if (b >= r && b >= g)
2180 const float f_temp = 255.0f / b;
2181 r *= f_temp; g *= f_temp; b *= f_temp;
2184 sprintf_s(msg,
sizeof msg,
"-> r%.0f g%.0f b%.0f ", r, g, b);
2187 fireworks[t].
color = D3DCOLOR_ARGB(255, static_cast<unsigned char>(r), static_cast<unsigned char>(g), static_cast<unsigned char>(b));
2199 float f_temp = D3DXVec3Length(&result);
2200 sprintf_s(msg,
sizeof msg,
"Fireworks! Distance: %.3f", f_temp);
2205 f_temp = 1.0f - f_temp;
2208 const float inverse_f_temp = 1.0f - f_temp;
2209 float delay = inverse_f_temp * 14.88201975f;
2233 if (datapacket.array)
2250 switch (static_cast<short>(datapacket.f_z))
2254 const auto tab =
static_cast<short>(datapacket.f_x);
2255 const auto channel =
static_cast<unsigned char>(datapacket.f_y);
2257 sprintf_s(msg,
sizeof msg,
"Got new channel for tab %i: %i", tab, channel);
2273 Trace(
"Unknown channel control type!", Logger::Level::Error);
2283 const int radiocut =
static_cast<int>(datapacket.f_y);
2284 if (datapacket.array)
2287 const int carrier =
static_cast<int>(datapacket.f_x);
2312 sprintf_s(msg,
sizeof msg,
"Type 35 received hull_temp_celsius %.1f ice_accumulation_mm %.1f",
2313 datapacket.f_x, datapacket.f_y);
2323 Trace(
"Current waypoint packet received!");
2327 sprintf_s(msg,
sizeof msg,
"Found the problem WPtargetC %i because of what server sent!",
game->
bus->
WPtargetC);
2350 sprintf_s(msg,
sizeof msg,
"Unexpected SServerPacket type: %i", datapacket.type);
2351 Trace(msg, Logger::Level::Info);
2357 case sizeof SPacketBig:
2359 SPacketBig bigdatapacket;
2360 memcpy_s(&bigdatapacket,
sizeof SPacketBig, &packet->data[1], packet->length - 1);
2362 sprintf_s(msg,
sizeof msg,
"SPacketBig %i %i", bigdatapacket.type, bigdatapacket.array);
2365 switch (bigdatapacket.type)
2373 SPacketBig outpacket;
2374 strcpy_s(outpacket.msg,
sizeof outpacket.msg, bigdatapacket.msg);
2376 outpacket.array = 0;
2381 sprintf_s(
prompt,
sizeof prompt,
"%s", bigdatapacket.msg);
2395 sprintf_s(msg,
sizeof msg,
"AddPlayer %i %s", bigdatapacket.array, bigdatapacket.msg);
2404 if (!SetWindowText(DXUTGetHWND(), str))
2406 sprintf_s(msg,
sizeof msg,
"Error in SetWindowText: %d", GetLastError());
2426 unsigned char load_type;
2427 unsigned short load_quantity;
2429 int weightLbs, fuel_tank;
2430 const int elem = sscanf_s(bigdatapacket.msg,
"%hd,%[^,],%hhd,%hhd,%hd,%hd,%d,%d,%[^,],%d,%d,%[^,],%d,%d,%[^,]",
2433 &weightLbs, &bitstring, 4,
2434 &fuel_tank, &pilot, &modeAC.
hullname, 23);
2437 Trace(bigdatapacket.msg);
2441 sprintf_s(msg,
sizeof msg,
"Could not parse PODS (looking for 14 or 15) but %i elements...", elem);
2450 modeX.
weightLbs =
static_cast<float>(weightLbs);
2451 modeX.
fuel_tank =
static_cast<float>(fuel_tank);
2452 modeX.
pilot = pilot;
2454 modeAC.
tow = bitstring[0] ==
'1';
2455 modeAC.
reposess = bitstring[1] ==
'1';
2456 modeAC.
stolen = bitstring[2] ==
'1';
2458 if (bay > 0 && bay <= MAX_PODSPERSHIP)
2465 sprintf_s(msg,
sizeof msg,
"Invalid bay %i for cargo data type 8...", bay);
2479 if (bigdatapacket.array == 0)
2485 Trace(bigdatapacket.msg);
2486 int vehicleType, allegiance;
2487 char bitstring[99], trimcolor[8];
2489 char newhullname[23];
2493 const int results = sscanf_s(bigdatapacket.msg,
"%[^,],%[^,],%d,%[^,],%[^,],%[^,],%d,%d,%d,%d,%[^\n]",
2494 playerships[bigdatapacket.array].
IVR, 6, bitstring,
sizeof bitstring, &vehicleType,
playerships[bigdatapacket.array].
owner, 13, trimcolor, 8,
playerships[bigdatapacket.array].
logofile, 8, &reference, &allegiance, &flapdown, &
playerships[bigdatapacket.array].
ownerId, newhullname, 23);
2499 sprintf_s(msg,
sizeof msg,
"Could only parse %i of 10 required (11th optional) items from type 9 data!", results);
2509 sprintf_s(msg,
sizeof msg,
"Released m_pddsHullDynamicTexture slot %i!", bigdatapacket.array);
2512 sprintf_s(msg,
sizeof msg,
"m_pddsHullDynamicTexture[%i]", bigdatapacket.array);
2519 if (bigdatapacket.inarray >= MAX_SCAN)
2521 sprintf_s(msg,
sizeof msg,
"inarray violation t %i inarray %i vehicleID %i", bigdatapacket.array, bigdatapacket.inarray,
playerships[bigdatapacket.array].
vehicleId);
2522 Trace(msg, Logger::Level::Fatal);
2530 playerships[bigdatapacket.array].
type =
static_cast<unsigned char>(vehicleType);
2542 sprintf_s(hexcolor, 11,
"0x00%s", &trimcolor[1]);
2547 sprintf_s(msg,
sizeof msg,
"ship data IVR %s vehicleId %i slot %i",
2548 playerships[bigdatapacket.array].
IVR, bigdatapacket.vehicleId, bigdatapacket.array);
2556 if (reference != REF_INANOTHER)
2587 sprintf_s(msg,
sizeof msg,
"Initialized after telemetry received (%i)...", bigdatapacket.array);
2596 sprintf_s(msg,
sizeof msg,
"Got alignment data packet about playerIndex %i: %s", bigdatapacket.array,
game->
GUI->
player[bigdatapacket.array].callsign);
2598 Trace(bigdatapacket.msg);
2607 Trace(
"Got damage control for a different vehicle!", Logger::Level::Error);
2613 Trace(
"Got our damage control...");
2619 if (bigdatapacket.array == Reference::REF_INANOTHER)
2621 for (
short t = 0; t < MAX_AVIOPERSHIP; t++)
2654 sprintf_s(msg,
sizeof msg,
"Dock statuses: %s", bigdatapacket.msg);
2657 if (bigdatapacket.msg[0] ==
'1')
2661 if (bigdatapacket.msg[1] ==
'1')
2665 if (bigdatapacket.msg[2] ==
'1')
2679 for (
int i = 0; i < MAX_INVPERPLYR; i++)
2681 if (bigdatapacket.inventory.personalobjecttype[i])
2685 for (
int i = 0; i < MAX_INVPERSHIP; i++)
2687 if (bigdatapacket.inventory.vehicleobjecttype[i])
2694 sprintf_s(msg,
sizeof msg,
"Received personal inventory packet for dexterity (%i): %.1f", bigdatapacket.inventory.stats[1],
ourcockpit.
dexterity);
2721 cash = bigdatapacket.inventory.cash;
2732 game->
GUI->
ChannelInvite(bigdatapacket.msg, bigdatapacket.array, bigdatapacket.ship, bigdatapacket.inarray);
2739 sscanf_s(bigdatapacket.msg,
"%i,%f,%f,%f,%f,%f,%[^\n]",
2740 &node.edgeId, &node.position.x, &node.position.y, &node.distanceM, &node.timeS, &node.speedLimitKph, &node.streetName, 32);
2747 Trace(bigdatapacket.msg);
2753 sscanf_s(bigdatapacket.msg,
"%[^,],%[^,],%hhd,%[^,],%d,%hd,%hd,%d,%[^\n]",
2754 modeAC.
IVR, 6, bitstring,
sizeof bitstring, &modeAC.
type, modeAC.
owner, 13, &modeAC.
ownerId, &parentId, &modeAC.
vehicleId, &modeAC.
allegiance, modeAC.
hullname, 23);
2759 Trace(
"Calling game->bus->Scanner.Get(parentId)");
2761 Trace(
"Getting scandata from parent_s_scan");
2763 Trace(
"Getting modeAC from parent_s_scan_data");
2765 Trace(
"Setting location from parent");
2767 Trace(
"Setting reference from parent");
2770 Trace(
"Analyzing bitstring");
2772 if (bitstring[0] ==
'1')
2776 if (bitstring[1] ==
'1')
2780 if (bitstring[2] ==
'1')
2785 Trace(
"Calling InsertUpdateModeAC");
2787 Trace(
"Calling InsertUpdateParent");
2793 sprintf_s(msg,
sizeof msg,
"Unexpected SPacketBig type: %i stage %i", bigdatapacket.type,
game->
displaystage);
2794 Trace(msg, Logger::Level::Error);
2800 case sizeof SPacketHuge:
2802 SPacketHuge hugedatapacket;
2803 memcpy_s(&hugedatapacket,
sizeof SPacketHuge, &
p->data[1],
p->length - 1);
2805 sprintf_s(msg,
sizeof msg,
"SPacketHuge %i", hugedatapacket.type);
2808 switch (hugedatapacket.type)
2879 sprintf_s(file,
sizeof file,
"meshes\\mining1.dix");
2881 sprintf_s(file,
sizeof file,
"meshes\\farm1.dix");
2883 sprintf_s(file,
sizeof file,
"meshes\\town1.dix");
2885 sprintf_s(file,
sizeof file,
"meshes\\airfield.dix");
2889 _sopen_s(&handle, file, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYWR, _S_IWRITE);
2892 sprintf_s(msg,
sizeof msg,
"Peer failed to load \"%s\"!", file);
2893 Trace(msg, Logger::Level::Warn);
2896 unsigned short filecomponents;
2897 _lseek(handle, 0, SEEK_SET);
2898 _read(handle, &filecomponents, 2);
2900 std::vector<short> buildingIds;
2903 for (
long r = 0; r < filecomponents; r++)
2905 unsigned char type = 0;
2913 _lseek(handle, r * 100L + 99L + 58L, SEEK_SET);
2914 _read(handle, &type, 1);
2916 _lseek(handle, r * 100L + 99L + 91L, SEEK_SET);
2917 _read(handle, &attachto, 1);
2919 if (std::find(buildingIds.begin(), buildingIds.end(), attachto) != buildingIds.end())
2922 buildingIds.emplace_back(attachto);
3122 sprintf_s(msg,
sizeof msg,
"Unknown building component type: %i", type);
3123 Trace(msg, Logger::Level::Error);
3146 modeAC.
vehicleId = hugedatapacket.scanData.vehicle_id;
3147 modeAC.
reference =
static_cast<char>(hugedatapacket.scanData.reference);
3148 strcpy_s(modeAC.
IVR, 6, hugedatapacket.scanData.IVR);
3149 modeAC.
allegiance = hugedatapacket.scanData.allegiance;
3150 strcpy_s(modeAC.
hullname, 23, hugedatapacket.scanData.hullname);
3151 modeAC.
location.x = hugedatapacket.scanData.positionx;
3152 modeAC.
location.y = hugedatapacket.scanData.positiony;
3153 modeAC.
location.z = hugedatapacket.scanData.positionz;
3154 strcpy_s(modeAC.
owner, 13, hugedatapacket.scanData.owner);
3155 modeAC.
ownerId = hugedatapacket.scanData.ownerId;
3156 modeAC.
reposess = hugedatapacket.scanData.reposess;
3157 modeAC.
stolen = hugedatapacket.scanData.stolen;
3158 modeAC.
tow = hugedatapacket.scanData.tow;
3159 modeAC.
type = hugedatapacket.scanData.type;
3165 if (hugedatapacket.scanData.loadQuantityHasValue)
3166 modeX.
load_quantity = hugedatapacket.scanData.load_quantity;
3167 if (hugedatapacket.scanData.loadDestHasValue)
3168 modeX.
load_dest = hugedatapacket.scanData.load_dest;
3169 if (hugedatapacket.scanData.loadTypeHasValue)
3170 modeX.
load_type = hugedatapacket.scanData.load_type;
3171 if (hugedatapacket.scanData.weightLbsHasValue)
3172 modeX.
weightLbs = hugedatapacket.scanData.weightLbs;
3173 if (hugedatapacket.scanData.pilotHasValue)
3174 modeX.
pilot = hugedatapacket.scanData.pilot;
3177 for (
short t = 0; t < MAX_SCAN; t++)
3188 sprintf_s(msg,
sizeof msg,
"Unknown HUGE packet type: %i", hugedatapacket.type);
3189 Trace(msg, Logger::Level::Warn);
3215 case sizeof SWeaponPacket:
3217 SWeaponPacket datapacket;
3218 memcpy_s(&datapacket,
sizeof SWeaponPacket, &packet->data[1], packet->length - 1);
3220 sprintf_s(msg,
sizeof msg,
"SWeaponPacket %i %i %i", datapacket.type, datapacket.status, datapacket.array);
3227 case sizeof SRenderPoint:
3229 SRenderPoint datapacket;
3230 memcpy_s(&datapacket,
sizeof SRenderPoint, &packet->data[1], packet->length - 1);
3232 sprintf_s(msg,
sizeof msg,
"Received dynamic change for %i,%i", datapacket.tcp.u, datapacket.tcp.v);
3237 if (t > -1 && t < 64 && s > -1 && s < 64)
3240 if (
gridarray[t][s].buildzoneOrdinal != -1)
3243 sprintf_s(msg,
sizeof msg,
"buildzone[%i].VB",
gridarray[t][s].buildzoneOrdinal);
3249 sprintf_s(msg,
sizeof msg,
"buildzone[%i].RTSVB",
gridarray[t][s].buildzoneOrdinal);
3253 sprintf_s(msg,
sizeof msg,
"SRenderPoint released VB slot %i!",
gridarray[t][s].buildzoneOrdinal);
3264 case sizeof SRenderRow:
3266 SRenderRow datapacket;
3267 memcpy_s(&datapacket,
sizeof SRenderRow, &packet->data[1], packet->length - 1);
3274 sprintf_s(msg,
sizeof msg,
"Received 1.3 data edge %i:%i,%i+(%+i,%+i)=(%i,%i)", datapacket.side - 1, datapacket.tcp.u, datapacket.tcp.v, ewadjust, nsadjust,
game->
viewscreen->
ptrGrid->
tcp.u,
game->
viewscreen->
ptrGrid->
tcp.v);
3279 Trace(
"We received 1.3 data edge but weren't waiting for any!", Logger::Level::Debug);
3283 switch (datapacket.side)
3287 news = 0 + nsadjust;
3290 sprintf_s(msg,
sizeof msg,
"Proc SRV row %i: ", news);
3291 for (
short t = 0; t < 64; t++)
3293 newt = t - ewadjust;
3294 if (newt >= 0 && newt < 64)
3297 sprintf_s(append,
sizeof append,
"%2i ", newt);
3298 strcat_s(msg,
sizeof msg, append);
3302 strcat_s(msg,
sizeof msg,
"XX ");
3307 Trace(
"Proc SRV row no longer applies!");
3313 news = 63 + nsadjust;
3316 sprintf_s(msg,
sizeof msg,
"Proc SRV row %i: ", news);
3317 for (
short t = 0; t < 64; t++)
3319 newt = t - ewadjust;
3320 if (newt >= 0 && newt < 64)
3323 sprintf_s(append,
sizeof append,
"%2i ", newt);
3324 strcat_s(msg,
sizeof msg, append);
3328 strcat_s(msg,
sizeof msg,
"XX ");
3333 Trace(
"Proc SRV row no longer applies!");
3339 newt = 63 - ewadjust;
3342 sprintf_s(msg,
sizeof msg,
"Proc SRV column %i: ", newt);
3343 for (
short s = 0; s < 64; s++)
3345 news = s + nsadjust;
3346 if (news >= 0 && news < 64)
3349 sprintf_s(append,
sizeof append,
"%2i ", news);
3350 strcat_s(msg,
sizeof msg, append);
3354 strcat_s(msg,
sizeof msg,
"XX ");
3359 Trace(
"Proc SRV column no longer applies!");
3365 newt = 0 - ewadjust;
3368 sprintf_s(msg,
sizeof msg,
"Proc SRV column %i: ", newt);
3369 for (
short s = 0; s < 64; s++)
3371 news = s - nsadjust;
3372 if (news >= 0 && news < 64)
3375 sprintf_s(append,
sizeof append,
"%2i ", news);
3376 strcat_s(msg,
sizeof msg, append);
3380 strcat_s(msg,
sizeof msg,
"XX ");
3385 Trace(
"Proc SRV column no longer applies!");
3389 Trace(
"SRV row or column unrecognized!", Logger::Level::Error);
3401 case sizeof SAssayGrid:
3403 memcpy_s(&
game->
bus->
assayGrid,
sizeof SAssayGrid, &packet->data[1], packet->length - 1);
3416 case sizeof SRenderGrid:
3419 SRenderGrid datapacket;
3420 memcpy_s(&datapacket,
sizeof SRenderGrid, &packet->data[1], packet->length - 1);
3435 case sizeof SRenderBuilding:
3437 SRenderBuilding datapacket;
3438 memcpy_s(&datapacket,
sizeof SRenderBuilding, &packet->data[1], packet->length - 1);
3445 sprintf_s(msg,
sizeof msg,
"Received SRenderBuilding type %i @ u%i v%i (%i,%i) power %i", datapacket.type, datapacket.tcp.u, datapacket.tcp.v, t, s, datapacket.powered);
3447 sprintf_s(msg,
sizeof msg,
" Zone %i (%08X %08X %08X %08X)", datapacket.zone, datapacket.layout.layout1, datapacket.layout.layout2, datapacket.layout.layout3, datapacket.layout.layout4);
3453 if (t > 15 && t < 48 && s > 15 && s < 48)
3455 if (
gridarray[t][s].buildzoneOrdinal != -1)
3458 sprintf_s(msg,
sizeof msg,
"buildzone[%i].VB",
gridarray[t][s].buildzoneOrdinal);
3464 sprintf_s(msg,
sizeof msg,
"buildzone[%i].RTSVB",
gridarray[t][s].buildzoneOrdinal);
3468 sprintf_s(msg,
sizeof msg,
" SRenderBuilding released VB slot %i!",
gridarray[t][s].buildzoneOrdinal);
3475 if (t >= 0 && t < 64 && s >= 0 && s < 64)
3477 gridarray[t][s].
type =
static_cast<PlotType
>(datapacket.type);
3491 Trace(
" SRenderBuilding is somewhere on grid, stored!");
3496 sprintf_s(msg,
sizeof msg,
" Received SRenderBuilding type %i @ u%i v%i (%i,%i) power %i", datapacket.type, datapacket.tcp.u, datapacket.tcp.v, t, s, datapacket.powered);
3498 sprintf_s(msg,
sizeof msg,
" Zone %i (%08X %08X %08X %08X)", datapacket.zone, datapacket.layout.layout1, datapacket.layout.layout2, datapacket.layout.layout3, datapacket.layout.layout4);
3503 if (t > 15 && t < 48 && s > 15 && s < 48)
3507 Trace(
" SRenderBuilding grid level is initialized, OK!");
3510 if (
gridarray[t][s].type > PlotType::NotZoned &&
3511 gridarray[t][s].type < PlotType::PlotTypeEnum &&
3514 Trace(
" SRenderBuilding type in bounds, OK!");
3517 Trace(
" SRenderBuilding layout is user-generated and real, OK!");
3519 if (
gridarray[t][s].type != PlotType::UserAirfield || oldlayout4 ==
gridarray[t][s].layout4)
3523 Trace(
" SRenderBuilding is not an airfield or layout4 changed!");
3526 for (
short tt = 16; tt < 48; tt++)
3528 for (
short ss = 16; ss < 48; ss++)
3537 Trace(
" SRenderBuilding must be gov, OK!");
3540 for (
short tt = 16; tt < 48; tt++)
3542 for (
short ss = 16; ss < 48; ss++)
3551 sprintf_s(msg,
sizeof msg,
" SRenderBuilding type (%i) out-of-bounds (or %i), sorry!",
gridarray[t][s].type,
gridarray[t][s].buildzoneOrdinal);
3563 Trace(
" SRenderBuilding not in patch data, OK!");
3573 case sizeof SPacketMenu:
3578 SPacketMenu datapacket;
3579 memcpy_s(&datapacket,
sizeof SPacketMenu, &
p->data[1],
p->length - 1);
3583 wcscpy_s(ptr->
menu[0], 44, datapacket.row0);
3584 wcscpy_s(ptr->
menu[1], 44, datapacket.row1);
3585 wcscpy_s(ptr->
menu[2], 44, datapacket.row2);
3586 wcscpy_s(ptr->
menu[3], 44, datapacket.row3);
3587 wcscpy_s(ptr->
menu[4], 44, datapacket.row4);
3588 wcscpy_s(ptr->
menu[5], 44, datapacket.row5);
3599 else if (datapacket.interactive)
3608 sprintf_s(msg,
sizeof msg,
"Unknown packet size: %d",
p->length - 1);
3609 Trace(msg, Logger::Level::Debug);
3615 case ID_USER_PACKET_HELP:
3617 SVerbiage chat = SVerbiage();
3618 memcpy_s(&chat,
sizeof SVerbiage, &packet->data[1], packet->length - 1);
3619 sprintf_s(msg,
sizeof msg,
"Got verbiage: %i", chat.id);
3625 game->
GUI->
Toast(chat.text, static_cast<ActiveHelp>(chat.id));
3629 case ID_USER_PACKET_CHAT:
3631 WCHAR chat[TRANSMIT_CHAT_SIZE];
3632 const unsigned source_size = min(packet->length - 3, TRANSMIT_CHAT_SIZE * 2);
3633 memcpy_s(chat,
sizeof chat, &packet->data[3], source_size);
3635 if (packet->data[2] == 255)
3637 else if (packet->data[2] == 254)
3651 case ID_DISCONNECTION_NOTIFICATION:
3652 Trace(
"ID_DISCONNECTION_NOTIFICATION", Logger::Level::Warn);
3658 case ID_CONNECTION_LOST:
3659 Trace(
"ID_CONNECTION_LOST", Logger::Level::Warn);
3661 MessageBoxW(
nullptr, L
"Reliable packets cannot be delivered to the game server. Please check your connection and try again.", L
"Disconnected from server!", MB_ICONERROR | MB_OK);
3667 case ID_CONNECTION_ATTEMPT_FAILED:
3668 Trace(
"ID_CONNECTION_ATTEMPT_FAILED", Logger::Level::Warn);
3674 case ID_NO_FREE_INCOMING_CONNECTIONS:
3675 Trace(
"ID_NO_FREE_INCOMING_CONNECTIONS", Logger::Level::Warn);
3697 case ID_CONNECTION_REQUEST_ACCEPTED:
3698 Trace(
"ID_CONNECTION_REQUEST_ACCEPTED");
3703 sprintf_s(msg,
sizeof msg,
"Unknown packet ID %i",
p->data[0]);
void SetCloudCeilingTargetKm(float prmCloudCeilingTargetKm)
InputConfig inputConfigLeftToeBrake
float LeadingEdgeFlapsPosition
void SavePatchDate() const
int inventoryItemInUseType
void SendScreenShot(const char *fileContents, int length) const
int intentoryItemInUseVehicleId
Nullable< float > fuel_tank
void ReceiveWholeGrid(SRenderGrid datapacket)
std::vector< DIDEVICEINSTANCE > deviceList
void AddSupportChatMessage(const WCHAR *wmsg)
float turnByTurnTotalDistanceMeters
std::vector< Command > commandStream
void CalculateInsideArray(short t, short s) const
float airframeTempCelsius
Nullable< float > weightLbs
std::vector< int > flapSettings
D3DXQUATERNION orientation
std::vector< std::wstring > motd
float turnByTurnTotalTimeSeconds
void SendToServer(void *pData, DWORD dwSize, bool bGuaranteed, PacketOrdering order=ORDERING_NONE) const
void ChannelInvite(char *title, unsigned char whoinvited, unsigned char channel, unsigned char players) const
InformationDialog * informationDialog
void SexChangeOperation(char newsex)
void PlayerOffline(unsigned char arrayindex)
FIREWORKS fireworks[fireworksC]
RakNet::RakPeerInterface * rakPeer
float colonistsforbuilding
s_network_objects playerships[MAX_SCAN]
unsigned char cargoloadtype
unsigned char playerWeightKg
void ProcessPacket(SWeaponPacket datapacket)
void SetTurbidity(float prmTurbidity)
std::vector< unsigned char > personalInventory
InputConfig inputConfigGas
InputConfig inputConfigRoll
InputConfig inputConfigLookVertical
void SetTurbulenceScalar(float prmTurbulence)
static float GetCpuSpeedMhz()
void AddOrUpdate(Swaypoint tempwaypoint) const
D3DXQUATERNION orientleft
void ToggleFullScreen(bool goFullScreen)
void SendEvent(EventType eventType, float extent=0.0f) const
void ChangePage(std::string screenName, std::string pageName)
Nullable< unsigned short > load_quantity
RakNet::RakNetStatistics * GetStatistics() const
std::vector< RECT > rooms
void InsertUpdateParent(USHORT vehicleId, USHORT parentId)
void FrameMove(GameState displaystage)
InputConfig inputConfigThrustLeft
InputConfig inputConfigThrustRight
void AddChatMessage(WCHAR *msg, unsigned char playerindex, unsigned char channel)
bool ThrustReverserCommand[MAX_ENGINES]
void PlayerLeftChannel(short tab, unsigned char playerindex)
s_mesh_component * componentarray
static DialogBase * dialogs[D_ENUMERATION]
void PlayAudioData(unsigned char *data, size_t length)
void LostScannerTarget(const char *msg) const
propulsion * ptrPropulsion
void LegacySoundRequestUniverse(SServerPacket datapacket)
void InsertUpdateModeAC(USHORT vehicleId, SmodeAC modeAC)
s_universe_object allobjects[maxstarC]
InputConfig inputConfigPitchTrim
Nullable< short > load_dest
void UseOrDisuseInventoryItemType(int itemtype, int itemId, int vehicleId) const
SPlayerData player[MAX_ONLINEPLAYERS]
void SetWindDirectionRadians(float prmWinddir)
float Clamp(float val, float min, float max)
void RepairVehicle() const
void LoadPeopleSounds() const
float MapScaleInnerRingKm
InputConfig inputConfigPitch
unsigned char turnByTurnRoutingType
RakNet::SystemAddress serverC
void InsertUpdateModeX(USHORT vehicleId, SmodeX modeX)
void AddPlayer(char *msg, unsigned char playerindex)
BUILDZONE buildzone[buildingVBC]
float EngineThrustOutput[MAX_ENGINES]
void AddDelayedSound(int soundEnum, float delay, float volume=1.0f)
InputConfig inputConfigBrake
void Toast(const WCHAR *message, ActiveHelp activeHelp)
void Trace(const char *msg, Logger::Level severity=Logger::Level::Info) const
const D3DXVECTOR3 centerC
LOCALGRID2 CalculateSRV(short t, short s, VECTOR2SHORT tcp, char cube, SRenderVertex sourcedata)
float TrailingEdgeFlapsPosition
void RakNetMessageHandler(RakNet::Packet *packet) const
float GetAttenuation(bool applyDensity) const
void LoadVehicleProfile(short t, bool forceCockpitTextures=false)
static D3DXVECTOR3 CalculateBarycentric(D3DXVECTOR3 *position, D3DXVECTOR3 *gthrust, float *radius)
CHATCHANNEL chatchannel[MAX_TAB]
void Log(const char *msg, Level level=Info, int errorCode=0)
void PlayerJoinedChannel(short tab, unsigned char playerindex)
unsigned short CargoBays[MAX_PODSPERSHIP]
InputConfig inputConfigRightToeBrake
RakNet::ConnectionAttemptResult Connect() const
void ChangeChannelName(unsigned char channelId, char *title)
float Play(int soundEnum)
ID3DXSprite * g_pTextSprite
void AddDiscordChatMessage(const WCHAR *msg)
void SetTemperatureCelsius(float prmTemperature)
void SetProjectionMatrices()
void RestorePage(std::string screenName)
void SetPlayerAlignment(char *msg, unsigned char playerindex)
bool weatherRadarEquipped
char GetAlignment(int ownerId) const
std::vector< Snode > nodes
void SendChatMessage(unsigned char channel, unsigned char player, const WCHAR *message) const
void SendTelemetry(SClientPacketNew *pData) const
InputConfig inputConfigWalkVertical
LOCALGRID2 gridarray[64][64]
void SendErrorReport(SErrorPacket *pData) const
Sscan Get(USHORT vehicleId) const
std::vector< Swaypoint > waypoint
InputConfig inputConfigWalkLateral
void SendTraceFile(const char *fileContents) const
void ChangePlayerProperties(SSubscribeData *prop)
Nullable< unsigned char > load_type
static bool CheckLayout(unsigned i, LOCALGRID2 localgrid2)
std::wstring strings[L_ENUMERATION]
void PlayEx(int soundEnum, bool loop, float volume=1.0f, float frequencyMod=1.0f, float pan=0.0f, bool restart=true)
void SetWindspeedKms(float prmWindspeed)
InputConfig inputConfigYaw
void ChangeChannelOwner(short tab, unsigned char playerindex)
void UpdateTrackedResource(const char *name, int status)
D3DXQUATERNION orientiter
void AddToCallStack(const char *msg)
void SetCloudSurfaceTargetKm(float prmCloudSurfaceTargetKm)
void RequestVerbiage(int helpId) const
std::vector< unsigned char > vehicleInventory
InputConfig inputConfigSteer
SPlayerData player[MAX_ONLINEPLAYERS]
InputConfig inputConfigLookLateral
LPDIRECT3DTEXTURE9 m_pddsHullDynamicTexture[MAX_SCAN]
unsigned short components
short Find(int uniqueid) const
float EngineThrustLever[MAX_ENGINES]