Files
src-1.2/engine/server/library/serverScript/src/shared/ScriptMethodsSystem.cpp
T
2014-01-15 08:16:35 -07:00

239 lines
7.8 KiB
C++

// ScriptMethodsSystem.cpp - implements script methods that are stubs needing real implementation
//
// copyright 2002 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/BuildingObject.h"
#include "serverGame/Client.h"
#include "serverGame/ServerObject.h"
#include "sharedFoundation/ConfigFile.h"
#include "sharedNetworkMessages/ConsoleChannelMessages.h"
#include "sharedNetworkMessages/GenericValueTypeMessage.h"
#include "sharedNetworkMessages/PlayCutSceneMessage.h"
// ======================================================================
// ScriptMethodsSystemNamespace
// ======================================================================
namespace ScriptMethodsSystemNamespace
{
bool install();
jboolean JNICALL sendConsoleCommand(JNIEnv * env, jobject self, jstring command, jlong target);
jstring JNICALL getConfigSetting(JNIEnv * env, jobject self, jstring section, jstring key);
jboolean JNICALL fixHouseItemLimit(JNIEnv * env, jobject self, jlong target);
void JNICALL saveTextOnClient(JNIEnv * env, jobject self, jlong jclient, jstring jfilename, jstring jfiletext);
void JNICALL saveBytesOnClient(JNIEnv * env, jobject self, jlong jclient, jstring jfilename, jbyteArray bytes);
void JNICALL launchClientWebBrowser(JNIEnv *env, jobject self, jlong player, jstring url);
void JNICALL playCutScene(JNIEnv * env, jobject self, jlong jclient, jstring jfilename);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsSystemNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsSystemNamespace::c)}
JF("_sendConsoleCommand", "(Ljava/lang/String;J)Z", sendConsoleCommand),
JF("getConfigSetting", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", getConfigSetting),
JF("_fixHouseItemLimit", "(J)Z", fixHouseItemLimit),
JF("_saveTextOnClient", "(JLjava/lang/String;Ljava/lang/String;)V", saveTextOnClient),
JF("_saveBytesOnClient", "(JLjava/lang/String;[B)V", saveBytesOnClient),
JF("_launchClientWebBrowser", "(JLjava/lang/String;)V", launchClientWebBrowser),
JF("_playCutScene", "(JLjava/lang/String;)V", playCutScene),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsSystemNamespace::sendConsoleCommand(JNIEnv * env, jobject self, jstring command, jlong target)
{
JavaStringParam localCommand(command);
ServerObject* object = NULL;
if (!JavaLibrary::getObject(target, object))
return JNI_FALSE;
Client* client = object->getClient();
if (!client)
return JNI_FALSE;
std::string commandName;
JavaLibrary::convert(localCommand, commandName);
ExecuteConsoleCommand msg(commandName);
client->send(msg,true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
/**
* Returns the value of a config file key.
*
* @param env Java environment
* @param self class calling this function
* @param section the config file section
* @param key the config file key
*
* @return the key value, or null if the key doesn't exist
*/
jstring JNICALL ScriptMethodsSystemNamespace::getConfigSetting(JNIEnv * env, jobject self,
jstring section, jstring key)
{
UNREF(self);
if (section == 0 || key == 0)
return 0;
JavaStringParam jsection(section);
JavaStringParam jkey(key);
std::string sectionName;
if (!JavaLibrary::convert(jsection, sectionName))
return 0;
std::string keyName;
if (!JavaLibrary::convert(jkey, keyName))
return 0;
const ConfigFile::Section * sec = ConfigFile::getSection(sectionName.c_str());
if (sec == NULL)
return 0;
const ConfigFile::Key * ky = sec->findKey(keyName.c_str());
if (ky == NULL)
return NULL;
JavaString jvalue(ky->getAsString(ky->getCount()-1, ""));
return jvalue.getReturnValue();
} // JavaLibrary::getConfigSetting
// ----------------------------------------------------------------------
/**
* Utility function to fix a bug with houses.
*
* @param env Java environment
* @param self class calling this function
* @param target the house to fix
*
* @return true on success, false if target isn't a building
*/
jboolean JNICALL ScriptMethodsSystemNamespace::fixHouseItemLimit(JNIEnv * env, jobject self, jlong target)
{
UNREF(self);
TangibleObject *pob = 0;
if (!JavaLibrary::getObject(target, pob) || !pob->getPortalProperty())
return JNI_FALSE;
pob->fixUpPobItemLimit();
return JNI_TRUE;
} // JavaLibrary::fixHouseItemLimit
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsSystemNamespace::saveTextOnClient(JNIEnv *, jobject, jlong jclient, jstring jfilename, jstring jfiletext)
{
ServerObject *obj = 0;
if (JavaLibrary::getObject(jclient, obj))
{
Client * const client = obj->getClient();
if (client && client->isGod())
{
JavaStringParam filenameParam(jfilename);
JavaStringParam filetextParam(jfiletext);
std::string filename, filetext;
if (JavaLibrary::convert(filenameParam, filename) && JavaLibrary::convert(filetextParam, filetext))
{
GenericValueTypeMessage<std::pair<std::string, std::string> > const msg("SaveTextOnClient", std::make_pair(filename, filetext));
client->send(msg, true);
}
}
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsSystemNamespace::saveBytesOnClient(JNIEnv *, jobject, jlong jclient, jstring jfilename, jbyteArray bytes)
{
ServerObject *obj = 0;
if (JavaLibrary::getObject(jclient, obj))
{
Client * const client = obj->getClient();
if (client && client->isGod())
{
JavaStringParam filenameParam(jfilename);
std::string filename;
if (JavaLibrary::convert(filenameParam, filename))
{
if (bytes != 0)
{
std::vector<int8> bytesStr;
if (ScriptConversion::convert(bytes, bytesStr))
{
GenericValueTypeMessage<std::pair<std::string, std::string> > const msg("SaveTextOnClient", std::make_pair(filename, std::string(bytesStr.begin(), bytesStr.end())));
client->send(msg, true);
}
}
}
}
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsSystemNamespace::launchClientWebBrowser(JNIEnv *env, jobject self, jlong player, jstring url)
{
ServerObject const * obj = 0;
if (JavaLibrary::getObject(player, obj))
{
Client const * const client = obj->getClient();
if (client)
{
JavaStringParam urlParam(url);
std::string urlString;
if (JavaLibrary::convert(urlParam, urlString))
client->launchWebBrowser(urlString);
else
JAVA_THROW_SCRIPT_EXCEPTION(true, ("launchClientWebBrowser called with a url parameter that could not be converted to a string (network id was %s)",obj->getNetworkId().getValueString().c_str()));
}
}
else
JAVA_THROW_SCRIPT_EXCEPTION(true, ("launchClientWebBrowser was called with a network id paramter that could not be converted to an object."));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsSystemNamespace::playCutScene(JNIEnv * env, jobject self, jlong jclient, jstring jfilename)
{
ServerObject *obj = 0;
if (JavaLibrary::getObject(jclient, obj))
{
Client * const client = obj->getClient();
if (client)
{
JavaStringParam filenameParam(jfilename);
std::string fileName;
if(JavaLibrary::convert(filenameParam, fileName))
{
PlayCutSceneMessage cutScene(fileName);
client->send(cutScene, true);
}
}
}
}
// ======================================================================