mirror of
https://github.com/SWG-Source/src.git
synced 2026-08-01 01:16:03 -04:00
2299 lines
77 KiB
C++
Executable File
2299 lines
77 KiB
C++
Executable File
//========================================================================
|
|
//
|
|
// ScriptMethodsDynamicVariable.cpp - implements script methods dealing with objvars.
|
|
//
|
|
// copyright 2001 Sony Online Entertainment
|
|
//
|
|
//========================================================================
|
|
|
|
#include "serverScript/FirstServerScript.h"
|
|
#include "serverScript/JavaLibrary.h"
|
|
|
|
#include "serverGame/ConfigServerGame.h"
|
|
#include "serverGame/ServerObject.h"
|
|
#include "serverGame/ServerWorld.h"
|
|
#include "serverUtility/ServerClock.h"
|
|
#include "sharedFoundation/DynamicVariable.h"
|
|
#include "sharedFoundation/DynamicVariableList.h"
|
|
#include "sharedFoundation/DynamicVariableLocationData.h"
|
|
#include "sharedFoundation/GameControllerMessage.h"
|
|
#include "sharedNetworkMessages/MessageQueueGenericValueType.h"
|
|
#include "UnicodeUtils.h"
|
|
|
|
using namespace JNIWrappersNamespace;
|
|
|
|
|
|
//========================================================================
|
|
// debugging non-authoritative objvar stuff
|
|
//
|
|
// we keep track of any objvars we set on a non-authoritative object in a frame,
|
|
// and warn/fatal if we try to read the objvar back in the same frame
|
|
|
|
namespace NonAuthObjvarNamespace
|
|
{
|
|
unsigned long lastObjvarSetFrame = 0;
|
|
std::map<NetworkId, std::set<std::string> > ObjvarsSet;
|
|
|
|
void addSetObjvar(const ServerObject & obj, const char * name)
|
|
{
|
|
if (!ConfigServerGame::getTrackNonAuthoritativeObjvarSets())
|
|
return;
|
|
|
|
if (name == nullptr || *name == '\0')
|
|
return;
|
|
if (obj.isAuthoritative())
|
|
return;
|
|
|
|
unsigned long currentFrame = ServerClock::getInstance().getServerFrame();
|
|
if (currentFrame > lastObjvarSetFrame)
|
|
{
|
|
// new frame, reset our data
|
|
lastObjvarSetFrame = currentFrame;
|
|
ObjvarsSet.clear();
|
|
}
|
|
ObjvarsSet[obj.getNetworkId()].insert(name);
|
|
}
|
|
|
|
void testIsSafeToReadObjvar(const ServerObject & obj, const std::string & name)
|
|
{
|
|
if (!ConfigServerGame::getTrackNonAuthoritativeObjvarSets())
|
|
return;
|
|
|
|
// we can read if the object is authoritative
|
|
if (obj.isAuthoritative())
|
|
return;
|
|
|
|
// we can read if we're on a different frame than the last time an objvar
|
|
// set
|
|
unsigned long currentFrame = ServerClock::getInstance().getServerFrame();
|
|
if (currentFrame > lastObjvarSetFrame)
|
|
return;
|
|
|
|
// we can read if we haven't set the objvar
|
|
std::map<NetworkId, std::set<std::string> >::const_iterator found = ObjvarsSet.find(
|
|
obj.getNetworkId());
|
|
if (found == ObjvarsSet.end())
|
|
return;
|
|
|
|
if ((*found).second.find(name) == (*found).second.end())
|
|
return;
|
|
|
|
// !!! we are trying to read an objvar on a non-authoritative object we
|
|
// have set this frame !!!
|
|
fprintf(stderr, "Trying to read objvar %s on non-authoritative "
|
|
"object %s that we have set this frame!\n", name.c_str(),
|
|
obj.getNetworkId().getValueString().c_str());
|
|
JavaLibrary::printJavaStack();
|
|
WARNING_STRICT_FATAL(true, ("Trying to read objvar %s on non-authoritative object %s that we have set this frame!",
|
|
name.c_str(), obj.getNetworkId().getValueString().c_str()));
|
|
}
|
|
}
|
|
using namespace NonAuthObjvarNamespace;
|
|
|
|
|
|
// ======================================================================
|
|
// ScriptMethodsDynamicVariableNamespace
|
|
// ======================================================================
|
|
|
|
namespace ScriptMethodsDynamicVariableNamespace
|
|
{
|
|
bool install();
|
|
LocalRefPtr convertDynamicVariableListToObject(JNIEnv *env, const DynamicVariableListNestedList &list);
|
|
ServerObject * getObjectAndName(JNIEnv *env, jlong objId, jstring name, char * buffer, size_t bufferSize);
|
|
const DynamicVariableList * getObjvarsAndName(JNIEnv *env, jlong objId, jstring name, char * buffer, size_t bufferSize);
|
|
|
|
jobject JNICALL getDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jint JNICALL getIntDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jintArray JNICALL getIntArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jfloat JNICALL getFloatDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jfloatArray JNICALL getFloatArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jstring JNICALL getStringDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobjectArray JNICALL getStringArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jlong JNICALL getObjIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jlongArray JNICALL getObjIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobject JNICALL getLocationDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobjectArray JNICALL getLocationArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobject JNICALL getStringIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobjectArray JNICALL getStringIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobject JNICALL getTransformDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobjectArray JNICALL getTransformArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobject JNICALL getVectorDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobjectArray JNICALL getVectorArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jobject JNICALL getDynamicVariableList(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
void JNICALL removeDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
void JNICALL removeAllDynamicVariables(JNIEnv *env, jobject self, jlong objId);
|
|
jboolean JNICALL hasDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jboolean JNICALL setDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject data);
|
|
jboolean JNICALL setIntDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jint data);
|
|
jboolean JNICALL setIntArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jintArray data);
|
|
jboolean JNICALL setFloatDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jfloat data);
|
|
jboolean JNICALL setFloatArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jfloatArray data);
|
|
jboolean JNICALL setStringDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jstring data);
|
|
jboolean JNICALL setStringArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray data);
|
|
jboolean JNICALL setObjIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jlong data);
|
|
jboolean JNICALL setObjIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jlongArray data);
|
|
jboolean JNICALL setLocationDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject data);
|
|
jboolean JNICALL setLocationArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray data);
|
|
jboolean JNICALL setStringIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject data);
|
|
jboolean JNICALL setStringIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray data);
|
|
jboolean JNICALL setTransformDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject data);
|
|
jboolean JNICALL setTransformArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray data);
|
|
jboolean JNICALL setVectorDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject data);
|
|
jboolean JNICALL setVectorArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray data);
|
|
jboolean JNICALL setDynamicVariableList(JNIEnv *env, jobject self, jlong objId, jstring name);
|
|
jboolean JNICALL copyDynamicVariable(JNIEnv *env, jobject self, jlong fromId, jlong toId, jstring name);
|
|
jstring JNICALL getPackedObjvars(JNIEnv *env, jobject self, jlong source, jstring jprefix);
|
|
void JNICALL setPackedObjvars(JNIEnv *env, jobject self, jlong target, jstring packedVars);
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
// install
|
|
//========================================================================
|
|
|
|
bool ScriptMethodsDynamicVariableNamespace::install()
|
|
{
|
|
const JNINativeMethod NATIVES[] = {
|
|
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsDynamicVariableNamespace::c)}
|
|
JF("_getObjVar", "(JLjava/lang/String;)Lscript/obj_var;", getDynamicVariable),
|
|
JF("_getIntObjVar", "(JLjava/lang/String;)I", getIntDynamicVariable),
|
|
JF("_getIntArrayObjVar", "(JLjava/lang/String;)[I", getIntArrayDynamicVariable),
|
|
JF("_getFloatObjVar", "(JLjava/lang/String;)F", getFloatDynamicVariable),
|
|
JF("_getFloatArrayObjVar", "(JLjava/lang/String;)[F", getFloatArrayDynamicVariable),
|
|
JF("_getStringObjVar", "(JLjava/lang/String;)Ljava/lang/String;", getStringDynamicVariable),
|
|
JF("_getStringArrayObjVar", "(JLjava/lang/String;)[Ljava/lang/String;", getStringArrayDynamicVariable),
|
|
JF("_getObjIdObjVar", "(JLjava/lang/String;)J", getObjIdDynamicVariable),
|
|
JF("_getObjIdArrayObjVar", "(JLjava/lang/String;)[J", getObjIdArrayDynamicVariable),
|
|
JF("_getLocationObjVar", "(JLjava/lang/String;)Lscript/location;", getLocationDynamicVariable),
|
|
JF("_getLocationArrayObjVar", "(JLjava/lang/String;)[Lscript/location;", getLocationArrayDynamicVariable),
|
|
JF("_getStringIdObjVar", "(JLjava/lang/String;)Lscript/string_id;", getStringIdDynamicVariable),
|
|
JF("_getStringIdArrayObjVar", "(JLjava/lang/String;)[Lscript/string_id;", getStringIdArrayDynamicVariable),
|
|
JF("_getTransformObjVar", "(JLjava/lang/String;)Lscript/transform;", getTransformDynamicVariable),
|
|
JF("_getTransformArrayObjVar", "(JLjava/lang/String;)[Lscript/transform;", getTransformArrayDynamicVariable),
|
|
JF("_getVectorObjVar", "(JLjava/lang/String;)Lscript/vector;", getVectorDynamicVariable),
|
|
JF("_getVectorArrayObjVar", "(JLjava/lang/String;)[Lscript/vector;", getVectorArrayDynamicVariable),
|
|
JF("_getObjVarList", "(JLjava/lang/String;)Lscript/obj_var_list;", getDynamicVariableList),
|
|
JF("_removeObjVar", "(JLjava/lang/String;)V", removeDynamicVariable),
|
|
JF("_removeAllObjVars", "(J)V", removeAllDynamicVariables),
|
|
JF("_hasObjVar", "(JLjava/lang/String;)Z", hasDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;Lscript/obj_var;)Z", setDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;I)Z", setIntDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[I)Z", setIntArrayDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;F)Z", setFloatDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[F)Z", setFloatArrayDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;Ljava/lang/String;)Z", setStringDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[Ljava/lang/String;)Z", setStringArrayDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;J)Z", setObjIdDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[J)Z", setObjIdArrayDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;Lscript/location;)Z", setLocationDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[Lscript/location;)Z", setLocationArrayDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;Lscript/string_id;)Z", setStringIdDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[Lscript/string_id;)Z", setStringIdArrayDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;Lscript/transform;)Z", setTransformDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[Lscript/transform;)Z", setTransformArrayDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;Lscript/vector;)Z", setVectorDynamicVariable),
|
|
JF("_setObjVar", "(JLjava/lang/String;[Lscript/vector;)Z", setVectorArrayDynamicVariable),
|
|
JF("_setObjVarList", "(JLjava/lang/String;)Z", setDynamicVariableList),
|
|
JF("_copyObjVar", "(JJLjava/lang/String;)Z", copyDynamicVariable),
|
|
JF("_getPackedObjvars", "(JLjava/lang/String;)Ljava/lang/String;", getPackedObjvars),
|
|
JF("_setPackedObjvars", "(JLjava/lang/String;)V", setPackedObjvars),
|
|
};
|
|
|
|
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
// class JavaLibrary objVar functions
|
|
//========================================================================
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Converts an DynamicVariableList to a jobject.
|
|
*
|
|
* @param env Java environment
|
|
* @param list the list to convert
|
|
*
|
|
* @return the converted object
|
|
*/
|
|
LocalRefPtr ScriptMethodsDynamicVariableNamespace::convertDynamicVariableListToObject(JNIEnv *env, const DynamicVariableList::NestedList &list)
|
|
{
|
|
int count = list.getCount();
|
|
|
|
JavaString listName(list.getName().c_str());
|
|
|
|
LocalRefPtr newDynamicVariableList = createNewObject(JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableList(),
|
|
listName.getValue(), count);
|
|
if (env->ExceptionCheck())
|
|
{
|
|
env->ExceptionDescribe();
|
|
newDynamicVariableList = LocalRef::cms_nullPtr;
|
|
}
|
|
if (newDynamicVariableList == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
jboolean result;
|
|
for (DynamicVariableList::NestedList::const_iterator objvar(list.begin()); objvar != list.end(); ++objvar)
|
|
{
|
|
result = JNI_FALSE;
|
|
switch (objvar.getType())
|
|
{
|
|
case DynamicVariable::INT:
|
|
{
|
|
int value;
|
|
objvar.getValue(value);
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetInt(),
|
|
name.getValue(), value);
|
|
}
|
|
break;
|
|
case DynamicVariable::INT_ARRAY:
|
|
{
|
|
std::vector<int> value;
|
|
objvar.getValue(value);
|
|
LocalIntArrayRefPtr valueArray = createNewIntArray(value.size());
|
|
if (value.size() > 0)
|
|
setIntArrayRegion(*valueArray, 0, value.size(), reinterpret_cast<jint *>(const_cast<int *>(&value[0])));
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetIntArray(),
|
|
name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::REAL:
|
|
{
|
|
real value = 0;
|
|
objvar.getValue(value);
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetFloat(),
|
|
name.getValue(), value);
|
|
}
|
|
break;
|
|
case DynamicVariable::REAL_ARRAY:
|
|
{
|
|
std::vector<real> value;
|
|
objvar.getValue(value);
|
|
LocalFloatArrayRefPtr valueArray = createNewFloatArray(value.size());
|
|
if (value.size() > 0 && valueArray != LocalFloatArrayRef::cms_nullPtr)
|
|
setFloatArrayRegion(*valueArray, 0, value.size(), const_cast<jfloat *>(&value[0]));
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetFloatArray(),
|
|
name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::STRING:
|
|
{
|
|
Unicode::String value;
|
|
objvar.getValue(value);
|
|
// convert the Unicode string to a JavaString
|
|
JavaString jval(value);
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetString(),
|
|
name.getValue(), jval.getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::STRING_ARRAY:
|
|
{
|
|
std::vector<Unicode::String> value;
|
|
objvar.getValue(value);
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsString());
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
JavaString jval(value[i]);
|
|
setObjectArrayElement(*valueArray, i, jval);
|
|
}
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetStringArray(),
|
|
name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::NETWORK_ID:
|
|
{
|
|
NetworkId value;
|
|
objvar.getValue(value);
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetObjId(),
|
|
name.getValue(), value.getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::NETWORK_ID_ARRAY:
|
|
{
|
|
std::vector<NetworkId> value;
|
|
objvar.getValue(value);
|
|
size_t count = value.size();
|
|
LocalLongArrayRefPtr valueArray = createNewLongArray(count);
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
jlong jvalue = value[i].getValue();
|
|
setLongArrayRegion(*valueArray, i, 1, &jvalue);
|
|
}
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetObjIdArray(),
|
|
name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::LOCATION:
|
|
{
|
|
DynamicVariableLocationData value;
|
|
objvar.getValue(value);
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value.pos, value.scene, value.cell, jvalue))
|
|
{
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetLocation(),
|
|
name.getValue(), jvalue->getValue());
|
|
}
|
|
}
|
|
break;
|
|
case DynamicVariable::LOCATION_ARRAY:
|
|
{
|
|
std::vector<DynamicVariableLocationData> value;
|
|
objvar.getValue(value);
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count,
|
|
JavaLibrary::getClsLocation());
|
|
LocalRefPtr jvalue;
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
const DynamicVariableLocationData &valueItem = value[i];
|
|
if (ScriptConversion::convert(valueItem.pos, valueItem.scene,
|
|
valueItem.cell, jvalue))
|
|
{
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
}
|
|
}
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetLocationArray(),
|
|
name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::LIST:
|
|
{
|
|
DynamicVariableList::NestedList nested(objvar.getNestedList());
|
|
LocalRefPtr newDynamicVariable = convertDynamicVariableListToObject(env,nested);
|
|
if (newDynamicVariable != LocalRef::cms_nullPtr)
|
|
{
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSet(),
|
|
newDynamicVariable->getValue());
|
|
}
|
|
}
|
|
break;
|
|
case DynamicVariable::STRING_ID:
|
|
{
|
|
StringId value;
|
|
objvar.getValue(value);
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value, jvalue))
|
|
{
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetStringId(),
|
|
name.getValue(), jvalue->getValue());
|
|
}
|
|
}
|
|
break;
|
|
case DynamicVariable::STRING_ID_ARRAY:
|
|
{
|
|
std::vector<StringId> value;
|
|
objvar.getValue(value);
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count,
|
|
JavaLibrary::getClsStringId());
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value[i], jvalue))
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
}
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList,
|
|
JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetStringIdArray(),
|
|
name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::TRANSFORM:
|
|
{
|
|
Transform value;
|
|
objvar.getValue(value);
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value, jvalue))
|
|
{
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList, JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetTransform(), name.getValue(), jvalue->getValue());
|
|
}
|
|
}
|
|
break;
|
|
case DynamicVariable::TRANSFORM_ARRAY:
|
|
{
|
|
std::vector<Transform> value;
|
|
objvar.getValue(value);
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsTransform());
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value[i], jvalue))
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
}
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList, JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetTransformArray(), name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::VECTOR:
|
|
{
|
|
Vector value;
|
|
objvar.getValue(value);
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value, jvalue))
|
|
{
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList, JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetVector(), name.getValue(), jvalue->getValue());
|
|
}
|
|
}
|
|
break;
|
|
case DynamicVariable::VECTOR_ARRAY:
|
|
{
|
|
std::vector<Vector> value;
|
|
objvar.getValue(value);
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsVector());
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value[i], jvalue))
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
}
|
|
JavaString name(objvar.getName().c_str());
|
|
result = callNonvirtualBooleanMethod(*newDynamicVariableList, JavaLibrary::getClsDynamicVariableList(), JavaLibrary::getMidDynamicVariableListSetVectorArray(), name.getValue(), valueArray->getValue());
|
|
}
|
|
break;
|
|
}
|
|
if (env->ExceptionCheck())
|
|
{
|
|
env->ExceptionDescribe();
|
|
result = JNI_FALSE;
|
|
}
|
|
if (result == JNI_FALSE)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
}
|
|
return newDynamicVariableList;
|
|
} // JavaLibrary::convertDynamicVariableListToObject
|
|
|
|
/**
|
|
* Given a Java obj_id and objvar name, converts them to a C ServerObject *
|
|
* and string. If there is an error we do a Java stack dump to help find which script
|
|
* made the bad call.
|
|
*
|
|
* @param env Java environment
|
|
* @param jlong the obj_id to convert to a ServerObject *
|
|
* @param name the Java objvar name to convert to C
|
|
* @param buffer a buffer to be filled in with the converted C name
|
|
* @param bufferSize the length of buffer
|
|
*
|
|
* @return the ServerObject * for the obj_id, or nullptr on error
|
|
*/
|
|
ServerObject * ScriptMethodsDynamicVariableNamespace::getObjectAndName(JNIEnv *env, jlong objId, jstring name, char * buffer, size_t bufferSize)
|
|
{
|
|
NOT_NULL(buffer);
|
|
|
|
ServerObject * object = nullptr;
|
|
JavaStringParam localName(name);
|
|
if (localName.fillBuffer(buffer, bufferSize) > 1)
|
|
{
|
|
if (!JavaLibrary::getObject(objId, object) && !ConfigServerGame::getDisableObjvarNullCheck())
|
|
{
|
|
fprintf(stderr, "WARNING: Could not get object for objvar %s call\n", buffer);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr, "WARNING: Could not get objvar name\n");
|
|
}
|
|
if (object == nullptr && !ConfigServerGame::getDisableObjvarNullCheck())
|
|
JavaLibrary::printJavaStack();
|
|
|
|
return object;
|
|
}
|
|
|
|
/**
|
|
* Given a Java obj_id and objvar name, converts them to a C DynamicVariableList *
|
|
* and string. If there is an error we do a Java stack dump to help find which script
|
|
* made the bad call.
|
|
*
|
|
* @param env Java environment
|
|
* @param jlong the obj_id to convert to a ServerObject *
|
|
* @param name the Java objvar name to convert to C
|
|
* @param buffer a buffer to be filled in with the converted C name
|
|
* @param bufferSize the length of buffer
|
|
*
|
|
* @return the DynamicVariableList * for the obj_id, or nullptr on error
|
|
*/
|
|
const DynamicVariableList * ScriptMethodsDynamicVariableNamespace::getObjvarsAndName(JNIEnv *env, jlong objId, jstring name, char * buffer, size_t bufferSize)
|
|
{
|
|
NOT_NULL(buffer);
|
|
|
|
const DynamicVariableList * objvars = nullptr;
|
|
const ServerObject * object = getObjectAndName(env, objId, name, buffer, bufferSize);
|
|
if (object != nullptr)
|
|
{
|
|
testIsSafeToReadObjvar(*object, buffer);
|
|
objvars = &object->getObjVars();
|
|
}
|
|
return objvars;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
// class JavaLibrary JNI objvar callback methods
|
|
//========================================================================
|
|
|
|
/**
|
|
* Gets an objvar.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*
|
|
* @todo add support for objvar lists
|
|
*/
|
|
jobject JNICALL ScriptMethodsDynamicVariableNamespace::getDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvars = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvars == nullptr)
|
|
return 0;
|
|
const std::string objvarName(buffer);
|
|
|
|
if (!objvars->hasItem(objvarName))
|
|
return 0;
|
|
|
|
// create the parameters for the java objVar constructor and create it
|
|
LocalRefPtr newDynamicVariable;
|
|
switch (objvars->getType(objvarName))
|
|
{
|
|
case DynamicVariable::INT:
|
|
{
|
|
int value;
|
|
objvars->getItem(objvarName,value);
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableInt(), name, value);
|
|
}
|
|
break;
|
|
case DynamicVariable::INT_ARRAY:
|
|
{
|
|
std::vector<int> value;
|
|
objvars->getItem(objvarName,value);
|
|
LocalIntArrayRefPtr valueArray = createNewIntArray(value.size());
|
|
if (value.size() > 0)
|
|
{
|
|
setIntArrayRegion(*valueArray, 0, value.size(),
|
|
reinterpret_cast<jint *>(const_cast<int *>(&value[0])));
|
|
}
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableIntArray(), name, valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::REAL:
|
|
{
|
|
float value;
|
|
objvars->getItem(objvarName,value);
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableFloat(), name, value);
|
|
}
|
|
break;
|
|
case DynamicVariable::REAL_ARRAY:
|
|
{
|
|
std::vector<float> value;
|
|
objvars->getItem(objvarName,value);
|
|
LocalFloatArrayRefPtr valueArray = createNewFloatArray(value.size());
|
|
if (value.size() > 0 && valueArray != LocalFloatArrayRef::cms_nullPtr)
|
|
{
|
|
setFloatArrayRegion(*valueArray, 0, value.size(),
|
|
const_cast<jfloat *>(&value[0]));
|
|
}
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableFloatArray(), name, valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::STRING:
|
|
{
|
|
Unicode::String value;
|
|
objvars->getItem(objvarName,value);
|
|
// convert the Unicode string to a jstring
|
|
JavaString jval(value);
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableString(), name, jval.getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::STRING_ARRAY:
|
|
{
|
|
std::vector<Unicode::String> value;
|
|
objvars->getItem(objvarName,value);
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsString());
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
JavaString jval(value[i]);
|
|
setObjectArrayElement(*valueArray, i, jval);
|
|
}
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableStringArray(), name, valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::NETWORK_ID:
|
|
{
|
|
NetworkId value;
|
|
objvars->getItem(objvarName,value);
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableObjId(), name, value.getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::NETWORK_ID_ARRAY:
|
|
{
|
|
std::vector<NetworkId> value;
|
|
objvars->getItem(objvarName,value);
|
|
size_t count = value.size();
|
|
LocalLongArrayRefPtr valueArray = createNewLongArray(count);
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
jlong jval = value[i].getValue();
|
|
setLongArrayRegion(*valueArray, i, 1, &jval);
|
|
}
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableObjIdArray(), name, valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::LOCATION:
|
|
{
|
|
DynamicVariableLocationData value;
|
|
objvars->getItem(objvarName,value);
|
|
LocalRefPtr jvalue;
|
|
if (ScriptConversion::convert(value.pos, value.scene, value.cell, jvalue))
|
|
{
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableLocation(), name, jvalue->getValue());
|
|
}
|
|
}
|
|
break;
|
|
case DynamicVariable::LOCATION_ARRAY:
|
|
{
|
|
std::vector<DynamicVariableLocationData> value;
|
|
objvars->getItem(objvarName,value);
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsLocation());
|
|
LocalRefPtr jvalue;
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
const DynamicVariableLocationData &valueItem = value[i];
|
|
if (ScriptConversion::convert(valueItem.pos, valueItem.scene,
|
|
valueItem.cell, jvalue))
|
|
{
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
}
|
|
}
|
|
newDynamicVariable = createNewObject(JavaLibrary::getClsDynamicVariable(),
|
|
JavaLibrary::getMidDynamicVariableLocationArray(), name, valueArray->getValue());
|
|
}
|
|
break;
|
|
case DynamicVariable::LIST:
|
|
newDynamicVariable = convertDynamicVariableListToObject(env, DynamicVariableList::NestedList(*objvars, objvarName));
|
|
break;
|
|
default:
|
|
newDynamicVariable = LocalRef::cms_nullPtr;
|
|
break;
|
|
}
|
|
if (env->ExceptionCheck())
|
|
{
|
|
env->ExceptionDescribe();
|
|
return 0;
|
|
}
|
|
return newDynamicVariable->getReturnValue();
|
|
} // JavaLibrary::getDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type int.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jint JNICALL ScriptMethodsDynamicVariableNamespace::getIntDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
int localValue=0;
|
|
if (!objvarList->getItem(buffer,localValue))
|
|
return 0;
|
|
|
|
jint value = localValue;
|
|
return value;
|
|
} // JavaLibrary::getIntDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type int[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jintArray JNICALL ScriptMethodsDynamicVariableNamespace::getIntArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<int> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
LocalIntArrayRefPtr valueArray = createNewIntArray(value.size());
|
|
if (value.size() > 0)
|
|
{
|
|
setIntArrayRegion(*valueArray, 0, value.size(), reinterpret_cast<jint *>
|
|
(const_cast<int *>(&value[0])));
|
|
}
|
|
return valueArray->getReturnValue();
|
|
} // JavaLibrary::getIntArrayDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type float.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jfloat JNICALL ScriptMethodsDynamicVariableNamespace::getFloatDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
float localValue = 0;
|
|
if (!objvarList->getItem(buffer,localValue))
|
|
return 0;
|
|
|
|
jfloat value = localValue;
|
|
return value;
|
|
} // JavaLibrary::getFloatDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type float[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jfloatArray JNICALL ScriptMethodsDynamicVariableNamespace::getFloatArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<real> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
LocalFloatArrayRefPtr valueArray = createNewFloatArray(value.size());
|
|
if (value.size() > 0 && valueArray != LocalFloatArrayRef::cms_nullPtr)
|
|
setFloatArrayRegion(*valueArray, 0, value.size(), const_cast<jfloat *>(&value[0]));
|
|
return valueArray->getReturnValue();
|
|
} // JavaLibrary::getFloatArrayDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type string.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jstring JNICALL ScriptMethodsDynamicVariableNamespace::getStringDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
Unicode::String value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
// convert EString to jstring
|
|
return JavaString(value).getReturnValue();
|
|
} // JavaLibrary::getStringDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type string[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobjectArray JNICALL ScriptMethodsDynamicVariableNamespace::getStringArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<Unicode::String> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsString());
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
JavaString jval(value[i]);
|
|
setObjectArrayElement(*valueArray, i, jval);
|
|
}
|
|
return valueArray->getReturnValue();
|
|
} // JavaLibrary::getStringArrayDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type obj_id.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jlong JNICALL ScriptMethodsDynamicVariableNamespace::getObjIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
NetworkId localValue;
|
|
if (!objvarList->getItem(buffer,localValue))
|
|
return 0;
|
|
return localValue.getValue();
|
|
} // JavaLibrary::getObjIdDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type obj_id[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jlongArray JNICALL ScriptMethodsDynamicVariableNamespace::getObjIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList *objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<NetworkId> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
size_t count = value.size();
|
|
LocalLongArrayRefPtr valueArray = createNewLongArray(count);
|
|
jlong jlongTmp;
|
|
if (valueArray != LocalLongArrayRef::cms_nullPtr)
|
|
{
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
jlongTmp = value[i].getValue();
|
|
setLongArrayRegion(*valueArray, i, 1, &jlongTmp);
|
|
}
|
|
}
|
|
|
|
return valueArray->getReturnValue();
|
|
} // JavaLibrary::getObjIdArrayDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type location.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobject JNICALL ScriptMethodsDynamicVariableNamespace::getLocationDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
DynamicVariableLocationData value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
LocalRefPtr jloc;
|
|
if (!ScriptConversion::convert(value.pos, value.scene, value.cell, jloc))
|
|
return 0;
|
|
|
|
return jloc->getReturnValue();
|
|
} // JavaLibrary::getLocationDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type location[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobjectArray JNICALL ScriptMethodsDynamicVariableNamespace::getLocationArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<DynamicVariableLocationData> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsLocation());
|
|
if (valueArray == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
LocalRefPtr jvalue;
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
const DynamicVariableLocationData &valueItem = value[i];
|
|
if (ScriptConversion::convert(valueItem.pos, valueItem.scene, valueItem.cell,
|
|
jvalue))
|
|
{
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
}
|
|
else
|
|
setObjectArrayElement(*valueArray, i, LocalRef(0));
|
|
}
|
|
return valueArray->getReturnValue();
|
|
} // JavaLibrary::getLocationArrayDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type string_id.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobject JNICALL ScriptMethodsDynamicVariableNamespace::getStringIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
StringId value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
LocalRefPtr string_id;
|
|
if (!ScriptConversion::convert(value, string_id))
|
|
return 0;
|
|
|
|
return string_id->getReturnValue();
|
|
} // JavaLibrary::getStringIdDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type string_id[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobjectArray JNICALL ScriptMethodsDynamicVariableNamespace::getStringIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<StringId> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsStringId());
|
|
if (valueArray == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
LocalRefPtr jvalue;
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
const StringId & valueItem = value[i];
|
|
if (ScriptConversion::convert(valueItem, jvalue))
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
else
|
|
setObjectArrayElement(*valueArray, i, LocalRef(0));
|
|
}
|
|
return valueArray->getReturnValue();
|
|
} // JavaLibrary::getStringIdArrayDynamicVariable
|
|
|
|
/**
|
|
* Gets an objvar of type transform.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobject JNICALL ScriptMethodsDynamicVariableNamespace::getTransformDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
Transform value;
|
|
if (!objvarList->getItem(buffer, value))
|
|
return 0;
|
|
|
|
LocalRefPtr transform;
|
|
if (!ScriptConversion::convert(value, transform))
|
|
return 0;
|
|
|
|
return transform->getReturnValue();
|
|
}
|
|
|
|
/**
|
|
* Gets an objvar of type transform[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobjectArray JNICALL ScriptMethodsDynamicVariableNamespace::getTransformArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<Transform> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsTransform());
|
|
if (valueArray == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
LocalRefPtr jvalue;
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
Transform const &valueItem = value[i];
|
|
if (ScriptConversion::convert(valueItem, jvalue))
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
else
|
|
setObjectArrayElement(*valueArray, i, LocalRef(0));
|
|
}
|
|
return valueArray->getReturnValue();
|
|
}
|
|
|
|
/**
|
|
* Gets an objvar of type vector.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobject JNICALL ScriptMethodsDynamicVariableNamespace::getVectorDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
Vector value;
|
|
if (!objvarList->getItem(buffer, value))
|
|
return 0;
|
|
|
|
LocalRefPtr vec;
|
|
if (!ScriptConversion::convert(value, vec))
|
|
return 0;
|
|
|
|
return vec->getReturnValue();
|
|
}
|
|
|
|
/**
|
|
* Gets an objvar of type vector[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return the objvar value
|
|
*/
|
|
jobjectArray JNICALL ScriptMethodsDynamicVariableNamespace::getVectorArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const DynamicVariableList * objvarList = getObjvarsAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (objvarList == nullptr)
|
|
return 0;
|
|
|
|
std::vector<Vector> value;
|
|
if (!objvarList->getItem(buffer,value))
|
|
return 0;
|
|
|
|
size_t count = value.size();
|
|
LocalObjectArrayRefPtr valueArray = createNewObjectArray(count, JavaLibrary::getClsVector());
|
|
if (valueArray == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
LocalRefPtr jvalue;
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
Vector const &valueItem = value[i];
|
|
if (ScriptConversion::convert(valueItem, jvalue))
|
|
setObjectArrayElement(*valueArray, i, *jvalue);
|
|
else
|
|
setObjectArrayElement(*valueArray, i, LocalRef(0));
|
|
}
|
|
return valueArray->getReturnValue();
|
|
}
|
|
|
|
/**
|
|
* Returns an objvar list.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class to get the list from
|
|
* @param name name of the list
|
|
*
|
|
* @return the objvar list
|
|
*/
|
|
jobject JNICALL ScriptMethodsDynamicVariableNamespace::getDynamicVariableList(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return 0;
|
|
|
|
JavaStringParam localName(name);
|
|
|
|
const ServerObject* object = nullptr;
|
|
if (!JavaLibrary::getObject(objId, object))
|
|
return 0;
|
|
|
|
const DynamicVariableList &objvarList = object->getObjVars();
|
|
|
|
LocalRefPtr result;
|
|
if (name == 0 || getStringLength(localName) == 0)
|
|
{
|
|
// do the whole list
|
|
result = convertDynamicVariableListToObject(env, DynamicVariableList::NestedList(objvarList));
|
|
}
|
|
else
|
|
{
|
|
// convert jstrings to stl strings
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
if (localName.fillBuffer(buffer, sizeof(buffer)) > 0 && objvarList.hasItem(buffer))
|
|
{
|
|
result = convertDynamicVariableListToObject(env, DynamicVariableList::NestedList(objvarList, buffer));
|
|
}
|
|
}
|
|
|
|
if (result.get() == nullptr)
|
|
return 0;
|
|
return result->getReturnValue();
|
|
} // JavaLibrary::getDynamicVariableList
|
|
|
|
/**
|
|
* Removes an objvar from an object.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of object containing the objvar
|
|
* @param name name of the objvar
|
|
*/
|
|
void JNICALL ScriptMethodsDynamicVariableNamespace::removeDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return;
|
|
|
|
object->removeObjVarItem(buffer);
|
|
} // JavaLibrary::removeDynamicVariable
|
|
|
|
/**
|
|
* Removes all the objvars from an object.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId the object
|
|
*/
|
|
void JNICALL ScriptMethodsDynamicVariableNamespace::removeAllDynamicVariables(JNIEnv *env, jobject self, jlong objId)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0)
|
|
return;
|
|
|
|
ServerObject* object = nullptr;
|
|
if (!JavaLibrary::getObject(objId, object))
|
|
return;
|
|
|
|
object->eraseObjVarListEntries(".");
|
|
} // JavaLibrary::removeAllDynamicVariables
|
|
|
|
/**
|
|
* Determines if an object has an objvar.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
*
|
|
* @return true if the objvar exists, false if not
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::hasDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
const ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return 0;
|
|
|
|
const DynamicVariableList &objvarList = object->getObjVars();
|
|
|
|
if (objvarList.hasItem(buffer))
|
|
return JNI_TRUE;
|
|
else
|
|
return JNI_FALSE;
|
|
} // JavaLibrary::hasDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type obj_var.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject data)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || data == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
const DynamicVariableList *objvarList = &(object->getObjVars());
|
|
if (objvarList == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
// determine what type the data is
|
|
/*
|
|
if (env->IsInstanceOf(data, JavaLibrary::getClsDynamicVariable()) == JNI_TRUE)
|
|
{
|
|
// name is the name of an objvar list we will add data to
|
|
DynamicVariable *objvar = objvarList->getItemByName(localName);
|
|
if (objvar == nullptr)
|
|
objvar = objvarList->addNestedList(localName);
|
|
if (objvar != nullptr && objvar->getType() == DynamicVariable::LIST)
|
|
return updateDynamicVariableList(env, *dynamic_cast<DynamicVariableList*>(objvar), data);
|
|
return JNI_FALSE;
|
|
}
|
|
else if (env->IsInstanceOf(data, ms_clsInteger) == JNI_TRUE)
|
|
{
|
|
if (objvarList->setItem(localName, static_cast<int>(env->CallIntMethod(data, ms_midIntegerIntValue))))
|
|
return JNI_TRUE;
|
|
return JNI_FALSE;
|
|
}
|
|
else if (env->IsInstanceOf(data, ms_clsFloat) == JNI_TRUE)
|
|
{
|
|
if (objvarList->setItem(localName, env->CallFloatMethod(data, ms_midFloatFloatValue)))
|
|
return JNI_TRUE;
|
|
return JNI_FALSE;
|
|
}
|
|
else if (env->IsInstanceOf(data, ms_clsString) == JNI_TRUE)
|
|
{
|
|
if (objvarList->setItem(localName, Unicode::String(env->GetStringChars(static_cast<jstring>(data), nullptr))))
|
|
#error must release characters
|
|
return JNI_TRUE;
|
|
return JNI_FALSE;
|
|
}
|
|
*/
|
|
return JNI_FALSE;
|
|
} // JavaLibrary::setDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type int.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setIntDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jint value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, static_cast<int>(value));
|
|
} // JavaLibrary::setIntDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type int[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setIntArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jintArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
if (ConfigServerGame::getExceptionOnObjVarZeroLengthArray())
|
|
{
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setIntArrayDynamicVariable "
|
|
"trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
}
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
std::vector<int> valueArray;
|
|
valueArray.resize(size);
|
|
env->GetIntArrayRegion(value, 0, size, reinterpret_cast<jint*>(&valueArray[0]));
|
|
return object->setObjVarItem(buffer, valueArray);
|
|
} // JavaLibrary::setIntArrayDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type float.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setFloatDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jfloat value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, value);
|
|
} // JavaLibrary::setFloatDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type float[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setFloatArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jfloatArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
if (ConfigServerGame::getExceptionOnObjVarZeroLengthArray())
|
|
{
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setFloatArrayDynamicVariable "
|
|
"trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
std::vector<real> valueArray;
|
|
valueArray.resize(size);
|
|
env->GetFloatArrayRegion(value, 0, size, &valueArray[0]);
|
|
return object->setObjVarItem(buffer, valueArray);
|
|
} // JavaLibrary::setFloatArrayDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type string.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setStringDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jstring value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (name == 0)
|
|
{
|
|
DEBUG_WARNING(true, ("nullptr name passed from script to JavaLibrary::setStringDynamicValue"));
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
JavaStringParam localValue(value);
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
if (value == 0)
|
|
{
|
|
DEBUG_WARNING(true, ("nullptr string passed from script to JavaLibrary::setStringDynamicValue (%s)",buffer));
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
const DynamicVariableList *objvarList = &(object->getObjVars());
|
|
if (objvarList == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
Unicode::String valueString;
|
|
if (!JavaLibrary::convert(localValue, valueString))
|
|
return JNI_FALSE;
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, valueString);
|
|
} // JavaLibrary::setStringDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type string[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setStringArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsStringArray()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
std::vector<Unicode::String> valueArray;
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
if (ConfigServerGame::getExceptionOnObjVarZeroLengthArray())
|
|
{
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setStringArrayDynamicVariable "
|
|
"trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
}
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
valueArray.resize(size);
|
|
for (size_t i = 0; i < size; ++i)
|
|
{
|
|
JavaStringPtr item = getStringArrayElement(LocalObjectArrayRefParam(value), i);
|
|
if (item != JavaString::cms_nullPtr)
|
|
JavaLibrary::convert(*item, valueArray[i]);
|
|
else
|
|
valueArray[i] = Unicode::String();
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
// For some reason, returning the value directly from the function call here
|
|
// makes gcc 2.95.3 think the end of the function can be reached without
|
|
// returning a value in release builds, so we assign the result and return
|
|
// it to work around the bug.
|
|
bool const ret = object->setObjVarItem(buffer, valueArray);
|
|
return static_cast<jboolean>(ret);
|
|
} // JavaLibrary::setStringArrayDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type obj_id.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setObjIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jlong value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
NetworkId oidValue(static_cast<NetworkId::NetworkIdType>
|
|
(env->CallLongMethod(JavaLibrary::getObjId(value)->getReturnValue(), JavaLibrary::getMidObjIdGetValue())));
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, oidValue);
|
|
} // JavaLibrary::setObjIdDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type obj_id[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setObjIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jlongArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
std::vector<NetworkId> valueArray;
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
if (ConfigServerGame::getExceptionOnObjVarZeroLengthArray())
|
|
{
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setObjIdArrayDynamicVariable "
|
|
"trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
}
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
valueArray.resize(size);
|
|
jlong jlongTmp;
|
|
for (size_t i = 0; i < size; ++i)
|
|
{
|
|
env->GetLongArrayRegion(value, i, 1, &jlongTmp);
|
|
valueArray[i] = NetworkId(static_cast<NetworkId::NetworkIdType>(jlongTmp));
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
bool result = object->setObjVarItem(buffer, valueArray);
|
|
return result;
|
|
} // JavaLibrary::setObjIdArrayDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type location.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setLocationDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsLocation()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
DynamicVariableLocationData locValue;
|
|
locValue.pos.x = env->GetFloatField(value, JavaLibrary::getFidLocationX());
|
|
locValue.pos.y = env->GetFloatField(value, JavaLibrary::getFidLocationY());
|
|
locValue.pos.z = env->GetFloatField(value, JavaLibrary::getFidLocationZ());
|
|
JavaStringPtr area = getStringField(LocalRefParam(value), JavaLibrary::getFidLocationArea());
|
|
JavaLibrary::convert(*area, locValue.scene);
|
|
LocalRefPtr cell = getObjectField(LocalRefParam(value), JavaLibrary::getFidLocationCell());
|
|
locValue.cell = JavaLibrary::getNetworkId(*cell);
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, locValue);
|
|
} // JavaLibrary::setLocationDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type location[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setLocationArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsLocationArray()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
std::vector<DynamicVariableLocationData> valueArray;
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
if (ConfigServerGame::getExceptionOnObjVarZeroLengthArray())
|
|
{
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setLocationArrayDynamicVariable "
|
|
"trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
}
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
valueArray.resize(size);
|
|
for (size_t i = 0; i < size; ++i)
|
|
{
|
|
LocalRefPtr item = getObjectArrayElement(LocalObjectArrayRefParam(value), i);
|
|
if (item != LocalRef::cms_nullPtr)
|
|
{
|
|
DynamicVariableLocationData &valueItem = valueArray[i];
|
|
valueItem.pos.x = getFloatField(*item, JavaLibrary::getFidLocationX());
|
|
valueItem.pos.y = getFloatField(*item, JavaLibrary::getFidLocationY());
|
|
valueItem.pos.z = getFloatField(*item, JavaLibrary::getFidLocationZ());
|
|
JavaStringPtr area = getStringField(*item, JavaLibrary::getFidLocationArea());
|
|
JavaLibrary::convert(*area, valueItem.scene);
|
|
LocalRefPtr cell = getObjectField(*item, JavaLibrary::getFidLocationCell());
|
|
valueItem.cell = JavaLibrary::getNetworkId(*cell);
|
|
}
|
|
else
|
|
valueArray[i] = DynamicVariableLocationData();
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
bool result = object->setObjVarItem(buffer, valueArray);
|
|
return result;
|
|
} // JavaLibrary::setLocationArrayDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type string_id.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setStringIdDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsStringId()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
StringId locValue;
|
|
if (!ScriptConversion::convert(value, locValue))
|
|
return JNI_FALSE;
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, locValue);
|
|
} // JavaLibrary::setStringIdDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type string_id[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setStringIdArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsStringIdArray()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
std::vector<StringId> valueArray;
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
if (ConfigServerGame::getExceptionOnObjVarZeroLengthArray())
|
|
{
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setStringIdArrayDynamicVariable "
|
|
"trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
valueArray.resize(size);
|
|
for (size_t i = 0; i < size; ++i)
|
|
{
|
|
LocalRefPtr item = getObjectArrayElement(LocalObjectArrayRefParam(value), i);
|
|
if (item == LocalRef::cms_nullPtr)
|
|
return JNI_FALSE;
|
|
StringId &valueItem = valueArray[i];
|
|
if (!ScriptConversion::convert(*item, valueItem))
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
bool result = object->setObjVarItem(buffer, valueArray);
|
|
return result;
|
|
} // JavaLibrary::setStringIdArrayDynamicVariable
|
|
|
|
/**
|
|
* Sets an objvar of type transform.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setTransformDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsTransform()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
Transform locValue;
|
|
if (!ScriptConversion::convert(value, locValue))
|
|
return JNI_FALSE;
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, locValue);
|
|
}
|
|
|
|
/**
|
|
* Sets an objvar of type transform[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setTransformArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsTransformArray()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
std::vector<Transform> valueArray;
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setTransformArrayDynamicVariable trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
return false;
|
|
}
|
|
|
|
valueArray.resize(size);
|
|
for (size_t i = 0; i < size; ++i)
|
|
{
|
|
LocalRefPtr item = getObjectArrayElement(LocalObjectArrayRefParam(value), i);
|
|
if (item == LocalRef::cms_nullPtr)
|
|
return JNI_FALSE;
|
|
Transform &valueItem = valueArray[i];
|
|
if (!ScriptConversion::convert(*item, valueItem))
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
bool result = object->setObjVarItem(buffer, valueArray);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Sets an objvar of type vector.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setVectorDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobject value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsVector()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
Vector locValue;
|
|
if (!ScriptConversion::convert(value, locValue))
|
|
return JNI_FALSE;
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
return object->setObjVarItem(buffer, locValue);
|
|
}
|
|
|
|
/**
|
|
* Sets an objvar of type vector[].
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the objvar
|
|
* @param value value to set the objvar to
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setVectorArrayDynamicVariable(JNIEnv *env, jobject self, jlong objId, jstring name, jobjectArray value)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (objId == 0 || name == 0 || value == 0)
|
|
return JNI_FALSE;
|
|
|
|
if (env->IsInstanceOf(value, JavaLibrary::getClsVectorArray()) == JNI_FALSE)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
ServerObject * object = getObjectAndName(env, objId, name, buffer, sizeof(buffer));
|
|
if (object == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
std::vector<Vector> valueArray;
|
|
size_t size = env->GetArrayLength(value);
|
|
if (size == 0)
|
|
{
|
|
object->removeObjVarItem(buffer);
|
|
JavaLibrary::throwInternalScriptError("JavaLibrary::setVectorArrayDynamicVariable trying to set an array objvar to 0 length. The objvar has been removed instead.");
|
|
return false;
|
|
}
|
|
|
|
valueArray.resize(size);
|
|
for (size_t i = 0; i < size; ++i)
|
|
{
|
|
LocalRefPtr item = getObjectArrayElement(LocalObjectArrayRefParam(value), i);
|
|
if (item == LocalRef::cms_nullPtr)
|
|
return JNI_FALSE;
|
|
Vector &valueItem = valueArray[i];
|
|
if (!ScriptConversion::convert(*item, valueItem))
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
addSetObjvar(*object, buffer);
|
|
|
|
bool result = object->setObjVarItem(buffer, valueArray);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates an objvar list.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param objId id of class containing the objvar
|
|
* @param name name of the list
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::setDynamicVariableList(JNIEnv *, jobject, jlong, jstring)
|
|
{
|
|
// This is now a no-op, left for compatibility with older scripts.
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setDynamicVariableList
|
|
|
|
/**
|
|
* Copies an objvar from one object to another.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param fromId id of object to copy from
|
|
* @param toId id of object to copy to
|
|
* @param name name of the objvar to copy
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsDynamicVariableNamespace::copyDynamicVariable(JNIEnv *env, jobject self, jlong fromId, jlong toId, jstring name)
|
|
{
|
|
UNREF(self);
|
|
|
|
JavaStringParam localName(name);
|
|
|
|
if (fromId == 0 || toId == 0 || name == 0)
|
|
return JNI_FALSE;
|
|
|
|
CachedNetworkId from(fromId);
|
|
CachedNetworkId to(toId);
|
|
|
|
if (from == to)
|
|
return JNI_TRUE;
|
|
|
|
ServerObject* fromObject = dynamic_cast<ServerObject*>(from.getObject());
|
|
if (fromObject == nullptr)
|
|
return JNI_FALSE;
|
|
ServerObject* toObject = dynamic_cast<ServerObject*>(to.getObject());
|
|
if (toObject == nullptr)
|
|
return JNI_FALSE;
|
|
|
|
char buffer[DynamicVariable::MAX_DYNAMIC_VARIABLE_NAME_LEN];
|
|
if (localName.fillBuffer(buffer, sizeof(buffer)) <= 0)
|
|
return JNI_FALSE;
|
|
|
|
if(toObject->isAuthoritative())
|
|
{
|
|
toObject->copyObjVars(buffer, *fromObject, buffer);
|
|
}
|
|
else
|
|
{
|
|
std::string stringBuffer(buffer);
|
|
toObject->sendControllerMessageToAuthServer(CM_copyDynamicVariable, new MessageQueueGenericValueType<std::pair<std::string, std::pair<NetworkId, NetworkId> > >(std::make_pair(stringBuffer, std::make_pair(from, to))));
|
|
}
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::copyDynamicVariable
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
jstring JNICALL ScriptMethodsDynamicVariableNamespace::getPackedObjvars(JNIEnv *env, jobject self, jlong source, jstring jprefix)
|
|
{
|
|
ServerObject *sourceObj = 0;
|
|
if (!JavaLibrary::getObject(source, sourceObj))
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::getPackedObjvars: could not find source object"));
|
|
else
|
|
{
|
|
std::string prefix;
|
|
if (jprefix)
|
|
{
|
|
JavaStringParam prefixParam(jprefix);
|
|
if (!JavaLibrary::convert(prefixParam, prefix))
|
|
{
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::getPackedObjvars: bad prefix string"));
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
std::string const &result = sourceObj->getPackedObjVars(prefix);
|
|
|
|
return JavaString(result).getReturnValue();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsDynamicVariableNamespace::setPackedObjvars(JNIEnv *env, jobject self, jlong target, jstring packedVars)
|
|
{
|
|
ServerObject *targetObj = 0;
|
|
if (!JavaLibrary::getObject(target, targetObj))
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::setPackedObjvars: could not find target object"));
|
|
else
|
|
{
|
|
JavaStringParam localPackedVars(packedVars);
|
|
std::string packedVarString;
|
|
if (!JavaLibrary::convert(localPackedVars, packedVarString))
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::setPackedObjvars: bad packed var string"));
|
|
else if (!targetObj->setPackedObjVars(packedVarString))
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::setPackedObjvars: bad packed var string"));
|
|
}
|
|
}
|
|
|
|
// ======================================================================
|
|
|