From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.Client/MultiPlayerLocalPlayer.cpp | 369 ++++++++++++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 Minecraft.Client/MultiPlayerLocalPlayer.cpp (limited to 'Minecraft.Client/MultiPlayerLocalPlayer.cpp') diff --git a/Minecraft.Client/MultiPlayerLocalPlayer.cpp b/Minecraft.Client/MultiPlayerLocalPlayer.cpp new file mode 100644 index 00000000..bb2630e5 --- /dev/null +++ b/Minecraft.Client/MultiPlayerLocalPlayer.cpp @@ -0,0 +1,369 @@ +#include "stdafx.h" +//#include "..\Minecraft.World\JavaMath.h" +#include "MultiplayerLocalPlayer.h" +#include "ClientConnection.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.network.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\AABB.h" +#include "..\Minecraft.World\net.minecraft.stats.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\Minecraft.World\LevelData.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" + + + + +MultiplayerLocalPlayer::MultiplayerLocalPlayer(Minecraft *minecraft, Level *level, User *user, ClientConnection *connection) : LocalPlayer(minecraft, level, user, level->dimension->id) +{ + // 4J - added initialisers + flashOnSetHealth = false; + xLast = yLast1 = yLast2 = zLast = 0; + yRotLast = xRotLast = 0; + lastOnGround = false; + lastSneaked = false; + lastIdle = false; + lastSprinting = false; + positionReminder = 0; + + this->connection = connection; +} + +bool MultiplayerLocalPlayer::hurt(DamageSource *source, int dmg) +{ + return false; +} + +void MultiplayerLocalPlayer::heal(int heal) +{ +} + +void MultiplayerLocalPlayer::tick() +{ + // 4J Added + // 4J-PB - changing this to a game host option ot hide gamertags + //bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + + /*if((app.GetGameSettings(m_iPad,eGameSetting_PlayerVisibleInMap)!=0) != m_bShownOnMaps) + { + m_bShownOnMaps = (app.GetGameSettings(m_iPad,eGameSetting_PlayerVisibleInMap)!=0); + if (m_bShownOnMaps) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::SHOW_ON_MAPS) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::HIDE_ON_MAPS) ) ); + }*/ + + if (!level->hasChunkAt(Mth::floor(x), 0, Mth::floor(z))) return; + + double tempX = x, tempY = y, tempZ = z; + LocalPlayer::tick(); + + //if( !minecraft->localgameModes[m_iPad]->isTutorial() || minecraft->localgameModes[m_iPad]->getTutorial()->canMoveToPosition(tempX, tempY, tempZ, x, y, z) ) + if(minecraft->localgameModes[m_iPad]->getTutorial()->canMoveToPosition(tempX, tempY, tempZ, x, y, z)) + { + sendPosition(); + } + else + { + //app.Debugprintf("Cannot move to position (%f, %f, %f), falling back to (%f, %f, %f)\n", x, y, z, tempX, y, tempZ); + this->setPos(tempX, y, tempZ); + } +} + +void MultiplayerLocalPlayer::sendPosition() +{ + bool sprinting = isSprinting(); + if (sprinting != lastSprinting) + { + if (sprinting) connection->send(shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SPRINTING))); + else connection->send(shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SPRINTING))); + + lastSprinting = sprinting; + } + + bool sneaking = isSneaking(); + if (sneaking != lastSneaked) + { + if (sneaking) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SNEAKING) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SNEAKING) ) ); + + lastSneaked = sneaking; + } + + bool idle = isIdle(); + if (idle != lastIdle) + { + if (idle) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_IDLEANIM) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_IDLEANIM) ) ); + + lastIdle = idle; + } + + double xdd = x - xLast; + double ydd1 = bb->y0 - yLast1; + double zdd = z - zLast; + + double rydd = yRot - yRotLast; + double rxdd = xRot - xRotLast; + + bool move = (xdd * xdd + ydd1 * ydd1 + zdd * zdd) > 0.03 * 0.03 || positionReminder >= POSITION_REMINDER_INTERVAL; + bool rot = rydd != 0 || rxdd != 0; + if (riding != NULL) + { + connection->send( shared_ptr( new MovePlayerPacket::PosRot(xd, -999, -999, zd, yRot, xRot, onGround, abilities.flying) ) ); + move = false; + } + else + { + if (move && rot) + { + connection->send( shared_ptr( new MovePlayerPacket::PosRot(x, bb->y0, y, z, yRot, xRot, onGround, abilities.flying) ) ); + } + else if (move) + { + connection->send( shared_ptr( new MovePlayerPacket::Pos(x, bb->y0, y, z, onGround, abilities.flying) ) ); + } + else if (rot) + { + connection->send( shared_ptr( new MovePlayerPacket::Rot(yRot, xRot, onGround, abilities.flying) ) ); + } + else + { + connection->send( shared_ptr( new MovePlayerPacket(onGround, abilities.flying) ) ); + } + } + + positionReminder++; + lastOnGround = onGround; + + if (move) + { + xLast = x; + yLast1 = bb->y0; + yLast2 = y; + zLast = z; + positionReminder = 0; + } + if (rot) + { + yRotLast = yRot; + xRotLast = xRot; + } + +} + +shared_ptr MultiplayerLocalPlayer::drop() +{ + connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::DROP_ITEM, 0, 0, 0, 0) ) ); + return nullptr; +} + +void MultiplayerLocalPlayer::reallyDrop(shared_ptr itemEntity) +{ +} + +void MultiplayerLocalPlayer::chat(const wstring& message) +{ + connection->send( shared_ptr( new ChatPacket(message) ) ); +} + +void MultiplayerLocalPlayer::swing() +{ + LocalPlayer::swing(); + connection->send( shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING) ) ); + +} + +void MultiplayerLocalPlayer::respawn() +{ + connection->send( shared_ptr( new ClientCommandPacket(ClientCommandPacket::PERFORM_RESPAWN))); +} + + +void MultiplayerLocalPlayer::actuallyHurt(DamageSource *source, int dmg) +{ + setHealth(getHealth() - dmg); +} + +// 4J Added override to capture event for tutorial messages +void MultiplayerLocalPlayer::completeUsingItem() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(useItem != NULL && pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->completeUsingItem(useItem); + } + Player::completeUsingItem(); +} + +void MultiplayerLocalPlayer::onEffectAdded(MobEffectInstance *effect) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->onEffectChanged(MobEffect::effects[effect->getId()]); + } + Player::onEffectAdded(effect); +} + + +void MultiplayerLocalPlayer::onEffectUpdated(MobEffectInstance *effect) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->onEffectChanged(MobEffect::effects[effect->getId()]); + } + Player::onEffectUpdated(effect); +} + + +void MultiplayerLocalPlayer::onEffectRemoved(MobEffectInstance *effect) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->onEffectChanged(MobEffect::effects[effect->getId()],true); + } + Player::onEffectRemoved(effect); +} + +void MultiplayerLocalPlayer::closeContainer() +{ + connection->send( shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); + inventory->setCarried(nullptr); + LocalPlayer::closeContainer(); +} + +void MultiplayerLocalPlayer::hurtTo(int newHealth, ETelemetryChallenges damageSource) +{ + if (flashOnSetHealth) + { + LocalPlayer::hurtTo(newHealth, damageSource); + } + else + { + setHealth(newHealth); + flashOnSetHealth = true; + } +} + +void MultiplayerLocalPlayer::awardStat(Stat *stat, byteArray param) +{ + if (stat == NULL) + { + delete [] param.data; + return; + } + + if (stat->awardLocallyOnly) + { + LocalPlayer::awardStat(stat, param); + } + else + { + delete [] param.data; + return; + } +} + +void MultiplayerLocalPlayer::awardStatFromServer(Stat *stat, byteArray param) +{ + if ( stat != NULL && !stat->awardLocallyOnly ) + { + LocalPlayer::awardStat(stat, param); + } + else delete [] param.data; +} + +void MultiplayerLocalPlayer::onUpdateAbilities() +{ + connection->send(shared_ptr(new PlayerAbilitiesPacket(&abilities))); +} + +bool MultiplayerLocalPlayer::isLocalPlayer() +{ + return true; +} + +void MultiplayerLocalPlayer::ride(shared_ptr e) +{ + bool wasRiding = riding != NULL; + LocalPlayer::ride(e); + bool isRiding = riding != NULL; + + if( isRiding ) + { + ETelemetryChallenges eventType = eTelemetryChallenges_Unknown; + if( this->riding != NULL ) + { + switch(riding->GetType()) + { + case eTYPE_BOAT: + eventType = eTelemetryInGame_Ride_Boat; + break; + case eTYPE_MINECART: + eventType = eTelemetryInGame_Ride_Minecart; + break; + case eTYPE_PIG: + eventType = eTelemetryInGame_Ride_Pig; + break; + }; + } + TelemetryManager->RecordEnemyKilledOrOvercome(GetXboxPad(), 0, y, 0, 0, 0, 0, eventType); + } + + updateRichPresence(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(wasRiding && !isRiding) + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Gameplay); + } + else if (!wasRiding && isRiding) + { + if(dynamic_pointer_cast(e) != NULL) + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Riding_Minecart); + else if(dynamic_pointer_cast(e) != NULL) + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Riding_Boat); + } + } +} + +void MultiplayerLocalPlayer::StopSleeping() +{ + connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SLEEPING) ) ); +} + +// 4J Added +void MultiplayerLocalPlayer::setAndBroadcastCustomSkin(DWORD skinId) +{ + DWORD oldSkinIndex = getCustomSkin(); + LocalPlayer::setCustomSkin(skinId); +#ifndef _CONTENT_PACKAGE + wprintf(L"Skin for local player %ls has changed to %ls (%d)\n", name.c_str(), customTextureUrl.c_str(), getPlayerDefaultSkin() ); +#endif + if(getCustomSkin() != oldSkinIndex) connection->send( shared_ptr( new TextureAndGeometryChangePacket( shared_from_this(), app.GetPlayerSkinName(GetXboxPad()) ) ) ); +} + +void MultiplayerLocalPlayer::setAndBroadcastCustomCape(DWORD capeId) +{ + DWORD oldCapeIndex = getCustomCape(); + LocalPlayer::setCustomCape(capeId); +#ifndef _CONTENT_PACKAGE + wprintf(L"Cape for local player %ls has changed to %ls\n", name.c_str(), customTextureUrl2.c_str()); +#endif + if(getCustomCape() != oldCapeIndex) connection->send( shared_ptr( new TextureChangePacket( shared_from_this(), TextureChangePacket::e_TextureChange_Cape, app.GetPlayerCapeName(GetXboxPad()) ) ) ); +} -- cgit v1.2.3