Restructured src folder to be more clean

This commit is contained in:
seefo
2018-01-11 04:17:47 -05:00
parent e99d0f02a8
commit 3e3d18d318
20987 changed files with 5 additions and 1940589 deletions
@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 2.8)
project(serverScript)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/public)
add_subdirectory(src)
@@ -0,0 +1 @@
#include "../../src/shared/ConfigServerScript.h"
@@ -0,0 +1 @@
#include "../../src/shared/FirstServerScript.h"
@@ -0,0 +1 @@
#include "../../src/shared/GameScriptObject.h"
@@ -0,0 +1 @@
#include "../../src/shared/JNIWrappers.h"
@@ -0,0 +1 @@
#include "../../src/shared/JavaLibrary.h"
@@ -0,0 +1 @@
#include "../../src/shared/ScriptDictionary.h"
@@ -0,0 +1 @@
#include "../../src/shared/ScriptFunctionTable.h"
@@ -0,0 +1,2 @@
#include "../../src/shared/ScriptListEntry.h"
@@ -0,0 +1 @@
#include "../../src/shared/ScriptMessage.h"
@@ -0,0 +1 @@
#include "../../src/shared/ScriptParamArchive.h"
@@ -0,0 +1 @@
#include "../../src/shared/ScriptParameters.h"
@@ -0,0 +1 @@
#include "../../src/shared/SetupScript.h"
@@ -0,0 +1,148 @@
set(SHARED_SOURCES
shared/ConfigServerScript.cpp
shared/ConfigServerScript.h
shared/FirstServerScript.h
shared/GameScriptObject.cpp
shared/GameScriptObject.h
shared/JavaLibrary.cpp
shared/JavaLibrary.h
shared/JNIWrappers.cpp
shared/JNIWrappers.h
shared/ScriptDictionary.h
shared/ScriptFunctionTable.cpp
shared/ScriptFunctionTable.h
shared/ScriptListEntry.cpp
shared/ScriptMessage.cpp
shared/ScriptMessage.h
shared/ScriptMethodsActionStates.cpp
shared/ScriptMethodsAi.cpp
shared/ScriptMethodsAnimation.cpp
shared/ScriptMethodsAttributes.cpp
shared/ScriptMethodsAuction.cpp
shared/ScriptMethodsBank.cpp
shared/ScriptMethodsBeastMaster.cpp
shared/ScriptMethodsBroadcasting.cpp
shared/ScriptMethodsBuff.cpp
shared/ScriptMethodsBuffBuilder.cpp
shared/ScriptMethodsChat.cpp
shared/ScriptMethodsCity.cpp
shared/ScriptMethodsClientEffect.cpp
shared/ScriptMethodsClusterWideData.cpp
shared/ScriptMethodsCollection.cpp
shared/ScriptMethodsCombat.cpp
shared/ScriptMethodsCommandQueue.cpp
shared/ScriptMethodsConsole.cpp
shared/ScriptMethodsContainers.cpp
shared/ScriptMethodsCrafting.cpp
shared/ScriptMethodsDataTable.cpp
shared/ScriptMethodsDebug.cpp
shared/ScriptMethodsDynamicVariable.cpp
shared/ScriptMethodsForm.cpp
shared/ScriptMethodsGlobalQuery.cpp
shared/ScriptMethodsGuild.cpp
shared/ScriptMethodsHateList.cpp
shared/ScriptMethodsHolocube.cpp
shared/ScriptMethodsHyperspace.cpp
shared/ScriptMethodsImageDesign.cpp
shared/ScriptMethodsInstallation.cpp
shared/ScriptMethodsInterest.cpp
shared/ScriptMethodsInteriors.cpp
shared/ScriptMethodsJedi.cpp
shared/ScriptMethodsMap.cpp
shared/ScriptMethodsMentalStates.cpp
shared/ScriptMethodsMenu.cpp
shared/ScriptMethodsMission.cpp
shared/ScriptMethodsMoney.cpp
shared/ScriptMethodsMount.cpp
shared/ScriptMethodsNewbieTutorial.cpp
shared/ScriptMethodsNotification.cpp
shared/ScriptMethodsNpc.cpp
shared/ScriptMethodsObjectCreate.cpp
shared/ScriptMethodsObjectInfo.cpp
shared/ScriptMethodsObjectMove.cpp
shared/ScriptMethodsPermissions.cpp
shared/ScriptMethodsPilot.cpp
shared/ScriptMethodsPlanet.cpp
shared/ScriptMethodsPlayerAccount.cpp
shared/ScriptMethodsPlayerQuest.cpp
shared/ScriptMethodsPvp.cpp
shared/ScriptMethodsQuest.cpp
shared/ScriptMethodsRegion.cpp
shared/ScriptMethodsRegion3d.cpp
shared/ScriptMethodsRemoteDebug.cpp
shared/ScriptMethodsResource.cpp
shared/ScriptMethodsScript.cpp
shared/ScriptMethodsServerUI.cpp
shared/ScriptMethodsShip.cpp
shared/ScriptMethodsSkill.cpp
shared/ScriptMethodsSpawner.cpp
shared/ScriptMethodsString.cpp
shared/ScriptMethodsSystem.cpp
shared/ScriptMethodsTerrain.cpp
shared/ScriptMethodsTriggerVolume.cpp
shared/ScriptMethodsVeteran.cpp
shared/ScriptMethodsWaypoint.cpp
shared/ScriptMethodsWorldInfo.cpp
shared/ScriptParamArchive.cpp
shared/ScriptParamArchive.h
shared/ScriptParameters.cpp
shared/ScriptParameters.h
shared/SetupScript.cpp
shared/SetupScript.h
)
if(WIN32)
set(PLATFORM_SOURCES
win32/FirstServerScript.cpp
)
else()
set(PLATFORM_SOURCES "")
endif()
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/shared
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedCollision/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedCommandParser/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedDebug/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFile/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFoundation/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFoundationTypes/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedGame/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedLog/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedMath/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedMathArchive/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedMemoryManager/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedMessageDispatch/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedNetwork/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedNetworkMessages/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedObject/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedPathfinding/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedRandom/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedSkillSystem/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedSynchronization/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedTerrain/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedThread/include/public
${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedUtility/include/public
${SWG_ENGINE_SOURCE_DIR}/server/library/serverGame/include/public
${SWG_ENGINE_SOURCE_DIR}/server/library/serverNetworkMessages/include/public
${SWG_ENGINE_SOURCE_DIR}/server/library/serverPathfinding/include/public
${SWG_ENGINE_SOURCE_DIR}/server/library/serverUtility/include/public
${SWG_GAME_SOURCE_DIR}/server/application/SwgGameServer/include/public
${SWG_GAME_SOURCE_DIR}/shared/library/swgSharedNetworkMessages/include/public
${SWG_GAME_SOURCE_DIR}/shared/library/swgSharedUtility/include/public
${SWG_EXTERNALS_SOURCE_DIR}/ours/library/archive/include
${SWG_EXTERNALS_SOURCE_DIR}/ours/library/fileInterface/include/public
${SWG_EXTERNALS_SOURCE_DIR}/ours/library/localization/include
${SWG_EXTERNALS_SOURCE_DIR}/ours/library/localizationArchive/include/public
${SWG_EXTERNALS_SOURCE_DIR}/ours/library/singleton/include
${SWG_EXTERNALS_SOURCE_DIR}/ours/library/unicode/include
${SWG_EXTERNALS_SOURCE_DIR}/ours/library/unicodeArchive/include/public
${Boost_INCLUDE_DIR}
${JNI_INCLUDE_DIRS}
)
add_library(serverScript STATIC
${SHARED_SOURCES}
${PLATFORM_SOURCES}
)
@@ -0,0 +1,100 @@
//
// ConfigServerScript.cpp
//
// copyright 2000, verant interactive
//
#include "serverScript/FirstServerScript.h"
#include "serverScript/ConfigServerScript.h"
#include "sharedMath/Vector.h"
#include "sharedFoundation/ConfigFile.h"
#include <vector>
//-------------------------------------------------------------------
ConfigServerScript::Data* ConfigServerScript::data;
//-------------------------------------------------------------------
static ConfigServerScript::Data staticData;
//-------------------------------------------------------------------
//lint -e750 Disabling un used macros warning
#define KEY_INT(a,b) (data->a = ConfigFile::getKeyInt("ServerScript", #a, b))
#define KEY_BOOL(a,b) (data->a = ConfigFile::getKeyBool("ServerScript", #a, b))
#define KEY_REAL(a,b) (data->a = ConfigFile::getKeyReal("ServerScript", #a, b))
#define KEY_STRING(a,b) (data->a = ConfigFile::getKeyString("ServerScript", #a, b))
//-------------------------------------------------------------------
namespace ConfigServerScriptNamespace
{
typedef std::vector<char const *> StringPtrArray;
StringPtrArray ms_javaOptions; // ConfigFile owns the pointer
}
using namespace ConfigServerScriptNamespace;
// ======================================================================
bool ConfigServerScript::hasJavaOptions()
{
return !ms_javaOptions.empty();
}
// ----------------------------------------------------------------------
int ConfigServerScript::getNumberOfJavaOptions()
{
return static_cast<int>(ms_javaOptions.size());
}
// ----------------------------------------------------------------------
char const * ConfigServerScript::getJavaOptions(int index)
{
VALIDATE_RANGE_INCLUSIVE_EXCLUSIVE(0, index, getNumberOfJavaOptions());
return ms_javaOptions[static_cast<size_t>(index)];
}
// ----------------------------------------------------------------------
void ConfigServerScript::install(void)
{
data = &staticData;
KEY_STRING (scriptPath, "../../data/sku.0/sys.server/compiled/game/script");
KEY_STRING (javaLibPath, "./jvm");
KEY_STRING (javaDebugPort, "8000");
KEY_BOOL (useRemoteDebugJava, false);
KEY_BOOL (allowBuildClusterScriptAttach, false);
KEY_BOOL (allowDebugConsoleMessages, true);
KEY_BOOL (allowDebugSpeakMessages, true);
KEY_BOOL (disableScriptLogs, false);
KEY_BOOL (logBalance, false);
int index = 0;
char const * result = 0;
do
{
// "javaOptions" are in the "GameServer" block and not the "ServerScript" block
result = ConfigFile::getKeyString("GameServer", "javaOptions", index++, 0);
if (result != 0)
{
ms_javaOptions.push_back(result);
}
}
while (result);
}
//-------------------------------------------------------------------
void ConfigServerScript::remove(void)
{
}
//-------------------------------------------------------------------
@@ -0,0 +1,119 @@
//
// ConfigServerscript.h
// asommers 9-11-2000
//
// copyright 2000, verant interactive
//
#ifndef _INCLUDED_ConfigServerScript_H
#define _INCLUDED_ConfigServerScript_H
//-------------------------------------------------------------------
class ConfigServerScript
{
public:
struct Data
{
// script data
const char * scriptPath; // location of scripts
const char * javaLibPath; // location of jvm files
const char * javaDebugPort; // ip port we connect to for remote debugging
bool useRemoteDebugJava; // flag to use the jvm for remote debugging
bool allowBuildClusterScriptAttach; //used only on the build cluster for attaching scripts without a VM.
bool allowDebugConsoleMessages; //used only on the build cluster for attaching scripts without a VM.
bool allowDebugSpeakMessages; //used to enable/disable the debugSpeakMessage script function
bool disableScriptLogs;
bool logBalance;
};
private:
static Data *data;
public:
static void install (void);
static void remove (void);
static const char * getScriptPath (void);
static const char * getJavaLibPath (void);
static const char * getJavaDebugPort (void);
static bool getUseRemoteDebugJava (void);
static bool getAllowBuildClusterScriptAttach();
static bool allowDebugConsoleMessages();
static bool allowDebugSpeakMessages();
static bool getDisableScriptLogs();
static bool getLogBalance();
static bool hasJavaOptions();
static int getNumberOfJavaOptions();
static char const * getJavaOptions(int index);
};
inline const char *ConfigServerScript::getScriptPath(void)
{
return data->scriptPath;
}
//-----------------------------------------------------------------------
inline const char *ConfigServerScript::getJavaLibPath(void)
{
return data->javaLibPath;
}
//-----------------------------------------------------------------------
inline const char *ConfigServerScript::getJavaDebugPort(void)
{
return data->javaDebugPort;
}
//-----------------------------------------------------------------------
inline bool ConfigServerScript::getUseRemoteDebugJava(void)
{
return data->useRemoteDebugJava;
}
//-----------------------------------------------------------------------
inline bool ConfigServerScript::getAllowBuildClusterScriptAttach()
{
return data->allowBuildClusterScriptAttach;
}
//-----------------------------------------------------------------------
inline bool ConfigServerScript::allowDebugConsoleMessages()
{
return data->allowDebugConsoleMessages;
}
inline bool ConfigServerScript::allowDebugSpeakMessages()
{
return data->allowDebugSpeakMessages;
}
//-----------------------------------------------------------------------
inline bool ConfigServerScript::getDisableScriptLogs()
{
return data->disableScriptLogs;
}
//-----------------------------------------------------------------------
inline bool ConfigServerScript::getLogBalance()
{
return data->logBalance;
}
//-----------------------------------------------------------------------
#endif // _INCLUDED_ConfigServerScript_H
@@ -0,0 +1,10 @@
#ifndef INCLUDED_FirstServerScript_H
#define INCLUDED_FirstServerScript_H
#include "boost/smart_ptr.hpp"
#include "sharedFoundation/FirstSharedFoundation.h"
#include "sharedMemoryManager/FirstSharedMemoryManager.h"
#include "StringId.h"
#endif
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,272 @@
//========================================================================
//
// GameScriptObject.h - responsible for managing/executing scripts.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#ifndef _INCLUDED_GameScriptObject_H
#define _INCLUDED_GameScriptObject_H
#ifdef WIN32
#pragma warning(disable:4503)
#endif
#include "Archive/AutoDeltaByteStream.h"
#include "Archive/AutoDeltaVariableCallback.h"
#include "Archive/AutoDeltaVector.h"
#include "StringId.h"
#include "serverScript/ScriptFunctionTable.h"
#include "serverScript/ScriptListEntry.h"
#include "sharedFoundation/Crc.h"
#include "sharedFoundation/NetworkId.h"
#include "sharedFoundation/Watcher.h"
#include <map>
#include <set>
/*************************************************************************/
// constants and typedefs
/*************************************************************************/
namespace boost
{
template <class T> class shared_ptr;
}
class CachedNetworkId;
class GameScriptObject;
class Object;
class Scheduler;
class ScriptDictionary;
class ScriptMessage;
class ScriptParams;
class ServerObject;
typedef boost::shared_ptr<ScriptDictionary> ScriptDictionaryPtr;
struct ScriptData
{
std::set<NetworkId> owners; // who has this script attached
std::set<std::string> functions; // functions available from this script
};
typedef std::vector<ScriptListEntry> ScriptList;
typedef Unicode::String String_t;
typedef stdvector <String_t>::fwd StringVector_t;
// values returned from script functions
enum
{
SCRIPT_OVERRIDE = 0,
SCRIPT_CONTINUE = 1,
SCRIPT_DEFAULT = 2,
SCRIPT_INTERNAL_ERROR = 99 // internal scripting engine error
};
const size_t MAX_SCRIPT_NAME_LEN = 128; // including final '\0'
/*************************************************************************/
// class GameScriptObject
/*************************************************************************/
class GameScriptObject
{
public:
GameScriptObject(void);
~GameScriptObject();
static GameScriptObject * asGameScriptObject(Object * object);
static GameScriptObject const * asGameScriptObject(Object const * object);
void setOwner(ServerObject *owner);
const ServerObject * getOwner(void) const;
void setOwnerIsAuthoritative(bool authoritative, uint32 pid);
void setOwnerIsLoaded(void);
void setOwnerIsInitialized(void);
void setOwnerDestroyed(void);
void alter(real time);
// add this script object to an object's synchronization package.
void addToPackage(Archive::AutoDeltaByteStream &);
// attachScript() adds a mutator script to the GameScriptObject with the given name, Return 1 if successful. 0 otherwise.
int attachScript(const std::string& scriptName, bool runTrigger);
// detachScript() removes a mutator script to the GameScriptObject with the given name. Return 1 if successful, 0 otherwise.
int detachScript(const std::string& scriptName);
void initScriptInstances ();
// removeAll() removes all mutator scripts from the obejct.
void removeAll();
// triggerAllScripts sends a trigger to the topmost mutator script. It will
// continue to send that trigger to each subsequent mutator script until one
// such trigger function returns 0. This function returns the value returned
// by the last trigger. This will tell the GameObject that invoked the trigger
// whether to run default behavior.
int trigAllScripts(const Scripting::TrigId trigId, ScriptParams &params);
int trigScriptFromConsole(const Scripting::TrigId trigId, const std::string &scriptName, const StringVector_t &params) const;
int callScriptCommandHandler(std::string const &funcName, ScriptParams &params) const;
int callScriptBuffHandler(std::string const &funcName, ScriptParams &params) const;
// hasScript() queries the object for the existance of a particular mutator script.
bool hasScript(const std::string& scriptName) const;
bool hasTrigger(const Scripting::TrigId trigId) const;
bool hasFunction(const std::string & funcName) const;
size_t getScriptCount(void) const;
const ScriptList & getScripts(void) const;
bool isScriptListInitialized(void) const;
// pack and unpack for the synchronized script list
void packScriptList();
void unpackScriptList();
// call this function to create a copy of the scriptList used for debugging.
void enumerateScripts(std::vector<std::string> &scriptNames) const;
static void makeScriptDictionary(const ScriptParams & params, ScriptDictionaryPtr & dictionary);
bool handleMessage(const std::string &messageName, const ScriptDictionaryPtr & data);
bool handleMessage(const std::string &messageName, const stdvector<int8>::fwd & packedData);
void onWatching(ServerObject & subject);
void onStopWatching(ServerObject & subject);
static bool installScriptEngine(void);
static void removeScriptEngine(void);
static bool isScriptingEnabled(void);
static bool reloadScript(const std::string& scriptName);
static void pauseScripting(bool pause);
static bool isScriptingPaused(void);
static void enableLogging(bool enable);
static void enableNewJediTracking(bool enableTracking);
static int getScriptFreeMem();
static stdset<std::string>::fwd & getScriptFunctions(const std::string & script);
static Scheduler & getScriptScheduler();
static void runOneScript(
const std::string & scriptName,
const std::string & methodName,
const std::string & argTypes,
ScriptParams & args);
static std::string callScriptConsoleHandler(
const std::string & scriptName,
const std::string & methodName,
const std::string & argTypes,
ScriptParams & args);
void setScriptVar(const std::string & name, int value);
void setScriptVar(const std::string & name, float value);
void setScriptVar(const std::string & name, const std::string & value);
static void callSpaceMakeOvert(const NetworkId &player);
static void callSpaceClearOvert(const NetworkId &ship);
static std::string callDumpTargetInfo( NetworkId &id );
static void packAllScriptVarDeltas();
void clearScriptVars();
void packScriptVars(stdvector<int8>::fwd & target) const;
void unpackScriptVars(const stdvector<int8>::fwd & data) const;
void unpackDeltaScriptVars(const stdvector<int8>::fwd & source) const;
static ScriptListEntry getScriptListEntry(std::string const &scriptName);
// trigOneScript() sends a trigger to a specific mutator script, thus not invoking the chain.
// TODO RAD: see if we can make this work off a ScriptListEntry or if we need to change our logic a bit
int trigOneScript(const std::string& scriptName, Scripting::TrigId trigId, ScriptParams &params) const;
private:
void addAvailableFunction(const std::string & funcName);
void removeAvailableFunction(const std::string & funcName);
private:
struct SyncScriptListCallback
{
void modified (GameScriptObject & target, const std::string & oldValue, const std::string & newValue, bool isLocal) const;
};
friend struct SyncScriptListCallback;
private:
ServerObject * m_owner; // the network object that controlls me
ScriptList m_scriptList; // list of scripts to execute
Archive::AutoDeltaVariableCallback<std::string, SyncScriptListCallback, GameScriptObject> m_synchronizedScriptList; // Packed script list to send on the network
bool m_scriptListInitialized; // flag that initScriptInstances() has been called
bool m_scriptListValid; // flag that the current script data is good; this is set true in initScriptInstances(), but will be cleared if the owner becomes non-authoritative
bool m_lockScriptList; // flag to disable manipulation of the script list
int m_attachingScript; // flag that we are attaching a script
static bool m_pauseScripting; // flag to temporarily disable scriping calls
private:
typedef std::map<std::string, ScriptData> ScriptDataMap;
static ScriptDataMap * ms_scriptDataMap;
private:
GameScriptObject(const GameScriptObject &);
};
// ----------------------------------------------------------------------
inline void GameScriptObject::setOwner(ServerObject *owner)
{
m_owner = owner;
}
inline const ServerObject *GameScriptObject::getOwner(void) const
{
return m_owner;
}
inline size_t GameScriptObject::getScriptCount(void) const
{
return m_scriptList.size();
}
inline const ScriptList & GameScriptObject::getScripts(void) const
{
return m_scriptList;
}
inline stdset<std::string>::fwd & GameScriptObject::getScriptFunctions(const std::string & script)
{
return (*ms_scriptDataMap)[script].functions;
}
inline void GameScriptObject::pauseScripting(bool pause)
{
m_pauseScripting = pause;
}
inline bool GameScriptObject::isScriptingPaused(void)
{
return m_pauseScripting;
}
inline bool GameScriptObject::isScriptListInitialized(void) const
{
return m_scriptListValid;
}
// ======================================================================
namespace Archive
{
void get(ReadIterator &source, ScriptListEntry &target);
void put(ByteStream &target, ScriptListEntry const &source);
}
// ======================================================================
#endif // _INCLUDED_GameScriptObject_H
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,615 @@
//========================================================================
//
// JNIWrappers.h - Classes and functions to wrap the JNI interface
//
// copyright 2004 Sony Online Entertainment
//
//========================================================================
#ifndef _INCLUDED_JNIWrappers_H
#define _INCLUDED_JNIWrappers_H
#include <jni.h>
#include "serverScript/ScriptDictionary.h"
namespace boost
{
template <class T> class shared_ptr;
}
class LocalRefParam;
class LocalArrayRefParam;
class LocalObjectArrayRefParam;
class LocalRef;
class LocalArrayRef;
class LocalObjectArrayRef;
class LocalByteArrayRef;
class LocalIntArrayRef;
class LocalFloatArrayRef;
class LocalBooleanArrayRef;
class LocalLongArrayRef;
class GlobalRef;
class GlobalArrayRef;
class JavaStringParam;
class JavaString;
class JavaDictionary;
typedef boost::shared_ptr<LocalRefParam> LocalRefParamPtr;
typedef boost::shared_ptr<LocalArrayRefParam> LocalArrayRefParamPtr;
typedef boost::shared_ptr<LocalObjectArrayRefParam> LocalObjectArrayRefParamPtr;
typedef boost::shared_ptr<LocalRef> LocalRefPtr;
typedef boost::shared_ptr<LocalArrayRef> LocalArrayRefPtr;
typedef boost::shared_ptr<LocalObjectArrayRef> LocalObjectArrayRefPtr;
typedef boost::shared_ptr<LocalByteArrayRef> LocalByteArrayRefPtr;
typedef boost::shared_ptr<LocalIntArrayRef> LocalIntArrayRefPtr;
typedef boost::shared_ptr<LocalFloatArrayRef> LocalFloatArrayRefPtr;
typedef boost::shared_ptr<LocalBooleanArrayRef> LocalBooleanArrayRefPtr;
typedef boost::shared_ptr<LocalLongArrayRef> LocalLongArrayRefPtr;
typedef boost::shared_ptr<GlobalRef> GlobalRefPtr;
typedef boost::shared_ptr<GlobalArrayRef> GlobalArrayRefPtr;
typedef boost::shared_ptr<JavaStringParam> JavaStringParamPtr;
typedef boost::shared_ptr<JavaString> JavaStringPtr;
typedef boost::shared_ptr<JavaDictionary> JavaDictionaryPtr;
//========================================================================
namespace JNIWrappersNamespace
{
jboolean isInstanceOf(const LocalRefParam & object, jclass clazz);
jsize getArrayLength(const LocalArrayRefParam & array);
jsize getStringLength(const JavaStringParam & string);
LocalRefPtr allocObject(jclass clazz);
LocalRefPtr createNewObject(jclass clazz, jmethodID constructorID, ...);
JavaStringPtr createNewString(const char * bytes);
JavaStringPtr createNewString(const jchar * unicodeChars, jsize len);
JavaDictionaryPtr createNewDictionary();
LocalObjectArrayRefPtr createNewObjectArray(jsize length, jclass clazz);
LocalByteArrayRefPtr createNewByteArray(jsize length);
LocalIntArrayRefPtr createNewIntArray(jsize length);
LocalFloatArrayRefPtr createNewFloatArray(jsize length);
LocalBooleanArrayRefPtr createNewBooleanArray(jsize length);
LocalLongArrayRefPtr createNewLongArray(jsize length);
LocalRefPtr callObjectMethod(const LocalRefParam & object, jmethodID methodID, ...);
LocalObjectArrayRefPtr callObjectArrayMethod(const LocalRefParam & object, jmethodID methodID, ...);
LocalByteArrayRefPtr callByteArrayMethod(const LocalRefParam & object, jmethodID methodID, ...);
jint callIntMethod(const LocalRefParam & object, jmethodID methodID, ...);
jlong callLongMethod(const LocalRefParam & object, jmethodID methodID, ...);
jfloat callFloatMethod(const LocalRefParam & object, jmethodID methodID, ...);
jboolean callBooleanMethod(const LocalRefParam & object, jmethodID methodID, ...);
void callVoidMethod(const LocalRefParam & object, jmethodID methodID, ...);
jboolean callNonvirtualBooleanMethod(const LocalRefParam & object, jclass clazz, jmethodID methodID, ...);
void callStaticVoidMethod(jclass clazz, jmethodID methodID, ...);
LocalRefPtr callStaticObjectMethod(jclass clazz, jmethodID methodID, ...);
LocalObjectArrayRefPtr callStaticObjectArrayMethod(jclass clazz, jmethodID methodID, ...);
LocalByteArrayRefPtr callStaticByteArrayMethod(jclass clazz, jmethodID methodID, ...);
JavaStringPtr callStringMethod(const LocalRefParam & object, jmethodID methodID, ...);
JavaStringPtr callStaticStringMethod(jclass clazz, jmethodID methodID, ...);
LocalRefPtr getObjectArrayElement(const LocalObjectArrayRefParam & array, int index);
JavaStringPtr getStringArrayElement(const LocalObjectArrayRefParam & array, int index);
LocalArrayRefPtr getArrayArrayElement(const LocalObjectArrayRefParam & array, int index);
LocalObjectArrayRefPtr getObjectArrayArrayElement(const LocalObjectArrayRefParam & array, int index);
LocalIntArrayRefPtr getIntArrayArrayElement(const LocalObjectArrayRefParam & array, int index);
LocalFloatArrayRefPtr getFloatArrayArrayElement(const LocalObjectArrayRefParam & array, int index);
LocalRefPtr getObjectField(const LocalRefParam & object, jfieldID fieldID);
LocalObjectArrayRefPtr getArrayObjectField(const LocalRefParam & object, jfieldID fieldID);
JavaStringPtr getStringField(const LocalRefParam & object, jfieldID fieldID);
void setObjectArrayElement(const LocalObjectArrayRefParam & array, jsize index, const LocalRefParam & value);
void setObjectField(const LocalRefParam & object, jfieldID fieldID, const LocalRefParam & value);
jint getIntField(const LocalRefParam & object, jfieldID fieldID);
jfloat getFloatField(const LocalRefParam & object, jfieldID fieldID);
jboolean getBooleanField(const LocalRefParam & object, jfieldID fieldID);
void setIntField(const LocalRefParam & object, jfieldID fieldID, jint value);
void setFloatField(const LocalRefParam & object, jfieldID fieldID, jfloat value);
void setBooleanField(const LocalRefParam & object, jfieldID fieldID, jboolean value);
void getByteArrayRegion(const LocalByteArrayRef & array, jsize start, jsize length, jbyte * buf);
void getIntArrayRegion(const LocalIntArrayRef & array, jsize start, jsize length, jint * buf);
void getFloatArrayRegion(const LocalFloatArrayRef & array, jsize start, jsize length, jfloat * buf);
void getBooleanArrayRegion(const LocalBooleanArrayRef & array, jsize start, jsize length, jboolean * buf);
void getLongArrayRegion(const LocalLongArrayRef & array, jsize start, jsize length, jlong * buf);
void setByteArrayRegion(const LocalByteArrayRef & array, jsize start, jsize length, jbyte * buf);
void setIntArrayRegion(const LocalIntArrayRef & array, jsize start, jsize length, jint * buf);
void setFloatArrayRegion(const LocalFloatArrayRef & array, jsize start, jsize length, jfloat * buf);
void setBooleanArrayRegion(const LocalBooleanArrayRef & array, jsize start, jsize length, jboolean * buf);
void setLongArrayRegion(const LocalLongArrayRef & array, jsize start, jsize length, jlong * buf);
// these functions don't match a JNI function, but are useful for optimization reasons
void getStringArray(const LocalObjectArrayRefParam & array, std::vector<const char *> & strings);
void getStringArray(const LocalObjectArrayRefParam & array, std::vector<const Unicode::String *> & strings);
}
//========================================================================
/**
* Wraps a jobject passed into a JNI callback function from Java.
*/
class LocalRefParam
{
public:
static const LocalRefParamPtr cms_nullPtr;
public:
explicit LocalRefParam(jobject src);
virtual ~LocalRefParam();
// getValue should be used when passing the wrapped object to a JNI function
jobject getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jobject getReturnValue(void);
void emergencyClear();
protected:
jobject m_ref;
private:
LocalRefParam();
LocalRefParam(const LocalRefParam &);
};
// ----------------------------------------------------------------------
inline jobject LocalRefParam::getValue(void) const
{
return m_ref;
}
//========================================================================
/**
* Wraps a jarray passed into a JNI callback function from Java.
*/
class LocalArrayRefParam : public LocalRefParam
{
public:
static const LocalArrayRefParamPtr cms_nullPtr;
public:
explicit LocalArrayRefParam(jarray src);
virtual ~LocalArrayRefParam();
// getValue should be used when passing the wrapped object to a JNI function
jarray getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jarray getReturnValue(void);
private:
LocalArrayRefParam();
LocalArrayRefParam(const LocalArrayRefParam &);
};
// ----------------------------------------------------------------------
inline jarray LocalArrayRefParam::getValue(void) const
{
return static_cast<jarray>(LocalRefParam::getValue());
}
inline jarray LocalArrayRefParam::getReturnValue(void)
{
return static_cast<jarray>(LocalRefParam::getReturnValue());
}
//========================================================================
/**
* Wraps a jobjectArray passed into a JNI callback function from Java.
*/
class LocalObjectArrayRefParam : public LocalArrayRefParam
{
public:
static const LocalObjectArrayRefParamPtr cms_nullPtr;
public:
explicit LocalObjectArrayRefParam(jobjectArray src);
virtual ~LocalObjectArrayRefParam();
// getValue should be used when passing the wrapped object to a JNI function
jobjectArray getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jobjectArray getReturnValue(void);
private:
LocalObjectArrayRefParam();
LocalObjectArrayRefParam(const LocalObjectArrayRefParam &);
};
// ----------------------------------------------------------------------
inline jobjectArray LocalObjectArrayRefParam::getValue(void) const
{
return static_cast<jobjectArray>(LocalArrayRefParam::getValue());
}
inline jobjectArray LocalObjectArrayRefParam::getReturnValue(void)
{
return static_cast<jobjectArray>(LocalArrayRefParam::getReturnValue());
}
//========================================================================
/**
* Wraps a jobject created/returned by a JNI function.
*/
class LocalRef : public LocalRefParam
{
public:
static const LocalRefPtr cms_nullPtr;
public:
explicit LocalRef(jobject src);
virtual ~LocalRef();
private:
LocalRef();
LocalRef(const LocalRef &);
};
//========================================================================
/**
* Wraps a jarray created/returned by a JNI function.
*/
class LocalArrayRef : public LocalArrayRefParam
{
public:
static const LocalArrayRefPtr cms_nullPtr;
public:
explicit LocalArrayRef(jarray src);
virtual ~LocalArrayRef();
private:
LocalArrayRef();
LocalArrayRef(const LocalArrayRef &);
};
//========================================================================
/**
* Wraps a jobjectArray created/returned by a JNI function.
*/
class LocalObjectArrayRef : public LocalObjectArrayRefParam
{
public:
static const LocalObjectArrayRefPtr cms_nullPtr;
public:
explicit LocalObjectArrayRef(jobjectArray src);
virtual ~LocalObjectArrayRef();
private:
LocalObjectArrayRef();
LocalObjectArrayRef(const LocalObjectArrayRef &);
};
//========================================================================
/**
* Wraps a jbyteArray created/returned by a JNI function.
*/
class LocalByteArrayRef : public LocalArrayRef
{
public:
static const LocalByteArrayRefPtr cms_nullPtr;
public:
explicit LocalByteArrayRef(jbyteArray src);
virtual ~LocalByteArrayRef();
// getValue should be used when passing the wrapped object to a JNI function
jbyteArray getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jbyteArray getReturnValue(void);
private:
LocalByteArrayRef();
LocalByteArrayRef(const LocalByteArrayRef &);
};
// ----------------------------------------------------------------------
inline jbyteArray LocalByteArrayRef::getValue(void) const
{
return static_cast<jbyteArray>(LocalArrayRef::getValue());
}
inline jbyteArray LocalByteArrayRef::getReturnValue(void)
{
return static_cast<jbyteArray>(LocalArrayRef::getReturnValue());
}
//========================================================================
/**
* Wraps a jintArray created/returned by a JNI function.
*/
class LocalIntArrayRef : public LocalArrayRef
{
public:
static const LocalIntArrayRefPtr cms_nullPtr;
public:
explicit LocalIntArrayRef(jintArray src);
virtual ~LocalIntArrayRef();
// getValue should be used when passing the wrapped object to a JNI function
jintArray getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jintArray getReturnValue(void);
private:
LocalIntArrayRef();
LocalIntArrayRef(const LocalIntArrayRef &);
};
// ----------------------------------------------------------------------
inline jintArray LocalIntArrayRef::getValue(void) const
{
return static_cast<jintArray>(LocalArrayRef::getValue());
}
inline jintArray LocalIntArrayRef::getReturnValue(void)
{
return static_cast<jintArray>(LocalArrayRef::getReturnValue());
}
//========================================================================
/**
* Wraps a jfloatArray created/returned by a JNI function.
*/
class LocalFloatArrayRef : public LocalArrayRef
{
public:
static const LocalFloatArrayRefPtr cms_nullPtr;
public:
explicit LocalFloatArrayRef(jfloatArray src);
virtual ~LocalFloatArrayRef();
// getValue should be used when passing the wrapped object to a JNI function
jfloatArray getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jfloatArray getReturnValue(void);
private:
LocalFloatArrayRef();
LocalFloatArrayRef(const LocalFloatArrayRef &);
};
// ----------------------------------------------------------------------
inline jfloatArray LocalFloatArrayRef::getValue(void) const
{
return static_cast<jfloatArray>(LocalArrayRef::getValue());
}
inline jfloatArray LocalFloatArrayRef::getReturnValue(void)
{
return static_cast<jfloatArray>(LocalArrayRef::getReturnValue());
}
//========================================================================
/**
* Wraps a jbooleanArray created/returned by a JNI function.
*/
class LocalBooleanArrayRef : public LocalArrayRef
{
public:
static const LocalBooleanArrayRefPtr cms_nullPtr;
public:
explicit LocalBooleanArrayRef(jbooleanArray src);
virtual ~LocalBooleanArrayRef();
// getValue should be used when passing the wrapped object to a JNI function
jbooleanArray getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jbooleanArray getReturnValue(void);
private:
LocalBooleanArrayRef();
LocalBooleanArrayRef(const LocalBooleanArrayRef &);
};
// ----------------------------------------------------------------------
inline jbooleanArray LocalBooleanArrayRef::getValue(void) const
{
return static_cast<jbooleanArray>(LocalArrayRef::getValue());
}
inline jbooleanArray LocalBooleanArrayRef::getReturnValue(void)
{
return static_cast<jbooleanArray>(LocalArrayRef::getReturnValue());
}
//========================================================================
/**
* Wraps a jlongArray created/returned by a JNI function.
*/
class LocalLongArrayRef : public LocalArrayRef
{
public:
static const LocalLongArrayRefPtr cms_nullPtr;
public:
explicit LocalLongArrayRef(jlongArray src);
virtual ~LocalLongArrayRef();
// getValue should be used when passing the wrapped object to a JNI function
jlongArray getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jlongArray getReturnValue(void);
private:
LocalLongArrayRef();
LocalLongArrayRef(const LocalLongArrayRef &);
};
// ----------------------------------------------------------------------
inline jlongArray LocalLongArrayRef::getValue(void) const
{
return static_cast<jlongArray>(LocalArrayRef::getValue());
}
inline jlongArray LocalLongArrayRef::getReturnValue(void)
{
return static_cast<jlongArray>(LocalArrayRef::getReturnValue());
}
//========================================================================
/**
* Creates a global reference from a local reference.
*/
class GlobalRef : public LocalRefParam
{
public:
static const GlobalRefPtr cms_nullPtr;
public:
explicit GlobalRef(const LocalRefParam & src);
virtual ~GlobalRef();
private:
GlobalRef();
GlobalRef(const GlobalRef & src);
};
//========================================================================
/**
* Creates a global array reference from a local array reference.
*/
class GlobalArrayRef : public LocalObjectArrayRefParam
{
public:
static const GlobalArrayRefPtr cms_nullPtr;
public:
explicit GlobalArrayRef(const LocalObjectArrayRefParam & src);
virtual ~GlobalArrayRef();
private:
GlobalArrayRef();
GlobalArrayRef(const GlobalArrayRef &);
};
//========================================================================
/**
* Wraps a jstring passed into a JNI callback function from Java.
*/
class JavaStringParam : public LocalRefParam
{
public:
static const JavaStringParamPtr cms_nullPtr;
public:
explicit JavaStringParam(jstring src);
explicit JavaStringParam(const LocalRefParam & src);
virtual ~JavaStringParam();
// getValue should be used when passing the wrapped object to a JNI function
jstring getValue(void) const;
// getReturnValue should be used when returning the wrapped object from a
// JNICALL function back to Java
jstring getReturnValue(void);
int fillBuffer(char * buffer, int size) const;
private:
JavaStringParam();
JavaStringParam(const JavaStringParam & src);
};
// ----------------------------------------------------------------------
inline jstring JavaStringParam::getValue(void) const
{
return static_cast<jstring>(LocalRefParam::getValue());
}
inline jstring JavaStringParam::getReturnValue(void)
{
return static_cast<jstring>(LocalRefParam::getReturnValue());
}
//========================================================================
/**
* Wraps a jstring created/returned by a JNI function.
*/
class JavaString : public JavaStringParam
{
public:
static const JavaStringPtr cms_nullPtr;
public:
explicit JavaString(jstring src);
explicit JavaString(const char * src);
explicit JavaString(const std::string & src);
explicit JavaString(const Unicode::String & src);
virtual ~JavaString();
private:
JavaString();
JavaString(const JavaString & src);
};
//========================================================================
/**
* Wraps a jobject that represents a Java script.dictionary object.
*/
class JavaDictionary : public LocalRef, public ScriptDictionary
{
public:
static const JavaDictionaryPtr cms_nullPtr;
public:
explicit JavaDictionary(jobject src);
virtual ~JavaDictionary();
virtual void serialize(void);
private:
JavaDictionary(const JavaDictionary &);
JavaDictionary & operator = (const JavaDictionary &);
};
//========================================================================
#endif // _INCLUDED_JNIWrappers_H
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,67 @@
//========================================================================
//
// ScriptDictionary.h - interface class to pass dictionaries around. Must be
// derived by a real class that hold the dictionary data.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#ifndef _INCLUDED_ScriptDictionary_H
#define _INCLUDED_ScriptDictionary_H
#include <vector>
namespace boost
{
template <class T> class shared_ptr;
}
class ScriptDictionary
{
public:
virtual ~ScriptDictionary();
virtual void serialize(void) = 0;
const stdvector<int8>::fwd & getSerializedData(void) const;
uint32 getCrc(void) const;
protected:
ScriptDictionary(void);
stdvector<int8>::fwd m_serializedData;
uint32 m_crc;
private:
ScriptDictionary(const ScriptDictionary &);
ScriptDictionary & operator = (const ScriptDictionary &);
};
typedef boost::shared_ptr<ScriptDictionary> ScriptDictionaryPtr;
inline ScriptDictionary::ScriptDictionary(void)
{
}
inline ScriptDictionary::~ScriptDictionary()
{
}
inline const stdvector<int8>::fwd & ScriptDictionary::getSerializedData(void) const
{
return m_serializedData;
}
inline uint32 ScriptDictionary::getCrc(void) const
{
return m_crc;
}
#endif // _INCLUDED_ScriptDictionary_H
@@ -0,0 +1,474 @@
//========================================================================
//
// ScriptFuncTable.cpp - Default values for initializing the script function list.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/ScriptFunctionTable.h"
//========================================================================
// local constants
//========================================================================
//
// values for script parameters:
// b = boolean
// i = integer (4 byte)
// f = float (4 byte)
// s = string (const char *)
// u = unicode string (const uint16 *)
// V = class ValueDictionary
// O = class objId
// S = class stringId
// E = class slotData
// A = class attribMod
// M = class mentalStateMod
// L = class location
// m = class menu_info
// D = class draft_schematic
// I = struct Crafting::IngredientSlot
// U = unsigned char
// [ = previous identifier was an array
// * = previous identifier was the modifiable version of the data (currently int, float, and stringId)
//
static const Scripting::ScriptFuncTable ScriptFuncList[] =
{
{Scripting::TRIG_ATTACH, "OnAttach", ""},
{Scripting::TRIG_DETACH, "OnDetach", ""},
{Scripting::TRIG_INITIALIZE, "OnInitialize", ""},
{Scripting::TRIG_SPEAKING, "OnSpeaking", "u"},
{Scripting::TRIG_HEAR_SPEECH_STRING, "OnHearSpeech", "Ou"},
{Scripting::TRIG_HEAR_SPEECH_STRINGID, "OnHearSpeech", "OS"},
{Scripting::TRIG_PERFORM_EMOTE, "OnPerformEmote", "u"},
{Scripting::TRIG_SAW_EMOTE, "OnSawEmote", "Ou"},
{Scripting::TRIG_INSPECTED, "OnInspected", "OS"},
{Scripting::TRIG_LOGOUT, "OnLogout", ""},
{Scripting::TRIG_LOGIN, "OnLogin", ""},
{Scripting::TRIG_ITEM_EQUIP, "OnItemEquip", "OE["},
{Scripting::TRIG_ITEM_UNEQUIP, "OnItemUneqip", "OE["},
{Scripting::TRIG_TARGET_EQUIPS_ITEM, "OnTargetEquipsItem", "OE["},
{Scripting::TRIG_TARGET_UNEQUIPS_ITEM, "OnTargetUnequipsItem", "OE["},
{Scripting::TRIG_ABOUT_TO_RECEIVE_ITEM, "OnAboutToReceiveItem", "OOO"},
{Scripting::TRIG_RECEIVED_ITEM, "OnReceivedItem", "OOO"},
{Scripting::TRIG_ABOUT_TO_BE_XFERRED, "OnAboutToBeTransferred","OO"},
{Scripting::TRIG_XFERRED, "OnTransferred", "OOO"},
{Scripting::TRIG_ABOUT_TO_LOSE_ITEM, "OnAboutToLoseItem", "OOO"},
{Scripting::TRIG_LOST_ITEM, "OnLostItem", "OOO"},
{Scripting::TRIG_LOADED_FROM_DB, "OnLoadedFromDb", ""},
{Scripting::TRIG_UNLOADED_FROM_MEMORY, "OnUnloadedFromMemory", ""},
{Scripting::TRIG_DECAY, "OnDecay", ""},
{Scripting::TRIG_OBJECT_DISABLED, "OnObjectDisabled", "O"},
{Scripting::TRIG_DESTROY, "OnDestroy", ""},
{Scripting::TRIG_SERVER_TRANSFER, "OnServerTransfer", ""},
{Scripting::TRIG_MADE_AUTHORITATIVE, "OnMadeAuthoritative", ""},
{Scripting::TRIG_ABOUT_TO_BE_INCAPACITATED, "OnAboutToBeIncapacitated", "O"},
{Scripting::TRIG_INCAPACITATED, "OnIncapacitated", "O"},
{Scripting::TRIG_RECAPACITATED, "OnRecapacitated", ""},
{Scripting::TRIG_ABOUT_TO_DIE, "OnAboutToDie", "O"},
{Scripting::TRIG_DEATH, "OnDeath", "OO"},
{Scripting::TRIG_ENVIRONMENTAL_DEATH, "OnEnvironmentalDeath", ""},
{Scripting::TRIG_ENTERED_COMBAT, "OnEnteredCombat", ""},
{Scripting::TRIG_EXITED_COMBAT, "OnExitedCombat", ""},
{Scripting::TRIG_DEFENDER_COMBAT_ACTION, "OnDefenderCombatAction","OOi"},
{Scripting::TRIG_ATTACKER_COMBAT_ACTION, "OnAttackerCombatAction","OO"},
{Scripting::TRIG_WEAPON_COMBAT_ACTION, "OnWeaponCombatAction", "OO"},
{Scripting::TRIG_CHANGED_POSTURE, "OnChangedPosture", "ii"},
{Scripting::TRIG_COMBAT_DAMAGED, "OnCombatDamaged", "OOi"},
{Scripting::TRIG_CREATURE_DAMAGED, "OnCreatureDamaged", "OOi["},
{Scripting::TRIG_OBJECT_DAMAGED, "OnObjectDamaged", "OOi"},
{Scripting::TRIG_INCAPACITATE_TARGET, "OnIncapacitateTarget", "O"},
{Scripting::TRIG_ADDED_TO_WORLD, "OnAddedToWorld", ""},
{Scripting::TRIG_REMOVING_FROM_WORLD, "OnRemovingFromWorld", ""},
{Scripting::TRIG_PRELOAD_COMPLETE, "OnPreloadComplete", ""},
{Scripting::TRIG_BEHAVIOR_CHANGE, "OnBehaviorChange", "iii["},
{Scripting::TRIG_TARGET_CHANGE, "OnBehaviorTargetChange", "ii["},
{Scripting::TRIG_START_NPC_CONVERSATION, "OnStartNpcConversation","O"},
{Scripting::TRIG_END_NPC_CONVERSATION, "OnEndNpcConversation", "O"},
{Scripting::TRIG_START_CONVERSATION , "OnStartConversation", "O"},
{Scripting::TRIG_END_CONVERSATION, "OnEndConversation", "O"},
{Scripting::TRIG_ARRIVE_AT_LOCATION, "OnArrivedAtLocation", "u"},
{Scripting::TRIG_NPC_CONVERSATION_RESPONSE, "OnNpcConversationResponse", "sOS"},
{Scripting::TRIG_COMBAT_TARGETED, "OnTargeted", "O"},
{Scripting::TRIG_COMBAT_UNTARGETED, "OnUntargeted", "O"},
{Scripting::TRIG_COMBAT_LOST_TARGET, "OnLostTarget", "O"},
{Scripting::TRIG_PLAYER_REQUEST_MISSION_BOARD, "OnPlayerRequestMissionBoard", "OOO["},
{Scripting::TRIG_OUT_OF_AMMO, "OnOutOfAmmo", "O"},
{Scripting::TRIG_PVP_TYPE_CHANGED, "OnPvpTypeChanged", "ii"},
{Scripting::TRIG_PVP_FACTION_CHANGED, "OnPvpFactionChanged", "ii"},
{Scripting::TRIG_CITY_CHANGED, "OnCityChanged", "ii"},
{Scripting::TRIG_ENTER_SWIMMING, "OnEnterSwimming", ""},
{Scripting::TRIG_EXIT_SWIMMING, "OnExitSwimming", ""},
{Scripting::TRIG_PLACE_STRUCTURE, "OnPlaceStructure", "OOLi"},
{Scripting::TRIG_PURCHASE_TICKET, "OnPurchaseTicket", "Ouuuub"},
{Scripting::TRIG_PURCHASE_TICKET_INSTANT_TRAVEL, "OnPurchaseTicketInstantTravel", "Ouuuub"},
{Scripting::TRIG_LOCATION_RECEIVED, "OnLocationReceived", "sOLf"},
{Scripting::TRIG_GET_ATTRIBS, "OnGetAttributes", "Os*[u*["},
{Scripting::TRIG_GET_SCRIPTVARS, "OnGetScriptvars", "Os*[u*["},
{Scripting::TRIG_SOCKET_USED, "OnSocketUsed", "s[i["},
{Scripting::TRIG_GET_RESPAWN_LOC, "OnGetRespawnLocation", "i*"},
{Scripting::TRIG_SKILL_ABOUT_TO_BE_GRANTED, "OnSkillAboutToBeGranted", "s"},
{Scripting::TRIG_SKILL_ABOUT_TO_BE_REVOKED, "OnSkillAboutToBeRevoked", "s"},
{Scripting::TRIG_SKILL_GRANTED, "OnSkillGranted", "s"},
{Scripting::TRIG_SKILL_REVOKED, "OnSkillRevoked", "s"},
{Scripting::TRIG_ATTRIB_MOD_DONE, "OnAttribModDone", "sb"},
{Scripting::TRIG_SKILL_MOD_DONE, "OnSkillModDone", "sb"},
{Scripting::TRIG_SKILLMODS_CHANGED, "OnSkillModsChanged", "s[i["},
{Scripting::TRIG_THEATER_CREATED, "OnTheaterCreated", "O[OO"},
{Scripting::TRIG_PLAYER_THEATER_FAIL, "OnPlayerTheaterFail", "ss"},
{Scripting::TRIG_GRANT_SCHEMATIC, "OnGrantedSchematic", "ib"},
{Scripting::TRIG_REVOKE_SCHEMATIC, "OnRevokedSchematic", "ib"},
{Scripting::TRIG_DO_STRUCTURE_ROLLUP, "OnDoStructureRollup", "Ob"},
//- added when changing to scripting system that verifies triggers
{Scripting::TRIG_UPLOAD_CHARACTER, "OnUploadCharacter", "V"},
{Scripting::TRIG_REQUEST_RESOURCE_WEIGHTS, "OnRequestResourceWeights", "Os[s[i[i[i["},
{Scripting::TRIG_FSQUEST_COMPLETED, "OnForceSensitiveQuestCompleted", "sb"},
{Scripting::TRIG_QUEST_COMPLETED, "OnQuestCompleted", "i"},
{Scripting::TRIG_QUEST_CLEARED, "OnQuestCleared", "i"},
//----------------------------------------------------------------------
//-- resource harvesting
{Scripting::TRIG_RESOURCE_HARVESTER_SET_ACTIVE, "OnResourceHarvesterSetActive", "Oi" },
{Scripting::TRIG_RESOURCE_HARVESTER_REQUEST_STATUS, "OnResourceHarvesterRequestStatus", "O" },
{Scripting::TRIG_RESOURCE_HARVESTER_REQUEST_RESOURCE_DATA, "OnResourceHarvesterRequestResourceData", "O" },
//----------------------------------------------------------------------
{Scripting::TRIG_OBJECT_MENU_SELECT, "OnObjectMenuSelect", "Oi" },
{Scripting::TRIG_OBJECT_MENU_REQUEST, "OnObjectMenuRequest", "Om*" },
// combat state triggers
{Scripting::TRIG_GET_STATE_INFO, "GetStateDescription", "S*S*"},
//----------------------------------------------------------------------
//-- Action state triggers
{Scripting::TRIG_WANDER_MOVING, "OnWanderMoving", ""},
{Scripting::TRIG_WANDER_WAYPOINT, "OnWanderWaypoint", ""},
{Scripting::TRIG_WANDER_WAITING, "OnWanderWaiting", "f*"},
{Scripting::TRIG_WANDER_PATH_NOT_FOUND, "OnWanderPathNotFound", ""},
{Scripting::TRIG_LOITER_MOVING, "OnLoiterMoving", ""},
{Scripting::TRIG_LOITER_WAYPOINT, "OnLoiterWaypoint", ""},
{Scripting::TRIG_LOITER_WAITING, "OnLoiterWaiting", "f*"},
{Scripting::TRIG_FOLLOW_TARGET_LOST, "OnFollowTargetLost", "O"},
{Scripting::TRIG_FOLLOW_WAITING, "OnFollowWaiting", "O"},
{Scripting::TRIG_FOLLOW_MOVING, "OnFollowMoving", "O"},
{Scripting::TRIG_FOLLOW_PATH_NOT_FOUND, "OnFollowPathNotFound", "O"},
{Scripting::TRIG_FLEE_TARGET_LOST, "OnFleeTargetLost", "O"},
{Scripting::TRIG_FLEE_WAYPOINT, "OnFleeWaypoint", "O"},
{Scripting::TRIG_FLEE_PATH_NOT_FOUND, "OnFleePathNotFound", "O"},
{Scripting::TRIG_MOVE_PATH_COMPLETE, "OnMovePathComplete", ""},
{Scripting::TRIG_MOVE_MOVING, "OnMoveMoving", ""},
{Scripting::TRIG_MOVE_PATH_NOT_FOUND, "OnMovePathNotFound", ""},
{Scripting::TRIG_MOVE_PATH_BLOCKED, "OnMovePathBlocked", ""},
//----------------------------------------------------------------------
//-- crafting triggers
{Scripting::TRIG_REQUEST_DRAFT_SCHEMATICS, "OnRequestDraftSchematics", "Oi[f["},
{Scripting::TRIG_CRAFTING_ADD_RESOURCE, "OnCraftingAddResource", "OOIi*["},
{Scripting::TRIG_MANUFACTURING_SCHEMATIC_CREATION, "OnManufacturingSchematicCreation", "OODi*i*"},
{Scripting::TRIG_CRAFTING_EXPERIMENT, "OnCraftingExperiment", "OOS[i[ii*i"},
{Scripting::TRIG_FINALIZE_SCHEMATIC, "OnFinalizeSchematic", "OOD"},
{Scripting::TRIG_MANUFACTURE_OBJECT, "OnManufactureObject", "OODbb"},
{Scripting::TRIG_CRAFTING_DONE, "OnCraftingDone", "Osib"},
{Scripting::TRIG_MAKE_CRAFTED_ITEM, "OnMakeCraftedItem", "ODf"},
//-----------------------------------------------------------------------
//-- mission triggers
{Scripting::TRIG_GRANT_MISSION, "OnGrantMission", "O"},
//-----------------------------------------------------------------------
//-- monitored creature movement
{Scripting::TRIG_MONITORED_CREATURE_MOVEMENT, "OnMonitoredCreatureMoved", "OLLf"},
{Scripting::TRIG_VOLUME_ENTERED, "OnTriggerVolumeEntered", "sO"},
{Scripting::TRIG_VOLUME_EXITED, "OnTriggerVolumeExited", "sO"},
{Scripting::TRIG_ABOUT_TO_OPEN_CONTAINER, "OnAboutToOpenContainer", "O"},
{Scripting::TRIG_OPENED_CONTAINER, "OnOpenedContainer", "O"},
{Scripting::TRIG_CLOSED_CONTAINER, "OnClosedContainer", "O"},
{Scripting::TRIG_SPAWN_HEARTBEAT, "OnSpawnHeartbeat", ""},
{Scripting::TRIG_REQUEST_SURVEY, "OnRequestSurvey", "Ou"},
{Scripting::TRIG_REQUEST_CORESAMPLE, "OnRequestCoreSample", "Ou"},
{Scripting::TRIG_PERMISSION_LIST_MODIFY, "OnPermissionListModify", "Ouuu"},
{Scripting::TRIG_LOCOMOTION_CHANGED, "OnLocomotionChanged", "ii"},
//----------------------------------------------------------------------
//-- group triggers
{Scripting::TRIG_GROUP_LEADER_CHANGED, "OnGroupLeaderChanged", "OOO"},
{Scripting::TRIG_REMOVED_FROM_GROUP, "OnRemovedFromGroup", "O"},
{Scripting::TRIG_GROUP_DISBANDED, "OnGroupDisbanded", "O"},
{Scripting::TRIG_ADDED_TO_GROUP, "OnAddedToGroup", "O"},
{Scripting::TRIG_GROUP_FORMED, "OnGroupFormed", "O"},
{Scripting::TRIG_GROUP_MEMBERS_CHANGED, "OnGroupMembersChanged", "OO[O[O["},
{Scripting::TRIG_LOOT_LOTTERY_SELECTED, "OnLootLotterySelected", "OO["},
//------------------------------------------------------------------------
//-- Universe Object triggers
{Scripting::TRIG_UNIVERSE_COMPLETE, "OnUniverseComplete", ""},
//------------------------------------------------------------------------
//-- Auction triggers
{Scripting::TRIG_AUCTION_ITEM, "OnAuctionItem", "Oi*"},
{Scripting::TRIG_REQUEST_AUCTION_FEE, "OnRequestAuctionFee", "OOObi*"},
{Scripting::TRIG_QUERY_AUCTIONS, "OnQueryAuctions", "OO"},
{Scripting::TRIG_MISSION_ENTRIES_CREATED, "OnMissionEntriesCreated", "O"},
{Scripting::TRIG_NEWBIE_TUTORIAL_RESPONSE, "OnNewbieTutorialResponse", "s"},
{Scripting::TRIG_IMMEDIATE_LOGOUT, "OnImmediateLogout", ""},
{Scripting::TRIG_SAW_ATTACK, "OnSawAttack", "OO["},
{Scripting::TRIG_GIVE_ITEM, "OnGiveItem", "OO"},
{Scripting::TRIG_SURVEY_DATA_RECEIVED, "OnSurveyDataReceived", "f[f[f["},
{Scripting::TRIG_APPLY_POWERUP, "OnApplyPowerup", "OO"},
{Scripting::TRIG_IMAGE_DESIGN_VALIDATE, "OnImageDesignValidate", "OOOiibssiibs[f[s[i[s"},
{Scripting::TRIG_IMAGE_DESIGN_COMPLETED, "OnImageDesignCompleted", "OOOiibssiibs[f[s[i[s"},
{Scripting::TRIG_IMAGE_DESIGN_CANCELED, "OnImageDesignCanceled", ""},
//------------------------------------------------------------------------
//-- Hibernation triggers
{Scripting::TRIG_HIBERNATE_BEGIN, "OnHibernateBegin", ""},
{Scripting::TRIG_HIBERNATE_END, "OnHibernateEnd", ""},
//------------------------------------------------------------------------
//-- Waypoint triggers
{Scripting::TRIG_WAYPOINT_CREATED, "OnWaypointCreated", "O"},
{Scripting::TRIG_WAYPOINT_DESTROYED, "OnWaypointDestroyed", "O"},
{Scripting::TRIG_WAYPOINT_ON_GET_ATTRIBUTES, "OnWaypointGetAttributes", "OOs*[u*["},
//------------------------------------------------------------------------
//-- Character transfer triggers
{Scripting::TRIG_START_CHARACTER_UPLOAD, "OnStartCharacterUpload", "U*[i*bb"},
{Scripting::TRIG_RECEIVE_CHARACTER_TRANSFER_STATUS_MESSAGE, "OnReceiveCharacterTransferStatusMessage", "s"},
{Scripting::TRIG_DOWNLOAD_CHARACTER, "OnDownloadCharacter", "U*["},
//------------------------------------------------------------------------
//-- Stomach update
{Scripting::TRIG_STOMACH_UPDATE, "OnStomachUpdate", ""},
//------------------------------------------------------------------------
//-- Cluster wide data manager
{Scripting::TRIG_RECEIVE_CLUSTER_WIDE_DATA_RESPONSE, "OnClusterWideDataResponse", "ssis[V[i"},
//------------------------------------------------------------------------
//-- Space triggers
{Scripting::TRIG_SHIP_HIT, "OnShipWasHit", "Oibiibfff"},
{Scripting::TRIG_SHIP_HITTING, "OnShipIsHitting", "Oii"},
{Scripting::TRIG_SHIP_BEHAVIOR_CHANGED, "OnShipBehaviorChanged", "ii"},
{Scripting::TRIG_SHIP_COMPONENT_POWER_SUFFICIENT, "OnShipComponentPowerSufficient", "if"},
{Scripting::TRIG_SHIP_COMPONENT_POWER_INSUFFICIENT, "OnShipComponentPowerInsufficient", "iff"},
{Scripting::TRIG_FORM_CREATEOBJECT, "OnFormCreateObject", "sfffOs[s["},
{Scripting::TRIG_FORM_EDITOBJECT, "OnFormEditObject", "Os[s["},
{Scripting::TRIG_FORM_REQUESTDATA, "OnFormRequestEditObject", "Os["},
{Scripting::TRIG_SHIP_COMPONENT_INSTALLING, "OnShipComponentInstalling", "OOi"},
{Scripting::TRIG_SHIP_COMPONENT_INSTALLED, "OnShipComponentInstalled", "Oi"},
{Scripting::TRIG_SHIP_COMPONENT_UNINSTALLING, "OnShipComponentUninstalling", "OiO"},
{Scripting::TRIG_SHIP_COMPONENT_UNINSTALLED, "OnShipComponentUninstalled", "OOiO"},
{Scripting::TRIG_SHIP_COMPONENT_ITEM_DROPPED_ON_SLOT, "OnDroppedItemOntoShipComponent", "iOO"},
{Scripting::TRIG_SHIP_TRY_TO_EQUIP_DROID_CONTROL_DEVICE_IN_SHIP, "OnTryToEquipDroidControlDeviceInShip", "OO"},
{Scripting::TRIG_SHIP_HIT_BY_LIGHTNING, "OnShipHitByLightning", "if"},
{Scripting::TRIG_SHIP_HIT_BY_ENVIRONMENT, "OnShipHitByEnvironment", "if"},
{Scripting::TRIG_SHIP_FIRED_MISSILE, "OnShipFiredMissile", "iiiOOi"},
{Scripting::TRIG_SHIP_TARGETED_BY_MISSILE, "OnShipTargetedByMissile", "iiiOOi"},
{Scripting::TRIG_SHIP_FIRED_COUNTERMEASURE, "OnShipFiredCountermeasure", "iO"},
{Scripting::TRIG_SPACE_UNIT_MOVE_TO_COMPLETE, "OnSpaceUnitMoveToComplete", ""},
{Scripting::TRIG_SPACE_UNIT_BEHAVIOR_CHANGED, "OnSpaceUnitBehaviorChanged", "ii"},
{Scripting::TRIG_SPACE_UNIT_FOLLOW_LOST, "OnSpaceUnitFollowLost", "O"},
{Scripting::TRIG_SPACE_UNIT_DOCKED, "OnSpaceUnitDocked", "O"},
{Scripting::TRIG_SPACE_UNIT_UNDOCKED, "OnSpaceUnitUnDocked", "Ob"},
{Scripting::TRIG_SPACE_UNIT_ENTER_COMBAT, "OnSpaceUnitEnterCombat", "O"},
{Scripting::TRIG_ABOUT_TO_LAUNCH_TO_SPACE, "OnAboutToLaunchIntoSpace", "OOO[ss"},
{Scripting::TRIG_SPACE_UNIT_START_UNDOCK, "OnSpaceUnitStartUnDock", "O"},
{Scripting::TRIG_SPACE_EJECT_PLAYER_FROM_SHIP, "OnSpaceEjectPlayerFromShip", ""},
{Scripting::TRIG_AI_PRIMARY_WEAPON_EQUIPPED, "OnAiPrimaryWeaponEquipped", "O"},
{Scripting::TRIG_AI_SECONDARY_WEAPON_EQUIPPED, "OnAiSecondaryWeaponEquipped", "O"},
{Scripting::TRIG_AI_RETREAT_COMPLETE, "OnAiTetherComplete", ""},
{Scripting::TRIG_HATE_TARGET_CHANGED, "OnHateTargetChanged", "O"},
{Scripting::TRIG_HATE_TARGET_ADDED, "OnHateTargetAdded", "O"},
{Scripting::TRIG_HATE_TARGET_REMOVED, "OnHateTargetRemoved", "O"},
{Scripting::TRIG_AI_RETREAT_START, "OnAiTetherStart", ""},
{Scripting::TRIG_INVULNERABLE_CHANGED, "OnInvulnerableChanged", "b"},
{Scripting::TRIG_AI_COMBAT_FRAME, "OnAiCombatFrame", ""},
{Scripting::TRIG_PROGRAM_DROID_COMMANDS, "OnCommitDroidProgramCommands", "Os[O[O["},
{Scripting::TRIG_SHIP_INTERNAL_DAMAGE_OVER_TIME_REMOVED, "OnShipInternalDamageOverTimeRemoved", "iff"},
{Scripting::TRIG_SHIP_DAMAGED_BY_INTERNAL_DAMAGE_OVER_TIME, "OnShipDamagedByInternalDamageOverTime", "ifff"},
//----------------------------------------------------------------------
//-- Chat
{Scripting::TRIG_CHAT_ON_LOGIN, "OnChatLogin", ""},
{Scripting::TRIG_CONTAINER_CHILD_GAIN_ITEM, "OnContainerChildGainItem", "OOO"},
{Scripting::TRIG_CONTAINER_CHILD_LOST_ITEM, "OnContainerChildLostItem", "OOOO"},
{Scripting::TRIG_QUEST_ACTIVATED, "OnQuestActivated", "i"},
{Scripting::TRIG_CRAFTED_PROTOTYPE, "OnCraftedPrototype", "OD"},
{Scripting::TRIG_ENTER_REGION, "OnEnterRegion", "ss"},
{Scripting::TRIG_EXIT_REGION, "OnExitRegion", "ss"},
//----------------------------------------------------------------------
{Scripting::TRIG_VENDOR_ITEM_COUNT_REPLY, "OnVendorItemCountReply", "ii"},
{Scripting::TRIG_VENDOR_STATUS_CHANGE, "OnVendorStatusChange", "i"},
{Scripting::TRIG_PLAYER_VENDOR_COUNT_REPLY, "OnPlayerVendorCountReply", "i"},
{Scripting::TRIG_TASK_ACTIVATED, "OnTaskActivated", "ii"},
{Scripting::TRIG_TASK_COMPLETED, "OnTaskCompleted", "ii"},
{Scripting::TRIG_TASK_FAILED, "OnTaskFailed", "ii"},
{Scripting::TRIG_TASK_CLEARED, "OnTaskCleared", "ii"},
{Scripting::TRIG_BEGIN_WARMUP, "OnBeginWarmup", "siif[sO" },
//----------------------------------------------------------------------
{Scripting::TRIG_BUILDOUT_OBJECT_REGISTER_WITH_CONTROLLER, "OnBuildoutObjectRegisterWithController", "O"},
{Scripting::TRIG_CYBERNETIC_CHANGE_REQUEST, "OnCyberneticChangeRequest", "OiO" },
{Scripting::TRIG_SOME_TASK_ACTIVATED, "OnSomeTaskActivated", "ii"},
{Scripting::TRIG_SOME_TASK_COMPLETED, "OnSomeTaskCompleted", "ii"},
{Scripting::TRIG_SOME_TASK_FAILED, "OnSomeTaskFailed", "ii"},
{Scripting::TRIG_SOME_TASK_CLEARED, "OnSomeTaskCleared", "ii"},
// params: player, ship, station, resource, amount
{Scripting::TRIG_SPACE_MINING_SELL_RESOURCE, "OnSpaceMiningSellResource", "OOOOi"},
{Scripting::TRIG_UNSTICKING, "OnUnsticking", ""},
{Scripting::TRIG_REQUEST_STATIC_ITEM_DATA, "OnRequestStaticItemData", "s"},
//----------------------------------------------------------------------
//-- Skills
{Scripting::TRIG_SKILL_TEMPLATE_CHANGED, "OnSkillTemplateChanged", "sb"},
{Scripting::TRIG_WORKING_SKILL_CHANGED, "OnWorkingSkillChanged", "sb"},
{Scripting::TRIG_COMBAT_LEVEL_CHANGED, "OnCombatLevelChanged", "ii"},
{Scripting::TRIG_QUEST_GRANT_REWARD, "OnQuestReceivedReward", "is"},
{Scripting::TRIG_GET_STATIC_ITEM_ATTRIBS, "OnGetStaticItemsAttributes", "ss*[u*["},
{Scripting::TRIG_HYPERSPACE_TO_HOME_LOCATION, "OnHyperspaceToHomeLocation", ""},
//----------------------------------------------------------------------
//-- CS stuff
{Scripting::TRIG_CS_CREATE_STATIC_ITEM, "OnCSCreateItem", "Os"},
{Scripting::TRIG_ON_CUSTOMIZE_FINISHED, "OnCustomizeFinished", "Os"},
{Scripting::TRIG_PVP_RANKING_CHANGED, "OnPvpRankingChanged", "ii"},
//-----------------------------------------------------------------------
//-- buff builder
{Scripting::TRIG_BUFF_BUILDER_VALIDATE, "OnBuffBuilderValidate", "OOiiibs[i["},
{Scripting::TRIG_BUFF_BUILDER_COMPLETED, "OnBuffBuilderCompleted", "OOiiibs[i["},
{Scripting::TRIG_BUFF_BUILDER_CANCELED, "OnBuffBuilderCanceled", ""},
//----------------------------------------------------------------------
//-- Building packing
{Scripting::TRIG_BUILDING_CONTENTS_LOADED, "OnContentsLoadedForBuildingToBePacked", "O"},
//-----------------------------------------------------------------------
//-- incubator
{Scripting::TRIG_INCUBATOR_COMMITTED, "OnIncubatorCommitted", "OOOOOOiiiiiiiiiiiiiii"},
{Scripting::TRIG_INCUBATOR_CANCELED, "OnIncubatorCancelled","OO"},
//-----------------------------------------------------------------------
//-- collection
{Scripting::TRIG_COLLECTION_SLOT_MODIFIED, "OnCollectionSlotModified", "ssssbiiib"},
{Scripting::TRIG_COLLECTION_SERVER_FIRST, "OnCollectionServerFirst", "sss"},
//-----------------------------------------------------------------------
//-- veteran reward
{Scripting::TRIG_CREATE_VETERAN_REWARD, "DoCreateVeteranReward", "s*["},
//-----------------------------------------------------------------------
//-- Storyteller location trigger
{Scripting::TRIG_GROUND_TARGET_LOC, "OnGroundTargetLoc", "Oifff"},
// Duel Trigger
{Scripting::TRIG_ON_DUEL_REQUEST, "OnDuelRequest","OO"},
{Scripting::TRIG_ON_DUEL_START, "OnDuelStart", "OO"},
{Scripting::TRIG_ON_ABOUT_TO_CHANGE_APPEARANCE, "OnAboutToChangeAppearance","Os"},
{Scripting::TRIG_ON_ABOUT_TO_REVERT_APPEARANCE, "OnAboutToRevertAppearance","O"},
// Group pickup point travel
{Scripting::TRIG_ABOUT_TO_TRAVEL_TO_GROUP_PICKUP_POINT, "OnAboutToTravelToGroupPickupPoint", ""},
{Scripting::TRIG_TRAVEL_TO_GROUP_PICKUP_POINT, "OnTravelToGroupPickupPoint", "ss"},
{Scripting::TRIG_CHANGED_APPEARANCE, "OnChangedAppearance", "O"},
{Scripting::TRIG_REVERTED_APPEARANCE, "OnRevertedAppearance", "O"},
{Scripting::TRIG_ON_DYNAMIC_SPAWN_REGION_CREATED, "OnDynamicSpawnRegionCreated", "Osfff"},
{Scripting::TRIG_DO_RESTORE_ITEM_DECORATION_LAYOUT, "DoRestoreItemDecorationLayout", "OOLbffff"},
{Scripting::TRIG_DO_RESTORE_ITEM_DECORATION_LAYOUT_ROTATION_ONLY, "DoRestoreItemDecorationLayoutRotationOnly", "Offff"},
{Scripting::TRIG_ON_RATING_FINISHED, "OnRatingFinished", "i"},
{Scripting::TRIG_ON_ABANDON_PLAYER_QUEST, "OnAbandonPlayerQuest", "O"},
{Scripting::TRIG_ON_GCW_SCORE_CATEGORY_PERCENTILE_CHANGE, "OnGcwScoreCategoryPercentileChange", "sii"},
//-- finish it up
{Scripting::TRIG_LAST_TRIGGER, NULL, NULL}
};
const int NUM_SCRIPT_FUNCTIONS = sizeof(ScriptFuncList) / sizeof(ScriptFuncList[0]) - 1;
//========================================================================
// globals
//========================================================================
Scripting::_ScriptFuncHashMap *Scripting::ScriptFuncHashMap = NULL;
//========================================================================
// initialize the ScriptFuncHashMap
//========================================================================
/**
* Initialize the ScriptFuncHashMap
*/
void Scripting::InitScriptFuncHashMap(void)
{
Scripting::ScriptFuncHashMap = new Scripting::_ScriptFuncHashMap(NUM_SCRIPT_FUNCTIONS);
for (int i = 0; i < NUM_SCRIPT_FUNCTIONS; ++i)
IGNORE_RETURN(Scripting::ScriptFuncHashMap->insert(std::make_pair(static_cast<int>(ScriptFuncList[i].id), &ScriptFuncList[i])));
} // InitScriptFuncHashMap
/**
* Cleans up memory.
*/
void Scripting::RemoveScriptFuncHashMap(void)
{
if (Scripting::ScriptFuncHashMap)
delete Scripting::ScriptFuncHashMap;
Scripting::ScriptFuncHashMap = NULL;
}
@@ -0,0 +1,505 @@
//========================================================================
//
// ScriptFuncTable.h - Default values for initializing the script function list.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#ifndef _INCLUDED_ScriptFuncTable_H
#define _INCLUDED_ScriptFuncTable_H
#include <unordered_map>
namespace Scripting
{
/* This is the id list for supported trigger types.
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* When you add to this list, make sure you enter your trigger in
* ScriptFunctionTable.cpp
* base_class.java
* base_script.script
* =================================================================
* I MEAN IT!
*/
enum TrigId
{
TRIG_ATTACH = 0,
TRIG_DETACH = 1,
TRIG_SPEAKING = 2,
TRIG_HEAR_SPEECH_STRING = 3,
TRIG_HEAR_SPEECH_STRINGID = 4,
TRIG_INSPECTED = 5,
TRIG_LOGOUT = 6,
TRIG_LOGIN = 7,
TRIG_ITEM_EQUIP = 8,
TRIG_ITEM_UNEQUIP = 9,
TRIG_TARGET_EQUIPS_ITEM = 10,
TRIG_TARGET_UNEQUIPS_ITEM = 11,
TRIG_ABOUT_TO_RECEIVE_ITEM = 12,
TRIG_RECEIVED_ITEM = 13,
TRIG_ABOUT_TO_BE_XFERRED = 14,
TRIG_XFERRED = 15,
TRIG_ABOUT_TO_LOSE_ITEM = 16,
TRIG_LOST_ITEM = 17,
TRIG_LOADED_FROM_DB = 18,
TRIG_UNLOADED_FROM_MEMORY = 19,
TRIG_DECAY = 20,
TRIG_DESTROY = 21,
TRIG_SERVER_TRANSFER = 22,
TRIG_MADE_AUTHORITATIVE = 23,
TRIG_INCAPACITATED = 24,
TRIG_ABOUT_TO_DIE = 25,
TRIG_DEATH = 26,
// TRIG_COMBAT_LOOP = 27,
TRIG_DEFENDER_COMBAT_ACTION = 28,
TRIG_ATTACKER_COMBAT_ACTION = 29,
TRIG_WEAPON_COMBAT_ACTION = 30,
// TRIG_WAS_HIT = 31,
TRIG_INCAPACITATE_TARGET = 32,
// TRIG_SAW_INCAPACITATION = 33,
// TRIG_SAW_DEATH = 34,
// TRIG_SAW_ATTACK = 35,
//TRIG_FUMBLE = 36,
TRIG_ADDED_TO_WORLD = 37,
TRIG_REMOVING_FROM_WORLD = 38,
TRIG_PRELOAD_COMPLETE = 39,
//TRIG_REPATH_COMPLETE = 40,
TRIG_GET_STATE_INFO = 41,
TRIG_BEHAVIOR_CHANGE = 46,
//TRIG_PATH_COMPLETE = 47,
//TRIG_TARGET_LOST = 48,
TRIG_START_NPC_CONVERSATION = 49,
TRIG_END_NPC_CONVERSATION = 50,
TRIG_NPC_CONVERSATION_RESPONSE = 51,
TRIG_TARGET_CHANGE = 52,
TRIG_RESOURCE_HARVESTER_SET_ACTIVE = 53,
TRIG_RESOURCE_HARVESTER_REQUEST_STATUS = 54,
TRIG_RESOURCE_HARVESTER_REQUEST_RESOURCE_DATA = 55,
TRIG_OBJECT_MENU_SELECT = 56,
TRIG_OBJECT_MENU_REQUEST = 57,
// TRIG_MY_WEAPON_IS_MISSING = 58,
// TRIG_COMBAT_QUEUE_EMPTIED = 59,
// TRIG_WAS_MISSED = 60,
// TRIG_IS_MISSING = 61,
TRIG_RECAPACITATED = 62,
TRIG_WANDER_MOVING = 63,
TRIG_WANDER_WAYPOINT = 64,
TRIG_WANDER_WAITING = 65,
TRIG_WANDER_PATH_NOT_FOUND = 66,
TRIG_LOITER_MOVING = 67,
TRIG_LOITER_WAYPOINT = 68,
TRIG_LOITER_WAITING = 69,
TRIG_FOLLOW_TARGET_LOST = 75,
TRIG_FOLLOW_WAITING = 76,
TRIG_FOLLOW_MOVING = 77,
TRIG_FOLLOW_PATH_NOT_FOUND = 79,
TRIG_FLEE_TARGET_LOST = 80,
TRIG_FLEE_WAYPOINT = 81,
TRIG_FLEE_PATH_NOT_FOUND = 48,
TRIG_MOVE_PATH_COMPLETE = 47,
TRIG_MOVE_MOVING = 40,
TRIG_MOVE_PATH_NOT_FOUND = 36,
TRIG_INITIALIZE = 82,
TRIG_REQUEST_DRAFT_SCHEMATICS = 83,
TRIG_MANUFACTURING_SCHEMATIC_CREATION = 84,
TRIG_CRAFTING_EXPERIMENT = 85,
TRIG_MANUFACTURE_OBJECT = 86,
TRIG_CRAFTING_DONE = 87,
TRIG_ARRIVE_AT_LOCATION = 88,
// TRIG_EXITED_LOCATION = 89,
TRIG_GRANT_MISSION = 90,
TRIG_COMBAT_TARGETED = 91,
TRIG_COMBAT_UNTARGETED = 92,
TRIG_PLAYER_REQUEST_MISSION_BOARD = 93,
TRIG_CRAFTING_ADD_RESOURCE = 94,
TRIG_MONITORED_CREATURE_MOVEMENT = 96,
TRIG_OUT_OF_AMMO = 97,
TRIG_OBJECT_DISABLED = 98,
TRIG_VOLUME_ENTERED = 99,
TRIG_VOLUME_EXITED = 100,
TRIG_MODIFY_WEAPON_DAMAGE = 102,
TRIG_ENTERED_COMBAT = 103,
TRIG_EXITED_COMBAT = 104,
TRIG_CHANGED_POSTURE = 105,
TRIG_COMBAT_DAMAGED = 106,
TRIG_COMBAT_LOST_TARGET = 107,
TRIG_SAW_EMOTE = 108,
TRIG_OPENED_CONTAINER = 110,
TRIG_CLOSED_CONTAINER = 111,
TRIG_SPAWN_HEARTBEAT = 112,
TRIG_PVP_TYPE_CHANGED = 113,
TRIG_PVP_FACTION_CHANGED = 114,
TRIG_CITY_CHANGED = 115,
TRIG_ENTER_SWIMMING = 116,
TRIG_EXIT_SWIMMING = 117,
TRIG_PLACE_STRUCTURE = 118,
TRIG_ABOUT_TO_OPEN_CONTAINER = 119,
TRIG_REQUEST_SURVEY = 120,
TRIG_PERMISSION_LIST_MODIFY = 121,
TRIG_PURCHASE_TICKET = 122,
TRIG_GROUP_LEADER_CHANGED = 123,
TRIG_REMOVED_FROM_GROUP = 124,
TRIG_GROUP_DISBANDED = 125,
TRIG_ADDED_TO_GROUP = 126,
TRIG_GROUP_FORMED = 127,
TRIG_GET_ATTRIBS = 128,
TRIG_REQUEST_CORESAMPLE = 129,
TRIG_UNIVERSE_COMPLETE = 130,
TRIG_AUCTION_ITEM = 131,
TRIG_MISSION_ENTRIES_CREATED = 132,
TRIG_NEWBIE_TUTORIAL_RESPONSE = 133,
TRIG_IMMEDIATE_LOGOUT = 134,
TRIG_CREATURE_DAMAGED = 135,
TRIG_OBJECT_DAMAGED = 136,
TRIG_SAW_ATTACK = 137,
TRIG_GIVE_ITEM = 138,
TRIG_SURVEY_DATA_RECEIVED = 139,
TRIG_APPLY_POWERUP = 140,
TRIG_IMAGE_DESIGN_VALIDATE = 141,
TRIG_IMAGE_DESIGN_COMPLETED = 142,
TRIG_HIBERNATE_BEGIN = 143,
TRIG_HIBERNATE_END = 144,
TRIG_SOCKET_USED = 145,
TRIG_QUERY_AUCTIONS = 146,
TRIG_REQUEST_AUCTION_FEE = 147,
// TRIG_IMAGE_DESIGN_REQUESTCONSENT = 148,
TRIG_GET_RESPAWN_LOC = 149,
TRIG_WAYPOINT_CREATED = 150,
TRIG_WAYPOINT_DESTROYED = 151,
TRIG_WAYPOINT_ON_GET_ATTRIBUTES = 152,
TRIG_FINALIZE_SCHEMATIC = 153,
TRIG_SKILL_GRANTED = 154,
TRIG_SKILL_REVOKED = 155,
TRIG_MAKE_CRAFTED_ITEM = 156,
TRIG_START_CHARACTER_UPLOAD = 157,
TRIG_RECEIVE_CHARACTER_TRANSFER_STATUS_MESSAGE = 158,
TRIG_LOCATION_RECEIVED = 159,
TRIG_ATTRIB_MOD_DONE = 160,
TRIG_SKILL_MOD_DONE = 161,
TRIG_STOMACH_UPDATE = 162,
TRIG_RECEIVE_CLUSTER_WIDE_DATA_RESPONSE = 163,
TRIG_IMAGE_DESIGN_CANCELED = 164,
TRIG_DOWNLOAD_CHARACTER = 165,
TRIG_PERFORM_EMOTE = 166,
TRIG_CHAT_ON_LOGIN = 167,
TRIG_ABOUT_TO_BE_INCAPACITATED = 168,
TRIG_SKILL_ABOUT_TO_BE_GRANTED = 169,
TRIG_SKILL_ABOUT_TO_BE_REVOKED = 170,
TRIG_CONTAINER_CHILD_GAIN_ITEM = 171,
TRIG_CONTAINER_CHILD_LOST_ITEM = 172,
TRIG_QUEST_ACTIVATED = 173,
TRIG_CRAFTED_PROTOTYPE = 174,
TRIG_THEATER_CREATED = 175,
TRIG_ENTER_REGION = 176,
TRIG_EXIT_REGION = 177,
TRIG_VENDOR_ITEM_COUNT_REPLY = 178,
TRIG_VENDOR_STATUS_CHANGE = 179,
TRIG_PLAYER_THEATER_FAIL = 180,
TRIG_GRANT_SCHEMATIC = 181,
TRIG_REVOKE_SCHEMATIC = 182,
TRIG_PLAYER_VENDOR_COUNT_REPLY = 183,
TRIG_SHIP_HIT = 200,
TRIG_SHIP_HITTING = 201,
TRIG_SHIP_BEHAVIOR_CHANGED = 202,
TRIG_SHIP_COMPONENT_POWER_SUFFICIENT = 203,
TRIG_SHIP_COMPONENT_POWER_INSUFFICIENT = 204,
TRIG_FORM_CREATEOBJECT = 205,
TRIG_FORM_EDITOBJECT = 206,
TRIG_FORM_REQUESTDATA = 207,
TRIG_SHIP_COMPONENT_INSTALLING = 208,
TRIG_SHIP_COMPONENT_INSTALLED = 209,
TRIG_SHIP_COMPONENT_UNINSTALLING = 210,
TRIG_SHIP_COMPONENT_UNINSTALLED = 211,
TRIG_SHIP_COMPONENT_ITEM_DROPPED_ON_SLOT = 212,
TRIG_SHIP_TRY_TO_EQUIP_DROID_CONTROL_DEVICE_IN_SHIP = 213,
TRIG_SHIP_HIT_BY_LIGHTNING = 214,
TRIG_SHIP_HIT_BY_ENVIRONMENT = 215,
TRIG_SHIP_FIRED_MISSILE = 216,
TRIG_SHIP_TARGETED_BY_MISSILE = 217,
TRIG_SHIP_FIRED_COUNTERMEASURE = 218,
TRIG_SPACE_UNIT_MOVE_TO_COMPLETE = 219,
TRIG_SPACE_UNIT_BEHAVIOR_CHANGED = 220,
TRIG_SPACE_UNIT_FOLLOW_LOST = 221,
TRIG_SHIP_INTERNAL_DAMAGE_OVER_TIME_REMOVED = 222,
TRIG_SHIP_DAMAGED_BY_INTERNAL_DAMAGE_OVER_TIME = 223,
TRIG_SPACE_UNIT_DOCKED = 224,
TRIG_SPACE_UNIT_UNDOCKED = 225,
TRIG_SPACE_UNIT_ENTER_COMBAT = 226,
TRIG_ABOUT_TO_LAUNCH_TO_SPACE = 227,
TRIG_SPACE_UNIT_START_UNDOCK = 228,
TRIG_SPACE_EJECT_PLAYER_FROM_SHIP = 229,
TRIG_TASK_ACTIVATED = 230,
TRIG_TASK_COMPLETED = 231,
TRIG_TASK_FAILED = 232,
TRIG_TASK_CLEARED = 233,
TRIG_PROGRAM_DROID_COMMANDS = 234,
TRIG_START_CONVERSATION = 235,
TRIG_END_CONVERSATION = 236,
TRIG_BEGIN_WARMUP = 237,
TRIG_LOOT_LOTTERY_SELECTED = 238,
TRIG_AI_PRIMARY_WEAPON_EQUIPPED = 239,
TRIG_AI_SECONDARY_WEAPON_EQUIPPED = 240,
TRIG_BUILDOUT_OBJECT_REGISTER_WITH_CONTROLLER = 241,
TRIG_CYBERNETIC_CHANGE_REQUEST = 242,
TRIG_SOME_TASK_ACTIVATED = 243,
TRIG_SOME_TASK_COMPLETED = 244,
TRIG_SOME_TASK_FAILED = 245,
TRIG_SOME_TASK_CLEARED = 246,
TRIG_SPACE_MINING_SELL_RESOURCE = 247,
TRIG_AI_RETREAT_COMPLETE = 248,
TRIG_HATE_TARGET_CHANGED = 249,
TRIG_HATE_TARGET_ADDED = 250,
TRIG_HATE_TARGET_REMOVED = 251,
TRIG_AI_RETREAT_START = 252,
TRIG_DO_STRUCTURE_ROLLUP = 253,
TRIG_GET_SCRIPTVARS = 254,
//TRIG_DEFAULT_ATTACK = 255,
TRIG_INVULNERABLE_CHANGED = 256,
TRIG_UNSTICKING = 257,
TRIG_AI_COMBAT_FRAME = 258,
TRIG_UPLOAD_CHARACTER = 259,
TRIG_REQUEST_RESOURCE_WEIGHTS = 260,
TRIG_FSQUEST_COMPLETED = 261,
TRIG_MOVE_PATH_BLOCKED = 262,
TRIG_QUEST_COMPLETED = 263,
TRIG_QUEST_CLEARED = 264,
TRIG_GROUP_MEMBERS_CHANGED= 265,
TRIG_ENVIRONMENTAL_DEATH=266,
TRIG_LOCOMOTION_CHANGED= 267,
TRIG_REQUEST_STATIC_ITEM_DATA = 268,
TRIG_SKILL_TEMPLATE_CHANGED = 269,
TRIG_WORKING_SKILL_CHANGED = 270,
TRIG_COMBAT_LEVEL_CHANGED = 271,
TRIG_QUEST_GRANT_REWARD = 272,
TRIG_SKILLMODS_CHANGED = 273,
TRIG_GET_STATIC_ITEM_ATTRIBS = 274,
TRIG_PURCHASE_TICKET_INSTANT_TRAVEL = 275,
TRIG_HYPERSPACE_TO_HOME_LOCATION = 276,
TRIG_CS_CREATE_STATIC_ITEM = 277,
TRIG_ON_CUSTOMIZE_FINISHED = 278,
TRIG_PVP_RANKING_CHANGED = 279,
TRIG_BUFF_BUILDER_VALIDATE = 280,
TRIG_BUFF_BUILDER_COMPLETED = 281,
TRIG_BUFF_BUILDER_CANCELED = 282,
TRIG_BUILDING_CONTENTS_LOADED = 283,
TRIG_INCUBATOR_COMMITTED = 284,
TRIG_INCUBATOR_CANCELED = 285,
TRIG_COLLECTION_SLOT_MODIFIED = 286,
TRIG_COLLECTION_SERVER_FIRST = 287,
TRIG_CREATE_VETERAN_REWARD = 288,
TRIG_GROUND_TARGET_LOC = 289,
TRIG_ON_DUEL_REQUEST = 290,
TRIG_ON_DUEL_START = 291,
TRIG_ON_ABOUT_TO_CHANGE_APPEARANCE = 292,
TRIG_ON_ABOUT_TO_REVERT_APPEARANCE = 293,
TRIG_ABOUT_TO_TRAVEL_TO_GROUP_PICKUP_POINT = 294,
TRIG_TRAVEL_TO_GROUP_PICKUP_POINT = 295,
TRIG_CHANGED_APPEARANCE = 296,
TRIG_REVERTED_APPEARANCE = 297,
TRIG_ON_DYNAMIC_SPAWN_REGION_CREATED = 298,
TRIG_DO_RESTORE_ITEM_DECORATION_LAYOUT = 299,
TRIG_DO_RESTORE_ITEM_DECORATION_LAYOUT_ROTATION_ONLY = 300,
TRIG_ON_RATING_FINISHED = 301,
TRIG_ON_ABANDON_PLAYER_QUEST = 302,
TRIG_ON_GCW_SCORE_CATEGORY_PERCENTILE_CHANGE = 303,
TRIG_LAST_TRIGGER
};
// This is a sample object for describing the specifics of a supported trigger.
// It contains the Trigger id, the name of the function to be invoked for that
// trigger, and the argument type list. Argument types are described using the
// Python specification without the return type. All triggers are assumed to
// return an int indicating stop or continue. e.g. "is" would specify that the
// function took an integer for the first parameter, and a string for the second.
struct ScriptFuncTable
{
TrigId id;
const char *name;
const char *argList;
};
typedef std::unordered_map< int, const ScriptFuncTable * > _ScriptFuncHashMap;
extern _ScriptFuncHashMap *ScriptFuncHashMap;
extern void InitScriptFuncHashMap(void);
extern void RemoveScriptFuncHashMap(void);
}
#endif // _INCLUDED_ScriptFuncTable_H
@@ -0,0 +1,38 @@
// ======================================================================
//
// ScriptListEntry.cpp
//
// Copyright 2003 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/ScriptListEntry.h"
#include "serverScript/GameScriptObject.h"
// ======================================================================
std::string const &ScriptListEntry::getScriptName() const
{
static const std::string emptyString;
if (m_data != NULL)
return m_data->first;
WARNING_STRICT_FATAL(true, ("ScriptListEntry::getScriptName called with m_data = NULL"));
return emptyString;
}
// ----------------------------------------------------------------------
ScriptData &ScriptListEntry::getScriptData() const
{
static ScriptData emptyData;
if (m_data != NULL)
return m_data->second;
WARNING_STRICT_FATAL(true, ("ScriptListEntry::getScriptData called with m_data = NULL"));
return emptyData;
}
// ======================================================================
@@ -0,0 +1,62 @@
// ======================================================================
//
// ScriptListEntry.h
//
// Copyright 2003 Sony Online Entertainment
//
// ======================================================================
#ifndef _ScriptListEntry_H_
#define _ScriptListEntry_H_
// ======================================================================
struct ScriptData;
// ======================================================================
class ScriptListEntry
{
public:
ScriptListEntry();
ScriptListEntry(std::pair<const std::string, ScriptData> * data);
bool operator==(ScriptListEntry const &rhs) const;
bool isValid() const;
std::string const &getScriptName() const;
ScriptData &getScriptData() const;
private:
std::pair<const std::string, ScriptData> *m_data;
};
// ----------------------------------------------------------------------
inline ScriptListEntry::ScriptListEntry() :
m_data(0)
{
}
// ----------------------------------------------------------------------
inline ScriptListEntry::ScriptListEntry(std::pair<const std::string, ScriptData> * data) :
m_data(data)
{
}
// ----------------------------------------------------------------------
inline bool ScriptListEntry::operator==(ScriptListEntry const &rhs) const
{
return m_data == rhs.m_data;
}
// ----------------------------------------------------------------------
inline bool ScriptListEntry::isValid() const
{
return m_data != NULL;
}
// ======================================================================
#endif // _ScriptListEntry_H_
@@ -0,0 +1,48 @@
// ScriptMessage.cpp
// copyright 2001 Sony Online Entertainment
// Author: Justin Randall
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/ScriptMessage.h"
#include "serverScript/ScriptDictionary.h"
//-----------------------------------------------------------------------
ScriptMessage::ScriptMessage(const std::string & sourceScriptName, const std::string & scriptFunctionName, const ScriptDictionary & parameters) :
MessageBase(scriptFunctionName.c_str()),
m_parameters(parameters),
m_scriptFunctionName(scriptFunctionName),
m_sourceScriptName(sourceScriptName)
{
}
//-----------------------------------------------------------------------
ScriptMessage::ScriptMessage(const ScriptMessage & source) :
MessageBase(source.getType()),
m_parameters(source.getParameters()),
m_scriptFunctionName(source.getScriptFunctionName())
{
}
//-----------------------------------------------------------------------
ScriptMessage::~ScriptMessage()
{
}
//-----------------------------------------------------------------------
ScriptMessage & ScriptMessage::operator = (const ScriptMessage & rhs)
{
if(this != &rhs)
{
// make assignments if right hand side is not this instance
}
return *this;
}
//-----------------------------------------------------------------------
@@ -0,0 +1,63 @@
// ScriptMessage.h
// copyright 2001 Sony Online Entertainment
// Author: Justin Randall
#ifndef _INCLUDED_ScriptMessage_H
#define _INCLUDED_ScriptMessage_H
//-----------------------------------------------------------------------
#include "sharedMessageDispatch/Message.h"
#include <string>
class ScriptParams;
class ScriptDictionary;
//-----------------------------------------------------------------------
class ScriptMessage : public MessageDispatch::MessageBase
{
public:
ScriptMessage (const std::string & sourceScript, const std::string & scriptFunctionName, const ScriptDictionary & parameters);
~ScriptMessage ();
const ScriptDictionary & getParameters () const;
const std::string & getScriptFunctionName () const;
const std::string & getSourceScriptName () const;
private:
ScriptMessage & operator = (const ScriptMessage & rhs);
ScriptMessage (const ScriptMessage & source);
ScriptMessage();
private:
const ScriptDictionary & m_parameters;
const std::string m_scriptFunctionName;
const std::string m_sourceScriptName;
};
//-----------------------------------------------------------------------
inline const ScriptDictionary & ScriptMessage::getParameters() const
{
return m_parameters;
}
//-----------------------------------------------------------------------
inline const std::string & ScriptMessage::getScriptFunctionName() const
{
return m_scriptFunctionName;
}
//-----------------------------------------------------------------------
inline const std::string & ScriptMessage::getSourceScriptName() const
{
return m_sourceScriptName;
}
//-----------------------------------------------------------------------
#endif // _INCLUDED_ScriptMessage_H
@@ -0,0 +1,491 @@
//========================================================================
//
// ScriptMethodsActionStatesNamespace.cpp - implements script methods dealing with action states
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/AiCreatureController.h"
#include "serverGame/CellObject.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/ServerWorld.h"
#include "sharedFoundation/DynamicVariableList.h"
#include "sharedObject/CellProperty.h"
#include "sharedObject/NetworkIdManager.h"
using namespace JNIWrappersNamespace;
//========================================================================
// ScriptMethodsActionStatesNamespace
//========================================================================
namespace ScriptMethodsActionStatesNamespace
{
bool install();
jboolean JNICALL wanderAngleDelay(JNIEnv *env, jobject self, jlong mob, jfloat minDist, jfloat maxDist, jfloat minAngle, jfloat maxAngle, jfloat minDelay, jfloat maxDelay);
void JNICALL setCreatureStatic(JNIEnv *env, jobject self, jlong creature, jboolean value);
void JNICALL stop(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL follow(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat minDistance, jfloat maxDistance);
jboolean JNICALL followOffset(JNIEnv *env, jobject self, jlong mob, jlong target, jobject offset);
jboolean JNICALL swarm(JNIEnv *env, jobject self, jlong mob, jlong target);
jboolean JNICALL swarm2(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat offset);
jboolean JNICALL flee(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat minDistance, jfloat maxDistance);
jboolean JNICALL suspendMovement(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL resumeMovement(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL hasSuspendedMovement(JNIEnv *env, jobject self, jlong mob);
jfloat JNICALL getAcceleration(JNIEnv *env, jobject self, jlong mob, jint movementType);
jfloat JNICALL getTurnRate(JNIEnv *env, jobject self, jlong mob, jint movementType);
jfloat JNICALL getStepHeight(JNIEnv *env, jobject self, jlong mob);
jfloat JNICALL getApproachTriggerRange(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL isCreatureStatic(JNIEnv *env, jobject self, jlong creature);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsActionStatesNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsActionStatesNamespace::c)}
JF("_wanderAngleDelay", "(JFFFFFF)Z", wanderAngleDelay),
JF("_setCreatureStatic", "(JZ)V", setCreatureStatic),
JF("_stop", "(J)V", stop),
JF("_follow", "(JJFF)Z", follow),
JF("_follow", "(JJLscript/location;)Z", followOffset),
JF("_swarm", "(JJ)Z", swarm),
JF("_swarm", "(JJF)Z", swarm2),
JF("_flee", "(JJFF)Z", flee),
JF("_suspendMovement", "(J)Z", suspendMovement),
JF("_resumeMovement", "(J)Z", resumeMovement),
JF("_hasSuspendedMovement", "(J)Z", hasSuspendedMovement),
JF("_getAcceleration", "(JI)F",getAcceleration),
JF("_getTurnRate", "(JI)F",getTurnRate),
JF("_getStepHeight", "(J)F",getStepHeight),
JF("_getApproachTriggerRange", "(J)F",getApproachTriggerRange),
JF("_isCreatureStatic", "(J)Z", isCreatureStatic),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI action state callback methods
//========================================================================
/**
* Sets a creature into the "Stop" state where he doesn't do anything.
*
* @param env Java environment
* @param self class calling this function
* @param target id of creature to access
*
* @return JNI_TRUE if the creature stopped, or false if there was an error
*/
void JNICALL ScriptMethodsActionStatesNamespace::stop(JNIEnv *env, jobject , jlong ai)
{
CreatureObject * aiCreatureObject = 0;
AICreatureController * aiCreatureController = 0;
if (!JavaLibrary::getObjectController(ai, aiCreatureObject, aiCreatureController))
{
return;
}
if (aiCreatureController->isRetreating())
{
JAVA_THROW_SCRIPT_EXCEPTION(ConfigServerGame::getMovementWhileRetreatingThrowsException(),
("ScriptMethodsActionStatesNamespace::stop() ai(%s) Calling a movement command on a retreating AI is not allowed.", aiCreatureObject->getDebugInformation().c_str()));
return;
}
aiCreatureController->stop();
}
/**
* Sets a creature into the "Follow" state where he follows someone else around.
*
* @param env Java environment
* @param self class calling this function
* @param mob id of creature to access
* @param target target id of creature to follow
* @param minDist closest to get to creature
* @param maxDist farthest to get from target
*
* @return JNI_TRUE if the creature stopped, or false if there was an error
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::follow(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat minDist, jfloat maxDist)
{
UNREF(self);
if (mob == 0 || target == 0)
return JNI_FALSE;
CreatureObject * object = 0;
AICreatureController * controller = 0;
jboolean result=JNI_FALSE;
if (!JavaLibrary::getObjectController(mob, object, controller))
return result;
NetworkId mobId = object->getNetworkId();
NetworkId targetId(target);
if(mobId == targetId)
{
JavaLibrary::throwInternalScriptError("ScriptMethodsActionStatesNamespace::follow - Creature is trying to follow itself\n");
return JNI_FALSE;
}
if (controller->follow(NetworkId(target), minDist, maxDist))
result = JNI_TRUE;
return result;
}
/**
* Sets a creature into the "Follow" state where he follows someone else around.
*
* @param env Java environment
* @param self class calling this function
* @param mob id of creature to access
* @param target target id of creature to follow
* @param minDist closest to get to creature
* @param maxDist farthest to get from target
*
* @return JNI_TRUE if the creature stopped, or false if there was an error
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::followOffset(JNIEnv *env, jobject self, jlong mob, jlong target, jobject offset)
{
UNREF(self);
if (mob == 0 || target == 0)
return JNI_FALSE;
CreatureObject * object = 0;
AICreatureController * controller = 0;
jboolean result=JNI_FALSE;
if (!JavaLibrary::getObjectController(mob, object, controller))
return result;
Vector location;
NetworkId cell;
ScriptConversion::convert(offset, location, cell, object->getPosition_w());
NetworkId mobId = object->getNetworkId();
NetworkId targetId(target);
if(mobId == targetId)
{
JavaLibrary::throwInternalScriptError("ScriptMethodsActionStatesNamespace::followOffset - Creature is trying to follow itself\n");
return JNI_FALSE;
}
if (controller->follow(NetworkId(target), location))
result = JNI_TRUE;
return result;
}
/**
* Sets a creature into the "Swarm" state where he and his comrades try to follow and surround the target.
*
* @param env Java environment
* @param self class calling this function
* @param mob id of creature to access
* @param target target id of creature to follow
* @param minDist closest to get to creature
* @param maxDist farthest to get from target
*
* @return JNI_TRUE if the creature stopped, or false if there was an error
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::swarm(JNIEnv *env, jobject self, jlong mob, jlong target)
{
UNREF(self);
if (mob == 0 || target == 0)
return JNI_FALSE;
CreatureObject * object = 0;
AICreatureController * controller = 0;
jboolean result=JNI_FALSE;
if (!JavaLibrary::getObjectController(mob, object, controller))
return result;
NetworkId mobId = object->getNetworkId();
NetworkId targetId(target);
if(mobId == targetId)
{
JavaLibrary::throwInternalScriptError("ScriptMethodsActionStatesNamespace::swarm - Creature is trying to swarm itself\n");
return JNI_FALSE;
}
if (controller->swarm(NetworkId(target)))
result = JNI_TRUE;
return result;
}
/**
* Sets a creature into the "Swarm" state where he and his comrades try to follow and surround the target.
*
* @param env Java environment
* @param self class calling this function
* @param mob id of creature to access
* @param target target id of creature to follow
* @param offset how far away to stay from the target
*
* @return JNI_TRUE if the creature stopped, or false if there was an error
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::swarm2(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat offset)
{
UNREF(self);
if (mob == 0 || target == 0)
return JNI_FALSE;
CreatureObject * object = 0;
AICreatureController * controller = 0;
jboolean result=JNI_FALSE;
if (!JavaLibrary::getObjectController(mob, object, controller))
return result;
NetworkId mobId = object->getNetworkId();
NetworkId targetId(target);
if(mobId == targetId)
{
JavaLibrary::throwInternalScriptError("ScriptMethodsActionStatesNamespace::swarm - Creature is trying to swarm itself\n");
return JNI_FALSE;
}
if (controller->swarm(NetworkId(target), offset))
result = JNI_TRUE;
return result;
}
/**
* Sets a creature into the "Flee" state where he runs away from another object.
*
* @param env Java environment
* @param self class calling this function
* @param mob id of creature to access
* @param target target id of creature to flee
*
* @return JNI_TRUE if the creature stopped, or false if there was an error
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::flee(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat minDistance, jfloat maxDistance)
{
UNREF(self);
if (mob == 0 || target == 0)
return JNI_FALSE;
CreatureObject * object = 0;
AICreatureController * controller = 0;
jboolean result=JNI_FALSE;
if (!JavaLibrary::getObjectController(mob, object, controller))
return result;
NetworkId mobId = object->getNetworkId();
NetworkId targetId(target);
if(mobId == targetId)
{
JavaLibrary::throwInternalScriptError("ScriptMethodsActionStatesNamespace::flee - Creature is trying to flee from itself\n");
return JNI_FALSE;
}
if (controller->flee(NetworkId(target), minDistance, maxDistance))
result = JNI_TRUE;
return result;
}
/**
* Sets a creature into the "Wander" state where he wanders around somewhat aimlessly. The wandering is broken into legs,
* each of which is between minDist and maxDist distance. After each leg he will turn either left or right at an angle between
* minAngle and maxAngle degrees.
*
* @param env Java environment
* @param self class calling this function
* @param mob id of creature to access
* @param minDist minimum length of a leg
* @param maxDist maximum length of a leg
* @param minAngle minimum angle to turn after a leg
* @param maxAngle maximum angle to turn after a leg
* @param minDelay minimum time to wait between movements
* @param maxDelay maximum time to wait between movements
*
* @return JNI_TRUE if the creature stopped, or false if there was an error
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::wanderAngleDelay(JNIEnv *env, jobject self, jlong mob, jfloat minDist, jfloat maxDist, jfloat minAngle, jfloat maxAngle, jfloat minDelay, jfloat maxDelay)
{
UNREF(self);
CreatureObject * object = 0;
AICreatureController * controller = 0;
if (!JavaLibrary::getObjectController(mob, object, controller))
return JNI_FALSE;
minAngle *= PI_OVER_180;
maxAngle *= PI_OVER_180;
controller->wander(minDist, maxDist, minAngle, maxAngle, minDelay, maxDelay);
return JNI_TRUE;
} // ScriptMethodsActionStatesNamespace::stop()
//------------------------------------------------------------------------------------------------
/**
* Stops the current movement type of the creature, allowing it to be resumed at a
* later time.
*
* NOTE: Only one movement can be suspended at a time. If this function
* is called while a previous movement is suspended, it will fail.
*
* @return true if the movement has been suspended, false if not.
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::suspendMovement(JNIEnv *env, jobject self, jlong mob)
{
UNREF(self);
CreatureObject * object = 0;
AICreatureController * controller = 0;
if (!JavaLibrary::getObjectController(mob, object, controller))
return JNI_FALSE;
return static_cast<jboolean>(controller->suspendMovement() ? JNI_TRUE : JNI_FALSE);
}
//------------------------------------------------------------------------------------------------
/**
* Resumes a previously suspended movement.
*
* @return true if the movement was resumed, false if there was no previous movement.
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::resumeMovement(JNIEnv *env, jobject self, jlong mob)
{
UNREF(self);
CreatureObject * object = 0;
AICreatureController * controller = 0;
if (!JavaLibrary::getObjectController(mob, object, controller))
return JNI_FALSE;
return static_cast<jboolean>(controller->resumeMovement() ? JNI_TRUE : JNI_FALSE);
}
//------------------------------------------------------------------------------------------------
/**
* Returns if a creature has movement suspended or not.
*
* @return true there is suspended movement, false if not
*/
jboolean JNICALL ScriptMethodsActionStatesNamespace::hasSuspendedMovement(JNIEnv *env, jobject self, jlong mob)
{
UNREF(self);
CreatureObject * object = 0;
AICreatureController * controller = 0;
if (!JavaLibrary::getObjectController(mob, object, controller))
return JNI_FALSE;
return static_cast<jboolean>(controller->hasSuspendedMovement() ? JNI_TRUE : JNI_FALSE);
}
//------------------------------------------------------------------------------------------------
jfloat JNICALL ScriptMethodsActionStatesNamespace::getAcceleration(JNIEnv *env, jobject self, jlong mob, jint movementType)
{
CreatureObject * object = 0;
float result = -1.0f;
if (!JavaLibrary::getObject(mob, object))
return result;
return object->getAcceleration(static_cast<SharedCreatureObjectTemplate::MovementTypes>(movementType));
}
//------------------------------------------------------------------------------------------------
jfloat JNICALL ScriptMethodsActionStatesNamespace::getTurnRate(JNIEnv *env, jobject self, jlong mob, jint movementType)
{
CreatureObject * object = 0;
float result = -1.0f;
if (!JavaLibrary::getObject(mob, object))
return result;
return object->getTurnRate(static_cast<SharedCreatureObjectTemplate::MovementTypes>(movementType));
}
//------------------------------------------------------------------------------------------------
jfloat JNICALL ScriptMethodsActionStatesNamespace::getStepHeight(JNIEnv *env, jobject self, jlong mob)
{
CreatureObject * object = 0;
float result = -1.0f;
if (!JavaLibrary::getObject(mob, object))
return result;
return object->getStepHeight();
}
//------------------------------------------------------------------------------------------------
jfloat JNICALL ScriptMethodsActionStatesNamespace::getApproachTriggerRange(JNIEnv *env, jobject self, jlong mob)
{
CreatureObject * object = 0;
float result = -1.0f;
if (!JavaLibrary::getObject(mob, object))
return result;
return object->getApproachTriggerRange();
}
//------------------------------------------------------------------------------------------------
void JNICALL ScriptMethodsActionStatesNamespace::setCreatureStatic(JNIEnv *env, jobject self, jlong creature, jboolean value)
{
CreatureObject * object = 0;
if (!JavaLibrary::getObject(creature, object))
return;
DEBUG_REPORT_LOG(!value, ("Script is setting a creature to not be static. This is ok, but questionable.\n"));
object->setIsStatic(value);
}
//------------------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsActionStatesNamespace::isCreatureStatic(JNIEnv *env, jobject self, jlong creature)
{
CreatureObject * object = 0;
if (!JavaLibrary::getObject(creature, object))
return JNI_FALSE;
if(!object)
return JNI_FALSE;
return object->getIsStatic() ? JNI_TRUE : JNI_FALSE;
}
//------------------------------------------------------------------------------------------------
@@ -0,0 +1,829 @@
// ======================================================================
//
// ScriptMethodsAi.cpp
// Copyright 2005 Sony Online Eentertainment, Inc.
// All rights reserved.
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/AiCreatureCombatProfile.h"
#include "serverGame/AiCreatureController.h"
#include "serverGame/AiLogManager.h"
#include "serverGame/CellObject.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/HateList.h"
#include "serverGame/WeaponObject.h"
#include "sharedCollision/CollisionProperty.h"
#include "sharedLog/Log.h"
#include "sharedObject/CellProperty.h"
#include "sharedObject/NetworkIdManager.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsAiNamespace
// ======================================================================
namespace ScriptMethodsAiNamespace
{
bool install();
AICreatureController * const getAiCreatureController(jlong ai);
jint JNICALL aiGetMovementState(JNIEnv *env, jobject self, jlong ai);
jboolean JNICALL aiLoggingEnabled(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiIsFrozen(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiIsAggressive(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiIsAssist(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiIsStalker(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiIsKiller(JNIEnv * env, jobject self, jlong ai);
void JNICALL aiTether(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiIsTethered(JNIEnv * env, jobject self, jlong ai);
void JNICALL aiSetHomeLocation(JNIEnv * env, jobject self, jlong ai, jobject location);
jobject JNICALL aiGetHomeLocation(JNIEnv * env, jobject self, jlong ai);
jobject JNICALL aiGetLeashAnchorLocation(JNIEnv * env, jobject self, jlong ai);
jfloat JNICALL aiGetLeashRadius(JNIEnv * env, jobject self);
jfloat JNICALL aiGetRespectRadius(JNIEnv * env, jobject self, jlong ai, jlong target);
jfloat JNICALL aiGetAggroRadius(JNIEnv * env, jobject self, jlong ai);
void JNICALL aiEquipPrimaryWeapon(JNIEnv * env, jobject self, jlong ai);
void JNICALL aiEquipSecondaryWeapon(JNIEnv * env, jobject self, jlong ai);
void JNICALL aiUnEquipWeapons(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiHasPrimaryWeapon(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiHasSecondaryWeapon(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiUsingPrimaryWeapon(JNIEnv * env, jobject self, jlong ai);
jboolean JNICALL aiUsingSecondaryWeapon(JNIEnv * env, jobject self, jlong ai);
jlong JNICALL aiGetPrimaryWeapon(JNIEnv * env, jobject self, jlong ai);
jlong JNICALL aiGetSecondaryWeapon(JNIEnv * env, jobject self, jlong ai);
float JNICALL aiGetMovementSpeedPercent(JNIEnv * env, jobject self, jlong ai);
jstring JNICALL aiGetCombatAction(JNIEnv * env, jobject self, jlong ai);
jint JNICALL aiGetKnockDownRecoveryTime(JNIEnv * env, jobject self, jlong ai);
void JNICALL pathToLocation(JNIEnv *env, jobject self, jlong mob, jobject location);
void JNICALL pathToName(JNIEnv *env, jobject self, jlong objectId, jstring targetName);
void JNICALL patrolToLocation(JNIEnv *env, jobject self, jlong ai, jobjectArray targets, jboolean random, jboolean flip, jboolean repeat, jint startPoint);
void JNICALL patrolToName(JNIEnv *env, jobject self, jlong ai, jobjectArray targetNames, jboolean random, jboolean flip, jboolean repeat, jint startPoint);
void JNICALL loiterLocation(JNIEnv *env, jobject self, jlong ai, jobject anchorLocation, jfloat minDistance, jfloat maxDistance, jfloat minDelay, jfloat maxDelay);
void JNICALL loiterTarget(JNIEnv *env, jobject self, jlong ai, jlong target, jfloat minDistance, jfloat maxDistance, jfloat minDelay, jfloat maxDelay);
jboolean JNICALL setHibernationDelay(JNIEnv *env, jobject self, jlong creature, jfloat delay);
}
using namespace ScriptMethodsAiNamespace;
//========================================================================
// install
//========================================================================
bool ScriptMethodsAiNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsAiNamespace::c)}
JF("_aiGetMovementState", "(J)I", aiGetMovementState),
JF("_aiLoggingEnabled", "(J)Z", aiLoggingEnabled),
JF("_aiIsFrozen", "(J)Z", aiIsFrozen),
JF("_aiIsAggressive", "(J)Z", aiIsAggressive),
JF("_aiIsAssist", "(J)Z", aiIsAssist),
JF("_aiIsStalker", "(J)Z", aiIsStalker),
JF("_aiIsKiller", "(J)Z", aiIsKiller),
JF("_aiTether", "(J)V", aiTether),
JF("_aiIsTethered", "(J)Z", aiIsTethered),
JF("_aiSetHomeLocation", "(JLscript/location;)V", aiSetHomeLocation),
JF("_aiGetHomeLocation", "(J)Lscript/location;", aiGetHomeLocation),
JF("_aiGetLeashAnchorLocation", "(J)Lscript/location;", aiGetLeashAnchorLocation),
JF("aiGetLeashRadius", "()F", aiGetLeashRadius),
JF("_aiGetRespectRadius", "(JJ)F", aiGetRespectRadius),
JF("_aiGetAggroRadius", "(J)F", aiGetAggroRadius),
JF("_aiEquipPrimaryWeapon", "(J)V", aiEquipPrimaryWeapon),
JF("_aiEquipSecondaryWeapon", "(J)V", aiEquipSecondaryWeapon),
JF("_aiUnEquipWeapons", "(J)V", aiUnEquipWeapons),
JF("_aiUsingPrimaryWeapon", "(J)Z", aiUsingPrimaryWeapon),
JF("_aiHasPrimaryWeapon", "(J)Z", aiHasPrimaryWeapon),
JF("_aiHasSecondaryWeapon", "(J)Z", aiHasSecondaryWeapon),
JF("_aiUsingSecondaryWeapon", "(J)Z", aiUsingSecondaryWeapon),
JF("_aiGetPrimaryWeapon", "(J)J", aiGetPrimaryWeapon),
JF("_aiGetSecondaryWeapon", "(J)J", aiGetSecondaryWeapon),
JF("_aiGetMovementSpeedPercent", "(J)F", aiGetMovementSpeedPercent),
JF("_aiGetCombatAction", "(J)Ljava/lang/String;", aiGetCombatAction),
JF("_aiGetKnockDownRecoveryTime", "(J)I", aiGetKnockDownRecoveryTime),
JF("_pathTo", "(JLscript/location;)V", pathToLocation),
JF("_pathTo", "(JLjava/lang/String;)V", pathToName),
JF("_patrol", "(J[Lscript/location;ZZZI)V", patrolToLocation),
JF("_patrol", "(J[Ljava/lang/String;ZZZI)V", patrolToName),
JF("_loiterLocation", "(JLscript/location;FFFF)V", loiterLocation),
JF("_loiterTarget", "(JJFFFF)V", loiterTarget),
JF("_setHibernationDelay", "(JF)Z", setHibernationDelay),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ----------------------------------------------------------------------
AICreatureController * const ScriptMethodsAiNamespace::getAiCreatureController(jlong ai)
{
NetworkId const aiNetworkId(ai);
CreatureObject * const aiCreatureObject = CreatureObject::getCreatureObject(aiNetworkId);
if (aiCreatureObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("Unable to resolve the ai(%s) to a CreatureObject.", aiNetworkId.getValueString().c_str()));
return NULL;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(aiCreatureObject->getController());
if (aiCreatureController == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("Unable to get the ai's(%s) AiCreatureController.", aiCreatureObject->getDebugInformation().c_str()));
return NULL;
}
return aiCreatureController;
}
// ======================================================================
//
// ScriptMethodsAi
//
// ======================================================================
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsAiNamespace::aiGetMovementState(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
NetworkId const aiNetworkId(ai);
CreatureObject * const aiCreatureObject = CreatureObject::getCreatureObject(aiNetworkId);
if (aiCreatureObject == NULL)
{
return AMT_invalid;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(aiCreatureObject->getController());
if (aiCreatureController == NULL)
{
return AMT_invalid;
}
jint const nextState = aiCreatureController->getPendingMovementType();
// If we will change states next frame, return the pending state
if (nextState != AMT_invalid)
{
return nextState;
}
jint const currentState = aiCreatureController->getMovementType();
return currentState;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiLoggingEnabled(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
NetworkId const aiNetworkId(ai);
CreatureObject * const aiCreatureObject = CreatureObject::getCreatureObject(aiNetworkId);
if (aiCreatureObject == NULL)
{
return JNI_FALSE;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(aiCreatureObject->getController());
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
if (ConfigServerGame::isAiLoggingEnabled())
{
return JNI_TRUE;
}
return aiCreatureController->isLogging();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiIsFrozen(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->isFrozen();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiIsAggressive(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
NetworkId const aiNetworkId(ai);
CreatureObject * const aiCreatureObject = CreatureObject::getCreatureObject(aiNetworkId);
if (aiCreatureObject == NULL)
{
return JNI_FALSE;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(aiCreatureObject->getController());
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->isAggressive();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiIsAssist(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
NetworkId const aiNetworkId(ai);
CreatureObject * const aiCreatureObject = CreatureObject::getCreatureObject(aiNetworkId);
if (aiCreatureObject == NULL)
{
return JNI_FALSE;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(aiCreatureObject->getController());
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->isAssist();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiIsStalker(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->isStalker();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiIsKiller(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
NetworkId const aiNetworkId(ai);
CreatureObject * const aiCreatureObject = CreatureObject::getCreatureObject(aiNetworkId);
if (aiCreatureObject == NULL)
{
return JNI_FALSE;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(aiCreatureObject->getController());
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->isKiller();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::aiTether(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
aiCreatureController->setRetreating(true);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiIsTethered(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
NetworkId const aiNetworkId(ai);
CreatureObject * const aiCreatureObject = CreatureObject::getCreatureObject(aiNetworkId);
if (aiCreatureObject == NULL)
{
return JNI_FALSE;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(aiCreatureObject->getController());
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->isRetreating();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::aiSetHomeLocation(JNIEnv * /*env*/, jobject /*self*/, jlong ai, jobject location)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
Location homeLocation;
if (!ScriptConversion::convert(LocalRefParam(location), homeLocation))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsAi::aiSetHomeLocation() Unable to resolve the ai's(%s) location to a Location.", aiCreatureController->getCreature()->getDebugInformation().c_str()));
return;
}
aiCreatureController->setHomeLocation(homeLocation);
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsAiNamespace::aiGetHomeLocation(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JavaLibrary::getVector(Vector::zero)->getReturnValue();
}
Location const & homeLocation = aiCreatureController->getHomeLocation();
LocalRefPtr location;
ScriptConversion::convert(homeLocation, location);
return location->getReturnValue();
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsAiNamespace::aiGetLeashAnchorLocation(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JavaLibrary::getVector(Vector::zero)->getReturnValue();
}
Location const & startCombatLocation = aiCreatureController->getCombatStartLocation();
LocalRefPtr location;
ScriptConversion::convert(startCombatLocation, location);
return location->getReturnValue();
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsAiNamespace::aiGetLeashRadius(JNIEnv * /*env*/, jobject /*self*/)
{
return AICreatureController::getLeashRadius();
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsAiNamespace::aiGetRespectRadius(JNIEnv * /*env*/, jobject /*self*/, jlong ai, jlong target)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return 0.0f;
}
NetworkId const targetNetworkId(target);
return aiCreatureController->getRespectRadius(targetNetworkId);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsAiNamespace::aiGetAggroRadius(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return 0.0f;
}
return aiCreatureController->getAggroRadius();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::aiEquipPrimaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
aiCreatureController->equipPrimaryWeapon();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::aiEquipSecondaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
aiCreatureController->equipSecondaryWeapon();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::aiUnEquipWeapons(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
aiCreatureController->unEquipWeapons();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiHasPrimaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->hasPrimaryWeapon();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiHasSecondaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->hasSecondaryWeapon();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiUsingPrimaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->usingPrimaryWeapon();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::aiUsingSecondaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return JNI_FALSE;
}
return aiCreatureController->usingSecondaryWeapon();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsAiNamespace::aiGetPrimaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return 0;
}
return (aiCreatureController->getPrimaryWeapon()).getValue();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsAiNamespace::aiGetSecondaryWeapon(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return 0;
}
return (aiCreatureController->getSecondaryWeapon()).getValue();
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsAiNamespace::aiGetMovementSpeedPercent(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return 0.0f;
}
return aiCreatureController->getMovementSpeedPercent();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::loiterLocation(JNIEnv * /*env*/, jobject /*self*/, jlong ai, jobject anchorLocation, jfloat minDistance, jfloat maxDistance, jfloat minDelay, jfloat maxDelay)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
if (aiCreatureController->isRetreating())
{
JAVA_THROW_SCRIPT_EXCEPTION(ConfigServerGame::getMovementWhileRetreatingThrowsException(),
("ScriptMethodsAi::loiterLocation() ai(%s) Calling a movement command on a retreating AI is not allowed.", aiCreatureController->getCreature()->getDebugInformation().c_str()));
return;
}
Vector position_c;
NetworkId cellId;
if (ScriptConversion::convert(anchorLocation, position_c, cellId))
{
if (cellId == NetworkId::cms_invalid)
{
LOGC(AiLogManager::isLogging(aiCreatureController->getOwner()->getNetworkId()), "debug_ai", ("ScriptMethodsAi::loiterLocation() ai(%s) WORLD CELL", aiCreatureController->getOwner()->getNetworkId().getValueString().c_str()));
CellProperty const * const cellProperty = CellProperty::getWorldCellProperty();
aiCreatureController->loiter(cellProperty, position_c, minDistance, maxDistance, minDelay, maxDelay);
}
else
{
LOGC(AiLogManager::isLogging(aiCreatureController->getOwner()->getNetworkId()), "debug_ai", ("ScriptMethodsAi::loiterLocation() ai(%s) NON-WORLD CELL", aiCreatureController->getOwner()->getNetworkId().getValueString().c_str()));
CellObject const * const cellObject = CellObject::getCellObject(cellId);
if (cellObject != NULL)
{
CellProperty const * const cellProperty = cellObject->getCellProperty();
aiCreatureController->loiter(cellProperty, position_c, minDistance, maxDistance, minDelay, maxDelay);
}
else
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsAi::loiterLocation() ai(%s) Unable to resolve the cellId(%s) to a CellObject", aiCreatureController->getCreature()->getDebugInformation().c_str(), cellId.getValueString().c_str()));
}
}
}
else
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsAi::loiterLocation() ai(%s) Unable to resolve the loiter location", aiCreatureController->getCreature()->getDebugInformation().c_str()));
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::loiterTarget(JNIEnv * /*env*/, jobject /*self*/, jlong ai, jlong target, jfloat minDistance, jfloat maxDistance, jfloat minDelay, jfloat maxDelay)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
if (aiCreatureController->isRetreating())
{
JAVA_THROW_SCRIPT_EXCEPTION(ConfigServerGame::getMovementWhileRetreatingThrowsException(),
("ScriptMethodsAi::loiterTarget() ai(%s) Calling a movement command on a retreating AI is not allowed.", aiCreatureController->getCreature()->getDebugInformation().c_str()));
return;
}
NetworkId const targetNetworkId(static_cast<NetworkId::NetworkIdType>(target));
Object * const targetObject = NetworkIdManager::getObjectById(targetNetworkId);
if (targetObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsAi::loiterTarget() ai(%s) Unable to resolve the target(%s) to a Object", aiCreatureController->getCreature()->getDebugInformation().c_str(), targetNetworkId.getValueString().c_str()));
return;
}
if (aiCreatureController->getCreature()->getNetworkId() == targetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsAi::loiterTarget() ai(%s) The AI was told to loiter itself", aiCreatureController->getCreature()->getDebugInformation().c_str()));
return;
}
aiCreatureController->loiter(targetObject->getNetworkId(), minDistance, maxDistance, minDelay, maxDelay);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAiNamespace::pathToLocation(JNIEnv * /*env*/, jobject /*self*/, jlong ai, jobject location)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
if (aiCreatureController->isRetreating())
{
JAVA_THROW_SCRIPT_EXCEPTION(ConfigServerGame::getMovementWhileRetreatingThrowsException(),
("ScriptMethodsAi::pathToLocation() ai(%s) Calling a movement command on a retreating AI is not allowed.", aiCreatureController->getCreature()->getDebugInformation().c_str()));
return;
}
Vector position_c;
NetworkId cellId;
if (ScriptConversion::convert(location, position_c, cellId))
{
if (cellId != NetworkId::cms_invalid)
{
CellObject const * const cellObject = CellObject::getCellObject(cellId);
if (cellObject != NULL)
{
CellProperty const * const cellProperty = cellObject->getCellProperty();
aiCreatureController->moveTo(cellProperty, position_c);
}
else
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsAi::pathToLocation() ai(%s) Unable to resolve the cellId(%s) to a CellObject", aiCreatureController->getCreature()->getDebugInformation().c_str(), cellId.getValueString().c_str()));
return;
}
}
else
{
aiCreatureController->moveTo(CellProperty::getWorldCellProperty(), position_c);
}
}
else
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsAi::pathToLocation() ai(%s) Unable to resolve the destination location", aiCreatureController->getCreature()->getDebugInformation().c_str()));
return;
}
}
// ----------------------------------------------------------------------
/**
* Plots a path from an object's current location in the world to a path node with the given name
*
*/
void JNICALL ScriptMethodsAiNamespace::pathToName(JNIEnv * /*env*/, jobject /*self*/, jlong ai, jstring targetName)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return;
}
if (aiCreatureController->isRetreating())
{
JAVA_THROW_SCRIPT_EXCEPTION(ConfigServerGame::getMovementWhileRetreatingThrowsException(),
("ScriptMethodsAi::pathToName() ai(%s) Calling a movement command on a retreating AI is not allowed.", aiCreatureController->getCreature()->getDebugInformation().c_str()));
return;
}
JavaStringParam localName(targetName);
Unicode::String nameString;
JavaLibrary::convert(localName, nameString);
aiCreatureController->moveTo(nameString);
}
// ----------------------------------------------------------------------
/**
* Causes an AI to move along a series of points.
*
* @param ai the AI to move
* @param targets the points the AI will move along
* @param random flag to tell the AI to choose a random target to move to next, instead of the next one in the targets array
* @param flip if true, when the AI gets to the last point in the targets array, it will then go along them in reverse order
* @param repeat if true, the AI will go back to the first point after reaching the last one; if false, the ai will stop at the last point
* @param startPoint which point the ai will start its patrol at (base-0)
*/
void JNICALL ScriptMethodsAiNamespace::patrolToLocation(JNIEnv *, jobject, jlong ai, jobjectArray targets, jboolean random, jboolean flip, jboolean repeat, jint startPoint)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
return;
std::vector<Location> locations;
if (!ScriptConversion::convert(LocalObjectArrayRefParam(targets), locations))
return;
aiCreatureController->patrol(locations, random, flip, repeat, startPoint);
} // JavaLibrary::patrolToLocation
// ----------------------------------------------------------------------
/**
* Causes an AI to move along a series of points.
* @param ai the AI to move
* @param targetNames the waypoint names the AI will move along
* @param random flag to tell the AI to choose a random target to move to next, instead of the next one in the targets array
* @param flip if true, when the AI gets to the last point in the targets array, it will then go along them in reverse order
* @param repeat if true, the AI will go back to the first point after reaching the last one; if false, the ai will stop at the last point
* @param startPoint which point the ai will start its patrol at (base-0)
*/
void JNICALL ScriptMethodsAiNamespace::patrolToName(JNIEnv *, jobject, jlong ai, jobjectArray targetNames, jboolean random, jboolean flip, jboolean repeat, jint startPoint)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
return;
std::vector<const Unicode::String *> locations;
getStringArray(LocalObjectArrayRefParam(targetNames), locations);
// we have to copy the string pointers to strings, which sucks
int count = locations.size();
std::vector<Unicode::String> realLocations;
realLocations.reserve(count);
for (int i = 0; i < count; ++i)
{
const Unicode::String * location = locations[i];
if (location != NULL)
{
realLocations.push_back(*location);
delete location;
locations[i] = NULL;
}
}
aiCreatureController->patrol(realLocations, random, flip, repeat, startPoint);
} // JavaLibrary::patrolToName
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsAiNamespace::aiGetCombatAction(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return NULL;
}
PersistentCrcString const & result = aiCreatureController->getCombatAction();
if (result.isEmpty())
{
return NULL;
}
JavaString javaString(result.getString());
return javaString.getReturnValue();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsAiNamespace::aiGetKnockDownRecoveryTime(JNIEnv * /*env*/, jobject /*self*/, jlong ai)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(ai);
if (aiCreatureController == NULL)
{
return 0;
}
return int(aiCreatureController->getKnockDownRecoveryTime());
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAiNamespace::setHibernationDelay(JNIEnv *env, jobject self, jlong creature, jfloat delay)
{
AICreatureController * const aiCreatureController = ScriptMethodsAiNamespace::getAiCreatureController(creature);
if (aiCreatureController == NULL)
return JNI_FALSE;
aiCreatureController->setHibernationDelay(delay);
return JNI_TRUE;
}
// ======================================================================
@@ -0,0 +1,237 @@
//========================================================================
//http://www.guidescope.com/home/bar.htm
// ScriptMethodsAnimation.cpp - implements script methods dealing with object
// movement.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/CreatureController.h"
#include "serverGame/ServerObject.h"
#include "serverGame/TangibleObject.h"
#include "sharedNetworkMessages/MessageQueueString.h"
#include "sharedObject/Controller.h"
#include "sharedFoundation/GameControllerMessage.h"
#include "sharedObject/CellProperty.h"
#include "sharedObject/NetworkIdManager.h"
namespace ScriptMethodsAnimationNamespace
{
bool install();
void JNICALL doAnimationAction (JNIEnv *env, jobject self, jlong target, jstring animationName);
void JNICALL setAnimationMood (JNIEnv *env, jobject self, jlong target, jstring moodName);
jstring JNICALL getAnimationMood (JNIEnv *env, jobject self, jlong target);
jboolean JNICALL sitOnObject (JNIEnv *env, jobject self, jlong sitterId, jlong chairId, jint positionIndex);
void JNICALL setObjectAppearance (JNIEnv *env, jobject self, jlong target, jstring sharedTemplateName);
void JNICALL revertObjectAppearance (JNIEnv *env, jobject self, jlong target);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsAnimationNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsAnimationNamespace::c)}
JF("_doAnimationAction", "(JLjava/lang/String;)V", doAnimationAction),
JF("_setAnimationMood", "(JLjava/lang/String;)V", setAnimationMood),
JF("_getAnimationMood", "(J)Ljava/lang/String;", getAnimationMood),
JF("_sitOnObject", "(JJI)Z", sitOnObject),
JF("_setObjectAppearance", "(JLjava/lang/String;)V", setObjectAppearance),
JF("_revertObjectAppearance", "(J)V", revertObjectAppearance)
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI object location callback methods
//========================================================================
//----------------------------------------------------------------------
void JNICALL ScriptMethodsAnimationNamespace::doAnimationAction (JNIEnv *env, jobject self, jlong target, jstring animationName)
{
UNREF(self);
UNREF (env);
TangibleObject * tangibleObject = 0;
Controller * controller = 0;
if (!JavaLibrary::getObjectController(target, tangibleObject, controller))
{
WARNING (true, ("doAnimationAction on bad TangibleObject/Controller id %d", NetworkId(target).getValue ()));
return;
}
JavaStringParam localAnimationName(animationName);
std::string animationNameStr;
if (!JavaLibrary::convert(localAnimationName, animationNameStr))
{
WARNING (true, ("doAnimationAction unable to convert animationName to std::string"));
return;
}
MessageQueueString * const msg = new MessageQueueString (animationNameStr);
controller->appendMessage(CM_animationAction, 0, msg,
GameControllerMessageFlags::SEND |
GameControllerMessageFlags::RELIABLE |
GameControllerMessageFlags::DEST_ALL_CLIENT);
}
//----------------------------------------------------------------------
//@todo these are stubbed in right now.
void JNICALL ScriptMethodsAnimationNamespace::setAnimationMood (JNIEnv *env, jobject self, jlong target, jstring moodName)
{
UNREF(env);
UNREF(self);
JavaStringParam localMoodName(moodName);
ServerObject * targetObject = NULL;
if (!JavaLibrary::getObject(target, targetObject))
return;
std::string moodString;
JavaLibrary::convert(localMoodName, moodString);
CreatureObject * c = dynamic_cast<CreatureObject*>(targetObject);
if (!c)
return;
c->setAnimationMood(moodString);
}
//----------------------------------------------------------------------
jstring JNICALL ScriptMethodsAnimationNamespace::getAnimationMood (JNIEnv *env, jobject self, jlong target)
{
ServerObject * targetObject = NULL;
if (!JavaLibrary::getObject(target, targetObject))
return 0;
JavaString javaString("neutral");
return javaString.getReturnValue();
CreatureObject * c = dynamic_cast<CreatureObject*>(targetObject);
if (!c)
return 0;
std::string moodString(c->getAnimationMood());
JavaString javaReturn(moodString.c_str());
return javaReturn.getReturnValue();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAnimationNamespace::sitOnObject (JNIEnv *env, jobject self, jlong sitterId, jlong chairId, jint positionIndex)
{
UNREF(env);
UNREF(self);
UNREF(chairId);
UNREF(positionIndex);
//-- Get the creature who will be doing the sitting.
CreatureObject *sitterObject = 0;
if (!JavaLibrary::getObject (sitterId, sitterObject) || !sitterObject)
{
DEBUG_WARNING (true, ("sitOnObject(): Sitter object is NULL."));
return JNI_FALSE;
}
if (!sitterObject->isInWorld())
{
DEBUG_WARNING (true, ("sitOnObject(): Sitter object is not in the world."));
return JNI_FALSE;
}
//-- Tell creature to sit on the closest chair to its current position. This will be an issue on the
// client if no chair is within range (currently a 2 meter radius).
NetworkId creatureCellId;
if (sitterObject->isInWorldCell())
creatureCellId = NetworkId::cms_invalid;
else
creatureCellId = NON_NULL(sitterObject->getParentCell())->getOwner().getNetworkId();
sitterObject->sitOnObject(creatureCellId, sitterObject->getPosition_w());
//-- Return success. At this point, the creature should at least go sit on the ground if not in the chair.
return JNI_TRUE;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAnimationNamespace::setObjectAppearance(JNIEnv *env, jobject self, jlong target, jstring sharedTemplateName)
{
UNREF(env);
UNREF(self);
CreatureObject* creature = NULL;
if(!JavaLibrary::getObject(target, creature) || !creature)
{
DEBUG_WARNING(true, ("SetObjectAppearance() : Creature object was NULL.\n"));
return;
}
if(!creature->isInWorld())
{
DEBUG_WARNING(true, ("SetObjectAppearance(): Creature is not in the world.\n"));
return;
}
std::string templateString;
JavaStringParam sharedTemplateNameJString(sharedTemplateName);
JavaLibrary::convert(sharedTemplateNameJString, templateString);
CreatureController* controller = creature->getCreatureController();
if(!controller)
{
DEBUG_WARNING(true, ("SetObjectAppearance(): Could not get creature controller.\n"));
return;
}
controller->setAppearanceFromObjectTemplate(templateString);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAnimationNamespace::revertObjectAppearance(JNIEnv *env, jobject self, jlong target)
{
UNREF(env);
UNREF(self);
CreatureObject* creature = NULL;
if(!JavaLibrary::getObject(target, creature) || !creature)
{
DEBUG_WARNING(true, ("RevertObjectAppearance() : Creature object was NULL.\n"));
return;
}
if(!creature->isInWorld())
{
DEBUG_WARNING(true, ("RevertObjectAppearance(): Creature is not in the world.\n"));
return;
}
CreatureController* controller = creature->getCreatureController();
if(!controller)
{
DEBUG_WARNING(true, ("RevertObjectAppearance(): Could not get creature controller.\n"));
return;
}
std::string const revert("none");
controller->setAppearanceFromObjectTemplate(revert);
}
// ======================================================================
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,304 @@
//========================================================================
//
// ScriptMethodsAuction.cpp - implements script methods dealing with bank
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "sharedFoundation/DynamicVariable.h"
#include "sharedFoundation/DynamicVariableList.h"
#include "serverGame/CommoditiesMarket.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObject.h"
#include "serverGame/TangibleObject.h"
#include "sharedNetworkMessages/GenericValueTypeMessage.h"
#include "sharedObject/NetworkIdManager.h"
#include "serverScript/GameScriptObject.h"
#include "serverScript/ScriptParameters.h"
// ======================================================================
// ScriptMethodsAuctionNamespace
// ======================================================================
namespace ScriptMethodsAuctionNamespace
{
bool install();
jboolean JNICALL isCommoditiesServerAvailable(JNIEnv *env, jobject self);
void JNICALL createVendorMarket(JNIEnv *env, jobject script, jlong player, jlong container, jint entranceCharge);
void JNICALL updateVendorValue(JNIEnv *env, jobject script, jlong container);
void JNICALL setSalesTax(JNIEnv *env, jobject script, jint salesTax, jlong bank, jlong container);
void JNICALL requestVendorItemCount(JNIEnv *env, jobject script, jlong vendor);
void JNICALL requestPlayerVendorCount(JNIEnv *env, jobject script, jlong player);
void JNICALL updateVendorSearchOption(JNIEnv *env, jobject self, jlong vendor, jboolean enabled);
void JNICALL setEntranceCharge(JNIEnv *env, jobject self, jlong vendor, jint entranceCharge);
void JNICALL auctionCreatePermanent(JNIEnv *env, jobject script, jstring jownerName, jlong jitem, jlong jauctionContainer, jint cost, jstring userDescription);
void JNICALL removeAllAuctions(JNIEnv *env, jobject script, jlong vendor);
void JNICALL reinitializeVendor(JNIEnv *env, jobject script, jlong vendor, jlong player);
void JNICALL updateVendorStatus(JNIEnv *env, jobject script, jlong vendor, jint status);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsAuctionNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsAuctionNamespace::c)}
JF("isCommoditiesServerAvailable", "()Z", isCommoditiesServerAvailable),
JF("_createVendorMarket", "(JJI)V",createVendorMarket),
JF("_updateVendorValue", "(J)V",updateVendorValue),
JF("_setSalesTax", "(IJJ)V",setSalesTax),
JF("_requestVendorItemCount", "(J)V", requestVendorItemCount),
JF("_requestPlayerVendorCount", "(J)V", requestPlayerVendorCount),
JF("_updateVendorSearchOption", "(JZ)V", updateVendorSearchOption),
JF("_setEntranceCharge", "(JI)V", setEntranceCharge),
JF("_auctionCreatePermanent", "(Ljava/lang/String;JJILjava/lang/String;)V",auctionCreatePermanent),
JF("_removeAllAuctions", "(J)V",removeAllAuctions),
JF("_reinitializeVendor", "(JJ)V",reinitializeVendor),
JF("_updateVendorStatus", "(JI)V", updateVendorStatus),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsAuctionNamespace::isCommoditiesServerAvailable(JNIEnv *env, jobject script)
{
return CommoditiesMarket::isCommoditiesServerAvailable();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAuctionNamespace::createVendorMarket(JNIEnv *env, jobject script, jlong player, jlong container, jint entranceCharge)
{
ServerObject * sourceObj = 0;
if (!JavaLibrary::getObject(player, sourceObj))
{
DEBUG_WARNING(true, ("[designer bug] createVendorMarket() player parameter (1) is invalid"));
return;
}
ServerObject *containerObj = 0;
if (!JavaLibrary::getObject(container, containerObj))
{
DEBUG_WARNING(true, ("[designer bug] createVendorMarket() container parameter (2) is invalid"));
return;
}
containerObj->makeVendor();
CreatureObject *playerObj = dynamic_cast<CreatureObject *>(sourceObj);
if (playerObj)
{
CommoditiesMarket::createVendorMarket(*playerObj, *containerObj, entranceCharge);
}
else
{
DEBUG_WARNING(true, ("[designer bug] createVendorMarket() player parameter (1) is not a creature"));
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAuctionNamespace::auctionCreatePermanent(JNIEnv *env, jobject script, jstring jownerName, jlong jitem, jlong jauctionContainer, jint jprice, jstring juserDescription)
{
TangibleObject *itemObject = NULL;
ServerObject *containerObj = NULL;
if (!JavaLibrary::getObject(jitem, itemObject))
{
DEBUG_WARNING(true, ("[designer bug] auctionCreatePermanent() item parameter (2) is invalid"));
return;
}
if (!JavaLibrary::getObject(jauctionContainer, containerObj))
{
DEBUG_WARNING(true, ("[designer bug] auctionCreatePermanent() container parameter (3) is invalid"));
return;
}
JavaStringParam ownerNameParam(jownerName);
JavaStringParam descriptionParam(juserDescription);
std::string ownerName;
Unicode::String description;
if(!JavaLibrary::convert(ownerNameParam, ownerName))
{
DEBUG_WARNING(true, ("[script bug] invalid ownerName passed to auctionCreatePermanent"));
return;
}
if(!JavaLibrary::convert(descriptionParam, description))
{
DEBUG_WARNING(true, ("[script bug] invalid description passed to auctionCreatePermanent"));
return;
}
CommoditiesMarket::auctionCreatePermanent(ownerName, *itemObject,
*containerObj, jprice, description);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsAuctionNamespace::updateVendorValue(JNIEnv *env, jobject script, jlong container)
{
ServerObject *containerObj = 0;
if (!JavaLibrary::getObject(container, containerObj))
{
DEBUG_WARNING(true, ("[designer bug] updateVendorValue() container parameter (1) is invalid"));
return;
}
CommoditiesMarket::getVendorValue(*containerObj);
}
// salesTax is an integer that will be divided by 10000. So a 10% sales tax would be an integer=1000
void JNICALL ScriptMethodsAuctionNamespace::setSalesTax(JNIEnv *env, jobject script, jint salesTax, jlong bank, jlong container)
{
ServerObject *containerObj = 0;
ServerObject *bankObj = 0;
if( !JavaLibrary::getObject(container, containerObj) )
{
DEBUG_WARNING(true, ("[designer bug] setSalesTax() auction container is invalid."));
return;
}
// are we setting a sales tax?
if( salesTax!=0 )
{
// do we have a bank object?
if( !JavaLibrary::getObject(bank, bankObj) )
{
DEBUG_WARNING(true, ("[designer bug] setSalesTax() bank object is invalid."));
return;
}
}
if( salesTax!=0 )
{
CommoditiesMarket::setSalesTax(salesTax, bankObj->getNetworkId(), *containerObj);
}
else
{
// turn off sales tax for this vendor
CommoditiesMarket::setSalesTax(0, NetworkId(), *containerObj);
}
}
void JNICALL ScriptMethodsAuctionNamespace::requestVendorItemCount(JNIEnv *env, jobject script, jlong vendor)
{
ServerObject* vendorObject = NULL;
if( !JavaLibrary::getObject(vendor, vendorObject) )
{
WARNING(true, ("[designer bug] requestVendorItemLimit() vendor is invalid."));
return;
}
CommoditiesMarket::requestVendorItemCount(vendorObject->getNetworkId());
}
void JNICALL ScriptMethodsAuctionNamespace::requestPlayerVendorCount(JNIEnv *env, jobject script, jlong player)
{
ServerObject* playerObject = NULL;
if( !JavaLibrary::getObject(player, playerObject) )
{
WARNING(true, ("[designer bug] requestPlayerVendorCount() player is invalid."));
return;
}
CommoditiesMarket::requestPlayerVendorCount(playerObject->getNetworkId());
}
void JNICALL ScriptMethodsAuctionNamespace::updateVendorSearchOption(JNIEnv *env, jobject script, jlong vendor, jboolean enable)
{
ServerObject* vendorObject = NULL;
bool enabled;
if( !JavaLibrary::getObject(vendor, vendorObject) )
{
WARNING(true, ("[designer bug] updateVendorSearchOption() vendor is invalid."));
return;
}
if (enable == JNI_TRUE)
enabled = true;
else
enabled = false;
CommoditiesMarket::updateVendorSearchOption(vendorObject->getNetworkId(), enabled);
}
void JNICALL ScriptMethodsAuctionNamespace::setEntranceCharge(JNIEnv *env, jobject script, jlong vendor, jint entranceCharge)
{
ServerObject* vendorObject = NULL;
if( !JavaLibrary::getObject(vendor, vendorObject) )
{
WARNING(true, ("[designer bug] setEntranceCharge() vendor is invalid."));
return;
}
CommoditiesMarket::setEntranceCharge(vendorObject->getNetworkId(), entranceCharge);
}
void JNICALL ScriptMethodsAuctionNamespace::removeAllAuctions(JNIEnv *env, jobject script, jlong jvendor)
{
ServerObject* vendorObject = NULL;
if( !JavaLibrary::getObject(jvendor, vendorObject) )
{
WARNING(true, ("[designer bug] removeAllAuctions() vendor is invalid."));
return;
}
vendorObject->removeAllAuctions();
}
void JNICALL ScriptMethodsAuctionNamespace::reinitializeVendor(JNIEnv *env, jobject script, jlong vendor, jlong player)
{
ServerObject* vendorObject = NULL;
if( !JavaLibrary::getObject(vendor, vendorObject) )
{
WARNING(true, ("[designer bug] reinitializeVendor() vendor is invalid."));
return;
}
ServerObject* auctionContainer = vendorObject->getBazaarContainer();
if ( auctionContainer == NULL )
{
WARNING(true, ("[designer bug] reinitializeVendor() vendor doesn't have an auction container."));
return;
}
ServerObject* playerObject = NULL;
if ( !JavaLibrary::getObject(player, playerObject) )
{
WARNING(true, ("[designer bug] reinitializeVendor() player is invalid."));
return;
}
NetworkId playerId = playerObject->getNetworkId();
if( playerId == NetworkId::cms_invalid )
{
WARNING(true, ("[designer bug] reinitializeVendor() player has an invalid NetworkId."));
return;
}
CommoditiesMarket::reinitializeVendor( *auctionContainer, playerId );
}
void JNICALL ScriptMethodsAuctionNamespace::updateVendorStatus(JNIEnv *env, jobject script, jlong vendor, jint status)
{
ServerObject const * vendorObject = NULL;
if (!JavaLibrary::getObject(vendor, vendorObject))
{
WARNING(true, ("[designer bug] updateVendorStatus() vendor is invalid."));
return;
}
CommoditiesMarket::updateVendorStatus(vendorObject->getNetworkId(), status);
}
@@ -0,0 +1,117 @@
//========================================================================
//
// ScriptMethodsBank.cpp - implements script methods dealing with bank
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "sharedFoundation/DynamicVariable.h"
#include "sharedFoundation/DynamicVariableList.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObject.h"
#include "sharedNetworkMessages/ClientOpenContainerMessage.h"
#include "sharedNetworkMessages/GenericValueTypeMessage.h"
#include "sharedObject/NetworkIdManager.h"
// ======================================================================
// ScriptMethodsBankNamespace
// ======================================================================
namespace ScriptMethodsBankNamespace
{
bool install();
void JNICALL openBankContainer(JNIEnv *env, jobject script, jlong self, jlong player);
void JNICALL quitBank(JNIEnv *env, jobject self, jlong player);
void JNICALL joinBank(JNIEnv *env, jobject self, jlong player, jstring bank);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsBankNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsBankNamespace::c)}
JF("_openBankContainer", "(JJ)V",openBankContainer),
JF("_quitBank", "(J)V",quitBank),
JF("_joinBank", "(JLjava/lang/String;)V",joinBank),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsBankNamespace::openBankContainer(JNIEnv *env, jobject script, jlong self, jlong player)
{
CreatureObject *playerObj = 0;
ServerObject *bankObj = 0;
if (!JavaLibrary::getObject(player, playerObj) || !JavaLibrary::getObject(self, bankObj))
return;
Client *client = playerObj->getClient();
if (client)
{
ServerObject *bankContainer = playerObj->getBankContainer();
if (bankContainer)
{
if (!bankContainer->areContentsLoaded())
{
bankContainer->loadAllContentsFromDB();
}
else
client->openContainer(*bankContainer, 0, std::string());
static const std::string bankLocation("open_bank_location");
NetworkId bankId = bankObj->getNetworkId();
playerObj->setObjVarItem(bankLocation, bankId);
}
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsBankNamespace::joinBank(JNIEnv *env, jobject self, jlong player, jstring bank)
{
ServerObject * sourceObj = 0;
if (!JavaLibrary::getObject(player, sourceObj))
return;
CreatureObject *playerObj = dynamic_cast<CreatureObject *>(sourceObj);
if (playerObj)
{
Unicode::String myBankName;
JavaString temp(bank);
if (!JavaLibrary::convert(temp,myBankName))
return;
playerObj->joinBank(myBankName);
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsBankNamespace::quitBank(JNIEnv *env, jobject self, jlong player)
{
ServerObject * sourceObj = 0;
if (!JavaLibrary::getObject(player, sourceObj))
return;
CreatureObject *playerObj = dynamic_cast<CreatureObject *>(sourceObj);
if (playerObj)
{
playerObj->quitBank();
}
}
//========================================================================
@@ -0,0 +1,304 @@
//========================================================================
//
// ScriptMethodsBeastMaster.cpp - script methods dealing with beastmaster stuff.
//
// copyright 2007 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverScript/JNIWrappers.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/ResourceTypeObject.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerUniverse.h"
#include "sharedNetworkMessages/IncubatorStartMessage.h"
#include "sharedObject/Controller.h"
// ======================================================================
// ScriptMethodsBeastMaster
// ======================================================================
using namespace JNIWrappersNamespace;
namespace ScriptMethodsBeastMasterNamespace
{
bool install();
void JNICALL incubatorStart_development(JNIEnv *env, jobject self, jlong jplayerId, jlong jterminalId );
void JNICALL incubatorStart(JNIEnv *env, jobject self,
jint jsessionNumber, // I
jlong jplayerId, // J
jlong jterminalId, // J
jint jpowerGauge, // I
jint jinitialPointsSurvival, //I
jint jinitialPointsBeastialResilience, // I
jint jinitialPointsCunning, // I
jint jinitialPointsIntelligence, // I
jint jinitialPointsAggression, // I
jint jinitialPointsHuntersInstinct, // I
jint jtemperatureGauge, // I
jint jnutrientGauge, // I
jint jinitialCreatureColorIndex, // I
jstring jcreatureTemplateName // Ljava/lang/String
);
jboolean JNICALL setBeastMasterPetCommands(JNIEnv *env, jobject self, jlong objId, jobjectArray value);
jboolean JNICALL setBeastMasterToggledPetCommands(JNIEnv *env, jobject self, jlong objId, jobjectArray value);
void JNICALL setIncubatorPowerResourceName(JNIEnv *env, jobject self, jlong incubatorId, jstring resourceName);
};
//========================================================================
// install
//========================================================================
bool ScriptMethodsBeastMasterNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsBeastMasterNamespace::c)}
JF("_incubatorStart_development", "(JJ)V", incubatorStart_development),
JF("_incubatorStart","(IJJIIIIIIIIIILjava/lang/String;)V",incubatorStart),
JF("_setBeastmasterPetCommands", "(J[Ljava/lang/String;)Z", setBeastMasterPetCommands),
JF("_setBeastmasterToggledPetCommands", "(J[Ljava/lang/String;)Z", setBeastMasterToggledPetCommands),
JF("_setIncubatorPowerResourceName","(JLjava/lang/String;)V",setIncubatorPowerResourceName),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI beastmaster callback methods
//========================================================================
void JNICALL ScriptMethodsBeastMasterNamespace::incubatorStart_development(JNIEnv *env, jobject self, jlong jplayerId, jlong jterminalId)
{
UNREF(env);
UNREF(self);
ServerObject * playerObj = 0;
if (!JavaLibrary::getObject(jplayerId, playerObj))
{
WARNING(true, ("bad player passed to JavaLibrary::incubatorStart"));
return;
}
ServerObject * terminalObj = 0;
if (!JavaLibrary::getObject(jterminalId, terminalObj))
{
WARNING(true, ("bad terminal passed to JavaLibrary::incubatorStart"));
return;
}
Controller * const playerController = playerObj->getController();
if(playerController)
{
// JU_TODO: test data
IncubatorStartMessage* const msg = new IncubatorStartMessage(
1, // sessionNumber
playerObj->getNetworkId(), // playerId
NetworkId::cms_invalid, // terminalId
75, // powerGauge
2, // initialPointsSurvival
3, // initialPointsBeastialReilience,
4, // initialPointsCunning
5, // initialPointsIntelligence
6, // initialPointsAggression
7, // initialPointsHuntersInstinct
2, // temperatureGauge
1, // nutrientGauge
-1, // initialCreatureColorIndex
"foobar_deadbeef" // creatureTemplateName
);
playerController->appendMessage(CM_incubatorStart, 0, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
//------------------------------------------------------------------------
void JNICALL ScriptMethodsBeastMasterNamespace::incubatorStart(JNIEnv *env, jobject self,
jint jsessionNumber, // I
jlong jplayerId, // J
jlong jterminalId, // J
jint jpowerGauge, // I
jint jinitialPointsSurvival, //I
jint jinitialPointsBeastialResilience, // I
jint jinitialPointsCunning, // I
jint jinitialPointsIntelligence, // I
jint jinitialPointsAggression, // I
jint jinitialPointsHuntersInstinct, // I
jint jtemperatureGauge, // I
jint jnutrientGauge, // I
jint jinitialCreatureColorIndex, // I
jstring jcreatureTemplateName // Ljava/lang/String
)
{
UNREF(env);
UNREF(self);
ServerObject * playerObj = 0;
if (!JavaLibrary::getObject(jplayerId, playerObj))
{
WARNING(true, ("bad player passed to JavaLibrary::incubatorStart"));
return;
}
ServerObject * terminalObj = 0;
if (!JavaLibrary::getObject(jterminalId, terminalObj))
{
WARNING(true, ("bad terminal passed to JavaLibrary::incubatorStart"));
return;
}
JavaStringParam localCreatureTemplateName(jcreatureTemplateName);
std::string creatureTemplateName;
if (!JavaLibrary::convert(localCreatureTemplateName, creatureTemplateName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JNICALL incubatorStart - could not resolve creature template name"));
return;
}
Controller * const playerController = playerObj->getController();
if(playerController)
{
IncubatorStartMessage* const msg = new IncubatorStartMessage(
jsessionNumber, // sessionNumber
playerObj->getNetworkId(), // playerId
terminalObj->getNetworkId(), // terminalId
jpowerGauge, // powerGauge
jinitialPointsSurvival, // initialPointsSurvival
jinitialPointsBeastialResilience, // initialPointsBeastialReilience,
jinitialPointsCunning, // initialPointsCunning
jinitialPointsIntelligence, // initialPointsIntelligence
jinitialPointsAggression, // initialPointsAggression
jinitialPointsHuntersInstinct, // initialPointsHuntersInstinct
jtemperatureGauge, // temperatureGauge
jnutrientGauge, // nutrientGauge
jinitialCreatureColorIndex, // initialCreatureColorIndex
creatureTemplateName // creatureTemplateName
);
playerController->appendMessage(CM_incubatorStart, 0, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
jboolean JNICALL ScriptMethodsBeastMasterNamespace::setBeastMasterPetCommands(JNIEnv *env, jobject self, jlong objId, jobjectArray value)
{
if (objId == 0 || value == 0)
return JNI_FALSE;
if (env->IsInstanceOf(value, JavaLibrary::getClsStringArray()) == JNI_FALSE)
return JNI_FALSE;
CreatureObject *creatureObject = 0;
if (!JavaLibrary::getObject(objId, creatureObject))
{
WARNING(true, ("ScriptMethodsBeastMasterNamespace::setBeastMasterPetCommands() Object could not be resolved to a CreatureObject"));
return JNI_FALSE;
}
PlayerObject *po = PlayerCreatureController::getPlayerObject(creatureObject);
if(!po)
{
WARNING(true, ("ScriptMethodsBeastMasterNamespace::setBeastMasterPetCommands() Object has no player object"));
return JNI_FALSE;
}
std::vector<std::string> commands;
size_t size = env->GetArrayLength(value);
commands.resize(size);
for (size_t i = 0; i < size; ++i)
{
JavaStringPtr item = getStringArrayElement(LocalObjectArrayRefParam(value), i);
if (item != JavaString::cms_nullPtr)
JavaLibrary::convert(*item, commands[i]);
else
commands[i] = "";
}
po->setPetCommandList(commands);
return JNI_TRUE;
}
jboolean JNICALL ScriptMethodsBeastMasterNamespace::setBeastMasterToggledPetCommands(JNIEnv *env, jobject self, jlong objId, jobjectArray value)
{
if (objId == 0 || value == 0)
return JNI_FALSE;
if (env->IsInstanceOf(value, JavaLibrary::getClsStringArray()) == JNI_FALSE)
return JNI_FALSE;
CreatureObject *creatureObject = 0;
if (!JavaLibrary::getObject(objId, creatureObject))
{
WARNING(true, ("ScriptMethodsBeastMasterNamespace::setBeastMasterToggledPetCommands() Object could not be resolved to a CreatureObject"));
return JNI_FALSE;
}
PlayerObject *po = PlayerCreatureController::getPlayerObject(creatureObject);
if(!po)
{
WARNING(true, ("ScriptMethodsBeastMasterNamespace::setBeastMasterToggledPetCommands() Object has no player object"));
return JNI_FALSE;
}
std::vector<std::string> commands;
size_t size = env->GetArrayLength(value);
commands.resize(size);
for (size_t i = 0; i < size; ++i)
{
JavaStringPtr item = getStringArrayElement(LocalObjectArrayRefParam(value), i);
if (item != JavaString::cms_nullPtr)
JavaLibrary::convert(*item, commands[i]);
else
commands[i] = "";
}
po->setPetToggledCommands(commands);
return JNI_TRUE;
}
void JNICALL ScriptMethodsBeastMasterNamespace::setIncubatorPowerResourceName(JNIEnv *env, jobject self, jlong incubatorId, jstring resourceName)
{
UNREF(env);
UNREF(self);
ServerObject * incubatorObj = 0;
if (!JavaLibrary::getObject(incubatorId, incubatorObj))
return;
if (!incubatorObj->asTangibleObject())
return;
if (resourceName == 0)
return;
JavaStringParam jspResourceName(resourceName);
std::string sResourceName;
if (!JavaLibrary::convert(jspResourceName, sResourceName))
return;
if (sResourceName.empty())
return;
IGNORE_RETURN(incubatorObj->setObjVarItem("power.name", sResourceName));
// store additional information if the resource is an imported resource from another galaxy
ResourceTypeObject const * const rto = ServerUniverse::getInstance().getResourceTypeByName(sResourceName);
if (rto && (rto->getNetworkId().getValue() > NetworkId::cms_maxNetworkIdWithoutClusterId))
{
std::string const resourceData = rto->getResourceTypeDataForExport();
if (!resourceData.empty())
IGNORE_RETURN(incubatorObj->setObjVarItem("power.resourceData", resourceData));
}
}
@@ -0,0 +1,147 @@
//========================================================================
//
// ScriptMethodsBroadcasting.cpp - implements script methods dealing
// with broadcasting
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/ServerObject.h"
#include "sharedObject/CachedNetworkId.h"
#include <limits>
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsBroadcastingNamespace
// ======================================================================
namespace ScriptMethodsBroadcastingNamespace
{
bool install();
void JNICALL listenToMessage(JNIEnv *env, jobject self, jlong listener, jlong emitter, jstring messageHandlerName);
void JNICALL stopListeningToMessage(JNIEnv *env, jobject self, jlong listener, jlong emitter, jstring messageHandlerName);
jlongArray JNICALL getMessageListeners(JNIEnv *env, jobject self, jlong emitter, jstring messageHandlerName);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsBroadcastingNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsBroadcastingNamespace::c)}
JF("_listenToMessage", "(JJLjava/lang/String;)V", listenToMessage),
JF("_stopListeningToMessage", "(JJLjava/lang/String;)V", stopListeningToMessage),
JF("_getMessageListeners", "(JLjava/lang/String;)[J", getMessageListeners),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsBroadcastingNamespace::listenToMessage(JNIEnv *env, jobject self, jlong listener, jlong emitter, jstring messageHandlerName)
{
UNREF(self);
if (listener == 0 || emitter == 0 || messageHandlerName == 0)
return;
JavaStringParam localMessageHandlerName(messageHandlerName);
CachedNetworkId listenerId(listener);
CachedNetworkId emitterId(emitter);
ServerObject* listenerObject = dynamic_cast<ServerObject*>(listenerId.getObject());
if (listenerObject == NULL)
return;
std::string messageHandlerNameString;
JavaLibrary::convert(localMessageHandlerName, messageHandlerNameString);
listenerObject->listenToBroadcastMessage(messageHandlerNameString, emitterId);
return;
} // JavaLibrary::listenToMessage
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsBroadcastingNamespace::stopListeningToMessage(JNIEnv *env, jobject self, jlong listener, jlong emitter, jstring messageHandlerName)
{
UNREF(self);
if (listener == 0 || emitter == 0 || messageHandlerName == 0)
return;
JavaStringParam localMessageHandlerName(messageHandlerName);
CachedNetworkId listenerId(listener);
CachedNetworkId emitterId(emitter);
ServerObject* listenerObject = dynamic_cast<ServerObject*>(listenerId.getObject());
if (listenerObject == NULL)
return;
std::string messageHandlerNameString;
JavaLibrary::convert(localMessageHandlerName, messageHandlerNameString);
listenerObject->stopListeningToBroadcastMessage(messageHandlerNameString, emitterId);
return;
} // JavaLibrary::stopListeningToMessage
//--------------------------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsBroadcastingNamespace::getMessageListeners(JNIEnv *env, jobject self, jlong emitter, jstring messageHandlerName)
{
UNREF(self);
if (emitter == 0 || messageHandlerName == 0)
return 0;
JavaStringParam localMessageHandlerName(messageHandlerName);
CachedNetworkId emitterId(emitter);
ServerObject* emitterObject = dynamic_cast<ServerObject*>(emitterId.getObject());
if (emitterObject == NULL)
return 0;
std::string messageHandlerNameString;
JavaLibrary::convert(localMessageHandlerName, messageHandlerNameString);
// the listener list is a set of <messageHandlerName, NetworkId>, and we
// need to quickly locate the first entry in the set that contains the
// messageHandlerName we are looking for
static const NetworkId s_minNetworkId(std::numeric_limits<NetworkId::NetworkIdType>::min());
ServerObject::BroadcastMap const & listeners = emitterObject->getBroadcastListeners();
std::vector<NetworkId> listenerIds;
for (ServerObject::BroadcastMap::const_iterator iter = listeners.lower_bound(std::make_pair(messageHandlerNameString, s_minNetworkId)); ((iter != listeners.end()) && (iter->first == messageHandlerNameString)); ++iter)
listenerIds.push_back(iter->second);
if (listenerIds.empty())
return 0;
size_t count = listenerIds.size();
LocalLongArrayRefPtr listenerIdsArray = createNewLongArray(count);
if (listenerIdsArray == LocalLongArrayRef::cms_nullPtr)
return 0;
jlong jlongTmp;
for (size_t i = 0; i < count; ++i)
{
jlongTmp = listenerIds[i].getValue();
setLongArrayRegion(*listenerIdsArray, i, 1, &jlongTmp);
}
return listenerIdsArray->getReturnValue();
} // JavaLibrary::getMessageListeners
@@ -0,0 +1,472 @@
//========================================================================
//
// ScriptMethodsBuff.cpp - implements script methods dealing armor.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/BuffManager.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/ServerArmorTemplate.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/TangibleObject.h"
#include "sharedFile/TreeFile.h"
#include "sharedFoundation/DynamicVariableList.h"
#include "sharedObject/ObjectTemplateList.h"
#include "swgSharedUtility/Attributes.def"
#include "serverUtility/ServerClock.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsBuffNamespace
// ======================================================================
namespace ScriptMethodsBuffNamespace
{
bool install();
jboolean JNICALL addBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc);
jboolean JNICALL addBuffCaster(JNIEnv *env, jobject self, jlong target, jlong caster, jint nameCrc);
jboolean JNICALL addBuffWithDuration(JNIEnv *env, jobject self, jlong target, jint nameCrc, jfloat duration, jfloat value);
jboolean JNICALL addBuffWithDurationCaster(JNIEnv *env, jobject self, jlong target, jlong caster, jint nameCrc, jfloat duration, jfloat value);
jboolean JNICALL addBuffDurationCasterStack(JNIEnv *env, jobject self, jlong target, jlong caster, jint nameCrc, jfloat duration, jfloat value, jint count);
jboolean JNICALL removeBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc);
jboolean JNICALL hasBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc);
jintArray JNICALL getAllBuffs(JNIEnv *env, jobject self, jlong target);
jfloat JNICALL getBuffTimeRemaining(JNIEnv *env, jobject self, jlong target, jint nameCrc);
jfloat JNICALL getBuffCustomValue(JNIEnv *env, jobject self, jlong target, jint nameCrc);
jlong JNICALL getBuffStackCount(JNIEnv *env, jobject self, jlong target, jint nameCrc);
jboolean JNICALL decrementBuffStack(JNIEnv *env, jobject self, jlong target, jint nameCrc, jint stacksToRemove);
jlong JNICALL getBuffCaster(JNIEnv *env, jobject self, jlong target, jint nameCrc);
jboolean JNICALL decayBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc, jfloat decayPercent);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsBuffNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsBuffNamespace::c)}
JF("__addBuff", "(JI)Z", addBuff),
JF("__addBuff", "(JJI)Z", addBuffCaster),
JF("__addBuff", "(JIFF)Z", addBuffWithDuration),
JF("__addBuff", "(JJIFF)Z", addBuffWithDurationCaster),
JF("__addBuff", "(JJIFFI)Z", addBuffDurationCasterStack),
JF("__removeBuff", "(JI)Z", removeBuff),
JF("__hasBuff", "(JI)Z", hasBuff),
JF("__getAllBuffs", "(J)[I", getAllBuffs),
JF("__getBuffTimeRemaining", "(JI)F", getBuffTimeRemaining),
JF("__getBuffCustomValue", "(JI)F", getBuffCustomValue),
JF("__getBuffStackCount", "(JI)J", getBuffStackCount),
JF("__decrementBuffStack", "(JII)Z", decrementBuffStack),
JF("__getBuffCaster", "(JI)J", getBuffCaster),
JF("__decayBuff", "(JIF)Z", decayBuff),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI buff callback methods
//========================================================================
/**
* Adds a buff to a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to add the buff to
* @param nameCrc crc of the name of the buff to add
*
* @return false if an error occurred
*/
jboolean JNICALL ScriptMethodsBuffNamespace::addBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
creature->addBuff(nameCrc);
return JNI_TRUE;
} // JavaLibrary::addBuff
//--------------------------------------------------------
/**
* Adds a buff to a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to add the buff to
* @param nameCrc crc of the name of the buff to add
*
* @return false if an error occurred
*/
jboolean JNICALL ScriptMethodsBuffNamespace::addBuffCaster(JNIEnv *env, jobject self, jlong target, jlong caster, jint nameCrc)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
creature->addBuff(nameCrc, 0.0f, 0.0f, NetworkId(caster));
return JNI_TRUE;
} // JavaLibrary::addBuff
//--------------------------------------------------------
/**
* Adds a buff to a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to add the buff to
* @param nameCrc crc of the name of the buff to add
* @param duration float in seconds of the buff duration, or 0 as default
* @param value a float value that replaces the first effect's strength
*
* @return false if an error occurred
*/
jboolean JNICALL ScriptMethodsBuffNamespace::addBuffWithDurationCaster(JNIEnv *env, jobject self, jlong target, jlong caster, jint nameCrc, jfloat duration, jfloat value)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
creature->addBuff( nameCrc, duration, value, NetworkId(caster));
return JNI_TRUE;
}
//--------------------------------------------------------
/**
* Adds a buff to a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to add the buff to
* @param nameCrc crc of the name of the buff to add
* @param duration float in seconds of the buff duration, or 0 as default
* @param value a float value that replaces the first effect's strength
* @param count the stack count to apply
*
* @return false if an error occurred
*/
jboolean JNICALL ScriptMethodsBuffNamespace::addBuffDurationCasterStack(JNIEnv *env, jobject self, jlong target, jlong caster, jint nameCrc, jfloat duration, jfloat value, jint count)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
creature->addBuff( nameCrc, duration, value, NetworkId(caster), count);
return JNI_TRUE;
}
//--------------------------------------------------------
/**
* Adds a buff to a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to add the buff to
* @param nameCrc crc of the name of the buff to add
* @param duration float in seconds of the buff duration, or 0 as default
* @param value a float value that replaces the first effect's strength
*
* @return false if an error occurred
*/
jboolean JNICALL ScriptMethodsBuffNamespace::addBuffWithDuration(JNIEnv *env, jobject self, jlong target, jint nameCrc, jfloat duration, jfloat value)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
creature->addBuff(nameCrc, duration, value);
return JNI_TRUE;
} // JavaLibrary::addBuffWithDuration
//--------------------------------------------------------
/**
* Removes a buff from a creature. Remember buffs expire naturally.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to remove the buff from
* @param nameCrc crc of the name of the buff to remove
*
* @return false if an error occurred
*/
jboolean JNICALL ScriptMethodsBuffNamespace::removeBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
creature->removeBuff(nameCrc);
return JNI_TRUE;
} // JavaLibrary::removeBuff
//--------------------------------------------------------
/**
* Does this creature have this buff?
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to check
* @param nameCrc crc of the name of the buff to check
*
* @return false if an error occurred
*/
jboolean JNICALL ScriptMethodsBuffNamespace::hasBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc)
{
UNREF(self);
CreatureObject const * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
return static_cast<jboolean>(creature->hasBuff(nameCrc) ? JNI_TRUE : JNI_FALSE);
} // JavaLibrary::hasBuff
//--------------------------------------------------------
/**
* Return the crcs of all the buffs the creature has
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to get buffs for
*
* @return false if an error occurred
*/
jintArray JNICALL ScriptMethodsBuffNamespace::getAllBuffs(JNIEnv *env, jobject self, jlong target)
{
UNREF(self);
CreatureObject const * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
std::vector<uint32> buffCrcs;
creature->getAllBuffs(buffCrcs);
LocalIntArrayRefPtr valueArray = createNewIntArray(buffCrcs.size());
if (valueArray == LocalIntArrayRef::cms_nullPtr)
return 0;
setIntArrayRegion(*valueArray, 0, buffCrcs.size(), reinterpret_cast<jint *>(&buffCrcs[0]) );
return valueArray->getReturnValue();
} // JavaLibrary::getAllBuffs
//--------------------------------------------------------
/**
* Return the time remaining on this buff for this character
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to get buff for
* @param nameCrc the buff crc to get info for
*
* @return -1 / 0 for the 2 different "timeless" buffs, otherwise return the time left in seconds.
*/
jfloat JNICALL ScriptMethodsBuffNamespace::getBuffTimeRemaining(JNIEnv *env, jobject self, jlong target, jint nameCrc)
{
UNREF(self);
CreatureObject const * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return 0.0f;
Buff b;
if(!creature->getBuff(nameCrc, b))
return 0.0f;
if (creature->isPlayerControlled())
{
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject && playerObject->isInitialized())
{
uint32 currentTime = playerObject->getPlayedTime();
if (BuffManager::getBuffIsCelestial(nameCrc))
{
currentTime = ServerClock::getInstance().getGameTimeSeconds();
}
jfloat timeLeft = 0.0f;
if (b.m_timestamp == 0xFFFFFFFF)
{
timeLeft = -1.0f;
}
else if (b.m_timestamp == 0)
{
timeLeft = 0.0f;
}
else
{
timeLeft = static_cast<jfloat>( static_cast<int32>(b.m_timestamp) - static_cast<int32>(currentTime));
}
return timeLeft;
}
}
return static_cast<jfloat>(b.m_timestamp - creature->getPseudoPlayedTime());
} // JavaLibrary::getBuffTimeRemaining
//--------------------------------------------------------
/**
* Return the time remaining on this buff for this character
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to get buff for
* @param nameCrc the buff crc to get info for
*
* @return 0 if the buff doesn't exist - time is in seconds
*/
jfloat JNICALL ScriptMethodsBuffNamespace::getBuffCustomValue(JNIEnv *env, jobject self, jlong target, jint nameCrc)
{
UNREF(self);
CreatureObject const * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return 0.0f;
Buff b;
if(!creature->getBuff(nameCrc, b))
return 0.0f;
return static_cast<jfloat>(b.m_value);
} // JavaLibrary::getBuffCustomValue
//--------------------------------------------------------
/**
* Return the current stack count of the buff
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to get buff for
* @param nameCrc the buff crc to get info for
*
* @return 0 if the buff doesn't exist - otherwise return the stackcount
*/
jlong JNICALL ScriptMethodsBuffNamespace::getBuffStackCount(JNIEnv *env, jobject self, jlong target, jint nameCrc)
{
UNREF(self);
CreatureObject const * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return 0;
Buff b;
if(!creature->getBuff(nameCrc, b))
return 0;
return static_cast<jlong>(b.m_stackCount);
} // JavaLibrary::getBuffStackCount
//--------------------------------------------------------
/**
* Return true if the buff stack was decremented
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to decrement
* @param nameCrc the buff crc to get info for
*
* @return false if the buff doesn't exist - true if it succeeded
*/
jboolean JNICALL ScriptMethodsBuffNamespace::decrementBuffStack(JNIEnv *env, jobject self, jlong target, jint nameCrc, jint stacksToRemove)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
Buff b;
if(!creature->getBuff(nameCrc, b))
return JNI_FALSE;
creature->decrementBuff(nameCrc, stacksToRemove);
return JNI_TRUE;
} // JavaLibrary::decrementBuffStack
//--------------------------------------------------------
/**
* Return the OID of the buff caster
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to get buff for
* @param nameCrc the buff crc to get info for
*
* @return -1 if the buff or creature cant be found, 0 will return if no OID was supplied originally
*/
jlong JNICALL ScriptMethodsBuffNamespace::getBuffCaster(JNIEnv *env, jobject self, jlong target, jint nameCrc)
{
UNREF(self);
CreatureObject const * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return -1;
Buff b;
if(!creature->getBuff(nameCrc, b))
return -1;
return static_cast<jlong>(b.m_caster.getValue());
} // JavaLibrary::getBuffCaster
//--------------------------------------------------------
jboolean JNICALL ScriptMethodsBuffNamespace::decayBuff(JNIEnv *env, jobject self, jlong target, jint nameCrc, jfloat decayPercent)
{
UNREF(self);
CreatureObject * creature = 0;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
if(!creature->hasBuff(nameCrc))
return JNI_FALSE;
creature->decayBuff(nameCrc, decayPercent);
return JNI_TRUE;
}
//--------------------------------------------------------
@@ -0,0 +1,218 @@
//========================================================================
//
// ScriptMethodsBuffBuilder.cpp - script methods dealing with the buff builder.
//
// copyright 2006 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/Chat.h"
#include "serverGame/ServerBuffBuilderManager.h"
#include "serverGame/ServerObject.h"
#include "sharedFoundation/Os.h"
#include "sharedGame/SharedBuffBuilderManager.h"
#include "sharedGame/SharedStringIds.h"
#include "sharedNetworkMessages/BuffBuilderStartMessage.h"
#include "sharedObject/Controller.h"
// ======================================================================
// ScriptMethodsBuffBuilderNamespace
// ======================================================================
namespace ScriptMethodsBuffBuilderNamespace
{
bool install();
void JNICALL buffBuilderStart(JNIEnv *env, jobject self, jlong jbufferId, jlong jrecipientId );
jboolean JNICALL buffBuilderValidated(JNIEnv *env, jobject self,
jlong jbufferId,
jlong jrecipientId,
jint jstartingTime,
jint jbufferRequiredCredits,
jint jrecipientPaidCredits,
jboolean jaccepted,
jobjectArray jbuffComponentKeys,
jintArray jbuffComponentValues);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsBuffBuilderNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsBuffBuilderNamespace::c)}
JF("_buffBuilderStart", "(JJ)V", buffBuilderStart),
JF("_buffBuilderValidated", "(JJIIIZ[Ljava/lang/String;[I)Z", buffBuilderValidated)
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI buff builder callback methods
//========================================================================
void JNICALL ScriptMethodsBuffBuilderNamespace::buffBuilderStart(JNIEnv *env, jobject self, jlong jbufferId, jlong jrecipientId)
{
UNREF(env);
UNREF(self);
ServerObject * bufferObj = 0;
if (!JavaLibrary::getObject(jbufferId, bufferObj))
{
WARNING(true, ("bad buffer passed to JavaLibrary::buffBuilderStart"));
return;
}
ServerObject * recipientObj = 0;
if (!JavaLibrary::getObject(jrecipientId, recipientObj))
{
WARNING(true, ("bad recipient passed to JavaLibrary::buffBuilderStart"));
return;
}
SharedBuffBuilderManager::Session newSession;
newSession.bufferId = bufferObj->getNetworkId();
newSession.recipientId = recipientObj->getNetworkId();
newSession.startingTime = Os::getRealSystemTime();
SharedBuffBuilderManager::startSession(newSession);
Controller * const bufferController = bufferObj->getController();
if(bufferController)
{
BuffBuilderStartMessage * const msg = new BuffBuilderStartMessage(bufferObj->getNetworkId(), recipientObj->getNetworkId());
bufferController->appendMessage(CM_buffBuilderStart, 0, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
Controller * const recipientController = recipientObj->getController();
if(recipientController && recipientController != bufferController)
{
BuffBuilderStartMessage * const msg = new BuffBuilderStartMessage(bufferObj->getNetworkId(), recipientObj->getNetworkId());
recipientController->appendMessage(CM_buffBuilderStart, 0, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
//------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsBuffBuilderNamespace::buffBuilderValidated(JNIEnv *env, jobject self, jlong jbufferId, jlong jrecipientId, jint jstartingTime, jint jbufferRequiredCredits, jint jrecipientPaidCredits, jboolean jaccepted, jobjectArray jbuffComponentKeys, jintArray jbuffComponentValues)
{
UNREF(self);
UNREF(jrecipientPaidCredits);
SharedBuffBuilderManager::Session session;
ServerObject * bufferObj = 0;
if (!JavaLibrary::getObject(jbufferId, bufferObj) || !bufferObj)
{
WARNING(true, ("bad buffer passed to JavaLibrary::buffBuilderValidated"));
return JNI_FALSE;
}
ServerObject * recipientObj = 0;
if (!JavaLibrary::getObject(jrecipientId, recipientObj) || !recipientObj)
{
WARNING(true, ("bad recipient passed to JavaLibrary::buffBuilderValidated"));
return JNI_FALSE;
}
session.bufferId = bufferObj->getNetworkId();
session.recipientId = recipientObj->getNetworkId();
session.startingTime = jstartingTime;
session.bufferRequiredCredits = jbufferRequiredCredits;
session.accepted = jaccepted;
SharedBuffBuilderManager::Session currentSession;
bool const gotCurrentSession = SharedBuffBuilderManager::getSession(session.bufferId, currentSession);
if(!gotCurrentSession)
{
WARNING(true,("ScriptMethodsBuffBuilderNamespace::buffBuilderValidated - could not get current session\n"));
return JNI_FALSE;
}
//if the session isn't valid, cancel it and don't apply changes
if(!session.accepted)
{
Chat::sendSystemMessage(*bufferObj, SharedStringIds::buffbuilder_session_not_valid, Unicode::emptyString);
if(bufferObj != recipientObj)
{
Chat::sendSystemMessage(*recipientObj, SharedStringIds::buffbuilder_session_not_valid, Unicode::emptyString);
}
ServerBuffBuilderManager::cancelSession(session.bufferId, session.recipientId);
return JNI_TRUE;
}
std::string tempString;
//get buffComponent values
std::map<std::string, std::pair<int,int> > buffComponents;
int countKeys = env->GetArrayLength(jbuffComponentKeys);
int countValues = env->GetArrayLength(jbuffComponentValues);
if(countKeys != countValues)
{
WARNING(true, ("index keys and values arrays are of diffent sizes"));
return JNI_FALSE;
}
jint * const buffComponentsValuesArray = env->GetIntArrayElements(jbuffComponentValues, NULL);
if (buffComponentsValuesArray == NULL)
{
return JNI_FALSE;
}
std::vector<int> buffComponentsValues(buffComponentsValuesArray, &buffComponentsValuesArray[countValues]);
env->ReleaseIntArrayElements(jbuffComponentValues, buffComponentsValuesArray, JNI_ABORT);
for (int j = 0; j < countKeys; ++j)
{
JavaString jTempString(static_cast<jstring>(env->GetObjectArrayElement(jbuffComponentKeys, j)));
if (JavaLibrary::convert(jTempString, tempString))
{
buffComponents[tempString].first = buffComponentsValues[static_cast<unsigned int>(j)];
buffComponents[tempString].second = currentSession.buffComponents[tempString].second;
}
}
session.buffComponents = buffComponents;
bool const result = ServerBuffBuilderManager::makeChanges(session);
if(!result)
{
Chat::sendSystemMessage(*bufferObj, SharedStringIds::buffbuilder_session_not_valid, Unicode::emptyString);
if(bufferObj != recipientObj)
{
Chat::sendSystemMessage(*recipientObj, SharedStringIds::buffbuilder_session_not_valid, Unicode::emptyString);
}
ServerBuffBuilderManager::cancelSession(session.bufferId, session.recipientId);
}
else
{
//send the final change message to the buffer to indicate acceptance
Controller * const bufferController = bufferObj ? bufferObj->getController() : NULL;
if(bufferController)
{
BuffBuilderChangeMessage * outMsg = new BuffBuilderChangeMessage();
if(outMsg)
{
outMsg->setBufferId(session.bufferId);
outMsg->setRecipientId(session.recipientId);
outMsg->setOrigin(BuffBuilderChangeMessage::O_SERVER);
outMsg->setAccepted(true);
bufferController->appendMessage(static_cast<int>(CM_buffBuilderChange), 0.0f, outMsg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
}
if(result)
return JNI_TRUE;
else
return JNI_FALSE;
}
//------------------------------------------------------------------------
@@ -0,0 +1,757 @@
// ScriptMethodsChat.cpp
// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved.
// Author: Justin Randall
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "UnicodeUtils.h"
#include "serverGame/Chat.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerWorld.h"
#include "serverNetworkMessages/FactionalSystemMessage.h"
#include "serverScript/ConfigServerScript.h"
#include "sharedGame/OutOfBandPackager.h"
#include "sharedGame/ProsePackage.h"
#include "sharedGame/ProsePackageArchive.h"
#include "sharedGame/SocialsManager.h"
#include "sharedGame/Waypoint.h"
#include "sharedGame/WaypointData.h"
#include "sharedMathArchive/VectorArchive.h"
// ======================================================================
// ScriptMethodsChatNamespace
// ======================================================================
namespace ScriptMethodsChatNamespace
{
bool install();
void JNICALL chatCreateRoom(JNIEnv * env, jobject self, jstring me, jboolean isPublic, jstring roomName, jstring roomTitle);
void JNICALL chatDestroyRoom(JNIEnv * env, jobject self, jstring roomName);
void JNICALL chatEnterRoom(JNIEnv * env, jobject self, jstring who, jstring roomName);
void JNICALL chatExitRoom(JNIEnv * env, jobject self, jstring who, jstring roomName);
void JNICALL chatAddModeratorToRoom(JNIEnv * env, jobject self, jstring roomName, jstring moderatorName);
jstring JNICALL chatPackOutOfBandToken(JNIEnv * env, jobject self, jlong source, jstring target, jint position);
jstring JNICALL chatPackOutOfBandWaypoint(JNIEnv * env, jobject self, jlong source, jstring target, jint position);
jstring JNICALL chatPackOutOfBandWaypointData(JNIEnv * env, jobject self, jstring target, jint position, jstring planet, jfloat x, jfloat z, jobject nameId, jstring name);
jstring JNICALL packOutOfBandProsePackage(JNIEnv * env, jobject self, jstring target, jint position, jobject stringId, jlong objActor, jlong objTarget, jlong objOther, jobject nameIdActor, jobject nameIdTarget, jobject nameIdOther, jstring nameActor, jstring nameTarget, jstring nameOther, jint digitInteger, jfloat digitFloat, jboolean complexGrammar);
void JNICALL chatRemoveModeratorFromRoom(JNIEnv * env, jobject self, jstring roomName, jstring moderatorName);
void JNICALL chatSendInstantMessage(JNIEnv * env, jobject self, jstring from, jstring to, jstring messageText, jstring outOfBand);
void JNICALL chatSendPersistentMessage(JNIEnv * env, jobject self, jstring from, jstring to, jstring messageText, jstring outOfBand, jstring subject);
void JNICALL chatSendToRoom(JNIEnv * env, jobject self, jstring from, jstring roomName, jstring messageText, jstring outOfBand);
void JNICALL chatSendSystemMessage(JNIEnv * env, jobject self, jstring to, jstring message, jstring oob);
void JNICALL chatSendSystemMessageObjId(JNIEnv * env, jobject self, jlong to, jstring message, jstring oob);
jstring JNICALL getEmoteFromCrc(JNIEnv * env, jobject self, jint crc);
void JNICALL chatSendQuestSystemMessage(JNIEnv * env, jobject self, jlong to, jstring message, jstring oob);
void JNICALL chatSendFactionalSystemMessagePlanet(JNIEnv * env, jobject self, jstring prosePackage, jobject loc, jfloat radius, jboolean notifyImperial, jboolean notifyRebel);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsChatNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsChatNamespace::c)}
JF("_chatCreateRoom", "(Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V", chatCreateRoom),
JF("chatDestroyRoom", "(Ljava/lang/String;)V", chatDestroyRoom),
JF("_chatEnterRoom", "(Ljava/lang/String;Ljava/lang/String;)V", chatEnterRoom),
JF("_chatExitRoom", "(Ljava/lang/String;Ljava/lang/String;)V", chatExitRoom),
JF("chatAddModeratorToRoom", "(Ljava/lang/String;Ljava/lang/String;)V", chatAddModeratorToRoom),
JF("chatRemoveModeratorFromRoom", "(Ljava/lang/String;Ljava/lang/String;)V", chatRemoveModeratorFromRoom),
JF("_chatSendInstantMessage", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", chatSendInstantMessage),
JF("_chatSendPersistentMessage", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", chatSendPersistentMessage),
JF("_chatSendToRoom", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", chatSendToRoom),
JF("__packOutOfBandToken", "(JLjava/lang/String;I)Ljava/lang/String;", chatPackOutOfBandToken),
JF("__packOutOfBandWaypoint", "(JLjava/lang/String;I)Ljava/lang/String;", chatPackOutOfBandWaypoint),
JF("_packOutOfBandWaypointData", "(Ljava/lang/String;ILjava/lang/String;FFLscript/string_id;Ljava/lang/String;)Ljava/lang/String;", chatPackOutOfBandWaypointData),
JF("__packOutOfBandProsePackage", "(Ljava/lang/String;ILscript/string_id;JJJLscript/string_id;Lscript/string_id;Lscript/string_id;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IFZ)Ljava/lang/String;", packOutOfBandProsePackage),
JF("sendSystemMessage", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", chatSendSystemMessage),
JF("_sendSystemMessage", "(JLjava/lang/String;Ljava/lang/String;)V", chatSendSystemMessageObjId),
JF("getEmoteFromCrc", "(I)Ljava/lang/String;", getEmoteFromCrc),
JF("_sendQuestSystemMessage", "(JLjava/lang/String;Ljava/lang/String;)V", chatSendQuestSystemMessage),
JF("sendFactionalSystemMessagePlanet", "(Ljava/lang/String;Lscript/location;FZZ)V", chatSendFactionalSystemMessagePlanet),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatAddModeratorToRoom(JNIEnv * env, jobject self, jstring roomName, jstring moderatorName)
{
JavaStringParam jsprn(roomName);
std::string r;
if(! JavaLibrary::convert(jsprn, r))
return;
JavaStringParam jspmn(moderatorName);
std::string m;
if(! JavaLibrary::convert(jspmn, m))
return;
Chat::addModeratorToRoom(m, r);
}
//-----------------------------------------------------------------------
void JNICALL JNICALL ScriptMethodsChatNamespace::chatCreateRoom(JNIEnv * env, jobject self, jstring me, jboolean isPublic, jstring roomName, jstring roomTitle)
{
JavaStringParam jspMe(me);
std::string m;
if(!JavaLibrary::convert(jspMe, m))
return;
JavaStringParam jsprn(roomName);
std::string r;
if(! JavaLibrary::convert(jsprn, r))
return;
JavaStringParam jspt(roomTitle);
std::string t;
if(! JavaLibrary::convert(jspt, t))
return;
Chat::createRoom(m, isPublic == JNI_TRUE, r, t);
}
//-----------------------------------------------------------------------
void JNICALL JNICALL ScriptMethodsChatNamespace::chatDestroyRoom(JNIEnv * env, jobject self, jstring roomName)
{
JavaStringParam jsprn(roomName);
std::string r;
if(! JavaLibrary::convert(jsprn, r))
return;
Chat::destroyRoom(r);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatEnterRoom(JNIEnv * env, jobject self, jstring me, jstring roomName)
{
JavaStringParam jspm(me);
std::string m;
if(! JavaLibrary::convert(jspm, m))
return;
JavaStringParam jspr(roomName);
std::string r;
if(! JavaLibrary::convert(jspr, r))
return;
Chat::enterRoom(m, r, true, false);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatExitRoom(JNIEnv * env, jobject self, jstring me, jstring roomName)
{
JavaStringParam jspm(me);
std::string m;
if(! JavaLibrary::convert(jspm, m))
return;
JavaStringParam jspr(roomName);
std::string r;
if(! JavaLibrary::convert(jspr, r))
return;
Chat::exitRoom(m, r);
}
//-----------------------------------------------------------------------
jstring JNICALL ScriptMethodsChatNamespace::chatPackOutOfBandToken(JNIEnv * env, jobject self, jlong source, jstring target, jint position)
{
UNREF(env);
UNREF(self);
UNREF(source);
UNREF(target);
UNREF(position);
JavaString result("JavaLibrary::chatPackOutOfBandToken - FAILED Token archive not implemented");
return result.getReturnValue();
#if 0
JavaStringParam jt(target);
Unicode::String t;
if(! JavaLibrary::convert(jt, t))
return 0;
if(! source)
return 0;
Token * token = 0;
if(!JavaLibrary::getObject(source, token))
return 0;
Archive::ByteStream bs;
Archive::put(bs, std::string(token->getObjectTemplateName()));
Archive::put(bs, *token);
OutOfBandPackager::pack(bs, gs_Object, position, t);
JavaString result(t);
return result.getReturnValue();
#endif
}
//----------------------------------------------------------------------
jstring JNICALL ScriptMethodsChatNamespace::chatPackOutOfBandWaypointData(JNIEnv * env, jobject self, jstring target, jint position, jstring planet, jfloat x, jfloat z, jobject nameId, jstring name)
{
UNREF(env);
UNREF(self);
Unicode::String t; //target
std::string p; //planet
Unicode::String n; //name
StringId nid; //nameId
//-- target may be null, we'll just start a new string
if (target)
{
const JavaStringParam jtarget(target);
if (!JavaLibrary::convert(jtarget, t))
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatPackOutOfBandWaypointData failed bad target string"));
return 0;
}
}
//-- if planet is null, just use the current sceneId
if (planet)
{
const JavaStringParam jplanet(planet);
Unicode::String p_tmp;
if (!JavaLibrary::convert(jplanet, p_tmp))
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatPackOutOfBandWaypointData failed bad planet string"));
return 0;
}
p = Unicode::wideToNarrow (p_tmp);
}
else
{
p = ServerWorld::getSceneId ();
}
if (!name && !nameId)
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatPackOutOfBandWaypointData failed bad nameId"));
return 0;
}
if (nameId)
{
if (!ScriptConversion::convert (nameId, nid))
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatPackOutOfBandWaypointData failed bad nameId"));
return 0;
}
}
if (name)
{
const JavaStringParam jname (name);
if (!JavaLibrary::convert(jname, n))
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatPackOutOfBandWaypointData failed bad name string"));
return 0;
}
}
WaypointDataBase wd;
wd.m_location = Location(Vector(x, 0, z), NetworkId::cms_invalid, Location::getCrcBySceneName(p));
wd.setName(n);
OutOfBandPackager::pack (wd, position, t);
JavaString result(t);
return result.getReturnValue();
}
//-----------------------------------------------------------------------
jstring JNICALL ScriptMethodsChatNamespace::chatPackOutOfBandWaypoint(JNIEnv * env, jobject self, jlong source, jstring target, jint position)
{
UNREF(env);
UNREF(self);
Unicode::String t;
if (target)
{
const JavaStringParam jt(target);
if (!JavaLibrary::convert(jt, t))
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatPackOutOfBandWaypoint failed bad target string"));
return 0;
}
}
if (!source)
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatPackOutOfBandWaypoint failed null source"));
return 0;
}
NetworkId id(source);
const Waypoint waypoint = Waypoint::getWaypointById(id);
if (waypoint.isValid())
{
OutOfBandPackager::pack (waypoint.getWaypointDataBase(), position, t);
}
else
{
ServerObject * obj = 0;
if (JavaLibrary::getObject(source, obj) && obj)
{
WaypointDataBase wd;
wd.m_location = Location(obj->getPosition_w(), NetworkId::cms_invalid, Location::getCrcBySceneName(ServerWorld::getSceneId()));
wd.setName(obj->getAssignedObjectName());
OutOfBandPackager::pack (wd, position, t);
}
}
JavaString result(t);
return result.getReturnValue();
}
//----------------------------------------------------------------------
jstring JNICALL ScriptMethodsChatNamespace::packOutOfBandProsePackage(JNIEnv * env, jobject self, jstring target, jint position, jobject stringId, jlong objActor, jlong objTarget, jlong objOther, jobject nameIdActor, jobject nameIdTarget, jobject nameIdOther, jstring nameActor, jstring nameTarget, jstring nameOther, jint digitInteger, jfloat digitFloat, jboolean complexGrammar)
{
UNREF(env);
UNREF(self);
if (!stringId)
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage attempt to pack prose package with null stringId"));
return 0;
}
Unicode::String t;
if (target)
{
JavaStringParam jt(target);
if(! JavaLibrary::convert(jt, t))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert target string"));
return 0;
}
}
ProsePackage pp (complexGrammar);
if (!ScriptConversion::convert (stringId, pp.stringId))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert StringId"));
return 0;
}
pp.actor.id = NetworkId(objActor);
if (objActor && pp.actor.id == NetworkId::cms_invalid)
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert actor id"));
return 0;
}
pp.target.id = NetworkId(objTarget);
if (objTarget && pp.target.id == NetworkId::cms_invalid)
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert target id"));
return 0;
}
pp.other.id = NetworkId(objOther);
if (objOther && pp.other.id == NetworkId::cms_invalid)
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert other id"));
return 0;
}
if (nameIdActor)
{
if (!ScriptConversion::convert(nameIdActor, pp.actor.stringId))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert actor id"));
return 0;
}
}
else if (nameActor)
{
const JavaStringParam jt(nameActor);
if(! JavaLibrary::convert(jt, pp.actor.str))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert actor name"));
return 0;
}
}
if (nameIdTarget)
{
if (!ScriptConversion::convert(nameIdTarget, pp.target.stringId))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert target id"));
return 0;
}
}
else if (nameTarget)
{
const JavaStringParam jt(nameTarget);
if(! JavaLibrary::convert(jt, pp.target.str))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert target name"));
return 0;
}
}
if (nameIdOther)
{
if (!ScriptConversion::convert(nameIdOther, pp.other.stringId))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert other id"));
return 0;
}
}
else if (nameOther)
{
const JavaStringParam jt(nameOther);
if(! JavaLibrary::convert(jt, pp.other.str))
{
DEBUG_WARNING (true, ("JavaLibrary::packOutOfBandProsePackage unable to convert other name"));
return 0;
}
}
pp.digitInteger = digitInteger;
pp.digitFloat = digitFloat;
Archive::ByteStream bs;
Archive::put(bs, pp);
OutOfBandPackager::pack(bs, OutOfBandPackager::OT_prosePackage, position, t);
JavaString result(t);
return result.getReturnValue();
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatSendToRoom(JNIEnv * env, jobject self, jstring from, jstring roomName, jstring message, jstring outOfBand)
{
JavaStringParam jspf(from);
std::string f;
if(! JavaLibrary::convert(jspf, f))
return;
JavaStringParam jsprn(roomName);
std::string r;
if(! JavaLibrary::convert(jsprn, r))
return;
Unicode::String m;
if (message)
{
JavaStringParam jspm(message);
if(! JavaLibrary::convert(jspm, m))
return;
}
Unicode::String o;
if (outOfBand)
{
JavaStringParam jspo(outOfBand);
if(! JavaLibrary::convert(jspo, o))
return;
}
if (o.empty () && m.empty ())
{
DEBUG_WARNING (true, ("chatSendToRoom with empty message _and_ oob"));
return;
}
Chat::sendToRoom(f, r, m, o);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatRemoveModeratorFromRoom(JNIEnv * env, jobject self, jstring roomName, jstring moderatorName)
{
JavaStringParam jsprn(roomName);
std::string r;
if(! JavaLibrary::convert(jsprn, r))
return;
JavaStringParam jspmn(moderatorName);
std::string m;
if(! JavaLibrary::convert(jspmn, m))
return;
Chat::removeModeratorFromRoom(m, r);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatSendInstantMessage(JNIEnv * env, jobject self, jstring from, jstring to, jstring message, jstring outOfBand)
{
JavaStringParam jspf(from);
std::string f;
if(! JavaLibrary::convert(jspf, f))
return;
JavaStringParam jspt(to);
std::string t;
if(! JavaLibrary::convert(jspt, t))
return;
Unicode::String m;
if (message)
{
JavaStringParam jspm(message);
if(! JavaLibrary::convert(jspm, m))
return;
}
Unicode::String o;
if (outOfBand)
{
JavaStringParam jspo(outOfBand);
if(! JavaLibrary::convert(jspo, o))
return;
}
if (o.empty () && m.empty ())
{
DEBUG_WARNING (true, ("chatSendInstantMessage with empty message _and_ oob"));
return;
}
Chat::sendInstantMessage(f, t, m, o);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatSendPersistentMessage(JNIEnv * env, jobject self, jstring from, jstring to, jstring message, jstring outOfBand, jstring subject)
{
JavaStringParam jspf(from);
std::string f;
if(! JavaLibrary::convert(jspf, f))
return;
JavaStringParam jspt(to);
std::string t;
if(! JavaLibrary::convert(jspt, t))
return;
Unicode::String m;
if (message)
{
JavaStringParam jspm(message);
if(! JavaLibrary::convert(jspm, m))
return;
}
Unicode::String o;
if (outOfBand)
{
JavaStringParam jspo(outOfBand);
if(! JavaLibrary::convert(jspo, o))
return;
}
Unicode::String s;
if (subject)
{
JavaStringParam jsps(subject);
if(! JavaLibrary::convert(jsps, s))
return;
}
Chat::sendPersistentMessage(f, t, s, m, o);
}
//----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatSendSystemMessage(JNIEnv * env, jobject self, jstring _to, jstring _message, jstring _oob)
{
UNREF(self);
if (!_to)
return;
Unicode::String to;
{
const JavaStringParam jt(_to);
if(!JavaLibrary::convert(jt, to))
return;
}
Unicode::String message;
if (_message)
{
const JavaStringParam jt(_message);
if (!JavaLibrary::convert(jt, message))
return;
}
Unicode::String oob;
if (_oob)
{
const JavaStringParam jt(_oob);
if (!JavaLibrary::convert(jt, oob))
return;
}
if (message.empty () && oob.empty ())
{
DEBUG_WARNING (true, ("chatSendSystemMessage with empty message _and_ oob"));
}
Chat::sendSystemMessage(Unicode::wideToNarrow (to), message, oob);
}
//----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatSendSystemMessageObjId(JNIEnv * env, jobject self, jlong _to, jstring _message, jstring _oob)
{
UNREF(self);
if (!_to)
return;
const ServerObject * player = 0;
if(!JavaLibrary::getObject(_to, player))
{
DEBUG_WARNING (true, ("ScriptMethodsChat JavaLibrary::chatSendSystemMessageObjId failed bad source object (not null)"));
if (ConfigServerScript::allowDebugConsoleMessages())
{
fprintf(stderr, "WARNING: JavaLibrary::chatSendSystemMessageObjId: failed bad source object (not null)\n");
JavaLibrary::printJavaStack();
}
return;
}
Unicode::String message;
if (_message)
{
const JavaStringParam jt(_message);
if (!JavaLibrary::convert(jt, message))
return;
}
Unicode::String oob;
if (_oob)
{
const JavaStringParam jt(_oob);
if (!JavaLibrary::convert(jt, oob))
return;
}
if (message.empty () && oob.empty ())
{
DEBUG_WARNING (true, ("chatSendSystemMessage with empty message _and_ oob"));
}
Chat::sendSystemMessage(*player, message, oob);
}
//----------------------------------------------------------------------
jstring JNICALL ScriptMethodsChatNamespace::getEmoteFromCrc(JNIEnv * env, jobject self, jint crc)
{
std::string emoteName;
if (!SocialsManager::getSocialNameByCrc(crc, emoteName))
return 0;
return JavaString(emoteName).getReturnValue();
}
//----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatSendQuestSystemMessage(JNIEnv * /*env*/, jobject /*self*/, jlong jobject_networkId, jstring jstring_message, jstring jstring_oob)
{
ServerObject const * serverObject = 0;
{
if (!JavaLibrary::getObject(jobject_networkId, serverObject))
{
//@TODO: this function should not be used with object ids of players that are not on the server, however right
// now we have no other method. when we have a method that reliably sends these messages across server, use it and put this back in
//JAVA_THROW_SCRIPT_EXCEPTION(true, ("WARNING: ScriptMethodsChat JavaLibrary::chatSendQuestSystemMessage: could not convert parameter 1 to a valid networkId\n"));
//printJavaStack();
return;
}
}
Unicode::String message;
{
JavaStringParam const jt(jstring_message);
IGNORE_RETURN(JavaLibrary::convert(jt, message));
}
Unicode::String oob;
{
JavaStringParam const jt(jstring_oob);
IGNORE_RETURN(!JavaLibrary::convert(jt, oob));
}
JAVA_THROW_SCRIPT_EXCEPTION(message.empty() && oob.empty(), ("ScriptMethodsChat JavaLibrary::chatSendQuestSystemMessage: all parameters were valid, but empty"));
Chat::sendQuestSystemMessage(*serverObject, message, oob);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsChatNamespace::chatSendFactionalSystemMessagePlanet(JNIEnv * env, jobject self, jstring prosePackage, jobject loc, jfloat radius, jboolean notifyImperial, jboolean notifyRebel)
{
if (!prosePackage)
return;
JavaStringParam jsProsePackage(prosePackage);
Unicode::String strProsePackage;
if(! JavaLibrary::convert(jsProsePackage, strProsePackage))
return;
Vector vectorLocation;
if (loc)
{
if (!ScriptConversion::convertWorld(loc, vectorLocation))
return;
}
if (!notifyImperial && !notifyRebel)
return;
// send to planet server for distribution to all game servers
// running this planet; each game server will then check for
// all players within the range and send the player the message;
// we need to do this because the range could cover multiple game servers
FactionalSystemMessage m(strProsePackage, vectorLocation, (loc ? radius : -1.0f), notifyImperial, notifyRebel);
GameServer::getInstance().sendToPlanetServer(m);
}
//----------------------------------------------------------------------
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,963 @@
//-----------------------------------------------------------------------
// ScriptMethodsClientEffect.cpp
// Copyright 2002, Sony Online Entertainment Inc., all rights reserved.
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObject.h"
#include "serverGame/TangibleObject.h"
#include "sharedObject/CellProperty.h"
#include "sharedMath/PackedArgb.h"
#include "sharedNetworkMessages/ClientEffectMessages.h"
#include "sharedNetworkMessages/MessageQueueGenericValueType.h"
#include "sharedNetworkMessages/PlayMusicMessage.h"
// ======================================================================
// ScriptMethodsClientEffectNamespace
// ======================================================================
namespace ScriptMethodsClientEffectNamespace
{
bool install();
jboolean JNICALL playClientEventObj(JNIEnv *env, jobject self, jlong client, jstring eventType, jlong obj, jstring hardpoint, jobject jTransform);
jboolean JNICALL playClientEventObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring eventType, jlong obj, jstring hardpoint, jobject jTransform);
jboolean JNICALL playClientEventLoc(JNIEnv *env, jobject self, jlong client, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta);
jboolean JNICALL playClientEventLocLimited(JNIEnv *env, jobject self, jlongArray client, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta);
jboolean JNICALL playUiEffect(JNIEnv *env, jobject self, jlong client, jstring uiEffectString);
jboolean JNICALL playClientEffectObj(JNIEnv *env, jobject self, jlong client, jstring effectName, jlong obj, jstring hardpoint, jobject jTransform, jstring labelName);
jboolean JNICALL playClientEffectObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jlong obj, jstring hardpoint, jobject jTransform, jstring labelName);
jboolean JNICALL playClientEffectLoc(JNIEnv *env, jobject self, jlong client, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName);
jboolean JNICALL playClientEffectLocLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName);
jboolean JNICALL stopClientEffectObjByLabel(JNIEnv *env, jobject self, jlong client, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate);
jboolean JNICALL stopClientEffectObjByLabelLimited(JNIEnv *env, jobject self, jlongArray clients, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate);
jboolean JNICALL play2dNonLoopingMusic(JNIEnv *env, jobject self, jlong client, jstring musicName);
jboolean JNICALL play2dNonLoopingSound(JNIEnv *env, jobject self, jlong client, jstring musicName);
jboolean JNICALL playMusicWithParms(JNIEnv *env, jobject self, jlong client, jlong source, jstring musicName, jint playtype, bool loop);
void JNICALL sendMusicFlourish(JNIEnv *env, jobject self, jlong performer, jint flourishIndex);
jboolean JNICALL createClientProjectile(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject start, jobject end, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a);
jboolean JNICALL createClientProjectileObjectToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a);
jboolean JNICALL createClientProjectileLocationToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject source, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a);
jboolean JNICALL createClientProjectileObjectToLocation(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jobject target, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a);
void JNICALL addObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring filename, jstring hardpoint, jobject offset, jfloat scale, jstring label);
void JNICALL removeObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label);
void JNICALL removeAllObjectEffects(JNIEnv * env, jobject self, jlong obj);
jboolean JNICALL hasObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsClientEffectNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsClientEffectNamespace::c)}
JF("_playClientEventObj", "(JLjava/lang/String;JLjava/lang/String;Lscript/transform;)Z", playClientEventObj),
JF("_playClientEventObj", "([JLjava/lang/String;JLjava/lang/String;Lscript/transform;)Z", playClientEventObjLimited),
JF("_playClientEventLoc", "(JLjava/lang/String;Ljava/lang/String;Lscript/location;F)Z", playClientEventLoc),
JF("_playClientEventLoc", "([JLjava/lang/String;Ljava/lang/String;Lscript/location;F)Z", playClientEventLocLimited),
JF("_playUiEffect", "(JLjava/lang/String;)Z", playUiEffect),
JF("_playClientEffectObj", "(JLjava/lang/String;JLjava/lang/String;Lscript/transform;Ljava/lang/String;)Z", playClientEffectObj),
JF("_playClientEffectObj", "([JLjava/lang/String;JLjava/lang/String;Lscript/transform;Ljava/lang/String;)Z", playClientEffectObjLimited),
JF("_playClientEffectLoc", "(JLjava/lang/String;Lscript/location;FLjava/lang/String;)Z", playClientEffectLoc),
JF("_playClientEffectLoc", "([JLjava/lang/String;Lscript/location;FLjava/lang/String;)Z", playClientEffectLocLimited),
JF("_stopClientEffectObjByLabel", "(JJLjava/lang/String;Z)Z", stopClientEffectObjByLabel),
JF("_stopClientEffectObjByLabel", "([JJLjava/lang/String;Z)Z", stopClientEffectObjByLabelLimited),
JF("_play2dNonLoopingMusic", "(JLjava/lang/String;)Z", play2dNonLoopingMusic),
JF("_play2dNonLoopingSound", "(JLjava/lang/String;)Z", play2dNonLoopingSound),
JF("_playMusic", "(JJLjava/lang/String;IZ)Z", playMusicWithParms),
JF("_createClientProjectile", "(JLjava/lang/String;Lscript/location;Lscript/location;FFZIIII)Z", createClientProjectile),
JF("_createClientProjectileObjectToObject", "(JLjava/lang/String;JLjava/lang/String;JLjava/lang/String;FFZIIII)Z", createClientProjectileObjectToObject),
JF("_createClientProjectileLocationToObject", "(JLjava/lang/String;Lscript/location;JLjava/lang/String;FFZIIII)Z", createClientProjectileLocationToObject),
JF("_createClientProjectileObjectToLocation", "(JLjava/lang/String;JLjava/lang/String;Lscript/location;FFZIIII)Z", createClientProjectileObjectToLocation),
JF("_addObjectEffect", "(JLjava/lang/String;Ljava/lang/String;Lscript/vector;FLjava/lang/String;)V", addObjectEffect),
JF("_removeObjectEffect", "(JLjava/lang/String;)V", removeObjectEffect),
JF("_removeAllObjectEffects", "(J)V", removeAllObjectEffects),
JF("_hasObjectEffect", "(JLjava/lang/String;)Z", hasObjectEffect),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventObj(JNIEnv *env, jobject self, jlong client, jstring eventType, jlong objectToPlayEventOn, jstring jHardpoint, jobject jTransform)
{
JavaStringParam localEventType(eventType);
ServerObject* so = NULL;
if(!JavaLibrary::getObject(client, so))
return JNI_FALSE;
Client* c = so->getClient();
if(!c)
return JNI_FALSE;
if (!objectToPlayEventOn)
return JNI_FALSE;
ServerObject* target = NULL;
if(!JavaLibrary::getObject(objectToPlayEventOn, target))
return JNI_FALSE;
if(!target)
return JNI_FALSE;
//get the event
std::string event;
JavaLibrary::convert(localEventType, event);
if (event == "")
return JNI_FALSE;
//get the hardpoint
std::string hp;
if (NULL != jHardpoint)
{
JavaStringParam localHardpoint(jHardpoint);
JavaLibrary::convert(localHardpoint, hp);
}
//get the transform
Transform transform;
if (NULL != jTransform)
{
ScriptConversion::convert(jTransform, transform);
}
JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEventObj received valid hardpoint AND valid transform."));
const NetworkId nid(objectToPlayEventOn);
if (hp.empty() && transform != Transform::identity)
{
PlayClientEventObjectTransformMessage const pceotm(nid, event, transform);
so->sendToClientsInUpdateRange(pceotm, true);
}
else
{
PlayClientEventObjectMessage const pceom(nid, event, hp);
so->sendToClientsInUpdateRange(pceom, true);
}
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring eventType, jlong objectToPlayEventOn, jstring jHardpoint, jobject jTransform)
{
JavaStringParam localEventType(eventType);
std::vector<NetworkId> clientIds;
if (!ScriptConversion::convert(clients, clientIds))
return JNI_FALSE;
if (!objectToPlayEventOn)
return JNI_FALSE;
ServerObject* target = NULL;
if(!JavaLibrary::getObject(objectToPlayEventOn, target))
return JNI_FALSE;
if(!target)
return JNI_FALSE;
//get the event
std::string event;
JavaLibrary::convert(localEventType, event);
if (event == "")
return JNI_FALSE;
//get the hardpoint
std::string hp;
if (NULL != jHardpoint)
{
JavaStringParam localHardpoint(jHardpoint);
JavaLibrary::convert(localHardpoint, hp);
}
//get the transform
Transform transform;
if (NULL != jTransform)
{
ScriptConversion::convert(jTransform, transform);
}
JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEventObj received valid hardpoint AND valid transform."));
const NetworkId nid(objectToPlayEventOn);
if (hp.empty() && transform != Transform::identity)
{
PlayClientEventObjectTransformMessage const pceotm(nid, event, transform);
ServerObject::sendToSpecifiedClients(pceotm, true, clientIds);
}
else
{
PlayClientEventObjectMessage const pceom(nid, event, hp);
ServerObject::sendToSpecifiedClients(pceom, true, clientIds);
}
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventLoc(JNIEnv *env, jobject self, jlong client, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta)
{
JavaStringParam localEventSourceType(eventSourceType);
JavaStringParam localEventDestType(eventDestType);
ServerObject* so = NULL;
if(!JavaLibrary::getObject(client, so))
return JNI_FALSE;
Client* c = so->getClient();
if(!c)
return JNI_FALSE;
//get the events
std::string eventSource;
JavaLibrary::convert(localEventSourceType, eventSource);
if(eventSource == "")
return JNI_FALSE;
std::string eventDest;
JavaLibrary::convert(localEventDestType, eventDest);
if(eventDest == "")
return JNI_FALSE;
//get the location
Vector locationVec;
std::string sceneId;
NetworkId cell;
if (!ScriptConversion::convert(loc, locationVec, sceneId, cell))
return JNI_FALSE;
PlayClientEventLocMessage const pcelm(eventSource, eventDest, locationVec, sceneId, cell, terrainDelta);
so->sendToClientsInUpdateRange(pcelm, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventLocLimited(JNIEnv *env, jobject self, jlongArray clients, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta)
{
JavaStringParam localEventSourceType(eventSourceType);
JavaStringParam localEventDestType(eventDestType);
std::vector<NetworkId> clientIds;
if (!ScriptConversion::convert(clients, clientIds))
return JNI_FALSE;
//get the events
std::string eventSource;
JavaLibrary::convert(localEventSourceType, eventSource);
if(eventSource == "")
return JNI_FALSE;
std::string eventDest;
JavaLibrary::convert(localEventDestType, eventDest);
if(eventDest == "")
return JNI_FALSE;
//get the location
Vector locationVec;
std::string sceneId;
NetworkId cell;
if (!ScriptConversion::convert(loc, locationVec, sceneId, cell))
return JNI_FALSE;
PlayClientEventLocMessage const pcelm(eventSource, eventDest, locationVec, sceneId, cell, terrainDelta);
ServerObject::sendToSpecifiedClients(pcelm, true, clientIds);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectObj(JNIEnv *env, jobject self, jlong client, jstring effectName, jlong objectToPlayEffectOn, jstring jHardpoint, jobject jTransform, jstring labelName)
{
JavaStringParam localEffectName(effectName);
ServerObject* so = NULL;
if(!JavaLibrary::getObject(objectToPlayEffectOn, so))
return JNI_FALSE;
/* TPERRY - This isn't used
@TODO: We should take the client parameter out of this function and only use objectToPlayEffectOn
Client* c = so->getClient();
if(!c)
return JNI_FALSE;
*/
if (!objectToPlayEffectOn)
return JNI_FALSE;
ServerObject* target = NULL;
if(!JavaLibrary::getObject(objectToPlayEffectOn, target))
return JNI_FALSE;
if(!target)
return JNI_FALSE;
//get the effect
std::string effect;
JavaLibrary::convert(localEffectName, effect);
if(effect == "")
return JNI_FALSE;
//get the hardpoint
std::string hp;
if (NULL != jHardpoint)
{
JavaStringParam localHardpoint(jHardpoint);
JavaLibrary::convert(localHardpoint, hp);
}
//get the transform
Transform transform;
if (NULL != jTransform)
{
ScriptConversion::convert(jTransform, transform);
}
//get the optional labelName
std::string strLabelName;
if (NULL != labelName)
{
JavaStringParam localLabel(labelName);
JavaLibrary::convert(localLabel, strLabelName);
}
JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEffectObj received valid hardpoint AND valid transform."));
const NetworkId nid(objectToPlayEffectOn);
if (hp.empty() && transform != Transform::identity)
{
PlayClientEffectObjectTransformMessage const pceotm(nid, effect, transform, strLabelName);
so->sendToClientsInUpdateRange(pceotm, true);
}
else
{
PlayClientEffectObjectMessage const pceom(nid, effect, hp, strLabelName);
so->sendToClientsInUpdateRange(pceom, true);
}
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jlong objectToPlayEffectOn, jstring jHardpoint, jobject jTransform, jstring labelName)
{
JavaStringParam localEffectName(effectName);
std::vector<NetworkId> clientIds;
if (!ScriptConversion::convert(clients, clientIds))
return JNI_FALSE;
if (!objectToPlayEffectOn)
return JNI_FALSE;
ServerObject* target = NULL;
if(!JavaLibrary::getObject(objectToPlayEffectOn, target))
return JNI_FALSE;
if(!target)
return JNI_FALSE;
//get the effect
std::string effect;
JavaLibrary::convert(localEffectName, effect);
if(effect == "")
return JNI_FALSE;
//get the hardpoint
std::string hp;
if (NULL != jHardpoint)
{
JavaStringParam localHardpoint(jHardpoint);
JavaLibrary::convert(localHardpoint, hp);
}
//get the transform
Transform transform;
if (NULL != jTransform)
{
ScriptConversion::convert(jTransform, transform);
}
//get the optional labelName
std::string strLabelName;
if (NULL != labelName)
{
JavaStringParam localLabel(labelName);
JavaLibrary::convert(localLabel, strLabelName);
}
JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEffectObj received valid hardpoint AND valid transform."));
const NetworkId nid(objectToPlayEffectOn);
if (hp.empty() && transform != Transform::identity)
{
PlayClientEffectObjectTransformMessage const pceotm(nid, effect, transform, strLabelName);
ServerObject::sendToSpecifiedClients(pceotm, true, clientIds);
}
else
{
PlayClientEffectObjectMessage const pceom(nid, effect, hp, strLabelName);
ServerObject::sendToSpecifiedClients(pceom, true, clientIds);
}
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectLoc(JNIEnv *env, jobject self, jlong client, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName)
{
JavaStringParam localEffectName(effectName);
ServerObject* so = NULL;
if(!JavaLibrary::getObject(client, so))
return JNI_FALSE;
/* TPERRY - This isn't used
@TODO: We should take the client parameter out of this function and only use objectToPlayEffectOn
Client* c = so->getClient();
if(!c)
return JNI_FALSE;
*/
//get the effect
std::string effect;
JavaLibrary::convert(localEffectName, effect);
if(effect == "")
return JNI_FALSE;
//get the location
Vector locationVec;
std::string sceneId;
NetworkId cell;
if (!ScriptConversion::convert(loc, locationVec, sceneId, cell))
return JNI_FALSE;
//get the optional labelName
std::string strLabelName;
if (NULL != labelName)
{
JavaStringParam localLabel(labelName);
JavaLibrary::convert(localLabel, strLabelName);
}
PlayClientEffectLocMessage const pcelm(effect, locationVec, sceneId, cell, terrainDelta, strLabelName);
so->sendToClientsInUpdateRange(pcelm, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectLocLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName)
{
JavaStringParam localEffectName(effectName);
std::vector<NetworkId> clientIds;
if (!ScriptConversion::convert(clients, clientIds))
return JNI_FALSE;
//get the effect
std::string effect;
JavaLibrary::convert(localEffectName, effect);
if(effect == "")
return JNI_FALSE;
//get the location
Vector locationVec;
std::string sceneId;
NetworkId cell;
if (!ScriptConversion::convert(loc, locationVec, sceneId, cell))
return JNI_FALSE;
//get the optional labelName
std::string strLabelName;
if (NULL != labelName)
{
JavaStringParam localLabel(labelName);
JavaLibrary::convert(localLabel, strLabelName);
}
PlayClientEffectLocMessage const pcelm(effect, locationVec, sceneId, cell, terrainDelta, strLabelName);
ServerObject::sendToSpecifiedClients(pcelm, true, clientIds);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playUiEffect(JNIEnv * /*env*/, jobject /*self*/, jlong client, jstring uiEffectString)
{
JavaStringParam localUiEffectString(uiEffectString);
ServerObject* so = NULL;
if(!JavaLibrary::getObject(client, so))
{
NetworkId const networkId(client);
JAVA_THROW_SCRIPT_EXCEPTION(true, ("playUiEffect - could not find player %s.", networkId.getValueString().c_str()));
return JNI_FALSE;
}
//get the event
std::string uiEffect;
JavaLibrary::convert(localUiEffectString, uiEffect);
if (uiEffect.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("playUiEffect - empty effect string for %s.", so->getDebugInformation().c_str()));
return JNI_FALSE;
}
//format the message.
MessageQueueGenericValueType<std::pair<NetworkId, std::string> > * const msg = new MessageQueueGenericValueType<std::pair<NetworkId, std::string> >(std::make_pair(so->getNetworkId(), uiEffect));
so->appendMessage(CM_uiPlayEffect, 0.0f, msg);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::stopClientEffectObjByLabel(JNIEnv *env, jobject self, jlong client, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate)
{
JavaStringParam localLabel(labelName);
ServerObject* so = NULL;
if(!JavaLibrary::getObject(objectEffectIsOn, so))
return JNI_FALSE;
/* TPERRY - This isn't used
@TODO: We should take the client parameter out of this function and only use objectToPlayEffectOn
Client* c = so->getClient();
if(!c)
return JNI_FALSE;
*/
if (!objectEffectIsOn)
return JNI_FALSE;
ServerObject* target = NULL;
if(!JavaLibrary::getObject(objectEffectIsOn, target))
return JNI_FALSE;
if(!target)
return JNI_FALSE;
//get the effect
std::string strLabelName;
JavaLibrary::convert(localLabel, strLabelName);
if(strLabelName == "")
return JNI_FALSE;
const NetworkId nid(objectEffectIsOn);
StopClientEffectObjectByLabelMessage const pceotm(nid, strLabelName, softTerminate);
so->sendToClientsInUpdateRange(pceotm, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::stopClientEffectObjByLabelLimited(JNIEnv *env, jobject self, jlongArray clients, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate)
{
JavaStringParam localLabel(labelName);
std::vector<NetworkId> clientIds;
if (!ScriptConversion::convert(clients, clientIds))
return JNI_FALSE;
if (!objectEffectIsOn)
return JNI_FALSE;
ServerObject* target = NULL;
if(!JavaLibrary::getObject(objectEffectIsOn, target))
return JNI_FALSE;
if(!target)
return JNI_FALSE;
//get the effect
std::string strLabelName;
JavaLibrary::convert(localLabel, strLabelName);
if(strLabelName == "")
return JNI_FALSE;
const NetworkId nid(objectEffectIsOn);
StopClientEffectObjectByLabelMessage const pceotm(nid, strLabelName, softTerminate);
ServerObject::sendToSpecifiedClients(pceotm, true, clientIds);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::play2dNonLoopingMusic(JNIEnv *env, jobject self, jlong client, jstring musicName)
{
JavaStringParam localMusicName(musicName);
ServerObject* so = NULL;
if (!JavaLibrary::getObject(client, so))
return JNI_FALSE;
Client* c = so->getClient();
if (!c)
return JNI_FALSE;
std::string music;
JavaLibrary::convert(localMusicName, music);
if (music == "")
return JNI_FALSE;
PlayMusicMessage const msg(music, NetworkId::cms_invalid, 0, false);
c->send(msg, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::play2dNonLoopingSound(JNIEnv *env, jobject self, jlong client, jstring musicName)
{
JavaStringParam localMusicName(musicName);
ServerObject* so = NULL;
if (!JavaLibrary::getObject(client, so))
return JNI_FALSE;
Client* c = so->getClient();
if (!c)
return JNI_FALSE;
std::string music;
JavaLibrary::convert(localMusicName, music);
if (music == "")
return JNI_FALSE;
PlayMusicMessage const msg(music, NetworkId::cms_invalid, 1, false);
c->send(msg, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::playMusicWithParms(JNIEnv *env, jobject self, jlong client, jlong source, jstring musicName, jint playType, bool loop)
{
JavaStringParam localMusicName(musicName);
ServerObject* so = NULL;
if (!JavaLibrary::getObject(client, so))
return JNI_FALSE;
Client* c = so->getClient();
if (!c)
return JNI_FALSE;
std::string music;
JavaLibrary::convert(localMusicName, music);
if (music == "")
return JNI_FALSE;
PlayMusicMessage const msg(music, NetworkId(source), playType, loop);
c->send(msg, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectile(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject start, jobject end, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a)
{
JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName);
ServerObject* so = NULL;
if (!JavaLibrary::getObject(client, so))
return JNI_FALSE;
// verify a client exists
Client * c = so->getClient();
if (!c)
return JNI_FALSE;
// get the weapon object template name string
std::string weaponObjectTemplateNameString;
JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString);
if (weaponObjectTemplateNameString == "")
return JNI_FALSE;
// get the start location
Vector startLocationVec;
std::string startSceneId;
NetworkId startCell;
if (!ScriptConversion::convert(start, startLocationVec, startSceneId, startCell))
return JNI_FALSE;
// get the end location
Vector endLocationVec;
std::string endSceneId;
NetworkId endCell;
if (!ScriptConversion::convert(end, endLocationVec, endSceneId, endCell))
return JNI_FALSE;
CreateClientProjectileMessage const ccpm(weaponObjectTemplateNameString, startLocationVec, startCell, endLocationVec,
speed, expiration, trail, PackedArgb(static_cast<uint8>(a), static_cast<uint8>(r), static_cast<uint8>(g), static_cast<uint8>(b)).getArgb());
so->sendToClientsInUpdateRange(ccpm, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectileObjectToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a)
{
JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName);
ServerObject* so = NULL;
if (!JavaLibrary::getObject(client, so))
return JNI_FALSE;
// verify a client exists
Client * c = so->getClient();
if (!c)
return JNI_FALSE;
// get the weapon object template name string
std::string weaponObjectTemplateNameString;
JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString);
if (weaponObjectTemplateNameString == "")
return JNI_FALSE;
// Get our source object
ServerObject* sourceObject = NULL;
if (!JavaLibrary::getObject(source, sourceObject))
return JNI_FALSE;
NetworkId sourceId = sourceObject->getNetworkId();
// The target of our effect
ServerObject* targetObject = NULL;
if (!JavaLibrary::getObject(target, targetObject))
return JNI_FALSE;
NetworkId targetId = targetObject->getNetworkId();
// Optional Source hardpoint
JavaStringParam localSourceHardpointName(sourceHardpoint);
std::string sourceHardpointString;
JavaLibrary::convert(localSourceHardpointName, sourceHardpointString);
// Optional Target hardpoint
JavaStringParam localTargetHardpointName(targetHardpoint);
std::string targetHardpointString;
JavaLibrary::convert(localTargetHardpointName, targetHardpointString);
// Source's Cell ID
CellProperty const * const cellProperty = sourceObject->getParentCell();
Object const * const cellObject = (cellProperty != NULL) ? &cellProperty->getOwner() : NULL;
NetworkId const & networkIdForCellOrWorld = (cellObject != NULL) ? cellObject->getNetworkId() : NetworkId::cms_invalid;
CreateClientProjectileObjectToObjectMessage const ccpmoto(weaponObjectTemplateNameString, sourceId, sourceHardpointString, networkIdForCellOrWorld, targetId, targetHardpointString,
speed, expiration, trail, PackedArgb(static_cast<uint8>(a), static_cast<uint8>(r), static_cast<uint8>(g), static_cast<uint8>(b)).getArgb());
so->sendToClientsInUpdateRange(ccpmoto, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectileObjectToLocation(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jobject target, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a)
{
JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName);
ServerObject* so = NULL;
if (!JavaLibrary::getObject(client, so))
return JNI_FALSE;
// verify a client exists
Client * c = so->getClient();
if (!c)
return JNI_FALSE;
// get the weapon object template name string
std::string weaponObjectTemplateNameString;
JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString);
if (weaponObjectTemplateNameString == "")
return JNI_FALSE;
// Get our source object
ServerObject* sourceObject = NULL;
if (!JavaLibrary::getObject(source, sourceObject))
return JNI_FALSE;
NetworkId sourceId = sourceObject->getNetworkId();
// Optional Source hardpoint
JavaStringParam localSourceHardpointName(sourceHardpoint);
std::string sourceHardpointString;
JavaLibrary::convert(localSourceHardpointName, sourceHardpointString);
// The target of our effect
Vector targetLocationVec;
std::string startSceneId;
NetworkId startCell;
if (!ScriptConversion::convert(target, targetLocationVec, startSceneId, startCell))
return JNI_FALSE;
// Source's Cell ID
CellProperty const * const cellProperty = sourceObject->getParentCell();
Object const * const cellObject = (cellProperty != NULL) ? &cellProperty->getOwner() : NULL;
NetworkId const & networkIdForCellOrWorld = (cellObject != NULL) ? cellObject->getNetworkId() : NetworkId::cms_invalid;
CreateClientProjectileObjectToLocationMessage const ccpmotl(weaponObjectTemplateNameString, sourceId, sourceHardpointString, networkIdForCellOrWorld, targetLocationVec,
speed, expiration, trail, PackedArgb(static_cast<uint8>(a), static_cast<uint8>(r), static_cast<uint8>(g), static_cast<uint8>(b)).getArgb());
so->sendToClientsInUpdateRange(ccpmotl, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectileLocationToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject source, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a)
{
JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName);
ServerObject* so = NULL;
if (!JavaLibrary::getObject(client, so))
return JNI_FALSE;
// verify a client exists
Client * c = so->getClient();
if (!c)
return JNI_FALSE;
// get the weapon object template name string
std::string weaponObjectTemplateNameString;
JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString);
if (weaponObjectTemplateNameString == "")
return JNI_FALSE;
// Get our target object
ServerObject* targetObject = NULL;
if (!JavaLibrary::getObject(target, targetObject))
return JNI_FALSE;
NetworkId targetId = targetObject->getNetworkId();
// Optional Target hardpoint
JavaStringParam localTargetHardpointName(targetHardpoint);
std::string targetHardpointString;
JavaLibrary::convert(localTargetHardpointName, targetHardpointString);
Vector sourceLocationVec;
std::string startSceneId;
NetworkId startCell;
if (!ScriptConversion::convert(source, sourceLocationVec, startSceneId, startCell))
return JNI_FALSE;
// Target's Cell ID
CellProperty const * const cellProperty = targetObject->getParentCell();
Object const * const cellObject = (cellProperty != NULL) ? &cellProperty->getOwner() : NULL;
NetworkId const & networkIdForCellOrWorld = (cellObject != NULL) ? cellObject->getNetworkId() : NetworkId::cms_invalid;
CreateClientProjectileLocationToObjectMessage const ccpmlto(weaponObjectTemplateNameString, sourceLocationVec, networkIdForCellOrWorld, targetId, targetHardpointString,
speed, expiration, trail, PackedArgb(static_cast<uint8>(a), static_cast<uint8>(r), static_cast<uint8>(g), static_cast<uint8>(b)).getArgb());
so->sendToClientsInUpdateRange(ccpmlto, true);
return JNI_TRUE;
}
void JNICALL ScriptMethodsClientEffectNamespace::addObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring filename, jstring hardpoint, jobject offset, jfloat scale, jstring label)
{
ServerObject* so = NULL;
if (!JavaLibrary::getObject(obj, so))
return;
TangibleObject * tang = so->asTangibleObject();
if(!tang)
return;
JavaStringParam javaFilename(filename);
std::string localFilename;
JavaLibrary::convert(javaFilename, localFilename);
JavaStringParam javaLabel(label);
std::string localLabel;
JavaLibrary::convert(javaLabel, localLabel);
JavaStringParam javaHardpoint(hardpoint);
std::string localHardpoint;
JavaLibrary::convert(javaHardpoint, localHardpoint);
Vector offsetVector;
ScriptConversion::convert(offset, offsetVector);
if(localLabel.empty() || localFilename.empty())
return;
tang->addObjectEffect(localFilename, localHardpoint, offsetVector, scale, localLabel);
}
void JNICALL ScriptMethodsClientEffectNamespace::removeObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label)
{
ServerObject* so = NULL;
if (!JavaLibrary::getObject(obj, so))
return;
TangibleObject * tang = so->asTangibleObject();
if(!tang)
return;
JavaStringParam javaLabel(label);
std::string localLabel;
JavaLibrary::convert(javaLabel, localLabel);
if(localLabel.empty())
return;
tang->removeObjectEffect(localLabel);
}
void JNICALL ScriptMethodsClientEffectNamespace::removeAllObjectEffects(JNIEnv * env, jobject self, jlong obj)
{
ServerObject* so = NULL;
if (!JavaLibrary::getObject(obj, so))
return;
TangibleObject * tang = so->asTangibleObject();
if(!tang)
return;
tang->removeAllObjectEffects();
}
jboolean JNICALL ScriptMethodsClientEffectNamespace::hasObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label)
{
ServerObject* so = NULL;
if (!JavaLibrary::getObject(obj, so))
return JNI_FALSE;
TangibleObject * tang = so->asTangibleObject();
if(!tang)
return JNI_FALSE;
JavaStringParam javaLabel(label);
std::string localLabel;
JavaLibrary::convert(javaLabel, localLabel);
if(localLabel.empty())
return JNI_FALSE;
return tang->hasObjectEffect(localLabel);
}
//-----------------------------------------------------------------------
@@ -0,0 +1,301 @@
//========================================================================
//
// ScriptMethodsClusterWideData.cpp - implements script methods dealing
// with cluster wide data management
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/ClusterWideDataClient.h"
#include "sharedUtility/ValueDictionary.h"
#include "sharedUtility/ValueTypeBool.h"
#include "sharedUtility/ValueTypeFloat.h"
#include "sharedUtility/ValueTypeObjId.h"
#include "sharedUtility/ValueTypeSignedInt.h"
#include "sharedUtility/ValueTypeString.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsClusterWideDataNamespace
// ======================================================================
namespace ScriptMethodsClusterWideDataNamespace
{
bool install();
jint JNICALL getClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jboolean lockElements, jlong callbackObject);
void JNICALL releaseClusterWideDataLock(JNIEnv *env, jobject self, jstring managerName, jint lockKey);
void JNICALL removeClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jint lockKey);
void JNICALL updateClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jobject data, jint lockKey);
void JNICALL replaceClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jobject data, jboolean autoRemove, jint lockKey);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsClusterWideDataNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsClusterWideDataNamespace::c)}
JF("_getClusterWideData", "(Ljava/lang/String;Ljava/lang/String;ZJ)I", getClusterWideData),
JF("releaseClusterWideDataLock", "(Ljava/lang/String;I)V", releaseClusterWideDataLock),
JF("removeClusterWideData", "(Ljava/lang/String;Ljava/lang/String;I)V", removeClusterWideData),
JF("updateClusterWideData", "(Ljava/lang/String;Ljava/lang/String;Lscript/dictionary;I)V", updateClusterWideData),
JF("replaceClusterWideData", "(Ljava/lang/String;Ljava/lang/String;Lscript/dictionary;ZI)V", replaceClusterWideData),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI conversion methods
//========================================================================
/**
* Converts a C++ ValueDictionary to a Java dictionary
*
* @param source the ValueDictionary to convert
*
* @return a new dictionary object
*/
LocalRefPtr JavaLibrary::convert(const ValueDictionary & source)
{
if (ms_env == NULL)
return LocalRef::cms_nullPtr;
// create the dictionary
LocalRefPtr target = createNewObject(ms_clsDictionary, ms_midDictionary);
if (target == LocalRef::cms_nullPtr)
return LocalRef::cms_nullPtr;
for (DictionaryValueMap::const_iterator iter = source.get().begin(); iter != source.get().end(); ++iter)
{
JavaString paramName(iter->first.c_str());
if (iter->second->getType() == ValueTypeBool::ms_type)
{
const ValueTypeBool * value = static_cast<const ValueTypeBool *>(iter->second);
callObjectMethod(*target,
ms_midDictionaryPutBool, paramName.getValue(),
value->getValue());
}
else if (iter->second->getType() == ValueTypeFloat::ms_type)
{
const ValueTypeFloat * value = static_cast<const ValueTypeFloat *>(iter->second);
callObjectMethod(*target,
ms_midDictionaryPutFloat, paramName.getValue(),
value->getValue());
}
else if (iter->second->getType() == ValueTypeObjId::ms_type)
{
const ValueTypeObjId * value = static_cast<const ValueTypeObjId *>(iter->second);
LocalRefPtr arg = getObjId(value->getValue());
if (arg == LocalRef::cms_nullPtr)
return LocalRef::cms_nullPtr;
callObjectMethod(*target,
ms_midDictionaryPut, paramName.getValue(), arg->getValue());
}
else if (iter->second->getType() == ValueTypeSignedInt::ms_type)
{
const ValueTypeSignedInt * value = static_cast<const ValueTypeSignedInt *>(iter->second);
callObjectMethod(*target,
ms_midDictionaryPutInt, paramName.getValue(),
value->getValue());
}
else if (iter->second->getType() == ValueTypeString::ms_type)
{
const ValueTypeString * value = static_cast<const ValueTypeString *>(iter->second);
JavaString jvString(value->getValue().c_str());
callObjectMethod(*target,
ms_midDictionaryPut, paramName.getValue(), jvString.getValue());
}
else
{
DEBUG_REPORT_LOG(true, ("Unknown/unhandled data type "
"(%s) while parsing ValueDictionary\n", iter->second->getType().c_str()));
return LocalRef::cms_nullPtr;
}
}
return target;
} // JavaLibrary::convert(const ValueDictionary &)
// ----------------------------------------------------------------------
/**
* Converts a Java dictionary to a C++ ValueDictionary
*
* @param source the ValueDictionary to convert
*
* @return a new dictionary object
*/
void JavaLibrary::convert(const jobject & source, ValueDictionary & target)
{
target.clear();
JNIEnv * env = getEnv();
if (env == NULL)
return;
if (!env->IsInstanceOf(source, ms_clsDictionary))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convert from dictionary to ValueDictionary has a bad dictionary"));
return;
}
// get the list of keys in the dictionary
LocalRefPtr keyEnumeration = callObjectMethod(LocalRefParam(source), ms_midDictionaryKeys);
while (callBooleanMethod(*keyEnumeration, ms_midEnumerationHasMoreElements))
{
LocalRefPtr key = callObjectMethod(*keyEnumeration, ms_midEnumerationNextElement);
if (!isInstanceOf(*key, ms_clsString))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convert from dictionary to ValueDictionary has a bad key"));
return;
}
JavaStringParam localKeyStr(*key);
std::string keyStr;
IGNORE_RETURN(convert(localKeyStr, keyStr));
// convert the value into a C++ ValueType object
LocalRefPtr value = callObjectMethod(LocalRefParam(source), ms_midDictionaryGet, key->getValue());
if (isInstanceOf(*value, ms_clsBoolean))
{
jboolean booleanValue = callBooleanMethod(*value, ms_midBooleanBooleanValue);
target.insert(keyStr, ValueTypeBool(booleanValue ? true : false));
}
else if (isInstanceOf(*value, ms_clsFloat))
{
jfloat floatValue = callFloatMethod(*value, ms_midFloatFloatValue);
target.insert(keyStr, ValueTypeFloat(static_cast<float>(floatValue)));
}
else if (isInstanceOf(*value, ms_clsObjId))
{
NetworkId networkId(getNetworkId(*value));
target.insert(keyStr, ValueTypeObjId(networkId));
}
else if (isInstanceOf(*value, ms_clsInteger))
{
jint intValue = callIntMethod(*value, ms_midIntegerIntValue);
target.insert(keyStr, ValueTypeSignedInt(static_cast<signed int>(intValue)));
}
else if (isInstanceOf(*value, ms_clsString))
{
JavaStringParam localValueStr(*value);
std::string valueStr;
IGNORE_RETURN(convert(localValueStr, valueStr));
target.insert(keyStr, ValueTypeString(valueStr));
}
else
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convert from dictionary to ValueDictionary - key (%s) is an unsupported type", keyStr.c_str()));
return;
}
}
}
//--------------------------------------------------------------------------------------
jint JNICALL ScriptMethodsClusterWideDataNamespace::getClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jboolean lockElements, jlong callbackObject)
{
JavaStringParam localJstringManagerName(managerName);
std::string localManagerName;
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
JavaStringParam localJstringElementNameRegex(elementNameRegex);
std::string localElementNameRegex;
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
return static_cast<int>(ClusterWideDataClient::getClusterWideData(localManagerName, localElementNameRegex, (lockElements == JNI_TRUE), NetworkId(callbackObject)));
}
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsClusterWideDataNamespace::releaseClusterWideDataLock(JNIEnv *, jobject, jstring managerName, jint lockKey)
{
JavaStringParam localJstringManagerName(managerName);
std::string localManagerName;
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
ClusterWideDataClient::releaseClusterWideDataLock(localManagerName, static_cast<unsigned long>(lockKey));
return;
}
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsClusterWideDataNamespace::removeClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jint lockKey)
{
JavaStringParam localJstringManagerName(managerName);
std::string localManagerName;
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
JavaStringParam localJstringElementNameRegex(elementNameRegex);
std::string localElementNameRegex;
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
ClusterWideDataClient::removeClusterWideData(localManagerName, localElementNameRegex, static_cast<unsigned long>(lockKey));
return;
}
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsClusterWideDataNamespace::updateClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jobject data, jint lockKey)
{
JavaStringParam localJstringManagerName(managerName);
std::string localManagerName;
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
JavaStringParam localJstringElementNameRegex(elementNameRegex);
std::string localElementNameRegex;
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
ValueDictionary valueDictionary;
JavaLibrary::convert(data, valueDictionary);
ClusterWideDataClient::updateClusterWideData(localManagerName, localElementNameRegex, valueDictionary, static_cast<unsigned long>(lockKey));
return;
}
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsClusterWideDataNamespace::replaceClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jobject data, jboolean autoRemove, jint lockKey)
{
JavaStringParam localJstringManagerName(managerName);
std::string localManagerName;
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
JavaStringParam localJstringElementNameRegex(elementNameRegex);
std::string localElementNameRegex;
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
ValueDictionary valueDictionary;
JavaLibrary::convert(data, valueDictionary);
ClusterWideDataClient::replaceClusterWideData(localManagerName, localElementNameRegex, valueDictionary, (autoRemove == JNI_TRUE), static_cast<unsigned long>(lockKey));
return;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,422 @@
// ======================================================================
//
// ScriptMethodsCommandQueue.cpp - implements script methods dealing with
// creature command queues.
//
// Copyright 2002 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CommandQueue.h"
#include "serverGame/CommandQueueEntry.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverUtility/ServerClock.h"
#include "sharedDebug/Profiler.h"
#include "sharedGame/CommandTable.h"
#include "sharedNetworkMessages/MessageQueueCommandTimer.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsCommandQueueNamespace
// ======================================================================
namespace ScriptMethodsCommandQueueNamespace
{
bool install();
jboolean JNICALL queueCommand(JNIEnv *env, jobject self, jlong actor, jint commandHash, jlong target, jstring params, jint priority);
jboolean JNICALL queueClear(JNIEnv *env, jobject self, jlong actor);
jboolean JNICALL queueHasCommandFromGroup(JNIEnv *env, jobject self, jlong actor, jint group);
jboolean JNICALL queueClearCommandsFromGroup(JNIEnv *env, jobject self, jlong actor, jint group);
jfloat JNICALL getCommandMaxRange(JNIEnv *env, jobject self, jint commandHash);
jboolean JNICALL setCommandTimerValue( JNIEnv *env, jobject self, jlong actor, jint timerClass, jfloat newTime );
jint JNICALL getCommandQueueSize( JNIEnv *env, jobject self, jobject actor, jboolean combatOnly );
jfloat JNICALL getCooldownTimeLeft( JNIEnv *env, jobject self, jlong actor, jint cooldownTimer );
jfloat JNICALL getCooldownTimeLeftString( JNIEnv *env, jobject self, jlong actor, jstring command );
jint JNICALL getCurrentCommand( JNIEnv *env, jobject self, jlong actor );
static void JNICALL sendCooldownGroupTimingOnly(JNIEnv * env, jobject self, jlong actor, jint cooldownGroupCrc, jfloat time);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsCommandQueueNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsCommandQueueNamespace::c)}
JF("_queueCommand", "(JIJLjava/lang/String;I)Z", queueCommand),
JF("_queueClear", "(J)Z", queueClear),
JF("_queueHasCommandFromGroup", "(JI)Z", queueHasCommandFromGroup),
JF("_queueClearCommandsFromGroup", "(JI)Z", queueClearCommandsFromGroup),
JF("getCommandMaxRange", "(I)F", getCommandMaxRange),
JF("_setCommandTimerValue", "(JIF)Z", setCommandTimerValue),
JF("_getCooldownTimeLeft", "(JI)F", getCooldownTimeLeft),
JF("_getCooldownTimeLeft", "(JLjava/lang/String;)F", getCooldownTimeLeftString ),
JF("_getCurrentCommand", "(J)I", getCurrentCommand),
JF("_sendCooldownGroupTimingOnly", "(JIF)V", sendCooldownGroupTimingOnly),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
// class JavaLibrary JNI command table methods
// ======================================================================
/**
* Enqueues a command on a creature's command queue.
*
* @param env Java Environment
* @param self class calling this function
* @param actor creature we wish to enqueue the command for
* @param command command to enqueue
* @param target object on which the command is targeted
* @param params string of any additional parameters to pass to the command
* @param priority priority at which to execute the command (may be default)
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsCommandQueueNamespace::queueCommand(JNIEnv *env, jobject self, jlong actor, jint commandHash, jlong target, jstring params, jint priority)
{
PROFILER_AUTO_BLOCK_DEFINE("queueCommand");
JavaStringParam localParamsStr(params);
if (priority < 0 || priority >= Command::CP_NumberOfPriorities)
return JNI_FALSE;
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::queueCommand() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return JNI_FALSE;
}
NetworkId targetId(target);
if (targetId != NetworkId::cms_invalid)
{
ServerObject const * const targetServerObject = ServerObject::getServerObject(targetId);
//If script specified a target id, make sure it can be resolved.
if (!targetServerObject)
return JNI_FALSE;
}
const Command &command = CommandTable::getCommand(static_cast<uint32>(commandHash));
if (command.isNull())
return JNI_FALSE;
Unicode::String strParams;
if (!JavaLibrary::convert(localParamsStr, strParams))
return JNI_FALSE;
actorTangibleObject->commandQueueEnqueue(command, targetId, strParams, 0, false, static_cast<Command::Priority>(priority), true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
/**
* Clears a creature's command queue (only the clearable commands).
*
* @param env Java Environment
* @param self class calling this function
* @param actor creature we wish to clear the queue on
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsCommandQueueNamespace::queueClear(JNIEnv *env, jobject self, jlong actor)
{
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::queueClear() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return JNI_FALSE;
}
actorTangibleObject->commandQueueClear();
return JNI_TRUE;
}
// ----------------------------------------------------------------------
/**
* Check if a creature has commands from a command group in its queue.
*
* @param env Java Environment
* @param self class calling this function
* @param actor creature we wish to check the queue on
* @param group hash of the group we are checking for
*
* @return true if commands are present, false if not or on error
*/
jboolean JNICALL ScriptMethodsCommandQueueNamespace::queueHasCommandFromGroup(JNIEnv *env, jobject self, jlong actor, jint group)
{
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::queueHasCommandFromGroup() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return JNI_FALSE;
}
return actorTangibleObject->commandQueueHasCommandFromGroup(static_cast<uint32>(group));
}
// ----------------------------------------------------------------------
/**
* Clear commands of a specified group from a creature's command queue.
*
* @param env Java Environment
* @param self class calling this function
* @param actor creature we wish to clear commands from the queue on
* @param group hash of the group we are checking for
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsCommandQueueNamespace::queueClearCommandsFromGroup(JNIEnv *env, jobject self, jlong actor, jint group)
{
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::queueClearCommandsFromGroup() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return JNI_FALSE;
}
actorTangibleObject->commandQueueClearCommandsFromGroup(group, true);
return JNI_TRUE;
}
/**
* Returns the max range a player can be from a target to execute a given command.
*
* @param env Java Environment
* @param self class calling this function
* @param commandHash the command to get the range for
*
* @return the range, or -1 if an unknown command
*/
jfloat JNICALL ScriptMethodsCommandQueueNamespace::getCommandMaxRange(JNIEnv * /*env*/, jobject /*self*/, jint commandHash)
{
const Command & command = CommandTable::getCommand(commandHash);
if (&command == &CommandTable::getNullCommand())
return -1;
return command.m_maxRangeToTarget;
} // JavaLibrary::getCommandMaxRange
/**
* Sets the specified duration timer for the currently executing command
*
* @param env Java Environment
* @param self call calling this function
* @param actor creature who's command queue we're going to access
* @param timerClass the class of the timer we're going to change
* @param newTime the new time for this command.
*/
jboolean JNICALL ScriptMethodsCommandQueueNamespace::setCommandTimerValue( JNIEnv *env, jobject, jlong actor, jint timerClass, jfloat newTime )
{
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::setCommandTimerValue() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return JNI_FALSE;
}
CommandQueue * const queue = actorTangibleObject->getCommandQueue();
if (queue == NULL)
{
WARNING(true, ("JavaLibrary::setCommandTimerValue() object(%s) does not have a CommandQueue", actorTangibleObject->getDebugInformation().c_str()));
return JNI_FALSE;
}
return queue->setCommandTimerValue(static_cast<CommandQueue::TimerClass>(timerClass), newTime);
}
/**
* Returns the crc32 of the current command
*
* @param env Java Environment
* @param self call calling this function
* @param actor creature who's command queue we're going to access, or 0 on error
*/
jint JNICALL ScriptMethodsCommandQueueNamespace::getCurrentCommand( JNIEnv *env, jobject, jlong actor )
{
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::getCurrentCommand() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return 0;
}
CommandQueue const * const queue = actorTangibleObject->getCommandQueue();
if (queue == NULL)
{
WARNING(true, ("JavaLibrary::getCurrentCommand() object(%s) does not have a CommandQueue", actorTangibleObject->getDebugInformation().c_str()));
return 0;
}
return queue->getCurrentCommand();
}
/**
* Returns the time left in a specified cooldown timer group
*
* @param env Java Environment
* @param self call calling this function
* @param actor creature who's command queue we're going to access
* @param group the cooldown timer group
* @return the time left in the cooldown group.
*/
jfloat JNICALL ScriptMethodsCommandQueueNamespace::getCooldownTimeLeft( JNIEnv *env, jobject, jlong actor, jint group )
{
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::getCooldownTimeLeft() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return 0.0f;
}
CommandQueue const * const queue = actorTangibleObject->getCommandQueue();
if (queue == NULL)
{
WARNING(true, ("JavaLibrary::getCooldownTimeLeft() object(%s) does not have a CommandQueue", actorTangibleObject->getDebugInformation().c_str()));
return 0.0f;
}
return queue->getCooldownTimeLeft(group);
}
/**
* Returns the time left in a specified cooldown timer group
*
* @param env Java Environment
* @param self call calling this function
* @param actor creature who's command queue we're going to access
* @param command the cooldown timer group
* @return the time left in the cooldown group.
*/
jfloat JNICALL ScriptMethodsCommandQueueNamespace::getCooldownTimeLeftString( JNIEnv *env, jobject, jlong actor, jstring command )
{
NetworkId actorId(actor);
TangibleObject * const actorTangibleObject = TangibleObject::getTangibleObject(actorId);
if (actorTangibleObject == NULL)
{
WARNING(true, ("JavaLibrary::getCooldownTimeLeftString() Unable to resolve actor(%s) to a TangibleObject", actorId.getValueString().c_str()));
return 0.0f;
}
JavaStringParam s( command );
Unicode::NarrowString out;
if ( !JavaLibrary::convert( s, out ) )
{
WARNING( true, ( "unable to convert string.\n" ) );
return 0.f;
}
CommandQueue const * const queue = actorTangibleObject->getCommandQueue();
float value = 0.0f;
if (queue == NULL)
{
WARNING(true, ("JavaLibrary::getCooldownTimeLeftString() object(%s) does not have a CommandQueue", actorTangibleObject->getDebugInformation().c_str()));
return 0.0f;
}
if (queue != NULL)
{
value = queue->getCooldownTimeLeft( out );
}
return value;
}
/**
* send the client information about a cooldown group, without associated command info.
* we use this for things that cooldown but have no command, e.g. stimpacks
*/
void JNICALL ScriptMethodsCommandQueueNamespace::sendCooldownGroupTimingOnly(JNIEnv *env, jobject, jlong actor, jint cooldownGroupCrc, jfloat time)
{
NetworkId actorId(actor);
CreatureObject * const actorCreatureObject = CreatureObject::getCreatureObject(actorId);
if (actorCreatureObject == NULL)
{
WARNING(true, ("JavaLibrary::sendCooldownGroupTimingOnly() Unable to resolve actor(%s) to a CreatureObject", actorId.getValueString().c_str()));
return;
}
CreatureController *controller = actorCreatureObject->getCreatureController();
if(!controller)
return;
MessageQueueCommandTimer *msg = new MessageQueueCommandTimer(
0,
cooldownGroupCrc,
-1,
0 );
msg->setCurrentTime( MessageQueueCommandTimer::F_cooldown, 0.0f );
msg->setMaxTime ( MessageQueueCommandTimer::F_cooldown, time );
// if the cool down value is large enough, we want to cache/persist it so
// that if the client is restarted, we can provide an accurate representation
// of where the cool down is at; if the cool down value is small, don't bother
// because by the time the client is back up and running, the cool down probably
// has already finished
if (static_cast<int>(time) >= ConfigServerGame::getCoolDownPersistThresholdSeconds())
{
int const currentGameTime = static_cast<int>(ServerClock::getInstance().getGameTimeSeconds());
char buffer[256];
snprintf(buffer, sizeof(buffer)-1, "visualCooldown.beginTime.%d", static_cast<int>(cooldownGroupCrc));
buffer[sizeof(buffer)-1] = '\0';
std::string const coolDownBeginTime = buffer;
snprintf(buffer, sizeof(buffer)-1, "visualCooldown.endTime.%d", static_cast<int>(cooldownGroupCrc));
buffer[sizeof(buffer)-1] = '\0';
std::string const coolDownEndTime = buffer;
IGNORE_RETURN(actorCreatureObject->setObjVarItem(coolDownBeginTime, currentGameTime));
IGNORE_RETURN(actorCreatureObject->setObjVarItem(coolDownEndTime, (currentGameTime + static_cast<int>(time))));
}
controller->appendMessage(
static_cast< int >( CM_commandTimer ),
0.0f,
msg,
GameControllerMessageFlags::SEND |
GameControllerMessageFlags::RELIABLE |
GameControllerMessageFlags::DEST_AUTH_CLIENT );
}
// ======================================================================
@@ -0,0 +1,81 @@
// ScriptMethodsConsole.cpp
// Copyright 2000-05, Sony Online Entertainment Inc., all rights reserved.
// Author: Roy Fleck
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "UnicodeUtils.h"
#include "serverGame/ConsoleManager.h"
#include "serverGame/ServerObject.h"
#include "serverScript/ConfigServerScript.h"
// ======================================================================
// ScriptMethodsConsoleNamespace
// ======================================================================
namespace ScriptMethodsConsoleNamespace
{
bool install();
void JNICALL consoleSendMessageObjId(JNIEnv * env, jobject self, jlong _to, jstring _message);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsConsoleNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsConsoleNamespace::c)}
JF("_sendConsoleMessage", "(JLjava/lang/String;)V", consoleSendMessageObjId),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//----------------------------------------------------------------------
void JNICALL ScriptMethodsConsoleNamespace::consoleSendMessageObjId(JNIEnv * env, jobject self, jlong _to, jstring _message)
{
UNREF(self);
if (!_to)
return;
const ServerObject* player = 0;
if(!JavaLibrary::getObject(_to, player))
{
DEBUG_WARNING (true, ("ScriptMethodsConsole JavaLibrary::consoleSendMessageObjId failed bad source object (not null)"));
if (ConfigServerScript::allowDebugConsoleMessages())
{
fprintf(stderr, "WARNING: ScriptMethodsConsole JavaLibrary::consoleSendMessageObjId: failed bad source object (not null)\n");
JavaLibrary::printJavaStack();
}
return;
}
std::string message;
if (_message)
{
const JavaStringParam jt(_message);
if (!JavaLibrary::convert(jt, message))
return;
}
if (message.empty())
{
DEBUG_WARNING (true, ("consoleSendMessageObjId with empty message"));
}
ConsoleMgr::broadcastString(message, player->getNetworkId());
}
//----------------------------------------------------------------------
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,414 @@
//=======================================================================
//
// ScriptMethodsDebug.cpp
// Copyright 2000-05, Sony Online Entertainment Inc., all rights reserved.
//
//=======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/ConsoleManager.h"
#include "serverGame/GameServer.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/ServerObject.h"
#include "serverScript/ConfigServerScript.h"
#include "sharedDebug/Profiler.h"
#include "sharedDebug/ProfilerTimer.h"
#include "sharedLog/Log.h"
#include "sharedObject/NetworkIdManager.h"
#ifdef linux
#include <signal.h>
#endif
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsDebugNamespace
// ======================================================================
namespace ScriptMethodsDebugNamespace
{
std::set<std::string> s_profileSections;
bool install();
void JNICALL debugConsoleMsg(JNIEnv *env, jobject self, jlong objId, jstring msg);
void JNICALL debugSpeakMsg(JNIEnv *env, jobject self, jlong objId, jstring msg);
void JNICALL debugServerConsoleMsg(JNIEnv *env, jobject self, jlong objId, jstring msg);
void JNICALL log(JNIEnv *env, jobject self, jstring channel, jstring msg, jlong logger, jlong player1, jlong player2, jboolean alwaysLog);
void JNICALL logBalance(JNIEnv *env, jobject self, jstring msg);
void JNICALL profilerStart(JNIEnv *env, jobject self, jstring sectionName);
void JNICALL profilerStop(JNIEnv *env, jobject self, jstring sectionName);
void JNICALL profilerStartAccum(JNIEnv *env, jobject self, jstring sectionName);
void JNICALL profilerStopAccum(JNIEnv *env, jobject self, jstring sectionName);
void JNICALL disableGameMemoryDump(JNIEnv *env, jobject self);
void JNICALL debugMemoryReport(JNIEnv *env, jobject self);
void JNICALL debugMemoryReportMap(JNIEnv *env, jobject self);
void JNICALL generateJavacore(JNIEnv *env, jobject self);
jlong JNICALL queryPerformanceCounter( JNIEnv * env, jobject self);
jlong JNICALL queryPerformanceCounterFrequency(JNIEnv * env, jobject self);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsDebugNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsDebugNamespace::c)}
JF("_debugConsoleMsg", "(JLjava/lang/String;)V", debugConsoleMsg),
JF("_debugSpeakMsg", "(JLjava/lang/String;)V", debugSpeakMsg),
JF("_debugServerConsoleMsg", "(JLjava/lang/String;)V", debugServerConsoleMsg),
JF("__LOG", "(Ljava/lang/String;Ljava/lang/String;JJJZ)V", log),
JF("logBalance", "(Ljava/lang/String;)V", logBalance),
JF("PROFILER_START", "(Ljava/lang/String;)V", profilerStart),
JF("PROFILER_STOP", "(Ljava/lang/String;)V", profilerStop),
JF("PROFILER_START_ACCUM", "(Ljava/lang/String;)V", profilerStartAccum),
JF("PROFILER_STOP_ACCUM", "(Ljava/lang/String;)V", profilerStopAccum),
JF("disableGameMemoryDump", "()V", disableGameMemoryDump),
JF("debugMemoryReport", "()V", debugMemoryReport),
JF("debugMemoryReportMap", "()V", debugMemoryReportMap),
JF("generateJavacore", "()V", generateJavacore),
JF("queryPerformanceCounter", "()J", queryPerformanceCounter),
JF("queryPerformanceCounterFrequency", "()J", queryPerformanceCounterFrequency)
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//----------------------------------------------------------------------
/**
* Prints a debugging message to a player's console.
*
* @param env Java environment
* @param self class calling this function
* @param objId the player's avatar object id
* @param msg the message to print
*/
void JNICALL ScriptMethodsDebugNamespace::debugConsoleMsg(JNIEnv *env, jobject self, jlong objId, jstring msg)
{
UNREF(self);
JavaStringParam localMsg(msg);
if (!ConfigServerScript::allowDebugConsoleMessages())
{
return;
}
ServerObject * object = 0;
if (!JavaLibrary::getObject(objId, object))
{
return;
}
std::string msgString;
JavaLibrary::convert(localMsg, msgString);
if (ConfigServerGame::getJavaConsoleDebugMessages())
{
DEBUG_REPORT_LOG(true, ("debugConsoleMsg (%s): %s\n",
object->getNetworkId().getValueString().c_str(), msgString.c_str()));
}
Client *client = object->getClient();
if (client)
{
ConsoleMgr::broadcastString(msgString, client);
return;
}
}
//----------------------------------------------------------------------
/**
* Prints a debugging message as if a creature spoke it.
*
* @param env Java environment
* @param self class calling this function
* @param objId the id of the object "speaking"
* @param msg the message to print
*/
void JNICALL ScriptMethodsDebugNamespace::debugSpeakMsg(JNIEnv *env, jobject self, jlong objId, jstring msg)
{
UNREF(self);
if (!ConfigServerScript::allowDebugSpeakMessages())
{
return;
}
JavaStringParam localMsg(msg);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objId, object))
{
DEBUG_REPORT_LOG(true, ("JavaLibrary::debugSpeakMsg invalid object\n"));
return;
}
Unicode::String msgString;
JavaLibrary::convert(localMsg, msgString);
if (ConfigServerGame::getJavaConsoleDebugMessages())
{
DEBUG_REPORT_LOG(true, ("debugSpeakMsg (%s): %s\n",
object->getNetworkId().getValueString().c_str(),
Unicode::wideToNarrow(msgString).c_str()));
}
object->speakText(NetworkId::cms_invalid, 0, 0, 0, msgString, 0, Unicode::emptyString);
} // JavaLibrary::debugSpeakMsg
//----------------------------------------------------------------------
/**
* Prints a debugging message to the server console.
*
* @param env Java environment
* @param self class calling this function
* @param objId the player's avatar object id
* @param msg the message to print
*/
void JNICALL ScriptMethodsDebugNamespace::debugServerConsoleMsg(JNIEnv *env, jobject self, jlong objId, jstring msg)
{
if(!ConfigServerGame::getJavaConsoleDebugMessages())
return;
UNREF(self);
JavaStringParam localMsg(msg);
std::string msgString;
JavaLibrary::convert(localMsg, msgString);
ServerObject * object = 0;
JavaLibrary::getObject(objId, object);
if (object == NULL)
{
DEBUG_REPORT_LOG(true, ("debugServerConsoleMsg from <unknown>: %s\n",
msgString.c_str()));
}
else
{
DEBUG_REPORT_LOG(true, ("debugServerConsoleMsg from %s: %s\n",
object->getNetworkId().getValueString().c_str(), msgString.c_str()));
}
} // JavaLibrary::debugServerConsoleMsg
//----------------------------------------------------------------------
/**
* Logs a message involving two players. The info for player one will replace the tag %TU in
* the message, and the info for player two will replace the tag %TT in the message.
* (The tags should match the prose package tag for user and target).
*
* @param env Java environment
* @param self class calling this function
* @param channel the channel to log to
* @param msg the message to log
* @param logger id of the object where the log is coming from
* @param player1 the 1st player for the message (may be null)
* @param player2 the 2nd player for the message (may be null)
* @param alwaysLog flag to ignore the disableScriptLogs flag and always log this message
*/
void JNICALL ScriptMethodsDebugNamespace::log(JNIEnv *env, jobject self, jstring channel, jstring msg, jlong logger, jlong player1, jlong player2, jboolean alwaysLog)
{
UNREF(self);
if (channel == 0 || msg == 0)
{
JavaLibrary::throwInternalScriptError("[designer bug] JavaLibrary::log called with null channel or message");
return;
}
if (alwaysLog || !ConfigServerScript::getDisableScriptLogs())
{
JavaStringParam localChan(channel);
std::string chanStr;
if (!JavaLibrary::convert(localChan, chanStr))
{
JavaLibrary::throwInternalScriptError("JavaLibrary::log could not convert channel to C string");
return;
}
JavaStringParam localMsg(msg);
std::string msgStr;
if (!JavaLibrary::convert(localMsg, msgStr))
{
JavaLibrary::throwInternalScriptError("JavaLibrary::log could not convert message to C string");
return;
}
NetworkId loggerId(logger);
if (player1 != 0)
{
const ServerObject * playerObject = NULL;
if (JavaLibrary::getObject(player1, playerObject))
{
std::string::size_type p = msgStr.find("%TU");
if (p != std::string::npos)
msgStr.replace(p, 3, PlayerObject::getAccountDescription(playerObject));
}
else
{
WARNING(true, ("JavaLibrary::log could not get object for "
"player1 passed for message %s", msgStr.c_str()));
}
}
if (player2 != 0)
{
const ServerObject * playerObject = NULL;
if (JavaLibrary::getObject(player2, playerObject))
{
std::string::size_type p = msgStr.find("%TT");
if (p != std::string::npos)
msgStr.replace(p, 3, PlayerObject::getAccountDescription(playerObject));
}
else
{
WARNING(true, ("JavaLibrary::log could not get object for "
"player2 passed for message %s", msgStr.c_str()));
}
}
LOG(chanStr.c_str(), ("%s (from %s)", msgStr.c_str(), loggerId.getValueString().c_str()));
}
} // JavaLibrary::log
//----------------------------------------------------------------------
/**
* Logs a message. To the GameBalance channel
*
* @param env Java environment
* @param self class calling this function
* @param msg the message to log
*/
void JNICALL ScriptMethodsDebugNamespace::logBalance(JNIEnv *env, jobject self, jstring msg)
{
UNREF(self);
if (ConfigServerScript::getLogBalance())
{
JavaStringParam localMsg(msg);
std::string msgStr;
JavaLibrary::convert(localMsg, msgStr);
LOG("GameBalance", ("balancelog:%d:%s", static_cast<int>(GameServer::getInstance().getProcessId()), msgStr.c_str()));
}
}
//----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::profilerStart(JNIEnv *env, jobject self, jstring sectionName)
{
UNREF(self);
std::string sectionNameStr;
JavaLibrary::convert(JavaStringParam(sectionName), sectionNameStr);
PROFILER_BLOCK_DEFINE(p, (*s_profileSections.insert(sectionNameStr).first).c_str());
PROFILER_BLOCK_ENTER(p);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::profilerStop(JNIEnv *env, jobject self, jstring sectionName)
{
UNREF(self);
std::string sectionNameStr;
JavaLibrary::convert(JavaStringParam(sectionName), sectionNameStr);
PROFILER_BLOCK_DEFINE(p, (*s_profileSections.insert(sectionNameStr).first).c_str());
PROFILER_BLOCK_LOST_CHECK(p);
PROFILER_BLOCK_LEAVE(p);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::profilerStartAccum(JNIEnv *env, jobject self, jstring sectionName)
{
UNREF(self);
std::string sectionNameStr;
JavaLibrary::convert(JavaStringParam(sectionName), sectionNameStr);
PROFILER_BLOCK_DEFINE(p, (*s_profileSections.insert(sectionNameStr).first).c_str());
PROFILER_BLOCK_ENTER(p);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::profilerStopAccum(JNIEnv *env, jobject self, jstring sectionName)
{
UNREF(self);
std::string sectionNameStr;
JavaLibrary::convert(JavaStringParam(sectionName), sectionNameStr);
PROFILER_BLOCK_DEFINE(p, (*s_profileSections.insert(sectionNameStr).first).c_str());
PROFILER_BLOCK_LOST_CHECK(p);
PROFILER_BLOCK_LEAVE(p);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::disableGameMemoryDump(JNIEnv *env, jobject self)
{
UNREF(self);
MemoryManager::setReportAllocations(false);
NetworkIdManager::setReportObjectLeaks(false);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::debugMemoryReport(JNIEnv *env, jobject self)
{
UNREF(self);
MemoryManager::debugReport();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::debugMemoryReportMap(JNIEnv *env, jobject self)
{
UNREF(self);
MemoryManager::debugReportMap();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsDebugNamespace::generateJavacore(JNIEnv *env, jobject self)
{
UNREF(self);
UNREF(env);
#ifdef linux
if (JavaLibrary::getJavaVmType() == JavaLibrary::JV_ibm)
{
::kill(0, SIGQUIT);
}
#endif
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsDebugNamespace::queryPerformanceCounter(JNIEnv * env, jobject self)
{
UNREF(env);
UNREF(self);
ProfilerTimer::Type time;
ProfilerTimer::getTime(time);
return static_cast<jlong>(time);
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsDebugNamespace::queryPerformanceCounterFrequency(JNIEnv * env, jobject self)
{
UNREF(env);
UNREF(self);
ProfilerTimer::Type freq;
ProfilerTimer::getFrequency(freq);
return static_cast<jlong>(freq);
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,149 @@
// ======================================================================
//
// ScriptMethodsForm.cpp
//
// Copyright 2003 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/FormManagerServer.h"
#include "serverGame/ServerObject.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsFormNamespace
// ======================================================================
namespace ScriptMethodsFormNamespace
{
bool install();
jboolean JNICALL editFormData(JNIEnv * env, jobject self, jlong player, jlong objectToEdit, jobjectArray keys, jobjectArray values);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsFormNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsFormNamespace::c)}
JF("_editFormData", "(JJ[Ljava/lang/String;[Ljava/lang/String;)Z", editFormData),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jboolean JNICALL ScriptMethodsFormNamespace::editFormData(JNIEnv * env, jobject self, jlong player, jlong jObjectToEdit, jobjectArray jKeys, jobjectArray jValues)
{
UNREF(self);
ServerObject * playerServerObject = NULL;
if (!JavaLibrary::getObject(player, playerServerObject) || !playerServerObject)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] can't get player in editFormData"));
return JNI_FALSE;
}
CreatureObject * const playerCreatureObject = playerServerObject->asCreatureObject();;
if (!playerCreatureObject)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] player is not a CreatureObject in editFormData"));
return JNI_FALSE;
}
ServerObject * objectToEditServerObject = NULL;
if (!JavaLibrary::getObject(jObjectToEdit, objectToEditServerObject) || !objectToEditServerObject)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] objectToEdit is not a ServerObject in editFormData"));
return JNI_FALSE;
}
int const keysCount = env->GetArrayLength(jKeys);
int const valuesCount = env->GetArrayLength(jValues);
if(keysCount != valuesCount)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] keys and values vectors are different sizes in editFormData"));
return JNI_FALSE;
}
FormManager::UnpackedFormData dataMap;
std::string key;
std::string value;
std::vector<std::string> values;
for (int i = 0; i < keysCount; ++i)
{
JavaString jKey(static_cast<jstring>(env->GetObjectArrayElement(jKeys, i)));
if (jKey.getValue() != 0)
{
if (!JavaLibrary::convert(jKey, key))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] can't convert key value in editFormData"));
return JNI_FALSE;
}
}
JavaString jValue(static_cast<jstring>(env->GetObjectArrayElement(jValues, i)));
if (jValue.getValue() != 0)
{
if (!JavaLibrary::convert(jValue, value))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] can't convert value in editFormData"));
return JNI_FALSE;
}
}
values.clear();
values.push_back(value);
/*TODO handle lists*/
dataMap[key] = values;
}
//override what we've been given with data from any appropriate objvar bindings
//get matching form
FormManager::Form const * const form = FormManagerServer::getFormForServerObjectTemplate(objectToEditServerObject->getTemplateName());
if(!form)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] objectToEdit does not have a form binding, cannot modify"));
return JNI_FALSE;
}
//build a list of all the fields that DON'T have objvar bindings (since script will need to tell us about them in JavaLibrary::editFormData
DynamicVariableList const & objvars = objectToEditServerObject->getObjVars();
std::vector<FormManager::Field const *> const & fields = form->getOrderedFieldList();
for(std::vector<FormManager::Field const *>::const_iterator i2 = fields.begin(); i2 != fields.end(); ++i2)
{
FormManager::Field const * const field = *i2;
if(!field)
continue;
std::string const & objvarBinding = field->getObjvarBinding();
if(!objvarBinding.empty())
{
//TODO handle non-strings
objvars.getItem(objvarBinding, value);
}
values.clear();
values.push_back(value);
/*TODO handle lists*/
dataMap[field->getName()] = values;
}
FormManagerServer::sendEditObjectDataToClient(playerCreatureObject->getNetworkId(),objectToEditServerObject->getNetworkId(), dataMap);
return JNI_TRUE;
}
// ======================================================================
@@ -0,0 +1,82 @@
// ======================================================================
//
// ScriptMethodsGlobalQuery.cpp
//
// Copyright 2002 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/GameServer.h"
#include "serverGame/NameManager.h"
#include "sharedFoundation/NetworkId.h"
#include "sharedFoundation/NetworkIdArchive.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsGlobalQueryNamespace
// ======================================================================
namespace ScriptMethodsGlobalQueryNamespace
{
bool install();
jlong JNICALL getPlayerIdFromFirstName(JNIEnv *env, jobject self, jstring firstName);
jboolean JNICALL playerExists(JNIEnv *env, jobject self, jlong playerId);
jstring JNICALL localize(JNIEnv *env, jobject self, jobject id);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsGlobalQueryNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsGlobalQueryNamespace::c)}
JF("_getPlayerIdFromFirstName", "(Ljava/lang/String;)J", getPlayerIdFromFirstName),
JF("_playerExists", "(J)Z", playerExists),
JF("localize", "(Lscript/string_id;)Ljava/lang/String;", localize),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jlong JNICALL ScriptMethodsGlobalQueryNamespace::getPlayerIdFromFirstName(JNIEnv *env, jobject self, jstring firstName)
{
std::string firstNameString;
JavaLibrary::convert(JavaStringParam(firstName), firstNameString);
return (NameManager::getInstance().getPlayerId(NameManager::normalizeName(firstNameString))).getValue();
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGlobalQueryNamespace::localize(JNIEnv *env, jobject self, jobject id)
{
StringId textStringId;
if (!ScriptConversion::convert(id, textStringId))
return 0;
Unicode::String textString;
if (!textStringId.localize(textString))
return 0;
return JavaString(textString).getReturnValue();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsGlobalQueryNamespace::playerExists(JNIEnv *env, jobject self, jlong playerId)
{
NetworkId playerNetworkId(playerId);
return !NameManager::getInstance().getPlayerName(playerNetworkId).empty();
}
// ======================================================================
@@ -0,0 +1,832 @@
// ======================================================================
//
// ScriptMethodsGuild.cpp
//
// Copyright 2002 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GuildInterface.h"
#include "serverGame/GuildMemberInfo.h"
#include "serverGame/GuildObject.h"
#include "serverGame/ServerUniverse.h"
#include "sharedGame/GuildRankDataTable.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsGuildNamespace
// ======================================================================
namespace ScriptMethodsGuildNamespace
{
bool install();
jint JNICALL getGuildId(JNIEnv *env, jobject self, jlong target);
jintArray JNICALL getAllGuildIds(JNIEnv *env, jobject self);
jlong JNICALL getMasterGuildObject(JNIEnv *env, jobject self);
jintArray JNICALL getGuildsAtWarWith(JNIEnv *env, jobject self, jint guildId);
jobject JNICALL getMasterGuildWarTableDictionary(JNIEnv * env, jobject self);
jobject JNICALL getInactiveGuildWarTableDictionary(JNIEnv * env, jobject self);
jint JNICALL findGuild(JNIEnv *env, jobject self, jstring name);
jint JNICALL createGuild(JNIEnv *env, jobject self, jstring name, jstring abbrev);
void JNICALL disbandGuild(JNIEnv *env, jobject self, jint guildId);
jboolean JNICALL guildExists(JNIEnv *env, jobject self, jint guildId);
jstring JNICALL guildGetName(JNIEnv *env, jobject self, jint guildId);
jstring JNICALL guildGetAbbrev(JNIEnv *env, jobject self, jint guildId);
jlong JNICALL guildGetLeader(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetElectionPreviousEndTime(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetElectionNextEndTime(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetCurrentFaction(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetPreviousFaction(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetTimeLeftPreviousFaction(JNIEnv *env, jobject self, jint guildId);
jstring JNICALL guildGetCurrentGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetTimeJoinedCurrentGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId);
jstring JNICALL guildGetPreviousGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetTimeLeftPreviousGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId);
jlongArray JNICALL guildGetMemberIds(JNIEnv *env, jobject self, jint guildId);
jlongArray JNICALL guildGetMemberIdsWithPermissions(JNIEnv *env, jobject self, jint guildId, jint permissions);
jint JNICALL guildGetCountMembersOnly(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetCountSponsoredOnly(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetCountMembersAndSponsored(JNIEnv *env, jobject self, jint guildId);
jint JNICALL guildGetCountMembersGuildWarPvPEnabled(JNIEnv *env, jobject self, jint guildId);
jstring JNICALL guildGetMemberName(JNIEnv *env, jobject self, jint guildId, jlong member);
jstring JNICALL guildGetMemberProfession(JNIEnv *env, jobject self, jint guildId, jlong member);
jint JNICALL guildGetMemberLevel(JNIEnv *env, jobject self, jint guildId, jlong member);
jint JNICALL guildGetMemberPermissions(JNIEnv *env, jobject self, jint guildId, jlong member);
jstring JNICALL guildGetMemberTitle(JNIEnv *env, jobject self, jint guildId, jlong member);
jlong JNICALL guildGetMemberAllegiance(JNIEnv *env, jobject self, jint guildId, jlong member);
jintArray JNICALL guildGetEnemies(JNIEnv *env, jobject self, jint guildId);
void JNICALL guildRemoveMember(JNIEnv *env, jobject self, jint guildId, jlong member);
void JNICALL guildAddCreatorMember(JNIEnv *env, jobject self, jint guildId, jlong member);
void JNICALL guildAddSponsorMember(JNIEnv *env, jobject self, jint guildId, jlong member);
void JNICALL guildSetMemberPermission(JNIEnv *env, jobject self, jint guildId, jlong member, jint permissions);
void JNICALL guildSetMemberTitle(JNIEnv *env, jobject self, jint guildId, jlong member, jstring title);
void JNICALL guildSetMemberAllegiance(JNIEnv *env, jobject self, jint guildId, jlong member, jlong allegiance);
void JNICALL guildSetMemberPermissionAndAllegiance(JNIEnv *env, jobject self, jint guildId, jlong member, jint permissions, jlong allegiance);
jobjectArray JNICALL guildGetAllRanks(JNIEnv *env, jobject self);
jobjectArray JNICALL guildGetTitleForRank(JNIEnv *env, jobject self, jstring rank);
jobjectArray JNICALL guildGetMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member);
jboolean JNICALL guildHasMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member, jstring rank);
void JNICALL guildAddMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member, jstring rank);
void JNICALL guildRemoveMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member, jstring rank);
void JNICALL guildSetLeader(JNIEnv *env, jobject self, jint guildId, jlong leader);
void JNICALL guildSetElectionEndTime(JNIEnv *env, jobject self, jint guildId, jint electionPreviousEndTime, jint electionNextEndTime);
void JNICALL guildSetFaction(JNIEnv *env, jobject self, jint guildId, jint factionId);
void JNICALL guildSetGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId, jstring gcwDefenderRegion);
void JNICALL guildRemoveEnemy(JNIEnv *env, jobject self, jint guildId, jint enemyId);
void JNICALL guildSetEnemy(JNIEnv *env, jobject self, jint guildId, jint enemyId);
void JNICALL guildUpdateGuildWarKillTracking(JNIEnv *env, jobject self, jlong killer, jlong victim);
jint JNICALL guildGetGuildWarKillCount(JNIEnv *env, jobject self, jint guildIdA, jint guildIdB);
jint JNICALL guildGetGuildWarKillCountUpdateTime(JNIEnv *env, jobject self, jint guildIdA, jint guildIdB);
void JNICALL guildSetName(JNIEnv *env, jobject self, jint guildId, jstring name);
void JNICALL guildSetAbbrev(JNIEnv *env, jobject self, jint guildId, jstring abbrev);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsGuildNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsGuildNamespace::c)}
JF("_getGuildId", "(J)I", getGuildId),
JF("getAllGuildIds", "()[I", getAllGuildIds),
JF("_getMasterGuildObject", "()J", getMasterGuildObject),
JF("findGuild", "(Ljava/lang/String;)I", findGuild),
JF("createGuild", "(Ljava/lang/String;Ljava/lang/String;)I", createGuild),
JF("disbandGuild", "(I)V", disbandGuild),
JF("guildExists", "(I)Z", guildExists),
JF("guildGetName", "(I)Ljava/lang/String;", guildGetName),
JF("guildGetAbbrev", "(I)Ljava/lang/String;", guildGetAbbrev),
JF("_guildGetLeader", "(I)J", guildGetLeader),
JF("guildGetElectionPreviousEndTime", "(I)I", guildGetElectionPreviousEndTime),
JF("guildGetElectionNextEndTime", "(I)I", guildGetElectionNextEndTime),
JF("guildGetCurrentFaction", "(I)I", guildGetCurrentFaction),
JF("guildGetPreviousFaction", "(I)I", guildGetPreviousFaction),
JF("guildGetTimeLeftPreviousFaction", "(I)I", guildGetTimeLeftPreviousFaction),
JF("guildGetCurrentGcwDefenderRegion", "(I)Ljava/lang/String;", guildGetCurrentGcwDefenderRegion),
JF("guildGetTimeJoinedCurrentGcwDefenderRegion", "(I)I", guildGetTimeJoinedCurrentGcwDefenderRegion),
JF("guildGetPreviousGcwDefenderRegion", "(I)Ljava/lang/String;", guildGetPreviousGcwDefenderRegion),
JF("guildGetTimeLeftPreviousGcwDefenderRegion", "(I)I", guildGetTimeLeftPreviousGcwDefenderRegion),
JF("_guildGetMemberIds", "(I)[J", guildGetMemberIds),
JF("_guildGetMemberIdsWithPermissions", "(II)[J", guildGetMemberIdsWithPermissions),
JF("guildGetCountMembersOnly", "(I)I", guildGetCountMembersOnly),
JF("guildGetCountSponsoredOnly", "(I)I", guildGetCountSponsoredOnly),
JF("guildGetCountMembersAndSponsored", "(I)I", guildGetCountMembersAndSponsored),
JF("guildGetCountMembersGuildWarPvPEnabled", "(I)I", guildGetCountMembersGuildWarPvPEnabled),
JF("_guildGetMemberName", "(IJ)Ljava/lang/String;", guildGetMemberName),
JF("_guildGetMemberProfession", "(IJ)Ljava/lang/String;", guildGetMemberProfession),
JF("_guildGetMemberLevel", "(IJ)I", guildGetMemberLevel),
JF("_guildGetMemberPermissions", "(IJ)I", guildGetMemberPermissions),
JF("_guildGetMemberTitle", "(IJ)Ljava/lang/String;", guildGetMemberTitle),
JF("_guildGetMemberAllegiance", "(IJ)J", guildGetMemberAllegiance),
JF("guildGetEnemies", "(I)[I", guildGetEnemies),
JF("getGuildsAtWarWith", "(I)[I", getGuildsAtWarWith),
JF("getMasterGuildWarTableDictionary", "()Lscript/dictionary;", getMasterGuildWarTableDictionary),
JF("getInactiveGuildWarTableDictionary", "()Lscript/dictionary;", getInactiveGuildWarTableDictionary),
JF("_guildRemoveMember", "(IJ)V", guildRemoveMember),
JF("_guildAddCreatorMember", "(IJ)V", guildAddCreatorMember),
JF("_guildAddSponsorMember", "(IJ)V", guildAddSponsorMember),
JF("_guildSetMemberPermission", "(IJI)V", guildSetMemberPermission),
JF("_guildSetMemberTitle", "(IJLjava/lang/String;)V", guildSetMemberTitle),
JF("_guildSetMemberAllegiance", "(IJJ)V", guildSetMemberAllegiance),
JF("_guildSetMemberPermissionAndAllegiance", "(IJIJ)V", guildSetMemberPermissionAndAllegiance),
JF("guildGetAllRanks", "()[Ljava/lang/String;", guildGetAllRanks),
JF("guildGetTitleForRank", "(Ljava/lang/String;)[Ljava/lang/String;", guildGetTitleForRank),
JF("_guildGetMemberRank", "(IJ)[Ljava/lang/String;", guildGetMemberRank),
JF("_guildHasMemberRank", "(IJLjava/lang/String;)Z", guildHasMemberRank),
JF("_guildAddMemberRank", "(IJLjava/lang/String;)V", guildAddMemberRank),
JF("_guildRemoveMemberRank", "(IJLjava/lang/String;)V", guildRemoveMemberRank),
JF("_guildSetLeader", "(IJ)V", guildSetLeader),
JF("guildSetElectionEndTime", "(III)V", guildSetElectionEndTime),
JF("guildSetFaction", "(II)V", guildSetFaction),
JF("guildSetGcwDefenderRegion", "(ILjava/lang/String;)V", guildSetGcwDefenderRegion),
JF("guildRemoveEnemy", "(II)V", guildRemoveEnemy),
JF("guildSetEnemy", "(II)V", guildSetEnemy),
JF("_guildUpdateGuildWarKillTracking", "(JJ)V", guildUpdateGuildWarKillTracking),
JF("guildGetGuildWarKillCount", "(II)I", guildGetGuildWarKillCount),
JF("guildGetGuildWarKillCountUpdateTime", "(II)I", guildGetGuildWarKillCountUpdateTime),
JF("guildSetName", "(ILjava/lang/String;)V", guildSetName),
JF("guildSetAbbrev", "(ILjava/lang/String;)V", guildSetAbbrev),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jint JNICALL ScriptMethodsGuildNamespace::getGuildId(JNIEnv *env, jobject self, jlong target)
{
CreatureObject *targetObj = 0;
if (!JavaLibrary::getObject(target, targetObj))
{
DEBUG_WARNING(true, ("JavaLibrary::getGuildId: called with invalid target"));
return 0;
}
return targetObj->getGuildId();
}
// ----------------------------------------------------------------------
jintArray JNICALL ScriptMethodsGuildNamespace::getAllGuildIds(JNIEnv *env, jobject self)
{
std::vector<int> guildIds;
GuildInterface::getAllGuildIds(guildIds);
LocalIntArrayRefPtr ret = createNewIntArray(guildIds.size());
if (!guildIds.empty())
setIntArrayRegion(*ret, 0, guildIds.size(), reinterpret_cast<jint *>(&guildIds[0]));
return ret->getReturnValue();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsGuildNamespace::getMasterGuildObject(JNIEnv *env, jobject self)
{
GuildObject *masterGuildObject = ServerUniverse::getInstance().getMasterGuildObject();
return masterGuildObject ? (masterGuildObject->getNetworkId()).getValue() : (NetworkId::cms_invalid).getValue();
}
// ----------------------------------------------------------------------
jintArray JNICALL ScriptMethodsGuildNamespace::getGuildsAtWarWith(JNIEnv *env, jobject self, jint guildId)
{
std::vector<int> const &enemies = GuildInterface::getGuildsAtWarWith(guildId);
LocalIntArrayRefPtr ret = createNewIntArray(enemies.size());
if (!enemies.empty())
setIntArrayRegion(*ret, 0, enemies.size(), const_cast<jint *>(reinterpret_cast<jint const *>(&enemies[0])));
return ret->getReturnValue();
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsGuildNamespace::getMasterGuildWarTableDictionary(JNIEnv * env, jobject self)
{
ScriptParams const * scriptParams = GuildInterface::getMasterGuildWarTableDictionary();
if (!scriptParams)
return 0;
JavaDictionaryPtr dictionary;
JavaLibrary::instance()->convert(*scriptParams, dictionary);
return dictionary->getReturnValue();
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsGuildNamespace::getInactiveGuildWarTableDictionary(JNIEnv * env, jobject self)
{
ScriptParams const * scriptParams = GuildInterface::getInactiveGuildWarTableDictionary();
if (!scriptParams)
return 0;
JavaDictionaryPtr dictionary;
JavaLibrary::instance()->convert(*scriptParams, dictionary);
return dictionary->getReturnValue();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::findGuild(JNIEnv *env, jobject self, jstring name)
{
JavaStringParam localNameStr(name);
std::string nameStr;
if (!JavaLibrary::convert(localNameStr, nameStr))
{
DEBUG_WARNING(true, ("JavaLibrary::findGuild: invalid name"));
return 0;
}
return GuildInterface::findGuild(nameStr);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::createGuild(JNIEnv *env, jobject self, jstring name, jstring abbrev)
{
JavaStringParam localNameStr(name);
std::string nameStr;
if (!JavaLibrary::convert(localNameStr, nameStr))
{
DEBUG_WARNING(true, ("JavaLibrary::createGuild: invalid name"));
return 0;
}
JavaStringParam localAbbrevStr(abbrev);
std::string abbrevStr;
if (!JavaLibrary::convert(localAbbrevStr, abbrevStr))
{
DEBUG_WARNING(true, ("JavaLibrary::createGuild: invalid abbrev"));
return 0;
}
return GuildInterface::createGuild(nameStr, abbrevStr);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::disbandGuild(JNIEnv *env, jobject self, jint guildId)
{
GuildInterface::disbandGuild(guildId);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsGuildNamespace::guildExists(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::guildExists(guildId);
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGuildNamespace::guildGetName(JNIEnv *env, jobject self, jint guildId)
{
JavaString str(GuildInterface::getGuildName(guildId).c_str());
return str.getReturnValue();
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGuildNamespace::guildGetAbbrev(JNIEnv *env, jobject self, jint guildId)
{
JavaString str(GuildInterface::getGuildAbbrev(guildId).c_str());
return str.getReturnValue();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsGuildNamespace::guildGetLeader(JNIEnv *env, jobject self, jint guildId)
{
return (GuildInterface::getGuildLeaderId(guildId)).getValue();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetElectionPreviousEndTime(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getGuildElectionPreviousEndTime(guildId);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetElectionNextEndTime(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getGuildElectionNextEndTime(guildId);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetCurrentFaction(JNIEnv *env, jobject self, jint guildId)
{
return static_cast<jint>(GuildInterface::getGuildCurrentFaction(guildId));
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetPreviousFaction(JNIEnv *env, jobject self, jint guildId)
{
return static_cast<jint>(GuildInterface::getGuildPreviousFaction(guildId));
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetTimeLeftPreviousFaction(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getTimeLeftGuildPreviousFaction(guildId);
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGuildNamespace::guildGetCurrentGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId)
{
JavaString str(GuildInterface::getGuildCurrentGcwDefenderRegion(guildId).c_str());
return str.getReturnValue();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetTimeJoinedCurrentGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getTimeJoinedGuildCurrentGcwDefenderRegion(guildId);
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGuildNamespace::guildGetPreviousGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId)
{
JavaString str(GuildInterface::getGuildPreviousGcwDefenderRegion(guildId).c_str());
return str.getReturnValue();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetTimeLeftPreviousGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getTimeLeftGuildPreviousGcwDefenderRegion(guildId);
}
// ----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsGuildNamespace::guildGetMemberIds(JNIEnv *env, jobject self, jint guildId)
{
std::vector<NetworkId> results;
GuildInterface::getGuildMemberIds(guildId, results);
LocalLongArrayRefPtr rv;
if (ScriptConversion::convert(results, rv))
return rv->getReturnValue();
return 0;
}
// ----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsGuildNamespace::guildGetMemberIdsWithPermissions(JNIEnv *env, jobject self, jint guildId, jint permissions)
{
std::vector<NetworkId> results;
GuildInterface::getGuildMemberIdsWithPermissions(guildId, permissions, results);
if (results.empty())
return 0;
LocalLongArrayRefPtr rv;
if (ScriptConversion::convert(results, rv))
return rv->getReturnValue();
return 0;
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetCountMembersOnly(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getGuildCountMembersOnly(guildId);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetCountSponsoredOnly(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getGuildCountSponsoredOnly(guildId);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetCountMembersAndSponsored(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getGuildCountMembersAndSponsored(guildId);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetCountMembersGuildWarPvPEnabled(JNIEnv *env, jobject self, jint guildId)
{
return GuildInterface::getGuildCountMembersGuildWarPvPEnabled(guildId);
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGuildNamespace::guildGetMemberName(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildMemberInfo const *memberInfo = GuildInterface::getGuildMemberInfo(guildId, memberId);
if (memberInfo)
{
JavaString str(memberInfo->m_name.c_str());
return str.getReturnValue();
}
DEBUG_WARNING(true, ("JavaLibrary::guildGetMemberName called with invalid info (guildId=%d memberId=%s)", guildId, memberId.getValueString().c_str()));
return 0;
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGuildNamespace::guildGetMemberProfession(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildMemberInfo const *memberInfo = GuildInterface::getGuildMemberInfo(guildId, memberId);
if (memberInfo)
{
JavaString str(memberInfo->m_professionSkillTemplate.c_str());
return str.getReturnValue();
}
DEBUG_WARNING(true, ("JavaLibrary::guildGetMemberProfession called with invalid info (guildId=%d memberId=%s)", guildId, memberId.getValueString().c_str()));
return 0;
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetMemberLevel(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildMemberInfo const *memberInfo = GuildInterface::getGuildMemberInfo(guildId, memberId);
if (memberInfo)
return memberInfo->m_level;
DEBUG_WARNING(true, ("JavaLibrary::guildGetMemberLevel called with invalid info (guildId=%d memberId=%s)", guildId, memberId.getValueString().c_str()));
return 0;
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetMemberPermissions(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildMemberInfo const *memberInfo = GuildInterface::getGuildMemberInfo(guildId, memberId);
if (memberInfo)
return memberInfo->m_permissions;
DEBUG_WARNING(true, ("JavaLibrary::guildGetMemberPermissions called with invalid info (guildId=%d memberId=%s)", guildId, memberId.getValueString().c_str()));
return 0;
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsGuildNamespace::guildGetMemberTitle(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildMemberInfo const *memberInfo = GuildInterface::getGuildMemberInfo(guildId, memberId);
if (memberInfo)
{
JavaString str(memberInfo->m_title.c_str());
return str.getReturnValue();
}
DEBUG_WARNING(true, ("JavaLibrary::guildGetMemberTitle called with invalid info (guildId=%d memberId=%s)", guildId, memberId.getValueString().c_str()));
return 0;
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsGuildNamespace::guildGetMemberAllegiance(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildMemberInfo const *memberInfo = GuildInterface::getGuildMemberInfo(guildId, memberId);
if (memberInfo)
return (memberInfo->m_allegiance).getValue();
DEBUG_WARNING(true, ("JavaLibrary::guildGetMemberAllegiance called with invalid info (guildId=%d memberId=%s)", guildId, memberId.getValueString().c_str()));
return 0;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildRemoveMember(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildInterface::removeGuildMember(guildId, memberId);
}
// ----------------------------------------------------------------------
jintArray JNICALL ScriptMethodsGuildNamespace::guildGetEnemies(JNIEnv *env, jobject self, jint guildId)
{
std::vector<int> const &enemies = GuildInterface::getGuildEnemies(guildId);
LocalIntArrayRefPtr ret = createNewIntArray(enemies.size());
if (!enemies.empty())
setIntArrayRegion(*ret, 0, enemies.size(), const_cast<jint *>(reinterpret_cast<jint const *>(&enemies[0])));
return ret->getReturnValue();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetLeader(JNIEnv *env, jobject self, jint guildId, jlong leader)
{
NetworkId leaderId(leader);
GuildInterface::setGuildLeader(guildId, leaderId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetElectionEndTime(JNIEnv *env, jobject self, jint guildId, jint electionPreviousEndTime, jint electionNextEndTime)
{
GuildInterface::setGuildElectionEndTime(guildId, electionPreviousEndTime, electionNextEndTime);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetFaction(JNIEnv *env, jobject self, jint guildId, jint factionId)
{
GuildInterface::setGuildFaction(guildId, static_cast<uint32>(factionId));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetGcwDefenderRegion(JNIEnv *env, jobject self, jint guildId, jstring gcwDefenderRegion)
{
JavaStringParam localGcwDefenderRegionStr(gcwDefenderRegion);
std::string gcwDefenderRegionStr;
if (JavaLibrary::convert(localGcwDefenderRegionStr, gcwDefenderRegionStr))
{
if (!gcwDefenderRegionStr.empty())
{
Pvp::GcwScoreCategory const * const gcwCategory = Pvp::getGcwScoreCategory(gcwDefenderRegionStr);
if (!gcwCategory)
{
DEBUG_WARNING(true, ("JavaLibrary::guildSetGcwDefenderRegion: invalid GCW score category (%s)", gcwDefenderRegionStr.c_str()));
return;
}
if (!gcwCategory->gcwRegionDefender)
{
DEBUG_WARNING(true, ("JavaLibrary::guildSetGcwDefenderRegion: GCW score category (%s) is not flagged as GcwRegionDefender", gcwDefenderRegionStr.c_str()));
return;
}
}
}
else
{
gcwDefenderRegionStr.clear();
}
GuildInterface::setGuildGcwDefenderRegion(guildId, gcwDefenderRegionStr);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildAddCreatorMember(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildInterface::addGuildCreatorMember(guildId, memberId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildAddSponsorMember(JNIEnv *env, jobject self, jint guildId, jlong member)
{
NetworkId memberId(member);
GuildInterface::addGuildSponsorMember(guildId, memberId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetMemberPermission(JNIEnv *env, jobject self, jint guildId, jlong member, jint permissions)
{
NetworkId memberId(member);
GuildInterface::setGuildMemberPermission(guildId, memberId, permissions);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetMemberTitle(JNIEnv *env, jobject self, jint guildId, jlong member, jstring title)
{
NetworkId memberId(member);
JavaStringParam localTitleStr(title);
std::string titleStr;
if (!JavaLibrary::convert(localTitleStr, titleStr))
{
DEBUG_WARNING(true, ("JavaLibrary::guildSetMemberTitle: invalid title"));
return;
}
GuildInterface::setGuildMemberTitle(guildId, memberId, titleStr);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetMemberAllegiance(JNIEnv *env, jobject self, jint guildId, jlong member, jlong allegiance)
{
NetworkId memberId(member);
NetworkId allegianceId(allegiance);
GuildInterface::setGuildMemberAllegiance(guildId, memberId, allegianceId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetMemberPermissionAndAllegiance(JNIEnv *env, jobject self, jint guildId, jlong member, jint permissions, jlong allegiance)
{
NetworkId memberId(member);
NetworkId allegianceId(allegiance);
GuildInterface::setGuildMemberPermissionAndAllegiance(guildId, memberId, permissions, allegianceId);
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsGuildNamespace::guildGetAllRanks(JNIEnv *env, jobject self)
{
std::vector<GuildRankDataTable::GuildRank const *> const & ranks = GuildRankDataTable::getAllRanks();
if (ranks.empty())
return 0;
int i = 0;
LocalObjectArrayRefPtr valueArray = createNewObjectArray(ranks.size(), JavaLibrary::getClsString());
for (std::vector<GuildRankDataTable::GuildRank const *>::const_iterator iter = ranks.begin(); iter != ranks.end(); ++iter)
{
JavaString jval((*iter)->name);
setObjectArrayElement(*valueArray, i++, jval);
}
return valueArray->getReturnValue();
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsGuildNamespace::guildGetTitleForRank(JNIEnv *env, jobject self, jstring rank)
{
JavaStringParam localRankStr(rank);
std::string rankStr;
if (!JavaLibrary::convert(localRankStr, rankStr))
{
DEBUG_WARNING(true, ("JavaLibrary::guildGetTitleForRank: invalid rank"));
return 0;
}
GuildRankDataTable::GuildRank const * rankInfo = GuildRankDataTable::getRank(rankStr);
if (!rankInfo || rankInfo->titles.empty())
return 0;
int i = 0;
LocalObjectArrayRefPtr valueArray = createNewObjectArray(rankInfo->titles.size(), JavaLibrary::getClsString());
for (std::vector<std::string>::const_iterator iter = rankInfo->titles.begin(); iter != rankInfo->titles.end(); ++iter)
{
JavaString jval(*iter);
setObjectArrayElement(*valueArray, i++, jval);
}
return valueArray->getReturnValue();
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsGuildNamespace::guildGetMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member)
{
std::vector<std::string> ranks;
GuildInterface::getGuildMemberRank(guildId, NetworkId(static_cast<NetworkId::NetworkIdType>(member)), ranks);
if (ranks.empty())
return 0;
int i = 0;
LocalObjectArrayRefPtr valueArray = createNewObjectArray(ranks.size(), JavaLibrary::getClsString());
for (std::vector<std::string>::const_iterator iter = ranks.begin(); iter != ranks.end(); ++iter)
{
JavaString jval(*iter);
setObjectArrayElement(*valueArray, i++, jval);
}
return valueArray->getReturnValue();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsGuildNamespace::guildHasMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member, jstring rank)
{
NetworkId memberId(member);
JavaStringParam localRankStr(rank);
std::string rankStr;
if (!JavaLibrary::convert(localRankStr, rankStr))
{
DEBUG_WARNING(true, ("JavaLibrary::guildHasMemberRank: invalid rank"));
return JNI_FALSE;
}
return GuildInterface::hasGuildMemberRank(guildId, memberId, rankStr);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildAddMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member, jstring rank)
{
NetworkId memberId(member);
JavaStringParam localRankStr(rank);
std::string rankStr;
if (!JavaLibrary::convert(localRankStr, rankStr))
{
DEBUG_WARNING(true, ("JavaLibrary::guildAddMemberRank: invalid rank"));
return;
}
GuildInterface::addGuildMemberRank(guildId, memberId, rankStr);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildRemoveMemberRank(JNIEnv *env, jobject self, jint guildId, jlong member, jstring rank)
{
NetworkId memberId(member);
JavaStringParam localRankStr(rank);
std::string rankStr;
if (!JavaLibrary::convert(localRankStr, rankStr))
{
DEBUG_WARNING(true, ("JavaLibrary::guildRemoveMemberRank: invalid rank"));
return;
}
GuildInterface::removeGuildMemberRank(guildId, memberId, rankStr);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildRemoveEnemy(JNIEnv *env, jobject self, jint guildId, jint enemyId)
{
GuildInterface::removeGuildEnemy(guildId, enemyId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetEnemy(JNIEnv *env, jobject self, jint guildId, jint enemyId)
{
GuildInterface::setGuildEnemy(guildId, enemyId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildUpdateGuildWarKillTracking(JNIEnv *env, jobject self, jlong killer, jlong victim)
{
CreatureObject const *killerObj = 0;
if (!JavaLibrary::getObject(killer, killerObj))
return;
CreatureObject const *victimObj = 0;
if (!JavaLibrary::getObject(victim, victimObj))
return;
if (killerObj && victimObj)
GuildInterface::updateGuildWarKillTracking(*killerObj, *victimObj);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetGuildWarKillCount(JNIEnv *env, jobject self, jint guildIdA, jint guildIdB)
{
return GuildInterface::getGuildEnemyKillInfo(guildIdA, guildIdB).first;
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsGuildNamespace::guildGetGuildWarKillCountUpdateTime(JNIEnv *env, jobject self, jint guildIdA, jint guildIdB)
{
return GuildInterface::getGuildEnemyKillInfo(guildIdA, guildIdB).second;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetName(JNIEnv *env, jobject self, jint guildId, jstring name)
{
JavaStringParam localNewNameStr(name);
std::string newNameStr;
if (!JavaLibrary::convert(localNewNameStr, newNameStr))
{
DEBUG_WARNING(true, ("JavaLibrary::guildSetName: invalid name"));
return;
}
GuildInterface::setGuildName(guildId, newNameStr);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsGuildNamespace::guildSetAbbrev(JNIEnv *env, jobject self, jint guildId, jstring abbrev)
{
JavaStringParam localNewAbbrevStr(abbrev);
std::string newAbbrevStr;
if (!JavaLibrary::convert(localNewAbbrevStr, newAbbrevStr))
{
DEBUG_WARNING(true, ("JavaLibrary::guildSetAbbrev: invalid abbrev"));
return;
}
GuildInterface::setGuildAbbrev(guildId, newAbbrevStr);
}
// ======================================================================
@@ -0,0 +1,460 @@
// ======================================================================
//
// ScriptMethodsHateList.cpp
// Copyright 2005 Sony Online Eentertainment, Inc.
// All rights reserved.
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/AiLogManager.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/HateList.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/TangibleObject.h"
#include "sharedLog/Log.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsHateListNamespace
// ======================================================================
namespace ScriptMethodsHateListNamespace
{
bool install();
void JNICALL setAggroImmuneDuration(JNIEnv * env, jobject self, jlong player, jint duration);
jboolean JNICALL isAggroImmune(JNIEnv * env, jobject self, jlong player);
void JNICALL addHate(JNIEnv * env, jobject self, jlong object, jlong hateTarget, jfloat hate);
void JNICALL addHateDot(JNIEnv * env, jobject self, jlong object, jlong hateTarget, jfloat hate, jint seconds);
void JNICALL setHate(JNIEnv * env, jobject self, jlong object, jlong hateTarget, jfloat hate);
void JNICALL removeHateTarget(JNIEnv * env, jobject self, jlong object, jlong hateTarget);
jfloat JNICALL getHate(JNIEnv * env, jobject self, jlong object, jlong hateTarget);
jfloat JNICALL getMaxHate(JNIEnv * env, jobject self, jlong object);
void JNICALL clearHateList(JNIEnv * env, jobject self, jlong object);
jlong JNICALL getHateTarget(JNIEnv * env, jobject self, jlong object);
jlongArray JNICALL getHateList(JNIEnv * env, jobject self, jlong object);
jboolean JNICALL isOnHateList(JNIEnv * env, jobject self, jlong object, jlong target);
void JNICALL resetHateTimer(JNIEnv * env, jobject self, jlong object);
void JNICALL setAILeashTime(JNIEnv * env, jobject self, jlong object, jfloat time);
jfloat JNICALL getAILeashTime(JNIEnv * env, jobject self, jlong object);
void JNICALL forceHateTarget(JNIEnv * env, jobject self, jlong object, jlong target);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsHateListNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsHateListNamespace::c)}
JF("_setAggroImmuneDuration", "(JI)V", setAggroImmuneDuration),
JF("_isAggroImmune", "(J)Z", isAggroImmune),
JF("_addHate", "(JJF)V", addHate),
JF("_addHateDot", "(JJFI)V", addHateDot),
JF("_setHate", "(JJF)V", setHate),
JF("_removeHateTarget", "(JJ)V", removeHateTarget),
JF("_getHate", "(JJ)F", getHate),
JF("_getMaxHate", "(J)F", getMaxHate),
JF("_clearHateList", "(J)V", clearHateList),
JF("_getHateTarget", "(J)J", getHateTarget),
JF("_getHateList", "(J)[J", getHateList),
JF("_isOnHateList", "(JJ)Z", isOnHateList),
JF("_resetHateTimer", "(J)V", resetHateTimer),
JF("_setAILeashTime", "(JF)V", setAILeashTime),
JF("_getAILeashTime", "(J)F", getAILeashTime),
JF("_forceHateTarget", "(JJ)V", forceHateTarget),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
//
// ScriptMethodsHateList
//
// ======================================================================
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::setAggroImmuneDuration(JNIEnv * /*env*/, jobject /*self*/, jlong player, jint duration)
{
NetworkId const playerNetworkId(player);
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(CreatureObject::getCreatureObject(playerNetworkId));
if (playerObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setAggroImmuneDuration() player(%s) Unable to resolve the object to a PlayerObject.", playerNetworkId.getValueString().c_str()));
return;
}
playerObject->setAggroImmuneDuration(duration);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsHateListNamespace::isAggroImmune(JNIEnv * /*env*/, jobject /*self*/, jlong player)
{
NetworkId const playerNetworkId(player);
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(CreatureObject::getCreatureObject(playerNetworkId));
if (playerObject == NULL)
{
return JNI_FALSE;
}
return playerObject->isAggroImmune();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::addHate(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget, jfloat hate)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHate() object(%s) hateTarget(%s) hate(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHate() object(%s) hate(%.2f) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hate, hateTargetNetworkId.getValueString().c_str()));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHate() object(%s) hateTarget(%s) hate(%.2f) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
objectTangibleObject->addHate(hateTargetNetworkId, hate);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::addHateDot(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget, jfloat hate, jint seconds)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHateDot() object(%s) hateTarget(%s) hate(%.2f) seconds(%d) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate, seconds));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHateDot() object(%s) hate(%.2f) seconds(%d) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate, seconds));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHateDot() object(%s) hateTarget(%s) hate(%.2f) seconds(%d) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate, seconds));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::addHateDot() object(%s) hateTarget(%s) hate(%.2f+%.2f) seconds(%d)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), objectTangibleObject->getHate(hateTargetNetworkId), hate, seconds));
objectTangibleObject->addHateOverTime(hateTargetNetworkId, hate, seconds);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::setHate(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget, jfloat hate)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
WARNING(true, ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f) Unable to resolve the hateTarget to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
objectTangibleObject->setHate(hateTargetNetworkId, hate);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::removeHateTarget(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
WARNING(true, ("ScriptMethodsHateList::removeHateTarget() object(%s) hateTarget(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::removeHateTarget() object(%s) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::removeHateTarget() object(%s) hateTarget(%s) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::removeHateTarget() object(%s) hateTarget(%s)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
objectTangibleObject->removeHateTarget(hateTargetNetworkId);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsHateListNamespace::getHate(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getHate() object(%s) hateTarget(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return 0.0f;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::getHate() object(%s) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return 0.0f;
}
if (networkId == hateTargetNetworkId)
{
return 0.0f;
}
return objectTangibleObject->getHate(hateTargetNetworkId);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsHateListNamespace::getMaxHate(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getMaxHate() object(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str()));
return 0.0f;
}
float const maxHate = objectTangibleObject->getMaxHate();
return maxHate;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::clearHateList(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::clearHateList() Unable to resolve the object(%s) to a TangibleObject.", networkId.getValueString().c_str()));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::clearHateList() object(%s)", networkId.getValueString().c_str()));
objectTangibleObject->clearHateList();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsHateListNamespace::getHateTarget(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getHateTarget() Unable to resolve the object(%s) to a TangibleObject.", networkId.getValueString().c_str()));
return 0;
}
CachedNetworkId const & hateTarget = objectTangibleObject->getHateTarget();
return hateTarget.getValue();
}
// ----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsHateListNamespace::getHateList(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::getHateList() object(%s)", networkId.getValueString().c_str()));
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getHateList() Unable to resolve the object(%s) to a TangibleObject.", networkId.getValueString().c_str()));
return 0;
}
HateList::SortedList sortedHateList;
objectTangibleObject->getSortedHateList(sortedHateList);
LocalLongArrayRefPtr hateList = createNewLongArray(static_cast<long>(sortedHateList.size()));
HateList::SortedList::const_iterator iterSortedHateList = sortedHateList.begin();
int index = 0;
jlong jlongTmp;
for (; iterSortedHateList != sortedHateList.end(); ++iterSortedHateList)
{
jlongTmp = (iterSortedHateList->first).getValue();
setLongArrayRegion(*hateList, index, 1, &jlongTmp);
++index;
}
return hateList->getReturnValue();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsHateListNamespace::isOnHateList(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong target)
{
NetworkId const networkId(object);
NetworkId const targetNetworkId(target);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::isOnHateList() object(%s) target(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), targetNetworkId.getValueString().c_str()));
return JNI_FALSE;
}
if (targetNetworkId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::isOnHateList() object(%s) Unable to resolve the target(%s) to a NetworkId.", networkId.getValueString().c_str(), targetNetworkId.getValueString().c_str()));
return JNI_FALSE;
}
return objectTangibleObject->isOnHateList(targetNetworkId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::resetHateTimer(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::resetHateTimer() object(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str()));
return;
}
objectTangibleObject->resetHateTimer();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::setAILeashTime(JNIEnv * /*env*/, jobject /*self*/, jlong object, jfloat time )
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setAILeashTime() object(%s) time(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), time));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai",
("ScriptMethodsHateList::setAILeashTime() object(%s) time(%f)",
networkId.getValueString().c_str(),
time
));
objectTangibleObject->setAILeashTime(time);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsHateListNamespace::getAILeashTime(JNIEnv * /*env*/, jobject /*self*/, jlong object )
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setAILeashTime() object(%s) time(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), time));
return 0.0;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai",
("ScriptMethodsHateList::setAILeashTime() object(%s) time(%f)",
networkId.getValueString().c_str(),
time
));
return objectTangibleObject->getAILeashTime();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::forceHateTarget(JNIEnv * env, jobject self, jlong object, jlong target)
{
UNREF(env);
UNREF(self);
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(target);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
WARNING(true, ("ScriptMethodsHateList::forceHateTarget() object(%s) hateTarget(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::forceHateTarget() object(%s) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::forceHateTarget() object(%s) hateTarget(%s) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::forceHateTarget() object(%s) hateTarget(%s)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
objectTangibleObject->forceHateTarget(hateTargetNetworkId);
}
// ======================================================================
@@ -0,0 +1,100 @@
//-----------------------------------------------------------------------
// ScriptMethodsHolocube.cpp
// Copyright 2002, Sony Online Entertainment Inc., all rights reserved.
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObject.h"
#include "sharedNetworkMessages/OpenHolocronToPageMessage.h"
#include "sharedNetworkMessages/CloseHolocronMessage.h"
// ======================================================================
// ScriptMethodsHolocubeNamespace
// ======================================================================
namespace ScriptMethodsHolocubeNamespace
{
bool install();
jboolean JNICALL openHolocronToPage(JNIEnv *env, jobject self, jlong client, jstring jpage);
jboolean JNICALL closeHolocron(JNIEnv *env, jobject self, jlong client);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsHolocubeNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsHolocubeNamespace::c)}
JF("_openHolocronToPage", "(JLjava/lang/String;)Z", openHolocronToPage),
JF("_closeHolocron", "(J)Z", closeHolocron),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsHolocubeNamespace::openHolocronToPage(JNIEnv *env, jobject self, jlong client, jstring jpage)
{
JavaStringParam localPage(jpage);
ServerObject* so = NULL;
if(!JavaLibrary::getObject(client, so))
{
WARNING (true, ("[Script bug] Could not get ServerObject for value passed in for paramter:client in JavaLibrary::openHolocronToPage"));
return JNI_FALSE;
}
Client* c = so->getClient();
if(!c)
{
WARNING (true, ("[Script bug] Value given for paramter:client is not a player in JavaLibrary::openHolocronToPage, associated ServerObject NetworkId is: %s", so->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
std::string page;
JavaLibrary::convert(localPage, page);
//an empty page is fine, that tells the client just to open the holocube
OpenHolocronToPageMessage ohtpm(page);
if(c)
c->send(ohtpm, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsHolocubeNamespace::closeHolocron(JNIEnv *env, jobject self, jlong client)
{
ServerObject* so = NULL;
if(!JavaLibrary::getObject(client, so))
{
WARNING (true, ("[Script bug] Could not get ServerObject for value passed in for paramter:client in JavaLibrary::closeHolocron"));
return JNI_FALSE;
}
Client* c = so->getClient();
if(!c)
{
WARNING (true, ("[Script bug] Value given for paramter:client is not a player in JavaLibrary::closeHolocron, associated ServerObject NetworkId is: %s", so->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
CloseHolocronMessage chm;
if(c)
c->send(chm, true);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
@@ -0,0 +1,534 @@
//========================================================================
//
// ScriptMethodsHyperspace.cpp - implements script methods dealing with hyperspace
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "sharedFoundation/MessageQueue.h"
#include "serverGame/Chat.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerUniverse.h"
#include "serverGame/ServerWorld.h"
#include "serverGame/ShipController.h"
#include "serverGame/ShipObject.h"
#include "sharedGame/HyperspaceManager.h"
#include "sharedGame/SharedHyperspaceStringIds.h"
#include "sharedNetworkMessages/MessageQueueGenericValueType.h"
#include "sharedObject/CachedNetworkId.h"
#include "serverScript/GameScriptObject.h"
#include "serverScript/ScriptParameters.h"
#include "UnicodeUtils.h"
//========================================================================
// constants
//========================================================================
namespace ScriptMethodsHyperspaceNamespace
{
float const cs_hyperspaceDelayTime = 6.0f;
float const cs_hyperspaceInvulnerableTime = cs_hyperspaceDelayTime + 10.0f;
float const cs_hyperspaceMinDistance = 500.f;
bool install();
void sendUnlockPlayerShipInputOnClient(ShipObject * shipObject);
void JNICALL hyperspacePlayerToLocation(JNIEnv *env, jobject self, jlong player, jstring scene, jfloat x_w, jfloat y_w, jfloat z_w, jlong cell, jfloat x_p, jfloat y_p, jfloat z_p, jstring callback, jboolean forceLoadScreen);
void JNICALL hyperspacePlayerToLocationCellName(JNIEnv *env, jobject self, jlong player, jstring scene, jfloat x_w, jfloat y_w, jfloat z_w, jlong building, jstring cell, jfloat x_p, jfloat y_p, jfloat z_p, jstring callback, jboolean forceLoadScreen);
void JNICALL hyperspacePlayerToHyperspacePoint(JNIEnv *env, jobject self, jlong player, jstring hyperspacePoint, jstring callback, jboolean forceLoadScreen, jboolean ignoreTooFull);
jboolean JNICALL isHyperspacePointOverpopulated(JNIEnv *env, jobject self, jstring jhyperspacePoint);
void JNICALL hyperspacePrepareShipOnClient(JNIEnv *env, jobject self, jlong player, jstring jhyperspacePoint);
void JNICALL hyperspaceRestoreShipOnClientFromAbortedHyperspace(JNIEnv *env, jobject self, jlong player);
jstring JNICALL getSceneForHyperspacePoint(JNIEnv *env, jobject self, jstring hyperspacePoint);
}
void ScriptMethodsHyperspaceNamespace::sendUnlockPlayerShipInputOnClient(ShipObject * const shipObject)
{
CreatureObject * const pilotCreature = (shipObject != 0) ? shipObject->getPilot() : 0;
Controller * const pilotController = (pilotCreature != 0) ? pilotCreature->getController() : 0;
if (pilotController != 0)
{
pilotController->appendMessage(
CM_unlockPlayerShipInputOnClient,
0.0f,
GameControllerMessageFlags::SEND |
GameControllerMessageFlags::RELIABLE |
GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
using namespace ScriptMethodsHyperspaceNamespace;
//========================================================================
// install
//========================================================================
bool ScriptMethodsHyperspaceNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsHyperspaceNamespace::c)}
JF("_hyperspacePlayerToLocation", "(JLjava/lang/String;FFFJFFFLjava/lang/String;Z)V", hyperspacePlayerToLocation),
JF("_hyperspacePlayerToLocation", "(JLjava/lang/String;FFFJLjava/lang/String;FFFLjava/lang/String;Z)V", hyperspacePlayerToLocationCellName),
JF("_hyperspacePlayerToHyperspacePoint", "(JLjava/lang/String;Ljava/lang/String;ZZ)V", hyperspacePlayerToHyperspacePoint),
JF("isHyperspacePointOverpopulated", "(Ljava/lang/String;)Z", isHyperspacePointOverpopulated),
JF("_hyperspacePrepareShipOnClient", "(JLjava/lang/String;)V", hyperspacePrepareShipOnClient),
JF("_hyperspaceRestoreShipOnClientFromAbortedHyperspace","(J)V", hyperspaceRestoreShipOnClientFromAbortedHyperspace),
JF("getSceneForHyperspacePoint", "(Ljava/lang/String;)Ljava/lang/String;", getSceneForHyperspacePoint),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI action state callback methods
//========================================================================
void JNICALL ScriptMethodsHyperspaceNamespace::hyperspacePlayerToLocation(JNIEnv *env, jobject self, jlong player, jstring scene, jfloat x_w, jfloat y_w, jfloat z_w, jlong cell, jfloat x_p, jfloat y_p, jfloat z_p, jstring callback, jboolean forceLoadScreen)
{
ServerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get player"));
return;
}
JavaStringParam localScene(scene);
std::string sceneName;
if (!JavaLibrary::convert(localScene, sceneName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get scene name"));
return;
}
std::string callbackName;
if (callback)
{
JavaStringParam localCallback(callback);
if (!JavaLibrary::convert(localCallback, callbackName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get callback"));
return;
}
}
ShipObject * const shipObject = ShipObject::getContainingShipObject(playerObject);
if (!shipObject)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - Hyperspacing is only allowed for ShipObjects %s", playerObject->getDebugInformation().c_str()));
return;
}
// Make sure the ship is not docking
Controller const * const controller = (shipObject != NULL) ? shipObject->getController() : NULL;
ShipController const * const shipController = (controller != NULL) ? controller->asShipController() : NULL;
if ( (shipController != NULL)
&& shipController->isDocking())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - Hyperspacing is not allowed on ships that are currently docking: %s", shipObject->getDebugInformation().c_str()));
return;
}
shipObject->setInvulnerabilityTimer(cs_hyperspaceInvulnerableTime);
NetworkId cellId(cell);
GameServer::getInstance().requestSceneWarpDelayed(
CachedNetworkId(*shipObject),
sceneName,
Vector(x_w, y_w, z_w),
cellId,
Vector(x_p, y_p, z_p),
cs_hyperspaceDelayTime,
callbackName.c_str(),
forceLoadScreen);
}
//------------------------------------------------------------------------------------------------
void JNICALL ScriptMethodsHyperspaceNamespace::hyperspacePlayerToLocationCellName(JNIEnv *env, jobject self, jlong player, jstring scene, jfloat x_w, jfloat y_w, jfloat z_w, jlong building, jstring cell, jfloat x_p, jfloat y_p, jfloat z_p, jstring callback, jboolean forceLoadScreen)
{
ServerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get player"));
return;
}
JavaStringParam localScene(scene);
std::string sceneName;
if (!JavaLibrary::convert(localScene, sceneName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get scene name"));
return;
}
std::string callbackName;
if (callback)
{
JavaStringParam localCallback(callback);
if (!JavaLibrary::convert(localCallback, callbackName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get callback"));
return;
}
}
JavaStringParam localCell(cell);
std::string cellName;
if (!JavaLibrary::convert(localCell, cellName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get call name"));
return;
}
NetworkId buildingId(building);
if (buildingId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - could not get building id"));
return;
}
ShipObject * const shipObject = ShipObject::getContainingShipObject(playerObject);
if (!shipObject)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - Hyperspacing is only allowed for ShipObjects %s", playerObject->getDebugInformation().c_str()));
return;
}
// Make sure the ship is not docking
Controller const * const controller = (shipObject != NULL) ? shipObject->getController() : NULL;
ShipController const * const shipController = (controller != NULL) ? controller->asShipController() : NULL;
if ( (shipController != NULL)
&& shipController->isDocking())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - Hyperspacing is not allowed on ships that are currently docking: %s", shipObject->getDebugInformation().c_str()));
return;
}
shipObject->setInvulnerabilityTimer(cs_hyperspaceInvulnerableTime);
GameServer::getInstance().requestSceneWarpDelayed(
CachedNetworkId(*shipObject),
sceneName,
Vector(x_w, y_w, z_w),
buildingId,
cellName,
Vector(x_p, y_p, z_p),
cs_hyperspaceDelayTime,
callbackName.c_str(),
forceLoadScreen);
}
//------------------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsHyperspaceNamespace::isHyperspacePointOverpopulated(JNIEnv *env, jobject self, jstring jhyperspacePoint)
{
JavaStringParam localHyperspacePoint(jhyperspacePoint);
std::string hyperspacePoint;
if (!JavaLibrary::convert(localHyperspacePoint, hyperspacePoint))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("isHyperspacePointAvailable - could not get hyperspace point name"));
return true;
}
if(HyperspaceManager::isValidHyperspacePoint(hyperspacePoint))
{
HyperspaceManager::HyperspaceLocation location;
bool const result = HyperspaceManager::getHyperspacePoint(hyperspacePoint, location);
if (result)
{
int const population = ServerUniverse::getInstance().getPopulationAtLocation(location.sceneName, static_cast<int>(location.location.x), static_cast<int>(location.location.z));
return (population > ConfigServerGame::getMaxPopulationForNewbieTravel());
}
}
return true; // invalid points are always over-populated
}
//------------------------------------------------------------------------------------------------
void JNICALL ScriptMethodsHyperspaceNamespace::hyperspacePlayerToHyperspacePoint(JNIEnv *env, jobject self, jlong player, jstring jhyperspacePoint, jstring callback, jboolean forceLoadScreen, jboolean ignoreTooFull)
{
ServerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - could not get player"));
return;
}
CreatureObject * const playerCreature = playerObject ? playerObject->asCreatureObject() : NULL;
if(!playerCreature)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - player is not a creature"));
return;
}
JavaStringParam localHyperspacePoint(jhyperspacePoint);
std::string hyperspacePoint;
if (!JavaLibrary::convert(localHyperspacePoint, hyperspacePoint))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - could not get hyperspace point name"));
return;
}
std::string callbackName;
if (callback)
{
JavaStringParam localCallback(callback);
if (!JavaLibrary::convert(localCallback, callbackName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - could not get callback"));
return;
}
}
ShipObject * const shipObject = ShipObject::getContainingShipObject(playerObject);
if (!shipObject)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - Hyperspacing is only allowed for ShipObjects %s", playerObject->getDebugInformation().c_str()));
return;
}
// Make sure the ship is not docking
Controller const * const controller = (shipObject != NULL) ? shipObject->getController() : NULL;
ShipController const * const shipController = (controller != NULL) ? controller->asShipController() : NULL;
if ( (shipController != NULL)
&& shipController->isDocking())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - Hyperspacing is not allowed on ships that are currently docking: %s", shipObject->getDebugInformation().c_str()));
return;
}
if(HyperspaceManager::isValidHyperspacePoint(hyperspacePoint))
{
// we first check if this hyperspace point is the home location - if so, call back into script to finish handling it.
if (hyperspacePoint == HyperspaceManager::getHomeLocationHyperspacePointName())
{
ScriptParams params;
IGNORE_RETURN(playerCreature->getScriptObject()->trigAllScripts(Scripting::TRIG_HYPERSPACE_TO_HOME_LOCATION, params));
return;
}
HyperspaceManager::HyperspaceLocation location;
bool const result = HyperspaceManager::getHyperspacePoint(hyperspacePoint, location);
location.location += Vector::randomUnit() * ConfigServerGame::getHyperspaceRandomOffsetRange();
if(result)
{
if(!location.requiredCommand.empty())
{
if(!playerCreature->hasCommand(location.requiredCommand))
{
Chat::sendSystemMessage(*playerCreature, SharedHyperspaceStringIds::not_cleared_for_point, Unicode::emptyString);
// We need to unlock the pilot's controls here since we didn't end up hyperspacing
sendUnlockPlayerShipInputOnClient(shipObject);
return;
}
}
if ( location.sceneName == ServerWorld::getSceneId()
&& location.location.magnitudeBetweenSquared(playerCreature->findPosition_w()) < sqr(cs_hyperspaceMinDistance))
{
Chat::sendSystemMessage(*playerCreature, SharedHyperspaceStringIds::already_at_point, Unicode::emptyString);
// We need to unlock the pilot's controls here since we didn't end up hyperspacing
sendUnlockPlayerShipInputOnClient(shipObject);
return;
}
if (!ignoreTooFull)
{
int const population = ServerUniverse::getInstance().getPopulationAtLocation(location.sceneName, static_cast<int>(location.location.x), static_cast<int>(location.location.z));
if (population > ConfigServerGame::getMaxPopulationForNewbieTravel())
{
Chat::sendSystemMessage(*playerCreature, SharedHyperspaceStringIds::zone_too_full, Unicode::emptyString);
// We need to unlock the pilot's controls here since we didn't end up hyperspacing
sendUnlockPlayerShipInputOnClient(shipObject);
return;
}
}
shipObject->setInvulnerabilityTimer(cs_hyperspaceInvulnerableTime);
GameServer::getInstance().requestSceneWarpDelayed(
CachedNetworkId(*shipObject),
location.sceneName,
Vector(location.location.x, location.location.y, location.location.z),
NetworkId::cms_invalid,
Vector(location.location.z, location.location.y, location.location.z),
cs_hyperspaceDelayTime,
callbackName.c_str(),
forceLoadScreen);
}
}
}
//------------------------------------------------------------------------------------------------
void JNICALL ScriptMethodsHyperspaceNamespace::hyperspacePrepareShipOnClient(JNIEnv *env, jobject self, jlong player, jstring jhyperspacePoint)
{
ServerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - could not get player"));
return;
}
CreatureObject * const playerCreature = playerObject ? playerObject->asCreatureObject() : NULL;
if(playerCreature == 0)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - player is not a creature"));
return;
}
ShipObject * const shipObject = ShipObject::getContainingShipObject(playerObject);
if (shipObject == 0)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - Hyperspacing is only allowed for ShipObjects %s", playerObject->getDebugInformation().c_str()));
return;
}
JavaStringParam localHyperspacePoint(jhyperspacePoint);
std::string hyperspacePoint;
if (!JavaLibrary::convert(localHyperspacePoint, hyperspacePoint))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - could not get hyperspace point name"));
return;
}
if(HyperspaceManager::isValidHyperspacePoint(hyperspacePoint))
{
HyperspaceManager::HyperspaceLocation location;
if (HyperspaceManager::getHyperspacePoint(hyperspacePoint, location))
{
Controller const * const controller = (shipObject != NULL) ? shipObject->getController() : NULL;
ShipController const * const shipController = (controller != NULL) ? controller->asShipController() : NULL;
if (shipController != 0)
{
// Make sure the ship is not docking
if (shipController->isDocking())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - Hyperspacing is not allowed on ships that are currently docking: %s", shipObject->getDebugInformation().c_str()));
return;
}
CreatureObject * const pilotCreature = shipObject->getPilot();
Controller * const pilotController = (pilotCreature != 0) ? pilotCreature->getController() : 0;
if (pilotController != 0)
{
MessageQueueGenericValueType<std::pair<std::string, Vector> > * data = new MessageQueueGenericValueType<std::pair<std::string, Vector> >(std::make_pair(location.sceneName, location.location));
pilotController->appendMessage(CM_hyperspaceOrientShipToPointAndLockPlayerInput,
0.0f,
data,
GameControllerMessageFlags::SEND |
GameControllerMessageFlags::RELIABLE |
GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
}
}
}
//------------------------------------------------------------------------------------------------
void JNICALL ScriptMethodsHyperspaceNamespace::hyperspaceRestoreShipOnClientFromAbortedHyperspace(JNIEnv *env, jobject self, jlong player)
{
ServerObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - could not get player"));
return;
}
CreatureObject * const playerCreature = playerObject ? playerObject->asCreatureObject() : NULL;
if(playerCreature == 0)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToHyperspacePoint - player is not a creature"));
return;
}
ShipObject * const shipObject = ShipObject::getContainingShipObject(playerObject);
if (shipObject == 0)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("hyperspacePlayerToLocation - Hyperspacing is only allowed for ShipObjects %s", playerObject->getDebugInformation().c_str()));
return;
}
Controller const * const controller = (shipObject != NULL) ? shipObject->getController() : NULL;
ShipController const * const shipController = (controller != NULL) ? controller->asShipController() : NULL;
if (shipController != 0)
{
// If the ship is docking, then unlocking the controls is not the correct thing to do.
if (shipController->isDocking())
return;
CreatureObject * const pilotCreature = shipObject->getPilot();
Controller * const pilotController = (pilotCreature != 0) ? pilotCreature->getController() : 0;
if (pilotController != 0)
{
pilotController->appendMessage(CM_unlockPlayerShipInputOnClient,
0.0f,
GameControllerMessageFlags::SEND |
GameControllerMessageFlags::RELIABLE |
GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
}
//------------------------------------------------------------------------------------------------
jstring JNICALL ScriptMethodsHyperspaceNamespace::getSceneForHyperspacePoint(JNIEnv *env, jobject self, jstring jhyperspacePoint)
{
JavaStringParam localHyperspacePoint(jhyperspacePoint);
std::string hyperspacePoint;
if (!JavaLibrary::convert(localHyperspacePoint, hyperspacePoint))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("getSceneForHyperspacePoint - could not get hyperspace point name"));
return NULL;
}
if(HyperspaceManager::isValidHyperspacePoint(hyperspacePoint))
{
HyperspaceManager::HyperspaceLocation location;
bool const result = HyperspaceManager::getHyperspacePoint(hyperspacePoint, location);
if (result)
{
JavaString str(location.sceneName);
return str.getReturnValue();
}
}
return NULL;
}
//------------------------------------------------------------------------------------------------
@@ -0,0 +1,254 @@
//========================================================================
//
// ScriptMethodsImageDesign.cpp - implements script methods dealing with imagedesigning.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/Chat.h"
#include "serverGame/ServerImageDesignerManager.h"
#include "serverGame/ServerObject.h"
#include "sharedFoundation/Os.h"
#include "sharedGame/SharedImageDesignerManager.h"
#include "sharedGame/SharedStringIds.h"
#include "sharedNetworkMessages/ImageDesignStartMessage.h"
#include "sharedObject/Controller.h"
// ======================================================================
// ScriptMethodsImageDesignNamespace
// ======================================================================
namespace ScriptMethodsImageDesignNamespace
{
bool install();
void JNICALL imagedesignStart(JNIEnv *env, jobject self, jlong jdesignerId, jlong jrecipientId, jlong jterminalId, jstring jCurrentHoloEmote);
jboolean JNICALL imagedesignValidated(JNIEnv *env, jobject self, jlong jdesignerId, jlong jrecipientId, jlong jterminalId, jint jstartingTime, jint jdesignType, jboolean jnewHairSet, jstring jnewHairAsset, jstring jhairCustomizationData, jint jdesignerRequiredCredits, jint jrecipientPaidCredits, jboolean jaccepted, jobjectArray jmorphChangesKeys, jfloatArray jmorphChangesValues, jobjectArray jindexChangesKeys, jintArray jindexChangesValues, jstring jholoEmote);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsImageDesignNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsImageDesignNamespace::c)}
JF("_imagedesignStart", "(JJJLjava/lang/String;)V", imagedesignStart),
JF("_imagedesignValidated", "(JJJIIZLjava/lang/String;Ljava/lang/String;IIZ[Ljava/lang/String;[F[Ljava/lang/String;[ILjava/lang/String;)Z", imagedesignValidated),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI imagedesign callback methods
//========================================================================
void JNICALL ScriptMethodsImageDesignNamespace::imagedesignStart(JNIEnv *env, jobject self, jlong jdesignerId, jlong jrecipientId, jlong jterminalId, jstring jCurrentHoloEmote)
{
UNREF(env);
UNREF(self);
ServerObject * designerObj = 0;
if (!JavaLibrary::getObject(jdesignerId, designerObj))
{
WARNING(true, ("bad designer passed to JavaLibrary::imagedesignStart"));
return;
}
ServerObject * recipientObj = 0;
if (!JavaLibrary::getObject(jrecipientId, recipientObj))
{
WARNING(true, ("bad recipient passed to JavaLibrary::imagedesignStart"));
return;
}
//the terminal can be NULL (that means no ID terminal is being used, which is fine)
ServerObject * terminalObj = 0;
JavaLibrary::getObject(jterminalId, terminalObj);
if(!designerObj || !recipientObj)
{
WARNING(true, ("could not resolve targets for JavaLibrary::imagedesignStart"));
return;
}
SharedImageDesignerManager::Session newSession;
newSession.designerId = designerObj->getNetworkId();
newSession.recipientId = recipientObj->getNetworkId();
newSession.startingTime = Os::getRealSystemTime();
NetworkId const terminalId = terminalObj ? terminalObj->getNetworkId() : NetworkId::cms_invalid;
newSession.terminalId = terminalId;
SharedImageDesignerManager::startSession(newSession);
std::string currentHoloEmote;
if(jCurrentHoloEmote)
{
JavaStringParam localCurrentHoloEmote(jCurrentHoloEmote);
IGNORE_RETURN(JavaLibrary::convert(localCurrentHoloEmote, currentHoloEmote));
}
Controller * const designerController = designerObj->getController();
if(designerController)
{
ImageDesignStartMessage * const msg = new ImageDesignStartMessage(designerObj->getNetworkId(), recipientObj->getNetworkId(), terminalId, currentHoloEmote);
designerController->appendMessage(CM_imageDesignerStart, 0, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
Controller * const recipientController = recipientObj->getController();
if(recipientController && recipientController != designerController)
{
ImageDesignStartMessage * const msg = new ImageDesignStartMessage(designerObj->getNetworkId(), recipientObj->getNetworkId(), terminalId, currentHoloEmote);
recipientController->appendMessage(CM_imageDesignerStart, 0, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
//------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsImageDesignNamespace::imagedesignValidated(JNIEnv *env, jobject self, jlong jdesignerId, jlong jrecipientId, jlong jterminalId, jint jstartingTime, jint jdesignType, jboolean jnewHairSet, jstring jnewHairAsset, jstring jhairCustomizationData, jint jdesignerRequiredCredits, jint jrecipientPaidCredits, jboolean jaccepted, jobjectArray jmorphChangesKeys, jfloatArray jmorphChangesValues, jobjectArray jindexChangesKeys, jintArray jindexChangesValues, jstring jholoEmote)
{
UNREF(self);
SharedImageDesignerManager::Session session;
ServerObject * designerObj = 0;
if (!JavaLibrary::getObject(jdesignerId, designerObj) || !designerObj)
{
WARNING(true, ("bad designer passed to JavaLibrary::imagedesignValidated"));
return JNI_FALSE;
}
ServerObject * recipientObj = 0;
if (!JavaLibrary::getObject(jrecipientId, recipientObj) || !recipientObj)
{
WARNING(true, ("bad recipient passed to JavaLibrary::imagedesignValidated"));
return JNI_FALSE;
}
ServerObject * terminalObj = 0;
JavaLibrary::getObject(jterminalId, terminalObj);
session.designerId = designerObj->getNetworkId();
session.recipientId = recipientObj->getNetworkId();
session.terminalId = terminalObj ? terminalObj->getNetworkId() : NetworkId::cms_invalid;
session.startingTime = jstartingTime;
session.designType = static_cast<ImageDesignChangeMessage::DesignType>(jdesignType);
session.newHairSet = jnewHairSet;
std::string newHairAsset;
if(jnewHairAsset)
{
JavaStringParam localNewHairAsset(jnewHairAsset);
IGNORE_RETURN(JavaLibrary::convert(localNewHairAsset, newHairAsset));
}
session.newHairAsset = newHairAsset;
std::string hairCustomizationData;
if(jhairCustomizationData)
{
JavaStringParam localHairCustomizationData(jhairCustomizationData);
IGNORE_RETURN(JavaLibrary::convert(localHairCustomizationData, hairCustomizationData));
}
session.hairCustomizationData = hairCustomizationData;
session.designerRequiredCredits = jdesignerRequiredCredits;
session.recipientPaidCredits = jrecipientPaidCredits;
session.accepted = jaccepted;
//if the session isn't valid, cancel it and don't apply changes
if(!session.accepted)
{
Chat::sendSystemMessage(*designerObj, SharedStringIds::imagedesigner_session_not_valid, Unicode::emptyString);
if(designerObj != recipientObj)
Chat::sendSystemMessage(*recipientObj, SharedStringIds::imagedesigner_session_not_valid, Unicode::emptyString);
ServerImageDesignerManager::cancelSession(session.designerId, session.recipientId);
return JNI_TRUE;
}
//ensure we validate against the server's skill mod data
SharedImageDesignerManager::SkillMods const & skillMods = ServerImageDesignerManager::getSkillModsForDesigner(session.designerId);
session.bodySkillMod = skillMods.bodySkillMod;
session.faceSkillMod = skillMods.faceSkillMod;
session.markingsSkillMod = skillMods.markingsSkillMod;
session.hairSkillMod = skillMods.hairSkillMod;
std::string tempString;
//get morph values
std::map<std::string, float> morphChanges;
int countKeys = env->GetArrayLength(jmorphChangesKeys);
int countValues = env->GetArrayLength(jmorphChangesValues);
if(countKeys != countValues)
{
WARNING(true, ("morph keys and values arrays are of diffent sizes"));
return JNI_FALSE;
}
jfloat * const morphChangesValuesArray = env->GetFloatArrayElements(jmorphChangesValues, NULL);
if (morphChangesValuesArray == NULL)
{
return JNI_FALSE;
}
std::vector<float> morphValues(morphChangesValuesArray, &morphChangesValuesArray[countValues]);
env->ReleaseFloatArrayElements(jmorphChangesValues, morphChangesValuesArray, JNI_ABORT);
for (int i = 0; i < countKeys; ++i)
{
JavaString jTempString(static_cast<jstring>(env->GetObjectArrayElement(jmorphChangesKeys, i)));
if (JavaLibrary::convert(jTempString, tempString))
{
morphChanges[tempString] = morphValues[static_cast<unsigned int>(i)];
}
}
session.morphChanges = morphChanges;
//get index values
std::map<std::string, int> indexChanges;
countKeys = env->GetArrayLength(jindexChangesKeys);
countValues = env->GetArrayLength(jindexChangesValues);
if(countKeys != countValues)
{
WARNING(true, ("index keys and values arrays are of diffent sizes"));
return JNI_FALSE;
}
jint * const indexChangesValuesArray = env->GetIntArrayElements(jindexChangesValues, NULL);
if (indexChangesValuesArray == NULL)
{
return JNI_FALSE;
}
std::vector<int> indexValues(indexChangesValuesArray, &indexChangesValuesArray[countValues]);
env->ReleaseIntArrayElements(jindexChangesValues, indexChangesValuesArray, JNI_ABORT);
for (int j = 0; j < countKeys; ++j)
{
JavaString jTempString(static_cast<jstring>(env->GetObjectArrayElement(jindexChangesKeys, j)));
if (JavaLibrary::convert(jTempString, tempString))
{
indexChanges[tempString] = indexValues[static_cast<unsigned int>(j)];
}
}
session.indexChanges = indexChanges;
//get holoemote values
std::string holoEmote;
if(jholoEmote)
{
JavaStringParam localHoloEmote(jholoEmote);
IGNORE_RETURN(JavaLibrary::convert(localHoloEmote, holoEmote));
}
session.holoEmote = holoEmote;
bool const result = ServerImageDesignerManager::makeChanges(session);
if(!result)
{
Chat::sendSystemMessage(*designerObj, SharedStringIds::imagedesigner_session_not_valid, Unicode::emptyString);
if(designerObj != recipientObj)
Chat::sendSystemMessage(*recipientObj, SharedStringIds::imagedesigner_session_not_valid, Unicode::emptyString);
ServerImageDesignerManager::cancelSession(session.designerId, session.recipientId);
}
if(result)
return JNI_TRUE;
else
return JNI_FALSE;
}
//------------------------------------------------------------------------
@@ -0,0 +1,401 @@
//========================================================================
//
// ScriptMethodsInstallation.cpp - implements script methods dealing with general
// object info.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/HarvesterInstallationObject.h"
#include "swgSharedNetworkMessages/PermissionListCreateMessage.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsInstallationNamespace
// ======================================================================
namespace ScriptMethodsInstallationNamespace
{
bool install();
jint JNICALL getInstalledExtractionRate(JNIEnv *env, jobject self, jlong installation);
jboolean JNICALL isHarvesterActive(JNIEnv *env, jobject self, jlong installation);
jboolean JNICALL isHarvesterEmpty(JNIEnv *env, jobject self, jlong installation);
jint JNICALL getMaxExtractionRate(JNIEnv *env, jobject self, jlong installation);
jboolean JNICALL setMaxExtractionRate(JNIEnv *env, jobject self, jlong installation, jint value);
jint JNICALL getCurrentExtractionRate(JNIEnv *env, jobject self, jlong installation);
jboolean JNICALL setCurrentExtractionRate(JNIEnv *env, jobject self, jlong installation, jint value);
jint JNICALL getMaxHopperAmount(JNIEnv *env, jobject self, jlong installation);
jboolean JNICALL setMaxHopperAmount(JNIEnv *env, jobject self, jlong installation, jint value);
jboolean JNICALL activate(JNIEnv *env, jobject self, jlong installation);
jboolean JNICALL deactivate(JNIEnv *env, jobject self, jlong installation);
void JNICALL displayStructurePermissionData(JNIEnv *env, jobject self, jlong player, jobjectArray currentMembers, jobjectArray nearbyPeople, jstring listName);
jfloat JNICALL getPowerValue(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL setPowerValue(JNIEnv *env, jobject self, jlong target, float value);
jboolean JNICALL incrementPowerValue(JNIEnv *env, jobject self, jlong target, float value);
jfloat JNICALL getPowerRate(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL setPowerRate(JNIEnv *env, jobject self, jlong target, float value);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsInstallationNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsInstallationNamespace::c)}
JF("_getCurrentExtractionRate", "(J)I", getCurrentExtractionRate),
JF("_setCurrentExtractionRate", "(JI)Z", setCurrentExtractionRate),
JF("_getInstalledExtractionRate","(J)I",getInstalledExtractionRate),
JF("_isHarvesterActive","(J)Z",isHarvesterActive),
JF("_isHarvesterEmpty","(J)Z",isHarvesterEmpty),
JF("_getMaxExtractionRate","(J)I",getMaxExtractionRate),
JF("_setMaxExtractionRate","(JI)Z",setMaxExtractionRate),
JF("_getMaxHopperAmount","(J)I",getMaxHopperAmount),
JF("_setMaxHopperAmount","(JI)Z",setMaxHopperAmount),
JF("_activate","(J)Z",activate),
JF("_deactivate","(J)Z",deactivate),
JF("_displayStructurePermissionData","(J[Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V",displayStructurePermissionData),
JF("_getPowerValue", "(J)F", getPowerValue),
JF("_setPowerValue", "(JF)Z", setPowerValue),
JF("_incrementPowerValue", "(JF)Z", incrementPowerValue),
JF("_getPowerRate", "(J)F", getPowerRate),
JF("_setPowerRate", "(JF)Z", setPowerRate),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//----------------------------------------------------------------------
jint JNICALL ScriptMethodsInstallationNamespace::getInstalledExtractionRate(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
HarvesterInstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return -1;
return static_cast<int>(obj->getInstalledExtractionRate()); //TODO: do we really want to round this for scripts?
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInstallationNamespace::isHarvesterActive(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
InstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return JNI_FALSE;
return obj->isActive();
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInstallationNamespace::isHarvesterEmpty(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
Object * obj = 0;
if (!JavaLibrary::getObject(installation, obj))
{
DEBUG_WARNING (true, ("JavaLibrary::isHarvesterEmpty: could not get object for given obj_id"));
return JNI_FALSE;
}
if(!obj)
{
DEBUG_WARNING (true, ("JavaLibrary::isHarvesterEmpty: could not get an Object from the given obj_id"));
return JNI_FALSE;
}
HarvesterInstallationObject* harv = dynamic_cast<HarvesterInstallationObject*>(obj);
if(!harv)
{
DEBUG_WARNING (true, ("JavaLibrary::isHarvesterEmpty: obj_id %s does not point to a harvester", obj->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return harv->isEmpty();
}
//----------------------------------------------------------------------
jint JNICALL ScriptMethodsInstallationNamespace::getMaxExtractionRate(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
HarvesterInstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return -1;
return obj->getMaxExtractionRate();
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInstallationNamespace::setMaxExtractionRate(JNIEnv *env, jobject self, jlong installation, jint value)
{
UNREF(self);
HarvesterInstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return JNI_FALSE;
obj->setMaxExtractionRate(value);
return JNI_TRUE;
}
//----------------------------------------------------------------------
jint JNICALL ScriptMethodsInstallationNamespace::getCurrentExtractionRate(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
HarvesterInstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return -1;
return static_cast<int>(obj->getCurrentExtractionRate()); //TODO: do we really want to round this for scripts?
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInstallationNamespace::setCurrentExtractionRate(JNIEnv *env, jobject self, jlong installation, jint value)
{
UNREF(self);
HarvesterInstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return JNI_FALSE;
obj->setCurrentExtractionRate(static_cast<float>(value));
return JNI_TRUE;
}
//----------------------------------------------------------------------
jint JNICALL ScriptMethodsInstallationNamespace::getMaxHopperAmount(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
HarvesterInstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return -1;
return obj->getMaxHopperAmount();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInstallationNamespace::setMaxHopperAmount(JNIEnv *env, jobject self, jlong installation, jint value)
{
UNREF(self);
HarvesterInstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return JNI_FALSE;
obj->setMaxHopperAmount(value);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInstallationNamespace::activate(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
InstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return JNI_FALSE;
obj->activate(NetworkId::cms_invalid);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInstallationNamespace::deactivate(JNIEnv *env, jobject self, jlong installation)
{
UNREF(self);
InstallationObject *obj=0;
if (!JavaLibrary::getObject(installation, obj))
return JNI_FALSE;
obj->deactivate();
return JNI_TRUE;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsInstallationNamespace::displayStructurePermissionData(JNIEnv *env, jobject self, jlong player, jobjectArray currentMembers, jobjectArray nearbyPeople, jstring listName)
{
UNREF(env);
UNREF(self);
//get the player id from player
CreatureObject* creatureObject = NULL;
if (!JavaLibrary::getObject(player, creatureObject))
return;
//convert the jstring[] to a Unicode::String vector
Unicode::String tempMember;
std::vector<Unicode::String> memberVector;
jsize count = env->GetArrayLength(currentMembers);
for (jsize i = 0; i < count; ++i)
{
JavaStringPtr m = getStringArrayElement(LocalObjectArrayRefParam(currentMembers), i);
if (m != JavaString::cms_nullPtr)
{
if (JavaLibrary::convert(*m, tempMember))
{
memberVector.push_back(tempMember);
}
}
}
//convert the jstring[] to a Unicode::String vector
Unicode::String tempPerson;
std::vector<Unicode::String> nearbyVector;
count = env->GetArrayLength(nearbyPeople);
for (jsize j = 0; j < count; ++j)
{
JavaStringPtr person = getStringArrayElement(LocalObjectArrayRefParam(nearbyPeople), j);
if (person != JavaString::cms_nullPtr)
{
if (JavaLibrary::convert(*person, tempPerson))
{
nearbyVector.push_back(tempPerson);
}
}
}
//convert the listName to unicode
Unicode::String localListName;
JavaString l(listName);
JavaLibrary::convert(l, localListName);
const Client * client = creatureObject->getClient();
if (client)
{
PermissionListCreateMessage msg(memberVector, nearbyVector, localListName);
client->send(msg,true);
}
}
// ----------------------------------------------------------------------
/**
* Returns an installation's power value.
*
* @param env Java environment
* @param self class calling this function
* @param target id of the installation
*
* @return the power value
*/
jfloat JNICALL ScriptMethodsInstallationNamespace::getPowerValue(JNIEnv *env, jobject self, jlong target)
{
UNREF(env);
UNREF(self);
//get the player id from player
const InstallationObject * installation = NULL;
if (!JavaLibrary::getObject(target, installation))
return 0;
return installation->getPower();
} // JavaLibrary::getPowerValue
// ----------------------------------------------------------------------
/**
* Sets an installation's power value.
*
* @param env Java environment
* @param self class calling this function
* @param target id of the installation
*
* @return true on success, false if there was an error
*/
jboolean JNICALL ScriptMethodsInstallationNamespace::setPowerValue(JNIEnv *env, jobject self, jlong target, float value)
{
UNREF(env);
UNREF(self);
//get the player id from player
InstallationObject * installation = NULL;
if (!JavaLibrary::getObject(target, installation))
return JNI_FALSE;
installation->setPower(value);
return JNI_TRUE;
} // JavaLibrary::setPowerValue
// ----------------------------------------------------------------------
/**
* Changes an installation's power value.
*
* @param env Java environment
* @param self class calling this function
* @param target id of the installation
* @param value the amount to change the power by
*
* @return true on success, false if there was an error
*/
jboolean JNICALL ScriptMethodsInstallationNamespace::incrementPowerValue(JNIEnv *env, jobject self, jlong target, float value)
{
UNREF(env);
UNREF(self);
//get the player id from player
InstallationObject * installation = NULL;
if (!JavaLibrary::getObject(target, installation))
return JNI_FALSE;
installation->changePower(value);
return JNI_TRUE;
} // JavaLibrary::incrementPowerValue
// ----------------------------------------------------------------------
/**
* Returns an installation's power consumption rate, in units/hour.
*
* @param env Java environment
* @param self class calling this function
* @param target id of the installation
*
* @return the power rate
*/
jfloat JNICALL ScriptMethodsInstallationNamespace::getPowerRate(JNIEnv *env, jobject self, jlong target)
{
UNREF(env);
UNREF(self);
//get the player id from player
const InstallationObject * installation = NULL;
if (!JavaLibrary::getObject(target, installation))
return 0;
return installation->getPowerRate();
} // JavaLibrary::getPowerRate
// ----------------------------------------------------------------------
/**
* Sets an installation's power consumption rate, in units/hour.
*
* @param env Java environment
* @param self class calling this function
* @param target id of the installation
*
* @return true on success, false if there was an error
*/
jboolean JNICALL ScriptMethodsInstallationNamespace::setPowerRate(JNIEnv *env, jobject self, jlong target, float value)
{
UNREF(env);
UNREF(self);
//get the player id from player
InstallationObject * installation = NULL;
if (!JavaLibrary::getObject(target, installation))
return JNI_FALSE;
installation->setPowerRate(value);
return JNI_TRUE;
} // JavaLibrary::setPowerRate
// ======================================================================
@@ -0,0 +1,168 @@
//========================================================================
//
// ScriptMethodsInterest.cpp - implements script methods dealing with bank
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "sharedFoundation/DynamicVariable.h"
#include "sharedFoundation/DynamicVariableList.h"
#include "sharedNetworkMessages/MapLocation.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/PlanetObject.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerUniverse.h"
#include "sharedObject/NetworkIdManager.h"
// ======================================================================
// ScriptMethodsInterestNamespace
// ======================================================================
namespace ScriptMethodsInterestNamespace
{
bool install();
void JNICALL setAttributeAttained(JNIEnv *env, jobject script, jlong serverObject, jint attribute);
void JNICALL clearAttributeAttained(JNIEnv *env, jobject script, jlong serverObject, jint attribute);
bool JNICALL hasAttributeAttained(JNIEnv *env, jobject script, jlong serverObject, jint attribute);
void JNICALL setAttributeInterested(JNIEnv *env, jobject script, jlong serverObject, jint attribute);
void JNICALL clearAttributeInterested(JNIEnv *env, jobject script, jlong serverObject, jint attribute);
bool JNICALL hasAttributeInterested(JNIEnv *env, jobject script, jlong serverObject, jint attribute);
bool JNICALL isInterested(JNIEnv *env, jobject script, jlong serverObject, jlong serverObject2);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsInterestNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsInterestNamespace::c)}
JF("_setAttributeAttained", "(JI)V",setAttributeAttained),
JF("_clearAttributeAttained", "(JI)V",clearAttributeAttained),
JF("_hasAttributeAttained", "(JI)Z",hasAttributeAttained),
JF("_setAttributeInterested", "(JI)V",setAttributeInterested),
JF("_clearAttributeInterested", "(JI)V",clearAttributeInterested),
JF("_hasAttributeInterested", "(JI)Z",hasAttributeInterested),
JF("_isInterested", "(JJ)Z",isInterested),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------
void JNICALL ScriptMethodsInterestNamespace::setAttributeAttained(JNIEnv *env, jobject script, jlong serverObject, jint attribute)
{
ServerObject *obj1 = 0;
if(!JavaLibrary::getObject(serverObject, obj1))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::setAttributeAttained object 1 is invalid"));
return;
}
obj1->setAttributeAttained(attribute);
}
//-----------------------------------------------------------------
void JNICALL ScriptMethodsInterestNamespace::clearAttributeAttained(JNIEnv *env, jobject script, jlong serverObject, jint attribute)
{
ServerObject *obj1 = 0;
if(!JavaLibrary::getObject(serverObject, obj1))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::clearAttributeAttained object 1 is invalid"));
return;
}
obj1->clearAttributeAttained(attribute);
}
//-----------------------------------------------------------------
bool JNICALL ScriptMethodsInterestNamespace::hasAttributeAttained(JNIEnv *env, jobject script, jlong serverObject, jint attribute)
{
ServerObject *obj1 = 0;
if(!JavaLibrary::getObject(serverObject, obj1))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::hasAttributeAttained object 1 is invalid"));
return false;
}
return obj1->hasAttributeAttained(attribute);
}
//-----------------------------------------------------------------
void JNICALL ScriptMethodsInterestNamespace::setAttributeInterested(JNIEnv *env, jobject script, jlong serverObject, jint attribute)
{
ServerObject *obj1 = 0;
if(!JavaLibrary::getObject(serverObject, obj1))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::setAttributeInterested object 1 is invalid"));
return;
}
obj1->setAttributeInterested(attribute);
}
//-----------------------------------------------------------------
void JNICALL ScriptMethodsInterestNamespace::clearAttributeInterested(JNIEnv *env, jobject script, jlong serverObject, jint attribute)
{
ServerObject *obj1 = 0;
if(!JavaLibrary::getObject(serverObject, obj1))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::clearAttributeInterested object 1 is invalid"));
return;
}
obj1->clearAttributeInterested(attribute);
}
//-----------------------------------------------------------------
bool JNICALL ScriptMethodsInterestNamespace::hasAttributeInterested(JNIEnv *env, jobject script, jlong serverObject, jint attribute)
{
ServerObject *obj1 = 0;
if(!JavaLibrary::getObject(serverObject, obj1))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::hasAttributeInterested object 1 is invalid"));
return false;
}
return obj1->hasAttributeInterest(attribute);
}
//-----------------------------------------------------------------
bool JNICALL ScriptMethodsInterestNamespace::isInterested(JNIEnv *env, jobject script, jlong serverObject, jlong serverObject2)
{
ServerObject *obj1 = 0;
if(!JavaLibrary::getObject(serverObject, obj1))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::isInterested object 1 is invalid"));
return false;
}
ServerObject *obj2 = 0;
if(!JavaLibrary::getObject(serverObject2, obj2))
{
DEBUG_WARNING(true, ("[designer bug] JavaLibrary::isInterested object 2 is invalid"));
return false;
}
return obj1->isInterested(*obj2);
}
//==================================================================
@@ -0,0 +1,861 @@
//========================================================================
//
// ScriptMethodsInteriors.cpp - implements script methods dealing with cells and interiors
//
// copyright 2002 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/BuildingObject.h"
#include "serverGame/CellObject.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerWorld.h"
#include "sharedCollision/Floor.h"
#include "sharedCollision/FloorLocator.h"
#include "sharedMath/Ray3d.h"
#include "sharedObject/CellProperty.h"
#include "sharedObject/NetworkIdManager.h"
#include "sharedObject/PortalProperty.h"
#include "sharedObject/PortalPropertyTemplate.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsInteriorsNamespace
// ======================================================================
namespace ScriptMethodsInteriorsNamespace
{
bool install();
jlong JNICALL createObjectInCell(JNIEnv *env, jobject self, jlong source, jlong building, jstring cellName, jobject pos);
jlong JNICALL createObjectInCellString(JNIEnv *env, jobject self, jobject source, jlong building, jstring cellName, jobject pos);
jlong JNICALL _createObjectInCellInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName, jobject pos);
jlong JNICALL createObjectInCellAnywhere(JNIEnv *env, jobject self, jlong original, jlong building, jstring cellName);
jlong JNICALL createObjectInCellAnywhereString(JNIEnv *env, jobject self, jobject original, jlong building, jstring cellName);
jlong JNICALL _createObjectInCellAnywhereInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName);
jobjectArray JNICALL getCellNames(JNIEnv *env, jobject self, jlong target);
jstring JNICALL getCellName(JNIEnv *env, jobject self, jlong target);
jlongArray JNICALL getCellIds(JNIEnv *env, jobject self, jlong target);
jlong JNICALL getCellId(JNIEnv *env, jobject self, jlong building, jstring cellName);
jobject JNICALL getLocationForWorldCoordinate(JNIEnv *env, jobject self, jfloat x, jfloat y, jfloat z);
jboolean JNICALL hasCell(JNIEnv *env, jobject self, jlong building, jstring cellName);
jobject JNICALL getGoodLocationInterior(JNIEnv *env, jobject self, jlong building, jstring cellName);
jobject JNICALL getBuildingEjectLocation(JNIEnv *env, jobject self, jlong building);
jboolean JNICALL isValidInteriorLocation (JNIEnv * env, jobject self, jobject location);
jlong JNICALL moveHouseItemToPlayer(JNIEnv *env, jobject self, jlong building, jlong player, int index);
jlong JNICALL moveHouseItemToPlayer2(JNIEnv *env, jobject self, jlong building, jlong player, jlong item);
void JNICALL deleteAllHouseItems(JNIEnv *env, jobject self, jlong building, jlong player);
jboolean JNICALL areAllContentsLoaded(JNIEnv *env, jobject self, jlong building);
void JNICALL loadBuildingContents(JNIEnv *env, jobject self, jlong player, jlong building);
jint JNICALL getPobBaseItemLimit(JNIEnv *env, jobject self, jlong building);
jboolean JNICALL isAtPendingLoadRequestLimit(JNIEnv * env, jobject self);
jstring JNICALL getCellLabel(JNIEnv * env, jobject self, jlong target);
jboolean JNICALL setCellLabel(JNIEnv * env, jobject self, jlong target, jstring cellLabel);
jboolean JNICALL setCellLabelOffset(JNIEnv * env, jobject self, jlong target, jfloat x, jfloat y, jfloat z);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsInteriorsNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsInteriorsNamespace::c)}
JF("_createObjectInCell", "(Ljava/lang/String;JLjava/lang/String;Lscript/location;)J", createObjectInCellString),
JF("_createObjectInCell", "(JJLjava/lang/String;Lscript/location;)J", createObjectInCell),
JF("_createObjectInCell", "(Ljava/lang/String;JLjava/lang/String;)J", createObjectInCellAnywhereString),
JF("_createObjectInCell", "(JJLjava/lang/String;)J", createObjectInCellAnywhere),
JF("_getCellNames", "(J)[Ljava/lang/String;", getCellNames),
JF("_getCellName", "(J)Ljava/lang/String;", getCellName),
JF("_getCellIds", "(J)[J", getCellIds),
JF("_getCellId", "(JLjava/lang/String;)J", getCellId),
JF("getLocationForWorldCoordinate", "(FFF)Lscript/location;", getLocationForWorldCoordinate),
JF("_hasCell", "(JLjava/lang/String;)Z", hasCell),
JF("_getGoodLocation", "(JLjava/lang/String;)Lscript/location;", getGoodLocationInterior),
JF("_getBuildingEjectLocation", "(J)Lscript/location;", getBuildingEjectLocation),
JF("isValidInteriorLocation", "(Lscript/location;)Z", isValidInteriorLocation),
JF("_moveHouseItemToPlayer", "(JJI)J", moveHouseItemToPlayer),
JF("_moveHouseItemToPlayer", "(JJJ)J", moveHouseItemToPlayer2),
JF("_deleteAllHouseItems", "(JJ)V", deleteAllHouseItems),
JF("_areAllContentsLoaded", "(J)Z", areAllContentsLoaded),
JF("_loadBuildingContents", "(JJ)V", loadBuildingContents),
JF("_getPobBaseItemLimit", "(J)I", getPobBaseItemLimit),
JF("isAtPendingLoadRequestLimit", "()Z", isAtPendingLoadRequestLimit),
JF("_getCellLabel", "(J)Ljava/lang/String;", getCellLabel),
JF("_setCellLabel", "(JLjava/lang/String;)Z", setCellLabel),
JF("_setCellLabelOffset", "(JFFF)Z", setCellLabelOffset),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI Container methods
//========================================================================
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCellString(JNIEnv *env, jobject self, jobject source, jlong building, jstring cellName, jobject pos)
{
UNREF(self);
NOT_NULL(env);
if (source == 0)
return 0;
if (building == 0)
return 0;
std::string templateName;
if (env->IsInstanceOf(source, JavaLibrary::getClsString()) == JNI_TRUE)
{
JavaStringParam localSource(static_cast<jstring>(source));
JavaLibrary::convert(localSource, templateName);
return _createObjectInCellInternal(env, self, templateName, building, cellName, pos);
}
else
return 0;
}
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCell(JNIEnv *env, jobject self, jlong source, jlong building, jstring cellName, jobject pos)
{
UNREF(self);
NOT_NULL(env);
if (source == 0)
return 0;
if (building == 0)
return 0;
std::string templateName;
ServerObject* sourceObject = NULL;
if (!JavaLibrary::getObject(source, sourceObject))
return 0;
templateName = sourceObject->getTemplateName();
return _createObjectInCellInternal(env, self, templateName, building, cellName, pos);
}
jlong JNICALL ScriptMethodsInteriorsNamespace::_createObjectInCellInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName, jobject pos)
{
JavaStringParam localCellName(cellName);
ServerObject * portallizedObject = NULL;
if (!JavaLibrary::getObject(building, portallizedObject))
return 0;
std::string cellNameString;
JavaLibrary::convert(localCellName, cellNameString);
PortalProperty* portalProp = portallizedObject->getPortalProperty();
if (!portalProp)
return 0;
ServerObject* cellObject = (portalProp->getCell(cellNameString.c_str()))->getOwner().asServerObject();
if (!cellObject)
return 0;
CellProperty * cellProperty = ContainerInterface::getCell(*cellObject);
if (!cellProperty)
return 0;
// This code is a little iffy - The position object we get contains a
// vector and a cell ID, but when we create the object we use the vector
// and a different cell ID. It's possible that we would need to transform
// newPos from the
Vector newPos;
NetworkId newCell;
ScriptConversion::convert(pos, newPos, newCell);
UNREF(newCell);
Transform tr;
tr.setPosition_p(newPos);
ServerObject *newObject = ServerWorld::createNewObject(templateName, tr, cellObject, false);
if (newObject == NULL)
return 0;
//@todo do we need to snap to floor or something?
FloorLocator dropLoc;
Floor const * floor = cellProperty->getFloor();
if (!floor)
return 0;
bool foundLoc = floor->findClosestLocation(newPos,dropLoc);
if(foundLoc)
{
newObject->setPosition_p(dropLoc.getPosition_p());
}
else
{
DEBUG_REPORT_LOG(true, ("Danger, could not find floor under location in createNewObjectInCell\n"));
}
// create an networkId to return
NetworkId netId = (newObject->getNetworkId());
if (netId == NetworkId::cms_invalid)
{
delete newObject;
return 0;
}
return netId.getValue();
}
//--------------------------------------------------------------------------------------
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCellAnywhere(JNIEnv *env, jobject self, jlong source, jlong building, jstring cellName)
{
//@todo need to find a way to get a good location in a cell. For now just use the coordinates of the cell?
UNREF(self);
NOT_NULL(env);
if (source == 0)
return 0;
if (building == 0)
return 0;
std::string templateName;
ServerObject* sourceObject = NULL;
if (!JavaLibrary::getObject(source, sourceObject))
return 0;
templateName = sourceObject->getTemplateName();
return _createObjectInCellAnywhereInternal(env, self, templateName, building, cellName);
}
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCellAnywhereString(JNIEnv *env, jobject self, jobject source, jlong building, jstring cellName)
{
//@todo need to find a way to get a good location in a cell. For now just use the coordinates of the cell?
UNREF(self);
NOT_NULL(env);
if (source == 0)
return 0;
if (building == 0)
return 0;
std::string templateName;
if (env->IsInstanceOf(source, JavaLibrary::getClsString()) == JNI_TRUE)
{
JavaStringParam localSource(static_cast<jstring>(source));
JavaLibrary::convert(localSource, templateName);
return _createObjectInCellAnywhereInternal(env, self, templateName, building, cellName);
}
else
return 0;
}
jlong JNICALL ScriptMethodsInteriorsNamespace::_createObjectInCellAnywhereInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName)
{
//@todo need to find a way to get a good location in a cell. For now just use the coordinates of the cell?
JavaStringParam localCellName(cellName);
ServerObject *portallizedObject = NULL;
if (!JavaLibrary::getObject(building, portallizedObject))
return 0;
std::string cellNameString;
JavaLibrary::convert(localCellName, cellNameString);
PortalProperty* portalProp = portallizedObject->getPortalProperty();
if (!portalProp)
return 0;
CellProperty* cellProp = portalProp->getCell(cellNameString.c_str());
if (!cellProp)
return 0;
ServerObject* cellObject = cellProp->getOwner().asServerObject();
if (!cellObject)
return 0;
Vector createPosition;
Floor const * floor = cellProp->getFloor();
bool foundLoc = floor->getGoodLocation(0.5f,createPosition);
if(!foundLoc)
return 0;
Transform tr;
tr.setPosition_p(createPosition);
ServerObject *newObject = ServerWorld::createNewObject(templateName, tr, cellObject, false);
if (newObject == NULL)
return 0;
// create an networkId to return
NetworkId netId = (newObject->getNetworkId());
if (netId == NetworkId::cms_invalid)
{
delete newObject;
return 0;
}
return netId.getValue();
}
//--------------------------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsInteriorsNamespace::getCellNames(JNIEnv *env, jobject self, jlong target)
{
ServerObject const *portallizedObject = NULL;
if (!JavaLibrary::getObject(target, portallizedObject))
return 0;
PortalProperty const *cellProp = portallizedObject->getPortalProperty();
if (!cellProp)
return 0;
PortalProperty::CellNameList const &nameList = cellProp->getCellNames();
if (nameList.empty())
return 0;
LocalObjectArrayRefPtr nameArray;
if (!ScriptConversion::convert(nameList, nameArray))
return 0;
return nameArray->getReturnValue();
}
//--------------------------------------------------------------------------------------
jstring JNICALL ScriptMethodsInteriorsNamespace::getCellName(JNIEnv *env, jobject self, jlong target)
{
CellObject const *cellObject = NULL;
if (!JavaLibrary::getObject(target, cellObject))
return 0;
// remember: cell object indexes start with 1, but the cell names are 0-based
int cellIndex = cellObject->getCell();
if (cellIndex <= 0)
{
// cell is uninitialized
return 0;
}
ServerObject const * const portallizedObject = safe_cast<ServerObject const *>(ContainerInterface::getContainedByObject(*cellObject));
if (portallizedObject == NULL)
return 0;
PortalProperty const * const cellProp = portallizedObject->getPortalProperty();
if (!cellProp)
return 0;
PortalProperty::CellNameList const &nameList = cellProp->getCellNames();
if (nameList.empty())
return 0;
if (static_cast<size_t>(cellIndex) > nameList.size())
{
WARNING(true, ("JavaLibrary::getCellName cell %s has a cell index of %d"
"(base-1), when its owner building %s has only %u cells(base-0)",
cellObject->getNetworkId().getValueString().c_str(), cellIndex,
portallizedObject->getNetworkId().getValueString().c_str(), nameList.size()));
return 0;
}
JavaString cellName(nameList[cellIndex-1]);
return cellName.getReturnValue();
}
//--------------------------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsInteriorsNamespace::getCellIds(JNIEnv *env, jobject self, jlong target)
{
ServerObject const *portallizedObject = NULL;
if (!JavaLibrary::getObject(target, portallizedObject))
return 0;
PortalProperty const * const portalProp = portallizedObject->getPortalProperty();
if (!portalProp)
return 0;
PortalProperty::CellNameList const &nameList = portalProp->getCellNames();
if (nameList.empty())
return 0;
int count = nameList.size();
std::vector<NetworkId> cellIds;
cellIds.reserve(count);
for (int i = 0; i < count; ++i)
{
ServerObject const * cellObject = NULL;
CellProperty const * const cellProp = portalProp->getCell(nameList[i]);
if (cellProp != NULL)
cellObject = cellProp->getOwner().asServerObject();
if (cellObject != NULL)
{
cellIds.push_back(cellObject->getNetworkId());
}
else
cellIds.push_back(NetworkId::cms_invalid);
}
LocalLongArrayRefPtr idArray;
if (!ScriptConversion::convert(cellIds, idArray))
return 0;
return idArray->getReturnValue();
}
//--------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInteriorsNamespace::hasCell(JNIEnv *env, jobject self, jlong portallizedObject, jstring cellName)
{
JavaStringParam localCellName(cellName);
ServerObject const * serverObject = NULL;
if (!JavaLibrary::getObject(portallizedObject, serverObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::hasCell passed invalid object"));
return 0;
}
PortalProperty const * const portalProp = serverObject->getPortalProperty();
if (!portalProp)
{
DEBUG_WARNING(true, ("JavaLibrary::hasCell server object %s has no portal property", serverObject->getDebugInformation().c_str()));
return 0;
}
std::string cellNameString;
if (!JavaLibrary::convert(localCellName, cellNameString))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::hasCell error converting cell name to C string"));
return 0;
}
bool found = false;
CellProperty const * const cellProp = portalProp->getCell(cellNameString.c_str());
if (cellProp && cellProp->getOwner().asServerObject())
found = true;
return static_cast<jboolean>(found);
}
//--------------------------------------------------------------------------------------
jlong JNICALL ScriptMethodsInteriorsNamespace::getCellId(JNIEnv *env, jobject self, jlong portallizedObject, jstring cellName)
{
JavaStringParam localCellName(cellName);
ServerObject const * serverObject = NULL;
if (!JavaLibrary::getObject(portallizedObject, serverObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] JavaLibrary::getCellId passed invalid object"));
return 0;
}
PortalProperty const * const portalProp = serverObject->getPortalProperty();
if (!portalProp)
{
DEBUG_WARNING(true, ("[script bug] JavaLibrary::getCellId server object %s has no portal property", serverObject->getDebugInformation().c_str()));
return 0;
}
std::string cellNameString;
if (!JavaLibrary::convert(localCellName, cellNameString))
{
DEBUG_WARNING(true, ("[programmer bug] JavaLibrary::getCellId error converting cell name to C string"));
return 0;
}
CellProperty const * const cellProp = portalProp->getCell(cellNameString.c_str());
if (!cellProp)
{
DEBUG_WARNING(true, ("[script bug] JavaLibrary::getCellId passed bad cell name %s for portallized object %s", cellNameString.c_str(), serverObject->getDebugInformation().c_str()));
return 0;
}
ServerObject const * const cellObject = cellProp->getOwner().asServerObject();
if (!cellObject)
{
DEBUG_WARNING(true, ("[programmer bug] JavaLibrary::getCellId error getting cell object from cell property"));
return 0;
}
return (cellObject->getNetworkId()).getValue();
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsInteriorsNamespace::getLocationForWorldCoordinate(JNIEnv *env, jobject self, jfloat x, jfloat y, jfloat z)
{
UNREF(self);
NOT_NULL(env);
Vector position_w(x, y, z);
LocalRefPtr location;
Vector position_l(position_w);
NetworkId cellId;
CellProperty const * cellProperty = ServerWorld::findCellAtLocation(position_w);
if (cellProperty)
{
Object const & cellObject = cellProperty->getOwner();
position_l = cellObject.rotateTranslate_w2o(position_w);
cellId = cellObject.getNetworkId();
if (!ScriptConversion::convert(position_l, ServerWorld::getSceneId(), cellId, location))
{
DEBUG_WARNING(true, ("getLocationForWorldCoordinate failed creating location object"));
return 0;
}
}
return location->getReturnValue();
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsInteriorsNamespace::getGoodLocationInterior(JNIEnv *env, jobject self, jlong building, jstring cellName)
{
UNREF(self);
NOT_NULL(env);
JavaStringParam localCellName(cellName);
if (building == 0)
return 0;
ServerObject const *portallizedObject = 0;
if (!JavaLibrary::getObject(building, portallizedObject))
return 0;
std::string cellNameString;
JavaLibrary::convert(localCellName, cellNameString);
PortalProperty const *portalProp = portallizedObject->getPortalProperty();
if (!portalProp)
return 0;
CellProperty const *cellProp = portalProp->getCell(cellNameString.c_str());
if (!cellProp)
return 0;
ServerObject const *cellObject = cellProp->getOwner().asServerObject();
if (!cellObject)
return 0;
Vector location;
Floor const *floor = cellProp->getFloor();
bool foundLoc = floor->getGoodLocation(0.5f,location);
if (!foundLoc)
return 0;
LocalRefPtr goodLocation;
if (!ScriptConversion::convert(location, cellObject->getSceneId(), cellObject->getNetworkId(), goodLocation))
return 0;
return goodLocation->getReturnValue();
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsInteriorsNamespace::getBuildingEjectLocation(JNIEnv *env, jobject self, jlong building)
{
UNREF(self);
NOT_NULL(env);
if (building == 0)
{
DEBUG_WARNING(true, ("[designer bug] getBuildingEjectLocation was passed a NULL building objid"));
return 0;
}
ServerObject const *portallizedObject = 0;
if (!JavaLibrary::getObject(building, portallizedObject))
{
DEBUG_WARNING(true, ("[designer bug] getBuildingEjectLocation was passed a non-ServerObject objid"));
return 0;
}
PortalProperty const *portalProp = portallizedObject->getPortalProperty();
if (!portalProp)
{
DEBUG_WARNING(true, ("[designer bug] getBuildingEjectLocation was passed an objid (%s) of an object that has no PortalProperty", portallizedObject->getDebugInformation().c_str()));
return 0;
}
PortalPropertyTemplate const &ppTemplate = portalProp->getPortalPropertyTemplate();
Transform ejectionTransform(Transform::IF_none);
ejectionTransform.multiply(portallizedObject->getTransform_o2w(), ppTemplate.getEjectionLocationTransform());
Vector ejectionWorldPos = ejectionTransform.getPosition_p();
CellProperty const *worldCell = CellProperty::getWorldCellProperty();
if (!worldCell)
{
DEBUG_WARNING(true, ("getBuildingEjectLocation get a NULL worldCell back from CellProperty::getWorldCellProperty()"));
return 0;
}
NetworkId const &worldCellId = worldCell->getOwner().getNetworkId();
LocalRefPtr goodLocation;
if (!ScriptConversion::convert(ejectionWorldPos, portallizedObject->getSceneId(), worldCellId, goodLocation))
return 0;
return goodLocation->getReturnValue();
}
//--------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInteriorsNamespace::isValidInteriorLocation (JNIEnv * /*env*/, jobject /*self*/, jobject jobject_location)
{
NetworkId cellNetworkId;
Vector position_p;
if (!ScriptConversion::convert (jobject_location, position_p, cellNetworkId))
{
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB failed to convert parameter 1 (location) to cellNetworkId and position_w"));
return JNI_FALSE;
}
Object const * const object = NetworkIdManager::getObjectById (cellNetworkId);
if (!object)
{
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB could not find cell with object id=%s", cellNetworkId.getValueString ().c_str ()));
return JNI_FALSE;
}
CellObject const * const cellObject = dynamic_cast<CellObject const *> (object);
if (!cellObject)
{
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB object id=%s is not a cell", cellNetworkId.getValueString ().c_str ()));
return JNI_FALSE;
}
CellProperty const * const cellProperty = cellObject->getCellProperty ();
if (!cellProperty)
{
DEBUG_WARNING (true, ("isValidInteriorLocation (): PB could not find cellProperty for cell id=%s name=%s", cellNetworkId.getValueString ().c_str (), cellProperty->getCellName ()));
return JNI_FALSE;
}
Floor const * const floor = cellProperty->getFloor ();
if (!floor)
{
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB could not find floor for cell id=%s name=%s", cellNetworkId.getValueString ().c_str (), cellProperty->getCellName ()));
return JNI_FALSE;
}
FloorLocator result;
Vector const direction_p = Vector::negativeUnitY;
Ray3d ray_p (position_p + Vector::unitY, direction_p);
if (floor->intersectClosest (ray_p, result))
return JNI_TRUE;
return JNI_FALSE;
}
//--------------------------------------------------------------------------------------
jlong JNICALL ScriptMethodsInteriorsNamespace::moveHouseItemToPlayer(JNIEnv * /*env*/, jobject /*self*/, jlong building, jlong player, int index)
{
if (building == 0)
{
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer was passed a NULL building objid"));
return 0;
}
TangibleObject *pob = 0;
if (!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
{
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer was passed a non-tangible-pob building objid"));
return 0;
}
CreatureObject *creatureObject = 0;
if (!JavaLibrary::getObject(player, creatureObject))
{
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer was passed a non-CreatureObject player"));
return 0;
}
return pob->movePobItemToPlayer(*creatureObject, index, false).getValue();
}
//--------------------------------------------------------------------------------------
jlong JNICALL ScriptMethodsInteriorsNamespace::moveHouseItemToPlayer2(JNIEnv * /*env*/, jobject /*self*/, jlong building, jlong player, jlong item)
{
if (building == 0)
{
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer2 was passed a NULL building objid"));
return 0;
}
TangibleObject *pob = 0;
if (!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
{
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer2 was passed a non-tangible-pob building objid"));
return 0;
}
CreatureObject *creatureObject = 0;
if (!JavaLibrary::getObject(player, creatureObject))
{
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer2 was passed a non-CreatureObject player"));
return 0;
}
return pob->movePobItemToPlayer(*creatureObject, NetworkId(static_cast<NetworkId::NetworkIdType>(item)), false).getValue();
}
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsInteriorsNamespace::deleteAllHouseItems(JNIEnv * /*env*/, jobject /*self*/, jlong building, jlong player)
{
if (building == 0)
{
DEBUG_WARNING(true, ("[designer bug] deleteAllHouseItems was passed a NULL building objid"));
return ;
}
TangibleObject *pob = 0;
if (!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
{
DEBUG_WARNING(true, ("[designer bug] deleteAllHouseItems was passed a non-tangible-pob building objid"));
return;
}
CreatureObject const *creatureObject = 0;
if (!JavaLibrary::getObject(player, creatureObject))
{
DEBUG_WARNING(true, ("[designer bug] deleteAllHouseItems was passed a non-CreatereObject player"));
return;
}
pob->deletePobPersistedContents(creatureObject, DeleteReasons::Player);
}
//--------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInteriorsNamespace::areAllContentsLoaded(JNIEnv * /*env*/, jobject /*self*/, jlong building)
{
if (building == 0)
{
DEBUG_WARNING(true, ("[designer bug] areAllContentsLoaded was passed a NULL building objid"));
return JNI_FALSE;
}
const BuildingObject * buildingObject = NULL;
if (!JavaLibrary::getObject(building, buildingObject))
{
DEBUG_WARNING(true, ("[designer bug] areAllContentsLoaded was passed a non-ServerObject objid"));
return JNI_FALSE;
}
return static_cast<jboolean>(buildingObject->getContentsLoaded() ? JNI_TRUE : JNI_FALSE);
}
//--------------------------------------------------------------------------------------
void JNICALL ScriptMethodsInteriorsNamespace::loadBuildingContents(JNIEnv * /*env*/, jobject /*self*/, jlong player, jlong building)
{
if (building == 0)
{
DEBUG_WARNING(true, ("[designer bug] loadBuildingContents was passed a NULL building objid"));
return;
}
BuildingObject * buildingObject = NULL;
if (!JavaLibrary::getObject(building, buildingObject))
{
DEBUG_WARNING(true, ("[designer bug] loadBuildingContents was passed a non-ServerObject objid"));
return;
}
if (GameServer::isAtPendingLoadRequestLimit())
{
WARNING(true, ("loadBuildingContents attempted to load building contents while at the request limit"));
return;
}
GameServer::addPendingLoadRequest(buildingObject->getNetworkId());
// Check for loading objvar first
buildingObject->loadContents();
}
//--------------------------------------------------------------------------------------
jint JNICALL ScriptMethodsInteriorsNamespace::getPobBaseItemLimit(JNIEnv * /*env*/, jobject /*self*/, jlong building)
{
TangibleObject *pob = 0;
if(!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
{
DEBUG_WARNING(true, ("[designer bug] getPobBaseItemLimit() was passed a non-tangible-pob building objid"));
return 0;
}
return pob->getPobBaseItemLimit();
}
//--------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInteriorsNamespace::isAtPendingLoadRequestLimit(JNIEnv * /*env*/, jobject /*self*/)
{
return GameServer::isAtPendingLoadRequestLimit();
}
//--------------------------------------------------------------------------------------
jstring JNICALL ScriptMethodsInteriorsNamespace::getCellLabel(JNIEnv * env, jobject self, jlong target)
{
CellObject const *cellObject = NULL;
if (!JavaLibrary::getObject(target, cellObject))
return NULL;
JavaString cellLabel(cellObject->getCellLabel());
return cellLabel.getReturnValue();
}
//--------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInteriorsNamespace::setCellLabel(JNIEnv * env, jobject self, jlong target, jstring cellLabel)
{
JavaStringParam localCellLabel(cellLabel);
Unicode::String cellLabelString;
if (!JavaLibrary::convert(localCellLabel, cellLabelString))
return JNI_FALSE;
CellObject * cellObject = NULL;
if (!JavaLibrary::getObject(target, cellObject))
return JNI_FALSE;
cellObject->setCellLabel(cellLabelString);
return JNI_TRUE;
}
//--------------------------------------------------------------------------------------
jboolean JNICALL ScriptMethodsInteriorsNamespace::setCellLabelOffset(JNIEnv * env, jobject self, jlong target, jfloat x, jfloat y, jfloat z)
{
CellObject * cellObject = NULL;
if (!JavaLibrary::getObject(target, cellObject))
return JNI_FALSE;
Vector offset(x, y, z);
cellObject->setLabelLocationOffset(offset);
return JNI_TRUE;
}
//--------------------------------------------------------------------------------------
@@ -0,0 +1,943 @@
//========================================================================
//
// ScriptMethodsJedi.cpp - implements script methods dealing with Jedi.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverScript/GameScriptObject.h"
#include "serverScript/ScriptParameters.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/MessageToQueue.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "SwgGameServer/JediManagerObject.h"
#include "SwgGameServer/SwgCreatureObject.h"
#include "SwgGameServer/SwgPlayerObject.h"
#include "SwgGameServer/SwgServerUniverse.h"
using namespace JNIWrappersNamespace;
// @todo: move these functions into SwgGameServer project
// ======================================================================
// ScriptMethodsJediNamespace
// ======================================================================
namespace ScriptMethodsJediNamespace
{
bool install();
jint JNICALL getMaxForcePower(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL setMaxForcePower(JNIEnv *env, jobject self, jlong target, jint value);
jboolean JNICALL alterMaxForcePower(JNIEnv *env, jobject self, jlong target, jint delta);
jint JNICALL getForcePower(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL setForcePower(JNIEnv *env, jobject self, jlong target, jint value);
jboolean JNICALL alterForcePower(JNIEnv *env, jobject self, jlong target, jint delta);
jfloat JNICALL getForcePowerRegenRate(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL setForcePowerRegenRate(JNIEnv *env, jobject self, jlong target, jfloat rate);
jint JNICALL getJediState(JNIEnv *env, jobject self, jlong jedi);
jboolean JNICALL setJediState(JNIEnv *env, jobject self, jlong jedi, jint state);
jboolean JNICALL hasJediSlot(JNIEnv * env, jobject self, jlong target);
jboolean JNICALL addJediSlot(JNIEnv * env, jobject self, jlong target);
jboolean JNICALL isJedi(JNIEnv * env, jobject self, jlong target);
jint JNICALL getJediVisibility(JNIEnv * env, jobject self, jlong target);
jboolean JNICALL setJediVisibility(JNIEnv * env, jobject self, jlong target, jint visibility);
jboolean JNICALL changeJediVisibility(JNIEnv * env, jobject self, jlong target, jint delta);
jboolean JNICALL setJediBountyValue(JNIEnv * env, jobject self, jlong target, jint bountyValue);
jobject JNICALL requestJedi(JNIEnv * env, jobject self, jint visibility, jint bountyValue, jint minLevel, jint maxLevel, jint hoursAlive, jint state, jint bounties);
jobject JNICALL requestOneJedi(JNIEnv * env, jobject self, jlong target);
jboolean JNICALL requestJediBounty(JNIEnv * env, jobject self, jlong target, jlong hunter, jstring successCallback, jstring failCallback, jlong callbackobj);
jboolean JNICALL removeJediBounty(JNIEnv * env, jobject self, jlong target, jlong hunter);
jboolean JNICALL removeAllJediBounties(JNIEnv * env, jobject self, jlong target);
jlongArray JNICALL getBountyHunterBounties(JNIEnv * env, jobject self, jlong hunter);
jlongArray JNICALL getJediBounties(JNIEnv * env, jobject self, jlong target);
jboolean JNICALL isBeingHuntedByBountyHunter(JNIEnv * env, jobject self, jlong target, jlong hunter);
void JNICALL updateJediScriptData(JNIEnv * env, jobject self, jlong id, jstring name, jint value);
void JNICALL removeJediScriptData(JNIEnv * env, jobject self, jlong id, jstring name);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsJediNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsJediNamespace::c)}
JF("_getMaxForcePower", "(J)I", getMaxForcePower),
JF("_setMaxForcePower", "(JI)Z", setMaxForcePower),
JF("_alterMaxForcePower", "(JI)Z", alterMaxForcePower),
JF("_getForcePower", "(J)I", getForcePower),
JF("_setForcePower", "(JI)Z", setForcePower),
JF("_alterForcePower", "(JI)Z", alterForcePower),
JF("_getForcePowerRegenRate", "(J)F", getForcePowerRegenRate),
JF("_setForcePowerRegenRate", "(JF)Z", setForcePowerRegenRate),
JF("_getJediState", "(J)I", getJediState),
JF("_setJediState", "(JI)Z", setJediState),
JF("_hasJediSlot", "(J)Z", hasJediSlot),
JF("_addJediSlot", "(J)Z", addJediSlot),
JF("_isJedi", "(J)Z", isJedi),
JF("_getJediVisibility", "(J)I", getJediVisibility),
JF("_setJediVisibility", "(JI)Z", setJediVisibility),
JF("_changeJediVisibility", "(JI)Z", changeJediVisibility),
JF("_setJediBountyValue", "(JI)Z", setJediBountyValue),
JF("_requestJedi", "(IIIIIII)Lscript/dictionary;", requestJedi),
JF("__requestJedi", "(J)Lscript/dictionary;", requestOneJedi),
JF("_requestJediBounty", "(JJLjava/lang/String;Ljava/lang/String;J)Z", requestJediBounty),
JF("_removeJediBounty", "(JJ)Z", removeJediBounty),
JF("_removeAllJediBounties", "(J)Z", removeAllJediBounties),
JF("_getJediBounties", "(J)[J", getJediBounties),
JF("_getBountyHunterBounties", "(J)[J", getBountyHunterBounties),
JF("_isBeingHuntedByBountyHunter", "(JJ)Z", isBeingHuntedByBountyHunter),
JF("_updateJediScriptData", "(JLjava/lang/String;I)V", updateJediScriptData),
JF("_removeJediScriptData", "(JLjava/lang/String;)V", removeJediScriptData),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI script callback methods
//========================================================================
/**
* Returns the maximum force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's power to get
*
* @return the max force power
*/
jint JNICALL ScriptMethodsJediNamespace::getMaxForcePower(JNIEnv *env, jobject self, jlong target)
{
UNREF(self);
const CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return 0;
if (!creature->isPlayerControlled())
return 0;
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return 0;
return playerObject->getMaxForcePower();
} // JavaLibrary::getMaxForcePower
/**
* Sets the maximum force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's power to set
* @param value the new maximum force power value
*
* @return true on success, false if the target isn't a creature
*/
jboolean JNICALL ScriptMethodsJediNamespace::setMaxForcePower(JNIEnv *env, jobject self, jlong target, jint value)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
if (!creature->isPlayerControlled())
{
// we want to have scripts think non-player creatures can have force
return JNI_TRUE;
}
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return JNI_FALSE;
playerObject->setMaxForcePower(value);
return JNI_TRUE;
} // JavaLibrary::setMaxForcePower
/**
* Changes the maximum force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's power to change
* @param value the value to add to the creature's maximum force power
*
* @return true on success, false if the target isn't a creature
*/
jboolean JNICALL ScriptMethodsJediNamespace::alterMaxForcePower(JNIEnv *env, jobject self, jlong target, jint delta)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
if (!creature->isPlayerControlled())
{
// we want to have scripts think non-player creatures can have force
return JNI_TRUE;
}
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return JNI_FALSE;
playerObject->setMaxForcePower(playerObject->getMaxForcePower() + delta);
return JNI_TRUE;
} // JavaLibrary::alterMaxForcePower
/**
* Returns the force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's power to get
*
* @return the force power
*/
jint JNICALL ScriptMethodsJediNamespace::getForcePower(JNIEnv *env, jobject self, jlong target)
{
UNREF(self);
const CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return 0;
if (!creature->isPlayerControlled())
return 0;
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return 0;
return playerObject->getForcePower();
} // JavaLibrary::getForcePower
/**
* Sets the force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's power to set
* @param value the new force power value
*
* @return true on success, false if the target isn't a creature
*/
jboolean JNICALL ScriptMethodsJediNamespace::setForcePower(JNIEnv *env, jobject self, jlong target, jint value)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
if (!creature->isPlayerControlled())
{
// we want to have scripts think non-player creatures can have force
return JNI_TRUE;
}
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return JNI_FALSE;
playerObject->setForcePower(value);
return JNI_TRUE;
} // JavaLibrary::setForcePower
/**
* Changes the force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's power to change
* @param value the value to add to the creature's force power
*
* @return true on success, false if the target isn't a creature
*/
jboolean JNICALL ScriptMethodsJediNamespace::alterForcePower(JNIEnv *env, jobject self, jlong target, jint delta)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
if (!creature->isPlayerControlled())
{
// we want to have scripts think non-player creatures can have force
return JNI_TRUE;
}
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return JNI_FALSE;
playerObject->setForcePower(playerObject->getForcePower() + delta);
return JNI_TRUE;
} // JavaLibrary::alterForcePower
/**
* Returns the regeneration rate for the force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's regen rate to get
*
* @return the regen rate, in units/sec
*/
jfloat JNICALL ScriptMethodsJediNamespace::getForcePowerRegenRate(JNIEnv *env, jobject self, jlong target)
{
UNREF(self);
const CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return 0;
if (!creature->isPlayerControlled())
return 0;
PlayerObject const * const playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return 0;
return playerObject->getForcePowerRegenRate();
} // JavaLibrary::getForcePowerRegenRate
/**
* Sets the regeneration rate for the force power of a creature.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature who's regen rate to set
* @param rate the regen rate, in units/sec
*
* @return true on success, false if the target wasn't a creature
*/
jboolean JNICALL ScriptMethodsJediNamespace::setForcePowerRegenRate(JNIEnv *env, jobject self, jlong target, jfloat rate)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
if (!creature->isPlayerControlled())
{
// we want to have scripts think non-player creatures can have force
return JNI_TRUE;
}
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creature);
if (playerObject == NULL)
return JNI_FALSE;
playerObject->setForcePowerRegenRate(rate);
return JNI_TRUE;
} // JavaLibrary::setForcePowerRegenRate
/**
* Returns the state of a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param jedi the Jedi to get
*
* @return the state, or -1 on error
*/
jint JNICALL ScriptMethodsJediNamespace::getJediState(JNIEnv *env, jobject self, jlong jedi)
{
const CreatureObject * object = NULL;
if (!JavaLibrary::getObject(jedi, object))
{
WARNING(true, ("JavaLibrary::getJediState did not find creature for id passed in"));
return -1;
}
const SwgPlayerObject * player = safe_cast<const SwgPlayerObject *>(PlayerCreatureController::getPlayerObject(object));
if (player == NULL)
{
WARNING(true, ("JavaLibrary::getJediState did not find player for creature "
"%s", object->getNetworkId().getValueString().c_str()));
return -1;
}
return player->getJediState();
} // JavaLibrary::getJediState
/**
* Sets the state of a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param jedi the Jedi to set
* @param state the state to set
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsJediNamespace::setJediState(JNIEnv *env, jobject self, jlong jedi, jint state)
{
CreatureObject * object = NULL;
if (!JavaLibrary::getObject(jedi, object))
return JNI_FALSE;
SwgPlayerObject * const player = safe_cast<SwgPlayerObject *>(PlayerCreatureController::getPlayerObject(object));
if (player == NULL)
return JNI_FALSE;
if (state == JS_none ||
state == JS_forceSensitive ||
state == JS_jedi ||
state == JS_forceRankedLight ||
state == JS_forceRankedDark
)
{
player->setJediState(static_cast<JediState>(state));
return JNI_TRUE;
}
WARNING(true, ("JavaLibrary::setJediState called for player %s with invalid "
"state %d", object->getNetworkId().getValueString().c_str(), state));
return JNI_FALSE;
} // JavaLibrary::setJediState
/**
* Returns if a player has a Jedi slot available to them.
*
* @param env Java environment
* @param self class calling this function
* @param player the player to test
*
* @return true if the player has a Jedi slot, false if not
*/
jboolean JNICALL ScriptMethodsJediNamespace::hasJediSlot(JNIEnv * env, jobject self, jlong target)
{
const ServerObject * player = NULL;
if (!JavaLibrary::getObject(target, player))
return JNI_FALSE;
// @todo: implement function
return JNI_FALSE;
} // JavaLibrary::hasJediSlot
/**
* Adds a Jedi slot to a player's available character slots.
*
* @param env Java environment
* @param self class calling this function
* @param player the player to test
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsJediNamespace::addJediSlot(JNIEnv * env, jobject self, jlong target)
{
const CreatureObject * object = NULL;
if (!JavaLibrary::getObject(target, object))
return JNI_FALSE;
PlayerObject const * const player = PlayerCreatureController::getPlayerObject(object);
if (player == NULL)
return JNI_FALSE;
player->addJediToAccount();
// since we won't know if this function succeeds util we get the callback,
// set up a timed callback to re-call this function if addJediToAccountAck()
// never gets called
MessageToQueue::getInstance().sendMessageToC(object->getNetworkId(),
"C++AddJediSlot", "", 5 * 60, true);
return JNI_FALSE;
} // JavaLibrary::addJediSlot
/**
* Returns if a creature is a Jedi or not.
*
* @param env Java environment
* @param self class calling this function
* @param target the creature to test
*
* @return the true if the creature is a jedi, false if not
*/
jboolean JNICALL ScriptMethodsJediNamespace::isJedi(JNIEnv * env, jobject self, jlong target)
{
UNREF(self);
const CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
const PlayerObject * player = PlayerCreatureController::getPlayerObject(creature);
if (player == NULL)
return JNI_FALSE;
const SwgPlayerObject * jedi = safe_cast<const SwgPlayerObject *>(player);
if (jedi->isJedi())
return JNI_TRUE;
return JNI_FALSE;
} // JavaLibrary::isJedi
/**
* Returns the visibility of a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi to get
*
* @return the visibility, or -1 on error
*/
jint JNICALL ScriptMethodsJediNamespace::getJediVisibility(JNIEnv * env, jobject self, jlong target)
{
UNREF(self);
const CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return -1;
const PlayerObject * player = PlayerCreatureController::getPlayerObject(creature);
if (player == NULL)
return JNI_FALSE;
const SwgPlayerObject * jedi = safe_cast<const SwgPlayerObject *>(player);
if (!jedi->isJedi())
return -1;
return jedi->getJediVisibility();
} // JavaLibrary::getJediVisibility
/**
* Sets the visibility of a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi to set
* @param visibility the visibility to set
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsJediNamespace::setJediVisibility(JNIEnv * env, jobject self, jlong target, jint visibility)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
PlayerObject * player = PlayerCreatureController::getPlayerObject(creature);
if (player == NULL)
return JNI_FALSE;
SwgPlayerObject * jedi = safe_cast<SwgPlayerObject *>(player);
if (!jedi->isJedi())
return JNI_FALSE;
jedi->setJediVisibility(visibility);
return JNI_TRUE;
} // JavaLibrary::setJediVisibility
/**
* Changes the current visibility of a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi to change
* @param delta the amount to add to the Jedi's current visibility
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsJediNamespace::changeJediVisibility(JNIEnv * env, jobject self, jlong target, jint delta)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
PlayerObject * player = PlayerCreatureController::getPlayerObject(creature);
if (player == NULL)
return JNI_FALSE;
SwgPlayerObject * jedi = safe_cast<SwgPlayerObject *>(player);
if (!jedi->isJedi())
return JNI_FALSE;
jedi->setJediVisibility(jedi->getJediVisibility() + delta);
return JNI_TRUE;
} // JavaLibrary::changeJediVisibility
/**
* Sets the bounty value of a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi to set
* @param bountyValue the bounty value to set
*
* @return true on success, false on error
*/
jboolean JNICALL ScriptMethodsJediNamespace::setJediBountyValue(JNIEnv * env, jobject self, jlong target, jint bountyValue)
{
UNREF(self);
CreatureObject * creature = NULL;
if (!JavaLibrary::getObject(target, creature))
return JNI_FALSE;
SwgCreatureObject const * jediCreature = safe_cast<SwgCreatureObject const *>(creature);
PlayerObject const * player = PlayerCreatureController::getPlayerObject(creature);
if (player == NULL)
return JNI_FALSE;
SwgPlayerObject const * jediPlayer = safe_cast<SwgPlayerObject const *>(player);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return JNI_FALSE;
jediManager->addJedi(creature->getNetworkId(), creature->getObjectName(),
creature->getPosition_w(), creature->getSceneId(), jediPlayer->getJediVisibility(),
bountyValue, creature->getLevel(),
0, jediPlayer->getJediState(), jediCreature->getSpentJediSkillPoints(), creature->getPvpFaction());
return JNI_TRUE;
} // JavaLibrary::setJediVisibility
/**
* Sends a request to find Jedi characters. Limits are passed in for statistics
* that the caller is interested in; the Jedi returned will have the requested
* value or greater for the statistic if the value given is >= 0, or less than
* the statistic if the value given is < 0. If the statistic should be ignored,
* IGNORE_JEDI_STAT should be passed in as the limit value.
*
* @param env Java environment
* @param self class calling this function
* @param visibility limit for visibility statistic
* @param bountyValue limit for bounty value statistic
* @param minLevel minimum Jedi level (inclusive)
* @param maxLevel maximum Jedi level (inclusive)
* @param hoursAlive limit for hours alive statistic
* @param bounties limit for number of bounties on the Jedi statistic
* @param state what state(s) the Jedi should have
*
* @return a dictionary with the Jedi data on success, null on error
*/
jobject JNICALL ScriptMethodsJediNamespace::requestJedi(JNIEnv * env, jobject self, jint visibility,
jint bountyValue, jint minLevel, jint maxLevel, jint hoursAlive, jint bounties, jint state)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return 0;
ScriptParams params;
jediManager->getJedi(visibility, bountyValue, minLevel, maxLevel, hoursAlive, bounties, state, params);
JavaDictionaryPtr dictionary;
JavaLibrary::instance()->convert(params, dictionary);
return dictionary->getReturnValue();
} // JavaLibrary::requestJedi
/**
* Sends a request to find a specific Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the id of the Jedi
*
* @return a dictionary with the Jedi data on success, null on error
*/
jobject JNICALL ScriptMethodsJediNamespace::requestOneJedi(JNIEnv * env, jobject self, jlong target)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return 0;
const NetworkId id(target);
if (id == NetworkId::cms_invalid)
return 0;
ScriptParams params;
jediManager->getJedi(id, params);
if (params.getParams().size() == 0)
return 0;
JavaDictionaryPtr dictionary;
JavaLibrary::instance()->convert(params, dictionary);
return dictionary->getReturnValue();
} // JavaLibrary::requestJedi
/**
* Requests to assign a bounty hunter to track down a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi to hunt
* @param hunter the bounty hunter
* @param successCallback name of a messageHandler than will be called if the
* bounty was assigned
* @param failCallback name of a messageHandler than will be called if the
* bounty was not assigned
* @param callbackobj the object that will get the callback
*
* @return true if the request was sent, false if there was an error
*/
jboolean JNICALL ScriptMethodsJediNamespace::requestJediBounty(JNIEnv * env, jobject self, jlong target, jlong hunter, jstring successCallback, jstring failCallback, jlong callbackobj)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return JNI_FALSE;
const NetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return JNI_FALSE;
const NetworkId hunterId(hunter);
if (hunterId == NetworkId::cms_invalid)
return JNI_FALSE;
JavaStringParam jsuccessCallback(successCallback);
std::string successCallbackString;
if (!JavaLibrary::convert(jsuccessCallback, successCallbackString))
return JNI_FALSE;
JavaStringParam jfailCallback(failCallback);
std::string failCallbackString;
if (!JavaLibrary::convert(jfailCallback, failCallbackString))
return JNI_FALSE;
const NetworkId callbackId(callbackobj);
if (callbackId == NetworkId::cms_invalid)
return JNI_FALSE;
jediManager->requestJediBounty(targetId, hunterId, successCallbackString,
failCallbackString, callbackId);
return JNI_TRUE;
} // JavaLibrary::requestJediBounty
/**
* Removes a bounty hunter from a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi
* @param hunter the hunter's id
*
* @return true on success, false if there was an error
*/
jboolean JNICALL ScriptMethodsJediNamespace::removeJediBounty(JNIEnv * env, jobject self, jlong target, jlong hunter)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return JNI_FALSE;
const NetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return JNI_FALSE;
const NetworkId hunterId(hunter);
if (hunterId == NetworkId::cms_invalid)
return JNI_FALSE;
jediManager->removeJediBounty(targetId, hunterId);
return JNI_TRUE;
} // JavaLibrary::removeJediBounty
/**
* Removes all the bounties on a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi
*
* @return true on success, false if there was an error
*/
jboolean JNICALL ScriptMethodsJediNamespace::removeAllJediBounties(JNIEnv * env, jobject self, jlong target)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return JNI_FALSE;
const NetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return JNI_FALSE;
jediManager->removeAllJediBounties(targetId);
return JNI_TRUE;
} // JavaLibrary::removeAllJediBounties
/**
* Returns a list of players who are hunting a Jedi.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi
*
* @return an array of hunter ids, or null on error
*/
jlongArray JNICALL ScriptMethodsJediNamespace::getJediBounties(JNIEnv * env, jobject self, jlong target)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return 0;
const NetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return 0;
const std::vector<NetworkId> & hunters = jediManager->getJediBounties(targetId);
LocalLongArrayRefPtr returnArray;
if (!ScriptConversion::convert(hunters, returnArray))
return 0;
return returnArray->getReturnValue();
} // JavaLibrary::getJediBounties
/**
* Checks to see if a bounty hunter has a bounty on a target
*
* @param target the Jedi to hunt
* @param hunter the bounty hunter
*
* @return true or false
*/
jboolean JNICALL ScriptMethodsJediNamespace::isBeingHuntedByBountyHunter(JNIEnv * env, jobject self, jlong target, jlong hunter)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return JNI_FALSE;
const NetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return JNI_FALSE;
const NetworkId hunterId(hunter);
if (hunterId == NetworkId::cms_invalid)
return JNI_FALSE;
if (jediManager->hasBountyOnJedi(targetId, hunterId))
return JNI_TRUE;
return JNI_FALSE;
} // JavaLibrary::isBeingHuntedByBountyHunter
/**
* Returns a list of Jedi being hunted by the bounty hunter.
*
* @param env Java environment
* @param self class calling this function
* @param hunter the bounty hunter
*
* @return an array of jedi ids, or null on error
*/
jlongArray JNICALL ScriptMethodsJediNamespace::getBountyHunterBounties(JNIEnv * env, jobject self, jlong hunter)
{
UNREF(self);
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return 0;
const NetworkId hunterId(hunter);
if (hunterId == NetworkId::cms_invalid)
return 0;
std::vector<NetworkId> jedis;
jediManager->getBountyHunterBounties(hunterId, jedis);
LocalLongArrayRefPtr returnArray;
if (!ScriptConversion::convert(jedis, returnArray))
return 0;
return returnArray->getReturnValue();
} // JavaLibrary::getBountyHunterBounties
/**
* Adds data about a Jedi to the Jedi manager.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi
* @param name the data name
* @param value the data value
*/
void JNICALL ScriptMethodsJediNamespace::updateJediScriptData(JNIEnv * env, jobject self, jlong target, jstring name, jint value)
{
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return;
const NetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return;
std::string dataName;
if (!JavaLibrary::convert(JavaStringParam(name), dataName))
return;
jediManager->updateJediScriptData(targetId, dataName, value);
} // JavaLibrary::updateJediScriptData
/**
* Removes data about a Jedi from the Jedi manager.
*
* @param env Java environment
* @param self class calling this function
* @param target the Jedi
* @param name the data name
* @param value the data value
*/
void JNICALL ScriptMethodsJediNamespace::removeJediScriptData(JNIEnv * env, jobject self, jlong target, jstring name)
{
JediManagerObject * jediManager = static_cast<SwgServerUniverse &>(
ServerUniverse::getInstance()).getJediManager();
if (jediManager == NULL)
return;
const NetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return;
std::string dataName;
if (!JavaLibrary::convert(JavaStringParam(name), dataName))
return;
jediManager->removeJediScriptData(targetId, dataName);
} // JavaLibrary::removeJediScriptData
@@ -0,0 +1,382 @@
//========================================================================
//
// ScriptMethodsMap.cpp - implements script methods dealing with bank
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/PlanetMapManagerServer.h"
#include "serverGame/ServerObject.h"
#include "sharedGame/PlanetMapManager.h"
#include "sharedNetworkMessages/MapLocation.h"
#include "UnicodeUtils.h"
#include <vector>
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsMapNamespace
// ======================================================================
namespace ScriptMethodsMapNamespace
{
bool install();
bool JNICALL addPlanetaryMapLocation (JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring category, jstring subCategory, jint mapLocationType, jbyte flags);
bool JNICALL addPlanetaryMapLocationIgnoreLocationCountLimits(JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring category, jstring subCategory, jint mapLocationType, jbyte flags);
bool JNICALL removePlanetaryMapLocation (JNIEnv *env, jobject script, jlong locationId);
jobjectArray JNICALL getPlanetaryMapLocations (JNIEnv *env, jobject script, jstring category, jstring subCategory);
jobjectArray JNICALL getPlanetaryMapCategories (JNIEnv *env, jobject script, jstring category);
jobject JNICALL getPlanetaryMapLocation (JNIEnv *env, jobject script, jlong locationId);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsMapNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsMapNamespace::c)}
JF("_addPlanetaryMapLocation", "(JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;IB)Z",addPlanetaryMapLocation),
JF("_addPlanetaryMapLocationIgnoreLocationCountLimits", "(JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;IB)Z",addPlanetaryMapLocationIgnoreLocationCountLimits),
JF("_removePlanetaryMapLocation", "(J)Z", removePlanetaryMapLocation),
JF("getPlanetaryMapLocations", "(Ljava/lang/String;Ljava/lang/String;)[Lscript/map_location;", getPlanetaryMapLocations),
JF("getPlanetaryMapCategories", "(Ljava/lang/String;)[Ljava/lang/String;", getPlanetaryMapCategories),
JF("_getPlanetaryMapLocation", "(J)Lscript/map_location;", getPlanetaryMapLocation),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ----------------------------------------------------------------------
bool JNICALL ScriptMethodsMapNamespace::addPlanetaryMapLocation(
JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring jCategoryName, jstring jSubCategoryName, jint mapLocationType, jbyte flags)
{
if (mapLocationType < 0 || mapLocationType >= PlanetMapManager::MLT_numTypes)
{
WARNING(true, ("[script bug] invalid mapLocationType [%d] passed to addPlanetaryMapLocation", mapLocationType));
return false;
}
NetworkId id(locationId);
if (id == NetworkId::cms_invalid)
{
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to addPlanetaryMapLocation"));
return false;
}
JavaStringParam localLocationName(locationName);
Unicode::String wideLocationName;
if(!JavaLibrary::convert(localLocationName, wideLocationName))
{
DEBUG_WARNING(true, ("[script bug] invalid locationName passed to addPlanetaryMapLocation"));
return false;
}
if (wideLocationName.empty ())
{
DEBUG_WARNING (true, ("[script bug] empty locationName passed to addPlanetaryMapLocation"));
return false;
}
JavaStringParam localCategory(jCategoryName);
std::string categoryName;
if(!JavaLibrary::convert(localCategory, categoryName))
{
DEBUG_WARNING(true, ("[script bug] invalid category passed to addPlanetaryMapLocation"));
return false;
}
std::string subCategoryName;
if (jSubCategoryName)
{
JavaStringParam localSubCategory(jSubCategoryName);
if(!JavaLibrary::convert(localSubCategory, subCategoryName))
{
DEBUG_WARNING(true, ("[script bug] invalid SubCategory passed to addPlanetaryMapLocation"));
return false;
}
}
const uint8 category = PlanetMapManager::findCategory (categoryName);
if (!category)
{
WARNING(true, ("[script bug] invalid category [%s] passed to addPlanetaryMapLocation", categoryName.c_str ()));
return false;
}
const uint8 subCategory = PlanetMapManager::findCategory (subCategoryName);
if (!subCategory && !subCategoryName.empty ())
{
WARNING(true, ("[script bug] invalid subcategory [%s] passed to addPlanetaryMapLocation", categoryName.c_str ()));
return false;
}
const Vector2d v2d (static_cast<float>(xLoc), static_cast<float>(yLoc));
bool result = false;
const MapLocation loc = PlanetMapManager::makeMapLocation (id, wideLocationName, v2d, categoryName, subCategoryName, flags, result);
if (!result)
{
WARNING(true, ("[script bug] invalid location passed to addPlanetaryMapLocation"));
return false;
}
PlanetMapManagerServer::addMapLocation (loc, mapLocationType, true);
return true;
}
// ----------------------------------------------------------------------
bool JNICALL ScriptMethodsMapNamespace::addPlanetaryMapLocationIgnoreLocationCountLimits(
JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring jCategoryName, jstring jSubCategoryName, jint mapLocationType, jbyte flags)
{
if (mapLocationType < 0 || mapLocationType >= PlanetMapManager::MLT_numTypes)
{
WARNING(true, ("[script bug] invalid mapLocationType [%d] passed to addPlanetaryMapLocationIgnoreLocationCountLimits", mapLocationType));
return false;
}
NetworkId id(locationId);
if (id == NetworkId::cms_invalid)
{
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
return false;
}
JavaStringParam localLocationName(locationName);
Unicode::String wideLocationName;
if(!JavaLibrary::convert(localLocationName, wideLocationName))
{
DEBUG_WARNING(true, ("[script bug] invalid locationName passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
return false;
}
if (wideLocationName.empty ())
{
DEBUG_WARNING (true, ("[script bug] empty locationName passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
return false;
}
JavaStringParam localCategory(jCategoryName);
std::string categoryName;
if(!JavaLibrary::convert(localCategory, categoryName))
{
DEBUG_WARNING(true, ("[script bug] invalid category passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
return false;
}
std::string subCategoryName;
if (jSubCategoryName)
{
JavaStringParam localSubCategory(jSubCategoryName);
if(!JavaLibrary::convert(localSubCategory, subCategoryName))
{
DEBUG_WARNING(true, ("[script bug] invalid SubCategory passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
return false;
}
}
const uint8 category = PlanetMapManager::findCategory (categoryName);
if (!category)
{
WARNING(true, ("[script bug] invalid category [%s] passed to addPlanetaryMapLocationIgnoreLocationCountLimits", categoryName.c_str ()));
return false;
}
const uint8 subCategory = PlanetMapManager::findCategory (subCategoryName);
if (!subCategory && !subCategoryName.empty ())
{
WARNING(true, ("[script bug] invalid subcategory [%s] passed to addPlanetaryMapLocationIgnoreLocationCountLimits", categoryName.c_str ()));
return false;
}
const Vector2d v2d (static_cast<float>(xLoc), static_cast<float>(yLoc));
bool result = false;
const MapLocation loc = PlanetMapManager::makeMapLocation (id, wideLocationName, v2d, categoryName, subCategoryName, flags, result);
if (!result)
{
WARNING(true, ("[script bug] invalid location passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
return false;
}
PlanetMapManagerServer::addMapLocation (loc, mapLocationType, false);
return true;
}
//----------------------------------------------------------------------
bool JNICALL ScriptMethodsMapNamespace::removePlanetaryMapLocation(JNIEnv *env, jobject script, jlong locationId)
{
NetworkId id(locationId);
if (id == NetworkId::cms_invalid)
{
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to removePlanetaryMapLocation"));
return false;
}
PlanetMapManagerServer::removeMapLocation (id);
return true;
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsMapNamespace::getPlanetaryMapLocations(
JNIEnv *env,
jobject script,
jstring jCategoryName,
jstring jSubCategoryName)
{
std::string categoryName;
if (jCategoryName)
{
JavaStringParam localCategory(jCategoryName);
if(!JavaLibrary::convert(localCategory, categoryName))
{
DEBUG_WARNING(true, ("[script bug] invalid category passed to getPlanetaryMapLocations"));
return NULL;
}
}
std::string subCategoryName;
if (jSubCategoryName)
{
JavaStringParam localSubCategory(jSubCategoryName);
if(!JavaLibrary::convert(localSubCategory, subCategoryName))
{
DEBUG_WARNING(true, ("[script bug] invalid SubCategory passed to getPlanetaryMapLocations"));
return NULL;
}
}
static PlanetMapManagerServer::MapLocationVector locs;
locs.clear ();
//@todo: this must be passed in from script
PlanetMapManagerServer::getMapLocationsByCategories (PlanetMapManager::MLT_static, categoryName, subCategoryName, locs);
LocalObjectArrayRefPtr jlocs = createNewObjectArray(locs.size(), JavaLibrary::getClsMapLocation());
int index = 0;
for (PlanetMapManagerServer::MapLocationVector::const_iterator i = locs.begin(); i < locs.end(); ++i, ++index)
{
const MapLocation & mapLocation = *i;
jlong jLocationId = mapLocation.getLocationId().getValue();
if (!jLocationId)
return NULL;
JavaString jNameString(mapLocation.getLocationName());
if (jNameString.getValue() == 0)
return NULL;
LocalRefPtr jMapLocation = createNewObject(JavaLibrary::getClsMapLocation(),
JavaLibrary::getMidMapLocation(),
jLocationId, jNameString.getValue(),
jCategoryName,
jSubCategoryName,
static_cast<jlong> (mapLocation.getLocation().x),
static_cast<jlong> (mapLocation.getLocation().y),
static_cast<jbyte> (mapLocation.getFlags()));
if (jMapLocation == LocalRef::cms_nullPtr)
return NULL;
setObjectArrayElement(*jlocs, index, *jMapLocation);
}
return jlocs->getReturnValue();
}
//----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsMapNamespace::getPlanetaryMapCategories (JNIEnv *env, jobject , jstring jCategoryName)
{
std::string categoryName;
if (jCategoryName)
{
JavaStringParam localCategory(jCategoryName);
if(!JavaLibrary::convert(localCategory, categoryName))
{
DEBUG_WARNING(true, ("[script bug] invalid category passed to getPlanetaryMapCategories"));
return NULL;
}
}
const int theCategory = PlanetMapManager::findCategory (categoryName);
static PlanetMapManagerServer::IntVector iv;
iv.clear ();
PlanetMapManagerServer::getCategories (theCategory, iv);
LocalObjectArrayRefPtr jcats = createNewObjectArray (iv.size (), JavaLibrary::getClsString());
size_t i = 0;
for (PlanetMapManagerServer::IntVector::const_iterator it = iv.begin (); it != iv.end (); ++it, ++i)
{
const int cat = *it;
const std::string & catName = PlanetMapManager::findCategoryName (static_cast<uint8>(cat));
const JavaString jval(catName);
setObjectArrayElement(*jcats, i, jval);
}
return jcats->getReturnValue();
}
//----------------------------------------------------------------------
jobject JNICALL ScriptMethodsMapNamespace::getPlanetaryMapLocation (JNIEnv *env, jobject, jlong jLocationId)
{
NetworkId id(jLocationId);
if (id == NetworkId::cms_invalid)
{
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to getPlanetaryMapCategories"));
return NULL;
}
int mlt = 0;
const MapLocation * const mapLocation = PlanetMapManagerServer::getLocation (id, mlt);
if (!mapLocation)
return NULL;
const JavaString jLocName (mapLocation->m_locationName);
const JavaString jLocCategoryName (PlanetMapManager::findCategoryName (mapLocation->m_category));
const JavaString jLocSubCategoryName (PlanetMapManager::findCategoryName (mapLocation->m_subCategory));
LocalRefPtr jMapLocation = createNewObject(JavaLibrary::getClsMapLocation(),
JavaLibrary::getMidMapLocation(),
jLocationId,
jLocName.getValue (),
jLocCategoryName.getValue (),
jLocSubCategoryName.getValue (),
static_cast<jlong> (mapLocation->getLocation().x),
static_cast<jlong> (mapLocation->getLocation().y),
static_cast<jbyte> (mapLocation->getFlags()));
return jMapLocation->getReturnValue();
}
//----------------------------------------------------------------------
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,207 @@
//========================================================================
//
// ScriptMethodsMenu.cpp - implements script methods dealing with object
// movement.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "sharedGame/RadialMenuManager.h"
#include "sharedNetworkMessages/ObjectMenuRequestData.h"
#include <vector>
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsMenuNamespace
// ======================================================================
namespace ScriptMethodsMenuNamespace
{
bool install();
jfloat JNICALL getRangeForMenuType(JNIEnv *env, jobject self, jint menuType);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsMenuNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsMenuNamespace::c)}
JF("getRangeForMenuType", "(I)F", getRangeForMenuType),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//----------------------------------------------------------------------
//-- todo move this into the proper implementation file
/**
* Convert a java menu_info to a vector of C++ ObjectMenuRequestData objects
*/
const bool JavaLibrary::convert(const LocalRefParamPtr & source, MenuDataVector & target)
{
LocalObjectArrayRefPtr arrayOfMenuInfoDatas = callObjectArrayMethod (*source, ms_midMenuInfoGetMenuItemsInternal);
if (ms_env->ExceptionCheck())
{
ms_env->ExceptionDescribe();
return false;
}
const int count = getArrayLength (*arrayOfMenuInfoDatas);
target.reserve (count);
for (int j = 0; j < count; ++j)
{
ObjectMenuRequestData omrd;
LocalRefPtr element = getObjectArrayElement(*arrayOfMenuInfoDatas, j);
//-- id
const int id = getIntField (*element, JavaLibrary::ms_fidMenuInfoDataId);
if (id < 0 || id >= 255)
return false;
//-- parent
const int parent = getIntField (*element, JavaLibrary::ms_fidMenuInfoDataParent);
if (parent < 0 || parent >= 255)
return false;
//-- type
const int type = getIntField (*element, JavaLibrary::ms_fidMenuInfoDataType);
if (type < 0 || type >= 65535)
return false;
omrd.m_parent = static_cast<uint8>(parent);
omrd.m_id = static_cast<uint8>(id);
omrd.m_menuItemType = static_cast<uint16>(type);
//-- label
LocalRefPtr labelObject = getObjectField(*element, ms_fidMenuInfoDataLabel);
if (labelObject == LocalRef::cms_nullPtr)
return false;
StringId labelId;
if (ScriptConversion::convert (*labelObject, labelId))
omrd.m_labelId = labelId;
else
WARNING (true, ("Unable to convert object menu labelId from Java string_id to C++ StringId."));
//-- flags (enabled, serverNotify)
const bool enabled = getBooleanField (*element, ms_fidMenuInfoDataEnabled) != 0;
const bool serverNotify = getBooleanField (*element, ms_fidMenuInfoDataServerNotify) != 0;
if (enabled)
omrd.m_flags |= ObjectMenuRequestData::F_enabled;
else
omrd.m_flags &= ~(ObjectMenuRequestData::F_enabled);
if (serverNotify)
omrd.m_flags |= ObjectMenuRequestData::F_serverNotify;
else
omrd.m_flags &= ~(ObjectMenuRequestData::F_serverNotify);
target.push_back (omrd);
}
return true;
}
//----------------------------------------------------------------------
//-- todo move this into the proper implementation file
/**
* Convert a C++ MenuDataVector to a java menu_info
*/
const bool JavaLibrary::convert(const MenuDataVector & source, LocalRefParamPtr & target)
{
const int count = static_cast<int>(source.size ());
LocalObjectArrayRefPtr arrayOfMenuInfoDatas = createNewObjectArray(count, ms_clsMenuInfoData);
if (arrayOfMenuInfoDatas == LocalObjectArrayRef::cms_nullPtr)
{
WARNING (true, ("java unable to create array of menu info datas."));
return false;
}
if (getArrayLength (*arrayOfMenuInfoDatas) != count)
{
WARNING (true, ("java created wrong size array."));
return false;
}
bool retval = true;
for (int j = 0; j < count; ++j)
{
const ObjectMenuRequestData & omrd = source [j];
LocalRefPtr element = createNewObject(ms_clsMenuInfoData, ms_midMenuInfoData);
if (element == LocalRef::cms_nullPtr)
{
WARNING (true, ("java unable to create new menu array element %d from size %d array.", j, count));
retval = false;
continue;
}
setIntField (*element, JavaLibrary::ms_fidMenuInfoDataId, omrd.m_id);
setIntField (*element, JavaLibrary::ms_fidMenuInfoDataParent, omrd.m_parent);
setIntField (*element, JavaLibrary::ms_fidMenuInfoDataType, omrd.m_menuItemType);
setBooleanField (*element, JavaLibrary::ms_fidMenuInfoDataEnabled, omrd.hasFlag (ObjectMenuRequestData::F_enabled));
setBooleanField (*element, JavaLibrary::ms_fidMenuInfoDataServerNotify, omrd.hasFlag (ObjectMenuRequestData::F_serverNotify));
LocalRefPtr labelIdObject;
if (ScriptConversion::convert (omrd.m_labelId, labelIdObject))
{
setObjectField(*element, ms_fidMenuInfoDataLabel, *labelIdObject);
}
else
WARNING (true, ("Unable to convert object menu m_labelId from C++ StringId to Java string_id."));
setObjectArrayElement (*arrayOfMenuInfoDatas, j, *element);
}
if (retval)
{
retval = callBooleanMethod(*target, JavaLibrary::ms_midMenuInfoSetMenuItemsInternal, arrayOfMenuInfoDatas->getValue()) != 0;
}
return retval;
}
//----------------------------------------------------------------------
/**
* Returns the distance a player must be from a target to use a menu item.
*
* @param env Java environment
* @param self class calling this function
* @param menuType the id of the menu item (from menu_info_types.java)
*
* @return the distance, or -1 on unknown menu type
*/
jfloat JNICALL ScriptMethodsMenuNamespace::getRangeForMenuType(JNIEnv *env, jobject self, jint menuType)
{
UNREF(env);
UNREF(self);
float range = 0;
if (RadialMenuManager::getRangeForMenuType(menuType, range))
return range;
return -1.0f;
} // JavaLibrary::getRangeForMenuType
//----------------------------------------------------------------------
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,480 @@
//========================================================================
//
// ScriptMethodsMoney.cpp - implements script methods dealing with money
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerWorld.h"
#include "serverNetworkMessages/GetMoneyFromOfflineObjectMessage.h"
#include "sharedLog/Log.h"
#include "sharedObject/NetworkIdManager.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsMoneyNamespace
// ======================================================================
namespace ScriptMethodsMoneyNamespace
{
bool install();
jboolean JNICALL transferCashTo (JNIEnv *env, jobject self, jlong source, jlong target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData);
jboolean JNICALL transferBankCreditsTo (JNIEnv *env, jobject self, jlong source, jlong target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData);
jboolean JNICALL transferBankCreditsToNamedAccount (JNIEnv *env, jobject self, jlong source, jstring target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData);
jboolean JNICALL transferBankCreditsFromNamedAccount (JNIEnv *env, jobject self, jstring source, jlong target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData);
jboolean JNICALL withdrawCashFromBank (JNIEnv *env, jobject self, jlong source, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData);
jboolean JNICALL depositCashToBank (JNIEnv *env, jobject self, jlong source, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData);
void JNICALL depositToGalacticReserve(JNIEnv *env, jobject self, jlong player);
void JNICALL withdrawFromGalacticReserve(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL canAccessGalacticReserve(JNIEnv *env, jobject self, jlong player);
jint JNICALL getCashBalance (JNIEnv *env, jobject self, jlong source);
jint JNICALL getBankBalance (JNIEnv *env, jobject self, jlong source);
jint JNICALL getTotalMoney (JNIEnv *env, jobject self, jlong source);
void JNICALL getMoneyFromOfflineObject(JNIEnv *env, jobject self, jlong sourceObject, jint amount, jstring targetAccount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsMoneyNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsMoneyNamespace::c)}
JF("_transferCashTo", "(JJILjava/lang/String;Ljava/lang/String;Lscript/dictionary;)Z",transferCashTo),
JF("_transferBankCreditsTo", "(JJILjava/lang/String;Ljava/lang/String;Lscript/dictionary;)Z",transferBankCreditsTo),
JF("_transferBankCreditsToNamedAccount", "(JLjava/lang/String;ILjava/lang/String;Ljava/lang/String;Lscript/dictionary;)Z",transferBankCreditsToNamedAccount),
JF("_transferBankCreditsFromNamedAccount", "(Ljava/lang/String;JILjava/lang/String;Ljava/lang/String;Lscript/dictionary;)Z",transferBankCreditsFromNamedAccount),
JF("_withdrawCashFromBank", "(JILjava/lang/String;Ljava/lang/String;Lscript/dictionary;)Z",withdrawCashFromBank),
JF("_depositCashToBank", "(JILjava/lang/String;Ljava/lang/String;Lscript/dictionary;)Z",depositCashToBank),
JF("_depositToGalacticReserve", "(J)V",depositToGalacticReserve),
JF("_withdrawFromGalacticReserve", "(J)V",withdrawFromGalacticReserve),
JF("_canAccessGalacticReserve", "(J)Z",canAccessGalacticReserve),
JF("_getCashBalance", "(J)I",getCashBalance),
JF("_getBankBalance", "(J)I",getBankBalance),
JF("_getTotalMoney", "(J)I",getTotalMoney),
JF("_getMoneyFromOfflineObject", "(JILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lscript/dictionary;)V",getMoneyFromOfflineObject),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jboolean JNICALL ScriptMethodsMoneyNamespace::transferCashTo(JNIEnv *env, jobject self, jlong source, jlong target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData)
{
UNREF(self);
// Check for missing/invalid parameters
if (source == 0 || target == 0)
return JNI_FALSE;
if (successCallbackFunction != 0 || failCallbackFunction != 0)
{
if (callbackData == 0)
return JNI_FALSE;
if (!env->IsInstanceOf(callbackData, JavaLibrary::getClsDictionary()))
return JNI_FALSE;
}
// Convert parameters from Java to C++
NetworkId sourceObjId(source);
NetworkId targetObjId(target);
NetworkId ownerOID(JavaLibrary::getNetworkId(*callStaticObjectMethod(JavaLibrary::getClsScriptEntry(), JavaLibrary::getMidScriptEntryGetOwnerContext())));
std::vector<int8> packedDictionary;
std::string successCallback;
std::string failCallback;
if (callbackData != 0)
{
JavaDictionary const javaDictionary(callbackData);
JavaLibrary::instance()->packDictionary(javaDictionary, packedDictionary);
}
if (successCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(successCallbackFunction), successCallback))
return JNI_FALSE;
if (failCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(failCallbackFunction), failCallback))
return JNI_FALSE;
ServerObject *sourceObj = ServerWorld::findObjectByNetworkId(sourceObjId);
if (sourceObj == NULL || targetObjId == NetworkId::cms_invalid || ownerOID == NetworkId::cms_invalid)
return JNI_FALSE;
// Do money transfer (will be forwarded if object is not authoritative)
sourceObj->scriptTransferCashTo(targetObjId, amount, ownerOID, successCallback, failCallback, packedDictionary);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMoneyNamespace::transferBankCreditsTo(JNIEnv *env, jobject self, jlong source, jlong target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData)
{
UNREF(self);
// Check for missing/invalid parameters
if (source == 0 || target == 0)
return JNI_FALSE;
if (successCallbackFunction != 0 || failCallbackFunction != 0)
{
if (callbackData == 0)
return JNI_FALSE;
if (!env->IsInstanceOf(callbackData, JavaLibrary::getClsDictionary()))
return JNI_FALSE;
}
// Convert parameters from Java to C++
NetworkId sourceObjId(source);
NetworkId targetObjId(target);
NetworkId ownerOID(JavaLibrary::getNetworkId(*callStaticObjectMethod(JavaLibrary::getClsScriptEntry(), JavaLibrary::getMidScriptEntryGetOwnerContext())));
std::vector<int8> packedDictionary;
std::string successCallback;
std::string failCallback;
if (callbackData != 0)
{
JavaDictionary const javaDictionary(callbackData);
JavaLibrary::instance()->packDictionary(javaDictionary, packedDictionary);
}
if (successCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(successCallbackFunction), successCallback))
return JNI_FALSE;
if (failCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(failCallbackFunction), failCallback))
return JNI_FALSE;
ServerObject *sourceObj = ServerWorld::findObjectByNetworkId(sourceObjId);
if (sourceObj == NULL || targetObjId == NetworkId::cms_invalid || ownerOID == NetworkId::cms_invalid)
return JNI_FALSE;
// Do money transfer (will be forwarded if object is not authoritative)
sourceObj->scriptTransferBankCreditsTo(targetObjId, amount, ownerOID, successCallback, failCallback, packedDictionary);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMoneyNamespace::withdrawCashFromBank (JNIEnv *env, jobject self, jlong source, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData)
{
UNREF(self);
// Check for missing/invalid parameters
if (source == 0)
return JNI_FALSE;
if (successCallbackFunction != 0 || failCallbackFunction != 0)
{
if (callbackData == 0)
return JNI_FALSE;
if (!env->IsInstanceOf(callbackData, JavaLibrary::getClsDictionary()))
return JNI_FALSE;
}
// Convert parameters from Java to C++
NetworkId sourceObjId(source);
NetworkId ownerOID(JavaLibrary::getNetworkId(*callStaticObjectMethod(JavaLibrary::getClsScriptEntry(), JavaLibrary::getMidScriptEntryGetOwnerContext())));
std::vector<int8> packedDictionary;
std::string successCallback;
std::string failCallback;
if (callbackData != 0)
{
JavaDictionary const javaDictionary(callbackData);
JavaLibrary::instance()->packDictionary(javaDictionary, packedDictionary);
}
if (successCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(successCallbackFunction), successCallback))
return JNI_FALSE;
if (failCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(failCallbackFunction), failCallback))
return JNI_FALSE;
ServerObject *sourceObj = ServerWorld::findObjectByNetworkId(sourceObjId);
if (sourceObj == NULL || ownerOID == NetworkId::cms_invalid)
return JNI_FALSE;
// Do money transfer (will be forwarded if object is not authoritative)
sourceObj->scriptWithdrawCashFromBank(amount, ownerOID, successCallback, failCallback, packedDictionary);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMoneyNamespace::depositCashToBank(JNIEnv *env, jobject self, jlong source, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData)
{
UNREF(self);
// Check for missing/invalid parameters
if (source == 0)
return JNI_FALSE;
if (successCallbackFunction != 0 || failCallbackFunction != 0)
{
if (callbackData == 0)
return JNI_FALSE;
if (!env->IsInstanceOf(callbackData, JavaLibrary::getClsDictionary()))
return JNI_FALSE;
}
// Convert parameters from Java to C++
NetworkId ownerOID(JavaLibrary::getNetworkId(*callStaticObjectMethod(JavaLibrary::getClsScriptEntry(), JavaLibrary::getMidScriptEntryGetOwnerContext())));
if (ownerOID == NetworkId::cms_invalid)
return JNI_FALSE;
std::string successCallback;
if (successCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(successCallbackFunction), successCallback))
return JNI_FALSE;
std::string failCallback;
if (failCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(failCallbackFunction), failCallback))
return JNI_FALSE;
ServerObject *sourceObj = NULL;
if (!JavaLibrary::getObject(source, sourceObj))
return JNI_FALSE;
JavaDictionary callbackDictionary(callbackData);
callbackDictionary.serialize();
// Do money transfer (will be forwarded if object is not authoritative)
sourceObj->scriptDepositCashToBank(amount, ownerOID, successCallback, failCallback,
callbackDictionary.getSerializedData());
return JNI_TRUE;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsMoneyNamespace::depositToGalacticReserve(JNIEnv *env, jobject self, jlong player)
{
CreatureObject * objPlayer = NULL;
if (!JavaLibrary::getObject(player, objPlayer) || !objPlayer)
return;
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(objPlayer);
if (!playerObject)
return;
playerObject->depositToGalacticReserve(false);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsMoneyNamespace::withdrawFromGalacticReserve(JNIEnv *env, jobject self, jlong player)
{
CreatureObject * objPlayer = NULL;
if (!JavaLibrary::getObject(player, objPlayer) || !objPlayer)
return;
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(objPlayer);
if (!playerObject)
return;
playerObject->withdrawFromGalacticReserve();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMoneyNamespace::canAccessGalacticReserve(JNIEnv *env, jobject self, jlong player)
{
CreatureObject * objPlayer = NULL;
if (!JavaLibrary::getObject(player, objPlayer) || !objPlayer)
return JNI_FALSE;
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(objPlayer);
if (!playerObject)
return JNI_FALSE;
Vector const positionW = objPlayer->getPosition_w();
return PlayerObject::canAccessGalacticReserve(positionW.x, positionW.z);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsMoneyNamespace::getCashBalance(JNIEnv *env, jobject self, jlong source)
{
ServerObject * sourceObj = 0;
if (!JavaLibrary::getObject(source, sourceObj))
return JNI_FALSE;
return sourceObj->getCashBalance();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsMoneyNamespace::getBankBalance(JNIEnv *env, jobject self, jlong source)
{
ServerObject * sourceObj = 0;
if (!JavaLibrary::getObject(source, sourceObj))
return JNI_FALSE;
return sourceObj->getBankBalance();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsMoneyNamespace::getTotalMoney(JNIEnv *env, jobject self, jlong source)
{
ServerObject * sourceObj = 0;
if (!JavaLibrary::getObject(source, sourceObj))
return JNI_FALSE;
return sourceObj->getTotalMoney();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMoneyNamespace::transferBankCreditsToNamedAccount(JNIEnv *env, jobject self, jlong source, jstring target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData)
{
UNREF(self);
// Check for missing/invalid parameters
if (source == 0 || target == 0)
return JNI_FALSE;
if (successCallbackFunction != 0 || failCallbackFunction != 0)
{
// if you specify a callback, data must be valid
if(callbackData == 0)
return JNI_FALSE;
if (!env->IsInstanceOf(callbackData, JavaLibrary::getClsDictionary()))
return JNI_FALSE;
}
// Convert parameters from Java to C++
NetworkId sourceObjId(source);
std::string targetString;
NetworkId ownerOID(JavaLibrary::getNetworkId(*callStaticObjectMethod(JavaLibrary::getClsScriptEntry(), JavaLibrary::getMidScriptEntryGetOwnerContext())));
std::vector<int8> packedDictionary;
std::string successCallback;
std::string failCallback;
if (callbackData != 0)
{
JavaDictionary const javaDictionary(callbackData);
JavaLibrary::instance()->packDictionary(javaDictionary, packedDictionary);
}
if (successCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(successCallbackFunction), successCallback))
return JNI_FALSE;
if (failCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(failCallbackFunction), failCallback))
return JNI_FALSE;
if (!JavaLibrary::convert(JavaStringParam(target), targetString))
return JNI_FALSE;
ServerObject *sourceObj = ServerWorld::findObjectByNetworkId(sourceObjId);
if (sourceObj == NULL || targetString.size() == 0 || ownerOID == NetworkId::cms_invalid)
return JNI_FALSE;
// Do money transfer (will be forwarded if object is not authoritative)
sourceObj->scriptTransferBankCreditsTo(targetString, amount, ownerOID, successCallback, failCallback, packedDictionary);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMoneyNamespace::transferBankCreditsFromNamedAccount(JNIEnv *env, jobject self, jstring source, jlong target, jint amount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData)
{
UNREF(self);
// Check for missing/invalid parameters
if (source == 0 || target == 0)
return JNI_FALSE;
if (successCallbackFunction != 0 || failCallbackFunction != 0)
{
// if you specify a callback, data must be valid
if(callbackData == 0)
return JNI_FALSE;
if (!env->IsInstanceOf(callbackData, JavaLibrary::getClsDictionary()))
return JNI_FALSE;
}
// Convert parameters from Java to C++
std::string sourceString;
NetworkId targetObjId(target);
NetworkId ownerOID(JavaLibrary::getNetworkId(*callStaticObjectMethod(JavaLibrary::getClsScriptEntry(), JavaLibrary::getMidScriptEntryGetOwnerContext())));
std::vector<int8> packedDictionary;
std::string successCallback;
std::string failCallback;
if (callbackData != 0)
{
JavaDictionary const javaDictionary(callbackData);
JavaLibrary::instance()->packDictionary(javaDictionary, packedDictionary);
}
if (successCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(successCallbackFunction), successCallback))
return JNI_FALSE;
if (failCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(failCallbackFunction), failCallback))
return JNI_FALSE;
if (!JavaLibrary::convert(JavaStringParam(source), sourceString))
return JNI_FALSE;
ServerObject *targetObj = ServerWorld::findObjectByNetworkId(targetObjId);
if (targetObj == NULL || sourceString.size() == 0 || ownerOID == NetworkId::cms_invalid)
return JNI_FALSE;
// Do money transfer (will be forwarded if object is not authoritative)
targetObj->scriptTransferBankCreditsFrom(sourceString, amount, ownerOID, successCallback, failCallback, packedDictionary);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsMoneyNamespace::getMoneyFromOfflineObject(JNIEnv *env, jobject self, jlong sourceObject, jint amount, jstring targetAccount, jstring successCallbackFunction, jstring failCallbackFunction, jobject callbackData)
{
// Convert parameters from Java types to C types
DEBUG_REPORT_LOG(true,("getMoneyFromOfflineObject\n"));
NetworkId const sourceObjectC(sourceObject);
NetworkId const replyToC(JavaLibrary::getNetworkId(*callStaticObjectMethod(JavaLibrary::getClsScriptEntry(), JavaLibrary::getMidScriptEntryGetOwnerContext())));
std::string targetAccountC;
std::string successCallbackFunctionC;
std::string failCallbackFunctionC;
std::vector<int8> callbackDataC;
if (targetAccount == 0 || !JavaLibrary::convert(JavaStringParam(targetAccount), targetAccountC))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("getMoneyFromOfflineObject: targetAccount was not specified or could not be converted to a string."));
return;
}
if (successCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(successCallbackFunction), successCallbackFunctionC))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("getMoneyFromOfflineObject: successCallbackFunction could not be converted to a string."));
return;
}
if (failCallbackFunction != 0 && !JavaLibrary::convert(JavaStringParam(failCallbackFunction), failCallbackFunctionC))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("getMoneyFromOfflineObject: failCallbackFunction could not be converted to a string."));
return;
}
if (callbackData != 0)
{
JavaDictionary const javaDictionary(callbackData);
JavaLibrary::instance()->packDictionary(javaDictionary, callbackDataC);
}
// Do the money grab
GetMoneyFromOfflineObjectMessage msg(sourceObjectC, amount, replyToC, successCallbackFunctionC, failCallbackFunctionC, callbackDataC, false);
GameServer::getInstance().sendToDatabaseServer(msg);
LOG("CustomerService", ("Money: offline transfer from %s to %s, amount %i", sourceObjectC.getValueString().c_str(), targetAccountC.c_str(), amount));
}
// ======================================================================
@@ -0,0 +1,462 @@
// ======================================================================
//
// ScriptMethodsMount.cpp
// Copyright 2003, Sony Online Entertainment, Inc.
// All rights reserved.
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerObjectTemplate.h"
#include "sharedGame/MountValidScaleRangeTable.h"
#include "sharedLog/Log.h"
#include "sharedObject/NetworkIdManager.h"
#include "sharedObject/ObjectTemplateList.h"
using namespace JNIWrappersNamespace;
#define LOCAL_LOG_CHANNEL "mount-script-interface"
// ======================================================================
// ScriptMethodsMountNamespace
// ======================================================================
namespace ScriptMethodsMountNamespace
{
bool install();
jboolean JNICALL getMountsEnabled(JNIEnv *env, jobject self);
jboolean JNICALL getMountsMultiSeaterEnabled(JNIEnv *env, jobject self);
jboolean JNICALL makePetMountable(JNIEnv *env, jobject self, jlong petId);
void JNICALL updateMountWearableVisuals(JNIEnv *env, jobject self, jlong mountId);
jboolean JNICALL mountCreature(JNIEnv *env, jobject self, jlong riderId, jlong mountId);
void JNICALL dismountCreature(JNIEnv *env, jobject self, jlong riderId);
jlong JNICALL getMountId(JNIEnv *env, jobject self, jlong riderId);
jlong JNICALL getRiderId(JNIEnv *env, jobject self, jlong mountId);
jint JNICALL couldPetBeMadeMountable(JNIEnv *env, jobject self, jlong petId);
jint JNICALL couldObjectTemplateBeMadeMountable(JNIEnv *env, jobject self, jstring serverObjectTemplateName, jfloat objectScale);
void JNICALL makeContainerStateInconsistentTestOnly(JNIEnv *env, jobject self, jlong containedObjectId);
jboolean JNICALL doesMountHaveRoom(JNIEnv * env, jobject self, jlong mountId);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsMountNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsMountNamespace::c)}
JF("getMountsEnabled", "()Z", getMountsEnabled),
JF("getMountsMultiSeaterEnabled", "()Z", getMountsMultiSeaterEnabled),
JF("_makePetMountable", "(J)Z", makePetMountable),
JF("_updateMountWearableVisuals", "(J)V", updateMountWearableVisuals),
JF("_mountCreature", "(JJ)Z", mountCreature),
JF("_dismountCreature", "(J)V", dismountCreature),
JF("_getMountId", "(J)J", getMountId),
JF("_getRiderId", "(J)J", getRiderId),
JF("_couldPetBeMadeMountable", "(J)I", couldPetBeMadeMountable),
JF("couldObjectTemplateBeMadeMountable", "(Ljava/lang/String;F)I", couldObjectTemplateBeMadeMountable),
JF("_makeContainerStateInconsistentTestOnly", "(J)V", makeContainerStateInconsistentTestOnly),
JF("_doesMountHaveRoom", "(J)Z", doesMountHaveRoom),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jboolean JNICALL ScriptMethodsMountNamespace::getMountsEnabled(JNIEnv *env, jobject self)
{
UNREF(env);
UNREF(self);
return static_cast<jboolean>(ConfigServerGame::getMountsEnabled() ? JNI_TRUE : JNI_FALSE);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMountNamespace::getMountsMultiSeaterEnabled(JNIEnv * /*env*/, jobject /*self*/)
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::getMountsMultiSeaterEnabled(): is a deprecated call."));
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMountNamespace::makePetMountable(JNIEnv *env, jobject self, jlong petId)
{
UNREF(self);
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::makePetMountable(): ignoring call, [GameServer] mountsEnabled is false."));
return JNI_FALSE;
}
//-- Get CreatureObject for pet.
CreatureObject *const petObject = JavaLibrary::getCreatureThrow(env, petId, "makePetMountable(): error in petId arg");
if (!petObject)
return JNI_FALSE;
//-- Check if creature can be converted to a mount.
if (petObject->getMountabilityStatus() != static_cast<int>(MountValidScaleRangeTable::MS_creatureMountable))
{
char buffer[512];
IGNORE_RETURN(snprintf(buffer, sizeof(buffer) - 1, "makePetMountable(): creature id=[%s],object template=[%s] cannot be made mountable.", petObject->getNetworkId().getValueString().c_str(), petObject->getObjectTemplateName()));
buffer[sizeof(buffer) - 1] = '\0';
JavaLibrary::throwInternalScriptError(buffer);
LOG(LOCAL_LOG_CHANNEL, (buffer));
return JNI_FALSE;
}
//-- Check if creature is already mountable.
if (petObject->isMountable())
{
char buffer[512];
IGNORE_RETURN(snprintf(buffer, sizeof(buffer) - 1, "makePetMountable(): creature id=[%s],object template=[%s] already is mountable.", petObject->getNetworkId().getValueString().c_str(), petObject->getObjectTemplateName()));
buffer[sizeof(buffer) - 1] = '\0';
JavaLibrary::throwInternalScriptError(buffer);
LOG(LOCAL_LOG_CHANNEL, (buffer));
return JNI_FALSE;
}
//-- Do it.
petObject->makePetMountable();
return JNI_TRUE;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsMountNamespace::updateMountWearableVisuals(JNIEnv *env, jobject self, jlong mountId)
{
UNREF(env);
UNREF(self);
UNREF(mountId);
LOG(LOCAL_LOG_CHANNEL, ("updateMountWearableVisuals called."));
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMountNamespace::mountCreature(JNIEnv *env, jobject self, jlong riderId, jlong mountId)
{
UNREF(self);
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::mountCreature(): ignoring call, [GameServer] mountsEnabled is false."));
return JNI_FALSE;
}
//-- Get the rider object.
CreatureObject *const riderObject = JavaLibrary::getCreatureThrow(env, riderId, "mountCreature(): error in riderId arg");
if (!riderObject)
return JNI_FALSE;
//-- Get the mount object.
CreatureObject *const mountObject = JavaLibrary::getCreatureThrow(env, mountId, "mountCreature(): error in mountId arg");
if (!mountObject)
return JNI_FALSE;
//-- Ensure that the rider is not already riding a mount.
if (riderObject->getState(States::RidingMount))
{
char buffer[512];
IGNORE_RETURN(snprintf(buffer, sizeof(buffer) - 1, "JavaLibrary::mountCreature(): rider id=[%s] is already riding a mount.", riderObject->getNetworkId().getValueString().c_str()));
buffer[sizeof(buffer) - 1] = '\0';
JavaLibrary::throwInternalScriptError(buffer);
LOG(LOCAL_LOG_CHANNEL, (buffer));
return JNI_FALSE;
}
//-- Check if mount is mountable.
if (!mountObject->isMountable())
{
char buffer[512];
IGNORE_RETURN(snprintf(buffer, sizeof(buffer) - 1, "mountCreature(): creature id=[%s],object template=[%s] is not a mount.", mountObject->getNetworkId().getValueString().c_str(), mountObject->getObjectTemplateName()));
buffer[sizeof(buffer) - 1] = '\0';
JavaLibrary::throwInternalScriptError(buffer);
LOG(LOCAL_LOG_CHANNEL, (buffer));
return JNI_FALSE;
}
//-- Check if mount has room;
if (mountObject->isMountableAndHasRoomForAnother())
{
//-- Have the rider mount the creature.
bool const mountResult = riderObject->mountCreature(*mountObject);
return static_cast<jboolean>(mountResult);
}
return JNI_FALSE;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsMountNamespace::dismountCreature(JNIEnv *env, jobject self, jlong riderId)
{
UNREF(env);
UNREF(self);
UNREF(riderId);
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::dismountCreature(): ignoring call, [GameServer] mountsEnabled is false."));
return;
}
//-- Get the rider.
CreatureObject *const riderObject = JavaLibrary::getCreatureThrow(env, riderId, "getMountId(): error in riderId arg");
if (!riderObject)
return;
//-- Ensure the rider is on a mount.
if (!riderObject->getState(States::RidingMount))
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::dismountCreature(): rider id=[%s] is not riding a mount.", riderObject->getNetworkId().getValueString().c_str()));
return;
}
//-- Get the mount.
CreatureObject *const mountObject = riderObject->getMountedCreature();
if (!mountObject)
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::dismountCreature(): server id=[%d],rider id=[%s] has RidingMount state but CreatureObject::getMountedCreature() returns NULL, skipping dismount.", GameServer::getInstance().getProcessId(), riderObject->getNetworkId().getValueString().c_str()));
return;
}
//-- Detach the rider from the mount.
IGNORE_RETURN(mountObject->detachRider(riderObject->getNetworkId()));
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsMountNamespace::getMountId(JNIEnv *env, jobject self, jlong riderId)
{
UNREF(env);
UNREF(self);
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
return 0;
//-- Get the rider object.
bool const throwIfNotOnServer = false;
CreatureObject const *const riderObject = JavaLibrary::getCreatureThrow(env, riderId, "getMountId(): error in riderId arg", throwIfNotOnServer);
if (!riderObject)
return 0;
CreatureObject const *const mountedCreature = riderObject->getMountedCreature();
NetworkId const mountNetworkId = (mountedCreature ? mountedCreature->getNetworkId() : NetworkId::cms_invalid);
return mountNetworkId.getValue();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsMountNamespace::getRiderId(JNIEnv *env, jobject self, jlong mountId)
{
UNREF(env);
UNREF(self);
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
return 0;
//-- Get the rider object.
bool const throwIfNotOnServer = false;
CreatureObject const *const mountObject = JavaLibrary::getCreatureThrow(env, mountId, "getRiderId(): error in mountId arg", throwIfNotOnServer);
if (!mountObject)
return 0;
CreatureObject const *const riderObject = mountObject->getPrimaryMountingRider();
NetworkId const riderNetworkId = (riderObject ? riderObject->getNetworkId() : NetworkId::cms_invalid);
return riderNetworkId.getValue();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsMountNamespace::couldPetBeMadeMountable(JNIEnv *env, jobject self, jlong petId)
{
UNREF(env);
UNREF(self);
UNREF(petId);
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::couldPetBeMadeMountable(): ignoring call, [GameServer] mountsEnabled is false."));
return static_cast<int>(MountValidScaleRangeTable::MS_speciesUnmountable);
}
//-- Get CreatureObject for pet.
CreatureObject const *const petObject = JavaLibrary::getCreatureThrow(env, petId, "couldPetBeMadeMountable(): error in petId arg");
if (!petObject)
return static_cast<int>(MountValidScaleRangeTable::MS_speciesUnmountable);
//-- Check if creature can be converted to a mount.
return static_cast<jint>(petObject->getMountabilityStatus());
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsMountNamespace::couldObjectTemplateBeMadeMountable(JNIEnv *env, jobject self, jstring objectTemplateName, jfloat objectScale)
{
UNREF(env);
UNREF(self);
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::couldObjectTemplateBeMadeMountable(): ignoring call, [GameServer] mountsEnabled is false."));
return static_cast<int>(MountValidScaleRangeTable::MS_speciesUnmountable);
}
//-- Convert objectTemplateName from jstring to something else.
JavaStringParam objectTemplateNameParam(objectTemplateName);
std::string objectTemplateNameNarrow;
IGNORE_RETURN(JavaLibrary::convert(objectTemplateNameParam, objectTemplateNameNarrow));
//-- Get the appearance name.
//... first grab the server object template name.
ObjectTemplate const *const objectTemplate = ObjectTemplateList::fetch(objectTemplateNameNarrow);
if (!objectTemplate)
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::couldObjectTemplateBeMadeMountable(): object template [%s] could not be fetched.", objectTemplateNameNarrow.c_str()));
return static_cast<int>(MountValidScaleRangeTable::MS_speciesUnmountable);
}
//... grab the shared object template name from it.
ServerObjectTemplate const *const serverObjectTemplate = dynamic_cast<ServerObjectTemplate const*>(objectTemplate);
if (!serverObjectTemplate)
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::couldObjectTemplateBeMadeMountable(): object template [%s] is not a ServerObjectTemplate.", objectTemplateNameNarrow.c_str()));
objectTemplate->releaseReference();
return static_cast<int>(MountValidScaleRangeTable::MS_speciesUnmountable);
}
std::string const &sharedObjectTemplateName = serverObjectTemplate->getSharedTemplate();
//... get the shared object template.
ObjectTemplate const *const sharedObjectTemplateBase = ObjectTemplateList::fetch(sharedObjectTemplateName);
if (!sharedObjectTemplateBase)
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::couldObjectTemplateBeMadeMountable(): could not load shared object template [%s].", sharedObjectTemplateName.c_str()));
objectTemplate->releaseReference();
return static_cast<int>(MountValidScaleRangeTable::MS_speciesUnmountable);
}
SharedObjectTemplate const *const sharedObjectTemplate = sharedObjectTemplateBase->asSharedObjectTemplate();
if (!sharedObjectTemplate)
{
LOG(LOCAL_LOG_CHANNEL, ("JavaLibrary::couldObjectTemplateBeMadeMountable(): shared object template [%s] is not derived from class SharedObjectTemplate.", sharedObjectTemplateName.c_str()));
objectTemplate->releaseReference();
sharedObjectTemplateBase->releaseReference();
return static_cast<int>(MountValidScaleRangeTable::MS_speciesUnmountable);
}
//... get the appearance name.
TemporaryCrcString appearanceTemplateName(sharedObjectTemplate->getAppearanceFilename().c_str(), true);
//-- Check if creature can be converted to a mount.
int const saddleCapacity = 1;
MountValidScaleRangeTable::MountabilityStatus const msResult = MountValidScaleRangeTable::doesCreatureSupportScaleAndSaddleCapacity(appearanceTemplateName, static_cast<float>(objectScale), saddleCapacity);
//-- Release resources.
objectTemplate->releaseReference();
sharedObjectTemplateBase->releaseReference();
//-- Return result.
return static_cast<jint>(msResult);
}
// ----------------------------------------------------------------------
void JNICALL JNICALL ScriptMethodsMountNamespace::makeContainerStateInconsistentTestOnly(JNIEnv *env, jobject self, jlong containedObjectId)
{
//-- Get the ServerObject from the object id.
if (!containedObjectId)
{
LOG("script-bug", ("makeContainerStateInconsistentTestOnly(): containedObjectId is NULL"));
return;
}
NetworkId networkId(containedObjectId);
if (networkId == NetworkId::cms_invalid)
{
LOG("script-bug", ("makeContainerStateInconsistentTestOnly(): containedObjectId is invalid"));
return;
}
Object *const containedObject = NetworkIdManager::getObjectById(networkId);
if (!containedObject)
{
LOG("script-bug", ("makeContainerStateInconsistentTestOnly(): containedObjectId [%s] is not on this server", networkId.getValueString().c_str()));
return;
}
if (!containedObject->isAuthoritative())
{
LOG("script-bug", ("makeContainerStateInconsistentTestOnly(): containedObjectId [%s] is not authoritative on this server", networkId.getValueString().c_str()));
return;
}
//-- Get the container.
Object* containerObject = ContainerInterface::getContainedByObject(*containedObject);
if (!containerObject)
{
LOG("script-bug", ("makeContainerStateInconsistentTestOnly(): containedObjectId [%s] is not contained by anything", networkId.getValueString().c_str()));
return;
}
Container* container = ContainerInterface::getContainer(*containerObject);
if (!container)
{
LOG("script-bug", ("makeContainerStateInconsistentTestOnly(): containerObject [%s] returned a NULL container", containerObject->getNetworkId().getValueString().c_str()));
return;
}
//-- Break the containment relationship.
container->internalItemRemoved(*containedObject);
LOG("script-bug", ("makeContainerStateInconsistentTestOnly(): broke containment relationship for containedObjectId [%s], container [%s] now has invalid information", networkId.getValueString().c_str(), containerObject->getNetworkId().getValueString().c_str()));
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsMountNamespace::doesMountHaveRoom(JNIEnv * env, jobject self, jlong mountId)
{
//-- Ignore calls if mounts are disabled.
if (!ConfigServerGame::getMountsEnabled())
{
return JNI_FALSE;
}
//-- Get the rider object.
bool const throwIfNotOnServer = false;
CreatureObject const * const mountObject = JavaLibrary::getCreatureThrow(env, mountId, "getRiderId(): error in mountId arg", throwIfNotOnServer);
if (mountObject == 0)
{
return JNI_FALSE;
}
return static_cast<jboolean>(mountObject->isMountableAndHasRoomForAnother());
}
// ======================================================================
@@ -0,0 +1,516 @@
// ======================================================================
//
// ScriptMethodsNewbieTutorial.cpp
// asommers
//
// copyright 2002, sony online entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/GameServer.h"
#include "serverGame/NewbieTutorial.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerUniverse.h"
#include "sharedNetworkMessages/MessageQueueGenericValueType.h"
#include "sharedNetworkMessages/NewbieTutorialEnableHudElement.h"
#include "sharedNetworkMessages/NewbieTutorialEnableInterfaceElement.h"
#include "sharedNetworkMessages/NewbieTutorialHighlightUIElement.h"
#include "sharedNetworkMessages/NewbieTutorialSetToolbarElement.h"
#include "sharedNetworkMessages/NewbieTutorialRequest.h"
#include "sharedObject/Controller.h"
#include "sharedUtility/StartingLocationData.h"
#include "sharedUtility/StartingLocationManager.h"
#include <map>
using namespace JNIWrappersNamespace;
// ======================================================================
namespace ScriptMethodsNewbieTutorialNamespace
{
void sendMessageToPlayer (Object & player, MessageQueue::Data * msg, int messageType)
{
Controller * const controller = player.getController ();
if (controller)
{
controller->appendMessage(
messageType,
0.0f,
msg,
GameControllerMessageFlags::SEND |
GameControllerMessageFlags::RELIABLE |
GameControllerMessageFlags::DEST_AUTH_CLIENT
);
}
else
{
WARNING (true, ("newbieTutorialSendStartingLocationsToPlayer: bad controller"));
delete & msg;
}
}
bool install();
jboolean JNICALL newbieTutorialRequest (JNIEnv* env, jobject self, jlong player, jstring request);
jboolean JNICALL newbieTutorialEnableHudElement (JNIEnv* env, jobject self, jlong player, jstring name, jboolean enable, jfloat blinkTime);
jboolean JNICALL newbieTutorialEnableInterfaceElement (JNIEnv* env, jobject self, jlong player, jstring name, jboolean enable);
jboolean JNICALL newbieTutorialSetToolbarElement (JNIEnv* env, jobject self, jlong player, jint slot, jstring commandName);
jboolean JNICALL newbieTutorialSetToolbarElementObject (JNIEnv* env, jobject self, jlong player, jint slot, jlong object);
jboolean JNICALL newbieTutorialHighlightUIElement (JNIEnv* env, jobject self, jlong player, jstring widgetPath, jfloat time);
void JNICALL newbieTutorialSendStartingLocationsToPlayer (JNIEnv* env, jobject self, jlong player, jobjectArray locations);
void JNICALL newbieTutorialSendStartingLocationSelectionResult (JNIEnv* env, jobject self, jlong player, jstring name, jboolean result);
jobjectArray JNICALL getStartingLocations(JNIEnv* env, jobject self);
jboolean JNICALL isStartingLocationAvailable(JNIEnv* env, jobject self, jstring name);
jobject JNICALL getStartingLocationInfo(JNIEnv* env, jobject self, jstring name);
jboolean JNICALL isInTutorialArea(JNIEnv* env, jobject self, jlong object);
}
using namespace ScriptMethodsNewbieTutorialNamespace;
//========================================================================
// install
//========================================================================
bool ScriptMethodsNewbieTutorialNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsNewbieTutorialNamespace::c)}
JF("_newbieTutorialRequest", "(JLjava/lang/String;)Z", newbieTutorialRequest),
JF("_newbieTutorialEnableHudElement", "(JLjava/lang/String;ZF)Z", newbieTutorialEnableHudElement),
JF("_newbieTutorialEnableInterfaceElement", "(JLjava/lang/String;Z)Z", newbieTutorialEnableInterfaceElement),
JF("_newbieTutorialSetToolbarElement", "(JILjava/lang/String;)Z", newbieTutorialSetToolbarElement),
JF("_newbieTutorialSetToolbarElement", "(JIJ)Z", newbieTutorialSetToolbarElementObject),
JF("_newbieTutorialHighlightUIElement", "(JLjava/lang/String;F)Z", newbieTutorialHighlightUIElement),
JF("_newbieTutorialSendStartingLocationsToPlayer", "(J[Ljava/lang/String;)V", newbieTutorialSendStartingLocationsToPlayer),
JF("_newbieTutorialSendStartingLocationSelectionResult", "(JLjava/lang/String;Z)V", newbieTutorialSendStartingLocationSelectionResult),
JF("getStartingLocations", "()[Ljava/lang/String;", getStartingLocations),
JF("isStartingLocationAvailable", "(Ljava/lang/String;)Z", isStartingLocationAvailable),
JF("getStartingLocationInfo", "(Ljava/lang/String;)Lscript/location;", getStartingLocationInfo),
JF("_isInTutorialArea", "(J)Z", isInTutorialArea),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialRequest (JNIEnv* /*env*/, jobject /*self*/, jlong jobject_player, jstring jstring_request)
{
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialRequest (): DB could not find player object"));
return JNI_FALSE;
}
//-- get the client associated with the player
Client* const client = player->getClient ();
if (!client)
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialRequest (): PB could get the player's client object"));
return JNI_FALSE;
}
//-- get the request string
JavaStringParam javaStringParam_request (jstring_request);
std::string request;
if (!JavaLibrary::convert (javaStringParam_request, request))
{
DEBUG_WARNING (true, ("newbieTutorialRequest (): DB failed to convert parameter 2 (request) to string"));
return JNI_FALSE;
}
//-- send the message to the client
NewbieTutorialRequest const msg(request);
client->send(msg, true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialEnableHudElement (JNIEnv* env, jobject self, jlong jobject_player, jstring jstring_name, jboolean jboolean_enable, jfloat jfloat_blinkTime)
{
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialEnableHudElement (): DB could not find player object"));
return JNI_FALSE;
}
//-- get the client associated with the player
Client* const client = player->getClient ();
if (!client)
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialEnableHudElement (): PB could get the player's client object"));
return JNI_FALSE;
}
//-- get the request string
JavaStringParam javaStringParam_name (jstring_name);
std::string name;
if (!JavaLibrary::convert (javaStringParam_name, name))
{
DEBUG_WARNING (true, ("newbieTutorialEnableHudElement (): DB failed to convert parameter 2 (name) to string"));
return JNI_FALSE;
}
//-- send the message to the client
NewbieTutorialEnableHudElement const msg(name, jboolean_enable == JNI_TRUE, jfloat_blinkTime);
client->send(msg, true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialEnableInterfaceElement (JNIEnv* env, jobject self, jlong jobject_player, jstring jstring_name, jboolean jboolean_enable)
{
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialEnableInterfaceElement (): DB could not find player object"));
return JNI_FALSE;
}
//-- get the client associated with the player
Client* const client = player->getClient ();
if (!client)
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialEnableInterfaceElement (): PB could get the player's client object"));
return JNI_FALSE;
}
//-- get the request string
JavaStringParam javaStringParam_name (jstring_name);
std::string name;
if (!JavaLibrary::convert (javaStringParam_name, name))
{
DEBUG_WARNING (true, ("newbieTutorialEnableInterfaceElement (): DB failed to convert parameter 2 (name) to string"));
return JNI_FALSE;
}
//-- send the message to the client
NewbieTutorialEnableInterfaceElement const msg(name, jboolean_enable == JNI_TRUE);
client->send(msg, true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialSetToolbarElement (JNIEnv* env, jobject self, jlong jobject_player, jint slot, jstring jstring_commandName)
{
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSetToolbarElement (): DB could not find player object"));
return JNI_FALSE;
}
//-- get the client associated with the player
Client* const client = player->getClient ();
if (!client)
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSetToolbarElement (): PB could get the player's client object"));
return JNI_FALSE;
}
//-- get the command name string
JavaStringParam javaStringParam_commandName (jstring_commandName);
std::string commandName;
if (!JavaLibrary::convert (javaStringParam_commandName, commandName))
{
DEBUG_WARNING (true, ("newbieTutorialSetToolbarElement (): DB failed to convert parameter 3 (commandName) to string"));
return JNI_FALSE;
}
//-- send the message to the client
NewbieTutorialSetToolbarElement const msg(slot, commandName);
client->send(msg, true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialSetToolbarElementObject (JNIEnv* env, jobject self, jlong jobject_player, jint slot, jlong object)
{
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSetToolbarElement (): DB could not find player object"));
return JNI_FALSE;
}
//-- get the client associated with the player
Client* const client = player->getClient ();
if (!client)
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSetToolbarElement (): PB could get the player's client object"));
return JNI_FALSE;
}
//-- send the message to the client
NewbieTutorialSetToolbarElement const msg(slot, object);
client->send(msg, true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialHighlightUIElement (JNIEnv* env, jobject self, jlong jobject_player, jstring jstring_widgetPath, jfloat time)
{
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSetToolbarElement (): DB could not find player object"));
return JNI_FALSE;
}
//-- get the client associated with the player
Client* const client = player->getClient ();
if (!client)
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSetToolbarElement (): PB could get the player's client object"));
return JNI_FALSE;
}
//-- get the widget path string
JavaStringParam javaStringParam_widgetPath (jstring_widgetPath);
std::string widgetPath;
if (!JavaLibrary::convert (javaStringParam_widgetPath, widgetPath))
{
DEBUG_WARNING (true, ("newbieTutorialSetToolbarElement (): DB failed to convert parameter 3 (widgetPath) to string"));
return JNI_FALSE;
}
//-- send the message to the client
NewbieTutorialHighlightUIElement const msg(widgetPath, time);
client->send(msg, true);
return JNI_TRUE;
}
//----------------------------------------------------------------------
void JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialSendStartingLocationSelectionResult (JNIEnv* env, jobject self, jlong jobject_player, jstring jstring_name, jboolean result)
{
UNREF (self);
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSendStartingLocationSelectionResult (): DB could not find player object"));
return;
}
std::string name;
if (!JavaLibrary::convert(JavaStringParam (jstring_name), name))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSendStartingLocationSelectionResult (): DB bad string"));
return;
}
typedef std::pair<std::string, bool> Payload;
typedef MessageQueueGenericValueType<Payload> MessageType;
MessageType * const message = new MessageType (Payload (name, result));
sendMessageToPlayer (*player, message, CM_startingLocationSelectionResult);
}
//----------------------------------------------------------------------
void JNICALL ScriptMethodsNewbieTutorialNamespace::newbieTutorialSendStartingLocationsToPlayer (JNIEnv* env, jobject self, jlong jobject_player, jobjectArray locations)
{
UNREF (self);
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_REPORT_LOG_PRINT (true, ("newbieTutorialSendStartingLocationsToPlayer (): DB could not find player object"));
return;
}
StartingLocationManager::StartingLocationVector ldv;
if (locations)
{
std::string name;
const jsize count = env->GetArrayLength (locations);
for (jsize i = 0; i < count; ++i)
{
const LocalRefPtr loc = getObjectArrayElement (LocalObjectArrayRefParam(locations), i);
const jstring jstr = static_cast<const jstring>(loc->getValue());
name.clear ();
if (JavaLibrary::convert(JavaStringParam (jstr), name))
{
const StartingLocationData * const data = StartingLocationManager::findLocationByName (name);
if (data)
ldv.push_back (*data);
else
WARNING (true, ("newbieTutorialSendStartingLocationsToPlayer: request for bogus location [%s] index [%d/", name.c_str (), i));
}
}
}
else
{
//-- copy vector
ldv = StartingLocationManager::getLocations ();
}
//-- Sort the locations by population
typedef std::multimap<int,const StartingLocationData*> PopulationSort;
PopulationSort populations;
for (StartingLocationManager::StartingLocationVector::const_iterator it = ldv.begin (); it != ldv.end (); ++it)
{
const StartingLocationData & data = *it;
int population = ServerUniverse::getInstance().getPopulationAtLocation(data.planet, static_cast<int>(data.x), static_cast<int>(data.z));
DEBUG_REPORT_LOG(true,("Starting locations: %s (%i,%i): population %i\n",data.planet.c_str(),static_cast<int>(data.x), static_cast<int>(data.z),population));
populations.insert(std::pair<int,const StartingLocationData*>(population,&data));
}
//-- Build the list for the client in order. Mark them unavailable when we've reached the minimum and the population is too high.
typedef std::pair<StartingLocationData, bool> LocationStatus;
typedef stdvector<LocationStatus>::fwd LocationStatusVector;
LocationStatusVector clientLocations;
clientLocations.reserve (ldv.size ());
int locationCount=0;
bool available=true;
for (PopulationSort::iterator i=populations.begin(); i!=populations.end(); ++i)
{
if (available && (locationCount++ >= ConfigServerGame::getMinNewbieTravelLocations()) && (i->first > ConfigServerGame::getMaxPopulationForNewbieTravel()))
available=false;
clientLocations.push_back (LocationStatus (*i->second, available));
}
//--Send the list to the client
typedef MessageQueueGenericValueType<LocationStatusVector> MessageType;
MessageType * const message = new MessageType (clientLocations);
sendMessageToPlayer (*player, message, CM_startingLocations);
}
//----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsNewbieTutorialNamespace::getStartingLocations (JNIEnv* env, jobject self)
{
UNREF (env);
UNREF (self);
const StartingLocationManager::StartingLocationVector & ldv = StartingLocationManager::getLocations ();
LocalObjectArrayRefPtr valueArray = createNewObjectArray(ldv.size (), JavaLibrary::getClsString());
size_t i = 0;
for (StartingLocationManager::StartingLocationVector::const_iterator it = ldv.begin (); it != ldv.end (); ++it, ++i)
{
const StartingLocationData & data = *it;
JavaString jval(data.name);
setObjectArrayElement(*valueArray, i, jval);
}
return valueArray->getReturnValue();
}
//----------------------------------------------------------------------
jobject JNICALL ScriptMethodsNewbieTutorialNamespace::getStartingLocationInfo (JNIEnv* env, jobject self, jstring jName)
{
UNREF (self);
if (!jName)
{
WARNING (true, ("getStartingLocationInfo null name"));
return JNI_FALSE;
}
std::string name;
if (!JavaLibrary::convert(JavaStringParam (jName), name))
{
DEBUG_REPORT_LOG_PRINT (true, ("getStartingLocationInfo (): DB bad namestring"));
return JNI_FALSE;
}
const StartingLocationData * const data = StartingLocationManager::findLocationByName (name);
if (!data)
{
WARNING (true, ("getStartingLocationInfo: request for bogus location [%s]", name.c_str ()));
return JNI_FALSE;
}
const NetworkId cellId (data->cellId);
Vector loc;
loc.x = data->x;
loc.y = data->y;
loc.z = data->z;
LocalRefPtr jLocation;
if (ScriptConversion::convert (loc, data->planet, cellId, jLocation))
return jLocation->getReturnValue();
return 0;
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::isStartingLocationAvailable (JNIEnv* env, jobject self, jstring jstring_name)
{
std::string name;
if (!JavaLibrary::convert(JavaStringParam (jstring_name), name))
{
DEBUG_REPORT_LOG_PRINT (true, ("isStartingLocationAvailable (): DB bad string"));
return JNI_FALSE;
}
const StartingLocationData * const data = StartingLocationManager::findLocationByName (name);
if (!data)
{
WARNING (true, ("isStartingLocationAvailable: request for bogus location [%s]", name.c_str ()));
return JNI_FALSE;
}
// check if the scene is supposed to be running
if (!GameServer::getInstance().isPlanetEnabledForCluster(data->planet))
return JNI_FALSE;
// check if the destination is too full
int const population = ServerUniverse::getInstance().getPopulationAtLocation(data->planet, static_cast<int>(data->x), static_cast<int>(data->z));
if (population > ConfigServerGame::getMaxPopulationForNewbieTravel())
return JNI_FALSE;
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNewbieTutorialNamespace::isInTutorialArea(JNIEnv *env, jobject self, jlong object)
{
const ServerObject *serverObject = 0;
if (!JavaLibrary::getObject(object, serverObject))
return false;
return NewbieTutorial::isInTutorialArea(serverObject);
}
// ======================================================================
@@ -0,0 +1,109 @@
// ======================================================================
//
// ScriptMethodsNotification.cpp
// Copyright 2003, Sony Online Entertainment, Inc.
// All rights reserved.
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "sharedRandom/Random.h"
#include "sharedNetworkMessages/ClientNotificationBoxMessage.h"
#include "UnicodeUtils.h"
using namespace JNIWrappersNamespace;
// ======================================================================
namespace ScriptMethodsNotificationNamespace
{
bool install();
jint JNICALL addNotification(JNIEnv *env, jobject self, jlong player, jstring contents, jboolean useNotificationIcon, jint iconStyle, jfloat timeout, jint channel, jstring sound);
void JNICALL cancelNotification(JNIEnv *env, jobject self, jlong player, jint notification);
void JNICALL cancelAllNotifications(JNIEnv *env, jobject self, jlong player);
}
using namespace ScriptMethodsNotificationNamespace;
//========================================================================
// install
//========================================================================
bool ScriptMethodsNotificationNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsNotificationNamespace::c)}
JF("_addNotification", "(JLjava/lang/String;ZIFILjava/lang/String;)I", addNotification),
JF("_cancelNotification", "(JI)V", cancelNotification),
JF("_cancelAllNotifications", "(J)V", cancelAllNotifications),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jint JNICALL ScriptMethodsNotificationNamespace::addNotification(JNIEnv *env, jobject self, jlong player, jstring contents, jboolean useNotificationIcon, jint iconStyle, jfloat timeout, jint channel, jstring sound)
{
CreatureObject const * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return 0;
JavaStringParam localContents(contents);
Unicode::String localContentsString;
JavaLibrary::convert(localContents, localContentsString);
if (localContentsString.empty())
return 0;
JavaStringParam localSoundContents(sound);
std::string localSoundContentsString;
JavaLibrary::convert(localSoundContents, localSoundContentsString);
int sequenceId = static_cast<int>(Random::random());
ClientNotificationBoxMessage cnbm(sequenceId, playerObject->getNetworkId(), localContentsString, useNotificationIcon, iconStyle, timeout, channel, localSoundContentsString);
if(playerObject->getClient())
{
playerObject->getClient()->send(cnbm, true);
return sequenceId;
}
return 0;
}
void JNICALL ScriptMethodsNotificationNamespace::cancelNotification(JNIEnv *env, jobject self, jlong player, jint notification)
{
CreatureObject const * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return;
ClientNotificationBoxMessage cnbm(notification, playerObject->getNetworkId(), Unicode::emptyString, FALSE, 0, 0.0f, ClientNotificationBoxMessage::NC_SPECIAL_CANCEL, std::string(""));
if(playerObject->getClient())
{
playerObject->getClient()->send(cnbm, true);
return;
}
return;
}
void JNICALL ScriptMethodsNotificationNamespace::cancelAllNotifications(JNIEnv *env, jobject self, jlong player)
{
CreatureObject const * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return;
ClientNotificationBoxMessage cnbm(0, playerObject->getNetworkId(), Unicode::emptyString, FALSE, 0, 0.0f, ClientNotificationBoxMessage::NC_SPECIAL_CANCEL_ALL, std::string(""));
if(playerObject->getClient())
{
playerObject->getClient()->send(cnbm, true);
return;
}
return;
}
@@ -0,0 +1,676 @@
//========================================================================
//
// ScriptMethodsNpc.cpp - implements script methods dealing with Npcs.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/NameManager.h"
#include "serverGame/ServerCreatureObjectTemplate.h"
#include "sharedGame/OutOfBand.h"
#include "sharedGame/OutOfBandPackager.h"
#include "sharedGame/ProsePackage.h"
#include "sharedFoundation/Crc.h"
#include "sharedObject/ObjectTemplateList.h"
#include "UnicodeUtils.h"
using namespace JNIWrappersNamespace;
//========================================================================
// NPC conversation utility functions
//========================================================================
namespace ScriptMethodsNpcNamespace
{
ProsePackage getProseFromOob (const Unicode::String & oob)
{
ProsePackage localPp;
const OutOfBandBase * const base = OutOfBandPackager::unpackOne (oob, OutOfBandPackager::OT_prosePackage);
if (base)
{
const OutOfBand <ProsePackage> * const oobpp = safe_cast<const OutOfBand <ProsePackage> *>(base);
const ProsePackage * const pp = oobpp->getObject ();
localPp = *pp;
delete pp;
delete base;
}
return localPp;
}
char const * const cms_conversationAppearanceOverride = "convo.appearance";
bool install();
void setNpcConversationResponses(JNIEnv *env, TangibleObject * player, jobjectArray responses);
jboolean JNICALL _npcStartConversation(JNIEnv *env, jobject self, jlong player, jlong npc, jstring convoName, jobject greeting, jstring greetingOob, jobjectArray responses, uint32 appearanceOverrideSharedTemplateCrc);
jboolean JNICALL npcStartConversation(JNIEnv *env, jobject self, jlong player, jlong npc, jstring convoName, jobject greeting, jstring greetingOob, jobjectArray responses);
jboolean JNICALL npcStartConversationAppearanceOverride(JNIEnv *env, jobject self, jlong player, jlong npc, jstring convoName, jobject greeting, jstring greetingOob, jobjectArray responses, jstring appearanceOverrideSharedTemplate);
jboolean JNICALL npcEndConversation(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL npcEndConversationWithMessage(JNIEnv *env, jobject self, jlong player, jobject response, jstring responeOob);
jboolean JNICALL npcSpeak(JNIEnv *env, jobject self, jlong player, jobject text, jstring oob);
jboolean JNICALL npcSetConversationResponses(JNIEnv *env, jobject self, jlong player, jobjectArray responses);
jboolean JNICALL npcAddConversationResponse(JNIEnv *env, jobject self, jlong player, jobject response, jstring responeOob);
jboolean JNICALL npcRemoveConversationResponse(JNIEnv *env, jobject self, jlong player, jobject response);
jboolean JNICALL isInNpcConversation(JNIEnv *env, jobject self, jlong creature);
jlongArray JNICALL getNpcConversants(JNIEnv *env, jobject self, jlong creature);
jstring JNICALL generateRandomNameByTemplate(JNIEnv *env, jobject self, jstring templateName);
jstring JNICALL generateRandomNameByTable(JNIEnv *env, jobject self, jstring directory, jstring table);
jboolean JNICALL isNameReserved(JNIEnv *env, jobject self, jstring name);
jboolean JNICALL isNameReservedIgnoreRules(JNIEnv *env, jobject self, jstring name, jobjectArray ignoreRules);
jboolean JNICALL setNpcDifficulty(JNIEnv *env, jobject self, jlong npc, jlong difficulty);
}
using namespace ScriptMethodsNpcNamespace;
//========================================================================
// install
//========================================================================
bool ScriptMethodsNpcNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsNpcNamespace::c)}
JF("__npcStartConversation", "(JJLjava/lang/String;Lscript/string_id;Ljava/lang/String;[Ljava/lang/Object;)Z", npcStartConversation),
JF("__npcStartConversationWithOverrideAppearance", "(JJLjava/lang/String;Lscript/string_id;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;)Z", npcStartConversationAppearanceOverride),
JF("_npcEndConversation", "(J)Z", npcEndConversation),
JF("_npcEndConversationWithMessage", "(JLscript/string_id;Ljava/lang/String;)Z", npcEndConversationWithMessage),
JF("__npcSpeak", "(JLscript/string_id;Ljava/lang/String;)Z", npcSpeak),
JF("__npcSetConversationResponses", "(J[Ljava/lang/Object;)Z", npcSetConversationResponses),
JF("__npcAddConversationResponse", "(JLscript/string_id;Ljava/lang/String;)Z", npcAddConversationResponse),
JF("_npcRemoveConversationResponse", "(JLscript/string_id;)Z", npcRemoveConversationResponse),
JF("_isInNpcConversation", "(J)Z", isInNpcConversation ),
JF("_getNpcConversants", "(J)[J", getNpcConversants),
JF("generateRandomName", "(Ljava/lang/String;)Ljava/lang/String;", generateRandomNameByTemplate),
JF("generateRandomName", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", generateRandomNameByTable),
JF("isNameReserved", "(Ljava/lang/String;)Z", isNameReserved),
JF("isNameReserved", "(Ljava/lang/String;[Ljava/lang/String;)Z", isNameReservedIgnoreRules),
JF("_setNpcDifficulty", "(JJ)Z", setNpcDifficulty),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//----------------------------------------------------------------------
/**
* Takes a Java string_id array and converts it into npc conversation reponses
* available to a player.
*
* @param env Java environment
* @param player the player
* @param reponses array of string_ids
*/
void ScriptMethodsNpcNamespace::setNpcConversationResponses(JNIEnv *env, TangibleObject * player, jobjectArray responses)
{
StringId stringId;
Unicode::String oob;
player->clearNpcConversation();
if (responses == 0)
return;
const jsize count = env->GetArrayLength(responses);
for (jsize i = 0; i < count; ++i)
{
LocalRefPtr response = getObjectArrayElement(LocalObjectArrayRefParam(responses), i);
if (response != LocalRef::cms_nullPtr)
{
if (ScriptConversion::convert(*response, stringId))
{
// add the response to the player's conversation
player->addNpcConversationResponse(stringId, ProsePackage ());
}
else if (isInstanceOf(*response, JavaLibrary::getClsString()))
{
oob.clear();
jstring jstr = static_cast<jstring>(response->getValue());
if (JavaLibrary::convert(JavaStringParam (jstr), oob))
{
const ProsePackage & pp = getProseFromOob (oob);
if (pp.isValid ())
player->addNpcConversationResponse (StringId (), pp);
else
WARNING (true, ("ScriptMethodsNpc setNpcConversationResponses error getting prose from oob index %i", i));
}
else
WARNING (true, ("ScriptMethodsNpc setNpcConversationResponses could not convert jstring to Unicode::String"));
}
else
{
WARNING (true, ("ScriptMethodsNpc setNpcConversationResponses error in setNpcConversationResponses index %d", i));
}
}
else
{
DEBUG_WARNING(true, ("NPC Conversation setNpcConversationResponses response #%d (base-0) missing!", i));
}
}
}
//========================================================================
// class JavaLibrary JNI NPC callback methods
//========================================================================
//----------------------------------------------------------------------
/**
* Starts a conversation between an npc and a player.
*
* @param env Java environment
* @param self class calling this function
* @param player player in conversation
* @param npc npc in conversation
* @param convoName name of the conversation; passed to the trigger OnNpcConversationResponse
* @param greeting initial text npc will say to the player
* @param responses initial responses available to the player
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsNpcNamespace::_npcStartConversation(JNIEnv *env, jobject self, jlong player, jlong npc, jstring convoName, jobject greeting, jstring greetingOob, jobjectArray responses, uint32 appearanceOverrideTemplateCrc)
{
UNREF(self);
JavaStringParam localConvoName(convoName);
std::string convoNameStr;
if (!JavaLibrary::convert (localConvoName, convoNameStr))
return JNI_FALSE;
TangibleObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return JNI_FALSE;
if (playerObject->isInNpcConversation())
return JNI_FALSE;
TangibleObject * npcObject = NULL;
if (!JavaLibrary::getObject(npc, npcObject))
return JNI_FALSE;
if (!playerObject->startNpcConversation(*npcObject, convoNameStr, NpcConversationData::CS_NPC, appearanceOverrideTemplateCrc))
return JNI_FALSE;
// send the greeting
StringId greetingStringId;
if (greeting)
ScriptConversion::convert(greeting, greetingStringId);
Unicode::String oob;
if (greetingOob)
{
JavaStringParam localGreetingOob(greetingOob);
if (!JavaLibrary::convert (localGreetingOob, oob))
{
WARNING (true, ("ScriptMethodsNpc unable to convert greetingOob"));
return JNI_FALSE;
}
}
playerObject->sendNpcConversationMessage(greetingStringId, ProsePackage (), oob);
// send the responses to the player
setNpcConversationResponses(env, playerObject, responses);
playerObject->sendNpcConversationResponses();
return JNI_TRUE;
} // JavaLibrary::NpcStartConversation
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNpcNamespace::npcStartConversation(JNIEnv *env, jobject self, jlong player, jlong npc, jstring convoName, jobject greeting, jstring greetingOob, jobjectArray responses)
{
TangibleObject * speakerObject = NULL;
if (!JavaLibrary::getObject(npc, speakerObject) || !speakerObject)
return JNI_FALSE;
std::string conversationAppearanceOverride;
speakerObject->getObjVars().getItem(cms_conversationAppearanceOverride, conversationAppearanceOverride);
uint32 crc = Crc::crcNull;
ObjectTemplate const * const ot = ObjectTemplateList::fetch(conversationAppearanceOverride);
ServerObjectTemplate const * const sot = ot ? ot->asServerObjectTemplate() : NULL;
if(sot)
{
std::string const & sharedTemplateName = sot->getSharedTemplate();
crc = Crc::calculate(sharedTemplateName.c_str());
}
return _npcStartConversation(env, self, player, npc, convoName, greeting, greetingOob, responses, crc);
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNpcNamespace::npcStartConversationAppearanceOverride(JNIEnv *env, jobject self, jlong player, jlong npc, jstring convoName, jobject greeting, jstring greetingOob, jobjectArray responses, jstring appearanceOverrideSharedTemplateName)
{
JavaStringParam localAppearanceOverrideSharedTemplateName(appearanceOverrideSharedTemplateName);
std::string appearanceOverrideSharedTemplateNameStr;
if (!JavaLibrary::convert (localAppearanceOverrideSharedTemplateName, appearanceOverrideSharedTemplateNameStr))
return JNI_FALSE;
ObjectTemplate const * const ot = ObjectTemplateList::fetch(appearanceOverrideSharedTemplateNameStr);
ServerObjectTemplate const * const sot = ot ? ot->asServerObjectTemplate() : NULL;
if(!sot)
{
return JNI_FALSE;
WARNING (true, ("npcStartConversationAppearanceOverride: appearanceOverride string is not a server template name"));
}
std::string const & sharedTemplateName = sot->getSharedTemplate();
uint32 const crc = Crc::calculate(sharedTemplateName.c_str());
return _npcStartConversation(env, self, player, npc, convoName, greeting, greetingOob, responses, crc);
}
//----------------------------------------------------------------------
/**
* Ends a player's current conversation.
*
* @param env Java environment
* @param self class calling this function
* @param player player in conversation
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsNpcNamespace::npcEndConversation(JNIEnv *env, jobject self, jlong player)
{
UNREF(self);
TangibleObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return JNI_FALSE;
if (playerObject->isInNpcConversation())
{
playerObject->endNpcConversation();
}
return JNI_TRUE;
} // JavaLibrary::npcEndConversation
//----------------------------------------------------------------------
/**
* Has the NPC a player is in conversation say something to the player.
*
* @param env Java environment
* @param self class calling this function
* @param player player in conversation
* @param text the message the npc will say to the player
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsNpcNamespace::npcSpeak(JNIEnv *env, jobject self, jlong player, jobject paramTextId, jstring paramOob)
{
UNREF(self);
TangibleObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return JNI_FALSE;
if (!playerObject->isInNpcConversation())
return JNI_FALSE;
StringId textStringId;
Unicode::String oob;
if (paramTextId)
{
if (!ScriptConversion::convert(paramTextId, textStringId))
{
WARNING (true, ("ScriptMethodsNpc Unable to convert string id"));
return JNI_FALSE;
}
}
if (paramOob)
{
if (!JavaLibrary::convert (JavaStringParam (paramOob), oob))
{
WARNING (true, ("ScriptMethodsNpc unable to convert oob"));
return JNI_FALSE;
}
}
playerObject->sendNpcConversationMessage(textStringId, ProsePackage (), oob);
return JNI_TRUE;
} // JavaLibrary::npcSpeak
//----------------------------------------------------------------------
/**
* Sets the available responses for a player to select in a conversation with
* an NPC.
*
* @param env Java environment
* @param self class calling this function
* @param player player in conversation
* @param responses responses available to the player
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsNpcNamespace::npcSetConversationResponses(JNIEnv *env, jobject self, jlong player, jobjectArray responses)
{
UNREF(self);
TangibleObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return JNI_FALSE;
if (!playerObject->isInNpcConversation())
return JNI_FALSE;
setNpcConversationResponses(env, playerObject, responses);
return JNI_TRUE;
} // JavaLibrary::npcSetConversationResponses
//----------------------------------------------------------------------
/**
* Adds a response to the available responses for a player to select in a
* conversation with an NPC.
*
* @param env Java environment
* @param self class calling this function
* @param player player in conversation
* @param response response to add
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsNpcNamespace::npcAddConversationResponse(JNIEnv *env, jobject self, jlong player, jobject responseId, jstring responseOob)
{
UNREF(self);
TangibleObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return JNI_FALSE;
if (!playerObject->isInNpcConversation())
return JNI_FALSE;
StringId stringId;
ProsePackage pp;
if (responseId)
{
if (!ScriptConversion::convert(responseId, stringId))
return JNI_FALSE;
}
if (responseOob)
{
Unicode::String oob;
if (!JavaLibrary::convert (JavaStringParam (responseOob), oob))
return JNI_FALSE;
pp = getProseFromOob (oob);
if (!pp.isValid ())
{
WARNING (true, ("ScriptMethodsNpc error getting prose from oob"));
return JNI_FALSE;
}
}
if (stringId.isInvalid () && !pp.isValid ())
{
WARNING (true, ("No stringid or pp"));
return JNI_FALSE;
}
if (!playerObject->addNpcConversationResponse(stringId, pp))
return JNI_FALSE;
return JNI_TRUE;
} // JavaLibrary::npcAddConversationResponse
//----------------------------------------------------------------------
/**
* Removes a response from the available responses for a player to select in a
* conversation with an NPC.
*
* @param env Java environment
* @param self class calling this function
* @param player player in conversation
* @param response response to remove
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsNpcNamespace::npcRemoveConversationResponse(JNIEnv *env, jobject self, jlong player, jobject response)
{
UNREF(self);
TangibleObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject))
return JNI_FALSE;
if (!playerObject->isInNpcConversation())
return JNI_FALSE;
StringId localResponse;
if (!ScriptConversion::convert(response, localResponse))
return JNI_FALSE;
if (!playerObject->removeNpcConversationResponse(localResponse, ProsePackage ()))
return JNI_FALSE;
return JNI_TRUE;
} // JavaLibrary::npcRemoveConversationResponse
//----------------------------------------------------------------------
/**
* Determines if a creature is in an NPC conversation or not. The creature may
* be a player or NPC.
*
* @param env Java environment
* @param self class calling this function
* @param creature creature being asked about
*
* @return JNI_TRUE if creature is in an NPC conversation, JNI_FALSE if not
*/
jboolean JNICALL ScriptMethodsNpcNamespace::isInNpcConversation(JNIEnv *env, jobject self, jlong creature)
{
UNREF(self);
TangibleObject * tangibleObject = NULL;
if (!JavaLibrary::getObject(creature, tangibleObject))
return JNI_FALSE;
if (tangibleObject->isInNpcConversation())
return JNI_TRUE;
return JNI_FALSE;
} // JavaLibrary::isInNpcConversation
//----------------------------------------------------------------------
/**
* Returns the ids of any creatures a creature is in an NPC conversation with.
*
* @param env Java environment
* @param self class calling this function
* @param creature creature being asked about
*
* @return an array of obj_ids the creature is in conversation with, or null on error
*/
jlongArray JNICALL ScriptMethodsNpcNamespace::getNpcConversants(JNIEnv *env, jobject self, jlong creature)
{
UNREF(self);
TangibleObject * tangibleObject = NULL;
if (!JavaLibrary::getObject(creature, tangibleObject))
return 0;
const std::vector<NetworkId> & conversants = tangibleObject->getConversations();
int count = conversants.size();
// create an array of obj_ids and fill them in
LocalLongArrayRefPtr objIds = createNewLongArray(count);
if (objIds == LocalLongArrayRef::cms_nullPtr)
return 0;
jlong jlongTmp;
for (int i = 0; i < count; ++i)
{
jlongTmp = (conversants[i]).getValue();
setLongArrayRegion(*objIds, i, 1, &jlongTmp);
}
return objIds->getReturnValue();
} // JavaLibrary::getNpcConversants
//----------------------------------------------------------------------
/**
* Generates a random name for an object.
*
* @param env Java environment
* @param self class calling this function
* @param template the name of the template to generate the name for
* @return The random name, or blank if one could not be generated
*/
jstring JNICALL ScriptMethodsNpcNamespace::generateRandomNameByTemplate(JNIEnv *env, jobject self, jstring i_templateName)
{
UNREF(self);
std::string templateName;
if (!JavaLibrary::convert(JavaStringParam(i_templateName), templateName))
return JavaString("").getReturnValue();
Unicode::String randomName;
const ObjectTemplate * const objectTemplate = ObjectTemplateList::fetch(templateName);
if (objectTemplate)
{
const ServerCreatureObjectTemplate * const creatureTemplate = dynamic_cast<const ServerCreatureObjectTemplate *>(objectTemplate);
if (creatureTemplate)
{
// generate a name
randomName = NameManager::getInstance().generateRandomName(ConfigServerGame::getCharacterNameGeneratorDirectory(),creatureTemplate->getNameGeneratorType());
}
objectTemplate->releaseReference();
}
return JavaString(randomName).getReturnValue();
} // JavaLibrary::speakString
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsNpcNamespace::generateRandomNameByTable(JNIEnv *env, jobject self, jstring directory, jstring table)
{
std::string myDirectory;
if (!JavaLibrary::convert(JavaStringParam(directory), myDirectory))
return JavaString("").getReturnValue();
std::string myTable;
if (!JavaLibrary::convert(JavaStringParam(table), myTable))
return JavaString("").getReturnValue();
Unicode::String randomName = NameManager::getInstance().generateRandomName(myDirectory, myTable);
return JavaString(randomName).getReturnValue();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNpcNamespace::isNameReserved(JNIEnv *env, jobject self, jstring name)
{
Unicode::String myName;
if (!JavaLibrary::convert(JavaStringParam(name), myName))
return false;
return NameManager::getInstance().isNameReserved(myName);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNpcNamespace::isNameReservedIgnoreRules(JNIEnv *env, jobject self, jstring name, jobjectArray ignoreRules)
{
Unicode::String myName;
if (!JavaLibrary::convert(JavaStringParam(name), myName))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::isNameReservedIgnoreRules passed invalid java string for the name"));
return true;
}
std::vector<std::string> rulesToIgnore;
if(!ScriptConversion::convert(ignoreRules, rulesToIgnore))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::isNameReservedIgnoreRules passed invalid java string array"));
return true;
}
std::string dummyReturn;
return NameManager::getInstance().isNameReserved(myName, dummyReturn, rulesToIgnore);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNpcNamespace::npcEndConversationWithMessage(JNIEnv * /*env*/, jobject /*self*/, jlong player, jobject response, jstring responseOob)
{
TangibleObject * playerObject = NULL;
if(!JavaLibrary::getObject(player, playerObject))
return JNI_FALSE;
if(!playerObject->isInNpcConversation())
return JNI_FALSE;
StringId responseStringId;
bool responseIsValid = false;
if(response)
{
responseIsValid = static_cast<bool>(ScriptConversion::convert(response, responseStringId));
}
bool oobIsValid = false;
Unicode::String oob;
if(responseOob)
{
oobIsValid = static_cast<bool>(JavaLibrary::convert(JavaStringParam(responseOob), oob));
}
if(responseIsValid || oobIsValid)
{
playerObject->endNpcConversation(responseStringId, oob);
}
else
{
playerObject->endNpcConversation();
}
return JNI_TRUE;
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsNpcNamespace::setNpcDifficulty(JNIEnv *env, jobject self, jlong npc, jlong difficulty)
{
TangibleObject * npcObject = NULL;
if (!JavaLibrary::getObject(npc, npcObject))
return JNI_FALSE;
CreatureObject *creature = npcObject->asCreatureObject();
if (!creature)
return JNI_FALSE;
if (difficulty < 0 || difficulty > 2)
return JNI_FALSE;
creature->setDifficulty(static_cast<CreatureObject::Difficulty> (difficulty));
return JNI_TRUE;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,446 @@
// ======================================================================
//
// ScriptMethodsPermissions.cpp - implements script methods dealing with
// cell and building permissions
//
// Copyright 2002 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/BuildingObject.h"
#include "serverGame/CellObject.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsPermissionsNamespace
// ======================================================================
namespace ScriptMethodsPermissionsNamespace
{
bool install();
jobjectArray JNICALL permissionsGetBanned(JNIEnv *env, jobject self, jlong target);
jobjectArray JNICALL permissionsGetAllowed(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL permissionsIsPublic(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL permissionsIsAllowed(JNIEnv *env, jobject self, jlong target, jlong who);
void JNICALL permissionsAddAllowed(JNIEnv *env, jobject self, jlong target, jstring name);
void JNICALL permissionsRemoveAllAllowed(JNIEnv *env, jobject self, jlong target);
void JNICALL permissionsRemoveAllowed(JNIEnv *env, jobject self, jlong target, jstring name);
void JNICALL permissionsAddBanned(JNIEnv *env, jobject self, jlong target, jstring name);
void JNICALL permissionsRemoveBanned(JNIEnv *env, jobject self, jlong target, jstring name);
void JNICALL permissionsRemoveAllBanned(JNIEnv *env, jobject self, jlong target);
void JNICALL permissionsMakePublic(JNIEnv *env, jobject self, jlong target);
void JNICALL permissionsMakePrivate(JNIEnv *env, jobject self, jlong target);
void JNICALL expelFromBuilding(JNIEnv *env, jobject self, jlong target);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsPermissionsNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsPermissionsNamespace::c)}
JF("_permissionsGetBanned", "(J)[Ljava/lang/String;", permissionsGetBanned),
JF("_permissionsGetAllowed", "(J)[Ljava/lang/String;", permissionsGetAllowed),
JF("_permissionsIsPublic", "(J)Z", permissionsIsPublic),
JF("_permissionsIsAllowed", "(JJ)Z", permissionsIsAllowed),
JF("_permissionsAddAllowed", "(JLjava/lang/String;)V", permissionsAddAllowed),
JF("_permissionsRemoveAllowed", "(JLjava/lang/String;)V", permissionsRemoveAllowed),
JF("_permissionsRemoveAllAllowed", "(J)V", permissionsRemoveAllAllowed),
JF("_permissionsAddBanned", "(JLjava/lang/String;)V", permissionsAddBanned),
JF("_permissionsRemoveBanned", "(JLjava/lang/String;)V", permissionsRemoveBanned),
JF("_permissionsRemoveAllBanned", "(J)V", permissionsRemoveAllBanned),
JF("_permissionsMakePublic", "(J)V", permissionsMakePublic),
JF("_permissionsMakePrivate", "(J)V", permissionsMakePrivate),
JF("_expelFromBuilding", "(J)V", expelFromBuilding),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
// class JavaLibrary JNI command table methods
// ======================================================================
/**
* Get the banned list for a cell or building
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to get permissions for
*
* @return the banned list
*/
jobjectArray JNICALL ScriptMethodsPermissionsNamespace::permissionsGetBanned(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (!JavaLibrary::getObject(target, serverObj))
return NULL;
LocalObjectArrayRefPtr strArray;
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
if (ScriptConversion::convert(buildingObj->getBanned(), strArray))
return strArray->getReturnValue();
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
if (ScriptConversion::convert(cellObj->getBanned(), strArray))
return strArray->getReturnValue();
return NULL;
}
// ----------------------------------------------------------------------
/**
* Get the allowed list for a cell or building
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to get permissions for
*
* @return the allowed list
*/
jobjectArray JNICALL ScriptMethodsPermissionsNamespace::permissionsGetAllowed(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (!JavaLibrary::getObject(target, serverObj))
return NULL;
LocalObjectArrayRefPtr strArray;
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
if (ScriptConversion::convert(buildingObj->getAllowed(), strArray))
return strArray->getReturnValue();
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
if (ScriptConversion::convert(cellObj->getAllowed(), strArray))
return strArray->getReturnValue();
return NULL;
}
// ----------------------------------------------------------------------
/**
* Get whether a cell or building is public
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to get permissions for
*
* @return true if public, false if not found or private
*/
jboolean JNICALL ScriptMethodsPermissionsNamespace::permissionsIsPublic(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (!JavaLibrary::getObject(target, serverObj))
return JNI_FALSE;
bool isPublic = false;
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
isPublic = buildingObj->getIsPublic();
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
isPublic = cellObj->getIsPublic();
}
if (isPublic)
return JNI_TRUE;
return JNI_FALSE;
}
// ----------------------------------------------------------------------
/**
* check if someone is allowed in a cell/building
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to test permissions on
* @param who the person to test permissions for
*/
jboolean JNICALL ScriptMethodsPermissionsNamespace::permissionsIsAllowed(JNIEnv *env, jobject self, jlong target, jlong who)
{
CreatureObject *person = 0;
if (JavaLibrary::getObject(who, person))
{
NetworkId buildingId(target);
if(buildingId == NetworkId::cms_invalid)
{
// target "building" is the world cell - permissions are always allowed
return JNI_TRUE;
}
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
{
if (buildingObj->isAllowed(*person))
return JNI_TRUE;
}
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj && cellObj->isAllowed(*person))
return JNI_TRUE;
}
}
}
return JNI_FALSE;
}
// ----------------------------------------------------------------------
/**
* add someone to a cell or building's allowed list
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to set permissions for
* @param name name or id string to add to allowed list
*/
void JNICALL ScriptMethodsPermissionsNamespace::permissionsAddAllowed(JNIEnv *env, jobject self, jlong target, jstring name)
{
JavaStringParam localName(name);
std::string strName;
if (!JavaLibrary::convert(localName, strName))
return;
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->addAllowed(strName);
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->addAllowed(strName);
}
}
}
// ----------------------------------------------------------------------
/**
* remove someone from a cell or building's allowed list
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to set permissions for
* @param name name or id string to remove from allowed list
*/
void JNICALL ScriptMethodsPermissionsNamespace::permissionsRemoveAllowed(JNIEnv *env, jobject self, jlong target, jstring name)
{
JavaStringParam localName(name);
std::string strName;
if (!JavaLibrary::convert(localName, strName))
return;
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->removeAllowed(strName);
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->removeAllowed(strName);
}
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPermissionsNamespace::permissionsRemoveAllAllowed(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->removeAllAllowed();
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->removeAllAllowed();
}
}
}
// ----------------------------------------------------------------------
/**
* add someone to a cell or building's banned list
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to set permissions for
* @param name name or id string to add to banned list
*/
void JNICALL ScriptMethodsPermissionsNamespace::permissionsAddBanned(JNIEnv *env, jobject self, jlong target, jstring name)
{
JavaStringParam localName(name);
std::string strName;
if (!JavaLibrary::convert(localName, strName))
return;
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->addBanned(strName);
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->addBanned(strName);
}
}
}
// ----------------------------------------------------------------------
/**
* remove someone from a cell or building's banned list
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to set permissions for
* @param name name or id string to remove from banned list
*/
void JNICALL ScriptMethodsPermissionsNamespace::permissionsRemoveBanned(JNIEnv *env, jobject self, jlong target, jstring name)
{
JavaStringParam localName(name);
std::string strName;
if (!JavaLibrary::convert(localName, strName))
return;
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->removeBanned(strName);
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->removeBanned(strName);
}
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPermissionsNamespace::permissionsRemoveAllBanned(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->removeAllBanned();
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->removeAllBanned();
}
}
}
// ----------------------------------------------------------------------
/**
* make a cell or building public
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to set permissions for
*/
void JNICALL ScriptMethodsPermissionsNamespace::permissionsMakePublic(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->setIsPublic(true);
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->setIsPublic(true);
}
}
}
// ----------------------------------------------------------------------
/**
* make a cell or building private
*
* @param env Java Environment
* @param self class calling this function
* @param target the cell or building to set permissions for
*/
void JNICALL ScriptMethodsPermissionsNamespace::permissionsMakePrivate(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(serverObj);
if (buildingObj)
buildingObj->setIsPublic(false);
else
{
CellObject *cellObj = dynamic_cast<CellObject*>(serverObj);
if (cellObj)
cellObj->setIsPublic(false);
}
}
}
// ----------------------------------------------------------------------
/**
* expel an object from a building
*
* @param env Java Environment
* @param self class calling this function
* @param target the object to expel
*/
void JNICALL ScriptMethodsPermissionsNamespace::expelFromBuilding(JNIEnv *env, jobject self, jlong target)
{
ServerObject *serverObj = 0;
if (JavaLibrary::getObject(target, serverObj))
{
BuildingObject *buildingObj = dynamic_cast<BuildingObject*>(ContainerInterface::getTopmostContainer(*serverObj));
if (buildingObj)
buildingObj->expelObject(*serverObj);
}
}
// ======================================================================
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,551 @@
// ======================================================================
//
// ScriptMethodsPlanet.cpp
// asommers
//
// copyright 2002, sony online entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "UnicodeUtils.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/GameServer.h"
#include "serverGame/PlanetObject.h"
#include "serverGame/ServerUniverse.h"
#include "serverGame/ServerWorld.h"
#include "sharedGame/SharedBuildoutAreaManager.h"
#include "sharedGame/TravelManager.h"
#include "sharedGame/TravelPoint.h"
#include "sharedMath/Vector.h"
#include "sharedNetworkMessages/EnterTicketPurchaseModeMessage.h"
#include "sharedNetworkMessages/GenericValueTypeMessage.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsPlanetNamespace
// ======================================================================
namespace ScriptMethodsPlanetNamespace
{
bool install();
jboolean JNICALL addPlanetTravelPoint (JNIEnv* env, jobject self, jstring planetName, jstring travelPointName, jobject location, jint cost, jboolean interplanetary, jint type);
jboolean JNICALL removePlanetTravelPoint (JNIEnv* env, jobject self, jstring planetName, jstring travelPointName);
jobjectArray JNICALL getPlanetTravelPoints (JNIEnv* env, jobject self, jstring planetName);
jstring JNICALL getPlanetTravelPointGcwContestedRegion (JNIEnv* env, jobject self, jstring planetName, jstring travelPointName);
jobject JNICALL getPlanetTravelPointLocation (JNIEnv* env, jobject self, jstring planetName, jstring travelPointName);
jint JNICALL getPlanetTravelPointCost (JNIEnv* env, jobject self, jstring planetName, jstring travelPointName);
jboolean JNICALL getPlanetTravelPointInterplanetary (JNIEnv* env, jobject self, jstring planetName, jstring travelPointName);
jint JNICALL getPlanetTravelCost (JNIEnv* env, jobject self, jstring sourcePlanetName, jstring destinationPlanetName);
jboolean JNICALL enterClientTicketPurchaseMode (JNIEnv* env, jobject self, jlong player, jstring startingPlanetName, jstring startingTravelPointName, jboolean instantTravel);
jboolean JNICALL isAreaTooFullForTravel (JNIEnv* env, jobject self, jstring planetName_j, jint x, jint z);
jstring JNICALL getBuildoutAreaName( JNIEnv *env, jobject self, jfloat x, jfloat z, jstring scene );
jfloatArray JNICALL getBuildoutAreaSizeAndCenter(JNIEnv *env, jobject self, jfloat x, jfloat z, jstring scene, jboolean ignoreInternal, jboolean allowComposite);
void JNICALL requestSameServer(JNIEnv *env, jobject self, jlong object1, jlong object2);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsPlanetNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsPlanetNamespace::c)}
JF("addPlanetTravelPoint", "(Ljava/lang/String;Ljava/lang/String;Lscript/location;IZI)Z", addPlanetTravelPoint),
JF("removePlanetTravelPoint", "(Ljava/lang/String;Ljava/lang/String;)Z", removePlanetTravelPoint),
JF("getPlanetTravelPoints", "(Ljava/lang/String;)[Ljava/lang/String;", getPlanetTravelPoints),
JF("getPlanetTravelPointGcwContestedRegion", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", getPlanetTravelPointGcwContestedRegion),
JF("getPlanetTravelPointLocation", "(Ljava/lang/String;Ljava/lang/String;)Lscript/location;", getPlanetTravelPointLocation),
JF("getPlanetTravelPointCost", "(Ljava/lang/String;Ljava/lang/String;)I", getPlanetTravelPointCost),
JF("getPlanetTravelPointInterplanetary", "(Ljava/lang/String;Ljava/lang/String;)Z", getPlanetTravelPointInterplanetary),
JF("getPlanetTravelCost", "(Ljava/lang/String;Ljava/lang/String;)I", getPlanetTravelCost),
JF("_enterClientTicketPurchaseMode", "(JLjava/lang/String;Ljava/lang/String;Z)Z", enterClientTicketPurchaseMode),
JF("isAreaTooFullForTravel", "(Ljava/lang/String;II)Z", isAreaTooFullForTravel),
JF("getBuildoutAreaName", "(FFLjava/lang/String;)Ljava/lang/String;", getBuildoutAreaName),
JF("getBuildoutAreaSizeAndCenter", "(FFLjava/lang/String;ZZ)[F", getBuildoutAreaSizeAndCenter),
JF("_requestSameServer", "(JJ)V", requestSameServer),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jboolean JNICALL ScriptMethodsPlanetNamespace::addPlanetTravelPoint (JNIEnv* const /*env*/, jobject /*self*/, jstring jstring_planetName, jstring jstring_travelPointName, jobject jobject_location, jint cost, jboolean jboolean_interplanetary, jint type)
{
//-- get the planet object
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("addPlanetTravelPoint (): DB failed to convert parameter 1 (planetName) to string"));
return JNI_FALSE;
}
PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (planetName);
if (!planetObject)
{
DEBUG_WARNING (true, ("addPlanetTravelPoint (): DB planet %s does not exist", planetName.c_str ()));
return JNI_FALSE;
}
//-- get the name of the travel point
JavaStringParam javaStringParam_travelPointName (jstring_travelPointName);
std::string travelPointName;
if (!JavaLibrary::convert (javaStringParam_travelPointName, travelPointName))
{
DEBUG_WARNING (true, ("addPlanetTravelPoint (): DB failed to convert parameter 2 (travelPointName) to string"));
return JNI_FALSE;
}
//-- get (and verify) location
std::string sceneId;
Vector position_w;
if (!ScriptConversion::convertWorld (jobject_location, position_w, sceneId))
{
DEBUG_WARNING (true, ("addPlanetTravelPoint (): DB failed to convert parameter 3 (location) to sceneId, and position_w"));
return JNI_FALSE;
}
//-- make sure the planet name matches the location name
// if (sceneId != planetName)
// {
// DEBUG_WARNING (true, ("addPlanetTravelPoint (): DB planet %s does not match scene id %s in travel point location %s", planetName.c_str (), sceneId.c_str (), travelPointName.c_str ()));
// return FALSE;
// }
//-- add to the planet
planetObject->addTravelPoint (travelPointName, position_w, cost, jboolean_interplanetary == JNI_TRUE, static_cast<TravelPoint::TravelPointType>(type));
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlanetNamespace::removePlanetTravelPoint (JNIEnv* const /*env*/, jobject /*self*/, jstring jstring_planetName, jstring jstring_travelPointName)
{
//-- get the planet object
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("removePlanetTravelPoint (): DB failed to convert parameter 1 (planetName) to string"));
return JNI_FALSE;
}
PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (planetName);
if (!planetObject)
{
DEBUG_WARNING (true, ("removePlanetTravelPoint (): DB planet %s does not exist", planetName.c_str ()));
return JNI_FALSE;
}
//-- get the name of the travel point
JavaStringParam javaStringParam_travelPointName (jstring_travelPointName);
std::string travelPointName;
if (!JavaLibrary::convert (javaStringParam_travelPointName, travelPointName))
{
DEBUG_WARNING (true, ("removePlanetTravelPoint (): DB failed to convert parameter 2 (travelPointName) to string"));
return JNI_FALSE;
}
//-- remove from the planet
planetObject->removeTravelPoint (travelPointName);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsPlanetNamespace::getPlanetTravelPoints (JNIEnv* env, jobject /*self*/, jstring jstring_planetName)
{
//-- get the planet object
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("getPlanetTravelPoints (): DB failed to convert parameter 1 (planetName) to string"));
return JNI_FALSE;
}
PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (planetName);
if (!planetObject)
{
DEBUG_WARNING (true, ("getPlanetTravelPoints (): DB planet %s does not exist", planetName.c_str ()));
return JNI_FALSE;
}
//-- create list of travel points
std::vector<std::string> travelPointNameList;
planetObject->getTravelPointNameList (travelPointNameList);
//-- convert to a string array
LocalObjectArrayRefPtr jobjectArray_travelPointNameList = createNewObjectArray(travelPointNameList.size (), JavaLibrary::getClsString());
uint i;
for (i = 0; i < travelPointNameList.size (); ++i)
{
JavaString jstring_travelPointName (Unicode::narrowToWide (travelPointNameList [i]));
setObjectArrayElement (*jobjectArray_travelPointNameList, i, jstring_travelPointName);
}
return jobjectArray_travelPointNameList->getReturnValue();
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsPlanetNamespace::getPlanetTravelPointGcwContestedRegion (JNIEnv* env, jobject self, jstring jstring_planetName, jstring jstring_travelPointName)
{
//-- get the planet object
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointGcwContestedRegion (): DB failed to convert parameter 1 (planetName) to string"));
return 0;
}
PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (planetName);
if (!planetObject)
{
DEBUG_WARNING (true, ("getPlanetTravelPointGcwContestedRegion (): DB planet %s does not exist", planetName.c_str ()));
return 0;
}
//-- get the name of the travel point
JavaStringParam javaStringParam_travelPointName (jstring_travelPointName);
std::string travelPointName;
if (!JavaLibrary::convert (javaStringParam_travelPointName, travelPointName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointGcwContestedRegion (): DB failed to convert parameter 2 (travelPointName) to string"));
return 0;
}
const TravelPoint* const travelPoint = planetObject->getTravelPoint (travelPointName);
if (!travelPoint)
{
DEBUG_WARNING (true, ("getPlanetTravelPointGcwContestedRegion (): DB travel point %s does not exist on planet %s", travelPointName.c_str (), planetName.c_str ()));
return 0;
}
if (travelPoint->getGcwContestedRegion().empty())
{
return 0;
}
return JavaString(travelPoint->getGcwContestedRegion().c_str()).getReturnValue();
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsPlanetNamespace::getPlanetTravelPointLocation (JNIEnv* const /*env*/, jobject /*self*/, jstring jstring_planetName, jstring jstring_travelPointName)
{
//-- get the planet object
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointLocation (): DB failed to convert parameter 1 (planetName) to string"));
return 0;
}
PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (planetName);
if (!planetObject)
{
DEBUG_WARNING (true, ("getPlanetTravelPointLocation (): DB planet %s does not exist", planetName.c_str ()));
return 0;
}
//-- get the name of the travel point
JavaStringParam javaStringParam_travelPointName (jstring_travelPointName);
std::string travelPointName;
if (!JavaLibrary::convert (javaStringParam_travelPointName, travelPointName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointLocation (): DB failed to convert parameter 2 (travelPointName) to string"));
return 0;
}
const TravelPoint* const travelPoint = planetObject->getTravelPoint (travelPointName);
if (!travelPoint)
{
DEBUG_WARNING (true, ("getPlanetTravelPointLocation (): DB travel point %s does not exist on planet %s", travelPointName.c_str (), planetName.c_str ()));
return 0;
}
//-- transform into location
const Vector& position_w = travelPoint->getPosition_w ();
LocalRefPtr location;
if (!ScriptConversion::convert (position_w, NetworkId (), location))
{
DEBUG_WARNING (true, ("getPlanetTravelPointLocation (): PB could not convert travel point %s to location (scene %s, position <%1.2f, %1.2f, %1.2f>)", travelPointName.c_str (), planetName.c_str (), position_w.x, position_w.y, position_w.z));
return 0;
}
return location->getReturnValue();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPlanetNamespace::getPlanetTravelPointCost (JNIEnv* const /*env*/, jobject /*self*/, jstring jstring_planetName, jstring jstring_travelPointName)
{
//-- get the planet object
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointCost (): DB failed to convert parameter 1 (planetName) to string"));
return 0;
}
PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (planetName);
if (!planetObject)
{
DEBUG_WARNING (true, ("getPlanetTravelPointCost (): DB planet %s does not exist", planetName.c_str ()));
return 0;
}
//-- get the name of the travel point
JavaStringParam javaStringParam_travelPointName (jstring_travelPointName);
std::string travelPointName;
if (!JavaLibrary::convert (javaStringParam_travelPointName, travelPointName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointCost (): DB failed to convert parameter 2 (travelPointName) to string"));
return 0;
}
const TravelPoint* const travelPoint = planetObject->getTravelPoint (travelPointName);
if (!travelPoint)
{
DEBUG_WARNING (true, ("getPlanetTravelPointCost (): DB travel point %s does not exist on planet %s", travelPointName.c_str (), planetName.c_str ()));
return 0;
}
return travelPoint->getCost ();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlanetNamespace::getPlanetTravelPointInterplanetary (JNIEnv* const /*env*/, jobject /*self*/, jstring jstring_planetName, jstring jstring_travelPointName)
{
//-- get the planet object
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointInterplanetary (): DB failed to convert parameter 1 (planetName) to string"));
return 0;
}
PlanetObject* const planetObject = ServerUniverse::getInstance ().getPlanetByName (planetName);
if (!planetObject)
{
DEBUG_WARNING (true, ("getPlanetTravelPointInterplanetary (): DB planet %s does not exist", planetName.c_str ()));
return 0;
}
//-- get the name of the travel point
JavaStringParam javaStringParam_travelPointName (jstring_travelPointName);
std::string travelPointName;
if (!JavaLibrary::convert (javaStringParam_travelPointName, travelPointName))
{
DEBUG_WARNING (true, ("getPlanetTravelPointInterplanetary (): DB failed to convert parameter 2 (travelPointName) to string"));
return 0;
}
const TravelPoint* const travelPoint = planetObject->getTravelPoint (travelPointName);
if (!travelPoint)
{
DEBUG_WARNING (true, ("getPlanetTravelPointInterplanetary (): DB travel point %s does not exist on planet %s", travelPointName.c_str (), planetName.c_str ()));
return 0;
}
return travelPoint->getInterplanetary ();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPlanetNamespace::getPlanetTravelCost (JNIEnv* const /*env*/, jobject /*self*/, jstring jstring_planetName1, jstring jstring_planetName2)
{
//-- get planet 1 name
JavaStringParam javaStringParam_planetName1 (jstring_planetName1);
std::string planetName1;
if (!JavaLibrary::convert (javaStringParam_planetName1, planetName1))
{
DEBUG_WARNING (true, ("getPlanetTravelCost (): DB failed to convert parameter 1 (planetName1) to string"));
return 0;
}
//-- get planet 2 name
JavaStringParam javaStringParam_planetName2 (jstring_planetName2);
std::string planetName2;
if (!JavaLibrary::convert (javaStringParam_planetName2, planetName2))
{
DEBUG_WARNING (true, ("getPlanetTravelCost (): DB failed to convert parameter 2 (planetName2) to string"));
return 0;
}
//-- find and return the cost
int cost;
if (!TravelManager::getPlanetSingleHopCost (planetName1, planetName2, cost))
{
DEBUG_WARNING (true, ("getPlanetTravelCost (): DB could not get the cost between planet %s and planet %s", planetName1.c_str (), planetName2.c_str ()));
return 0;
}
return cost;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlanetNamespace::enterClientTicketPurchaseMode (JNIEnv* /*env*/, jobject /*self*/, jlong jobject_player, jstring jstring_planetName, jstring jstring_travelPointName, jboolean instantTravel)
{
//-- get the player object
ServerObject* player = 0;
if (!JavaLibrary::getObject (jobject_player, player))
{
DEBUG_WARNING (true, ("enterClientTicketPurchaseMode (): DB could not find player object"));
return JNI_FALSE;
}
//-- get the client associated with the player
Client* const client = player->getClient ();
if (!client)
{
DEBUG_WARNING (true, ("enterClientTicketPurchaseMode (): PB could get the player's client object"));
return JNI_FALSE;
}
//-- make sure we have a valid planet name
JavaStringParam javaStringParam_planetName (jstring_planetName);
std::string planetName;
if (!JavaLibrary::convert (javaStringParam_planetName, planetName))
{
DEBUG_WARNING (true, ("enterClientTicketPurchaseMode (): DB failed to convert parameter 2 (planetName) to string"));
return JNI_FALSE;
}
//-- make sure we have a valid travel point name
JavaStringParam javaStringParam_travelPointName (jstring_travelPointName);
std::string travelPointName;
if (!JavaLibrary::convert (javaStringParam_travelPointName, travelPointName))
{
DEBUG_WARNING (true, ("enterClientTicketPurchaseMode (): DB failed to convert parameter 3 (travelPointName) to string"));
return JNI_FALSE;
}
//-- send the message to the client
EnterTicketPurchaseModeMessage const msg(planetName, travelPointName, instantTravel == JNI_TRUE);
client->send(msg, true);
return JNI_TRUE;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPlanetNamespace::isAreaTooFullForTravel (JNIEnv* const /*env*/, jobject /*self*/, jstring planetName_j, jint x, jint z)
{
std::string planetName;
JavaStringParam planetName_jsp (planetName_j);
if (!JavaLibrary::convert (planetName_jsp, planetName))
{
WARNING(true,("isAreaTooFullForTravel could not convert the planet name to string"));
return JNI_TRUE; // invalid locations are always too full
}
int const population = ServerUniverse::getInstance().getPopulationAtLocation(planetName, x, z);
if (population > ConfigServerGame::getMaxPopulationForNewbieTravel())
return JNI_TRUE;
else
return JNI_FALSE;
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsPlanetNamespace::getBuildoutAreaName( JNIEnv *const /*env*/, jobject /*self*/, const jfloat x, const jfloat z, const jstring sceneId_j )
{
std::string sceneId;
JavaStringParam sceneId_jsp (sceneId_j);
if (!JavaLibrary::convert (sceneId_jsp, sceneId))
{
WARNING(true,("getBuildoutAreaName could not convert the scene id to string"));
return 0;
}
const BuildoutArea * const area = SharedBuildoutAreaManager::findBuildoutAreaAtPosition(sceneId.c_str(), x, z, false );
return area ? JavaString( area->areaName ).getReturnValue() : 0;
}
// ----------------------------------------------------------------------
jfloatArray JNICALL ScriptMethodsPlanetNamespace::getBuildoutAreaSizeAndCenter(JNIEnv *const /*env*/, jobject /*self*/, const jfloat x, const jfloat z, const jstring sceneId_j, const jboolean ignoreInternal, const jboolean allowComposite)
{
std::string sceneId;
JavaStringParam sceneId_jsp (sceneId_j);
if (!JavaLibrary::convert (sceneId_jsp, sceneId))
{
WARNING(true,("getBuildoutAreaSizeAndCenter could not convert the scene id to string"));
return 0;
}
const BuildoutArea * const area = SharedBuildoutAreaManager::findBuildoutAreaAtPosition(sceneId.c_str(), x, z, (ignoreInternal == JNI_TRUE));
if (!area)
return 0;
LocalFloatArrayRefPtr valueArray = createNewFloatArray(static_cast<jsize>(4));
if (valueArray == LocalFloatArrayRef::cms_nullPtr)
{
return 0;
}
Vector2d areaSize = area->getSize(allowComposite == JNI_TRUE);
jfloat value = static_cast<jfloat>(areaSize.x);
setFloatArrayRegion(*valueArray, 0, 1, &value);
value = static_cast<jfloat>(areaSize.y);
setFloatArrayRegion(*valueArray, 1, 1, &value);
value = static_cast<jfloat>(area->getXCenterPoint(allowComposite == JNI_TRUE));
setFloatArrayRegion(*valueArray, 2, 1, &value);
value = static_cast<jfloat>(area->getZCenterPoint(allowComposite == JNI_TRUE));
setFloatArrayRegion(*valueArray, 3, 1, &value);
return valueArray->getReturnValue();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPlanetNamespace::requestSameServer(JNIEnv *env, jobject self, jlong object1, jlong object2)
{
ServerObject const * serverObject1 = 0;
if (!JavaLibrary::getObject(object1, serverObject1))
{
WARNING(true, ("requestSameServer - could not find object %s", NetworkId(object1).getValueString().c_str()));
return;
}
ServerObject const * serverObject2 = 0;
if (!JavaLibrary::getObject(object2, serverObject2))
{
WARNING(true, ("requestSameServer - could not find object %s", NetworkId(object2).getValueString().c_str()));
return;
}
GenericValueTypeMessage<std::pair<NetworkId, NetworkId> > const rssMessage(
"RequestSameServer",
std::make_pair(serverObject1->getNetworkId(), serverObject2->getNetworkId()));
GameServer::getInstance().sendToPlanetServer(rssMessage);
}
// ======================================================================
@@ -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 <unordered_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::unordered_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)));
}
// ======================================================================
@@ -0,0 +1,815 @@
// ScriptMethodsPlayerQuest.cpp
// Copyright 2009, Sony Online Entertainment Inc., all rights reserved.
// Author: Matt Boudreaux
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureController.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/PlayerQuestObject.h"
#include "serverGame/PlanetObject.h"
#include "serverGame/ServerObject.h"
#include "serverScript/JavaLibrary.h"
#include "sharedGame/TextManager.h"
#include "sharedNetworkMessages/MessageQueueGenericValueType.h"
#include "UnicodeUtils.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsPlayerQuest
// ======================================================================
namespace ScriptMethodsPlayerQuestNamespace
{
bool install();
//jlong createPlayerQuestObjectInDatapad(JNIEnv * env, jobject self, jlong creature);
jlong createPlayerQuestObjectInInventory(JNIEnv * env, jobject self, jlong creature);
jboolean addPlayerQuestTask(JNIEnv * env, jobject self, jlong quest, jstring title, jstring desc, jint counter, jobject waypointLocation);
jobjectArray getPlayerQuestTasks(JNIEnv * env, jobject self, jlong quest);
jintArray getAllPlayerQuestTaskStatus(JNIEnv * env, jobject self, jlong quest);
jint getPlayerQuestTaskStatus(JNIEnv * env, jobject self, jlong quest, jint taskIndex);
void setPlayerQuestTaskStatus(JNIEnv * env, jobject self, jlong quest, jint taskIndex, jint status);
jboolean setPlayerQuestTitle(JNIEnv * env, jobject self, jlong quest, jstring title);
jboolean setPlayerQuestDescription(JNIEnv * env, jobject self, jlong quest, jstring desc);
void setPlayerQuestDifficulty(JNIEnv * env, jobject self, jlong quest, jint difficulty);
jint getPlayerQuestDifficulty(JNIEnv * env, jobject self, jlong quest);
jint getPlayerQuestTaskCounter(JNIEnv * env, jobject self, jlong quest, jint index);
void setPlayerQuestTaskCounter(JNIEnv * env, jobject self, jlong quest, jint index, jint value);
jobject getPlayerQuestWaypoint(JNIEnv * env, jobject self, jlong quest, jint index);
jboolean isPlayerQuestTaskComplete(JNIEnv * env, jobject self, jlong quest, jint index);
jboolean isPlayerQuestComplete(JNIEnv * env, jobject self, jlong quest);
jobject getPlayerQuestTitle(JNIEnv * env, jobject self, jlong quest);
jobject getPlayerQuestDescription(JNIEnv * env, jobject self, jlong quest);
jobject getPlayerQuestTaskTitle(JNIEnv * env, jobject self, jlong quest, jint index);
jobject getPlayerQuestTaskDescription(JNIEnv * env, jobject self, jlong quest, jint index);
//void setPlayerQuestWaypoint(JNIEnv * env, jobject self, jlong quest, jint index, jobject loc);
void setPlayerQuestRecipe(JNIEnv * env, jobject self, jlong quest, jboolean recipe);
jboolean isPlayerQuestRecipe(JNIEnv * env, jobject self, jlong quest);
void addPlayerQuestTaskRecipeData(JNIEnv * env, jobject self, jlong quest, jstring data);
void addPlayerQuestTaskRecipeDataWithIndex(JNIEnv * env, jobject self, jlong quest, jint index, jstring data);
void setPlayerQuestRewardData(JNIEnv * env, jobject self, jlong quest, jstring data);
void setPlayerQuestCreator(JNIEnv * env, jobject self, jlong quest, jlong creator);
jstring filterText(JNIEnv * env, jobject self, jstring text);
void openPlayerQuestRecipe(JNIEnv * env, jobject self, jlong player, jlong recipe);
void resetAllPlayerQuestData(JNIEnv * env, jobject self, jlong quest);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsPlayerQuestNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsPlayerQuestNamespace::c)}
//JF("_createPlayerQuestObjectInDatapad", "(J)J", createPlayerQuestObjectInDatapad),
JF("_createPlayerQuestObjectInInventory", "(J)J", createPlayerQuestObjectInInventory),
JF("_addPlayerQuestTask", "(JLjava/lang/String;Ljava/lang/String;ILscript/location;)Z", addPlayerQuestTask),
JF("_getPlayerQuestTasks", "(J)[Ljava/lang/String;", getPlayerQuestTasks),
JF("_getAllPlayerQuestTaskStatus", "(J)[I", getAllPlayerQuestTaskStatus),
JF("_getPlayerQuestTaskStatus", "(JI)I", getPlayerQuestTaskStatus),
JF("_setPlayerQuestTaskStatus", "(JII)V", setPlayerQuestTaskStatus),
JF("_setPlayerQuestTitle", "(JLjava/lang/String;)Z", setPlayerQuestTitle),
JF("_setPlayerQuestDescription", "(JLjava/lang/String;)Z", setPlayerQuestDescription),
JF("_setPlayerQuestDifficulty", "(JI)V", setPlayerQuestDifficulty),
JF("_getPlayerQuestDifficulty", "(J)I", getPlayerQuestDifficulty),
JF("_getPlayerQuestTaskCounter", "(JI)I", getPlayerQuestTaskCounter),
JF("_setPlayerQuestTaskCounter", "(JII)V", setPlayerQuestTaskCounter),
JF("_getPlayerQuestWaypoint", "(JI)Ljava/lang/String;", getPlayerQuestWaypoint),
JF("_isPlayerQuestTaskComplete", "(JI)Z", isPlayerQuestTaskComplete),
JF("_isPlayerQuestComplete", "(J)Z", isPlayerQuestComplete),
//JF("_setPlayerQuestWaypoint", "(JILscript/location;)V", setPlayerQuestWaypoint)
JF("_getPlayerQuestTitle", "(J)Ljava/lang/String;", getPlayerQuestTitle),
JF("_getPlayerQuestDescription", "(J)Ljava/lang/String;", getPlayerQuestDescription),
JF("_getPlayerQuestTaskTitle", "(JI)Ljava/lang/String;", getPlayerQuestTaskTitle),
JF("_getPlayerQuestTaskDescription", "(JI)Ljava/lang/String;", getPlayerQuestTaskDescription),
JF("_setPlayerQuestRecipe", "(JZ)V", setPlayerQuestRecipe),
JF("_isPlayerQuestRecipe", "(J)Z", isPlayerQuestRecipe),
JF("_addPlayerQuestTaskRecipeData", "(JLjava/lang/String;)V", addPlayerQuestTaskRecipeData),
JF("_addPlayerQuestTaskRecipeDataWithIndex", "(JILjava/lang/String;)V", addPlayerQuestTaskRecipeDataWithIndex),
JF("_setPlayerQuestRewardData", "(JLjava/lang/String;)V", setPlayerQuestRewardData),
JF("_setPlayerQuestCreator", "(JJ)V", setPlayerQuestCreator),
JF("filterText", "(Ljava/lang/String;)Ljava/lang/String;", filterText),
JF("_openPlayerQuestRecipe", "(JJ)V", openPlayerQuestRecipe),
JF("_resetAllPlayerQuestData", "(J)V", resetAllPlayerQuestData),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//jlong ScriptMethodsPlayerQuestNamespace::createPlayerQuestObjectInDatapad(JNIEnv * env, jobject self, jlong creature)
//{
// UNREF(env);
// UNREF(self);
// UNREF(creature);
//
// CreatureObject * creatureObj = 0;
// if(JavaLibrary::getObject(creature, creatureObj))
// {
// PlayerQuestObject * questObject = PlayerQuestObject::createPlayerQuestObjectInCreatureDatapad(creatureObj);
// if(questObject)
// {
// return questObject->getNetworkId().getValue();
// }
// }
// return 0;
//}
jlong ScriptMethodsPlayerQuestNamespace::createPlayerQuestObjectInInventory(JNIEnv * env, jobject self, jlong creature)
{
UNREF(env);
UNREF(self);
UNREF(creature);
CreatureObject * creatureObj = 0;
if(JavaLibrary::getObject(creature, creatureObj))
{
PlayerQuestObject * questObject = PlayerQuestObject::createPlayerQuestObjectInCreatureInventory(creatureObj);
if(questObject)
{
return questObject->getNetworkId().getValue();
}
}
return 0;
}
jboolean ScriptMethodsPlayerQuestNamespace::addPlayerQuestTask(JNIEnv * env, jobject self, jlong quest, jstring title, jstring desc, jint counter, jobject waypointLocation)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("AddPlayerQuestTask: Could not get valid Player Quest Object from OID: %d", quest));
return JNI_FALSE;
}
Vector waypointVec;
std::string sceneId;
if (!ScriptConversion::convertWorld(waypointLocation, waypointVec, sceneId))
{
// NULL or Invalid Location passed in. That's fine, just means no waypoint.
if(questObject)
{
std::string titleString;
if(!JavaLibrary::convert(JavaString(title), titleString))
{
WARNING(true, ("AddPlayerQuestTask: Failed to localize title string."));
return JNI_FALSE;
}
std::string descString;
if(!JavaLibrary::convert(JavaString(desc), descString))
{
WARNING(true, ("AddPlayerQuestTask: Failed to localize description string."));
return JNI_FALSE;
}
questObject->addNewTask(titleString, descString, counter, std::string());
return JNI_TRUE;
}
return JNI_FALSE;
}
std::string formatedWaypoint;
char buffer[256];
memset(buffer, 0, 256);
sprintf(buffer, "%f %f %f %s", waypointVec.x, waypointVec.y, waypointVec.z, sceneId.c_str());
formatedWaypoint = buffer;
if(questObject)
{
std::string titleString;
if(!JavaLibrary::convert(JavaString(title), titleString))
{
WARNING(true, ("AddPlayerQuestTask: Failed to localize title string."));
return JNI_FALSE;
}
std::string descString;
if(!JavaLibrary::convert(JavaString(desc), descString))
{
WARNING(true, ("AddPlayerQuestTask: Failed to localize description string."));
return JNI_FALSE;
}
questObject->addNewTask(titleString, descString, counter, formatedWaypoint);
return JNI_TRUE;
}
return JNI_FALSE;
}
jobjectArray ScriptMethodsPlayerQuestNamespace::getPlayerQuestTasks(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestTasks: Could not get valid Player Quest Object from OID: %d", quest));
return 0;
}
std::vector<Unicode::String> taskVector;
questObject->getTasks(taskVector);
LocalObjectArrayRefPtr valueArray = createNewObjectArray(taskVector.size(), JavaLibrary::getClsString());
for (std::vector<Unicode::String>::size_type i = 0; i < taskVector.size(); ++i)
{
JavaString jval(Unicode::wideToNarrow(taskVector[i]));
setObjectArrayElement(*valueArray, i, jval);
}
return valueArray->getReturnValue();
}
jintArray ScriptMethodsPlayerQuestNamespace::getAllPlayerQuestTaskStatus(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getAllPlayerQuestTaskStatus: Could not get valid Player Quest Object from OID: %d", quest));
return 0;
}
std::vector<int> taskStatus;
questObject->getTaskStatus(taskStatus);
LocalIntArrayRefPtr idArray = createNewIntArray(taskStatus.size());
if (idArray == LocalIntArrayRef::cms_nullPtr)
{
if (env->ExceptionCheck())
env->ExceptionDescribe();
return 0;
}
std::vector<int>::iterator iter = taskStatus.begin();
int count = 0;
for (; iter != taskStatus.end(); ++iter)
{
jint jintTemp = (*iter);
setIntArrayRegion(*idArray, count, 1, &jintTemp);
++count;
}
return idArray->getReturnValue();
}
jint ScriptMethodsPlayerQuestNamespace::getPlayerQuestTaskStatus(JNIEnv * env, jobject self, jlong quest, jint taskIndex)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestTaskStatus: Could not get valid Player Quest Object from OID: %d", quest));
return 0;
}
return questObject->getTaskStatus(taskIndex);
}
void ScriptMethodsPlayerQuestNamespace::setPlayerQuestTaskStatus(JNIEnv * env, jobject self, jlong quest, jint taskIndex, jint status)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestTaskStatus: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
questObject->setTaskStatus(taskIndex, status);
}
jboolean ScriptMethodsPlayerQuestNamespace::setPlayerQuestTitle(JNIEnv * env, jobject self, jlong quest, jstring title)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestTitle: Could not get valid Player Quest Object from OID: %d", quest));
return JNI_FALSE;
}
if(questObject)
{
std::string titleString;
if(!JavaLibrary::convert(JavaString(title), titleString))
{
WARNING(true, ("setPlayerQuestTitle: Failed to localize task string."));
return JNI_FALSE;
}
questObject->setQuestTitle(titleString);
return JNI_TRUE;
}
return JNI_FALSE;
}
jboolean ScriptMethodsPlayerQuestNamespace::setPlayerQuestDescription(JNIEnv * env, jobject self, jlong quest, jstring desc)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestDescription: Could not get valid Player Quest Object from OID: %d", quest));
return JNI_FALSE;
}
if(questObject)
{
std::string descString;
if(!JavaLibrary::convert(JavaString(desc), descString))
{
WARNING(true, ("setPlayerQuestDescription: Failed to localize task string."));
return JNI_FALSE;
}
questObject->setQuestDescription(descString);
return JNI_TRUE;
}
return JNI_FALSE;
}
void ScriptMethodsPlayerQuestNamespace::setPlayerQuestDifficulty(JNIEnv * env, jobject self, jlong quest, jint difficulty)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestDifficulty: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
if(questObject)
{
questObject->setQuestDifficulty(difficulty);
}
return;
}
jint ScriptMethodsPlayerQuestNamespace::getPlayerQuestDifficulty(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestDifficulty: Could not get valid Player Quest Object from OID: %d", quest));
return -1;
}
if(questObject)
return questObject->getQuestDifficulty();
return -1;
}
jint ScriptMethodsPlayerQuestNamespace::getPlayerQuestTaskCounter(JNIEnv * env, jobject self, jlong quest, jint index)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestTaskCounter: Could not get valid Player Quest Object from OID: %d", quest));
return -1;
}
if(questObject)
{
if(index < 0 || index > questObject->getTotalTasks())
{
WARNING(true, ("getPlayerQuestTaskCounter: index passed in was invalid. Index = %d Current number of Tasks = %d", index, questObject->getTotalTasks()));
return -1;
}
return questObject->getTaskCounter(index);
}
return -1;
}
void ScriptMethodsPlayerQuestNamespace::setPlayerQuestTaskCounter(JNIEnv * env, jobject self, jlong quest, jint index, jint value)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestTaskCounter: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
if(questObject)
{
if(index < 0 || index > questObject->getTotalTasks())
{
WARNING(true, ("setPlayerQuestTaskCounter: index passed in was invalid. Index = %d Current number of Tasks = %d", index, questObject->getTotalTasks()));
return;
}
questObject->setTaskCounter(index, value);
}
return;
}
jobject ScriptMethodsPlayerQuestNamespace::getPlayerQuestWaypoint(JNIEnv * env, jobject self, jlong quest, jint index)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestWaypoint: Could not get valid Player Quest Object from OID: %d", quest));
return NULL;
}
if(questObject)
{
JavaString jString(questObject->getWaypoint(index));
return jString.getReturnValue();
}
return NULL;
}
jboolean ScriptMethodsPlayerQuestNamespace::isPlayerQuestTaskComplete(JNIEnv * env, jobject self, jlong quest, jint index)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("isPlayerQuestTaskComplete: Could not get valid Player Quest Object from OID: %d", quest));
return JNI_FALSE;
}
if(questObject)
{
if(questObject->getTaskStatus(index) == 2) // Not a magic number, it's defined in the Base_class.java file
return JNI_TRUE;
}
return JNI_FALSE;
}
jboolean ScriptMethodsPlayerQuestNamespace::isPlayerQuestComplete(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("isPlayerQuestComplete: Could not get valid Player Quest Object from OID: %d", quest));
return JNI_FALSE;
}
if(questObject)
{
if(questObject->isCompleted())
return JNI_TRUE;
}
return JNI_FALSE;
}
jobject ScriptMethodsPlayerQuestNamespace::getPlayerQuestTitle(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestTitle: Could not get valid Player Quest Object from OID: %d", quest));
return NULL;
}
if(questObject)
{
JavaString returnVal(questObject->getQuestTitle().c_str());
return returnVal.getReturnValue();
}
return NULL;
}
jobject ScriptMethodsPlayerQuestNamespace::getPlayerQuestDescription(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestDescription: Could not get valid Player Quest Object from OID: %d", quest));
return NULL;
}
if(questObject)
{
JavaString returnVal(questObject->getQuestDescription().c_str());
return returnVal.getReturnValue();
}
return NULL;
}
jobject ScriptMethodsPlayerQuestNamespace::getPlayerQuestTaskTitle(JNIEnv * env, jobject self, jlong quest, jint index)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestTaskTitle: Could not get valid Player Quest Object from OID: %d", quest));
return NULL;
}
if(questObject)
{
JavaString returnVal(questObject->getTaskTitle(index).c_str());
return returnVal.getReturnValue();
}
return NULL;
}
jobject ScriptMethodsPlayerQuestNamespace::getPlayerQuestTaskDescription(JNIEnv * env, jobject self, jlong quest, jint index)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("getPlayerQuestTaskDescription: Could not get valid Player Quest Object from OID: %d", quest));
return NULL;
}
if(questObject)
{
JavaString returnVal(questObject->getTaskDescription(index).c_str());
return returnVal.getReturnValue();
}
return NULL;
}
void ScriptMethodsPlayerQuestNamespace::setPlayerQuestRecipe(JNIEnv * env, jobject self, jlong quest, jboolean recipe)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestRecipe: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
if(questObject)
{
questObject->setRecipe(recipe == JNI_TRUE ? true : false);
}
}
jboolean ScriptMethodsPlayerQuestNamespace::isPlayerQuestRecipe(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("isPlayerQuestRecipe: Could not get valid Player Quest Object from OID: %d", quest));
return JNI_FALSE;
}
if(questObject)
{
return questObject->isRecipe() ? JNI_TRUE : JNI_FALSE;
}
return JNI_FALSE;
}
void ScriptMethodsPlayerQuestNamespace::addPlayerQuestTaskRecipeData(JNIEnv * env, jobject self, jlong quest, jstring data)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("addPlayerQuestTaskRecipeData: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
std::string dataString;
if(!JavaLibrary::convert(JavaString(data), dataString))
{
WARNING(true, ("addPlayerQuestTaskRecipeData: Failed to localize data string."));
return;
}
if(questObject)
{
questObject->addRecipeTaskData(dataString);
}
return;
}
void ScriptMethodsPlayerQuestNamespace::addPlayerQuestTaskRecipeDataWithIndex(JNIEnv * env, jobject self, jlong quest, jint index, jstring data)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("addPlayerQuestTaskRecipeDataWithIndex: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
std::string dataString;
if(!JavaLibrary::convert(JavaString(data), dataString))
{
WARNING(true, ("addPlayerQuestTaskRecipeDataWithIndex: Failed to localize data string."));
return;
}
if(questObject)
{
questObject->setRecipeTaskData(index, dataString);
}
return;
}
void ScriptMethodsPlayerQuestNamespace::setPlayerQuestRewardData(JNIEnv * env, jobject self, jlong quest, jstring data)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestRewardData: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
std::string dataString;
if(!JavaLibrary::convert(JavaString(data), dataString))
{
WARNING(true, ("setPlayerQuestRewardData: Failed to localize data string."));
return;
}
if(questObject)
{
questObject->setRewards(dataString);
}
return;
}
void ScriptMethodsPlayerQuestNamespace::setPlayerQuestCreator(JNIEnv * env, jobject self, jlong quest, jlong creator)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * questObject;
if(!JavaLibrary::getObject(quest, questObject))
{
WARNING(true, ("setPlayerQuestCreator: Could not get valid Player Quest Object from OID: %d", quest));
return;
}
ServerObject * creatorObject;
if(!JavaLibrary::getObject(creator, creatorObject))
{
WARNING(true, ("setPlayerQuestCreator: Could not get valid Player Object from OID: %d", creator));
return;
}
if(questObject && creatorObject)
{
questObject->setCreator(creatorObject->getNetworkId());
}
}
jstring ScriptMethodsPlayerQuestNamespace::filterText(JNIEnv * env, jobject self, jstring text)
{
UNREF(env);
UNREF(self);
std::string textString;
if(!JavaLibrary::convert(JavaString(text), textString))
{
WARNING(true, ("filterText: Failed to convert string."));
std::string empty = "";
JavaString jval(empty);
return jval.getReturnValue();
}
Unicode::String filteredString = TextManager::filterText( Unicode::narrowToWide(textString) );
std::string narrowFilter = Unicode::wideToNarrow(filteredString);
JavaString jval(narrowFilter);
return jval.getReturnValue();
}
void ScriptMethodsPlayerQuestNamespace::openPlayerQuestRecipe(JNIEnv * env, jobject self, jlong player, jlong recipe)
{
UNREF(env);
UNREF(self);
CreatureObject * playerCreature = NULL;
if (!JavaLibrary::getObject(player, playerCreature))
{
DEBUG_WARNING(true, ("openPlayerQuestRecipe: Failed to get valid creature object with OID %d", player));
return;
}
ServerObject * recipeObj = NULL;
if (!JavaLibrary::getObject(recipe, recipeObj))
{
DEBUG_WARNING(true, ("openPlayerQuestRecipe: Failed to get valid recipe object with OID %d", player));
return;
}
if (playerCreature->isPlayerControlled() && playerCreature->getController() != NULL)
{
playerCreature->getController()->appendMessage(
static_cast<int>(CM_openRecipe),
0,
new MessageQueueGenericValueType< NetworkId >( recipeObj->getNetworkId() ),
GameControllerMessageFlags::SEND |
GameControllerMessageFlags::RELIABLE |
GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
return;
}
void ScriptMethodsPlayerQuestNamespace::resetAllPlayerQuestData(JNIEnv * env, jobject self, jlong quest)
{
UNREF(env);
UNREF(self);
PlayerQuestObject * playerQuest = NULL;
if (!JavaLibrary::getObject(quest, playerQuest))
{
DEBUG_WARNING(true, ("resetAllPlayerQuestData: Failed to get valid recipe object with OID %d", quest));
return;
}
if(playerQuest)
playerQuest->resetAllData();
return;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,731 @@
// ======================================================================
//
// 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 = NULL;
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 NULL;
}
}
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<int>(quest->getId()) : 0;
}
// ---------------------------------------------------------------------
jstring JNICALL ScriptMethodsQuestNamespace::questGetQuestName(JNIEnv *, jobject, jint questId)
{
std::string const questName = QuestManager::getQuestName(static_cast<uint32>(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<uint32>(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<uint32>(questId));
JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId));
return static_cast<int>(result);
}
else
return static_cast<int>(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<uint32>(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<jint>(PlayerObject::QR_noSuchPlayer);
//send down the loot info
Quest const * const q = QuestManager::getQuest(questId);
if(q)
{
std::vector<std::string> const & inclusiveStaticLootItems = q->getInclusiveStaticLootItemNames();
for(std::vector<std::string>::const_iterator it = inclusiveStaticLootItems.begin(); it != inclusiveStaticLootItems.end(); ++it)
{
StaticLootItemManager::sendDataToClient(NetworkId(playerId), *it);
}
std::vector<std::string> const & exclusiveStaticLootItems = q->getExclusiveStaticLootItemNames();
for(std::vector<std::string>::const_iterator it2 = exclusiveStaticLootItems.begin(); it2 != exclusiveStaticLootItems.end(); ++it2)
{
StaticLootItemManager::sendDataToClient(NetworkId(playerId), *it2);
}
}
PlayerObject::QuestResult result = playerObject->questActivateQuest(static_cast<uint32>(questId), NetworkId(questGiver));
JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId));
return static_cast<int>(result);
}
// ---------------------------------------------------------------------
jint JNICALL ScriptMethodsQuestNamespace::questCompleteQuest(JNIEnv *, jobject, jint questId, jlong playerId)
{
PlayerObject * const playerObject = getPlayerForCharacter(playerId);
if (!playerObject)
return static_cast<int>(PlayerObject::QR_noSuchPlayer);
PlayerObject::QuestResult result = playerObject->questCompleteQuest(static_cast<uint32>(questId));
JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questId));
return static_cast<int>(result);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsQuestNamespace::questClearQuest(JNIEnv *, jobject, jint questId, jlong playerId)
{
PlayerObject * const playerObject = getPlayerForCharacter(playerId);
if (playerObject)
playerObject->questClearQuest(static_cast<uint32>(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<uint32>(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<uint32>(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<int>(result);
}
else
return static_cast<int>(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<uint32>(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<int>(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<uint32>(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<int>(result);
}
// ---------------------------------------------------------------------
jint JNICALL ScriptMethodsQuestNamespace::questCompleteTask(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId)
{
PlayerObject * const playerObject = getPlayerForCharacter(playerId);
if (!playerObject)
return static_cast<int>(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<uint32>(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<int>(result);
}
// ---------------------------------------------------------------------
jint JNICALL ScriptMethodsQuestNamespace::questFailTask(JNIEnv *, jobject, jint questId, jint taskId, jlong playerId)
{
PlayerObject * const playerObject = getPlayerForCharacter(playerId);
if (!playerObject)
return static_cast<int>(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<uint32>(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<int>(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<uint32>(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() : NULL;
Controller * const controller = creatureObject ? creatureObject->getController() : NULL;
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<int>(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() : NULL;
Controller * const controller = creatureObject ? creatureObject->getController() : NULL;
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<int>(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() : NULL;
Controller * const controller = creatureObject ? creatureObject->getController() : NULL;
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<int>(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<uint32>(questCrc)))
{
return;
}
CreatureObject * playerCreature = NULL;
if (JavaLibrary::getObject(playerId, playerCreature) && playerCreature)
{
Quest const * const q = QuestManager::getQuest(questCrc);
if(q)
{
std::vector<std::string> const & inclusiveStaticLootItems = q->getInclusiveStaticLootItemNames();
for(std::vector<std::string>::const_iterator it = inclusiveStaticLootItems.begin(); it != inclusiveStaticLootItems.end(); ++it)
{
StaticLootItemManager::sendDataToClient(NetworkId(playerId), *it);
}
std::vector<std::string> const & exclusiveStaticLootItems = q->getExclusiveStaticLootItemNames();
for(std::vector<std::string>::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<uint32>(questCrc), NetworkId(questGiver));
JAVA_THROW_SCRIPT_EXCEPTION(result==PlayerObject::QR_noSuchQuest,("Requested quest %i, which could not be found.", questCrc));
MessageQueueGenericValueType<int> * const msg = new MessageQueueGenericValueType<int>(static_cast<int>(questCrc));
Controller * const controller = playerCreature->getController();
if(controller)
{
controller->appendMessage(static_cast<int>(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<int> * const msg = new MessageQueueGenericValueType<int>(static_cast<int>(questCrc));
controller->appendMessage(static_cast<int>(CM_requestActivateQuest), 0.0f, msg, GameControllerMessageFlags::SEND | GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT);
}
}
else
{
PlayerObject::QuestResult result = playerObject->questActivateQuest(static_cast<uint32>(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<uint32>(questCrc)))
{
return;
}
CreatureObject * playerCreature = NULL;
if (JavaLibrary::getObject(playerId, playerCreature) && playerCreature)
{
Quest const * const q = QuestManager::getQuest(questCrc);
if(q)
{
PlayerObject::QuestResult result = playerObject->questCompleteQuest(static_cast<uint32>(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<MessageQueueCyberneticsOpen::OpenType>(openType);
CreatureObject * npc = NULL;
if (!JavaLibrary::getObject(npcId, npc))
return;
if(!npc)
return;
CreatureObject * playerCreature = NULL;
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<int> questIds = playerObject->questGetAllActiveQuestIds();
LocalIntArrayRefPtr results = createNewIntArray(static_cast<int>(questIds.size()));
setIntArrayRegion(*results, 0 , static_cast<int>(questIds.size()), reinterpret_cast<jint*>(&(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<int> questIds = playerObject->questGetAllCompletedQuestIds();
LocalIntArrayRefPtr results = createNewIntArray(static_cast<int>(questIds.size()));
setIntArrayRegion(*results, 0 , static_cast<int>(questIds.size()), reinterpret_cast<jint*>(&(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<const Unicode::String *> keyStrings;
getStringArray(LocalObjectArrayRefParam(keys), keyStrings);
std::vector<const Unicode::String *> 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<Unicode::String> flattenedDictionary;
flattenedDictionary.reserve(keyStrings.size() * 2);
//put everything in it
Unicode::String s;
for(std::vector<const Unicode::String *>::const_iterator i = keyStrings.begin(); i != keyStrings.end(); ++i)
{
s = **i;
flattenedDictionary.push_back(s);
}
for(std::vector<const Unicode::String *>::const_iterator i2 = valueStrings.begin(); i2 != valueStrings.end(); ++i2)
{
s = **i2;
flattenedDictionary.push_back(s);
}
//send to player
CreatureObject * playerCreature = NULL;
if (JavaLibrary::getObject(playerId, playerCreature))
{
Controller * const playerController = playerCreature->getController();
if(playerController)
{
MessageQueueGenericValueType<std::vector<Unicode::String> > * const msg = new MessageQueueGenericValueType<std::vector<Unicode::String> >(flattenedDictionary);
playerController->appendMessage(static_cast<int>(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<NetworkId> objectIds;
if (!ScriptConversion::convert(newObjects, objectIds))
return;
//send to player
CreatureObject * playerCreature = NULL;
if (JavaLibrary::getObject(playerId, playerCreature))
{
Controller * const playerController = playerCreature->getController();
if(playerController)
{
MessageQueueGenericValueType<std::vector<NetworkId> > * const msg = new MessageQueueGenericValueType<std::vector<NetworkId> >(objectIds);
playerController->appendMessage(static_cast<int>(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;
}
// ======================================================================
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,275 @@
// ======================================================================
//
// ScriptMethodsRegion3d.cpp
//
// Copyright 2003 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/Region3d.h"
#include "serverGame/Region3dMaster.h"
#include "serverGame/RegionBox.h"
#include "serverGame/RegionSphere.h"
#include "serverScript/ScriptParameters.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsRegion3dNamespace
// ======================================================================
namespace ScriptMethodsRegion3dNamespace
{
bool install();
ScriptParams *convertRegionDictionaryToScriptParams(jobject regionDictionary);
jobject JNICALL get3dRegionByName(JNIEnv *env, jobject self, jstring regionName);
jobject JNICALL getSmallest3dRegionAtPoint(JNIEnv *env, jobject self, jobject location);
jobjectArray JNICALL get3dRegionsAtPoint(JNIEnv *env, jobject self, jobject location);
void JNICALL createSphereRegion(JNIEnv *env, jobject self, jstring regionName, jobject centerJ, jfloat radius, jobject regionDictionary);
void JNICALL createBoxRegion(JNIEnv *env, jobject self, jstring regionName, jobject extentMinJ, jobject extentMaxJ, jobject regionDictionary);
void JNICALL destroy3dRegion(JNIEnv *env, jobject self, jstring regionName);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsRegion3dNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsRegion3dNamespace::c)}
JF("get3dRegionByName", "(Ljava/lang/String;)Lscript/dictionary;", get3dRegionByName),
JF("getSmallest3dRegionAtPoint", "(Lscript/location;)Lscript/dictionary;", getSmallest3dRegionAtPoint),
JF("get3dRegionsAtPoint", "(Lscript/location;)[Lscript/dictionary;", get3dRegionsAtPoint),
JF("createSphereRegion", "(Ljava/lang/String;Lscript/vector;FLscript/dictionary;)V", createSphereRegion),
JF("createBoxRegion", "(Ljava/lang/String;Lscript/vector;Lscript/vector;Lscript/dictionary;)V", createBoxRegion),
JF("destroy3dRegion", "(Ljava/lang/String;)V", destroy3dRegion),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
static JavaDictionaryPtr get3dRegionScriptDataReturnValue(Region3d const *region)
{
if (region)
{
ScriptParams const *params = region->getRegionScriptData();
if (params)
{
JavaDictionaryPtr dict;
JavaLibrary::instance()->convert(*params, dict);
return dict;
}
}
return JavaDictionary::cms_nullPtr;
}
// ----------------------------------------------------------------------
struct Region3dPtrVolumeComparator
{
bool operator()(Region3d const *lhs, Region3d const *rhs) const
{
return lhs->getVolume() < rhs->getVolume();
}
};
// ======================================================================
ScriptParams *ScriptMethodsRegion3dNamespace::convertRegionDictionaryToScriptParams(jobject regionDictionary)
{
// If we're passed a null dictionary, we just don't have any extra data but
// we still want to return a ScriptParams to fill in the standard values.
if (!regionDictionary)
return new ScriptParams;
LocalRefParam regionDictionaryParam(regionDictionary);
if (!isInstanceOf(regionDictionaryParam, JavaLibrary::getClsDictionary()))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convertRegionDictionaryToScriptParams bad regionDictionary"));
return 0;
}
ScriptParams *regionScriptData = new ScriptParams;
LocalRefPtr keyEnumeration = callObjectMethod(regionDictionaryParam, JavaLibrary::getMidDictionaryKeys());
while (callBooleanMethod(*keyEnumeration, JavaLibrary::getMidEnumerationHasMoreElements()))
{
LocalRefPtr key = callObjectMethod(*keyEnumeration, JavaLibrary::getMidEnumerationNextElement());
if (!isInstanceOf(*key, JavaLibrary::getClsString()))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convertRegionDictionaryToScriptParams regionDictionary has bad key"));
delete regionScriptData;
return 0;
}
JavaStringParam localKeyStr(*key);
std::string keyStr;
JavaLibrary::convert(localKeyStr, keyStr);
LocalRefPtr value = callObjectMethod(regionDictionaryParam, JavaLibrary::getMidDictionaryGet(), key->getValue());
if (isInstanceOf(*value, JavaLibrary::getClsInteger()))
{
jint intValue = callIntMethod(*value, JavaLibrary::getMidIntegerIntValue());
regionScriptData->addParam(intValue, keyStr, true);
}
else if (isInstanceOf(*value, JavaLibrary::getClsFloat()))
{
jfloat floatValue = callFloatMethod(*value, JavaLibrary::getMidFloatFloatValue());
regionScriptData->addParam(floatValue, keyStr, true);
}
else if (isInstanceOf(*value, JavaLibrary::getClsBoolean()))
{
jboolean booleanValue = callBooleanMethod(*value, JavaLibrary::getMidBooleanBooleanValue());
regionScriptData->addParam(booleanValue, keyStr, true);
}
else if (isInstanceOf(*value, JavaLibrary::getClsString()))
{
JavaStringParam localValueStr(*value);
std::string valueStr;
JavaLibrary::convert(localValueStr, valueStr);
char *s = new char[valueStr.size()+1];
strcpy(s, valueStr.c_str());
regionScriptData->addParam(s, keyStr, true);
}
else
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convertRegionDictionaryToScriptParams bad type for regionDictionary value, key=%s", keyStr.c_str()));
delete regionScriptData;
return 0;
}
}
return regionScriptData;
}
// ======================================================================
jobject JNICALL ScriptMethodsRegion3dNamespace::get3dRegionByName(JNIEnv *env, jobject self, jstring regionName)
{
JavaStringParam regionNameParam(regionName);
std::string regionNameString;
if (JavaLibrary::convert(regionNameParam, regionNameString))
return get3dRegionScriptDataReturnValue(Region3dMaster::getRegionByName(regionNameString))->getReturnValue();
return 0;
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsRegion3dNamespace::getSmallest3dRegionAtPoint(JNIEnv *env, jobject self, jobject location)
{
Vector target;
if (ScriptConversion::convertWorld(location, target))
return get3dRegionScriptDataReturnValue(Region3dMaster::getSmallestRegionAtPoint(target))->getReturnValue();
return 0;
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsRegion3dNamespace::get3dRegionsAtPoint(JNIEnv *env, jobject self, jobject location)
{
Vector target;
if (ScriptConversion::convertWorld(location, target))
{
std::vector<Region3d const *> results;
Region3dMaster::getRegionsAtPoint(target, results);
if (!results.empty())
{
std::sort(results.begin(), results.end(), Region3dPtrVolumeComparator());
LocalObjectArrayRefPtr regions = createNewObjectArray(results.size(), JavaLibrary::getClsDictionary());
for (unsigned int i = 0; i < results.size(); ++i)
setObjectArrayElement(*regions, i, *get3dRegionScriptDataReturnValue(results[i]));
return regions->getReturnValue();
}
}
return 0;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsRegion3dNamespace::createSphereRegion(JNIEnv *env, jobject self, jstring regionName, jobject centerJ, jfloat radius, jobject regionDictionary)
{
JavaStringParam localRegionNameStr((jstring)regionName);
std::string regionNameStr;
JavaLibrary::convert(localRegionNameStr, regionNameStr);
Vector center;
if (!ScriptConversion::convert(centerJ, center))
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::createSphereRegion bad center vector, region '%s'", regionNameStr.c_str()));
else if (radius <= 0.0f)
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::createSphereRegion non-positive radius, region '%s'", regionNameStr.c_str()));
else
{
ScriptParams *regionScriptData = convertRegionDictionaryToScriptParams(regionDictionary);
if (regionScriptData)
{
char *s = new char[regionNameStr.size()+1];
strcpy(s, regionNameStr.c_str());
regionScriptData->addParam(s, "regionName", true);
regionScriptData->addParam(0, "geometry", true);
regionScriptData->addParam(center.x, "x1", true);
regionScriptData->addParam(center.y, "y1", true);
regionScriptData->addParam(center.z, "z1", true);
regionScriptData->addParam(static_cast<float>(radius), "radius", true);
IGNORE_RETURN(new RegionSphere(regionNameStr, center, radius, regionScriptData));
}
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsRegion3dNamespace::createBoxRegion(JNIEnv *env, jobject self, jstring regionName, jobject extentMinJ, jobject extentMaxJ, jobject regionDictionary)
{
JavaStringParam localRegionNameStr((jstring)regionName);
std::string regionNameStr;
JavaLibrary::convert(localRegionNameStr, regionNameStr);
Vector extentMin, extentMax;
if (!ScriptConversion::convert(extentMinJ, extentMin))
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::createBoxRegion bad extentMin vector, region '%s'", regionNameStr.c_str()));
else if (!ScriptConversion::convert(extentMaxJ, extentMax))
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::createBoxRegion bad extentMax vector, region '%s'", regionNameStr.c_str()));
else if (extentMax.x <= extentMin.x || extentMax.y <= extentMin.y || extentMax.z <= extentMin.z)
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::createBoxRegion has inverted coordinates, region '%s'", regionNameStr.c_str()));
else
{
ScriptParams *regionScriptData = convertRegionDictionaryToScriptParams(regionDictionary);
if (regionScriptData)
{
char *s = new char[regionNameStr.size()+1];
strcpy(s, regionNameStr.c_str());
regionScriptData->addParam(s, "regionName", true);
regionScriptData->addParam(1, "geometry", true);
regionScriptData->addParam(extentMin.x, "x1", true);
regionScriptData->addParam(extentMin.y, "y1", true);
regionScriptData->addParam(extentMin.z, "z1", true);
regionScriptData->addParam(extentMax.x, "x2", true);
regionScriptData->addParam(extentMax.y, "y2", true);
regionScriptData->addParam(extentMax.z, "z2", true);
IGNORE_RETURN(new RegionBox(regionNameStr, extentMin, extentMax, regionScriptData));
}
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsRegion3dNamespace::destroy3dRegion(JNIEnv *env, jobject self, jstring regionName)
{
JavaStringParam localRegionNameStr((jstring)regionName);
std::string regionNameStr;
JavaLibrary::convert(localRegionNameStr, regionNameStr);
Region3d const *reg = Region3dMaster::getRegionByName(regionNameStr);
delete reg;
}
// ======================================================================
@@ -0,0 +1,54 @@
//-----------------------------------------------------------------------
// ScriptMethodsRemoteDebug.cpp
// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved.
// Author: Justin Randall
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
// ======================================================================
// ScriptMethodsRemoteDebugNamespace
// ======================================================================
namespace ScriptMethodsRemoteDebugNamespace
{
bool install();
void JNICALL printChannelMessage (JNIEnv *env, jobject self, jstring channel, jstring message);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsRemoteDebugNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsRemoteDebugNamespace::c)}
JF("printChannelMessage", "(Ljava/lang/String;Ljava/lang/String;)V", printChannelMessage),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsRemoteDebugNamespace::printChannelMessage (JNIEnv *env, jobject self, jstring channel, jstring message)
{
JavaStringParam localChannel(channel);
std::string channelText;
JavaLibrary::convert(localChannel, channelText);
JavaStringParam localMessage(message);
std::string messageText;
JavaLibrary::convert(localMessage, messageText);
DEBUG_OUTPUT_CHANNEL(channelText.c_str(), ("%s", messageText.c_str()));
}
//-----------------------------------------------------------------------
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,724 @@
//========================================================================
//
// ScriptMethodsScript.cpp - implements script methods dealing with scripts.
//
// copyright 2001 Sony Online Entertainment
//
//========================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "boost/smart_ptr.hpp"
#include "UnicodeUtils.h"
#include "serverGame/GameServer.h"
#include "serverGame/MessageToQueue.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerWorld.h"
#include "serverScript/GameScriptObject.h"
#include "serverScript/ScriptMessage.h"
#include "serverUtility/ServerClock.h"
#include "sharedFoundation/CalendarTime.h"
#include "sharedFoundation/Crc.h"
#include "sharedNetworkMessages/GenericValueTypeMessage.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsScriptNamespace
// ======================================================================
namespace ScriptMethodsScriptNamespace
{
bool install();
jint JNICALL attachScript(JNIEnv *env, jobject self, jlong objId, jstring scriptName);
jboolean JNICALL detachScript(JNIEnv *env, jobject self, jlong objId, jstring scriptName);
jboolean JNICALL detachAllScripts(JNIEnv *env, jobject self, jlong objId);
jboolean JNICALL hasScript(JNIEnv *env, jobject self, jobject objId, jstring scriptName);
jboolean JNICALL reloadScriptFromScript(JNIEnv * env, jobject self, jstring scriptName);
jint JNICALL triggerScript(JNIEnv *env, jobject self, jlong object, jstring script, jint triggerId, jobjectArray params);
jboolean JNICALL localMessageTo(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jobject params);
jboolean JNICALL remoteMessageTo(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jbyteArray params, jfloat delay, jboolean guaranteed, jlong undeliveredCallbackObject, jstring undeliveredCallbackMethodName);
void JNICALL messageToPlayersOnPlanet(JNIEnv *env, jobject self, jstring methodName, jbyteArray params, jfloat delay, jobject loc, jfloat radius, jboolean includeDisconnectedPlayers);
jint JNICALL remoteMessageToCalendarTimeDayOfWeek(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jbyteArray params, jint dayOfWeek, jint hour, jint minute, jint second);
jint JNICALL remoteMessageToCalendarTimeDayOfMonth(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jbyteArray params, jint month, jint dayOfMonth, jint hour, jint minute, jint second);
void JNICALL recurringMessageTo(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jbyteArray params, jfloat delay);
void JNICALL cancelRecurringMessageTo(JNIEnv *env, jobject self, jlong receiver, jstring methodName);
jint JNICALL timeUntilMessageTo(JNIEnv *env, jobject self, jlong object, jstring methodName);
jint JNICALL getServerFrame(JNIEnv * env, jobject self);
jint JNICALL getGameTimeSeconds(JNIEnv * env, jobject self);
jint JNICALL getCalendarTimeSeconds(JNIEnv * env, jobject self);
jint JNICALL getCalendarTimeSeconds2(JNIEnv * env, jobject self, jint year, jint month, jint day, jint hour, jint minute, jint second);
jstring JNICALL getCalendarTimeStringGMT(JNIEnv *env, jobject self, jint calendarTimeSeconds);
jstring JNICALL getCalendarTimeStringGMT_YYYYMMDDHHMMSS(JNIEnv *env, jobject self, jint calendarTimeSeconds);
jstring JNICALL getCalendarTimeStringLocal(JNIEnv *env, jobject self, jint calendarTimeSeconds);
jstring JNICALL getCalendarTimeStringLocal_YYYYMMDDHHMMSS(JNIEnv *env, jobject self, jint calendarTimeSeconds);
jint JNICALL secondsUntilCalendarTimeDayOfWeek(JNIEnv *env, jobject self, jint dayOfWeek, jint hour, jint minute, jint second);
jint JNICALL secondsUntilCalendarTimeDayOfMonth(JNIEnv *env, jobject self, jint month, jint dayOfMonth, jint hour, jint minute, jint second);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsScriptNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsScriptNamespace::c)}
JF("_attachScript", "(JLjava/lang/String;)I", attachScript),
JF("_detachScript", "(JLjava/lang/String;)Z", detachScript),
JF("_detachAllScripts", "(J)Z", detachAllScripts),
JF("reloadScript", "(Ljava/lang/String;)Z", reloadScriptFromScript),
JF("_triggerScript", "(JLjava/lang/String;I[Ljava/lang/Object;)I", triggerScript),
JF("_localMessageTo", "(JLjava/lang/String;Lscript/dictionary;)Z", localMessageTo),
JF("_remoteMessageTo", "(JLjava/lang/String;[BFZJLjava/lang/String;)Z", remoteMessageTo),
JF("_messageToPlayersOnPlanet", "(Ljava/lang/String;[BFLscript/location;FZ)V", messageToPlayersOnPlanet),
JF("_remoteMessageTo", "(JLjava/lang/String;[BIIII)I", remoteMessageToCalendarTimeDayOfWeek),
JF("_remoteMessageTo", "(JLjava/lang/String;[BIIIII)I", remoteMessageToCalendarTimeDayOfMonth),
JF("_internalRecurringMessageTo", "(JLjava/lang/String;[BF)V", recurringMessageTo),
JF("_cancelRecurringMessageTo", "(JLjava/lang/String;)V", cancelRecurringMessageTo),
JF("_timeUntilMessageTo", "(JLjava/lang/String;)I", timeUntilMessageTo),
JF("getServerFrame", "()I", getServerFrame),
JF("getGameTime", "()I", getGameTimeSeconds),
JF("getCalendarTime", "()I", getCalendarTimeSeconds),
JF("getCalendarTime", "(IIIIII)I", getCalendarTimeSeconds2),
JF("getCalendarTimeStringGMT", "(I)Ljava/lang/String;", getCalendarTimeStringGMT),
JF("getCalendarTimeStringGMT_YYYYMMDDHHMMSS", "(I)Ljava/lang/String;", getCalendarTimeStringGMT_YYYYMMDDHHMMSS),
JF("getCalendarTimeStringLocal", "(I)Ljava/lang/String;", getCalendarTimeStringLocal),
JF("getCalendarTimeStringLocal_YYYYMMDDHHMMSS", "(I)Ljava/lang/String;", getCalendarTimeStringLocal_YYYYMMDDHHMMSS),
JF("secondsUntilCalendarTimeDayOfWeek", "(IIII)I", secondsUntilCalendarTimeDayOfWeek),
JF("secondsUntilCalendarTimeDayOfMonth", "(IIIII)I", secondsUntilCalendarTimeDayOfMonth),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// class JavaLibrary JNI script callback methods
//========================================================================
/**
* Adds a script to an object.
*
* @param env Java environment
* @param self class calling this function
* @param objId id of class to attach the script to
* @param scriptName name of the script
*
* @return SCRIPT_CONTINUE on success, SCRIPT_OVERRIDE on error
*/
jint JNICALL ScriptMethodsScriptNamespace::attachScript(JNIEnv *env, jobject self, jlong objId, jstring scriptName)
{
UNREF(self);
JavaStringParam localScriptName(scriptName);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objId, object))
return SCRIPT_OVERRIDE;
GameScriptObject* scripts = object->getScriptObject();
if (scripts == NULL)
return SCRIPT_OVERRIDE;
char buffer[MAX_SCRIPT_NAME_LEN];
localScriptName.fillBuffer(buffer, sizeof(buffer));
if (!*buffer)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("attachScript attempt to attach empty script name to [%s]", object->getNetworkId().getValueString().c_str()));
return SCRIPT_CONTINUE;
}
if (scripts->hasScript(buffer))
{
return SCRIPT_OVERRIDE;
}
return scripts->attachScript(buffer, true);
} // JavaLibrary::attachScript
/**
* Removes a script from an object.
*
* @param env Java environment
* @param self class calling this function
* @param objId id of class to detach the script from
* @param scriptName name of the script
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsScriptNamespace::detachScript(JNIEnv *env, jobject self, jlong objId, jstring scriptName)
{
UNREF(self);
JavaStringParam localScriptName(scriptName);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objId, object))
return JNI_FALSE;
GameScriptObject* scripts = object->getScriptObject();
if (scripts == NULL)
return JNI_FALSE;
char buffer[MAX_SCRIPT_NAME_LEN];
localScriptName.fillBuffer(buffer, sizeof(buffer));
if (scripts->detachScript(buffer))
return JNI_TRUE;
else
return JNI_FALSE;
} // JavaLibrary::detachScript
/**
* Removes all scripts from an object.
*
* @param env Java environment
* @param self class calling this function
* @param objId id of class to detach the script from
*
* @return true if all the scripts were detached, false if not
*/
jboolean JNICALL ScriptMethodsScriptNamespace::detachAllScripts(JNIEnv *env, jobject self, jlong objId)
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objId, object))
return JNI_FALSE;
GameScriptObject* scriptObject = object->getScriptObject();
if (scriptObject == NULL)
return JNI_FALSE;
std::vector<std::string> scriptNames;
scriptObject->enumerateScripts(scriptNames);
// go through all the scripts and detach them
jboolean result = JNI_TRUE;
for (std::vector<std::string>::const_iterator i = scriptNames.begin(); i != scriptNames.end(); ++i)
{
if (!scriptObject->detachScript(*i))
result = JNI_FALSE;
}
return result;
} // JavaLibrary::detachAllScripts
/**
* Checks if a class has a script.
*
* @param env Java environment
* @param self class calling this function
* @param objId id of class to check
* @param scriptName name of the script
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsScriptNamespace::hasScript(JNIEnv *env, jobject self, jobject objId,
jstring scriptName)
{
UNREF(self);
JavaStringParam localScriptName(scriptName);
ServerObject* object = 0;
if (!JavaLibrary::getObject(objId, object))
return JNI_FALSE;
GameScriptObject* scripts = object->getScriptObject();
if (scripts == NULL)
return JNI_FALSE;
char buffer[MAX_SCRIPT_NAME_LEN];
localScriptName.fillBuffer(buffer, sizeof(buffer));
if (scripts->hasScript(buffer))
return JNI_TRUE;
return JNI_FALSE;
} // JavaLibrary::hasScript
/**
* Executes a script trigger.
*
* @param env Java environment
* @param self class calling this function
* @param objId id of class to run the script from
* @param scriptName name of the script
* @param triggerId id of trigger to run
* @param params paramaters to send to the trigger
*
* @return results from calling script, or SCRIPT_OVERRIDE on error
*/
jint JNICALL ScriptMethodsScriptNamespace::triggerScript(JNIEnv *env, jobject self, jlong objId, jstring scriptName, jint triggerId, jobjectArray params)
{
UNREF(self);
JavaStringParam localScriptName(scriptName);
// get the trigger info
if (triggerId < 0 || triggerId >= Scripting::TRIG_LAST_TRIGGER)
return SCRIPT_OVERRIDE;
Scripting::_ScriptFuncHashMap::const_iterator funcIter = Scripting::ScriptFuncHashMap->find(triggerId);
if (funcIter == Scripting::ScriptFuncHashMap->end())
return SCRIPT_OVERRIDE;
const Scripting::ScriptFuncTable *func = (*funcIter).second;
// get the object to run the script on
ServerObject* object = 0;
if (!JavaLibrary::getObject(objId, object))
return SCRIPT_OVERRIDE;
// convert the script name to ansii
char buffer[MAX_SCRIPT_NAME_LEN];
localScriptName.fillBuffer(buffer, sizeof(buffer));
// run the script; note that we are not checking if the paramaters match the
// types given in ScriptFuncTable
return JavaLibrary::instance()->runScript(object->getNetworkId(), buffer, func->name, params);
} // JavaLibrary::triggerScript
//========================================================================
// class JavaLibrary JNI messaging callback methods
//========================================================================
/**
* Sets up a timed message to be called on an object's script.
*
* @param env Java environment
* @param self class calling this function
* @param receiver object id of object the message is attached to
* @param methodName script method to be called when the message is signalled
* @param params parameters to be sent to the methodName
* @param delay time (in secs) before the message is signalled
* @param guaranteed flag to guarantee the message will be signaled (even if the object is unloaded)
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsScriptNamespace::localMessageTo(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jobject params)
{
UNREF(self);
JavaStringParam localMethodName(methodName);
if (receiver == 0 || methodName == 0 || params == 0)
return JNI_FALSE;
if (!env->IsInstanceOf(params, JavaLibrary::getClsDictionary()))
return JNI_FALSE;
jboolean result = JNI_FALSE;
std::string methodNameStdString;
if (JavaLibrary::convert(localMethodName, methodNameStdString))
{
// get the receiver object
ServerObject * object = 0;
if (!(JavaLibrary::getObject(receiver, object) && object && object->isAuthoritative()))
{
DEBUG_WARNING(true,("localMessageTo called for an object which was not authoritative on this server.\n"));
result = JNI_FALSE;
}
else
{
GameScriptObject* scripts = object->getScriptObject();
if (scripts == NULL)
return JNI_FALSE;
ScriptDictionaryPtr dictionary(new JavaDictionary(params));
scripts->handleMessage(methodNameStdString, dictionary); // was addMessage, changed name because it now fires right away
result = JNI_TRUE;
}
}
return result;
}
// ----------------------------------------------------------------------
/**
* Sets up a timed message to be called on an object's script.
*
* @param env Java environment
* @param self class calling this function
* @param receiver object id of object the message is attached to
* @param methodName script method to be called when the message is signalled
* @param params parameters to be sent to the methodName
* @param delay time (in secs) before the message is signalled
* @param guaranteed flag to guarantee the message will be signaled (even if the object is unloaded)
*
* @return JNI_TRUE on success, JNI_FALSE on fail
*/
jboolean JNICALL ScriptMethodsScriptNamespace::remoteMessageTo(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jbyteArray params, jfloat delay, jboolean guaranteed, jlong undeliveredCallbackObject, jstring undeliveredCallbackMethodName)
{
UNREF(self);
JavaStringParam localMethodName(methodName);
std::string methodNameStdString;
if (!JavaLibrary::convert(localMethodName, methodNameStdString))
return JNI_FALSE;
std::string undeliveredCallbackMethodNameStdString;
if (undeliveredCallbackMethodName)
{
JavaStringParam temp(undeliveredCallbackMethodName);
if (!JavaLibrary::convert(temp, undeliveredCallbackMethodNameStdString))
return JNI_FALSE;
}
if (guaranteed==JNI_TRUE && !undeliveredCallbackMethodNameStdString.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("Sending message \"%s\" to object %s, the message was guaranteed but also had an undelivered callback specified.", methodNameStdString.c_str(), NetworkId(receiver).getValueString().c_str()));
return false;
}
if (params != 0)
{
std::vector<int8> localParams;
if (!ScriptConversion::convert(params, localParams))
return JNI_FALSE;
// add crc info to the string so we can verify it when we get the message
if (!localParams.empty())
{
MessageToQueue::getInstance().sendMessageToJava(NetworkId(receiver), methodNameStdString, localParams, static_cast<int>(delay), guaranteed == JNI_TRUE, NetworkId(undeliveredCallbackObject), undeliveredCallbackMethodNameStdString);
}
}
else
{
MessageToQueue::getInstance().sendMessageToJava(NetworkId(receiver), methodNameStdString, std::vector<int8>(), static_cast<int>(delay), guaranteed == JNI_TRUE, NetworkId(undeliveredCallbackObject), undeliveredCallbackMethodNameStdString);
}
return JNI_TRUE;
}
// ----------------------------------------------------------------------
/**
* "messageTo" for players on the current planet
*
* If you want everyone on the planet to receive the message,
* specify null for loc and -1.0f for radius; otherwise, specify
* a loc and a radius and only players on the planet within the
* specified area will receive the message
*/
void JNICALL ScriptMethodsScriptNamespace::messageToPlayersOnPlanet(JNIEnv *env, jobject self, jstring methodName, jbyteArray params, jfloat delay, jobject loc, jfloat radius, jboolean includeDisconnectedPlayers)
{
UNREF(self);
JavaStringParam localMethodName(methodName);
std::string methodNameStdString;
if (!JavaLibrary::convert(localMethodName, methodNameStdString))
return;
std::vector<int8> localParams;
if (params)
{
if (!ScriptConversion::convert(params, localParams))
return;
}
Vector vectorLocation;
if (loc)
{
if (!ScriptConversion::convertWorld(loc, vectorLocation))
return;
}
// send to planet server for distribution to all game servers
// running this planet; each game server will then check for
// all players within the range and send the player the messageTo;
// we need to do this because the range could cover multiple game servers
GenericValueTypeMessage<std::pair<std::pair<std::pair<std::string, std::vector<int8> >, std::pair<float, bool> >, std::pair<Vector, float> > > const m("MessageToPlayersOnPlanet", std::make_pair(std::make_pair(std::make_pair(methodNameStdString, localParams), std::make_pair(delay, (includeDisconnectedPlayers != JNI_FALSE))), std::make_pair(vectorLocation, (loc ? radius : -1.0f))));
GameServer::getInstance().sendToPlanetServer(m);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::remoteMessageToCalendarTimeDayOfWeek(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jbyteArray params, jint dayOfWeek, jint hour, jint minute, jint second)
{
UNREF(self);
JavaStringParam localMethodName(methodName);
std::string methodNameStdString;
if (!JavaLibrary::convert(localMethodName, methodNameStdString))
return -1;
// calculate the absolute time when the messageTo should go off
time_t const timeNow = ::time(NULL);
time_t const timeTarget = CalendarTime::getNextGMTTimeOcurrence(timeNow, dayOfWeek, hour, minute, second);
if ((timeTarget <= 0) || (timeTarget <= timeNow))
return -1;
int const timeUntil = static_cast<int>(timeTarget - timeNow);
if (params != 0)
{
std::vector<int8> localParams;
if (!ScriptConversion::convert(params, localParams))
return -1;
// add crc info to the string so we can verify it when we get the message
if (!localParams.empty())
{
MessageToQueue::getInstance().sendMessageToJava(NetworkId(receiver), methodNameStdString, localParams, std::max(static_cast<int>(1), timeUntil + 2), false);
}
}
else
{
MessageToQueue::getInstance().sendMessageToJava(NetworkId(receiver), methodNameStdString, std::vector<int8>(), std::max(static_cast<int>(1), timeUntil + 2), false);
}
return timeUntil;
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::remoteMessageToCalendarTimeDayOfMonth(JNIEnv *env, jobject self, jlong receiver, jstring methodName, jbyteArray params, jint month, jint dayOfMonth, jint hour, jint minute, jint second)
{
UNREF(self);
JavaStringParam localMethodName(methodName);
std::string methodNameStdString;
if (!JavaLibrary::convert(localMethodName, methodNameStdString))
return -1;
// calculate the absolute time when the messageTo should go off
time_t const timeNow = ::time(NULL);
time_t const timeTarget = CalendarTime::getNextGMTTimeOcurrence(timeNow, month, dayOfMonth, hour, minute, second);
if ((timeTarget <= 0) || (timeTarget <= timeNow))
return -1;
int const timeUntil = static_cast<int>(timeTarget - timeNow);
if (params != 0)
{
std::vector<int8> localParams;
if (!ScriptConversion::convert(params, localParams))
return -1;
// add crc info to the string so we can verify it when we get the message
if (!localParams.empty())
{
MessageToQueue::getInstance().sendMessageToJava(NetworkId(receiver), methodNameStdString, localParams, std::max(static_cast<int>(1), timeUntil + 2), false);
}
}
else
{
MessageToQueue::getInstance().sendMessageToJava(NetworkId(receiver), methodNameStdString, std::vector<int8>(), std::max(static_cast<int>(1), timeUntil + 2), false);
}
return timeUntil;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsScriptNamespace::recurringMessageTo(JNIEnv * /*env*/, jobject /*self*/, jlong receiver, jstring methodName, jbyteArray params, jfloat delay)
{
JavaStringParam localMethodName(methodName);
std::string methodNameStdString;
if (!JavaLibrary::convert(localMethodName, methodNameStdString))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::recurringMessageTo was not able to convert methodName into a string"));
return;
}
if (params != 0)
{
std::vector<int8> localParams;
if (!ScriptConversion::convert(params, localParams) || localParams.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::recurringMessageTo was not able to convert params into a std::vector<int8>"));
return;
}
MessageToQueue::getInstance().sendRecurringMessageToJava(NetworkId(receiver), methodNameStdString, localParams, static_cast<int>(delay));
}
else
MessageToQueue::getInstance().sendRecurringMessageToJava(NetworkId(receiver), methodNameStdString, std::vector<int8>(), static_cast<int>(delay));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsScriptNamespace::cancelRecurringMessageTo(JNIEnv *env, jobject self, jlong receiver, jstring methodName)
{
JavaStringParam localMethodName(methodName);
std::string methodNameStdString;
if (!JavaLibrary::convert(localMethodName, methodNameStdString))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::cancelRecurringMessageTo was not able to convert methodName into a string"));
return;
}
MessageToQueue::getInstance().cancelRecurringMessageTo(NetworkId(receiver), methodNameStdString);
}
// ----------------------------------------------------------------------
// returns the number of seconds until the messageTo fires, which *CAN* be 0
// returns -1 if object doesn't have the messageTo
jint JNICALL ScriptMethodsScriptNamespace::timeUntilMessageTo(JNIEnv *env, jobject self, jlong object, jstring methodName)
{
ServerObject const * so = NULL;
if (!JavaLibrary::getObject(object, so))
return -1;
JavaStringParam localMethodName(methodName);
std::string methodNameStdString;
if (!JavaLibrary::convert(localMethodName, methodNameStdString))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::timeUntilMessageTo was not able to convert methodName into a string"));
return -1;
}
return so->timeUntilMessageTo(methodNameStdString);
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::getServerFrame(JNIEnv * env, jobject self)
{
if(env == 0)
return 0;
unsigned long t = ServerClock::getInstance().getServerFrame();
return t;
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::getGameTimeSeconds(JNIEnv * env, jobject self)
{
if(env == 0)
return 0;
unsigned long t = ServerClock::getInstance().getGameTimeSeconds();
return t;
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::getCalendarTimeSeconds(JNIEnv * env, jobject self)
{
if(env == 0)
return 0;
return ::time(NULL);
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::getCalendarTimeSeconds2(JNIEnv * env, jobject self, jint year, jint month, jint day, jint hour, jint minute, jint second)
{
if(env == 0)
return -1;
time_t const rawtime = ::time(NULL);
struct tm * timeinfo = ::localtime(&rawtime);
if (!timeinfo)
return -1;
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1;
timeinfo->tm_mday = day;
timeinfo->tm_hour = hour;
timeinfo->tm_min = minute;
timeinfo->tm_sec = second;
return ::mktime(timeinfo);
}
//-----------------------------------------------------------------------
jstring JNICALL ScriptMethodsScriptNamespace::getCalendarTimeStringGMT(JNIEnv *env, jobject self, jint calendarTimeSeconds)
{
if(env == 0)
return 0;
return JavaString(CalendarTime::convertEpochToTimeStringGMT(calendarTimeSeconds)).getReturnValue();
}
//-----------------------------------------------------------------------
jstring JNICALL ScriptMethodsScriptNamespace::getCalendarTimeStringGMT_YYYYMMDDHHMMSS(JNIEnv *env, jobject self, jint calendarTimeSeconds)
{
if(env == 0)
return 0;
return JavaString(CalendarTime::convertEpochToTimeStringGMT_YYYYMMDDHHMMSS(calendarTimeSeconds)).getReturnValue();
}
//-----------------------------------------------------------------------
jstring JNICALL ScriptMethodsScriptNamespace::getCalendarTimeStringLocal(JNIEnv *env, jobject self, jint calendarTimeSeconds)
{
if(env == 0)
return 0;
return JavaString(CalendarTime::convertEpochToTimeStringLocal(calendarTimeSeconds)).getReturnValue();
}
//-----------------------------------------------------------------------
jstring JNICALL ScriptMethodsScriptNamespace::getCalendarTimeStringLocal_YYYYMMDDHHMMSS(JNIEnv *env, jobject self, jint calendarTimeSeconds)
{
if(env == 0)
return 0;
return JavaString(CalendarTime::convertEpochToTimeStringLocal_YYYYMMDDHHMMSS(calendarTimeSeconds)).getReturnValue();
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::secondsUntilCalendarTimeDayOfWeek(JNIEnv *env, jobject self, jint dayOfWeek, jint hour, jint minute, jint second)
{
UNREF(self);
// calculate the time between now and the specified time
time_t const timeNow = ::time(NULL);
time_t const timeTarget = CalendarTime::getNextGMTTimeOcurrence(timeNow, dayOfWeek, hour, minute, second);
if ((timeTarget <= 0) || (timeTarget <= timeNow))
return -1;
return static_cast<int>(timeTarget - timeNow);
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsScriptNamespace::secondsUntilCalendarTimeDayOfMonth(JNIEnv *env, jobject self, jint month, jint dayOfMonth, jint hour, jint minute, jint second)
{
UNREF(self);
// calculate the time between now and the specified time
time_t const timeNow = ::time(NULL);
time_t const timeTarget = CalendarTime::getNextGMTTimeOcurrence(timeNow, month, dayOfMonth, hour, minute, second);
if ((timeTarget <= 0) || (timeTarget <= timeNow))
return -1;
return static_cast<int>(timeTarget - timeNow);
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsScriptNamespace::reloadScriptFromScript(JNIEnv * env, jobject self, jstring scriptName)
{
jboolean result = JNI_FALSE;
JavaStringParam localScriptName(scriptName);
std::string scriptNameStdString;
if (!JavaLibrary::convert(localScriptName, scriptNameStdString))
return JNI_FALSE;
if(GameScriptObject::reloadScript(scriptNameStdString))
{
result = JNI_TRUE;
}
return result;
}
//-----------------------------------------------------------------------
@@ -0,0 +1,480 @@
//-----------------------------------------------------------------------
// ScriptMethodsServerUI.cpp
// Copyright 2002, Sony Online Entertainment Inc., all rights reserved.
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/Client.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/ServerObject.h"
#include "serverGame/ServerUIManager.h"
#include "serverGame/ServerUIPage.h"
#include "sharedGame/SuiPageData.h"
#include "sharedUtility/ValueDictionary.h"
// ======================================================================
// ScriptMethodsServerUINamespace
// ======================================================================
namespace ScriptMethodsServerUINamespace
{
bool install();
jint JNICALL createSuiPage (JNIEnv *env, jobject self, jstring pageName, jlong owner, jlong client);
jboolean JNICALL clearSuiDataSource (JNIEnv *env, jobject self, jint pageId, jstring dataSource);
jboolean JNICALL clearSuiDataSourceContainer(JNIEnv *env, jobject self, jint pageId, jstring dataSource);
jboolean JNICALL addSuiDataItem (JNIEnv *env, jobject self, jint pageId, jstring dataSource, jstring dataItemValue);
jboolean JNICALL addSuiDataSourceContainer (JNIEnv *env, jobject self, jint pageId, jstring dataSource, jstring dataItemValue);
jboolean JNICALL addSuiDataSource (JNIEnv *env, jobject self, jint pageId, jstring dataSource, jstring dataItemValue);
jboolean JNICALL addSuiChildWidget (JNIEnv *env, jobject self, jint pageId, jstring widgetType, jstring widgetName, jstring partentWidgetName);
jboolean JNICALL setSuiProperty (JNIEnv *env, jobject self, jint pageId, jstring widgetName, jstring propertyName, jstring propertyValue);
jboolean JNICALL subscribeToSuiEvent (JNIEnv *env, jobject self, jint pageId, jint eventType, jstring widgetName, jstring callback);
jboolean JNICALL subscribeToSuiPropertyForEvent (JNIEnv *env, jobject self, jint pageId, jint eventType, jstring eventWidgetName, jstring propertyWidgetName, jstring propertyName);
jboolean JNICALL showSuiPage (JNIEnv *env, jobject self, jint pageId);
jboolean JNICALL forceCloseSuiPage (JNIEnv *env, jobject self, jint pageId);
jboolean JNICALL setSuiAssociatedObject (JNIEnv *env, jobject self, jint pageId, jlong j_associatedObjectId);
jboolean JNICALL setSuiAssociatedLocation (JNIEnv *env, jobject self, jint pageId, jlong j_associatedObjectId);
jboolean JNICALL setSuiMaxRangeToObject (JNIEnv *env, jobject self, jint pageId, jfloat j_maxRange);
jboolean JNICALL clientMinigameOpen(JNIEnv *env, jobject self, jlong player, jobject data);
jboolean JNICALL clientMinigameClose(JNIEnv *env, jobject self, jlong player, jobject data);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsServerUINamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsServerUINamespace::c)}
JF("_createSUIPage", "(Ljava/lang/String;JJ)I", createSuiPage),
JF("clearSUIDataSource", "(ILjava/lang/String;)Z", clearSuiDataSource),
JF("clearSUIDataSourceContainer", "(ILjava/lang/String;)Z", clearSuiDataSourceContainer),
JF("addSUIDataItem", "(ILjava/lang/String;Ljava/lang/String;)Z", addSuiDataItem),
JF("addSUIDataSourceContainer", "(ILjava/lang/String;Ljava/lang/String;)Z", addSuiDataSourceContainer),
JF("addSUIDataSource", "(ILjava/lang/String;Ljava/lang/String;)Z", addSuiDataSource),
JF("addSUIChildWidget", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z", addSuiChildWidget),
JF("setSUIProperty", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z", setSuiProperty),
JF("subscribeToSUIEvent", "(IILjava/lang/String;Ljava/lang/String;)Z", subscribeToSuiEvent),
JF("subscribeToSUIPropertyForEvent", "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z", subscribeToSuiPropertyForEvent),
JF("showSUIPage", "(I)Z", showSuiPage),
JF("forceCloseSUIPage", "(I)Z", forceCloseSuiPage),
JF("_setSUIAssociatedObject", "(IJ)Z", setSuiAssociatedObject),
JF("_setSUIAssociatedLocation", "(IJ)Z", setSuiAssociatedLocation),
JF("setSUIMaxRangeToObject", "(IF)Z", setSuiMaxRangeToObject),
JF("_clientMinigameOpen", "(JLscript/dictionary;)Z", clientMinigameOpen),
JF("_clientMinigameClose", "(JLscript/dictionary;)Z", clientMinigameClose),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsServerUINamespace::createSuiPage(JNIEnv *env, jobject self, jstring pageName, jlong ownerobject, jlong client)
{
JavaStringParam localPageName(pageName);
jint failureCode = -1;
ServerObject* owner = NULL;
if(!JavaLibrary::getObject(ownerobject, owner))
{
WARNING(true, ("SUI: couldn't get owner ServerObject*, can't create a page"));
return failureCode;
}
ServerObject* so = NULL;
if(!JavaLibrary::getObject(client, so))
return failureCode;
std::string pn;
JavaLibrary::convert(localPageName, pn);
//Still going to check for client even though we don't use it anymore -- ARH
Client* const c = so->getClient();
if(!c)
{
WARNING(true, ("SUI: couldn't get Client object [%s], can't create a page [%s]",
so->getDebugInformation(false).c_str(), pn.c_str()));
return failureCode;
}
//make a serverui page for the given client
int const pId = ServerUIManager::createPage(pn, *owner, so->getNetworkId());
//fail if can't create page
if(pId == -1)
{
WARNING(true, ("SUI: ServerManager::createPage could not create a SUI page"));
return failureCode;
}
return pId;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::clearSuiDataSource(JNIEnv *env, jobject self, jint pageId, jstring dataSource)
{
JavaStringParam localDataSource(dataSource);
ServerUIPage * const p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot clear datasource", pageId));
return JNI_FALSE;
}
std::string ds;
JavaLibrary::convert(localDataSource, ds);
p->clearDataSource(ds);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::clearSuiDataSourceContainer(JNIEnv * env, jobject self, jint pageId, jstring dataSourceContainer)
{
JavaStringParam localDataSource(dataSourceContainer);
ServerUIPage * const p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot clear datasource", pageId));
return JNI_FALSE;
}
std::string ds;
JavaLibrary::convert(localDataSource, ds);
p->clearDataSourceContainer(ds);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::addSuiDataItem(JNIEnv *env, jobject self, jint pageId, jstring dataSource, jstring dataItemValue)
{
JavaStringParam localDataSource(dataSource);
JavaStringParam localDataItemValue(dataItemValue);
ServerUIPage* p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot add the item", pageId));
return JNI_FALSE;
}
std::string ds;
JavaLibrary::convert(localDataSource, ds);
Unicode::String div;
JavaLibrary::convert(localDataItemValue, div);
std::string din = "Name";
p->addDataItem(ds, din, div);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::addSuiDataSourceContainer(JNIEnv *env, jobject self, jint pageId, jstring dataSource, jstring dataItemValue)
{
JavaStringParam localDataSource(dataSource);
JavaStringParam localDataItemValue(dataItemValue);
ServerUIPage* p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot add the item", pageId));
return JNI_FALSE;
}
std::string ds;
JavaLibrary::convert(localDataSource, ds);
Unicode::String div;
JavaLibrary::convert(localDataItemValue, div);
std::string din = "Name";
p->addDataSourceContainer(ds, din, div);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::addSuiDataSource(JNIEnv *env, jobject self, jint pageId, jstring dataSource, jstring dataItemValue)
{
JavaStringParam localDataSource(dataSource);
JavaStringParam localDataItemValue(dataItemValue);
ServerUIPage* p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot add the item", pageId));
return JNI_FALSE;
}
std::string ds;
JavaLibrary::convert(localDataSource, ds);
Unicode::String div;
JavaLibrary::convert(localDataItemValue, div);
std::string din = "Name";
p->addDataSource(ds, din, div);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::addSuiChildWidget(JNIEnv *env, jobject self, jint pageId, jstring widgetType, jstring widgetName, jstring parentWidgetName)
{
JavaStringParam localWidgetType(widgetType);
JavaStringParam localWidgetName(widgetName);
JavaStringParam localParentWidgetName(parentWidgetName);
ServerUIPage* p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot add a child widget", pageId));
return JNI_FALSE;
}
std::string wt;
JavaLibrary::convert(localWidgetType, wt);
std::string wn;
JavaLibrary::convert(localWidgetName, wn);
std::string pwn;
JavaLibrary::convert(localParentWidgetName, pwn);
p->addChildWidget(wt, wn, pwn);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::setSuiProperty(JNIEnv *env, jobject self, jint pageId, jstring widgetName, jstring propertyName, jstring propertyValue)
{
JavaStringParam localWidgetName(widgetName);
JavaStringParam localPropertyName(propertyName);
JavaStringParam localPropertyValue(propertyValue);
ServerUIPage* p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot set the property", pageId));
return JNI_FALSE;
}
std::string wn;
JavaLibrary::convert(localWidgetName, wn);
std::string pn;
JavaLibrary::convert(localPropertyName, pn);
Unicode::String pv;
JavaLibrary::convert(localPropertyValue, pv);
p->setProperty(wn, pn, pv);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::subscribeToSuiEvent(JNIEnv *env, jobject self, jint pageId, jint eventType, jstring eventWidgetName, jstring callback)
{
ServerUIPage* p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot subscribe to the property", pageId));
return JNI_FALSE;
}
std::string ewn;
if (eventWidgetName != NULL)
{
JavaStringParam localEventWidgetName(eventWidgetName);
JavaLibrary::convert(localEventWidgetName, ewn);
}
JavaStringParam localCallback(callback);
std::string cb;
JavaLibrary::convert(localCallback, cb);
p->getPageData().subscribeToEvent(eventType, ewn, cb);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::subscribeToSuiPropertyForEvent(JNIEnv *env, jobject self, jint pageId, jint eventType, jstring eventWidgetName, jstring propertyWidgetName, jstring propertyName)
{
ServerUIPage* p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("SUI: Could not find page %d, cannot subscribe to the property", pageId));
return JNI_FALSE;
}
std::string ewn;
if (eventWidgetName != NULL)
{
JavaStringParam localEventWidgetName(eventWidgetName);
JavaLibrary::convert(localEventWidgetName, ewn);
}
JavaStringParam localPropertyWidgetName(propertyWidgetName);
JavaStringParam localPropertyName(propertyName);
std::string pwn;
JavaLibrary::convert(localPropertyWidgetName, pwn);
std::string pn;
JavaLibrary::convert(localPropertyName, pn);
p->getPageData().subscribeToPropertyForEvent(eventType, ewn, pwn, pn);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::showSuiPage(JNIEnv *env, jobject self, jint pageId)
{
if (ServerUIManager::showPage(pageId))
return JNI_TRUE;
return JNI_FALSE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::forceCloseSuiPage(JNIEnv *env, jobject self, jint pageId)
{
bool result = ServerUIManager::closePage(pageId);
if(result)
return JNI_TRUE;
else
{
DEBUG_WARNING(true, ("SUI: Couldn't force close the page", pageId));
return JNI_FALSE;
}
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::setSuiAssociatedObject(JNIEnv *env, jobject self, jint pageId, jlong j_associatedObjectId)
{
ServerUIPage * const p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("Could not find page %d, cannot set property", pageId));
return JNI_FALSE;
}
if (!j_associatedObjectId)
{
DEBUG_WARNING(true, ("bad associatedObjectId sent to setAssociatedObject", pageId));
return JNI_FALSE;
}
NetworkId id(j_associatedObjectId);
if (id == NetworkId::cms_invalid)
{
DEBUG_WARNING(true, ("could not convert associatedObjectid", pageId));
return JNI_FALSE;
}
p->setAssociatedObjectId (id);
return JNI_TRUE;
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::setSuiAssociatedLocation(JNIEnv *env, jobject self, jint pageId, jlong j_associatedObjectId)
{
ServerUIPage * const p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("Could not find page %d, cannot set property", pageId));
return JNI_FALSE;
}
if (!j_associatedObjectId)
{
DEBUG_WARNING(true, ("bad associatedObjectId sent to setAssociatedObject"));
return JNI_FALSE;
}
ServerObject* associatedObject = NULL;
if(!JavaLibrary::getObject(j_associatedObjectId, associatedObject))
{
DEBUG_WARNING(true, ("could not find object for associatedObjectid"));
return JNI_FALSE;
}
p->setAssociatedLocation (associatedObject->findPosition_w());
return JNI_TRUE;
}
//----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::setSuiMaxRangeToObject(JNIEnv *env, jobject self, jint pageId, jfloat j_maxRange)
{
ServerUIPage * const p = ServerUIManager::getPage(pageId);
if(!p)
{
DEBUG_WARNING(true, ("Could not find page %d, cannot set property", pageId));
return JNI_FALSE;
}
p->setMaxRangeFromObject (j_maxRange);
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::clientMinigameOpen(JNIEnv *env, jobject self, jlong player, jobject data)
{
ServerObject* playerServerObject = NULL;
if(!JavaLibrary::getObject(player, playerServerObject))
return JNI_FALSE;
CreatureObject * creatureObject = playerServerObject->asCreatureObject();
if(creatureObject != NULL)
{
ValueDictionary gameData;
JavaLibrary::convert(data, gameData);
creatureObject->clientMinigameOpen(gameData);
return JNI_TRUE;
}
return JNI_FALSE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsServerUINamespace::clientMinigameClose(JNIEnv *env, jobject self, jlong player, jobject data)
{
ServerObject* playerServerObject = NULL;
if(!JavaLibrary::getObject(player, playerServerObject))
return JNI_FALSE;
CreatureObject * creatureObject = playerServerObject->asCreatureObject();
if(creatureObject != NULL)
{
ValueDictionary gameData;
JavaLibrary::convert(data, gameData);
creatureObject->clientMinigameClose(gameData);
return JNI_TRUE;
}
return JNI_FALSE;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,51 @@
// ScriptMethodsSpawner.cpp
// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved.
// Author: Justin Randall
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/ServerWorld.h"
#include "sharedFoundation/ConfigFile.h"
//-----------------------------------------------------------------------
namespace ScriptMethodsSpawnerNamespace
{
bool install();
jint JNICALL getServerSpawnLimit(JNIEnv * env, jobject self);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsSpawnerNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsSpawnerNamespace::c)}
JF("getServerSpawnLimit", "()I", getServerSpawnLimit),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsSpawnerNamespace::getServerSpawnLimit(JNIEnv * env, jobject self)
{
UNREF(env);
UNREF(self);
return GameServer::getServerSpawnLimit();
}
//-----------------------------------------------------------------------
@@ -0,0 +1,203 @@
//=======================================================================
//
// ScriptMethodsString.cpp
// Copyright 2000-05, Sony Online Entertainment Inc., all rights reserved.
//
//=======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/NameManager.h"
#include "sharedGame/TextManager.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsStringNamespace
// ======================================================================
namespace ScriptMethodsStringNamespace
{
bool install();
jstring JNICALL getString(JNIEnv *env, jobject self, jobject id);
jobjectArray JNICALL getStrings(JNIEnv *env, jobject self, jobjectArray ids);
jboolean JNICALL isObscene(JNIEnv *env, jobject self, jstring data);
jboolean JNICALL isAppropriateText(JNIEnv *env, jobject self, jstring data);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsStringNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsStringNamespace::c)}
JF("getString", "(Lscript/string_id;)Ljava/lang/String;", getString),
JF("getStrings", "([Lscript/string_id;)[Ljava/lang/String;", getStrings),
JF("isObscene", "(Ljava/lang/String;)Z", isObscene),
JF("isAppropriateText", "(Ljava/lang/String;)Z", isAppropriateText),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//----------------------------------------------------------------------
/**
* Returns the string associated with a stringId.
*
* @param env Java environment
* @param self class calling this function
* @param id the stringId to find
*
* @return the string, or null on error
*/
jstring JNICALL ScriptMethodsStringNamespace::getString(JNIEnv *env, jobject self, jobject id)
{
UNREF(self);
if (id == 0)
{
WARNING(true, ("JavaLibrary::log getString is NULL."));
return 0;
}
// convert the string id to a char string
if (!env->IsInstanceOf(id, JavaLibrary::getClsStringId()))
{
WARNING(true, ("JavaLibrary::log IsInstanceOf failed."));
return 0;
}
// get the table
JavaStringPtr tempString = getStringField(LocalRefParam(id), JavaLibrary::getFidStringIdTable());
std::string table;
if(! JavaLibrary::convert(*tempString, table))
{
WARNING(true, ("JavaLibrary::log failed to get the string table."));
return 0;
}
std::string asciiId;
JavaStringPtr tempAsciiIdString = getStringField(LocalRefParam(id), JavaLibrary::getFidStringIdAsciiId());
if(! JavaLibrary::convert(*tempAsciiIdString, asciiId))
{
WARNING(true, ("JavaLibrary::log failed to get the string asciiId."));
return 0;
}
const StringId stringId(table, asciiId);
Unicode::String localized;
if (stringId.localize(localized))
{
JavaString result(localized);
return result.getReturnValue();
}
#ifdef DEBUG
else
{
WARNING(true, ("JavaLibrary::log failed to localize the stringId(%s, %s)", table.c_str(), asciiId.c_str()));
}
#endif
return 0;
} // JavaLibrary::getString
//----------------------------------------------------------------------
/**
* Returns the strings associated with an array of stringIds.
*
* @param env Java environment
* @param self class calling this function
* @param ids array of stringIds to find
*
* @return an array of strings, or null on error
*/
jobjectArray JNICALL ScriptMethodsStringNamespace::getStrings(JNIEnv *env, jobject self, jobjectArray ids)
{
UNREF(self);
if (ids == 0)
return 0;
if (!env->IsInstanceOf(ids, JavaLibrary::getClsStringIdArray()))
return 0;
jsize count = env->GetArrayLength(ids);
// create the string array to return
LocalObjectArrayRefPtr strings = createNewObjectArray(count, JavaLibrary::getClsString());
if (strings == LocalObjectArrayRef::cms_nullPtr)
return 0;
// fill the array
for (jsize i = 0; i < count; ++i)
{
LocalRefPtr id = getObjectArrayElement(LocalObjectArrayRefParam(ids), i);
setObjectArrayElement(*strings, i, LocalRef(getString(env, self, id->getValue())));
}
return strings->getReturnValue();
} // JavaLibrary::getStrings
//----------------------------------------------------------------------
/**
* Finds if a string is obscene.
*
* @param env Java environment
* @param self class calling this function
* @param data string to test
*
* @return true if the string is obscene, false if not
*/
jboolean JNICALL ScriptMethodsStringNamespace::isObscene(JNIEnv *env, jobject self, jstring data)
{
if (data == 0)
return JNI_FALSE;
JavaStringParam jtext(data);
Unicode::String text;
if (JavaLibrary::convert(jtext, text))
{
return NameManager::getInstance().isNameReserved(text);
}
return JNI_FALSE;
} // JavaLibrary::isObscene
//----------------------------------------------------------------------
/**
* Tests is a string is appropriate, whatever that means.
*
* @param env Java environment
* @param self class calling this function
* @param data string to test
*
* @return true if the string is appropriate, false if not
*/
jboolean JNICALL ScriptMethodsStringNamespace::isAppropriateText(JNIEnv *env, jobject self, jstring data)
{
if (data == 0)
return JNI_FALSE;
JavaStringParam jtext(data);
Unicode::String text;
if (JavaLibrary::convert(jtext, text))
{
return TextManager::isAppropriateText(text);
}
return JNI_FALSE;
} // JavaLibrary::isAppropriateText
//----------------------------------------------------------------------
@@ -0,0 +1,238 @@
// 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);
}
}
}
}
// ======================================================================
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,413 @@
// ScriptMethodsTriggerVolume.cpp
// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved.
// Author: Justin Randall
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "JavaLibrary.h"
#include "serverGame/AiLogManager.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/ContainerInterface.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/TriggerVolume.h"
#include "sharedLog/Log.h"
#include "sharedTerrain/TerrainObject.h"
#include "UnicodeUtils.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsTriggerVolumeNamespace
// ======================================================================
namespace ScriptMethodsTriggerVolumeNamespace
{
bool install();
void JNICALL createTriggerVolume(JNIEnv * env, jobject script, jlong target, jstring triggerVolumeName, jfloat radius, jboolean isPromiscuous);
jlongArray JNICALL getTriggerVolumeContents(JNIEnv * env, jobject script, jlong target, jstring triggerVolumeName);
jboolean JNICALL isInTriggerVolume(JNIEnv * env, jobject script, jlong owner, jstring triggerVolumeName, jlong target);
jfloat JNICALL getTriggerVolumeRadius(JNIEnv * env, jobject script, jlong targetObject, jstring triggerVolumeName);
jboolean JNICALL hasTriggerVolume(JNIEnv * env, jobject script, jlong target, jstring triggerVolumeName);
jboolean JNICALL isTriggerVolumePromiscuous(JNIEnv * env, jobject script, jlong me, jstring triggerVolumeName);
void JNICALL listenToTriggerEventsFrom(JNIEnv * env, jobject script, jlong self, jstring volumeName, jlong who);
void JNICALL removeTriggerVolume(JNIEnv * env, jobject script, jlong target, jstring triggerVolumeName);
void JNICALL setTriggerVolumeIsPromiscuous(JNIEnv * env, jobject script, jlong self, jstring triggerVolumeName, jboolean isPromiscuous);
void JNICALL stopListeningToTriggerEventsFrom(JNIEnv * env, jobject script, jlong self, jstring volumeName, jlong who);
jboolean JNICALL expelFromTriggerVolume(JNIEnv * env, jobject script, jlong self, jstring triggerVolumeName, jlong targetObject);
jboolean JNICALL confineToTriggerVolume(JNIEnv * env, jobject script, jlong self, jstring triggerVolumeName, jlong targetObject);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsTriggerVolumeNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsTriggerVolumeNamespace::c)}
JF("__createTriggerVolume", "(JLjava/lang/String;FZ)V", createTriggerVolume),
JF("_getTriggerVolumeContents", "(JLjava/lang/String;)[J", getTriggerVolumeContents),
JF("_isInTriggerVolume", "(JLjava/lang/String;J)Z", isInTriggerVolume),
JF("_getTriggerVolumeRadius", "(JLjava/lang/String;)F", getTriggerVolumeRadius),
JF("_hasTriggerVolume", "(JLjava/lang/String;)Z", hasTriggerVolume),
JF("_isTriggerVolumePromiscuous", "(JLjava/lang/String;)Z", isTriggerVolumePromiscuous),
JF("__addTriggerVolumeEventSource", "(JLjava/lang/String;J)V", listenToTriggerEventsFrom),
JF("__removeTriggerVolume", "(JLjava/lang/String;)V", removeTriggerVolume),
JF("__setTriggerVolumePromiscuous", "(JLjava/lang/String;Z)V", setTriggerVolumeIsPromiscuous),
JF("__removeTriggerVolumeEventSource", "(JLjava/lang/String;J)V", stopListeningToTriggerEventsFrom),
JF("_expelFromTriggerVolume", "(JLjava/lang/String;J)Z", expelFromTriggerVolume),
JF("_confineToTriggerVolume", "(JLjava/lang/String;J)Z", confineToTriggerVolume),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsTriggerVolumeNamespace::createTriggerVolume(JNIEnv * env, jobject script, jlong targetObject, jstring triggerVolumeName, jfloat radius, jboolean isPromiscuous)
{
JavaStringParam localTriggerVolumeName(triggerVolumeName);
if (script == 0 || env == 0)
return;
ServerObject * target = 0;
if (!JavaLibrary::getObject(targetObject, target))
return;
std::string name;
if(!JavaLibrary::convert(localTriggerVolumeName, name))
return;
float r = radius;
target->createTriggerVolume(r, name, isPromiscuous);
LOGC(AiLogManager::isLogging(target->getNetworkId()), "debug_ai", ("ScriptMethodsTriggerVolume::createTriggerVolume() object(%s:%s) volumeName(%s) radius(%.2f) promiscuous(%s)", target->getNetworkId().getValueString().c_str(), Unicode::wideToNarrow(target->getEncodedObjectName()).c_str(), name.c_str(), radius, isPromiscuous ? "yes" : "no"));
}
//-----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsTriggerVolumeNamespace::getTriggerVolumeContents(JNIEnv * env, jobject script, jlong targetObject, jstring triggerVolumeName)
{
JavaStringParam localTriggerVolumeName(triggerVolumeName);
if(script == 0 || env == 0)
return 0;
ServerObject * target = 0;
if (!JavaLibrary::getObject(targetObject, target))
return 0;
std::string name;
if(!JavaLibrary::convert(localTriggerVolumeName, name))
return 0;
const TriggerVolume * t = target->getTriggerVolume(name);
if(t == 0)
return 0;
int count = t->getContents().size();
LocalLongArrayRefPtr items = createNewLongArray(count);
TriggerVolume::ContentsSet::const_iterator begin = t->getContents().begin();
TriggerVolume::ContentsSet::const_iterator end = t->getContents().end();
TriggerVolume::ContentsSet::const_iterator i;
int index = 0;
jlong jlongTmp;
for (i = begin; i != end; ++i)
{
jlongTmp = ((*i)->getNetworkId()).getValue();
setLongArrayRegion(*items, index, 1, &jlongTmp);
index++;
}
return items->getReturnValue();
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsTriggerVolumeNamespace::isInTriggerVolume(JNIEnv * /*env*/, jobject /*script*/, jlong owner, jstring triggerVolumeName, jlong target)
{
ServerObject * ownerServerObject = 0;
if (!JavaLibrary::getObject(owner, ownerServerObject))
return JNI_FALSE;
ServerObject * targetServerObject = 0;
if (!JavaLibrary::getObject(target, targetServerObject))
return JNI_FALSE;
JavaStringParam localTriggerVolumeName(triggerVolumeName);
std::string name;
if(!JavaLibrary::convert(localTriggerVolumeName, name))
return JNI_FALSE;
TriggerVolume const * const triggerVolume = ownerServerObject->getTriggerVolume(name);
if(triggerVolume == 0)
return JNI_FALSE;
TriggerVolume::ContentsSet const & contents = triggerVolume->getContents();
return (contents.find(targetServerObject) != contents.end());
}
//-----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsTriggerVolumeNamespace::getTriggerVolumeRadius(JNIEnv * env, jobject script, jlong targetObject, jstring triggerVolumeName)
{
JavaStringParam localTriggerVolumeName(triggerVolumeName);
if(script == 0 || env == 0)
return 0;
ServerObject * target = 0;
if (!JavaLibrary::getObject(targetObject, target))
return 0;
std::string name;
if(!JavaLibrary::convert(localTriggerVolumeName, name))
return 0;
const TriggerVolume * t = target->getTriggerVolume(name);
if(t == 0)
return 0;
return t->getRadius();
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsTriggerVolumeNamespace::hasTriggerVolume(JNIEnv * env, jobject script, jlong targetObject, jstring triggerVolumeName)
{
JavaStringParam localTriggerVolumeName(triggerVolumeName);
if(script == 0 || env == 0)
return JNI_FALSE;
ServerObject * target = 0;
if (!JavaLibrary::getObject(targetObject, target))
return JNI_FALSE;
std::string name;
if(!JavaLibrary::convert(localTriggerVolumeName, name))
return JNI_FALSE;
const TriggerVolume * t = target->getTriggerVolume(name);
if(t == 0)
return JNI_FALSE;
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsTriggerVolumeNamespace::isTriggerVolumePromiscuous(JNIEnv * env, jobject script, jlong me, jstring triggerVolumeName)
{
JavaStringParam localTriggerVolumeName(triggerVolumeName);
jboolean result = JNI_FALSE;
if(script == 0 || env == 0)
return result;
ServerObject * target = 0;
if (!JavaLibrary::getObject(me, target))
return result;
std::string name;
if(!JavaLibrary::convert(localTriggerVolumeName, name))
return result;
const TriggerVolume * t = target->getTriggerVolume(name);
if(t == 0)
return result;
result = t->getPromiscuous();
return result;
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsTriggerVolumeNamespace::listenToTriggerEventsFrom(JNIEnv * env, jobject script, jlong self, jstring volumeName, jlong who)
{
JavaStringParam localVolumeName(volumeName);
ServerObject * me = 0;
if (!JavaLibrary::getObject(self, me))
return;
ServerObject * target = 0;
if(!JavaLibrary::getObject(who, target))
return;
std::string name;
if(!JavaLibrary::convert(localVolumeName, name))
return;
TriggerVolume * t = me->getTriggerVolume(name);
if(! t)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsTriggerVolume::listenToTriggerEventsFrom() Unable to find triggerVolume(%s) for %s listening for %s", name.c_str(), me->getNetworkId().getValueString().c_str(), target->getNetworkId().getValueString().c_str()));
return;
}
t->addEventSource(target->getNetworkId());
LOGC(AiLogManager::isLogging(me->getNetworkId()), "debug_ai", ("ScriptMethodsTriggerVolume::listenToTriggerEventsFrom() object(%s:%s) from(%s:%s) volumeName(%s)", me->getNetworkId().getValueString().c_str(), Unicode::wideToNarrow(me->getEncodedObjectName()).c_str(), target->getNetworkId().getValueString().c_str(), Unicode::wideToNarrow(target->getEncodedObjectName()).c_str(), name.c_str()));
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsTriggerVolumeNamespace::removeTriggerVolume(JNIEnv * env, jobject script, jlong targetObject, jstring triggerVolumeName)
{
JavaStringParam localTriggerVolumeName(triggerVolumeName);
if(script == 0 || env == 0)
return;
ServerObject * target = 0;
if (!JavaLibrary::getObject(targetObject, target))
return;
std::string name;
if(!JavaLibrary::convert(localTriggerVolumeName, name))
return;
LOGC(AiLogManager::isLogging(target->getNetworkId()), "debug_ai", ("ScriptMethodsTriggerVolume::removeTriggerVolume() object(%s:%s) volumeName(%s)", target->getNetworkId().getValueString().c_str(), Unicode::wideToNarrow(target->getEncodedObjectName()).c_str(), name.c_str()));
target->removeTriggerVolume(name);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsTriggerVolumeNamespace::setTriggerVolumeIsPromiscuous(JNIEnv * env, jobject script, jlong self, jstring volumeName, jboolean isPromiscuous)
{
JavaStringParam localVolumeName(volumeName);
ServerObject * me = 0;
if (!JavaLibrary::getObject(self, me))
return;
std::string name;
if(!JavaLibrary::convert(localVolumeName, name))
return;
TriggerVolume * t = me->getTriggerVolume(name);
if(! t)
return;
t->setPromiscuous(isPromiscuous);
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsTriggerVolumeNamespace::stopListeningToTriggerEventsFrom(JNIEnv * env, jobject script, jlong self, jstring volumeName, jlong who)
{
JavaStringParam localVolumeName(volumeName);
ServerObject * me = 0;
if (!JavaLibrary::getObject(self, me))
return;
ServerObject * target = 0;
if(!JavaLibrary::getObject(who, target))
return;
std::string name;
if(!JavaLibrary::convert(localVolumeName, name))
return;
TriggerVolume * t = me->getTriggerVolume(name);
if(! t)
return;
t->removeEventSource(target->getNetworkId());
LOGC(ConfigServerGame::isAiLoggingEnabled(), "debug_ai", ("ScriptMethodsTriggerVolume::stopListeningToTriggerEventsFrom() object(%s:%s) from(%s:%s) volumeName(%s)", me->getNetworkId().getValueString().c_str(), Unicode::wideToNarrow(me->getEncodedObjectName()).c_str(), target->getNetworkId().getValueString().c_str(), Unicode::wideToNarrow(target->getEncodedObjectName()).c_str(), name.c_str()));
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsTriggerVolumeNamespace::expelFromTriggerVolume(JNIEnv * env, jobject script, jlong self, jstring triggerVolumeName, jlong targetObject)
{
const float EXPEL_DISTANCE = 10.0f;
JavaStringParam localTriggerVolumeName(triggerVolumeName);
if (script == 0 || env == 0)
return JNI_FALSE;
ServerObject * me = 0;
if (!JavaLibrary::getObject(self, me))
return JNI_FALSE;
ServerObject * target = 0;
if (!JavaLibrary::getObject(targetObject, target))
return JNI_FALSE;
std::string name;
if (!JavaLibrary::convert(localTriggerVolumeName, name))
return JNI_FALSE;
const TriggerVolume * triggerVolume = me->getTriggerVolume(name);
if (triggerVolume == 0)
return JNI_FALSE;
Vector const &trigLoc = triggerVolume->getOwner().getPosition_w();
Vector newLoc(target->getPosition_w());
newLoc -= trigLoc;
newLoc.normalize();
newLoc *= triggerVolume->getRadius()+EXPEL_DISTANCE;
newLoc += trigLoc;
IGNORE_RETURN(TerrainObject::getInstance()->getHeightForceChunkCreation(newLoc, newLoc.y));
target->teleportObject(newLoc, NetworkId::cms_invalid, "", Vector::zero, "");
return JNI_TRUE;
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsTriggerVolumeNamespace::confineToTriggerVolume(JNIEnv * env, jobject script, jlong self, jstring triggerVolumeName, jlong targetObject)
{
const float CONFINE_DISTANCE = 10.0f;
JavaStringParam localTriggerVolumeName(triggerVolumeName);
if (script == 0 || env == 0)
return JNI_FALSE;
ServerObject * me = 0;
if (!JavaLibrary::getObject(self, me))
return JNI_FALSE;
ServerObject * target = 0;
if (!JavaLibrary::getObject(targetObject, target))
return JNI_FALSE;
std::string name;
if (!JavaLibrary::convert(localTriggerVolumeName, name))
return JNI_FALSE;
const TriggerVolume * triggerVolume = me->getTriggerVolume(name);
if (triggerVolume == 0)
return JNI_FALSE;
Vector const &trigLoc = triggerVolume->getOwner().getPosition_w();
Vector newLoc(target->getPosition_w());
newLoc -= trigLoc;
newLoc.normalize();
newLoc *= triggerVolume->getRadius()-CONFINE_DISTANCE;
newLoc += trigLoc;
target->teleportObject(newLoc, NetworkId::cms_invalid, "", Vector::zero, "");
return JNI_TRUE;
}
//-----------------------------------------------------------------------
@@ -0,0 +1,369 @@
// ======================================================================
//
// ScriptMethodsVeteran.cpp
// copyright (c) 2004 Sony Online Entertainment
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/GameServer.h"
#include "serverGame/VeteranRewardManager.h"
#include "serverNetworkMessages/AccountFeatureIdRequest.h"
#include "sharedGame/PlatformFeatureBits.h"
#include "sharedObject/NetworkIdManager.h"
#include "UnicodeUtils.h"
// ======================================================================
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsVeteranNamespace
// ======================================================================
namespace ScriptMethodsVeteranNamespace
{
bool install();
void JNICALL veteranWriteAccountDataToObjvars(JNIEnv * env, jobject self, jlong player);
jobjectArray JNICALL veteranGetTriggeredEvents(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL veteranAccountFeatureIdRequest(JNIEnv * env, jobject self, jlong player);
jobjectArray JNICALL veteranGetRewardChoicesDescriptions(JNIEnv *env, jobject self, jlong player, jstring event);
jobjectArray JNICALL veteranGetRewardChoicesTags(JNIEnv *env, jobject self, jlong player, jstring event);
jboolean JNICALL veteranClaimReward(JNIEnv *env, jobject self, jlong player, jstring event, jstring rewardTag);
jstring JNICALL veteranGetEventAnnouncement(JNIEnv *env, jobject self, jstring event);
jstring JNICALL veteranGetEventDescription(JNIEnv *env, jobject self, jstring event);
jstring JNICALL veteranGetEventUrl(JNIEnv *env, jobject self, jstring event);
jboolean JNICALL veteranIsEventAccountUnique(JNIEnv *env, jobject self, jstring event);
jboolean JNICALL veteranIsItemAccountUnique(JNIEnv *env, jobject self, jstring item);
jboolean JNICALL veteranIsItemAccountUniqueFeatureId(JNIEnv *env, jobject self, jstring item);
jboolean JNICALL veteranCanTradeInReward(JNIEnv *env, jobject self, jlong player, jlong item);
void JNICALL veteranTradeInReward(JNIEnv *env, jobject self, jlong player, jlong item);
void JNICALL adjustSwgTcgAccountFeatureId(JNIEnv *env, jobject self, jlong player, jlong item, jint featureId, jint adjustment);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsVeteranNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsVeteranNamespace::c)}
JF("_veteranWriteAccountDataToObjvars", "(J)V", veteranWriteAccountDataToObjvars),
JF("_veteranGetTriggeredEvents", "(J)[Ljava/lang/String;", veteranGetTriggeredEvents),
JF("_veteranAccountFeatureIdRequest", "(J)Z", veteranAccountFeatureIdRequest),
JF("_veteranGetRewardChoicesDescriptions", "(JLjava/lang/String;)[Ljava/lang/String;", veteranGetRewardChoicesDescriptions),
JF("_veteranGetRewardChoicesTags", "(JLjava/lang/String;)[Ljava/lang/String;", veteranGetRewardChoicesTags),
JF("_veteranClaimReward", "(JLjava/lang/String;Ljava/lang/String;)Z", veteranClaimReward),
JF("veteranGetEventAnnouncement", "(Ljava/lang/String;)Ljava/lang/String;", veteranGetEventAnnouncement),
JF("veteranGetEventDescription", "(Ljava/lang/String;)Ljava/lang/String;", veteranGetEventDescription),
JF("veteranGetEventUrl", "(Ljava/lang/String;)Ljava/lang/String;", veteranGetEventUrl),
JF("veteranIsEventAccountUnique", "(Ljava/lang/String;)Z", veteranIsEventAccountUnique),
JF("veteranIsItemAccountUnique", "(Ljava/lang/String;)Z", veteranIsItemAccountUnique),
JF("veteranIsItemAccountUniqueFeatureId", "(Ljava/lang/String;)Z", veteranIsItemAccountUniqueFeatureId),
JF("_veteranCanTradeInReward", "(JJ)Z", veteranCanTradeInReward),
JF("_veteranTradeInReward", "(JJ)V", veteranTradeInReward),
JF("_adjustSwgTcgAccountFeatureId", "(JJII)V", adjustSwgTcgAccountFeatureId),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
jobjectArray JNICALL ScriptMethodsVeteranNamespace::veteranGetTriggeredEvents(JNIEnv * /*env*/, jobject /*self*/, jlong player)
{
ServerObject const * const so = safe_cast<ServerObject const *>(NetworkIdManager::getObjectById(NetworkId(player)));
CreatureObject const * const playerCreature = so ? so->asCreatureObject() : NULL;
if (playerCreature)
{
std::vector<std::string> eventsIds;
VeteranRewardManager::getTriggeredEventsIds(*playerCreature, eventsIds);
if (eventsIds.empty())
return NULL;
int i = 0;
LocalObjectArrayRefPtr valueArray = createNewObjectArray(eventsIds.size(), JavaLibrary::getClsString());
for (std::vector<std::string>::const_iterator iter = eventsIds.begin(); iter != eventsIds.end(); ++iter)
{
JavaString jval(*iter);
setObjectArrayElement(*valueArray, i++, jval);
}
return valueArray->getReturnValue();
}
return NULL;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsVeteranNamespace::veteranAccountFeatureIdRequest(JNIEnv * /*env*/, jobject /*self*/, jlong player)
{
ServerObject * const so = safe_cast<ServerObject *>(NetworkIdManager::getObjectById(NetworkId(player)));
CreatureObject * const playerCreature = so ? so->asCreatureObject() : NULL;
if (playerCreature)
{
Client * const client = playerCreature->getClient();
if (client && !client->isUsingAdminLogin())
{
AccountFeatureIdRequest const req(playerCreature->getNetworkId(), GameServer::getInstance().getProcessId(), playerCreature->getNetworkId(), static_cast<StationId>(client->getStationId()), PlatformGameCode::SWG, AccountFeatureIdRequest::RR_ReloadRewardCheck);
client->sendToConnectionServer(req);
return JNI_TRUE;
}
}
return JNI_FALSE;
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsVeteranNamespace::veteranGetRewardChoicesDescriptions(JNIEnv * /*env*/, jobject /*self*/, jlong player, jstring event)
{
ServerObject const * const so = safe_cast<ServerObject const *>(NetworkIdManager::getObjectById(NetworkId(player)));
CreatureObject const * const playerCreature = so ? so->asCreatureObject() : NULL;
if (playerCreature)
{
std::string eventString;
JavaStringParam temp(event);
if (JavaLibrary::convert(temp,eventString))
{
std::vector<std::string> value;
VeteranRewardManager::getRewardChoicesDescriptions(*playerCreature, eventString, value);
LocalObjectArrayRefPtr valueArray = createNewObjectArray(static_cast<long>(value.size()), JavaLibrary::getClsString());
for (size_t i = 0; i < value.size(); ++i)
{
JavaString jval(value[i]);
setObjectArrayElement(*valueArray, static_cast<long>(i), jval);
}
return valueArray->getReturnValue();
}
}
return NULL;
}
// ----------------------------------------------------------------------
jobjectArray JNICALL ScriptMethodsVeteranNamespace::veteranGetRewardChoicesTags(JNIEnv * /*env*/, jobject /*self*/, jlong player, jstring event)
{
ServerObject const * const so = safe_cast<ServerObject const *>(NetworkIdManager::getObjectById(NetworkId(player)));
CreatureObject const * const playerCreature = so ? so->asCreatureObject() : NULL;
if (playerCreature)
{
std::string eventString;
JavaStringParam temp(event);
if (JavaLibrary::convert(temp,eventString))
{
std::vector<Unicode::String> value;
VeteranRewardManager::getRewardChoicesTags(*playerCreature, eventString, value);
LocalObjectArrayRefPtr valueArray = createNewObjectArray(static_cast<long>(value.size()), JavaLibrary::getClsString());
for (size_t i = 0; i < value.size(); ++i)
{
JavaString jval(value[i]);
setObjectArrayElement(*valueArray, static_cast<long>(i), jval);
}
return valueArray->getReturnValue();
}
}
return NULL;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsVeteranNamespace::veteranClaimReward(JNIEnv * /*env*/, jobject /*self*/, jlong player, jstring event, jstring rewardTag)
{
ServerObject const * const so = safe_cast<ServerObject const *>(NetworkIdManager::getObjectById(NetworkId(player)));
CreatureObject const * const playerCreature = so ? so->asCreatureObject() : NULL;
if (playerCreature)
{
std::string eventString;
JavaStringParam temp(event);
if (JavaLibrary::convert(temp,eventString))
{
std::string rewardTagString;
JavaStringParam temp2(rewardTag);
if (JavaLibrary::convert(temp2,rewardTagString))
{
std::string debugMessage;
if (VeteranRewardManager::claimRewards(*playerCreature, eventString, rewardTagString, &debugMessage))
return true;
else
DEBUG_REPORT_LOG(true,("Claim failed: %s",debugMessage.c_str()));
}
}
}
return false;
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsVeteranNamespace::veteranGetEventAnnouncement(JNIEnv * /*env*/, jobject /*self*/, jstring event)
{
std::string eventString;
JavaStringParam temp(event);
if (JavaLibrary::convert(temp,eventString))
{
StringId const * const eventStringId = VeteranRewardManager::getEventAnnouncement(eventString);
if (eventStringId)
{
JavaString eventAnnouncement(Unicode::narrowToWide(std::string("@") + eventStringId->getCanonicalRepresentation()));
return eventAnnouncement.getReturnValue();
}
}
return NULL;
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsVeteranNamespace::veteranGetEventDescription(JNIEnv * /*env*/, jobject /*self*/, jstring event)
{
std::string eventString;
JavaStringParam temp(event);
if (JavaLibrary::convert(temp,eventString))
{
StringId const * const eventStringId = VeteranRewardManager::getEventDescription(eventString);
if (eventStringId)
{
JavaString eventDescription(Unicode::narrowToWide(std::string("@") + eventStringId->getCanonicalRepresentation()));
return eventDescription.getReturnValue();
}
}
return NULL;
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsVeteranNamespace::veteranGetEventUrl(JNIEnv * /*env*/, jobject /*self*/, jstring event)
{
std::string eventString;
JavaStringParam temp(event);
if (JavaLibrary::convert(temp,eventString))
{
std::string const * const eventUrl = VeteranRewardManager::getEventUrl(eventString);
if (eventUrl)
{
JavaString temp2(*eventUrl);
return temp2.getReturnValue();
}
}
return NULL;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsVeteranNamespace::veteranIsEventAccountUnique(JNIEnv * /*env*/, jobject /*self*/, jstring event)
{
std::string eventString;
JavaStringParam temp(event);
if (JavaLibrary::convert(temp,eventString))
{
return VeteranRewardManager::isEventAccountUnique(eventString);
}
else
return false;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsVeteranNamespace::veteranIsItemAccountUnique(JNIEnv * /*env*/, jobject /*self*/, jstring item)
{
std::string itemString;
JavaStringParam temp(item);
if (JavaLibrary::convert(temp,itemString))
{
return VeteranRewardManager::isItemAccountUnique(itemString);
}
else
return false;
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsVeteranNamespace::veteranIsItemAccountUniqueFeatureId(JNIEnv * /*env*/, jobject /*self*/, jstring item)
{
std::string itemString;
JavaStringParam temp(item);
if (JavaLibrary::convert(temp,itemString))
{
return VeteranRewardManager::isItemAccountUniqueFeatureId(itemString);
}
else
return false;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsVeteranNamespace::veteranWriteAccountDataToObjvars(JNIEnv * /*env*/, jobject /*self*/, jlong player)
{
ServerObject * const so = safe_cast<ServerObject *>(NetworkIdManager::getObjectById(NetworkId(player)));
CreatureObject * const playerCreature = so ? so->asCreatureObject() : NULL;
if (playerCreature)
VeteranRewardManager::writeAccountDataToObjvars(*playerCreature);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsVeteranNamespace::veteranCanTradeInReward(JNIEnv *env, jobject self, jlong player, jlong item)
{
CreatureObject const * playerCreature = NULL;
if (!JavaLibrary::getObject(player, playerCreature) || !playerCreature)
return JNI_FALSE;
ServerObject * itemObject = NULL;
if (!JavaLibrary::getObject(item, itemObject) || !itemObject)
return JNI_FALSE;
// just validate the trade in
return VeteranRewardManager::tradeInReward(*playerCreature, *itemObject, true);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsVeteranNamespace::veteranTradeInReward(JNIEnv *env, jobject self, jlong player, jlong item)
{
CreatureObject const * playerCreature = NULL;
if (!JavaLibrary::getObject(player, playerCreature) || !playerCreature)
return;
ServerObject * itemObject = NULL;
if (!JavaLibrary::getObject(item, itemObject) || !itemObject)
return;
// validate and perform the trade in
VeteranRewardManager::tradeInReward(*playerCreature, *itemObject, false);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsVeteranNamespace::adjustSwgTcgAccountFeatureId(JNIEnv *env, jobject self, jlong player, jlong item, jint featureId, jint adjustment)
{
CreatureObject const * playerCreature = NULL;
if (!JavaLibrary::getObject(player, playerCreature) || !playerCreature)
return;
ServerObject * itemObject = NULL;
if (!JavaLibrary::getObject(item, itemObject) || !itemObject)
return;
VeteranRewardManager::tcgRedemption(*playerCreature, *itemObject, featureId, adjustment);
}
// ======================================================================
@@ -0,0 +1,441 @@
// ScriptMethodsWaypoint.cpp
// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved.
// Author: Justin Randall
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/MissionObject.h"
#include "serverGame/ObjectIdManager.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/Region.h"
#include "serverGame/RegionMaster.h"
#include "serverGame/ServerWorld.h"
#include "sharedFoundation/TemporaryCrcString.h"
#include "sharedGame/Waypoint.h"
#include "sharedMathArchive/VectorArchive.h"
namespace ScriptMethodsWaypointNamespace
{
NetworkId getWaypointCellIdFromTemplateNameAndCelllName(jstring const & buildingTemplate, jstring const & cellName)
{
JavaStringParam jbt(buildingTemplate);
Unicode::String jbtn;
if (!JavaLibrary::convert(jbt, jbtn))
{
DEBUG_WARNING(true, ("JavaLibrary::createWaypointInMissionInternal(): failed to buildingTemplate to a string"));
}
TemporaryCrcString crcBuilding(Unicode::wideToNarrow(jbtn).c_str(), true);
uint64 buildingValue(crcBuilding.getCrc());
buildingValue <<= static_cast<uint64>(32);
JavaStringParam jcn(cellName);
Unicode::String jcnb;
if (!JavaLibrary::convert(jcn, jcnb))
{
DEBUG_WARNING(true, ("JavaLibrary::createWaypointInMissionInternal(): failed to cellName to a string"));
}
TemporaryCrcString crcCell(Unicode::wideToNarrow(jcnb).c_str(), true);
uint64 cellValue(crcCell.getCrc());
// rls - since the cell id is not used in the waypoint system,
// we will combine the building and cell name crcs into the cell id.
NetworkId const staticCellId(static_cast<NetworkId::NetworkIdType>(buildingValue | cellValue));
return staticCellId;
}
bool install();
jlong JNICALL createWaypointInDatapadFromLocation (JNIEnv * env, jobject self, jlong target, jobject loc);
jlong JNICALL createWaypointInMissionObjectFromLocation (JNIEnv * env, jobject self, jlong target, jobject loc);
jlong JNICALL createWaypointInDatapadFromObject (JNIEnv * env, jobject self, jlong target, jlong obj);
jlong JNICALL createWaypointInMissionObjectFromObject (JNIEnv * env, jobject self, jlong target, jlong obj);
jlong JNICALL createWaypointInDatapadWithLimitsFromLocation (JNIEnv * env, jobject self, jlong target, jobject obj);
jlong JNICALL createWaypointInMissionInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName);
jlong JNICALL createWaypointInDatapadInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName);
void JNICALL destroyWaypointInDatapad (JNIEnv * env, jobject self, jlong waypoint, jlong player);
jboolean JNICALL getWaypointActive (JNIEnv * env, jobject self, jlong waypoint);
jobject JNICALL getWaypointLocation (JNIEnv * env, jobject self, jlong waypoint);
jstring JNICALL getWaypointName (JNIEnv *, jobject, jlong waypoint);
jlongArray JNICALL getWaypointsInDatapad (JNIEnv *, jobject, jlong player);
jobject JNICALL getWaypointRegion (JNIEnv * env, jobject self, jlong waypoint);
void JNICALL setWaypointActive (JNIEnv * env, jobject self, jlong waypoint, jboolean isActive);
void JNICALL setWaypointName (JNIEnv * env, jobject, jlong waypoint, jstring name);
void JNICALL setWaypointLocation (JNIEnv * env, jobject self, jlong waypoint, jobject loc);
jboolean JNICALL setWaypointColor (JNIEnv * env, jobject self, jlong waypoint, jstring jscolor);
}
using namespace JNIWrappersNamespace;
using namespace ScriptMethodsWaypointNamespace;
//========================================================================
// install
//========================================================================
bool ScriptMethodsWaypointNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsWaypointNamespace::c)}
JF("_createWaypointInDatapad", "(JLscript/location;)J", createWaypointInDatapadFromLocation),
JF("_createWaypointInMissionObject", "(JLscript/location;)J", createWaypointInMissionObjectFromLocation),
JF("_createWaypointInDatapad", "(JJ)J", createWaypointInDatapadFromObject),
JF("_createWaypointInMissionObject", "(JJ)J", createWaypointInMissionObjectFromObject),
JF("_createWaypointInDatapadWithLimits", "(JLscript/location;)J", createWaypointInDatapadWithLimitsFromLocation),
JF("_createWaypointInMissionInternal", "(JLscript/location;Ljava/lang/String;Ljava/lang/String;)J", createWaypointInMissionInternal),
JF("_createWaypointInDatapadInternal", "(JLscript/location;Ljava/lang/String;Ljava/lang/String;)J", createWaypointInDatapadInternal),
JF("_destroyWaypointInDatapad", "(JJ)V", destroyWaypointInDatapad),
JF("_getWaypointActive", "(J)Z", getWaypointActive),
JF("_getWaypointsInDatapad", "(J)[J", getWaypointsInDatapad),
JF("_getWaypointLocation", "(J)Lscript/location;", getWaypointLocation),
JF("_getWaypointName", "(J)Ljava/lang/String;", getWaypointName),
JF("_getWaypointRegion", "(J)Lscript/region;", getWaypointRegion),
JF("_setWaypointName", "(JLjava/lang/String;)V", setWaypointName),
JF("__setWaypointActiveNative", "(JZ)V", setWaypointActive),
JF("__setWaypointLocationNative", "(JLscript/location;)V", setWaypointLocation),
JF("__setWaypointColorNative", "(JLjava/lang/String;)Z", setWaypointColor),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//-----------------------------------------------------------------------
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadFromLocation(JNIEnv * env, jobject self, jlong target, jobject jLoc)
{
CreatureObject *targetCreature = 0;
Location location;
if (env && target && jLoc && JavaLibrary::getObject(target, targetCreature) && ScriptConversion::convert(LocalRefParam(jLoc), location))
{
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
if(player)
{
Waypoint waypoint(player->createWaypoint(location, true));
return (waypoint.getNetworkId()).getValue();
}
}
return 0;
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadWithLimitsFromLocation(JNIEnv * env, jobject self, jlong target, jobject jLoc)
{
CreatureObject *targetCreature = 0;
Location location;
if (env && target && jLoc && JavaLibrary::getObject(target, targetCreature) && ScriptConversion::convert(LocalRefParam(jLoc), location))
{
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
if(player)
{
Waypoint waypoint(player->createWaypoint(location, false));
if (waypoint.isValid())
return (waypoint.getNetworkId()).getValue();
}
}
return 0;
}
//-----------------------------------------------------------------------
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInMissionObjectFromLocation(JNIEnv * env, jobject self, jlong target, jobject jLoc)
{
MissionObject *targetMissionObj = 0;
Location location;
if (env && target && jLoc && JavaLibrary::getObject(target, targetMissionObj) && ScriptConversion::convert(LocalRefParam(jLoc), location))
{
Waypoint w = targetMissionObj->getWaypoint();
w.setLocation(location);
targetMissionObj->setWaypoint(w);
return (w.getNetworkId()).getValue();
}
return 0;
}
//-----------------------------------------------------------------------
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadFromObject(JNIEnv * env, jobject self, jlong target, jlong obj)
{
CreatureObject *targetCreature = 0;
ServerObject *s = 0;
if (env && target && obj && JavaLibrary::getObject(target, targetCreature) && JavaLibrary::getObject(obj, s))
{
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
if(player)
{
Waypoint w(player->createWaypoint(Location(s->getPosition_w(), NetworkId::cms_invalid, Location::getCrcBySceneName(ServerWorld::getSceneId())), true));
w.setName(s->getAssignedObjectName());
return (w.getNetworkId()).getValue();
}
}
return 0;
}
//-----------------------------------------------------------------------
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInMissionObjectFromObject(JNIEnv * env, jobject self, jlong target, jlong obj)
{
MissionObject *targetMissionObj = 0;
ServerObject *s = 0;
if (env && target && obj && JavaLibrary::getObject(target, targetMissionObj) && JavaLibrary::getObject(obj, s))
{
Waypoint w = targetMissionObj->getWaypoint();
w.setLocation(Location(s->getPosition_w(), NetworkId::cms_invalid, Location::getCrcBySceneName(ServerWorld::getSceneId())));
w.setName(s->getAssignedObjectName());
targetMissionObj->setWaypoint(w);
return (w.getNetworkId()).getValue();
}
return 0;
}
//-----------------------------------------------------------------------
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInMissionInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName)
{
MissionObject *targetMissionObj = 0;
Location location;
if (env && target && jLoc && JavaLibrary::getObject(target, targetMissionObj) && ScriptConversion::convert(LocalRefParam(jLoc), location))
{
Waypoint w = targetMissionObj->getWaypoint();
NetworkId const & staticCellId = getWaypointCellIdFromTemplateNameAndCelllName(buildingTemplate, cellName);
location.setCell(staticCellId);
w.setLocation(location);
targetMissionObj->setWaypoint(w);
return (w.getNetworkId()).getValue();
}
return 0;
}
//-----------------------------------------------------------------------
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName)
{
CreatureObject *targetCreature = 0;
Location location;
if (env && target && jLoc && JavaLibrary::getObject(target, targetCreature) && ScriptConversion::convert(LocalRefParam(jLoc), location))
{
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
if(player)
{
NetworkId const & staticCellId = getWaypointCellIdFromTemplateNameAndCelllName(buildingTemplate, cellName);
location.setCell(staticCellId);
Waypoint waypoint(player->createWaypoint(location, true));
if (waypoint.isValid())
return (waypoint.getNetworkId()).getValue();
}
}
return 0;
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsWaypointNamespace::destroyWaypointInDatapad(JNIEnv *, jobject, jlong waypoint, jlong player)
{
CreatureObject * targetCreature = 0;
if (JavaLibrary::getObject(player, targetCreature))
{
PlayerObject * p = PlayerCreatureController::getPlayerObject(targetCreature);
if(p)
{
if(waypoint)
{
NetworkId id(waypoint);
p->destroyWaypoint(id);
}
}
}
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsWaypointNamespace::getWaypointActive(JNIEnv * env, jobject self, jlong waypoint)
{
jboolean result = JNI_FALSE;
if(env)
{
if(waypoint)
{
NetworkId id(waypoint);
const Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
result = w.isActive();
}
}
}
return result;
}
//-----------------------------------------------------------------------
jobject JNICALL ScriptMethodsWaypointNamespace::getWaypointLocation(JNIEnv * env, jobject self, jlong waypoint)
{
if(waypoint)
{
NetworkId id(waypoint);
const Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
LocalRefPtr result;
if (ScriptConversion::convert(w.getLocation(), result))
return result->getReturnValue();
}
}
return 0;
}
//-----------------------------------------------------------------------
jobject JNICALL ScriptMethodsWaypointNamespace::getWaypointRegion(JNIEnv * env, jobject self, jlong waypoint)
{
if (waypoint != 0)
{
NetworkId id(waypoint);
const Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
const Region * region = RegionMaster::getSmallestVisibleRegionAtPoint(w.getLocation().getSceneId(), w.getLocation().getCoordinates().x, w.getLocation().getCoordinates().z);
if (region != NULL)
{
LocalRefPtr result;
if (ScriptConversion::convert(*region, result))
return result->getReturnValue();
}
}
}
return 0;
}
//-----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsWaypointNamespace::getWaypointsInDatapad(JNIEnv *, jobject, jlong player)
{
CreatureObject * creature = 0;
if (JavaLibrary::getObject(player, creature))
{
PlayerObject * player = PlayerCreatureController::getPlayerObject(creature);
if (player)
{
std::vector<NetworkId> waypoints;
player->getWaypointsInDatapad(waypoints);
LocalLongArrayRefPtr result;
if (ScriptConversion::convert(waypoints, result))
return result->getReturnValue();
}
}
return 0;
}
//-----------------------------------------------------------------------
jstring JNICALL ScriptMethodsWaypointNamespace::getWaypointName(JNIEnv *, jobject, jlong waypoint)
{
jstring result = 0;
if(waypoint)
{
NetworkId id(waypoint);
const Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
result = JavaString(w.getName()).getReturnValue();
}
}
return result;
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsWaypointNamespace::setWaypointActive(JNIEnv * env, jobject self, jlong waypoint, jboolean isActive)
{
if(env)
{
if(waypoint)
{
NetworkId id(waypoint);
Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
w.setActive(isActive == JNI_TRUE);
}
}
}
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsWaypointNamespace::setWaypointLocation(JNIEnv * env, jobject self, jlong waypoint, jobject jLoc)
{
if(env)
{
if(waypoint)
{
if(jLoc)
{
NetworkId id(waypoint);
Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
Location location;
if(ScriptConversion::convert(LocalRefParam(jLoc), location))
{
w.setLocation(location);
}
}
}
}
}
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsWaypointNamespace::setWaypointName(JNIEnv *, jobject, jlong waypoint, jstring name)
{
JavaStringParam localName(name);
NetworkId id(waypoint);
Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
Unicode::String n;
if (!JavaLibrary::convert (localName, n))
{
DEBUG_WARNING (true, ("setWaypointColor (): failed to convert name to string"));
}
else
{
w.setName(n);
}
}
}
//-----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsWaypointNamespace::setWaypointColor(JNIEnv * env, jobject self, jlong waypoint, jstring jscolor)
{
JavaStringParam localColor(jscolor);
NetworkId id(waypoint);
Waypoint w = Waypoint::getWaypointById(id);
if(w.isValid())
{
std::string color;
if (!JavaLibrary::convert (localColor, color))
{
DEBUG_WARNING (true, ("setWaypointColor (): failed to convert color to string"));
return JNI_FALSE;
}
w.setColor(Waypoint::getColorIdByName(color));
}
return JNI_TRUE;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,563 @@
// ScriptParamArchive.cpp
// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved.
// Author: Justin Randall
//-----------------------------------------------------------------------
#include "serverScript/FirstServerScript.h"
#include "serverScript/ScriptParamArchive.h"
#include "Archive/Archive.h"
#include "UnicodeUtils.h"
#include "localizationArchive/StringIdArchive.h"
#include "serverScript/ScriptParameters.h"
#include "sharedFoundation/NetworkIdArchive.h"
#include "sharedGame/AttribMod.h"
#include "sharedGame/AttribModArchive.h"
#include "sharedMathArchive/VectorArchive.h"
#include "sharedNetworkMessages/ObjectMenuRequestData.h"
#include "sharedNetworkMessages/ObjectMenuRequestDataArchive.h"
#include "sharedObject/CachedNetworkIdArchive.h"
#include "sharedUtility/ValueDictionary.h"
#include "sharedUtility/ValueDictionaryArchive.h"
#include "unicodeArchive/UnicodeArchive.h"
#include <deque>
//-----------------------------------------------------------------------
namespace Archive
{
void get(ReadIterator & source, std::vector<const std::vector<NetworkId> *> & target)
{
target.clear();
signed int length = 0;
get(source, length);
for (int i = 0; i < length; ++i)
{
std::vector<NetworkId> * inner = new std::vector<NetworkId>();
NOT_NULL(inner);
signed int innerLength = 0;
get(source, innerLength);
NetworkId id;
for (int j = 0; j < innerLength; ++j)
{
get(source, id);
inner->push_back(id);
}
target.push_back(inner);
}
}
void put(ByteStream & target, const std::vector<const std::vector<NetworkId> *> & source)
{
signed int length = source.size();
put(target, length);
for (int i = 0; i < length; ++i)
{
const std::vector<NetworkId> * inner = source[i];
signed int innerLength = 0;
if (inner != NULL)
innerLength = inner->size();
put(target, innerLength);
for (int j = 0; j < innerLength; ++j)
{
put(target, inner->at(j));
}
}
}
//-----------------------------------------------------------------------
void get(ReadIterator & source, Param & target)
{
Param * p = &target;
p->m_owned = true;
int paramType;
get(source, paramType);
p->m_type = static_cast<Param::ParamType>(paramType);
get(source, p->m_name);
switch(paramType)
{
case Param::BOOL:
{
get(source, p->m_param.bParam);
}
break;
case Param::BOOL_ARRAY:
{
std::deque<bool> * b = new std::deque<bool>;
get(source, *b);
p->m_param.baParam = b;
}
break;
case Param::INT:
{
get(source, p->m_param.iParam);
}
break;
case Param::INT_ARRAY:
{
std::vector<int> * v = new std::vector<int>;
get(source, *v);
p->m_param.iaParam = v;
}
break;
case Param::FLOAT:
{
get(source, p->m_param.fParam);
}
break;
case Param::FLOAT_ARRAY:
{
std::vector<float> * v = new std::vector<float>;
get(source, *v);
p->m_param.faParam = v;
}
break;
case Param::STRING:
{
std::string s;
get(source, s);
char * str = new char[s.length() + 1];
strcpy(str, s.c_str());
p->m_param.sParam = str;
}
break;
case Param::STRING_ARRAY:
{
std::vector<std::string> v;
get(source, v);
std::vector<std::string>::const_iterator si;
std::vector<const char *> * s = new std::vector<const char *>;
for(si = v.begin(); si != v.end(); ++si)
{
char * str = new char[(*si).length() + 1];
strcpy(str, (*si).c_str());
s->push_back(str);
}
p->m_param.saParam = s;
}
break;
case Param::UNICODE:
{
Unicode::String * s = new Unicode::String;
get(source, *s);
p->m_param.uParam = s;
}
break;
case Param::UNICODE_ARRAY:
{
std::vector<const Unicode::String *> * s = new std::vector<const Unicode::String *>;
int count;
get(source, count);
int index;
for(index = 0; index < count; ++index)
{
Unicode::String tmp;
get(source, tmp);
Unicode::String * entry = new Unicode::String(tmp);
s->push_back(entry);
}
p->m_param.uaParam = s;
}
break;
case Param::OBJECT_ID:
{
NetworkId * id = new NetworkId;
get(source, *id);
p->m_param.oidParam = id;
}
break;
case Param::OBJECT_ID_ARRAY:
{
std::vector<NetworkId> * ids = new std::vector<NetworkId>;
get(source, *ids);
p->m_param.oidaParam = ids;
}
break;
case Param::CACHED_OBJECT_ID_ARRAY:
{
std::vector<CachedNetworkId> * ids = new std::vector<CachedNetworkId>;
get(source, *ids);
p->m_param.coidaParam = ids;
}
break;
case Param::OBJECT_ID_ARRAY_ARRAY:
{
std::vector<const std::vector<NetworkId> *> * ids = new std::vector<const std::vector<NetworkId> *>;
get(source, *ids);
p->m_param.oidaaParam = ids;
}
break;
case Param::STRING_ID:
{
StringId * s = new StringId;
get(source, *s);
p->m_param.sidParam = s;
}
break;
case Param::STRING_ID_ARRAY:
{
int count;
get(source, count);
std::vector<const StringId *> * s = new std::vector<const StringId *>;
int index;
for(index = 0; index < count; ++index)
{
StringId * id = new StringId;
get(source, *id);
s->push_back(id);
}
p->m_param.sidaParam = s;
}
break;
case Param::ATTRIB_MOD:
{
AttribMod::AttribMod * m = new AttribMod::AttribMod;
get(source, *m);
p->m_param.amParam = m;
}
break;
case Param::ATTRIB_MOD_ARRAY:
{
std::vector<AttribMod::AttribMod> * m = new std::vector<AttribMod::AttribMod>;
int count;
get(source, count);
int index;
for(index = 0; index < count; ++index)
{
AttribMod::AttribMod mod;
get(source, mod);
m->push_back(mod);
}
p->m_param.amaParam = m;
}
break;
case Param::MENTAL_STATE_MOD:
{
ServerObjectTemplate::MentalStateMod * m = new ServerObjectTemplate::MentalStateMod;
int t ;
get(source, t);
m->target = static_cast<ServerObjectTemplate::MentalStates>(t);
get(source, m->value);
get(source, m->timeAtValue);
get(source, m->decay);
p->m_param.msmParam = m;
}
break;
case Param::MENTAL_STATE_MOD_ARRAY:
{
std::vector<ServerObjectTemplate::MentalStateMod> * m = new std::vector<ServerObjectTemplate::MentalStateMod>;
int count;
get(source, count);
int index;
for(index = 0; index < count; ++index)
{
ServerObjectTemplate::MentalStateMod mod;
int t;
get(source, t);
mod.target = static_cast<ServerObjectTemplate::MentalStates>(t);
get(source, mod.value);
get(source, mod.timeAtValue);
get(source, mod.decay);
m->push_back(mod);
}
p->m_param.amsmParam = m;
}
break;
case Param::OBJECT_MENU_INFO:
{
MenuDataVector * v = new MenuDataVector;
get(source, *v);
p->m_param.aomrdParam = v;
}
break;
case Param::MANUFACTURE_SCHEMATIC:
{
DEBUG_FATAL(true, ("This NEVER is sent over the network! --sjakab\n"));
}
break;
case Param::INGREDIENT_SLOT:
{
DEBUG_FATAL(true, ("This NEVER is sent over the network! --sjakab\n"));
}
break;
case Param::LOCATION:
{
Vector * v = new Vector;
get(source, *v);
p->m_param.lParam = v;
}
break;
case Param::LOCATION_ARRAY:
{
std::vector<const Vector *> * v = new std::vector<const Vector *>;
get_ptr<Vector>(source, *v);
p->m_param.laParam = v;
}
break;
case Param::DICTIONARY:
{
ValueDictionary * dictionary = new ValueDictionary;
get(source, *dictionary);
p->m_param.valueDictionaryParam = dictionary;
}
break;
case Param::DICTIONARY_ARRAY:
{
int32 count;
get(source, count);
std::vector<ValueDictionary> * dictionaryArray = new std::vector<ValueDictionary>;
ValueDictionary dictionary;
int index;
for(index = 0; index < static_cast<int>(count); ++index)
{
get(source, dictionary);
dictionaryArray->push_back(dictionary);
}
p->m_param.valueDictionaryArrayParam = dictionaryArray;
}
break;
case Param::BYTE_ARRAY:
{
std::vector<unsigned char> * v = new std::vector<unsigned char>;
get(source, *v);
p->m_param.byteArrayParam = v;
}
break;
default:
{
DEBUG_FATAL(true, ("Unknown or unhandled ScriptParam type!!!!\n"));
}
break;
}
}
//-----------------------------------------------------------------------
void put(ByteStream & target, const Param & source)
{
Archive::put(target, source.m_type);
Archive::put(target, source.m_name);
switch(source.m_type)
{
case Param::BOOL:
{
Archive::put(target, source.m_param.bParam);
}
break;
case Param::BOOL_ARRAY:
{
Archive::put(target, *source.m_param.baParam);
}
break;
case Param::INT:
{
Archive::put(target, source.m_param.iParam);
}
break;
case Param::INT_ARRAY:
{
Archive::put(target, *source.m_param.iaParam);
}
break;
case Param::FLOAT:
{
Archive::put(target, source.m_param.fParam);
}
break;
case Param::FLOAT_ARRAY:
{
Archive::put(target, *source.m_param.faParam);
}
break;
case Param::STRING:
{
std::string s = source.m_param.sParam;
Archive::put(target, s);
}
break;
case Param::STRING_ARRAY:
{
std::vector<std::string> s;
std::vector<const char *>::const_iterator c;
for(c = source.m_param.saParam->begin(); c != source.m_param.saParam->end(); ++c)
{
if (*c)
{
s.push_back(std::string(*c));
}
else
{
s.push_back(std::string(""));
}
}
Archive::put(target, s);
}
break;
case Param::UNICODE:
{
Archive::put(target, *source.m_param.uParam);
}
break;
case Param::UNICODE_ARRAY:
{
std::vector<const Unicode::String *>::const_iterator ui;
int count = source.m_param.uaParam->size();
Archive::put(target, count);
for(ui = source.m_param.uaParam->begin(); ui != source.m_param.uaParam->end(); ++ui)
{
if ((*ui))
{
Archive::put(target, *(*ui));
}
else
{
static const Unicode::String emptyStr =
Unicode::narrowToWide("");
Archive::put(target, emptyStr);
}
}
}
break;
case Param::OBJECT_ID:
{
Archive::put(target, *source.m_param.oidParam);
}
break;
case Param::OBJECT_ID_ARRAY:
{
Archive::put(target, *source.m_param.oidaParam);
}
break;
case Param::CACHED_OBJECT_ID_ARRAY:
{
Archive::put(target, *source.m_param.coidaParam);
}
break;
case Param::OBJECT_ID_ARRAY_ARRAY:
{
Archive::put(target, *source.m_param.oidaaParam);
}
break;
case Param::STRING_ID:
{
Archive::put(target, *source.m_param.sidParam);
}
break;
case Param::STRING_ID_ARRAY:
{
int count = source.m_param.sidaParam->size();
Archive::put(target, count);
std::vector<const StringId *>::const_iterator si;
for(si = source.m_param.sidaParam->begin(); si != source.m_param.sidaParam->end(); ++si)
{
Archive::put(target, *(*si));
}
}
break;
case Param::ATTRIB_MOD:
{
const AttribMod::AttribMod * m = source.m_param.amParam;
Archive::put(target, *m);
}
break;
case Param::ATTRIB_MOD_ARRAY:
{
std::vector<AttribMod::AttribMod>::const_iterator mi;
int count = source.m_param.amaParam->size();
Archive::put(target, count);
for (mi = source.m_param.amaParam->begin(); mi != source.m_param.amaParam->end(); ++mi)
{
Archive::put(target, *mi);
}
}
break;
case Param::MENTAL_STATE_MOD:
{
const ServerObjectTemplate::MentalStateMod * m = source.m_param.msmParam;
int t = m->target;
Archive::put(target, t);
Archive::put(target, m->value);
Archive::put(target, m->timeAtValue);
Archive::put(target, m->decay);
}
break;
case Param::MENTAL_STATE_MOD_ARRAY:
{
std::vector<ServerObjectTemplate::MentalStateMod>::const_iterator mi;
int count = source.m_param.amsmParam->size();
Archive::put(target, count);
for(mi = source.m_param.amsmParam->begin(); mi != source.m_param.amsmParam->end(); ++mi)
{
int t = (*mi).target;
Archive::put(target, t);
Archive::put(target, (*mi).value);
Archive::put(target, (*mi).timeAtValue);
Archive::put(target, (*mi).decay);
}
}
break;
case Param::OBJECT_MENU_INFO:
{
Archive::put(target, *source.m_param.aomrdParam);
}
break;
case Param::MANUFACTURE_SCHEMATIC:
{
DEBUG_FATAL(true, ("This NEVER is sent over the network! --sjakab\n"));
}
break;
case Param::INGREDIENT_SLOT:
{
DEBUG_FATAL(true, ("This NEVER is sent over the network! --sjakab\n"));
}
break;
case Param::LOCATION:
{
Archive::put(target, *source.m_param.lParam);
}
break;
case Param::LOCATION_ARRAY:
{
Archive::put(target, *source.m_param.laParam);
}
break;
case Param::DICTIONARY:
{
Archive::put(target, *source.m_param.valueDictionaryParam);
}
break;
case Param::DICTIONARY_ARRAY:
{
int32 count = static_cast<int32>(source.m_param.valueDictionaryArrayParam->size());
Archive::put(target, count);
std::vector<ValueDictionary>::const_iterator iter;
for(iter = source.m_param.valueDictionaryArrayParam->begin(); iter != source.m_param.valueDictionaryArrayParam->end(); ++iter)
{
Archive::put(target, (*iter));
}
}
break;
case Param::BYTE_ARRAY:
{
Archive::put(target, *source.m_param.byteArrayParam);
}
break;
default:
DEBUG_FATAL(true, ("Unknown or unhandled ScriptParam type!!!!\n"));
break;
}
}
//-----------------------------------------------------------------------
}//namespace Archive
//-----------------------------------------------------------------------

Some files were not shown because too many files have changed in this diff Show More