mirror of
https://github.com/LCEMP/LCEMP.git
synced 2026-07-24 21:37:03 +00:00
Merge branch 'main' of https://github.com/LCEMP/LCEMP
This commit is contained in:
commit
5ed3bb6ad6
|
|
@ -52,6 +52,11 @@
|
||||||
#endif
|
#endif
|
||||||
#include "DLCTexturePack.h"
|
#include "DLCTexturePack.h"
|
||||||
|
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
#include "Xbox\Network\NetworkPlayerXbox.h"
|
||||||
|
#include "Common\Network\PlatformNetworkManagerStub.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _DURANGO
|
#ifdef _DURANGO
|
||||||
#include "..\Minecraft.World\DurangoStats.h"
|
#include "..\Minecraft.World\DurangoStats.h"
|
||||||
#include "..\Minecraft.World\GenericStats.h"
|
#include "..\Minecraft.World\GenericStats.h"
|
||||||
|
|
@ -758,6 +763,27 @@ void ClientConnection::handleAddPlayer(shared_ptr<AddPlayerPacket> packet)
|
||||||
player->displayName = player->name;
|
player->displayName = player->name;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
{
|
||||||
|
PlayerUID pktXuid = player->getXuid();
|
||||||
|
const PlayerUID WIN64_XUID_BASE = (PlayerUID)0xe000d45248242f2e;
|
||||||
|
if (pktXuid >= WIN64_XUID_BASE && pktXuid < WIN64_XUID_BASE + MINECRAFT_NET_MAX_PLAYERS)
|
||||||
|
{
|
||||||
|
BYTE smallId = (BYTE)(pktXuid - WIN64_XUID_BASE);
|
||||||
|
INetworkPlayer *np = g_NetworkManager.GetPlayerBySmallId(smallId);
|
||||||
|
if (np != NULL)
|
||||||
|
{
|
||||||
|
NetworkPlayerXbox *npx = (NetworkPlayerXbox *)np;
|
||||||
|
IQNetPlayer *qp = npx->GetQNetPlayer();
|
||||||
|
if (qp != NULL && qp->m_gamertag[0] == 0)
|
||||||
|
{
|
||||||
|
wcsncpy_s(qp->m_gamertag, 32, packet->name.c_str(), _TRUNCATE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// printf("\t\t\t\t%d: Add player\n",packet->id,packet->yRot);
|
// printf("\t\t\t\t%d: Add player\n",packet->id,packet->yRot);
|
||||||
|
|
||||||
int item = packet->carriedItem;
|
int item = packet->carriedItem;
|
||||||
|
|
@ -893,6 +919,39 @@ void ClientConnection::handleMoveEntitySmall(shared_ptr<MoveEntityPacketSmall> p
|
||||||
|
|
||||||
void ClientConnection::handleRemoveEntity(shared_ptr<RemoveEntitiesPacket> packet)
|
void ClientConnection::handleRemoveEntity(shared_ptr<RemoveEntitiesPacket> packet)
|
||||||
{
|
{
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
if (!g_NetworkManager.IsHost())
|
||||||
|
{
|
||||||
|
for (int i = 0; i < packet->ids.length; i++)
|
||||||
|
{
|
||||||
|
shared_ptr<Entity> entity = getEntity(packet->ids[i]);
|
||||||
|
if (entity != NULL && entity->GetType() == eTYPE_PLAYER)
|
||||||
|
{
|
||||||
|
shared_ptr<Player> player = dynamic_pointer_cast<Player>(entity);
|
||||||
|
if (player != NULL)
|
||||||
|
{
|
||||||
|
PlayerUID xuid = player->getXuid();
|
||||||
|
INetworkPlayer *np = g_NetworkManager.GetPlayerByXuid(xuid);
|
||||||
|
if (np != NULL)
|
||||||
|
{
|
||||||
|
NetworkPlayerXbox *npx = (NetworkPlayerXbox *)np;
|
||||||
|
IQNetPlayer *qp = npx->GetQNetPlayer();
|
||||||
|
if (qp != NULL)
|
||||||
|
{
|
||||||
|
extern CPlatformNetworkManagerStub *g_pPlatformNetworkManager;
|
||||||
|
g_pPlatformNetworkManager->NotifyPlayerLeaving(qp);
|
||||||
|
qp->m_smallId = 0;
|
||||||
|
qp->m_isRemote = false;
|
||||||
|
qp->m_isHostPlayer = false;
|
||||||
|
qp->m_gamertag[0] = 0;
|
||||||
|
qp->SetCustomDataValue(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
for (int i = 0; i < packet->ids.length; i++)
|
for (int i = 0; i < packet->ids.length; i++)
|
||||||
{
|
{
|
||||||
level->removeEntity(packet->ids[i]);
|
level->removeEntity(packet->ids[i]);
|
||||||
|
|
|
||||||
|
|
@ -240,6 +240,28 @@ void CPlatformNetworkManagerStub::DoWork()
|
||||||
IQNet::s_playerCount--;
|
IQNet::s_playerCount--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i < MINECRAFT_NET_MAX_PLAYERS; i++)
|
||||||
|
{
|
||||||
|
IQNetPlayer *qp = &IQNet::m_player[i];
|
||||||
|
if (qp->GetCustomDataValue() == 0)
|
||||||
|
continue;
|
||||||
|
INetworkPlayer *np = (INetworkPlayer *)qp->GetCustomDataValue();
|
||||||
|
Socket *sock = np->GetSocket();
|
||||||
|
if (sock != NULL && sock->isClosing())
|
||||||
|
{
|
||||||
|
WinsockNetLayer::CloseConnectionBySmallId((BYTE)i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_iQNetStubState == QNET_STATE_GAME_PLAY && !m_pIQNet->IsHost())
|
||||||
|
{
|
||||||
|
if (!WinsockNetLayer::IsConnected() && !g_NetworkManager.IsLeavingGame())
|
||||||
|
{
|
||||||
|
if (app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None)
|
||||||
|
app.SetDisconnectReason(DisconnectPacket::eDisconnect_Quitting);
|
||||||
|
app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ExitWorld, (void *)TRUE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -811,7 +833,21 @@ INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerByXuid(PlayerUID xuid)
|
||||||
|
|
||||||
INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerBySmallId(unsigned char smallId)
|
INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerBySmallId(unsigned char smallId)
|
||||||
{
|
{
|
||||||
return getNetworkPlayer(m_pIQNet->GetPlayerBySmallId(smallId));
|
IQNetPlayer *qnetPlayer = m_pIQNet->GetPlayerBySmallId(smallId);
|
||||||
|
if (qnetPlayer == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
INetworkPlayer *networkPlayer = getNetworkPlayer(qnetPlayer);
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
if (networkPlayer == NULL && smallId != 0 && !m_pIQNet->IsHost())
|
||||||
|
{
|
||||||
|
qnetPlayer->m_isRemote = true;
|
||||||
|
qnetPlayer->m_isHostPlayer = false;
|
||||||
|
NotifyPlayerJoined(qnetPlayer);
|
||||||
|
networkPlayer = getNetworkPlayer(qnetPlayer);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return networkPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
INetworkPlayer *CPlatformNetworkManagerStub::GetHostPlayer()
|
INetworkPlayer *CPlatformNetworkManagerStub::GetHostPlayer()
|
||||||
|
|
|
||||||
|
|
@ -471,7 +471,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if (!g_KBMInput.IsMouseGrabbed())
|
if (!g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
|
||||||
{
|
{
|
||||||
int deltaX = g_KBMInput.GetMouseDeltaX();
|
int deltaX = g_KBMInput.GetMouseDeltaX();
|
||||||
int deltaY = g_KBMInput.GetMouseDeltaY();
|
int deltaY = g_KBMInput.GetMouseDeltaY();
|
||||||
|
|
@ -716,7 +716,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick()
|
||||||
// If there is no stick input, and we are over a slot, then snap pointer to slot centre.
|
// If there is no stick input, and we are over a slot, then snap pointer to slot centre.
|
||||||
// 4J - TomK - only if this particular component allows so!
|
// 4J - TomK - only if this particular component allows so!
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if(g_KBMInput.IsMouseGrabbed() && CanHaveFocus(eSectionUnderPointer))
|
if((g_KBMInput.IsMouseGrabbed() || !g_KBMInput.IsKBMActive()) && CanHaveFocus(eSectionUnderPointer))
|
||||||
#else
|
#else
|
||||||
if(CanHaveFocus(eSectionUnderPointer))
|
if(CanHaveFocus(eSectionUnderPointer))
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -691,7 +691,7 @@ void UIController::tickInput()
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if (!g_KBMInput.IsMouseGrabbed())
|
if (!g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
|
||||||
{
|
{
|
||||||
UIScene *pScene = NULL;
|
UIScene *pScene = NULL;
|
||||||
for (int grp = 0; grp < eUIGroup_COUNT && !pScene; ++grp)
|
for (int grp = 0; grp < eUIGroup_COUNT && !pScene; ++grp)
|
||||||
|
|
@ -729,20 +729,23 @@ void UIController::tickInput()
|
||||||
S32 numFocusables = 0;
|
S32 numFocusables = 0;
|
||||||
IggyPlayerGetFocusableObjects(movie, ¤tFocus, focusables, 64, &numFocusables);
|
IggyPlayerGetFocusableObjects(movie, ¤tFocus, focusables, 64, &numFocusables);
|
||||||
|
|
||||||
IggyFocusHandle hitObject = IGGY_FOCUS_NULL;
|
if (numFocusables > 0 && numFocusables <= 64)
|
||||||
for (S32 i = 0; i < numFocusables; ++i)
|
|
||||||
{
|
{
|
||||||
if (mouseX >= focusables[i].x0 && mouseX <= focusables[i].x1 &&
|
IggyFocusHandle hitObject = IGGY_FOCUS_NULL;
|
||||||
mouseY >= focusables[i].y0 && mouseY <= focusables[i].y1)
|
for (S32 i = 0; i < numFocusables; ++i)
|
||||||
{
|
{
|
||||||
hitObject = focusables[i].object;
|
if (mouseX >= focusables[i].x0 && mouseX <= focusables[i].x1 &&
|
||||||
break;
|
mouseY >= focusables[i].y0 && mouseY <= focusables[i].y1)
|
||||||
|
{
|
||||||
|
hitObject = focusables[i].object;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (hitObject != IGGY_FOCUS_NULL && hitObject != currentFocus)
|
if (hitObject != IGGY_FOCUS_NULL && hitObject != currentFocus)
|
||||||
{
|
{
|
||||||
IggyPlayerSetFocusRS(movie, hitObject, 0);
|
IggyPlayerSetFocusRS(movie, hitObject, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_KBMInput.IsMouseButtonDown(0) || g_KBMInput.IsMouseButtonPressed(0))
|
if (g_KBMInput.IsMouseButtonDown(0) || g_KBMInput.IsMouseButtonPressed(0))
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ void UIScene_AbstractContainerMenu::handleDestroy()
|
||||||
g_savedInventoryCursorPos.y = m_pointerPos.y;
|
g_savedInventoryCursorPos.y = m_pointerPos.y;
|
||||||
g_savedInventoryCursorPos.hasSavedPos = true;
|
g_savedInventoryCursorPos.hasSavedPos = true;
|
||||||
|
|
||||||
|
g_KBMInput.SetScreenCursorHidden(false);
|
||||||
g_KBMInput.SetCursorHiddenForUI(false);
|
g_KBMInput.SetCursorHiddenForUI(false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -82,6 +83,7 @@ void UIScene_AbstractContainerMenu::InitDataAssociations(int iPad, AbstractConta
|
||||||
void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex)
|
void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex)
|
||||||
{
|
{
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
|
g_KBMInput.SetScreenCursorHidden(true);
|
||||||
g_KBMInput.SetCursorHiddenForUI(true);
|
g_KBMInput.SetCursorHiddenForUI(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,7 @@ void PIXSetMarkerDeprecated(int a, char *b, ...) {}
|
||||||
|
|
||||||
bool IsEqualXUID(PlayerUID a, PlayerUID b)
|
bool IsEqualXUID(PlayerUID a, PlayerUID b)
|
||||||
{
|
{
|
||||||
#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) || defined(_DURANGO)
|
#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) || defined(_DURANGO) || defined(_WINDOWS64)
|
||||||
return (a == b);
|
return (a == b);
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -232,13 +232,17 @@ void Win64_SetupRemoteQNetPlayer(IQNetPlayer *player, BYTE smallId, bool isHost,
|
||||||
IQNet::s_playerCount = smallId + 1;
|
IQNet::s_playerCount = smallId + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool Win64_IsActivePlayer(IQNetPlayer *p, DWORD index);
|
||||||
|
|
||||||
HRESULT IQNet::AddLocalPlayerByUserIndex(DWORD dwUserIndex){ return S_OK; }
|
HRESULT IQNet::AddLocalPlayerByUserIndex(DWORD dwUserIndex){ return S_OK; }
|
||||||
IQNetPlayer *IQNet::GetHostPlayer() { return &m_player[0]; }
|
IQNetPlayer *IQNet::GetHostPlayer() { return &m_player[0]; }
|
||||||
IQNetPlayer *IQNet::GetLocalPlayerByUserIndex(DWORD dwUserIndex)
|
IQNetPlayer *IQNet::GetLocalPlayerByUserIndex(DWORD dwUserIndex)
|
||||||
{
|
{
|
||||||
if (s_isHosting)
|
if (s_isHosting)
|
||||||
{
|
{
|
||||||
if (dwUserIndex < MINECRAFT_NET_MAX_PLAYERS && !m_player[dwUserIndex].m_isRemote)
|
if (dwUserIndex < MINECRAFT_NET_MAX_PLAYERS &&
|
||||||
|
!m_player[dwUserIndex].m_isRemote &&
|
||||||
|
Win64_IsActivePlayer(&m_player[dwUserIndex], dwUserIndex))
|
||||||
return &m_player[dwUserIndex];
|
return &m_player[dwUserIndex];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -246,7 +250,7 @@ IQNetPlayer *IQNet::GetLocalPlayerByUserIndex(DWORD dwUserIndex)
|
||||||
return NULL;
|
return NULL;
|
||||||
for (DWORD i = 0; i < s_playerCount; i++)
|
for (DWORD i = 0; i < s_playerCount; i++)
|
||||||
{
|
{
|
||||||
if (!m_player[i].m_isRemote)
|
if (!m_player[i].m_isRemote && Win64_IsActivePlayer(&m_player[i], i))
|
||||||
return &m_player[i];
|
return &m_player[i];
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -272,19 +276,21 @@ IQNetPlayer *IQNet::GetPlayerByIndex(DWORD dwPlayerIndex)
|
||||||
}
|
}
|
||||||
IQNetPlayer *IQNet::GetPlayerBySmallId(BYTE SmallId)
|
IQNetPlayer *IQNet::GetPlayerBySmallId(BYTE SmallId)
|
||||||
{
|
{
|
||||||
for (DWORD i = 0; i < s_playerCount; i++)
|
if (SmallId >= MINECRAFT_NET_MAX_PLAYERS)
|
||||||
{
|
return NULL;
|
||||||
if (m_player[i].m_smallId == SmallId && Win64_IsActivePlayer(&m_player[i], i)) return &m_player[i];
|
|
||||||
}
|
m_player[SmallId].m_smallId = SmallId;
|
||||||
return NULL;
|
if (SmallId >= s_playerCount)
|
||||||
|
s_playerCount = SmallId + 1;
|
||||||
|
return &m_player[SmallId];
|
||||||
}
|
}
|
||||||
IQNetPlayer *IQNet::GetPlayerByXuid(PlayerUID xuid)
|
IQNetPlayer *IQNet::GetPlayerByXuid(PlayerUID xuid)
|
||||||
{
|
{
|
||||||
for (DWORD i = 0; i < s_playerCount; i++)
|
for (DWORD i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++)
|
||||||
{
|
{
|
||||||
if (Win64_IsActivePlayer(&m_player[i], i) && m_player[i].GetXuid() == xuid) return &m_player[i];
|
if (Win64_IsActivePlayer(&m_player[i], i) && m_player[i].GetXuid() == xuid) return &m_player[i];
|
||||||
}
|
}
|
||||||
return &m_player[0];
|
return NULL;
|
||||||
}
|
}
|
||||||
DWORD IQNet::GetPlayerCount()
|
DWORD IQNet::GetPlayerCount()
|
||||||
{
|
{
|
||||||
|
|
@ -299,15 +305,28 @@ QNET_STATE IQNet::GetState() { return _iQNetStubState; }
|
||||||
bool IQNet::IsHost() { return s_isHosting; }
|
bool IQNet::IsHost() { return s_isHosting; }
|
||||||
HRESULT IQNet::JoinGameFromInviteInfo(DWORD dwUserIndex, DWORD dwUserMask, const INVITE_INFO *pInviteInfo) { return S_OK; }
|
HRESULT IQNet::JoinGameFromInviteInfo(DWORD dwUserIndex, DWORD dwUserMask, const INVITE_INFO *pInviteInfo) { return S_OK; }
|
||||||
void IQNet::HostGame() { _iQNetStubState = QNET_STATE_SESSION_STARTING; s_isHosting = true; }
|
void IQNet::HostGame() { _iQNetStubState = QNET_STATE_SESSION_STARTING; s_isHosting = true; }
|
||||||
void IQNet::ClientJoinGame() { _iQNetStubState = QNET_STATE_SESSION_STARTING; s_isHosting = false; }
|
void IQNet::ClientJoinGame()
|
||||||
|
{
|
||||||
|
_iQNetStubState = QNET_STATE_SESSION_STARTING;
|
||||||
|
s_isHosting = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++)
|
||||||
|
{
|
||||||
|
m_player[i].m_smallId = (BYTE)i;
|
||||||
|
m_player[i].m_isRemote = true;
|
||||||
|
m_player[i].m_isHostPlayer = false;
|
||||||
|
m_player[i].m_gamertag[0] = 0;
|
||||||
|
m_player[i].SetCustomDataValue(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
void IQNet::EndGame()
|
void IQNet::EndGame()
|
||||||
{
|
{
|
||||||
_iQNetStubState = QNET_STATE_IDLE;
|
_iQNetStubState = QNET_STATE_IDLE;
|
||||||
s_isHosting = false;
|
s_isHosting = false;
|
||||||
s_playerCount = 1;
|
s_playerCount = 1;
|
||||||
for (int i = 1; i < MINECRAFT_NET_MAX_PLAYERS; i++)
|
for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++)
|
||||||
{
|
{
|
||||||
m_player[i].m_smallId = 0;
|
m_player[i].m_smallId = (BYTE)i;
|
||||||
m_player[i].m_isRemote = false;
|
m_player[i].m_isRemote = false;
|
||||||
m_player[i].m_isHostPlayer = false;
|
m_player[i].m_isHostPlayer = false;
|
||||||
m_player[i].m_gamertag[0] = 0;
|
m_player[i].m_gamertag[0] = 0;
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ void Input::tick(LocalPlayer *player)
|
||||||
float kbXA = 0.0f;
|
float kbXA = 0.0f;
|
||||||
float kbYA = 0.0f;
|
float kbYA = 0.0f;
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if (iPad == 0 && g_KBMInput.IsMouseGrabbed())
|
if (iPad == 0 && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
|
||||||
{
|
{
|
||||||
if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_RIGHT) )
|
if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_RIGHT) )
|
||||||
kbXA = g_KBMInput.GetMoveX();
|
kbXA = g_KBMInput.GetMoveX();
|
||||||
|
|
@ -94,7 +94,7 @@ void Input::tick(LocalPlayer *player)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if (iPad == 0 && g_KBMInput.IsMouseGrabbed())
|
if (iPad == 0 && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
|
||||||
{
|
{
|
||||||
// Left Shift = sneak (hold to crouch)
|
// Left Shift = sneak (hold to crouch)
|
||||||
if (pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_SNEAK_TOGGLE))
|
if (pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_SNEAK_TOGGLE))
|
||||||
|
|
@ -166,7 +166,7 @@ void Input::tick(LocalPlayer *player)
|
||||||
float turnY = ty * abs(ty) * turnSpeed;
|
float turnY = ty * abs(ty) * turnSpeed;
|
||||||
|
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if (iPad == 0 && g_KBMInput.IsMouseGrabbed())
|
if (iPad == 0 && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
|
||||||
{
|
{
|
||||||
float mouseSensitivity = ((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InGame)) / 100.0f;
|
float mouseSensitivity = ((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InGame)) / 100.0f;
|
||||||
float mouseLookScale = 5.0f;
|
float mouseLookScale = 5.0f;
|
||||||
|
|
@ -190,7 +190,7 @@ void Input::tick(LocalPlayer *player)
|
||||||
unsigned int jump = InputManager.GetValue(iPad, MINECRAFT_ACTION_JUMP);
|
unsigned int jump = InputManager.GetValue(iPad, MINECRAFT_ACTION_JUMP);
|
||||||
bool kbJump = false;
|
bool kbJump = false;
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
kbJump = (iPad == 0) && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_JUMP);
|
kbJump = (iPad == 0) && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive() && g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_JUMP);
|
||||||
#endif
|
#endif
|
||||||
if( (jump > 0 || kbJump) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP) )
|
if( (jump > 0 || kbJump) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP) )
|
||||||
jumping = true;
|
jumping = true;
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,8 @@ void KeyboardMouseInput::Init()
|
||||||
m_cursorHiddenForUI = false;
|
m_cursorHiddenForUI = false;
|
||||||
m_windowFocused = true;
|
m_windowFocused = true;
|
||||||
m_hasInput = false;
|
m_hasInput = false;
|
||||||
|
m_kbmActive = true;
|
||||||
|
m_screenWantsCursorHidden = false;
|
||||||
|
|
||||||
RAWINPUTDEVICE rid;
|
RAWINPUTDEVICE rid;
|
||||||
rid.usUsagePage = 0x01; // HID_USAGE_PAGE_GENERIC
|
rid.usUsagePage = 0x01; // HID_USAGE_PAGE_GENERIC
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,12 @@ public:
|
||||||
|
|
||||||
bool HasAnyInput() const { return m_hasInput; }
|
bool HasAnyInput() const { return m_hasInput; }
|
||||||
|
|
||||||
|
void SetKBMActive(bool active) { m_kbmActive = active; }
|
||||||
|
bool IsKBMActive() const { return m_kbmActive; }
|
||||||
|
|
||||||
|
void SetScreenCursorHidden(bool hidden) { m_screenWantsCursorHidden = hidden; }
|
||||||
|
bool IsScreenCursorHidden() const { return m_screenWantsCursorHidden; }
|
||||||
|
|
||||||
float GetMoveX() const;
|
float GetMoveX() const;
|
||||||
float GetMoveY() const;
|
float GetMoveY() const;
|
||||||
|
|
||||||
|
|
@ -121,6 +127,10 @@ private:
|
||||||
bool m_windowFocused;
|
bool m_windowFocused;
|
||||||
|
|
||||||
bool m_hasInput;
|
bool m_hasInput;
|
||||||
|
|
||||||
|
bool m_kbmActive;
|
||||||
|
|
||||||
|
bool m_screenWantsCursorHidden;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern KeyboardMouseInput g_KBMInput;
|
extern KeyboardMouseInput g_KBMInput;
|
||||||
|
|
|
||||||
|
|
@ -1457,7 +1457,7 @@ void Minecraft::run_middle()
|
||||||
{
|
{
|
||||||
if(InputManager.ButtonDown(i, MINECRAFT_ACTION_SNEAK_TOGGLE)) localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_SNEAK_TOGGLE;
|
if(InputManager.ButtonDown(i, MINECRAFT_ACTION_SNEAK_TOGGLE)) localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_SNEAK_TOGGLE;
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if(i == 0 && g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_SNEAK)) localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_SNEAK_TOGGLE;
|
if(i == 0 && g_KBMInput.IsKBMActive() && g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_SNEAK)) localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_SNEAK_TOGGLE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -1470,21 +1470,40 @@ void Minecraft::run_middle()
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
if(g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_LEFT))
|
if (g_KBMInput.IsKBMActive())
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_ACTION;
|
{
|
||||||
|
if(g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_LEFT))
|
||||||
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_ACTION;
|
||||||
|
|
||||||
if(g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_RIGHT))
|
if(g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_RIGHT))
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_USE;
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_USE;
|
||||||
|
|
||||||
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_INVENTORY))
|
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_INVENTORY))
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_INVENTORY;
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_INVENTORY;
|
||||||
|
|
||||||
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_DROP))
|
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_DROP))
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_DROP;
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_DROP;
|
||||||
|
|
||||||
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING) || g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING_ALT))
|
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING) || g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING_ALT))
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_CRAFTING;
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_CRAFTING;
|
||||||
|
|
||||||
|
int wheel = g_KBMInput.GetMouseWheel();
|
||||||
|
if (wheel > 0)
|
||||||
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_RIGHT_SCROLL;
|
||||||
|
else if (wheel < 0)
|
||||||
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_LEFT_SCROLL;
|
||||||
|
|
||||||
|
for (int slot = 0; slot < 9; slot++)
|
||||||
|
{
|
||||||
|
if (g_KBMInput.IsKeyPressed('1' + slot))
|
||||||
|
{
|
||||||
|
if (localplayers[i]->inventory)
|
||||||
|
localplayers[i]->inventory->selected = slot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utility keys always work regardless of KBM active state
|
||||||
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_PAUSE))
|
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_PAUSE))
|
||||||
{
|
{
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_PAUSEMENU;
|
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_PAUSEMENU;
|
||||||
|
|
@ -1504,21 +1523,6 @@ void Minecraft::run_middle()
|
||||||
{
|
{
|
||||||
showFpsCounter = !showFpsCounter;
|
showFpsCounter = !showFpsCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wheel = g_KBMInput.GetMouseWheel();
|
|
||||||
if (wheel > 0)
|
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_RIGHT_SCROLL;
|
|
||||||
else if (wheel < 0)
|
|
||||||
localplayers[i]->ullButtonsPressed|=1LL<<MINECRAFT_ACTION_LEFT_SCROLL;
|
|
||||||
|
|
||||||
for (int slot = 0; slot < 9; slot++)
|
|
||||||
{
|
|
||||||
if (g_KBMInput.IsKeyPressed('1' + slot))
|
|
||||||
{
|
|
||||||
if (localplayers[i]->inventory)
|
|
||||||
localplayers[i]->inventory->selected = slot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -3267,7 +3271,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures)
|
||||||
wheel = -1;
|
wheel = -1;
|
||||||
}
|
}
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
if (iPad == 0 && wheel == 0)
|
if (iPad == 0 && wheel == 0 && g_KBMInput.IsKBMActive())
|
||||||
{
|
{
|
||||||
int mw = g_KBMInput.GetMouseWheel();
|
int mw = g_KBMInput.GetMouseWheel();
|
||||||
if (mw > 0) wheel = -1;
|
if (mw > 0) wheel = -1;
|
||||||
|
|
@ -3297,7 +3301,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WINDOWS64 // allows for the player to get the block they are looking at in creative by middle clicking.
|
#ifdef _WINDOWS64 // allows for the player to get the block they are looking at in creative by middle clicking.
|
||||||
if (iPad == 0 && player->abilities.instabuild && g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_MIDDLE) && hitResult != NULL && (hitResult->type == HitResult::TILE || hitResult->type == HitResult::ENTITY))
|
if (iPad == 0 && g_KBMInput.IsKBMActive() && player->abilities.instabuild && g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_MIDDLE) && hitResult != NULL && (hitResult->type == HitResult::TILE || hitResult->type == HitResult::ENTITY))
|
||||||
{
|
{
|
||||||
//printf("MIDDLE CLICK TEST!!"); // windermed was here.
|
//printf("MIDDLE CLICK TEST!!"); // windermed was here.
|
||||||
int cloneId = -1;
|
int cloneId = -1;
|
||||||
|
|
@ -3390,7 +3394,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
bool actionHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_ACTION) || (iPad == 0 && g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_LEFT));
|
bool actionHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_ACTION) || (iPad == 0 && g_KBMInput.IsKBMActive() && g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_LEFT));
|
||||||
#else
|
#else
|
||||||
bool actionHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_ACTION);
|
bool actionHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_ACTION);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -3421,7 +3425,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
bool useHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE) || (iPad == 0 && g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_RIGHT));
|
bool useHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE) || (iPad == 0 && g_KBMInput.IsKBMActive() && g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_RIGHT));
|
||||||
#else
|
#else
|
||||||
bool useHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE);
|
bool useHeld = InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -213,6 +213,14 @@ bool WinsockNetLayer::JoinGame(const char *ip, int port)
|
||||||
|
|
||||||
s_isHost = false;
|
s_isHost = false;
|
||||||
s_hostSmallId = 0;
|
s_hostSmallId = 0;
|
||||||
|
s_connected = false;
|
||||||
|
s_active = false;
|
||||||
|
|
||||||
|
if (s_hostConnectionSocket != INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
closesocket(s_hostConnectionSocket);
|
||||||
|
s_hostConnectionSocket = INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
|
||||||
struct addrinfo hints = {};
|
struct addrinfo hints = {};
|
||||||
struct addrinfo *result = NULL;
|
struct addrinfo *result = NULL;
|
||||||
|
|
@ -231,37 +239,55 @@ bool WinsockNetLayer::JoinGame(const char *ip, int port)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
s_hostConnectionSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
|
bool connected = false;
|
||||||
if (s_hostConnectionSocket == INVALID_SOCKET)
|
BYTE assignedSmallId = 0;
|
||||||
|
const int maxAttempts = 12;
|
||||||
|
|
||||||
|
for (int attempt = 0; attempt < maxAttempts; ++attempt)
|
||||||
{
|
{
|
||||||
app.DebugPrintf("socket() failed: %d\n", WSAGetLastError());
|
s_hostConnectionSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
|
||||||
freeaddrinfo(result);
|
if (s_hostConnectionSocket == INVALID_SOCKET)
|
||||||
return false;
|
{
|
||||||
|
app.DebugPrintf("socket() failed: %d\n", WSAGetLastError());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int noDelay = 1;
|
||||||
|
setsockopt(s_hostConnectionSocket, IPPROTO_TCP, TCP_NODELAY, (const char *)&noDelay, sizeof(noDelay));
|
||||||
|
|
||||||
|
iResult = connect(s_hostConnectionSocket, result->ai_addr, (int)result->ai_addrlen);
|
||||||
|
if (iResult == SOCKET_ERROR)
|
||||||
|
{
|
||||||
|
int err = WSAGetLastError();
|
||||||
|
app.DebugPrintf("connect() to %s:%d failed (attempt %d/%d): %d\n", ip, port, attempt + 1, maxAttempts, err);
|
||||||
|
closesocket(s_hostConnectionSocket);
|
||||||
|
s_hostConnectionSocket = INVALID_SOCKET;
|
||||||
|
Sleep(200);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BYTE assignBuf[1];
|
||||||
|
int bytesRecv = recv(s_hostConnectionSocket, (char *)assignBuf, 1, 0);
|
||||||
|
if (bytesRecv != 1)
|
||||||
|
{
|
||||||
|
app.DebugPrintf("Failed to receive small ID assignment from host (attempt %d/%d)\n", attempt + 1, maxAttempts);
|
||||||
|
closesocket(s_hostConnectionSocket);
|
||||||
|
s_hostConnectionSocket = INVALID_SOCKET;
|
||||||
|
Sleep(200);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
assignedSmallId = assignBuf[0];
|
||||||
|
connected = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int noDelay = 1;
|
|
||||||
setsockopt(s_hostConnectionSocket, IPPROTO_TCP, TCP_NODELAY, (const char *)&noDelay, sizeof(noDelay));
|
|
||||||
|
|
||||||
iResult = connect(s_hostConnectionSocket, result->ai_addr, (int)result->ai_addrlen);
|
|
||||||
freeaddrinfo(result);
|
freeaddrinfo(result);
|
||||||
if (iResult == SOCKET_ERROR)
|
|
||||||
{
|
|
||||||
app.DebugPrintf("connect() to %s:%d failed: %d\n", ip, port, WSAGetLastError());
|
|
||||||
closesocket(s_hostConnectionSocket);
|
|
||||||
s_hostConnectionSocket = INVALID_SOCKET;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
BYTE assignBuf[1];
|
if (!connected)
|
||||||
int bytesRecv = recv(s_hostConnectionSocket, (char *)assignBuf, 1, 0);
|
|
||||||
if (bytesRecv != 1)
|
|
||||||
{
|
{
|
||||||
app.DebugPrintf("Failed to receive small ID assignment from host\n");
|
|
||||||
closesocket(s_hostConnectionSocket);
|
|
||||||
s_hostConnectionSocket = INVALID_SOCKET;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
s_localSmallId = assignBuf[0];
|
s_localSmallId = assignedSmallId;
|
||||||
|
|
||||||
app.DebugPrintf("Win64 LAN: Connected to %s:%d, assigned smallId=%d\n", ip, port, s_localSmallId);
|
app.DebugPrintf("Win64 LAN: Connected to %s:%d, assigned smallId=%d\n", ip, port, s_localSmallId);
|
||||||
|
|
||||||
|
|
@ -479,7 +505,8 @@ DWORD WINAPI WinsockNetLayer::RecvThreadProc(LPVOID param)
|
||||||
BYTE clientSmallId = s_connections[connIdx].smallId;
|
BYTE clientSmallId = s_connections[connIdx].smallId;
|
||||||
LeaveCriticalSection(&s_connectionsLock);
|
LeaveCriticalSection(&s_connectionsLock);
|
||||||
|
|
||||||
BYTE *recvBuf = new BYTE[WIN64_NET_RECV_BUFFER_SIZE];
|
std::vector<BYTE> recvBuf;
|
||||||
|
recvBuf.resize(WIN64_NET_RECV_BUFFER_SIZE);
|
||||||
|
|
||||||
while (s_active)
|
while (s_active)
|
||||||
{
|
{
|
||||||
|
|
@ -490,33 +517,47 @@ DWORD WINAPI WinsockNetLayer::RecvThreadProc(LPVOID param)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int packetSize = (header[0] << 24) | (header[1] << 16) | (header[2] << 8) | header[3];
|
int packetSize =
|
||||||
|
((uint32_t)header[0] << 24) |
|
||||||
|
((uint32_t)header[1] << 16) |
|
||||||
|
((uint32_t)header[2] << 8) |
|
||||||
|
((uint32_t)header[3]);
|
||||||
|
|
||||||
if (packetSize <= 0 || packetSize > WIN64_NET_RECV_BUFFER_SIZE)
|
if (packetSize <= 0 || packetSize > WIN64_NET_MAX_PACKET_SIZE)
|
||||||
{
|
{
|
||||||
app.DebugPrintf("Win64 LAN: Invalid packet size %d from client smallId=%d\n", packetSize, clientSmallId);
|
app.DebugPrintf("Win64 LAN: Invalid packet size %d from client smallId=%d (max=%d)\n",
|
||||||
|
packetSize,
|
||||||
|
clientSmallId,
|
||||||
|
(int)WIN64_NET_MAX_PACKET_SIZE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!RecvExact(sock, recvBuf, packetSize))
|
if ((int)recvBuf.size() < packetSize)
|
||||||
|
{
|
||||||
|
recvBuf.resize(packetSize);
|
||||||
|
app.DebugPrintf("Win64 LAN: Resized host recv buffer to %d bytes for client smallId=%d\n", packetSize, clientSmallId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!RecvExact(sock, &recvBuf[0], packetSize))
|
||||||
{
|
{
|
||||||
app.DebugPrintf("Win64 LAN: Client smallId=%d disconnected (body)\n", clientSmallId);
|
app.DebugPrintf("Win64 LAN: Client smallId=%d disconnected (body)\n", clientSmallId);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleDataReceived(clientSmallId, s_hostSmallId, recvBuf, packetSize);
|
HandleDataReceived(clientSmallId, s_hostSmallId, &recvBuf[0], packetSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] recvBuf;
|
|
||||||
|
|
||||||
EnterCriticalSection(&s_connectionsLock);
|
EnterCriticalSection(&s_connectionsLock);
|
||||||
for (size_t i = 0; i < s_connections.size(); i++)
|
for (size_t i = 0; i < s_connections.size(); i++)
|
||||||
{
|
{
|
||||||
if (s_connections[i].smallId == clientSmallId)
|
if (s_connections[i].smallId == clientSmallId)
|
||||||
{
|
{
|
||||||
s_connections[i].active = false;
|
s_connections[i].active = false;
|
||||||
closesocket(s_connections[i].tcpSocket);
|
if (s_connections[i].tcpSocket != INVALID_SOCKET)
|
||||||
s_connections[i].tcpSocket = INVALID_SOCKET;
|
{
|
||||||
|
closesocket(s_connections[i].tcpSocket);
|
||||||
|
s_connections[i].tcpSocket = INVALID_SOCKET;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -550,9 +591,26 @@ void WinsockNetLayer::PushFreeSmallId(BYTE smallId)
|
||||||
LeaveCriticalSection(&s_freeSmallIdLock);
|
LeaveCriticalSection(&s_freeSmallIdLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WinsockNetLayer::CloseConnectionBySmallId(BYTE smallId)
|
||||||
|
{
|
||||||
|
EnterCriticalSection(&s_connectionsLock);
|
||||||
|
for (size_t i = 0; i < s_connections.size(); i++)
|
||||||
|
{
|
||||||
|
if (s_connections[i].smallId == smallId && s_connections[i].active && s_connections[i].tcpSocket != INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
closesocket(s_connections[i].tcpSocket);
|
||||||
|
s_connections[i].tcpSocket = INVALID_SOCKET;
|
||||||
|
app.DebugPrintf("Win64 LAN: Force-closed TCP connection for smallId=%d\n", smallId);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&s_connectionsLock);
|
||||||
|
}
|
||||||
|
|
||||||
DWORD WINAPI WinsockNetLayer::ClientRecvThreadProc(LPVOID param)
|
DWORD WINAPI WinsockNetLayer::ClientRecvThreadProc(LPVOID param)
|
||||||
{
|
{
|
||||||
BYTE *recvBuf = new BYTE[WIN64_NET_RECV_BUFFER_SIZE];
|
std::vector<BYTE> recvBuf;
|
||||||
|
recvBuf.resize(WIN64_NET_RECV_BUFFER_SIZE);
|
||||||
|
|
||||||
while (s_active && s_hostConnectionSocket != INVALID_SOCKET)
|
while (s_active && s_hostConnectionSocket != INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
|
|
@ -565,23 +623,29 @@ DWORD WINAPI WinsockNetLayer::ClientRecvThreadProc(LPVOID param)
|
||||||
|
|
||||||
int packetSize = (header[0] << 24) | (header[1] << 16) | (header[2] << 8) | header[3];
|
int packetSize = (header[0] << 24) | (header[1] << 16) | (header[2] << 8) | header[3];
|
||||||
|
|
||||||
if (packetSize <= 0 || packetSize > WIN64_NET_RECV_BUFFER_SIZE)
|
if (packetSize <= 0 || packetSize > WIN64_NET_MAX_PACKET_SIZE)
|
||||||
{
|
{
|
||||||
app.DebugPrintf("Win64 LAN: Invalid packet size %d from host\n", packetSize);
|
app.DebugPrintf("Win64 LAN: Invalid packet size %d from host (max=%d)\n",
|
||||||
|
packetSize,
|
||||||
|
(int)WIN64_NET_MAX_PACKET_SIZE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!RecvExact(s_hostConnectionSocket, recvBuf, packetSize))
|
if ((int)recvBuf.size() < packetSize)
|
||||||
|
{
|
||||||
|
recvBuf.resize(packetSize);
|
||||||
|
app.DebugPrintf("Win64 LAN: Resized client recv buffer to %d bytes\n", packetSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!RecvExact(s_hostConnectionSocket, &recvBuf[0], packetSize))
|
||||||
{
|
{
|
||||||
app.DebugPrintf("Win64 LAN: Disconnected from host (body)\n");
|
app.DebugPrintf("Win64 LAN: Disconnected from host (body)\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleDataReceived(s_hostSmallId, s_localSmallId, recvBuf, packetSize);
|
HandleDataReceived(s_hostSmallId, s_localSmallId, &recvBuf[0], packetSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] recvBuf;
|
|
||||||
|
|
||||||
s_connected = false;
|
s_connected = false;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
#define WIN64_NET_DEFAULT_PORT 25565
|
#define WIN64_NET_DEFAULT_PORT 25565
|
||||||
#define WIN64_NET_MAX_CLIENTS 7
|
#define WIN64_NET_MAX_CLIENTS 7
|
||||||
#define WIN64_NET_RECV_BUFFER_SIZE 65536
|
#define WIN64_NET_RECV_BUFFER_SIZE 65536
|
||||||
|
#define WIN64_NET_MAX_PACKET_SIZE (4 * 1024 * 1024)
|
||||||
#define WIN64_LAN_DISCOVERY_PORT 25566
|
#define WIN64_LAN_DISCOVERY_PORT 25566
|
||||||
#define WIN64_LAN_BROADCAST_MAGIC 0x4D434C4E
|
#define WIN64_LAN_BROADCAST_MAGIC 0x4D434C4E
|
||||||
|
|
||||||
|
|
@ -81,6 +82,7 @@ public:
|
||||||
|
|
||||||
static bool PopDisconnectedSmallId(BYTE *outSmallId);
|
static bool PopDisconnectedSmallId(BYTE *outSmallId);
|
||||||
static void PushFreeSmallId(BYTE smallId);
|
static void PushFreeSmallId(BYTE smallId);
|
||||||
|
static void CloseConnectionBySmallId(BYTE smallId);
|
||||||
|
|
||||||
static bool StartAdvertising(int gamePort, const wchar_t *hostName, unsigned int gameSettings, unsigned int texPackId, unsigned char subTexId, unsigned short netVer);
|
static bool StartAdvertising(int gamePort, const wchar_t *hostName, unsigned int gameSettings, unsigned int texPackId, unsigned char subTexId, unsigned short netVer);
|
||||||
static void StopAdvertising();
|
static void StopAdvertising();
|
||||||
|
|
|
||||||
|
|
@ -1185,6 +1185,33 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
|
||||||
PIXBeginNamedEvent(0,"Input manager tick");
|
PIXBeginNamedEvent(0,"Input manager tick");
|
||||||
InputManager.Tick();
|
InputManager.Tick();
|
||||||
|
|
||||||
|
// detect input mode
|
||||||
|
if (InputManager.IsPadConnected(0))
|
||||||
|
{
|
||||||
|
bool controllerUsed = InputManager.ButtonPressed(0) ||
|
||||||
|
InputManager.GetJoypadStick_LX(0, false) != 0.0f ||
|
||||||
|
InputManager.GetJoypadStick_LY(0, false) != 0.0f ||
|
||||||
|
InputManager.GetJoypadStick_RX(0, false) != 0.0f ||
|
||||||
|
InputManager.GetJoypadStick_RY(0, false) != 0.0f;
|
||||||
|
|
||||||
|
if (controllerUsed)
|
||||||
|
g_KBMInput.SetKBMActive(false);
|
||||||
|
else if (g_KBMInput.HasAnyInput())
|
||||||
|
g_KBMInput.SetKBMActive(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_KBMInput.SetKBMActive(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_KBMInput.IsMouseGrabbed())
|
||||||
|
{
|
||||||
|
if (!g_KBMInput.IsKBMActive())
|
||||||
|
g_KBMInput.SetCursorHiddenForUI(true);
|
||||||
|
else if (!g_KBMInput.IsScreenCursorHidden())
|
||||||
|
g_KBMInput.SetCursorHiddenForUI(false);
|
||||||
|
}
|
||||||
|
|
||||||
PIXEndNamedEvent();
|
PIXEndNamedEvent();
|
||||||
PIXBeginNamedEvent(0,"Profile manager tick");
|
PIXBeginNamedEvent(0,"Profile manager tick");
|
||||||
// ProfileManager.Tick();
|
// ProfileManager.Tick();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue