aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Common/Tutorial
diff options
context:
space:
mode:
authorLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
committerLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
commit42aec6dac53dffa6afe072560a7e1d4986112538 (patch)
tree0836426857391df1b6a83f6368a183f83ec9b104 /Minecraft.Client/Common/Tutorial
parentc9d58eeac7c72f0b3038e084667b4d89a6249fce (diff)
parentef9b6fd500dfabd9463267b0dd9e29577eea8a2b (diff)
Merge branch 'main' into pr/win64-world-saves
# Conflicts: # Minecraft.Client/MinecraftServer.cpp # README.md
Diffstat (limited to 'Minecraft.Client/Common/Tutorial')
-rw-r--r--Minecraft.Client/Common/Tutorial/ChoiceTask.cpp45
-rw-r--r--Minecraft.Client/Common/Tutorial/ControllerTask.cpp8
-rw-r--r--Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp2
-rw-r--r--Minecraft.Client/Common/Tutorial/FullTutorial.cpp75
-rw-r--r--Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp43
-rw-r--r--Minecraft.Client/Common/Tutorial/HorseChoiceTask.h23
-rw-r--r--Minecraft.Client/Common/Tutorial/InfoTask.cpp7
-rw-r--r--Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp12
-rw-r--r--Minecraft.Client/Common/Tutorial/RideEntityTask.cpp30
-rw-r--r--Minecraft.Client/Common/Tutorial/RideEntityTask.h22
-rw-r--r--Minecraft.Client/Common/Tutorial/Tutorial.cpp260
-rw-r--r--Minecraft.Client/Common/Tutorial/Tutorial.h3
-rw-r--r--Minecraft.Client/Common/Tutorial/TutorialEnum.h32
-rw-r--r--Minecraft.Client/Common/Tutorial/TutorialTask.h6
-rw-r--r--Minecraft.Client/Common/Tutorial/TutorialTasks.h2
-rw-r--r--Minecraft.Client/Common/Tutorial/UseItemTask.h1
16 files changed, 491 insertions, 80 deletions
diff --git a/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp
index c03166b5..f42b3ee0 100644
--- a/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp
+++ b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp
@@ -7,6 +7,7 @@
#include "TutorialConstraints.h"
#include "ChoiceTask.h"
#include "..\..\..\Minecraft.World\Material.h"
+#include "..\..\Windows64\KeyboardMouseInput.h"
ChoiceTask::ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/,
int iConfirmMapping /*= 0*/, int iCancelMapping /*= 0*/,
@@ -33,7 +34,11 @@ ChoiceTask::ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId /*= -
bool ChoiceTask::isCompleted()
{
- Minecraft *pMinecraft = Minecraft::GetInstance();
+ Minecraft* pMinecraft = Minecraft::GetInstance();
+ if (!pMinecraft || !pMinecraft->player)
+ return false;
+
+ int xboxPad = pMinecraft->player->GetXboxPad();
if( m_bConfirmMappingComplete || m_bCancelMappingComplete )
{
@@ -49,24 +54,38 @@ bool ChoiceTask::isCompleted()
else
{
// If the player is under water then allow all keypresses so they can jump out
- if( pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water) ) return false;
-
- if(!m_bConfirmMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iConfirmMapping) > 0 )
+ if (pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water)) return false;
+#ifdef _WINDOWS64
+ if (!m_bConfirmMappingComplete &&
+ (InputManager.GetValue(xboxPad, m_iConfirmMapping) > 0
+ || KMInput.IsKeyDown(VK_RETURN)))
+#else
+ if (!m_bConfirmMappingComplete &&
+ InputManager.GetValue(xboxPad, m_iConfirmMapping) > 0)
+#endif
{
m_bConfirmMappingComplete = true;
}
- if(!m_bCancelMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iCancelMapping) > 0 )
+
+#ifdef _WINDOWS64
+ if (!m_bCancelMappingComplete &&
+ (InputManager.GetValue(xboxPad, m_iCancelMapping) > 0
+ || KMInput.IsKeyDown('B')))
+#else
+ if (!m_bCancelMappingComplete &&
+ InputManager.GetValue(xboxPad, m_iCancelMapping) > 0)
+#endif
{
m_bCancelMappingComplete = true;
}
- }
- if(m_bConfirmMappingComplete || m_bCancelMappingComplete)
- {
- sendTelemetry();
- enableConstraints(false, true);
+ if (m_bConfirmMappingComplete || m_bCancelMappingComplete)
+ {
+ sendTelemetry();
+ enableConstraints(false, true);
+ }
+ return m_bConfirmMappingComplete || m_bCancelMappingComplete;
}
- return m_bConfirmMappingComplete || m_bCancelMappingComplete;
}
eTutorial_CompletionAction ChoiceTask::getCompletionAction()
@@ -99,11 +118,11 @@ void ChoiceTask::handleUIInput(int iAction)
{
if(bHasBeenActivated && m_bShownForMinimumTime)
{
- if( iAction == m_iConfirmMapping )
+ if( iAction == m_iConfirmMapping)
{
m_bConfirmMappingComplete = true;
}
- else if(iAction == m_iCancelMapping )
+ else if(iAction == m_iCancelMapping)
{
m_bCancelMappingComplete = true;
}
diff --git a/Minecraft.Client/Common/Tutorial/ControllerTask.cpp b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp
index c5fe071b..c3a42120 100644
--- a/Minecraft.Client/Common/Tutorial/ControllerTask.cpp
+++ b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp
@@ -66,7 +66,11 @@ bool ControllerTask::isCompleted()
}
else
{
+#ifdef _WINDOWS64
+ bAllComplete = true;
+#else
bAllComplete = false;
+#endif
}
}
iCurrent++;
@@ -87,7 +91,11 @@ bool ControllerTask::isCompleted()
}
else
{
+#ifdef _WINDOWS64
+ bAllComplete = true;
+#else
bAllComplete = false;
+#endif
}
}
iCurrent++;
diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp
index 1367f411..86dbe500 100644
--- a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp
+++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp
@@ -62,7 +62,7 @@ int DiggerItemHint::attack(shared_ptr<ItemInstance> item, shared_ptr<Entity> ent
if(itemFound)
{
// It's also possible that we could hit TileEntities (eg falling sand) so don't want to give this hint then
- if( dynamic_pointer_cast<Mob>( entity ) != NULL )
+ if( entity->instanceof(eTYPE_MOB) )
{
return IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL;
}
diff --git a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp
index 123ab9de..d0fda62e 100644
--- a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp
+++ b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp
@@ -140,7 +140,7 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/)
int pickaxeAuxVals[] = {-1,-1,-1,-1,-1};
addTask(e_Tutorial_State_Gameplay, new CraftTask( pickaxeItems, pickaxeAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE) );
- addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::stoneBrick_Id, 8, -1, this, IDS_TUTORIAL_TASK_MINE_STONE ) );
+ addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::cobblestone_Id, 8, -1, this, IDS_TUTORIAL_TASK_MINE_STONE ) );
addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_CRAFT_FURNACE, ProgressFlagTask::e_Progress_Set_Flag, this ) );
addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::furnace_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_FURNACE ) );
@@ -522,8 +522,8 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/)
AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"tradingArea");
if(area != NULL)
{
- eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay};
- AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Trading, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) );
+ eTutorial_State tradingStates[] = {e_Tutorial_State_Gameplay};
+ AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Trading, tradingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) );
addTask(e_Tutorial_State_Trading, new ChoiceTask(this, IDS_TUTORIAL_TASK_TRADING_OVERVIEW, IDS_TUTORIAL_PROMPT_TRADING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Trading) );
@@ -538,6 +538,75 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/)
/*
*
*
+ * FIREWORKS
+ *
+ */
+ if(app.getGameRuleDefinitions() != NULL)
+ {
+ AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"fireworksArea");
+ if(area != NULL)
+ {
+ eTutorial_State fireworkStates[] = {e_Tutorial_State_Gameplay};
+ AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Fireworks, fireworkStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) );
+
+ addTask(e_Tutorial_State_Fireworks, new ChoiceTask(this, IDS_TUTORIAL_TASK_FIREWORK_OVERVIEW, IDS_TUTORIAL_PROMPT_FIREWORK_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Trading) );
+
+ addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_CUSTOMISE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); //
+ addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_CRAFTING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ }
+ }
+
+ /*
+ *
+ *
+ * BEACON
+ *
+ */
+ if(app.getGameRuleDefinitions() != NULL)
+ {
+ AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"beaconArea");
+ if(area != NULL)
+ {
+ eTutorial_State beaconStates[] = {e_Tutorial_State_Gameplay};
+ AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Beacon, beaconStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) );
+
+ addTask(e_Tutorial_State_Beacon, new ChoiceTask(this, IDS_TUTORIAL_TASK_BEACON_OVERVIEW, IDS_TUTORIAL_PROMPT_BEACON_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Beacon) );
+
+ addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_DESIGN, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_CHOOSING_POWERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ }
+ }
+
+ /*
+ *
+ *
+ * HOPPER
+ *
+ */
+ if(app.getGameRuleDefinitions() != NULL)
+ {
+ AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"hopperArea");
+ if(area != NULL)
+ {
+ eTutorial_State hopperStates[] = {e_Tutorial_State_Gameplay};
+ AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Hopper, hopperStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) );
+
+ addTask(e_Tutorial_State_Hopper, new ChoiceTask(this, IDS_TUTORIAL_TASK_HOPPER_OVERVIEW, IDS_TUTORIAL_PROMPT_HOPPER_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Hopper) );
+
+ addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_CONTAINERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_MECHANICS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_REDSTONE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_OUTPUT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_AREA, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ }
+ }
+
+ /*
+ *
+ *
* ENDERCHEST
*
*/
diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp
new file mode 100644
index 00000000..e1d50fbf
--- /dev/null
+++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp
@@ -0,0 +1,43 @@
+#include "stdafx.h"
+
+#include <string>
+
+#include "Minecraft.h"
+#include "Tutorial.h"
+
+#include "..\Minecraft.World\EntityHorse.h"
+
+#include "HorseChoiceTask.h"
+
+HorseChoiceTask::HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId,
+ bool requiresUserInput, int iConfirmMapping, int iCancelMapping,
+ eTutorial_CompletionAction cancelAction, ETelemetryChallenges telemetryEvent)
+
+ : ChoiceTask(tutorial, -1, iPromptId, requiresUserInput, iConfirmMapping, iCancelMapping, cancelAction, telemetryEvent)
+{
+ m_eHorseType = -1;
+ m_iDescMule = iDescMule;
+ m_iDescDonkey = iDescDonkey;
+ m_iDescHorse = iDescHorse;
+}
+
+int HorseChoiceTask::getDescriptionId()
+{
+ switch (m_eHorseType)
+ {
+ case EntityHorse::TYPE_HORSE: return m_iDescHorse;
+ case EntityHorse::TYPE_DONKEY: return m_iDescDonkey;
+ case EntityHorse::TYPE_MULE: return m_iDescMule;
+ default: return -1;
+ }
+ return -1;
+}
+
+void HorseChoiceTask::onLookAtEntity(shared_ptr<Entity> entity)
+{
+ if ( (m_eHorseType < 0) && entity->instanceof(eTYPE_HORSE) )
+ {
+ shared_ptr<EntityHorse> horse = dynamic_pointer_cast<EntityHorse>(entity);
+ if ( horse->isAdult() ) m_eHorseType = horse->getType();
+ }
+} \ No newline at end of file
diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h
new file mode 100644
index 00000000..5130a7c7
--- /dev/null
+++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h
@@ -0,0 +1,23 @@
+#pragma once
+using namespace std;
+
+#include "ChoiceTask.h"
+
+
+// Same as choice task, but switches description based on horse type.
+class HorseChoiceTask : public ChoiceTask
+{
+protected:
+ int m_eHorseType;
+
+ int m_iDescHorse, m_iDescDonkey, m_iDescMule;
+
+public:
+ HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId = -1,
+ bool requiresUserInput = false, int iConfirmMapping = 0, int iCancelMapping = 0,
+ eTutorial_CompletionAction cancelAction = e_Tutorial_Completion_None, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown);
+
+ virtual int getDescriptionId();
+
+ virtual void onLookAtEntity(shared_ptr<Entity> entity);
+}; \ No newline at end of file
diff --git a/Minecraft.Client/Common/Tutorial/InfoTask.cpp b/Minecraft.Client/Common/Tutorial/InfoTask.cpp
index 5330841f..43a10357 100644
--- a/Minecraft.Client/Common/Tutorial/InfoTask.cpp
+++ b/Minecraft.Client/Common/Tutorial/InfoTask.cpp
@@ -7,6 +7,7 @@
#include "TutorialConstraints.h"
#include "InfoTask.h"
#include "..\..\..\Minecraft.World\Material.h"
+#include "..\..\KeyboardMouseInput.h"
InfoTask::InfoTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/,
int iMapping /*= 0*/, ETelemetryChallenges telemetryEvent /*= eTelemetryTutorial_NoEvent*/)
@@ -65,7 +66,11 @@ bool InfoTask::isCompleted()
bool current = (*it).second;
if(!current)
{
- if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 )
+#ifdef _WINDOWS64
+ if (InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 || KMInput.IsKeyDown(VK_SPACE))
+#else
+ if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0)
+#endif
{
(*it).second = true;
bAllComplete=true;
diff --git a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp
index 0a953a7b..c8723a84 100644
--- a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp
+++ b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp
@@ -50,15 +50,11 @@ bool LookAtTileHint::onLookAt(int id,int iData)
else
{
message->m_icon = id;
- if(m_iDataOverride > -1)
- {
- message->m_iAuxVal = m_iDataOverride;
- }
- else
- {
- message->m_iAuxVal = iData;
- }
}
+
+ // 4J-JEV: Moved to keep data override even if we're overriding the icon as well.
+ message->m_iAuxVal = (m_iDataOverride > -1) ? m_iDataOverride : iData;
+
message->m_messageId = Item::items[id]->getUseDescriptionId();
message->m_titleId = Item::items[id]->getDescriptionId(message->m_iAuxVal);
return m_tutorial->setMessage(this, message);
diff --git a/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp b/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp
new file mode 100644
index 00000000..29fe592d
--- /dev/null
+++ b/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp
@@ -0,0 +1,30 @@
+#include "stdafx.h"
+
+#include <string>
+
+#include "Minecraft.h"
+#include "Tutorial.h"
+
+#include "..\Minecraft.World\EntityHorse.h"
+
+#include "RideEntityTask.h"
+
+RideEntityTask::RideEntityTask(const int eType, Tutorial *tutorial, int descriptionId,
+ bool enablePreCompletion, vector<TutorialConstraint *> *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders)
+ : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ),
+ m_eType( eType )
+{
+}
+
+bool RideEntityTask::isCompleted()
+{
+ return bIsCompleted;
+}
+
+void RideEntityTask::onRideEntity(shared_ptr<Entity> entity)
+{
+ if (entity->instanceof((eINSTANCEOF) m_eType))
+ {
+ bIsCompleted = true;
+ }
+} \ No newline at end of file
diff --git a/Minecraft.Client/Common/Tutorial/RideEntityTask.h b/Minecraft.Client/Common/Tutorial/RideEntityTask.h
new file mode 100644
index 00000000..d9b6d41e
--- /dev/null
+++ b/Minecraft.Client/Common/Tutorial/RideEntityTask.h
@@ -0,0 +1,22 @@
+#pragma once
+using namespace std;
+
+#include "TutorialTask.h"
+
+class Level;
+
+// 4J-JEV: Tasks that involve riding an entity.
+class RideEntityTask : public TutorialTask
+{
+protected:
+ const int m_eType;
+
+public:
+ RideEntityTask(const int eTYPE, Tutorial *tutorial, int descriptionId,
+ bool enablePreCompletion = false, vector<TutorialConstraint *> *inConstraints = NULL,
+ bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true );
+
+ virtual bool isCompleted();
+
+ virtual void onRideEntity(shared_ptr<Entity> entity);
+}; \ No newline at end of file
diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Tutorial/Tutorial.cpp
index b0a0d665..057e2171 100644
--- a/Minecraft.Client/Common/Tutorial/Tutorial.cpp
+++ b/Minecraft.Client/Common/Tutorial/Tutorial.cpp
@@ -289,9 +289,9 @@ void Tutorial::staticCtor()
s_completableTasks.push_back( e_Tutorial_Hint_Potato );
s_completableTasks.push_back( e_Tutorial_Hint_Carrot );
- s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_18 );
- s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_19 );
- s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_20 );
+ s_completableTasks.push_back( e_Tutorial_Hint_CommandBlock );
+ s_completableTasks.push_back( e_Tutorial_Hint_Beacon );
+ s_completableTasks.push_back( e_Tutorial_Hint_Activator_Rail );
s_completableTasks.push_back( eTutorial_Telemetry_TrialStart );
s_completableTasks.push_back( eTutorial_Telemetry_Halfway );
@@ -317,9 +317,31 @@ void Tutorial::staticCtor()
s_completableTasks.push_back( e_Tutorial_State_Anvil );
s_completableTasks.push_back( e_Tutorial_State_Anvil_Menu );
s_completableTasks.push_back( e_Tutorial_State_Enderchests );
-
- s_completableTasks.push_back( e_Tutorial_State_Unused_9 );
- s_completableTasks.push_back( e_Tutorial_State_Unused_10 );
+ s_completableTasks.push_back( e_Tutorial_State_Horse_Menu );
+ s_completableTasks.push_back( e_Tutorial_State_Hopper_Menu );
+
+ s_completableTasks.push_back( e_Tutorial_Hint_Wither );
+ s_completableTasks.push_back( e_Tutorial_Hint_Witch );
+ s_completableTasks.push_back( e_Tutorial_Hint_Bat );
+ s_completableTasks.push_back( e_Tutorial_Hint_Horse );
+
+ s_completableTasks.push_back( e_Tutorial_Hint_RedstoneBlock );
+ s_completableTasks.push_back( e_Tutorial_Hint_DaylightDetector );
+ s_completableTasks.push_back( e_Tutorial_Hint_Dropper );
+ s_completableTasks.push_back( e_Tutorial_Hint_Hopper );
+ s_completableTasks.push_back( e_Tutorial_Hint_Comparator );
+ s_completableTasks.push_back( e_Tutorial_Hint_ChestTrap );
+ s_completableTasks.push_back( e_Tutorial_Hint_HayBlock );
+ s_completableTasks.push_back( e_Tutorial_Hint_ClayHardened );
+ s_completableTasks.push_back( e_Tutorial_Hint_ClayHardenedColored );
+ s_completableTasks.push_back( e_Tutorial_Hint_CoalBlock );
+
+ s_completableTasks.push_back( e_Tutorial_State_Beacon_Menu );
+ s_completableTasks.push_back( e_Tutorial_State_Fireworks_Menu );
+ s_completableTasks.push_back( e_Tutorial_State_Horse );
+ s_completableTasks.push_back( e_Tutorial_State_Hopper );
+ s_completableTasks.push_back( e_Tutorial_State_Beacon );
+ s_completableTasks.push_back( e_Tutorial_State_Fireworks );
if( s_completableTasks.size() > TUTORIAL_PROFILE_STORAGE_BITS )
{
@@ -376,10 +398,10 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
/*
* TILE HINTS
*/
- int rockItems[] = {Tile::rock_Id};
+ int rockItems[] = {Tile::stone_Id};
if(!isHintCompleted(e_Tutorial_Hint_Rock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Rock, this, rockItems, 1 ) );
- int stoneItems[] = {Tile::stoneBrick_Id};
+ int stoneItems[] = {Tile::cobblestone_Id};
if(!isHintCompleted(e_Tutorial_Hint_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone, this, stoneItems, 1 ) );
int plankItems[] = {Tile::wood_Id};
@@ -438,7 +460,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_SMOOTHSIDE ) );
}
- int noteBlockItems[] = {Tile::musicBlock_Id};
+ int noteBlockItems[] = {Tile::noteblock_Id};
if(!isHintCompleted(e_Tutorial_Hint_Note_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Note_Block, this, noteBlockItems, 1 ) );
int poweredRailItems[] = {Tile::goldenRail_Id};
@@ -455,13 +477,13 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::FERN ) );
}
- int woolItems[] = {Tile::cloth_Id};
+ int woolItems[] = {Tile::wool_Id};
if(!isHintCompleted(e_Tutorial_Hint_Wool)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Wool, this, woolItems, 1 ) );
int flowerItems[] = {Tile::flower_Id, Tile::rose_Id};
if(!isHintCompleted(e_Tutorial_Hint_Flower)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Flower, this, flowerItems, 2 ) );
- int mushroomItems[] = {Tile::mushroom1_Id, Tile::mushroom2_Id};
+ int mushroomItems[] = {Tile::mushroom_brown_Id, Tile::mushroom_red_Id};
if(!isHintCompleted(e_Tutorial_Hint_Mushroom)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Mushroom, this, mushroomItems, 2 ) );
int goldBlockItems[] = {Tile::goldBlock_Id};
@@ -499,7 +521,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int bookshelfItems[] = {Tile::bookshelf_Id};
if(!isHintCompleted(e_Tutorial_Hint_Bookshelf)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Bookshelf, this, bookshelfItems, 1 ) );
- int mossStoneItems[] = {Tile::mossStone_Id};
+ int mossStoneItems[] = {Tile::mossyCobblestone_Id};
if(!isHintCompleted(e_Tutorial_Hint_Moss_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Moss_Stone, this, mossStoneItems, 1 ) );
int obsidianItems[] = {Tile::obsidian_Id};
@@ -526,7 +548,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int craftingTableItems[] = {Tile::workBench_Id};
if(!isHintCompleted(e_Tutorial_Hint_Crafting_Table)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Crafting_Table, this, craftingTableItems, 1 ) );
- int cropsItems[] = {Tile::crops_Id};
+ int cropsItems[] = {Tile::wheat_Id};
if(!isHintCompleted(e_Tutorial_Hint_Crops)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Crops, this, cropsItems, 1, -1, -1, 7 ) );
int farmlandItems[] = {Tile::farmland_Id};
@@ -544,7 +566,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int ladderItems[] = {Tile::ladder_Id};
if(!isHintCompleted(e_Tutorial_Hint_Ladder)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Ladder, this, ladderItems, 1 ) );
- int stairsStoneItems[] = {Tile::stairs_stone_Id,Tile::stairs_bricks_Id,Tile::stairs_stoneBrickSmooth_Id,Tile::stairs_wood_Id,Tile::stairs_sprucewood_Id,Tile::stairs_birchwood_Id,Tile::stairs_netherBricks_Id,Tile::stairs_sandstone_Id,Tile::stairs_quartz_Id};
+ int stairsStoneItems[] = {Tile::stairs_stone_Id,Tile::stairs_bricks_Id,Tile::stairs_stoneBrick_Id,Tile::stairs_wood_Id,Tile::stairs_sprucewood_Id,Tile::stairs_birchwood_Id,Tile::stairs_netherBricks_Id,Tile::stairs_sandstone_Id,Tile::stairs_quartz_Id};
if(!isHintCompleted(e_Tutorial_Hint_Stairs_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stairs_Stone, this, stairsStoneItems, 9 ) );
int railItems[] = {Tile::rail_Id};
@@ -562,7 +584,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int redstoneOreItems[] = {Tile::redStoneOre_Id, Tile::redStoneOre_lit_Id};
if(!isHintCompleted(e_Tutorial_Hint_Redstone_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Ore, this, redstoneOreItems, 2 ) );
- int redstoneTorchItems[] = {Tile::notGate_off_Id, Tile::notGate_on_Id};
+ int redstoneTorchItems[] = {Tile::redstoneTorch_off_Id, Tile::redstoneTorch_on_Id};
if(!isHintCompleted(e_Tutorial_Hint_Redstone_Torch)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Torch, this, redstoneTorchItems, 2 ) );
int buttonItems[] = {Tile::button_stone_Id, Tile::button_wood_Id};
@@ -583,19 +605,19 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int sugarCaneItems[] = {Tile::reeds_Id};
if(!isHintCompleted(e_Tutorial_Hint_Sugarcane)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sugarcane, this, sugarCaneItems, 1 ) );
- int recordPlayerItems[] = {Tile::recordPlayer_Id};
+ int recordPlayerItems[] = {Tile::jukebox_Id};
if(!isHintCompleted(e_Tutorial_Hint_Record_Player)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Record_Player, this, recordPlayerItems, 1 ) );
int pumpkinItems[] = {Tile::pumpkin_Id};
if(!isHintCompleted(e_Tutorial_Hint_Pumpkin)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Pumpkin, this, pumpkinItems, 1, -1, -1, 0 ) );
- int hellRockItems[] = {Tile::hellRock_Id};
+ int hellRockItems[] = {Tile::netherRack_Id};
if(!isHintCompleted(e_Tutorial_Hint_Hell_Rock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Hell_Rock, this, hellRockItems, 1 ) );
- int hellSandItems[] = {Tile::hellSand_Id};
+ int hellSandItems[] = {Tile::soulsand_Id};
if(!isHintCompleted(e_Tutorial_Hint_Hell_Sand)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Hell_Sand, this, hellSandItems, 1 ) );
- int glowstoneItems[] = {Tile::lightGem_Id};
+ int glowstoneItems[] = {Tile::glowstone_Id};
if(!isHintCompleted(e_Tutorial_Hint_Glowstone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Glowstone, this, glowstoneItems, 1 ) );
int portalItems[] = {Tile::portalTile_Id};
@@ -608,7 +630,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
if(!isHintCompleted(e_Tutorial_Hint_Cake)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cake, this, cakeItems, 1 ) );
int redstoneRepeaterItems[] = {Tile::diode_on_Id, Tile::diode_off_Id};
- if(!isHintCompleted(e_Tutorial_Hint_Redstone_Repeater)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Repeater, this, redstoneRepeaterItems, 2, Item::diode_Id ) );
+ if(!isHintCompleted(e_Tutorial_Hint_Redstone_Repeater)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Repeater, this, redstoneRepeaterItems, 2, Item::repeater_Id ) );
int trapdoorItems[] = {Tile::trapdoor_Id};
if(!isHintCompleted(e_Tutorial_Hint_Trapdoor)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Trapdoor, this, trapdoorItems, 1 ) );
@@ -622,10 +644,10 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int monsterStoneEggItems[] = {Tile::monsterStoneEgg_Id};
if(!isHintCompleted(e_Tutorial_Hint_Monster_Stone_Egg)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Monster_Stone_Egg, this, monsterStoneEggItems, 1 ) );
- int stoneBrickSmoothItems[] = {Tile::stoneBrickSmooth_Id};
+ int stoneBrickSmoothItems[] = {Tile::stoneBrick_Id};
if(!isHintCompleted(e_Tutorial_Hint_Stone_Brick_Smooth)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Brick_Smooth, this, stoneBrickSmoothItems, 1 ) );
- int hugeMushroomItems[] = {Tile::hugeMushroom1_Id,Tile::hugeMushroom2_Id};
+ int hugeMushroomItems[] = {Tile::hugeMushroom_brown_Id,Tile::hugeMushroom_red_Id};
if(!isHintCompleted(e_Tutorial_Hint_Huge_Mushroom)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Huge_Mushroom, this, hugeMushroomItems, 2 ) );
int ironFenceItems[] = {Tile::ironFence_Id};
@@ -673,7 +695,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int endPortalFrameItems[] = {Tile::endPortalFrameTile_Id};
if(!isHintCompleted(e_Tutorial_Hint_End_Portal_Frame)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_End_Portal_Frame, this, endPortalFrameItems, 1 ) );
- int whiteStoneItems[] = {Tile::whiteStone_Id};
+ int whiteStoneItems[] = {Tile::endStone_Id};
if(!isHintCompleted(e_Tutorial_Hint_White_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_White_Stone, this, whiteStoneItems, 1 ) );
int dragonEggItems[] = {Tile::dragonEgg_Id};
@@ -683,7 +705,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
if(!isHintCompleted(e_Tutorial_Hint_RedstoneLamp)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_RedstoneLamp, this, redstoneLampItems, 2 ) );
int cocoaItems[] = {Tile::cocoa_Id};
- if(!isHintCompleted(e_Tutorial_Hint_Cocoa)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cocoa, this, cocoaItems, 1 ) );
+ if(!isHintCompleted(e_Tutorial_Hint_Cocoa)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cocoa, this, cocoaItems, 1, Item::dye_powder_Id, -1, DyePowderItem::BROWN) );
int emeraldOreItems[] = {Tile::emeraldOre_Id};
if(!isHintCompleted(e_Tutorial_Hint_EmeraldOre)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_EmeraldOre, this, emeraldOreItems, 1 ) );
@@ -734,6 +756,45 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
int carrotItems[] = {Tile::carrots_Id};
if(!isHintCompleted(e_Tutorial_Hint_Carrot)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Carrot, this, carrotItems, 1, -1, -1, 7 ) );
+
+ int commandBlockItems[] = {Tile::commandBlock_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_CommandBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CommandBlock, this, commandBlockItems, 1 ) );
+
+ int beaconItems[] = {Tile::beacon_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_Beacon)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Beacon, this, beaconItems, 1 ) );
+
+ int activatorRailItems[] = {Tile::activatorRail_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_Activator_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Activator_Rail, this, activatorRailItems, 1 ) );
+
+ int redstoneBlockItems[] = {Tile::redstoneBlock_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_RedstoneBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_RedstoneBlock, this, redstoneBlockItems, 1 ) );
+
+ int daylightDetectorItems[] = {Tile::daylightDetector_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_DaylightDetector)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_DaylightDetector, this, daylightDetectorItems, 1 ) );
+
+ int dropperItems[] = {Tile::dropper_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_Dropper)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Dropper, this, dropperItems, 1 ) );
+
+ int hopperItems[] = {Tile::hopper_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_Hopper)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Hopper, this, hopperItems, 1 ) );
+
+ int comparatorItems[] = {Tile::comparator_off_Id, Tile::comparator_on_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_Comparator)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Comparator, this, comparatorItems, 2, Item::comparator_Id ) );
+
+ int trappedChestItems[] = {Tile::chest_trap_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_ChestTrap)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_ChestTrap, this, trappedChestItems, 1 ) );
+
+ int hayBlockItems[] = {Tile::hayBlock_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_HayBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_HayBlock, this, hayBlockItems, 1 ) );
+
+ int clayHardenedItems[] = {Tile::clayHardened_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_ClayHardened)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_ClayHardened, this, clayHardenedItems, 1 ) );
+
+ int clayHardenedColoredItems[] = {Tile::clayHardened_colored_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_ClayHardenedColored)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_ClayHardenedColored, this, clayHardenedColoredItems, 1 ) );
+
+ int coalBlockItems[] = {Tile::coalBlock_Id};
+ if(!isHintCompleted(e_Tutorial_Hint_CoalBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CoalBlock, this, coalBlockItems, 1 ) );
/*
* ENTITY HINTS
@@ -760,8 +821,12 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
if(!isHintCompleted(e_Tutorial_Hint_EnderDragon)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_EnderDragon, this, IDS_DESC_ENDERDRAGON, IDS_ENDERDRAGON, eTYPE_ENDERDRAGON ) );
if(!isHintCompleted(e_Tutorial_Hint_Blaze)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Blaze, this, IDS_DESC_BLAZE, IDS_BLAZE, eTYPE_BLAZE ) );
if(!isHintCompleted(e_Tutorial_Hint_Lava_Slime)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Lava_Slime, this, IDS_DESC_LAVA_SLIME, IDS_LAVA_SLIME, eTYPE_LAVASLIME ) );
- if(!isHintCompleted(e_Tutorial_Hint_Ozelot)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Ozelot, this, IDS_DESC_OZELOT, IDS_OZELOT, eTYPE_OZELOT ) );
+ if(!isHintCompleted(e_Tutorial_Hint_Ozelot)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Ozelot, this, IDS_DESC_OZELOT, IDS_OZELOT, eTYPE_OCELOT ) );
if(!isHintCompleted(e_Tutorial_Hint_Villager)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Villager, this, IDS_DESC_VILLAGER, IDS_VILLAGER, eTYPE_VILLAGER) );
+ if(!isHintCompleted(e_Tutorial_Hint_Wither)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Wither, this, IDS_DESC_WITHER, IDS_WITHER, eTYPE_WITHERBOSS) );
+ if(!isHintCompleted(e_Tutorial_Hint_Witch)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Witch, this, IDS_DESC_WITCH, IDS_WITCH, eTYPE_WITCH) );
+ if(!isHintCompleted(e_Tutorial_Hint_Bat)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Bat, this, IDS_DESC_BAT, IDS_BAT, eTYPE_BAT) );
+ if(!isHintCompleted(e_Tutorial_Hint_Horse)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Horse, this, IDS_DESC_HORSE, IDS_HORSE, eTYPE_HORSE) );
/*
@@ -932,6 +997,86 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad )
/*
*
*
+ * HORSE ENCOUNTER
+ *
+ */
+ if(isFullTutorial || !isStateCompleted(e_Tutorial_State_Horse) )
+ {
+ addTask(e_Tutorial_State_Horse,
+ new HorseChoiceTask(this, IDS_TUTORIAL_TASK_HORSE_OVERVIEW, IDS_TUTORIAL_TASK_DONKEY_OVERVIEW, IDS_TUTORIAL_TASK_MULE_OVERVIEW, IDS_TUTORIAL_PROMPT_HORSE_OVERVIEW,
+ true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Horse) );
+
+ addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_INTRO, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_TAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_TAMING2, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+
+ // 4J-JEV: Only force the RideEntityTask if we're on the full-tutorial.
+ if (isFullTutorial) addTask(e_Tutorial_State_Horse, new RideEntityTask(eTYPE_HORSE, this, IDS_TUTORIAL_TASK_HORSE_RIDE, true, NULL, false, false, false) );
+ else addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_RIDE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+
+ addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_SADDLES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_SADDLEBAGS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_BREEDING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ }
+
+ /*
+ *
+ *
+ * HORSE MENU
+ *
+ */
+ if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Horse_Menu ) )
+ {
+ ProcedureCompoundTask *horseMenuTask = new ProcedureCompoundTask( this );
+ horseMenuTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_HORSE_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_HorseMenu) );
+ horseMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_LAYOUT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ horseMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_EQUIPMENT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ horseMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_SADDLEBAGS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Horse_Menu, horseMenuTask );
+ }
+
+ /*
+ *
+ *
+ * FIREWORKS MENU
+ *
+ */
+ if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Fireworks_Menu ) )
+ {
+ ProcedureCompoundTask *fireworksMenuTask = new ProcedureCompoundTask( this );
+ fireworksMenuTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_FIREWORK_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_FireworksMenu) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_STARS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_HEIGHT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_CRAFT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_COLOUR, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_SHAPE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_EFFECT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_FADE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Fireworks_Menu, fireworksMenuTask );
+ }
+
+ /*
+ *
+ *
+ * BEACON MENU
+ *
+ */
+ if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Beacon_Menu ) )
+ {
+ ProcedureCompoundTask *beaconMenuTask = new ProcedureCompoundTask( this );
+ beaconMenuTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_BEACON_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_BeaconMenu) );
+ beaconMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_PRIMARY_POWERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ beaconMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_SECONDARY_POWER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ beaconMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_ACTIVATION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) );
+ addTask(e_Tutorial_State_Beacon_Menu, beaconMenuTask );
+ }
+
+ /*
+ *
+ *
* MINECART
*
*/
@@ -1203,27 +1348,15 @@ void Tutorial::tick()
// Need to set the time on both levels to stop the flickering as the local level
// tries to predict the time
MinecraftServer::SetTimeOfDay(m_iTutorialFreezeTimeValue);
- pMinecraft->level->setOverrideTimeOfDay(m_iTutorialFreezeTimeValue); // Always daytime
+ pMinecraft->level->setDayTime(m_iTutorialFreezeTimeValue); // Always daytime
+ app.SetGameHostOption(eGameHostOption_DoDaylightCycle,0);
m_timeFrozen = true;
}
else if(m_freezeTime && m_timeFrozen && m_fullTutorialComplete)
{
- __int64 currentTime = pMinecraft->level->getTime();
- int currentDayTime = (currentTime % Level::TICKS_PER_DAY);
- int timeToAdd = 0;
- if(currentDayTime > m_iTutorialFreezeTimeValue)
- {
- timeToAdd = (Level::TICKS_PER_DAY - currentDayTime) + m_iTutorialFreezeTimeValue;
- }
- else
- {
- timeToAdd = m_iTutorialFreezeTimeValue - currentDayTime;
- }
- __int64 targetTime = currentTime + timeToAdd;
- MinecraftServer::SetTimeOfDay(-1);
- MinecraftServer::SetTime(targetTime);
- pMinecraft->level->setOverrideTimeOfDay(-1);
- pMinecraft->level->setTime(targetTime);
+ MinecraftServer::SetTimeOfDay(m_iTutorialFreezeTimeValue);
+ pMinecraft->level->setDayTime(m_iTutorialFreezeTimeValue);
+ app.SetGameHostOption(eGameHostOption_DoDaylightCycle,1);
m_timeFrozen = false;
}
@@ -1569,10 +1702,22 @@ bool Tutorial::setMessage(PopupMessageDetails *message)
{
TutorialMessage *messageString = it->second;
text = wstring( messageString->getMessageForDisplay() );
+
+ // 4J Stu - Quick fix for boat tutorial being incorrect
+ if(message->m_messageId == IDS_TUTORIAL_TASK_BOAT_OVERVIEW)
+ {
+ text = replaceAll(text, L"{*CONTROLLER_ACTION_USE*}", L"{*CONTROLLER_ACTION_DISMOUNT*}");
+ }
}
else
{
text = wstring( app.GetString(message->m_messageId) );
+
+ // 4J Stu - Quick fix for boat tutorial being incorrect
+ if(message->m_messageId == IDS_TUTORIAL_TASK_BOAT_OVERVIEW)
+ {
+ text = replaceAll(text, L"{*CONTROLLER_ACTION_USE*}", L"{*CONTROLLER_ACTION_DISMOUNT*}");
+ }
}
}
@@ -1916,7 +2061,7 @@ void Tutorial::onLookAt(int id, int iData)
}
}
-void Tutorial::onLookAtEntity(eINSTANCEOF type)
+void Tutorial::onLookAtEntity(shared_ptr<Entity> entity)
{
if( m_hintDisplayed ) return;
@@ -1924,12 +2069,39 @@ void Tutorial::onLookAtEntity(eINSTANCEOF type)
for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it)
{
TutorialHint *hint = *it;
- hintNeeded = hint->onLookAtEntity(type);
+ hintNeeded = hint->onLookAtEntity(entity->GetType());
if(hintNeeded)
{
break;
}
}
+
+ if ( (m_CurrentState == e_Tutorial_State_Gameplay) && entity->instanceof(eTYPE_HORSE) )
+ {
+ changeTutorialState(e_Tutorial_State_Horse);
+ }
+
+ for (AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it != activeTasks[m_CurrentState].end(); ++it)
+ {
+ (*it)->onLookAtEntity(entity);
+ }
+}
+
+void Tutorial::onRideEntity(shared_ptr<Entity> entity)
+{
+ if(m_CurrentState == e_Tutorial_State_Gameplay)
+ {
+ switch (entity->GetType())
+ {
+ case eTYPE_MINECART: changeTutorialState(e_Tutorial_State_Riding_Minecart); break;
+ case eTYPE_BOAT: changeTutorialState(e_Tutorial_State_Riding_Boat); break;
+ }
+ }
+
+ for (AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it != activeTasks[m_CurrentState].end(); ++it)
+ {
+ (*it)->onRideEntity(entity);
+ }
}
void Tutorial::onEffectChanged(MobEffect *effect, bool bRemoved)
diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.h b/Minecraft.Client/Common/Tutorial/Tutorial.h
index aaaaba0a..169c33e3 100644
--- a/Minecraft.Client/Common/Tutorial/Tutorial.h
+++ b/Minecraft.Client/Common/Tutorial/Tutorial.h
@@ -165,7 +165,8 @@ public:
void onTake(shared_ptr<ItemInstance> item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux);
void onSelectedItemChanged(shared_ptr<ItemInstance> item);
void onLookAt(int id, int iData=0);
- void onLookAtEntity(eINSTANCEOF type);
+ void onLookAtEntity(shared_ptr<Entity> entity);
+ void onRideEntity(shared_ptr<Entity> entity);
void onEffectChanged(MobEffect *effect, bool bRemoved=false);
bool canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt);
diff --git a/Minecraft.Client/Common/Tutorial/TutorialEnum.h b/Minecraft.Client/Common/Tutorial/TutorialEnum.h
index 33f2e67d..1de6bbad 100644
--- a/Minecraft.Client/Common/Tutorial/TutorialEnum.h
+++ b/Minecraft.Client/Common/Tutorial/TutorialEnum.h
@@ -62,9 +62,14 @@ enum eTutorial_State
e_Tutorial_State_Anvil,
e_Tutorial_State_Anvil_Menu,
e_Tutorial_State_Enderchests,
-
- e_Tutorial_State_Unused_9,
- e_Tutorial_State_Unused_10,
+ e_Tutorial_State_Horse,
+ e_Tutorial_State_Horse_Menu,
+ e_Tutorial_State_Hopper,
+ e_Tutorial_State_Hopper_Menu,
+ e_Tutorial_State_Beacon,
+ e_Tutorial_State_Beacon_Menu,
+ e_Tutorial_State_Fireworks,
+ e_Tutorial_State_Fireworks_Menu,
e_Tutorial_State_Max
};
@@ -201,9 +206,12 @@ enum eTutorial_Hint
e_Tutorial_Hint_EnderDragon,
e_Tutorial_Hint_Blaze,
e_Tutorial_Hint_Lava_Slime,
-
e_Tutorial_Hint_Ozelot,
e_Tutorial_Hint_Villager,
+ e_Tutorial_Hint_Wither,
+ e_Tutorial_Hint_Witch,
+ e_Tutorial_Hint_Bat,
+ e_Tutorial_Hint_Horse,
e_Tutorial_Hint_Item_Shovel,
e_Tutorial_Hint_Item_Hatchet,
@@ -292,9 +300,19 @@ enum eTutorial_Hint
e_Tutorial_Hint_Potato,
e_Tutorial_Hint_Carrot,
- e_Tutorial_Hint_Item_Unused_18,
- e_Tutorial_Hint_Item_Unused_19,
- e_Tutorial_Hint_Item_Unused_20,
+ e_Tutorial_Hint_CommandBlock,
+ e_Tutorial_Hint_Beacon,
+ e_Tutorial_Hint_Activator_Rail,
+ e_Tutorial_Hint_RedstoneBlock,
+ e_Tutorial_Hint_DaylightDetector,
+ e_Tutorial_Hint_Dropper,
+ e_Tutorial_Hint_Hopper,
+ e_Tutorial_Hint_Comparator,
+ e_Tutorial_Hint_ChestTrap,
+ e_Tutorial_Hint_HayBlock,
+ e_Tutorial_Hint_ClayHardened,
+ e_Tutorial_Hint_ClayHardenedColored,
+ e_Tutorial_Hint_CoalBlock,
e_Tutorial_Hint_Item_Max,
};
diff --git a/Minecraft.Client/Common/Tutorial/TutorialTask.h b/Minecraft.Client/Common/Tutorial/TutorialTask.h
index 92cb5999..b589ab27 100644
--- a/Minecraft.Client/Common/Tutorial/TutorialTask.h
+++ b/Minecraft.Client/Common/Tutorial/TutorialTask.h
@@ -6,6 +6,7 @@ class Level;
class Tutorial;
class TutorialConstraint;
class MobEffect;
+class Entity;
// A class that represents each individual task in the tutorial.
//
@@ -33,7 +34,7 @@ protected:
vector<TutorialConstraint *> constraints;
bool areConstraintsEnabled;
public:
- TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector<TutorialConstraint *> *inConstraints, bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true );
+ TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector<TutorialConstraint *> *inConstraints, bool bShowMinimumTime=false, bool bAllowFade=true, bool bTaskReminders=true );
virtual ~TutorialTask();
virtual int getDescriptionId() { return descriptionId; }
@@ -60,4 +61,7 @@ public:
virtual void onTake(shared_ptr<ItemInstance> item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) { }
virtual void onStateChange(eTutorial_State newState) { }
virtual void onEffectChanged(MobEffect *effect, bool bRemoved=false) { }
+
+ virtual void onLookAtEntity(shared_ptr<Entity> entity) { }
+ virtual void onRideEntity(shared_ptr<Entity> entity) { }
}; \ No newline at end of file
diff --git a/Minecraft.Client/Common/Tutorial/TutorialTasks.h b/Minecraft.Client/Common/Tutorial/TutorialTasks.h
index 591e9564..b3db973f 100644
--- a/Minecraft.Client/Common/Tutorial/TutorialTasks.h
+++ b/Minecraft.Client/Common/Tutorial/TutorialTasks.h
@@ -9,6 +9,8 @@
#include "XuiCraftingTask.h"
#include "StateChangeTask.h"
#include "ChoiceTask.h"
+#include "HorseChoiceTask.h"
+#include "RideEntityTask.h"
#include "FullTutorialActiveTask.h"
#include "AreaTask.h"
#include "ProgressFlagTask.h"
diff --git a/Minecraft.Client/Common/Tutorial/UseItemTask.h b/Minecraft.Client/Common/Tutorial/UseItemTask.h
index 46d71be4..6c729540 100644
--- a/Minecraft.Client/Common/Tutorial/UseItemTask.h
+++ b/Minecraft.Client/Common/Tutorial/UseItemTask.h
@@ -10,7 +10,6 @@ class UseItemTask : public TutorialTask
{
private:
const int itemId;
- bool completed;
public:
UseItemTask(const int itemId, Tutorial *tutorial, int descriptionId,