diff options
Diffstat (limited to 'Minecraft.Client/Common/Tutorial/InfoTask.cpp')
| -rw-r--r-- | Minecraft.Client/Common/Tutorial/InfoTask.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/Tutorial/InfoTask.cpp b/Minecraft.Client/Common/Tutorial/InfoTask.cpp new file mode 100644 index 00000000..5330841f --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InfoTask.cpp @@ -0,0 +1,137 @@ +#include "stdafx.h" +#include <string> +#include <unordered_map> +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "InfoTask.h" +#include "..\..\..\Minecraft.World\Material.h" + +InfoTask::InfoTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/, + int iMapping /*= 0*/, ETelemetryChallenges telemetryEvent /*= eTelemetryTutorial_NoEvent*/) + : TutorialTask( tutorial, descriptionId, false, NULL, true, false, false ) +{ + if(requiresUserInput == true) + { + constraints.push_back( new InputConstraint( iMapping ) ); + } + completedMappings[iMapping]=false; + + m_promptId = promptId; + tutorial->addMessage( m_promptId ); + + m_eTelemetryEvent = telemetryEvent; +} + +bool InfoTask::isCompleted() +{ + if( bIsCompleted ) + return true; + + if( tutorial->m_hintDisplayed ) + return false; + + if( !bHasBeenActivated || !m_bShownForMinimumTime ) + return false; + + bool bAllComplete = true; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // 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(ui.GetMenuDisplayed(tutorial->getPad())) + { + // If a menu is displayed, then we use the handleUIInput to complete the task + bAllComplete = true; + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + bAllComplete = false; + break; + } + } + } + else + { + int iCurrent=0; + + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 ) + { + (*it).second = true; + bAllComplete=true; + } + else + { + bAllComplete = false; + } + } + iCurrent++; + } + } + + if(bAllComplete==true) + { + sendTelemetry(); + enableConstraints(false, true); + } + bIsCompleted = bAllComplete; + return bAllComplete; +} + +int InfoTask::getPromptId() +{ + if( m_bShownForMinimumTime ) + return m_promptId; + else + return -1; +} + +void InfoTask::setAsCurrentTask(bool active /*= true*/) +{ + enableConstraints( active ); + TutorialTask::setAsCurrentTask(active); +} + +void InfoTask::handleUIInput(int iAction) +{ + if(bHasBeenActivated) + { + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + if( iAction == (*it).first ) + { + (*it).second = true; + } + } + } +} + + +void InfoTask::sendTelemetry() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( m_eTelemetryEvent != eTelemetryChallenges_Unknown ) + { + bool firstPlay = true; + // We only store first play for some of the events + switch(m_eTelemetryEvent) + { + case eTelemetryTutorial_Complete: + firstPlay = !tutorial->getCompleted( eTutorial_Telemetry_Complete ); + tutorial->setCompleted( eTutorial_Telemetry_Complete ); + break; + }; + TelemetryManager->RecordEnemyKilledOrOvercome(pMinecraft->player->GetXboxPad(), 0, 0, 0, 0, 0, 0, m_eTelemetryEvent); + } +} |
