aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp')
-rw-r--r--Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp
new file mode 100644
index 00000000..f01db84e
--- /dev/null
+++ b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp
@@ -0,0 +1,136 @@
+#include "stdafx.h"
+
+#include "Tutorial.h"
+#include "..\..\Minecraft.h"
+#include "..\..\MultiplayerLocalPlayer.h"
+#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
+#include "ChangeStateConstraint.h"
+#include "..\..\..\Minecraft.World\AABB.h"
+#include "..\..\ClientConnection.h"
+#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h"
+
+ChangeStateConstraint::ChangeStateConstraint( Tutorial *tutorial, eTutorial_State targetState, eTutorial_State sourceStates[], DWORD sourceStatesCount,
+ double x0, double y0, double z0, double x1, double y1, double z1, bool contains /*= true*/, bool changeGameMode /*= false*/, GameType *targetGameMode /*= 0*/ )
+ : TutorialConstraint( -1 )
+{
+ movementArea = AABB::newPermanent(x0, y0, z0, x1, y1, z1);
+
+ this->contains = contains;
+
+ m_changeGameMode = changeGameMode;
+ m_targetGameMode = targetGameMode;
+ m_changedFromGameMode = 0;
+
+ m_tutorial = tutorial;
+ m_targetState = targetState;
+ m_sourceStatesCount = sourceStatesCount;
+
+ m_bHasChanged = false;
+ m_changedFromState = e_Tutorial_State_None;
+
+ m_bComplete = false;
+
+ m_sourceStates = new eTutorial_State [m_sourceStatesCount];
+ for(unsigned int i=0;i<m_sourceStatesCount;i++)
+ {
+ m_sourceStates[i]=sourceStates[i];
+ }
+}
+
+ChangeStateConstraint::~ChangeStateConstraint()
+{
+ delete movementArea;
+ if(m_sourceStatesCount>0) delete [] m_sourceStates;
+}
+
+void ChangeStateConstraint::tick(int iPad)
+{
+ if(m_bComplete) return;
+
+ if(m_tutorial->isStateCompleted(m_targetState))
+ {
+ Minecraft *minecraft = Minecraft::GetInstance();
+ if(m_changeGameMode)
+ {
+ unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges();
+ Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_changedFromGameMode == GameType::CREATIVE);
+
+ unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges();
+ if(originalPrivileges != playerPrivs)
+ {
+ // Send update settings packet to server
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+ shared_ptr<MultiplayerLocalPlayer> player = minecraft->localplayers[iPad];
+ if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL)
+ {
+ player->connection->send( shared_ptr<PlayerInfoPacket>( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) );
+ }
+ }
+ }
+ m_bComplete = true;
+ return;
+ }
+
+ bool inASourceState = false;
+ Minecraft *minecraft = Minecraft::GetInstance();
+ for(DWORD i = 0; i < m_sourceStatesCount; ++i)
+ {
+ if(m_sourceStates[i] == m_tutorial->getCurrentState())
+ {
+ inASourceState = true;
+ break;
+ }
+ }
+ if( !m_bHasChanged && inASourceState && movementArea->contains( minecraft->localplayers[iPad]->getPos(1) ) == contains )
+ {
+ m_bHasChanged = true;
+ m_changedFromState = m_tutorial->getCurrentState();
+ m_tutorial->changeTutorialState(m_targetState);
+
+ if(m_changeGameMode)
+ {
+ if(minecraft->localgameModes[iPad] != NULL)
+ {
+ m_changedFromGameMode = minecraft->localplayers[iPad]->abilities.instabuild ? GameType::CREATIVE : GameType::SURVIVAL;
+
+ unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges();
+ Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_targetGameMode == GameType::CREATIVE);
+
+ unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges();
+ if(originalPrivileges != playerPrivs)
+ {
+ // Send update settings packet to server
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+ shared_ptr<MultiplayerLocalPlayer> player = minecraft->localplayers[iPad];
+ if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL)
+ {
+ player->connection->send( shared_ptr<PlayerInfoPacket>( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) );
+ }
+ }
+ }
+ }
+ }
+ else if( m_bHasChanged && movementArea->contains( minecraft->localplayers[iPad]->getPos(1) ) != contains )
+ {
+ m_bHasChanged = false;
+ m_tutorial->changeTutorialState(m_changedFromState);
+
+ if(m_changeGameMode)
+ {
+ unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges();
+ Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_changedFromGameMode == GameType::CREATIVE);
+
+ unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges();
+ if(originalPrivileges != playerPrivs)
+ {
+ // Send update settings packet to server
+ Minecraft *pMinecraft = Minecraft::GetInstance();
+ shared_ptr<MultiplayerLocalPlayer> player = minecraft->localplayers[iPad];
+ if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL)
+ {
+ player->connection->send( shared_ptr<PlayerInfoPacket>( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) );
+ }
+ }
+ }
+ }
+} \ No newline at end of file