Added serverScript library

This commit is contained in:
Anonymous
2014-01-15 08:16:35 -07:00
parent cd733bb815
commit 7d149b2784
108 changed files with 77617 additions and 1 deletions
@@ -0,0 +1,977 @@
// ======================================================================
//
// ScriptMethodsPlayerAccount.cpp
// copyright (c) 2001 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/Chat.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/MessageToQueue.h"
#include "serverGame/NameManager.h"
#include "serverGame/PlayerCreationManagerServer.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/ServerCreatureObjectTemplate.h"
#include "serverNetworkMessages/CentralGameServerMessages.h"
#include "serverNetworkMessages/RenameCharacterMessage.h"
#include "serverScript/ScriptParameters.h"
#include "sharedFoundation/ConstCharCrcLowerString.h"
#include "sharedLog/Log.h"
#include "sharedNetworkMessages/GenericValueTypeMessage.h"
#include "sharedNetworkMessages/NameErrors.h"
#include "serverNetworkMessages/TransferRequestMoveValidation.h"
#include "serverNetworkMessages/VerifyAndLockName.h"
#include "serverScript/GameScriptObject.h"
#include "sharedObject/ObjectTemplateList.h"
#include "sharedObject/SlotId.h"
#include "sharedObject/SlotIdManager.h"
#include "sharedObject/SlottedContainer.h"
#include "sharedUtility/DataTableManager.h"
#include "sharedUtility/DataTable.h"
#include "serverUtility/FreeCtsDataTable.h"
#include "UnicodeUtils.h"
#include <hash_set>
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsPlayerAccountNamespace
// ======================================================================
namespace ScriptMethodsPlayerAccountNamespace
{
bool install();
jlong JNICALL getPlayerObject(JNIEnv *env, jobject self, jlong creature);
jboolean JNICALL isIgnoring(JNIEnv *env, jobject self, jlong player, jstring who);
jboolean JNICALL adjustLotCount(JNIEnv *env, jobject self, jlong player, jint adjustment);
jint JNICALL getAccountNumLots(JNIEnv *env, jobject self, jlong player);
jint JNICALL getGameFeatureBits(JNIEnv *env, jobject self, jlong player);
jint JNICALL getSubscriptionFeatureBits(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL isUsingAdminLogin(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL isWarden(JNIEnv *env, jobject self, jlong player);
jobject JNICALL getAccountTimeData(JNIEnv * env, jobject self, jlong target);
jint JNICALL getPlayerLastLoginTime(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL isFreeTrialAccount(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL setCompletedTutorial(JNIEnv *env, jobject self, jlong player, jboolean value);
void JNICALL logActivity(JNIEnv *env, jobject self, jlong player, jint activityType);
jboolean JNICALL isAccountQualifiedForHousePackup(JNIEnv *env, jobject self, jlong target);
jobject JNICALL getCharacterCtsHistory(JNIEnv * env, jobject self, jlong player);
jobjectArray JNICALL getCharacterRetroactiveCtsObjvars(JNIEnv * env, jobject self, jlong player);
jobjectArray JNICALL qualifyForFreeCts(JNIEnv *env, jobject self, jlong player);
void JNICALL validateFreeCts(JNIEnv *env, jobject self, jlong player, jstring destinationGalaxy, jstring destinationCharacterName);
void JNICALL performFreeCts(JNIEnv *env, jobject self, jlong player, jstring destinationGalaxy, jstring destinationCharacterName);
void JNICALL validateCts(JNIEnv *env, jobject self, jlong player, jstring destinationGalaxy, jstring destinationCharacterName);
void JNICALL performCts(JNIEnv *env, jobject self, jlong player, jstring destinationGalaxy, jstring destinationCharacterName);
void JNICALL validateRenameCharacter(JNIEnv *env, jobject self, jlong player, jstring newName);
void JNICALL renameCharacterReleaseNameReservation(JNIEnv *env, jobject self, jlong player);
void JNICALL renameCharacter(JNIEnv *env, jobject self, jlong player, jstring newName);
jint JNICALL getPlayerStationId(JNIEnv *env, jobject self, jlong player);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsPlayerAccountNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsPlayerAccountNamespace::c)}
JF("_getPlayerObject", "(J)J", getPlayerObject),
JF("_isIgnoring", "(JLjava/lang/String;)Z", isIgnoring),
JF("_adjustLotCount", "(JI)Z", adjustLotCount),
JF("_getAccountNumLots", "(J)I", getAccountNumLots),
JF("_getGameFeatureBits", "(J)I", getGameFeatureBits),
JF("_getSubscriptionFeatureBits", "(J)I", getSubscriptionFeatureBits),
JF("_isUsingAdminLogin", "(J)Z", isUsingAdminLogin),
JF("_isWarden", "(J)Z", isWarden),
JF("_getAccountTimeData", "(J)Lscript/dictionary;", getAccountTimeData),
JF("_getPlayerLastLoginTime", "(J)I", getPlayerLastLoginTime),
JF("_isFreeTrialAccount", "(J)Z", isFreeTrialAccount),
JF("_setCompletedTutorial", "(JZ)Z", setCompletedTutorial),
JF("__logActivity", "(JI)V", logActivity),
JF("_isAccountQualifiedForHousePackup", "(J)Z", isAccountQualifiedForHousePackup),
JF("_getCharacterCtsHistory", "(J)Lscript/dictionary;", getCharacterCtsHistory),
JF("_getCharacterRetroactiveCtsObjvars", "(J)[Lscript/dictionary;", getCharacterRetroactiveCtsObjvars),
JF("_qualifyForFreeCts", "(J)[Ljava/lang/String;", qualifyForFreeCts),
JF("_validateFreeCts", "(JLjava/lang/String;Ljava/lang/String;)V", validateFreeCts),
JF("_performFreeCts", "(JLjava/lang/String;Ljava/lang/String;)V", performFreeCts),
JF("_validateCts", "(JLjava/lang/String;Ljava/lang/String;)V", validateCts),
JF("_performCts", "(JLjava/lang/String;Ljava/lang/String;)V", performCts),
JF("_validateRenameCharacter", "(JLjava/lang/String;)V", validateRenameCharacter),
JF("_renameCharacterReleaseNameReservation", "(J)V", renameCharacterReleaseNameReservation),
JF("_renameCharacter", "(JLjava/lang/String;)V", renameCharacter),
JF("_getPlayerStationId", "(J)I", getPlayerStationId),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
// Methods for dealing with PlayerObjects and (Station) account data
jlong JNICALL ScriptMethodsPlayerAccountNamespace::getPlayerObject(JNIEnv *env, jobject self, jlong creature)
{
UNREF(self);
NOT_NULL(env);
jlong objId = 0;
ServerObject * creatureServerObject = NULL;
if (JavaLibrary::getObject(creature,creatureServerObject))
{
SlotId slot = SlotIdManager::findSlotId(ConstCharCrcLowerString("ghost"));
if (slot != SlotId::invalid)
{
SlottedContainer const * const slots = ContainerInterface::getSlottedContainer(*creatureServerObject);
if (slots)
{
Container::ContainerErrorCode tmp = Container::CEC_Success;
CachedNetworkId playerObjectId = slots->getObjectInSlot(slot, tmp);
objId = playerObjectId.getValue();
}
}
}
return objId;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlayerAccountNamespace::isIgnoring(JNIEnv *env, jobject self, jlong player, jstring who)
{
PlayerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::isIgnoring: bad player object"));
return JNI_FALSE;
}
std::string whoStr;
if (!JavaLibrary::convert(JavaStringParam(who), whoStr))
{
DEBUG_WARNING(true, ("JavaLibrary::isIgnoring: bad who string"));
return JNI_FALSE;
}
if (playerObject->isIgnoring(whoStr))
return JNI_TRUE;
return JNI_FALSE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlayerAccountNamespace::adjustLotCount(JNIEnv *env, jobject self, jlong player, jint adjustment)
{
PlayerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::adjustLotCount: bad player object"));
return JNI_FALSE;
}
return playerObject->adjustLotCount(adjustment);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPlayerAccountNamespace::getAccountNumLots(JNIEnv *env, jobject self, jlong player)
{
PlayerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::getAccountNumLots: bad player object"));
return 0;
}
return playerObject->getAccountNumLots();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPlayerAccountNamespace::getGameFeatureBits(JNIEnv *env, jobject self, jlong player)
{
CreatureObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::getGameFeatureBits: bad player object"));
return 0;
}
if (!playerObject->getClient())
{
DEBUG_WARNING(true, ("JavaLibrary::getGameFeatureBits: player object had no client"));
return 0;
}
return playerObject->getClient()->getGameFeatures();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPlayerAccountNamespace::getSubscriptionFeatureBits(JNIEnv *env, jobject self, jlong player)
{
CreatureObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::GetSubscriptionFeatureBits: bad player object"));
return 0;
}
if (!playerObject->getClient())
{
DEBUG_WARNING(true, ("JavaLibrary::GetSubscriptionFeatureBits: player object had no client"));
return 0;
}
return playerObject->getClient()->getSubscriptionFeatures();
}
// ----------------------------------------------------------------------
/**
* Returns info on how long a player has been playing the game.
*
* @param env Java environment
* @param self class calling this function
* @param target the id of the player
*
* @return a dictionary with the player's account time info:
* "total_subscription_time" the total amount of time since the player first subscribed
* "total_entitled_time" the total amount of time the player has been billed
* "last_login_time" the amount of time passed since the player last logged in
* "entitled_login_time" the amount of billing time since the player last logged in
*/
jobject JNICALL ScriptMethodsPlayerAccountNamespace::getAccountTimeData(JNIEnv * env, jobject self, jlong target)
{
const CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return 0;
const PlayerObject * player = PlayerCreatureController::getPlayerObject(
creature);
if (player == NULL)
return 0;
const Client * client = creature->getClient();
if (client == NULL)
return 0;
// get the values that came from Platform
int total_time = static_cast<int>(client->getEntitlementTotalTime());
int entitled_time = static_cast<int>(client->getEntitlementEntitledTime());
int login_time = static_cast<int>(client->getEntitlementTotalTimeSinceLastLogin());
int entitled_login_time = static_cast<int>(client->getEntitlementEntitledTimeSinceLastLogin());
// override with any global configuration specified values
int temp = ConfigServerGame::getMinEntitledTime();
if ((temp >= 0) && (temp > entitled_time))
entitled_time = temp;
// override with any manually created test values on the creature
if (creature->getObjVars().getItem("_testVeteran.total_time", temp))
total_time = temp;
if (creature->getObjVars().getItem("_testVeteran.entitled_time", temp))
entitled_time = temp;
if (creature->getObjVars().getItem("_testVeteran.login_time", temp))
login_time = temp;
if (creature->getObjVars().getItem("_testVeteran.entitled_login_time", temp))
entitled_login_time = temp;
// don't return any information if all the values are 0 because it
// indicates that Platform does not have the information available
// at this time; we'll try again the next time the player logs in.
if ((total_time == 0) && (entitled_time == 0) && (login_time == 0) && (entitled_login_time == 0))
return 0;
LocalRefPtr dictionary = createNewObject(JavaLibrary::getClsDictionary(), JavaLibrary::getMidDictionary());
if (dictionary != LocalRef::cms_nullPtr)
{
callObjectMethod(*dictionary, JavaLibrary::getMidDictionaryPutInt(), JavaString("total_subscription_time").getValue(), total_time);
callObjectMethod(*dictionary, JavaLibrary::getMidDictionaryPutInt(), JavaString("total_entitled_time").getValue(), entitled_time);
callObjectMethod(*dictionary, JavaLibrary::getMidDictionaryPutInt(), JavaString("last_login_time").getValue(), login_time);
callObjectMethod(*dictionary, JavaLibrary::getMidDictionaryPutInt(), JavaString("entitled_login_time").getValue(), entitled_login_time);
if (env->ExceptionCheck())
{
env->ExceptionDescribe();
return 0;
}
}
return dictionary->getReturnValue();
} // JavaLibrary::getAccountTimeData
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPlayerAccountNamespace::getPlayerLastLoginTime(JNIEnv *env, jobject self, jlong player)
{
NetworkId playerId(player);
return NameManager::getInstance().getPlayerLastLoginTime(playerId);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlayerAccountNamespace::isUsingAdminLogin(JNIEnv *env, jobject self, jlong player)
{
CreatureObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::isUsingAdminLogin: bad player object"));
return false;
}
if (!playerObject->getClient())
{
DEBUG_WARNING(true, ("JavaLibrary::isUsingAdminLogin: player object had no client"));
return false;
}
return playerObject->getClient()->isUsingAdminLogin();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlayerAccountNamespace::isWarden(JNIEnv *env, jobject self, jlong player)
{
CreatureObject *creatureObject = 0;
if (!JavaLibrary::getObject(player, creatureObject))
{
DEBUG_WARNING(true, ("JavaLibrary::isWarden: bad creature object"));
return false;
}
PlayerObject *playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::isWarden: creature object had no player object"));
return false;
}
return playerObject->isWarden();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlayerAccountNamespace::isFreeTrialAccount(JNIEnv *env, jobject self, jlong player)
{
CreatureObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::isFreeTrialAccount: bad player object"));
return false;
}
if (!playerObject->getClient())
{
DEBUG_WARNING(true, ("JavaLibrary::isFreeTrialAccount: player object had no client"));
return false;
}
return playerObject->getClient()->isFreeTrialAccount();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlayerAccountNamespace::setCompletedTutorial(JNIEnv *env, jobject self, jlong player, jboolean value)
{
CreatureObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::setCompletedTutorial: bad player object"));
return false;
}
if (!playerObject->getClient())
{
DEBUG_WARNING(true, ("JavaLibrary::setCompletedTutorial: player object had no client"));
return false;
}
if (playerObject->getClient()->isFreeTrialAccount())
{
DEBUG_WARNING(true, ("JavaLibrary::setCompletedTutorial: client is from a free trial and CANNOT have completed tutorial bit set"));
return false;
}
const unsigned int stationId = playerObject->getClient()->getStationId();
LOG("CustomerService", ("Setting tutorial bit to %s for stationId %i\n", (value) ? "true" : "false", stationId));
GenericValueTypeMessage< std::pair<unsigned int, bool> > const updateTutorial("LoginToggleCompletedTutorial", std::pair<unsigned int, bool>(stationId, value));
GameServer::getInstance().sendToCentralServer(updateTutorial);
return true;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPlayerAccountNamespace::logActivity(JNIEnv *env, jobject self, jlong player, jint activityType)
{
UNREF(self);
CreatureObject * creatureObject = 0;
if (!JavaLibrary::getObject(player, creatureObject))
return;
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (playerObject)
playerObject->addSessionActivity(static_cast<uint32>(activityType));
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlayerAccountNamespace::isAccountQualifiedForHousePackup(JNIEnv *env, jobject self, jlong target)
{
UNREF(self);
NOT_NULL(env);
static std::hash_set<StationId> accountsQualifiedForHousePackup;
if (accountsQualifiedForHousePackup.empty())
{
DataTable * table = DataTableManager::getTable(ConfigServerGame::getHousePackupAccountListDataTableName(), true);
if (table)
{
int const columnId = table->findColumnNumber("stationId");
if (columnId >= 0)
{
int const numRows = table->getNumRows();
for (int i = 0; i < numRows; ++i)
{
IGNORE_RETURN(accountsQualifiedForHousePackup.insert(static_cast<StationId>(table->getIntValue(columnId, i))));
}
}
DataTableManager::close(ConfigServerGame::getHousePackupAccountListDataTableName());
}
}
return (accountsQualifiedForHousePackup.count(static_cast<StationId>(NameManager::getInstance().getPlayerStationId(NetworkId(static_cast<NetworkId::NetworkIdType>(target))))) >= 1);
}
/**
* Gets the CTS history of the specified character
*
* @returns a dictionary that contains the following data in paralled arrays
* with the oldest CTS transaction first and the newest CTS transaction last
*
* @returns null if the character doesn't have any CTS history
*
* string[] character_name full name of the source character
* string[] cluster_name name of the source cluster
* int[] transfer_time calendar time of the transfer
*/
jobject JNICALL ScriptMethodsPlayerAccountNamespace::getCharacterCtsHistory(JNIEnv * env, jobject self, jlong player)
{
CreatureObject const * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
{
DEBUG_WARNING(true, ("JavaLibrary::getCharacterCtsHistory: bad player object"));
return 0;
}
if (!playerObject->getObjVars().hasItem("ctsHistory"))
return 0;
// we need to return the CTS history ordered by transfer time
std::multimap<int, std::pair<const Unicode::String *, const Unicode::String *> > orderedCtsHistory;
DynamicVariableList::NestedList const ctsTransactions(playerObject->getObjVars(), "ctsHistory");
for (DynamicVariableList::NestedList::const_iterator i = ctsTransactions.begin(); i != ctsTransactions.end(); ++i)
{
Unicode::String ctsTransactionDetail;
if (i.getValue(ctsTransactionDetail))
{
Unicode::UnicodeStringVector tokens;
if (Unicode::tokenize(ctsTransactionDetail, tokens, NULL, NULL) && (tokens.size() >= 4))
{
Unicode::String * characterName = new Unicode::String();
for (size_t i = 3, j = tokens.size(); i < j; ++i)
{
if (!characterName->empty())
*characterName += Unicode::narrowToWide(" ");
*characterName += tokens[i];
}
IGNORE_RETURN(orderedCtsHistory.insert(std::make_pair(atoi(Unicode::wideToNarrow(tokens[0]).c_str()), std::make_pair(characterName, new Unicode::String(tokens[1])))));
}
}
}
if (orderedCtsHistory.empty())
return 0;
std::vector<const Unicode::String *> * sourceCharacterName = new std::vector<const Unicode::String *>;
std::vector<const Unicode::String *> * sourceClusterName = new std::vector<const Unicode::String *>;
std::vector<int> * transferTime = new std::vector<int>;
for (std::multimap<int, std::pair<const Unicode::String *, const Unicode::String *> >::const_iterator iter = orderedCtsHistory.begin(); iter != orderedCtsHistory.end(); ++iter)
{
transferTime->push_back(iter->first);
sourceCharacterName->push_back(iter->second.first);
sourceClusterName->push_back(iter->second.second);
}
ScriptParams params;
params.addParam(*sourceCharacterName, "character_name", true);
params.addParam(*sourceClusterName, "cluster_name", true);
params.addParam(*transferTime, "transfer_time", true);
JavaDictionaryPtr dictionary;
JavaLibrary::instance()->convert(params, dictionary);
return dictionary->getReturnValue();
} // JavaLibrary::requestJedi
/**
* Gets the retroactive CTS objvars history of the specified character
*
* @returns an array of dictionaries each of which contains the retroactive CTS objvars
* for the particular CTS source character that this character at one time transferred from
* with the oldest CTS transaction first and the newest CTS transaction last
*
* @returns null if the character doesn't have any retroactive CTS objvars history
*/
jobjectArray JNICALL ScriptMethodsPlayerAccountNamespace::getCharacterRetroactiveCtsObjvars(JNIEnv * env, jobject self, jlong player)
{
std::vector<std::vector<std::pair<std::string, DynamicVariable> > const *> const & characterRetroactiveCtsObjvars = GameServer::getRetroactiveCtsHistoryObjvars(NetworkId(static_cast<NetworkId::NetworkIdType>(player)));
if (characterRetroactiveCtsObjvars.empty())
return NULL;
LocalObjectArrayRefPtr results = createNewObjectArray(characterRetroactiveCtsObjvars.size(), JavaLibrary::getClsDictionary());
for (size_t i = 0, size = characterRetroactiveCtsObjvars.size(); i < size; ++i)
{
bool addedAnything = false;
ScriptParams params;
if (characterRetroactiveCtsObjvars[i] && !characterRetroactiveCtsObjvars[i]->empty())
{
for (std::vector<std::pair<std::string, DynamicVariable> >::const_iterator iterObjvar = characterRetroactiveCtsObjvars[i]->begin(); iterObjvar != characterRetroactiveCtsObjvars[i]->end(); ++iterObjvar)
{
// can only handle INT (type 0) and INT_ARRAY (type 1) objvar type at this time
if (iterObjvar->second.getType() == DynamicVariable::INT)
{
int iValue;
iterObjvar->second.get(iValue);
params.addParam(iValue, iterObjvar->first);
addedAnything = true;
}
else if (iterObjvar->second.getType() == DynamicVariable::INT_ARRAY)
{
// iaValue will be owned and deleted by params
std::vector<int> * iaValue = new std::vector<int>();
iterObjvar->second.get(*iaValue);
params.addParam(*iaValue, iterObjvar->first, true);
addedAnything = true;
}
}
}
if (!addedAnything)
{
setObjectArrayElement(*results, i, *JavaDictionary::cms_nullPtr);
}
else
{
JavaDictionaryPtr dictionary;
JavaLibrary::instance()->convert(params, dictionary);
setObjectArrayElement(*results, i, *dictionary);
}
}
return results->getReturnValue();
}
/**
* Checks to see if the specified character qualifies for free CTS
*
* @returns an array of strings containing the galaxies to which this character can transfer for free
*/
jobjectArray JNICALL ScriptMethodsPlayerAccountNamespace::qualifyForFreeCts(JNIEnv * /*env*/, jobject /*self*/, jlong player)
{
time_t const characterCreateTime = static_cast<time_t>(NameManager::getInstance().getPlayerCreateTime(NetworkId(player)));
FreeCtsDataTable::FreeCtsInfo const * freeCtsInfo = FreeCtsDataTable::getFreeCtsInfoForCharacter(characterCreateTime, GameServer::getInstance().getClusterName(), false);
// see if we can/should bypass the free CTS time restriction
if (!freeCtsInfo && ConfigServerGame::getAllowIgnoreFreeCtsTimeRestriction())
{
CreatureObject const * playerObject = NULL;
if (JavaLibrary::getObject(player, playerObject) && playerObject && playerObject->getClient() && playerObject->getClient()->isGod())
{
freeCtsInfo = FreeCtsDataTable::getFreeCtsInfoForCharacter(characterCreateTime, GameServer::getInstance().getClusterName(), true);
if (freeCtsInfo)
{
Chat::sendSystemMessage(*playerObject, Unicode::narrowToWide("Bypassing free CTS time restriction for GOD MODE!!!"), Unicode::emptyString);
}
}
}
if (!freeCtsInfo || freeCtsInfo->targetCluster.empty())
return NULL;
LocalObjectArrayRefPtr valueArray = createNewObjectArray(freeCtsInfo->targetCluster.size(), JavaLibrary::getClsString());
int i = 0;
for (std::map<std::string, std::string>::const_iterator iter = freeCtsInfo->targetCluster.begin(); iter != freeCtsInfo->targetCluster.end(); ++iter)
{
JavaString jval(iter->second);
setObjectArrayElement(*valueArray, i++, jval);
}
return valueArray->getReturnValue();
}
/**
* Validate the free CTS information and messageTo back to the object to indicate status of the validation
*/
void JNICALL ScriptMethodsPlayerAccountNamespace::validateFreeCts(JNIEnv * /*env*/, jobject /*self*/, jlong player, jstring destinationGalaxy, jstring destinationCharacterName)
{
CreatureObject const * creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject) || !creatureObject)
{
DEBUG_WARNING(true, ("JavaLibrary::validateFreeCts: bad CreatureObject"));
return;
}
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::validateFreeCts: bad PlayerObject"));
return;
}
std::string destinationGalaxyString;
JavaStringParam temp1(destinationGalaxy);
if (!JavaLibrary::convert(temp1, destinationGalaxyString))
{
DEBUG_WARNING(true, ("JavaLibrary::validateFreeCts: bad destinationGalaxy"));
return;
}
std::string destinationCharacterNameString;
JavaStringParam temp2(destinationCharacterName);
if (!JavaLibrary::convert(temp2, destinationCharacterNameString))
{
DEBUG_WARNING(true, ("JavaLibrary::validateFreeCts: bad destinationCharacterName"));
return;
}
TransferRequestMoveValidation const trmv(TransferRequestMoveValidation::TRS_ingame_freects_command_validate, GameServer::getInstance().getProcessId(), playerObject->getStationId(), playerObject->getStationId(), GameServer::getInstance().getClusterName(), destinationGalaxyString, Unicode::wideToNarrow(creatureObject->getAssignedObjectName()), creatureObject->getNetworkId(), creatureObject->getTemplateCrc(), destinationCharacterNameString, std::string("en"));
GameServer::getInstance().sendToCentralServer(trmv);
}
/**
* Validate the free CTS information and initiate the transfer process if the validation passes, or
* messageTo back to the object to indicate status of the validation if the validation fails
*/
void JNICALL ScriptMethodsPlayerAccountNamespace::performFreeCts(JNIEnv * /*env*/, jobject /*self*/, jlong player, jstring destinationGalaxy, jstring destinationCharacterName)
{
CreatureObject const * creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject) || !creatureObject)
{
DEBUG_WARNING(true, ("JavaLibrary::performFreeCts: bad CreatureObject"));
return;
}
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::performFreeCts: bad PlayerObject"));
return;
}
std::string destinationGalaxyString;
JavaStringParam temp1(destinationGalaxy);
if (!JavaLibrary::convert(temp1, destinationGalaxyString))
{
DEBUG_WARNING(true, ("JavaLibrary::performFreeCts: bad destinationGalaxy"));
return;
}
std::string destinationCharacterNameString;
JavaStringParam temp2(destinationCharacterName);
if (!JavaLibrary::convert(temp2, destinationCharacterNameString))
{
DEBUG_WARNING(true, ("JavaLibrary::performFreeCts: bad destinationCharacterName"));
return;
}
TransferRequestMoveValidation const trmv(TransferRequestMoveValidation::TRS_ingame_freects_command_transfer, GameServer::getInstance().getProcessId(), playerObject->getStationId(), playerObject->getStationId(), GameServer::getInstance().getClusterName(), destinationGalaxyString, Unicode::wideToNarrow(creatureObject->getAssignedObjectName()), creatureObject->getNetworkId(), creatureObject->getTemplateCrc(), destinationCharacterNameString, std::string("en"));
GameServer::getInstance().sendToCentralServer(trmv);
}
/**
* Validate the CTS information and messageTo back to the object to indicate status of the validation
*/
void JNICALL ScriptMethodsPlayerAccountNamespace::validateCts(JNIEnv * /*env*/, jobject /*self*/, jlong player, jstring destinationGalaxy, jstring destinationCharacterName)
{
CreatureObject const * creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject) || !creatureObject)
{
DEBUG_WARNING(true, ("JavaLibrary::validateCts: bad CreatureObject"));
return;
}
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::validateCts: bad PlayerObject"));
return;
}
std::string destinationGalaxyString;
JavaStringParam temp1(destinationGalaxy);
if (!JavaLibrary::convert(temp1, destinationGalaxyString))
{
DEBUG_WARNING(true, ("JavaLibrary::validateCts: bad destinationGalaxy"));
return;
}
std::string destinationCharacterNameString;
JavaStringParam temp2(destinationCharacterName);
if (!JavaLibrary::convert(temp2, destinationCharacterNameString))
{
DEBUG_WARNING(true, ("JavaLibrary::validateCts: bad destinationCharacterName"));
return;
}
TransferRequestMoveValidation const trmv(TransferRequestMoveValidation::TRS_ingame_cts_command_validate, GameServer::getInstance().getProcessId(), playerObject->getStationId(), playerObject->getStationId(), GameServer::getInstance().getClusterName(), destinationGalaxyString, Unicode::wideToNarrow(creatureObject->getAssignedObjectName()), creatureObject->getNetworkId(), creatureObject->getTemplateCrc(), destinationCharacterNameString, std::string("en"));
GameServer::getInstance().sendToCentralServer(trmv);
}
/**
* Validate the CTS information and initiate the transfer process if the validation passes, or
* messageTo back to the object to indicate status of the validation if the validation fails
*/
void JNICALL ScriptMethodsPlayerAccountNamespace::performCts(JNIEnv * /*env*/, jobject /*self*/, jlong player, jstring destinationGalaxy, jstring destinationCharacterName)
{
CreatureObject const * creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject) || !creatureObject)
{
DEBUG_WARNING(true, ("JavaLibrary::performCts: bad CreatureObject"));
return;
}
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::performCts: bad PlayerObject"));
return;
}
std::string destinationGalaxyString;
JavaStringParam temp1(destinationGalaxy);
if (!JavaLibrary::convert(temp1, destinationGalaxyString))
{
DEBUG_WARNING(true, ("JavaLibrary::performCts: bad destinationGalaxy"));
return;
}
std::string destinationCharacterNameString;
JavaStringParam temp2(destinationCharacterName);
if (!JavaLibrary::convert(temp2, destinationCharacterNameString))
{
DEBUG_WARNING(true, ("JavaLibrary::performCts: bad destinationCharacterName"));
return;
}
TransferRequestMoveValidation const trmv(TransferRequestMoveValidation::TRS_ingame_cts_command_transfer, GameServer::getInstance().getProcessId(), playerObject->getStationId(), playerObject->getStationId(), GameServer::getInstance().getClusterName(), destinationGalaxyString, Unicode::wideToNarrow(creatureObject->getAssignedObjectName()), creatureObject->getNetworkId(), creatureObject->getTemplateCrc(), destinationCharacterNameString, std::string("en"));
GameServer::getInstance().sendToCentralServer(trmv);
}
/**
* Validate the new character name for the rename operation and messageTo back to the object to indicate status of the validation
*/
void JNICALL ScriptMethodsPlayerAccountNamespace::validateRenameCharacter(JNIEnv *env, jobject self, jlong player, jstring newName)
{
CreatureObject const * creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject) || !creatureObject)
{
DEBUG_WARNING(true, ("JavaLibrary::validateRenameCharacter: bad CreatureObject"));
return;
}
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::validateRenameCharacter: bad PlayerObject"));
return;
}
Unicode::String newNameString;
JavaStringParam temp(newName);
if (!JavaLibrary::convert(temp, newNameString))
{
DEBUG_WARNING(true, ("JavaLibrary::validateRenameCharacter: bad newName"));
return;
}
// if this is a last name change only, to validate that the last name is valid,
// generate a random unique first name, and validate that with the new last name
bool lastNameChangeOnly = false;
static Unicode::String const delimiters(Unicode::narrowToWide(" "));
Unicode::UnicodeStringVector newNameTokens;
if (!Unicode::tokenize(newNameString, newNameTokens, &delimiters, NULL))
newNameTokens.clear();
size_t const newNameTokensCount = newNameTokens.size();
if ((newNameTokensCount == 1) || (newNameTokensCount == 2))
{
if (Unicode::caseInsensitiveCompare(creatureObject->getAssignedObjectFirstName(), newNameTokens[0]))
{
lastNameChangeOnly = true;
// no last name specified, so validation passes
if (newNameTokensCount == 1)
{
MessageToQueue::getInstance().sendMessageToJava(creatureObject->getNetworkId(), "renameCharacterNameValidationSuccess", std::vector<int8>(), 0, false);
return;
}
else
{
const ObjectTemplate * const objectTemplate = ObjectTemplateList::fetch(creatureObject->getObjectTemplateName());
if (objectTemplate)
{
const ServerCreatureObjectTemplate * const creatureTemplate = dynamic_cast<const ServerCreatureObjectTemplate *>(objectTemplate);
if (creatureTemplate)
{
Unicode::String const uniqueRandomName = NameManager::getInstance().generateUniqueRandomName(ConfigServerGame::getCharacterNameGeneratorDirectory(), creatureTemplate->getNameGeneratorType());
Unicode::UnicodeStringVector uniqueRandomNameTokens;
if (!Unicode::tokenize(uniqueRandomName, uniqueRandomNameTokens, &delimiters, NULL))
uniqueRandomNameTokens.clear();
newNameString = ((uniqueRandomNameTokens.size() >= 1) ? uniqueRandomNameTokens[0] : delimiters) + delimiters + newNameTokens[1];
}
}
}
}
}
else
{
ScriptParams params;
params.addParam("@ui:name_declined_racially_inappropriate", "reason");
ScriptDictionaryPtr dictionary;
GameScriptObject::makeScriptDictionary(params, dictionary);
if (dictionary.get() != NULL)
{
dictionary->serialize();
MessageToQueue::getInstance().sendMessageToJava(creatureObject->getNetworkId(), "renameCharacterNameValidationFail", dictionary->getSerializedData(), 0, false);
}
return;
}
VerifyAndLockNameRequest const verifyRequest(playerObject->getStationId(), creatureObject->getNetworkId(), creatureObject->getObjectTemplateName(), newNameString, 0xFFFFFFFF);
StringId const verifyResult = GameServer::getInstance().handleVerifyAndLockNameRequest(verifyRequest, false, !lastNameChangeOnly);
if (verifyResult != NameErrors::nameApproved)
{
std::string const errorText(std::string("@") + verifyResult.getCanonicalRepresentation());
ScriptParams params;
params.addParam(errorText.c_str(), "reason");
ScriptDictionaryPtr dictionary;
GameScriptObject::makeScriptDictionary(params, dictionary);
if (dictionary.get() != NULL)
{
dictionary->serialize();
MessageToQueue::getInstance().sendMessageToJava(creatureObject->getNetworkId(), "renameCharacterNameValidationFail", dictionary->getSerializedData(), 0, false);
}
}
else if (lastNameChangeOnly)
{
// last name passes validation
MessageToQueue::getInstance().sendMessageToJava(creatureObject->getNetworkId(), "renameCharacterNameValidationSuccess", std::vector<int8>(), 0, false);
}
else
{
// nothing to do here, as it means the request has been forwarded
// to the DB server for additional verification, so when that
// verification is complete, we'll send the response from there
}
}
/**
* Release the character name that had been reserved for renaming the specified character; the character
* name is reserved during the character rename process, even if the name doesn't end up being used,
* so we want to return the name back to the pool; just make sure you don't call this function during
* the character rename process, or before the character rename process has completed
*/
void JNICALL ScriptMethodsPlayerAccountNamespace::renameCharacterReleaseNameReservation(JNIEnv *env, jobject self, jlong player)
{
CreatureObject const * creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject) || !creatureObject)
{
DEBUG_WARNING(true, ("JavaLibrary::renameCharacterReleaseNameReservation: bad CreatureObject"));
return;
}
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::renameCharacterReleaseNameReservation: bad PlayerObject"));
return;
}
ReleaseNameMessage const rnm(playerObject->getStationId(), creatureObject->getNetworkId());
GameServer::getInstance().sendToDatabaseServer(rnm);
}
/**
* submit request to rename character; the name is assumed to have already been validated with validateRenameCharacter()
*/
void JNICALL ScriptMethodsPlayerAccountNamespace::renameCharacter(JNIEnv *env, jobject self, jlong player, jstring newName)
{
CreatureObject const * creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject) || !creatureObject)
{
DEBUG_WARNING(true, ("JavaLibrary::renameCharacter: bad CreatureObject"));
return;
}
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
if (!playerObject)
{
DEBUG_WARNING(true, ("JavaLibrary::renameCharacter: bad PlayerObject"));
return;
}
Unicode::String newNameString;
JavaStringParam temp(newName);
if (!JavaLibrary::convert(temp, newNameString))
{
DEBUG_WARNING(true, ("JavaLibrary::renameCharacter: bad newName"));
return;
}
PlayerCreationManagerServer::renamePlayer(static_cast<int8>(RenameCharacterMessageEx::RCMS_player_request), playerObject->getStationId(), creatureObject->getNetworkId(), newNameString, creatureObject->getAssignedObjectName(), NetworkId::cms_invalid);
}
// ----------------------------------------------------------------------
/**
* Get the station id of the player.
*
* @param env Java environment
* @param self class calling this function
* @param player the id of the player
*
* @return the station id of the player
*/
jint JNICALL ScriptMethodsPlayerAccountNamespace::getPlayerStationId(JNIEnv *env, jobject self, jlong player)
{
UNREF(self);
NOT_NULL(env);
return NameManager::getInstance().getPlayerStationId(NetworkId(static_cast<NetworkId::NetworkIdType>(player)));
}
// ======================================================================