// ====================================================================== // // ScriptMethodsQuest.cpp // copyright (c) 2004 Sony Online Entertainment // // ====================================================================== #include "serverScript/FirstServerScript.h" #include "serverScript/JavaLibrary.h" #include "serverGame/Chat.h" #include "serverGame/CreatureObject.h" #include "serverGame/PlayerCreatureController.h" #include "serverGame/PlayerObject.h" #include "serverGame/StaticLootItemManager.h" #include "sharedGame/Quest.h" #include "sharedGame/QuestManager.h" #include "sharedGame/QuestTask.h" #include "sharedGame/SharedStringIds.h" #include "sharedNetworkMessages/MessageQueueGenericValueType.h" #include "sharedNetworkMessages/MessageQueueQuestTaskCounterMessage.h" #include "sharedNetworkMessages/MessageQueueQuestTaskLocationMessage.h" #include "sharedNetworkMessages/MessageQueueQuestTaskTimerMessage.h" #include "sharedObject/Controller.h" #include "sharedNetworkMessages/MessageQueueCyberneticsOpen.h" #include "UnicodeUtils.h" using namespace JNIWrappersNamespace; // ====================================================================== namespace ScriptMethodsQuestNamespace { PlayerObject * getPlayerForCharacter(jlong playerCreatureId) { CreatureObject * playerCreature = nullptr; if (JavaLibrary::getObject(playerCreatureId, playerCreature)) { return PlayerCreatureController::getPlayerObject(playerCreature); } else { NetworkId id(playerCreatureId); JAVA_THROW_SCRIPT_EXCEPTION(true, ("Requested player %s, who could not be found.", id.getValueString().c_str())); return nullptr; } } bool install(); jint JNICALL questGetQuestId(JNIEnv *env, jobject self, jstring questName); jstring JNICALL questGetQuestName(JNIEnv *env, jobject self, jint questId); jboolean JNICALL questIsQuestComplete(JNIEnv *env, jobject self, jint questId, jlong playerId); jint JNICALL questCanActivateQuest(JNIEnv *env, jobject self, jint questId, jlong playerId); jboolean JNICALL questIsQuestActive(JNIEnv *env, jobject self, jint questId, jlong playerId); jint JNICALL questActivateQuest(JNIEnv *env, jobject self, jint questId, jlong playerId, jlong questGiver); jint JNICALL questCompleteQuest(JNIEnv *env, jobject self, jint questId, jlong playerId); void JNICALL questClearQuest(JNIEnv *env, jobject self, jint questId, jlong playerId); jboolean JNICALL questIsTaskComplete(JNIEnv *env, jobject self, jint questId, jint taskId, jlong playerId); jint JNICALL questCanActivateTask(JNIEnv *env, jobject self, jint questId, jint taskId, jlong playerId); jboolean JNICALL questIsTaskActive(JNIEnv *env, jobject self, jint questId, jint taskId, jlong playerId); jint JNICALL questActivateTask(JNIEnv *env, jobject self, jint questId, jint taskId, jlong playerId); jint JNICALL questCompleteTask(JNIEnv *env, jobject self, jint questId, jint taskId, jlong playerId); jint JNICALL questFailTask(JNIEnv *env, jobject self, jint questId, jint taskId, jlong playerId); void JNICALL questClearQuestTask(JNIEnv *env, jobject self, jint questId, jint taskId, jlong playerId); void JNICALL questSetDebugging(JNIEnv *env, jobject self, jboolean debugging); jboolean JNICALL questGetDebugging(JNIEnv *env, jobject self); void JNICALL questSetQuestTaskCounter(JNIEnv *env, jobject self, jlong playerId, jstring questName, jint taskId, jstring sourceName, jint counter, jint counterMax); void JNICALL questSetQuestTaskLocation(JNIEnv *env, jobject self, jlong playerId, jstring questName, jint taskId, jobject taskLocation); void JNICALL questSetQuestTaskTimer(JNIEnv *env, jobject self, jlong playerId, jstring questName, jint taskId, jstring sourceName, jint timerLength); jintArray JNICALL questGetAllActiveQuestIds(JNIEnv *env, jobject self, jlong object); jintArray JNICALL questGetAllCompletedQuestIds(JNIEnv *env, jobject self, jlong object); bool JNICALL questIsQuestAbandonable(JNIEnv * env, jobject self, jint questCrc); bool JNICALL questIsQuestForceAccept(JNIEnv * env, jobject self, jint questCrc); bool JNICALL questDoesUseAcceptanceUI(JNIEnv * env, jobject self, jint questCrc); void JNICALL requestActivateQuest(JNIEnv * env, jobject self, jint questCrc, jlong playerId, jlong questGiver); void JNICALL requestCompleteQuest(JNIEnv * env, jobject self, jint questCrc, jlong playerId); void JNICALL showCyberneticsPage(JNIEnv *env, jobject self, jlong playerId, jlong npcId, jint openType); void JNICALL sendStaticItemDataToPlayer(JNIEnv *env, jobject self, jlong player, jobjectArray keys, jobjectArray values); void JNICALL showLootBox(JNIEnv *env, jobject self, jlong player, jlongArray newObjects); } using namespace ScriptMethodsQuestNamespace; //======================================================================== // install //======================================================================== bool ScriptMethodsQuestNamespace::install() { const JNINativeMethod NATIVES[] = { #define JF(a,b,c) {a,b,(void*)(ScriptMethodsQuestNamespace::c)} JF("questGetQuestId","(Ljava/lang/String;)I",questGetQuestId), JF("questGetQuestName", "(I)Ljava/lang/String;",questGetQuestName), JF("_questIsQuestComplete","(IJ)Z",questIsQuestComplete), JF("_questCanActivateQuest","(IJ)I",questCanActivateQuest), JF("_questIsQuestActive","(IJ)Z",questIsQuestActive), JF("_questActivateQuest","(IJJ)I",questActivateQuest), JF("_questCompleteQuest","(IJ)I",questCompleteQuest), JF("_questClearQuest","(IJ)V",questClearQuest), JF("_questIsTaskComplete","(IIJ)Z",questIsTaskComplete), JF("_questCanActivateTask","(IIJ)I",questCanActivateTask), JF("_questIsTaskActive","(IIJ)Z",questIsTaskActive), JF("_questActivateTask","(IIJ)I",questActivateTask), JF("_questCompleteTask","(IIJ)I",questCompleteTask), JF("_questFailTask", "(IIJ)I", questFailTask), JF("_questClearQuestTask","(IIJ)V",questClearQuestTask), JF("questSetDebugging", "(Z)V", questSetDebugging), JF("questGetDebugging", "()Z", questGetDebugging), JF("_questSetQuestTaskCounter", "(JLjava/lang/String;ILjava/lang/String;II)V", questSetQuestTaskCounter), JF("_questSetQuestTaskLocation", "(JLjava/lang/String;ILscript/location;)V", questSetQuestTaskLocation), JF("_questSetQuestTaskTimer", "(JLjava/lang/String;ILjava/lang/String;I)V", questSetQuestTaskTimer), JF("_questGetAllActiveQuestIds", "(J)[I", questGetAllActiveQuestIds), JF("_questGetAllCompletedQuestIds", "(J)[I", questGetAllCompletedQuestIds), JF("_questIsQuestAbandonable", "(I)Z", questIsQuestAbandonable), JF("_questIsQuestForceAccept", "(I)Z", questIsQuestForceAccept), JF("_questDoesUseAcceptanceUI", "(I)Z", questDoesUseAcceptanceUI), JF("_requestActivateQuest", "(IJJ)V", requestActivateQuest), JF("_requestCompleteQuest", "(IJ)V", requestCompleteQuest), JF("_showCyberneticsPage", "(JJI)V", showCyberneticsPage), JF("_sendStaticItemDataToPlayer", "(J[Ljava/lang/String;[Ljava/lang/String;)V", sendStaticItemDataToPlayer), JF("_showLootBox", "(J[J)V", showLootBox), }; return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0])); } // ====================================================================== // Quest functions jint JNICALL ScriptMethodsQuestNamespace::questGetQuestId(JNIEnv *, jobject, jstring questName) { JavaStringParam jquestName(questName); std::string questNameString; if (!JavaLibrary::convert(jquestName, questNameString)) return 0; Quest const * const quest = QuestManager::getQuest(questNameString); return quest ? static_cast(quest->getId()) : 0; } // --------------------------------------------------------------------- jstring JNICALL ScriptMethodsQuestNamespace::questGetQuestName(JNIEnv *, jobject, jint questId) { std::string const questName = QuestManager::getQuestName(static_cast(questId)); return JavaString(questName).getReturnValue(); } // --------------------------------------------------------------------- jboolean JNICALL ScriptMethodsQuestNamespace::questIsQuestComplete(JNIEnv *, jobject, jint questId, jlong playerId) { PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if (playerObject) return playerObject->questHasCompletedQuest(static_cast(questId)); else return JNI_FALSE; } // --------------------------------------------------------------------- jint JNICALL ScriptMethodsQuestNamespace::questCanActivateQuest(JNIEnv *, jobject, jint questId, jlong playerId) { PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if (playerObject) { PlayerObject::QuestResult result = playerObject->questCanActivateQuest(static_cast(questId)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId)); return static_cast(result); } else return static_cast(PlayerObject::QR_noSuchPlayer); } // --------------------------------------------------------------------- jboolean JNICALL ScriptMethodsQuestNamespace::questIsQuestActive(JNIEnv *, jobject, jint questId, jlong playerId) { PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if (playerObject) return playerObject->questHasActiveQuest(static_cast(questId)); else return false; } // --------------------------------------------------------------------- jint JNICALL ScriptMethodsQuestNamespace::questActivateQuest(JNIEnv *, jobject, jint questId, jlong playerId, jlong questGiver) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (!playerObject) return static_cast(PlayerObject::QR_noSuchPlayer); //send down the loot info Quest const * const q = QuestManager::getQuest(questId); if(q) { std::vector const & inclusiveStaticLootItems = q->getInclusiveStaticLootItemNames(); for(std::vector::const_iterator it = inclusiveStaticLootItems.begin(); it != inclusiveStaticLootItems.end(); ++it) { StaticLootItemManager::sendDataToClient(NetworkId(playerId), *it); } std::vector const & exclusiveStaticLootItems = q->getExclusiveStaticLootItemNames(); for(std::vector::const_iterator it2 = exclusiveStaticLootItems.begin(); it2 != exclusiveStaticLootItems.end(); ++it2) { StaticLootItemManager::sendDataToClient(NetworkId(playerId), *it2); } } PlayerObject::QuestResult result = playerObject->questActivateQuest(static_cast(questId), NetworkId(questGiver)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId)); return static_cast(result); } // --------------------------------------------------------------------- jint JNICALL ScriptMethodsQuestNamespace::questCompleteQuest(JNIEnv *, jobject, jint questId, jlong playerId) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (!playerObject) return static_cast(PlayerObject::QR_noSuchPlayer); PlayerObject::QuestResult result = playerObject->questCompleteQuest(static_cast(questId)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId)); return static_cast(result); } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::questClearQuest(JNIEnv *, jobject, jint questId, jlong playerId) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (playerObject) playerObject->questClearQuest(static_cast(questId)); } // ====================================================================== // Task Functions jboolean JNICALL ScriptMethodsQuestNamespace::questIsTaskComplete(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId) { if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return JNI_FALSE; } PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if (playerObject) return playerObject->questHasCompletedQuestTask(static_cast(questId), taskId); else return JNI_FALSE; } // --------------------------------------------------------------------- jint JNICALL ScriptMethodsQuestNamespace::questCanActivateTask(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId) { PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if (playerObject) { if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return PlayerObject::QR_noSuchTask; } PlayerObject::QuestResult result = playerObject->questCanActivateQuestTask(static_cast(questId), taskId); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchTask,("Requested quest %i task %i, which could not be found.", questId, taskId)); return static_cast(result); } else return static_cast(PlayerObject::QR_noSuchPlayer); } // --------------------------------------------------------------------- jboolean JNICALL ScriptMethodsQuestNamespace::questIsTaskActive(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId) { PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return JNI_FALSE; } if (playerObject) return playerObject->questHasActiveQuestTask(static_cast(questId), taskId); else return JNI_FALSE; } // --------------------------------------------------------------------- jint JNICALL ScriptMethodsQuestNamespace::questActivateTask(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (!playerObject) return static_cast(PlayerObject::QR_noSuchPlayer); if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return PlayerObject::QR_noSuchTask; } PlayerObject::QuestResult result = playerObject->questActivateQuestTask(static_cast(questId), taskId); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchTask,("Requested quest %i task %i, which could not be found.", questId, taskId)); return static_cast(result); } // --------------------------------------------------------------------- jint JNICALL ScriptMethodsQuestNamespace::questCompleteTask(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (!playerObject) return static_cast(PlayerObject::QR_noSuchPlayer); if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return PlayerObject::QR_noSuchTask; } PlayerObject::QuestResult result = playerObject->questCompleteQuestTask(static_cast(questId), taskId); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchTask,("Requested quest %i task %i, which could not be found.", questId, taskId)); return static_cast(result); } // --------------------------------------------------------------------- jint JNICALL ScriptMethodsQuestNamespace::questFailTask(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (!playerObject) return static_cast(PlayerObject::QR_noSuchPlayer); if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return PlayerObject::QR_noSuchTask; } PlayerObject::QuestResult result = playerObject->questFailQuestTask(static_cast(questId), taskId); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchTask,("Requested quest %i task %i, which could not be found.", questId, taskId)); return static_cast(result); } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::questClearQuestTask(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId) { if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return; } PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (playerObject) IGNORE_RETURN(playerObject->questClearQuestTask(static_cast(questId), taskId)); } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::questSetDebugging(JNIEnv *env, jobject self, jboolean debugging) { QuestManager::setDebugging(debugging); } // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsQuestNamespace::questGetDebugging(JNIEnv *env, jobject self) { return QuestManager::getDebugging(); } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::questSetQuestTaskCounter(JNIEnv *env, jobject self, jlong playerId, jstring questName, jint taskId, jstring sourceName, jint counter, jint counterMax) { if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return; } PlayerObject * const playerObject = getPlayerForCharacter(playerId); CreatureObject * const creatureObject = playerObject ? playerObject->getCreatureObject() : nullptr; Controller * const controller = creatureObject ? creatureObject->getController() : nullptr; if(!controller) return; JavaStringParam jquestNameName(questName); std::string questNameString; if (!JavaLibrary::convert(jquestNameName, questNameString)) return; JavaStringParam jsourceNameName(sourceName); std::string sourceNameString; if (!JavaLibrary::convert(jsourceNameName, sourceNameString)) return; MessageQueueQuestTaskCounterMessage * const msg = new MessageQueueQuestTaskCounterMessage(questNameString, taskId, Unicode::narrowToWide(sourceNameString), counter, counterMax); controller->appendMessage(static_cast(CM_questTaskCounterData), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::questSetQuestTaskLocation(JNIEnv *env, jobject self, jlong playerId, jstring questName, jint taskId, jobject taskLocation) { if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return; } PlayerObject * const playerObject = getPlayerForCharacter(playerId); CreatureObject * const creatureObject = playerObject ? playerObject->getCreatureObject() : nullptr; Controller * const controller = creatureObject ? creatureObject->getController() : nullptr; if(!controller) return; JavaStringParam jquestNameName(questName); std::string questNameString; if (!JavaLibrary::convert(jquestNameName, questNameString)) return; Location location; if(!ScriptConversion::convert(LocalRefParam(taskLocation), location)) return; MessageQueueQuestTaskLocationMessage * const msg = new MessageQueueQuestTaskLocationMessage(questNameString, taskId, location); controller->appendMessage(static_cast(CM_questTaskLocationData), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::questSetQuestTaskTimer(JNIEnv *env, jobject self, jlong playerId, jstring questName, jint taskId, jstring sourceName, jint finalPlayedTime) { if(!QuestManager::isValidTaskId(taskId)) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("TaskId %i, outside legal range.", taskId)); return; } PlayerObject * const playerObject = getPlayerForCharacter(playerId); CreatureObject * const creatureObject = playerObject ? playerObject->getCreatureObject() : nullptr; Controller * const controller = creatureObject ? creatureObject->getController() : nullptr; if(!controller) return; JavaStringParam jquestNameName(questName); std::string questNameString; if (!JavaLibrary::convert(jquestNameName, questNameString)) return; JavaStringParam jsourceNameName(sourceName); std::string sourceNameString; if (!JavaLibrary::convert(jsourceNameName, sourceNameString)) return; MessageQueueQuestTaskTimerMessage * const msg = new MessageQueueQuestTaskTimerMessage(questNameString, taskId, Unicode::narrowToWide(sourceNameString), finalPlayedTime); controller->appendMessage(static_cast(CM_questTaskTimerData), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::requestActivateQuest(JNIEnv * env, jobject self, jint questCrc, jlong playerId, jlong questGiver) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (playerObject) { if(playerObject->questHasActiveQuest(static_cast(questCrc))) { return; } CreatureObject * playerCreature = nullptr; if (JavaLibrary::getObject(playerId, playerCreature) && playerCreature) { Quest const * const q = QuestManager::getQuest(questCrc); if(q) { std::vector const & inclusiveStaticLootItems = q->getInclusiveStaticLootItemNames(); for(std::vector::const_iterator it = inclusiveStaticLootItems.begin(); it != inclusiveStaticLootItems.end(); ++it) { StaticLootItemManager::sendDataToClient(NetworkId(playerId), *it); } std::vector const & exclusiveStaticLootItems = q->getExclusiveStaticLootItemNames(); for(std::vector::const_iterator it2 = exclusiveStaticLootItems.begin(); it2 != exclusiveStaticLootItems.end(); ++it2) { StaticLootItemManager::sendDataToClient(NetworkId(playerId), *it2); } if(QuestManager::isQuestForceAccepted(q->getName().getString())) { PlayerObject::QuestResult result = playerObject->questActivateQuest(static_cast(questCrc), NetworkId(questGiver)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questCrc)); MessageQueueGenericValueType * const msg = new MessageQueueGenericValueType(static_cast(questCrc)); Controller * const controller = playerCreature->getController(); if(controller) { controller->appendMessage(static_cast(CM_forceActivateQuest), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } } //see if this quest needs to go through our acceptance/completion UI flow else if(QuestManager::isQuestAcceptable(q->getName().getString())) { Controller * const controller = playerCreature->getController(); if(controller) { if(QuestManager::getMaximumNumberOfQuestsPerPlayer() > -1) { if(playerObject->getNumberOfActiveQuests() >= QuestManager::getMaximumNumberOfQuestsPerPlayer()) { Chat::sendSystemMessage(*playerCreature, SharedStringIds::quest_journal_is_full, Unicode::emptyString); return; } } playerObject->setPendingRequestQuestInformation(questCrc, NetworkId(questGiver)); MessageQueueGenericValueType * const msg = new MessageQueueGenericValueType(static_cast(questCrc)); controller->appendMessage(static_cast(CM_requestActivateQuest), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } } else { PlayerObject::QuestResult result = playerObject->questActivateQuest(static_cast(questCrc), NetworkId(questGiver)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questCrc)); } } } } } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::requestCompleteQuest(JNIEnv * env, jobject self, jint questCrc, jlong playerId) { PlayerObject * const playerObject = getPlayerForCharacter(playerId); if (playerObject) { if(!playerObject->questHasActiveQuest(static_cast(questCrc))) { return; } CreatureObject * playerCreature = nullptr; if (JavaLibrary::getObject(playerId, playerCreature) && playerCreature) { Quest const * const q = QuestManager::getQuest(questCrc); if(q) { PlayerObject::QuestResult result = playerObject->questCompleteQuest(static_cast(questCrc)); JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questCrc)); } } } } // ---------------------------------------------------------------------- void JNICALL ScriptMethodsQuestNamespace::showCyberneticsPage(JNIEnv *env, jobject self, jlong playerId, jlong npcId, jint openType) { MessageQueueCyberneticsOpen::OpenType const type = static_cast(openType); CreatureObject * npc = nullptr; if (!JavaLibrary::getObject(npcId, npc)) return; if(!npc) return; CreatureObject * playerCreature = nullptr; if (JavaLibrary::getObject(playerId, playerCreature)) { Controller * const playerController = playerCreature->getController(); if(playerController) { MessageQueueCyberneticsOpen * msg = new MessageQueueCyberneticsOpen(type, npc->getNetworkId()); playerController->appendMessage(CM_cyberneticsOpen, 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } } } // ---------------------------------------------------------------------- jintArray JNICALL ScriptMethodsQuestNamespace::questGetAllActiveQuestIds(JNIEnv *env, jobject self, jlong playerId) { PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if (!playerObject) { LocalIntArrayRefPtr results = createNewIntArray(0); return results->getReturnValue(); } std::vector questIds = playerObject->questGetAllActiveQuestIds(); LocalIntArrayRefPtr results = createNewIntArray(static_cast(questIds.size())); setIntArrayRegion(*results, 0 , static_cast(questIds.size()), reinterpret_cast(&(questIds[0]))); return results->getReturnValue(); } // ---------------------------------------------------------------------- jintArray JNICALL ScriptMethodsQuestNamespace::questGetAllCompletedQuestIds(JNIEnv *env, jobject self, jlong playerId) { PlayerObject const * const playerObject = getPlayerForCharacter(playerId); if (!playerObject) { LocalIntArrayRefPtr results = createNewIntArray(0); return results->getReturnValue(); } std::vector questIds = playerObject->questGetAllCompletedQuestIds(); LocalIntArrayRefPtr results = createNewIntArray(static_cast(questIds.size())); setIntArrayRegion(*results, 0 , static_cast(questIds.size()), reinterpret_cast(&(questIds[0]))); return results->getReturnValue(); } // ---------------------------------------------------------------------- /** * Given a dictionary representing the static item data for loot item, pack it all into a single vector and send to the client. */ void JNICALL ScriptMethodsQuestNamespace::sendStaticItemDataToPlayer(JNIEnv *env, jobject self, jlong playerId, jobjectArray keys, jobjectArray values) { //turn the java objects into parallel vectors std::vector keyStrings; getStringArray(LocalObjectArrayRefParam(keys), keyStrings); std::vector valueStrings; getStringArray(LocalObjectArrayRefParam(values), valueStrings); //build a single dictionary to hold ALL the data. ALL keys, then ALL data. gcc can't handle it as a pair of vector, // it caused an deep in archive where it blows out the template instanctiation depth std::vector flattenedDictionary; flattenedDictionary.reserve(keyStrings.size() * 2); //put everything in it Unicode::String s; for(std::vector::const_iterator i = keyStrings.begin(); i != keyStrings.end(); ++i) { s = **i; flattenedDictionary.push_back(s); } for(std::vector::const_iterator i2 = valueStrings.begin(); i2 != valueStrings.end(); ++i2) { s = **i2; flattenedDictionary.push_back(s); } //send to player CreatureObject * playerCreature = nullptr; if (JavaLibrary::getObject(playerId, playerCreature)) { Controller * const playerController = playerCreature->getController(); if(playerController) { MessageQueueGenericValueType > * const msg = new MessageQueueGenericValueType >(flattenedDictionary); playerController->appendMessage(static_cast(CM_staticLootItemData), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } } } // ---------------------------------------------------------------------- /** * Given a player and a list of networkids, tell the client to show a UI listing these objects as newly earned */ void JNICALL ScriptMethodsQuestNamespace::showLootBox(JNIEnv *env, jobject self, jlong playerId, jlongArray newObjects) { std::vector objectIds; if (!ScriptConversion::convert(newObjects, objectIds)) return; //send to player CreatureObject * playerCreature = nullptr; if (JavaLibrary::getObject(playerId, playerCreature)) { Controller * const playerController = playerCreature->getController(); if(playerController) { MessageQueueGenericValueType > * const msg = new MessageQueueGenericValueType >(objectIds); playerController->appendMessage(static_cast(CM_showLootBox), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); } } } // ---------------------------------------------------------------------- bool JNICALL ScriptMethodsQuestNamespace::questIsQuestAbandonable(JNIEnv * , jobject , jint questCrc) { Quest const * const q = QuestManager::getQuest(questCrc); if(!q) return JNI_FALSE; return(QuestManager::isQuestAbandonable(q->getName().getString())) ? JNI_TRUE : JNI_FALSE; } // ---------------------------------------------------------------------- bool JNICALL ScriptMethodsQuestNamespace::questIsQuestForceAccept(JNIEnv * , jobject , jint questCrc) { Quest const * const q = QuestManager::getQuest(questCrc); if(!q) return JNI_FALSE; return(QuestManager::isQuestForceAccepted(q->getName().getString())) ? JNI_TRUE : JNI_FALSE; } // ---------------------------------------------------------------------- bool JNICALL ScriptMethodsQuestNamespace::questDoesUseAcceptanceUI(JNIEnv * , jobject , jint questCrc) { Quest const * const q = QuestManager::getQuest(questCrc); if(!q) return JNI_FALSE; return(QuestManager::isQuestAcceptable(q->getName().getString())) ? JNI_TRUE : JNI_FALSE; } // ======================================================================