aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--launcher/LaunchController.cpp63
-rw-r--r--launcher/minecraft/MinecraftInstance.cpp10
-rw-r--r--launcher/minecraft/auth/AuthSession.cpp5
-rw-r--r--launcher/minecraft/auth/AuthSession.h4
-rw-r--r--launcher/minecraft/auth/Parsers.cpp2
-rw-r--r--launcher/minecraft/launch/ClaimAccount.cpp2
6 files changed, 54 insertions, 32 deletions
diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp
index be12eb79..7750be1a 100644
--- a/launcher/LaunchController.cpp
+++ b/launcher/LaunchController.cpp
@@ -16,6 +16,7 @@
#include <QHostInfo>
#include <QList>
#include <QHostAddress>
+#include <QPushButton>
#include "BuildConfig.h"
#include "JavaCommon.h"
@@ -145,36 +146,44 @@ void LaunchController::login() {
m_session->MakeOffline(usedname);
// offline flavored game from here :3
}
- if(m_accountToUse->ownsMinecraft() && !m_accountToUse->hasProfile()) {
- auto entitlement = m_accountToUse->accountData()->minecraftEntitlement;
- QString errorString;
- if(!entitlement.canPlayMinecraft) {
- errorString = tr("The account does not own Minecraft. You need to purchase the game first to play it.");
- QMessageBox::warning(
- nullptr,
- tr("Missing Minecraft profile"),
- errorString,
- QMessageBox::StandardButton::Ok,
- QMessageBox::StandardButton::Ok
- );
- emitFailed(errorString);
- return;
- }
- // Now handle setting up a profile name here...
- ProfileSetupDialog dialog(m_accountToUse, m_parentWidget);
- if (dialog.exec() == QDialog::Accepted)
- {
- tryagain = true;
- continue;
- }
- else
- {
- emitFailed(tr("Received undetermined session status during login."));
- return;
+ if(m_accountToUse->ownsMinecraft()) {
+ if(!m_accountToUse->hasProfile()) {
+ // Now handle setting up a profile name here...
+ ProfileSetupDialog dialog(m_accountToUse, m_parentWidget);
+ if (dialog.exec() == QDialog::Accepted)
+ {
+ tryagain = true;
+ continue;
+ }
+ else
+ {
+ emitFailed(tr("Received undetermined session status during login."));
+ return;
+ }
}
+ // we own Minecraft, there is a profile, it's all ready to go!
+ launchInstance();
+ return;
}
else {
- launchInstance();
+ // play demo ?
+ QMessageBox box(m_parentWidget);
+ box.setWindowTitle(tr("Play demo?"));
+ box.setText(tr("This account does not own Minecraft.\nYou need to purchase the game first to play it.\n\nDo you want to play the demo?"));
+ box.setIcon(QMessageBox::Warning);
+ auto demoButton = box.addButton(tr("Play Demo"), QMessageBox::ButtonRole::YesRole);
+ auto cancelButton = box.addButton(tr("Cancel"), QMessageBox::ButtonRole::NoRole);
+ box.setDefaultButton(cancelButton);
+
+ box.exec();
+ if(box.clickedButton() == demoButton) {
+ // play demo here
+ m_session->MakeDemo();
+ launchInstance();
+ }
+ else {
+ emitFailed(tr("Launch cancelled - account does not own Minecraft."));
+ }
}
return;
}
diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp
index 2526e620..0b3c049b 100644
--- a/launcher/minecraft/MinecraftInstance.cpp
+++ b/launcher/minecraft/MinecraftInstance.cpp
@@ -431,8 +431,7 @@ QStringList MinecraftInstance::processMinecraftArgs(
QMap<QString, QString> token_mapping;
// yggdrasil!
- if(session)
- {
+ if(session) {
// token_mapping["auth_username"] = session->username;
token_mapping["auth_session"] = session->session;
token_mapping["auth_access_token"] = session->access_token;
@@ -440,6 +439,9 @@ QStringList MinecraftInstance::processMinecraftArgs(
token_mapping["auth_uuid"] = session->uuid;
token_mapping["user_properties"] = session->serializeUserProperties();
token_mapping["user_type"] = session->user_type;
+ if(session->demo) {
+ args_pattern += " --demo";
+ }
}
// blatant self-promotion.
@@ -872,7 +874,9 @@ shared_qobject_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPt
// if we aren't in offline mode,.
if(session->status != AuthSession::PlayableOffline)
{
- process->appendStep(new ClaimAccount(pptr, session));
+ if(!session->demo) {
+ process->appendStep(new ClaimAccount(pptr, session));
+ }
process->appendStep(new Update(pptr, Net::Mode::Online));
}
else
diff --git a/launcher/minecraft/auth/AuthSession.cpp b/launcher/minecraft/auth/AuthSession.cpp
index d44f9098..6bea74a3 100644
--- a/launcher/minecraft/auth/AuthSession.cpp
+++ b/launcher/minecraft/auth/AuthSession.cpp
@@ -30,3 +30,8 @@ bool AuthSession::MakeOffline(QString offline_playername)
status = PlayableOffline;
return true;
}
+
+void AuthSession::MakeDemo() {
+ player_name = "Player";
+ demo = true;
+}
diff --git a/launcher/minecraft/auth/AuthSession.h b/launcher/minecraft/auth/AuthSession.h
index 55fbdf39..a75df506 100644
--- a/launcher/minecraft/auth/AuthSession.h
+++ b/launcher/minecraft/auth/AuthSession.h
@@ -11,6 +11,7 @@ class QNetworkAccessManager;
struct AuthSession
{
bool MakeOffline(QString offline_playername);
+ void MakeDemo();
QString serializeUserProperties();
@@ -43,6 +44,9 @@ struct AuthSession
bool auth_server_online = false;
// Did the user request online mode?
bool wants_online = true;
+
+ //Is this a demo session?
+ bool demo = false;
};
typedef std::shared_ptr<AuthSession> AuthSessionPtr;
diff --git a/launcher/minecraft/auth/Parsers.cpp b/launcher/minecraft/auth/Parsers.cpp
index 2b189fe4..ed31e934 100644
--- a/launcher/minecraft/auth/Parsers.cpp
+++ b/launcher/minecraft/auth/Parsers.cpp
@@ -227,7 +227,7 @@ bool parseMinecraftEntitlements(QByteArray & data, MinecraftEntitlement &output)
auto obj = doc.object();
output.canPlayMinecraft = false;
- output.ownsMinecraft = true;
+ output.ownsMinecraft = false;
auto itemsArray = obj.value("items").toArray();
for(auto item: itemsArray) {
diff --git a/launcher/minecraft/launch/ClaimAccount.cpp b/launcher/minecraft/launch/ClaimAccount.cpp
index bb4f6806..1cd7c0da 100644
--- a/launcher/minecraft/launch/ClaimAccount.cpp
+++ b/launcher/minecraft/launch/ClaimAccount.cpp
@@ -6,7 +6,7 @@
ClaimAccount::ClaimAccount(LaunchTask* parent, AuthSessionPtr session): LaunchStep(parent)
{
- if(session->status == AuthSession::Status::PlayableOnline)
+ if(session->status == AuthSession::Status::PlayableOnline && !session->demo)
{
auto accounts = APPLICATION->accounts();
m_account = accounts->getAccountByProfileName(session->player_name);