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

1782 lines
62 KiB
C++

//========================================================================
//
// ScriptMethodsObjectMove.cpp - implements script methods dealing with object
// movement.
//
// 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/GameServer.h"
#include "serverGame/NewbieTutorial.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/PositionUpdateTracker.h"
#include "serverGame/ServerCreatureObjectTemplate.h"
#include "serverGame/ServerUniverse.h"
#include "serverGame/ServerWorld.h"
#include "serverGame/ShipObject.h"
#include "serverGame/TangibleController.h"
#include "serverScript/ScriptParameters.h"
#include "serverUtility/LocationData.h"
#include "sharedCollision/CollisionProperty.h"
#include "sharedCollision/Footprint.h"
#include "sharedLog/Log.h"
#include "sharedMath/Quaternion.h"
#include "sharedMath/Vector.h"
#include "sharedObject/CachedNetworkId.h"
#include "sharedObject/CellProperty.h"
#include "sharedObject/NetworkIdManager.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsObjectMoveNamespace
// ======================================================================
namespace ScriptMethodsObjectMoveNamespace
{
bool install();
bool testInvalidObjectMove(const ServerObject * object);
jboolean JNICALL setLocationFromPos(JNIEnv *env, jobject self, jlong objectId, jobject to);
jboolean JNICALL setLocationFromObj(JNIEnv *env, jobject self, jlong objectId, jlong toId);
jobject JNICALL getLocation(JNIEnv *env, jobject self, jlong objectId);
jobject JNICALL getWorldLocation(JNIEnv *env, jobject self, jlong objectId);
jobject JNICALL getHeading(JNIEnv *env, jobject self, jlong objectId);
jobject JNICALL getTransform_o2w(JNIEnv *env, jobject self, jlong objectId);
jobject JNICALL getTransform_o2p(JNIEnv *env, jobject self, jlong objectId);
jlong JNICALL getAttachedTo(JNIEnv *env, jobject self, jlong objectId);
void JNICALL setTransform_o2p(JNIEnv *env, jobject self, jlong objectId, jobject transform);
jboolean JNICALL faceToObj(JNIEnv *env, jobject self, jlong mob, jlong target);
jboolean JNICALL faceToPos(JNIEnv *env, jobject self, jlong mob, jobject target);
jboolean JNICALL faceToBehavior(JNIEnv *env, jobject self, jlong mob, jlong target);
jint JNICALL elevatorMove(JNIEnv * env, jobject self, jlong mob, jint nFloors);
void JNICALL setClientUsesAnimationLocomotion(JNIEnv *env, jobject self, jlong target, jboolean enabled);
jfloat JNICALL getMovementSpeed(JNIEnv *env, jobject self, jlong object);
jfloat JNICALL getWalkSpeed(JNIEnv *env, jobject self, jlong object);
jfloat JNICALL getRunSpeed(JNIEnv *env, jobject self, jlong object);
void JNICALL setBaseWalkSpeed(JNIEnv *env, jobject self, jlong object, jfloat speed);
jfloat JNICALL getBaseWalkSpeed(JNIEnv *env, jobject self, jlong object);
void JNICALL setBaseRunSpeed(JNIEnv *env, jobject self, jlong object, jfloat speed);
jfloat JNICALL getBaseRunSpeed(JNIEnv *env, jobject self, jlong object);
void JNICALL setMovementWalk(JNIEnv *env, jobject self, jlong object);
void JNICALL setMovementRun(JNIEnv *env, jobject self, jlong object);
void JNICALL hideFromClient(JNIEnv *env, jobject self, jlong object, jboolean hide);
jboolean JNICALL stopFloating(JNIEnv *env, jobject self, jlong objectId);
jboolean JNICALL setFloatingTime(JNIEnv *env, jobject self, jlong objectId, jint seconds );
jfloat JNICALL getYaw(JNIEnv *env, jobject self, jlong target);
jboolean JNICALL setYaw(JNIEnv *env, jobject self, jlong target, jfloat scale);
void JNICALL modifyYaw(JNIEnv *env, jobject self, jlong target, jfloat degrees);
void JNICALL modifyPitch(JNIEnv *env, jobject self, jlong target, jfloat degrees);
void JNICALL modifyRoll(JNIEnv *env, jobject self, jlong target, jfloat degrees);
jfloatArray JNICALL getQuaternion(JNIEnv *env, jobject self, jlong target);
void JNICALL setQuaternion(JNIEnv *env, jobject self, jlong target, jfloat qw, jfloat qx, jfloat qy, jfloat qz);
jint JNICALL getFurnitureRotationDegree(JNIEnv *env, jobject self, jlong player);
void JNICALL saveDecorationLayout(JNIEnv *env, jobject self, jlong player, jlong pob, jint saveSlotNumber, jstring description);
void JNICALL restoreDecorationLayout(JNIEnv *env, jobject self, jlong player, jlong pob, jint saveSlotNumber);
jboolean JNICALL setSlopeModAngle(JNIEnv *env, jobject self, jlong mob, jfloat value);
jfloat JNICALL getSlopeModAngle(JNIEnv *env, jobject self, jlong mob);
jfloat JNICALL getTemplateSlopeModAngle(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL setSlopeModPercent(JNIEnv *env, jobject self, jlong mob, jfloat value);
jfloat JNICALL getSlopeModPercent(JNIEnv *env, jobject self, jlong mob);
jfloat JNICALL getTemplateSlopeModPercent(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL setWaterModPercent(JNIEnv *env, jobject self, jlong mob, jfloat value);
jfloat JNICALL getWaterModPercent(JNIEnv *env, jobject self, jlong mob);
jfloat JNICALL getTemplateWaterModPercent(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL setMovementPercent(JNIEnv *env, jobject self, jlong mob, jfloat value);
jfloat JNICALL getMovementPercent(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL setAccelPercent(JNIEnv *env, jobject self, jlong mob, jfloat value);
jfloat JNICALL getAccelPercent(JNIEnv *env, jobject self, jlong mob);
jboolean JNICALL monitorCreatureMovement(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat skittishness, jfloat curve);
jboolean JNICALL ignoreCreatureMovement(JNIEnv *env, jobject self, jlong mob, jlong target);
jobject JNICALL getApproachSpeed(JNIEnv *env, jobject self, jlong i_mob, jobject i_mobDelta, jlong i_target, jobject i_targetDelta, jfloat i_time);
jfloat JNICALL getTargetBearing(JNIEnv *env, jobject self, jlong i_mob, jlong i_target);
void JNICALL warpPlayerCellId(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 warpPlayerCellName(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 disconnectPlayer(JNIEnv *env, jobject self, jlong player);
jboolean JNICALL isPlayerConnected(JNIEnv *env, jobject self, jlong player);
jobject JNICALL getConnectedPlayerLocation(JNIEnv * env, jobject self, jlong player);
jboolean JNICALL isPlayerActive(JNIEnv *env, jobject self, jlong player);
void JNICALL addLocationTarget(JNIEnv * env, jobject self, jlong target, jstring name, jobject location, jfloat radius, jboolean is3d);
void JNICALL removeLocationTarget(JNIEnv * env, jobject self, jlong target, jstring name);
void JNICALL sendPlayerToTutorial(JNIEnv * env, jobject self, jlong player);
void JNICALL addPassiveReveal(JNIEnv * env, jobject self, jlong object, jlong target, jint range);
void JNICALL removePassiveReveal(JNIEnv * env, jobject self, jlong object, jlong target);
void JNICALL clearPassiveRevealList(JNIEnv * env, jobject self, jlong object);
jint JNICALL getPassiveRevealRange(JNIEnv * env, jobject self, jlong object, jlong target);
jobject JNICALL getPassiveRevealList(JNIEnv * env, jobject self, jlong object);
void JNICALL requestSendPositionUpdate(JNIEnv * env, jobject self, jlong object);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsObjectMoveNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsObjectMoveNamespace::c)}
JF("_setLocation", "(JLscript/location;)Z", setLocationFromPos),
JF("_setLocation", "(JJ)Z", setLocationFromObj),
JF("_getLocation", "(J)Lscript/location;", getLocation),
JF("_getWorldLocation", "(J)Lscript/location;", getWorldLocation),
JF("_getHeading", "(J)Lscript/location;", getHeading),
JF("_getTransform_o2w", "(J)Lscript/transform;", getTransform_o2w),
JF("_getTransform_o2p", "(J)Lscript/transform;", getTransform_o2p),
JF("_getAttachedTo", "(J)J", getAttachedTo),
JF("_setTransform_o2p", "(JLscript/transform;)V", setTransform_o2p),
JF("_faceTo", "(JJ)Z", faceToObj),
JF("_faceTo", "(JLscript/location;)Z", faceToPos),
JF("_faceToBehavior", "(JJ)Z", faceToBehavior),
JF("_elevatorMove", "(JI)I", elevatorMove),
JF("_getMovementSpeed", "(J)F", getMovementSpeed),
JF("_getWalkSpeed", "(J)F", getWalkSpeed),
JF("_getRunSpeed", "(J)F", getRunSpeed),
JF("_setClientUsesAnimationLocomotion", "(JZ)V", setClientUsesAnimationLocomotion),
JF("_setBaseWalkSpeed", "(JF)V", setBaseWalkSpeed),
JF("_getBaseWalkSpeed", "(J)F", getBaseWalkSpeed),
JF("_setBaseRunSpeed", "(JF)V", setBaseRunSpeed),
JF("_getBaseRunSpeed", "(J)F", getBaseRunSpeed),
JF("_setMovementWalk", "(J)V", setMovementWalk),
JF("_setMovementRun", "(J)V", setMovementRun),
JF("_hideFromClient", "(JZ)V", hideFromClient),
JF("_stopFloating", "(J)Z", stopFloating),
JF("_setFloatingTime", "(JI)Z", setFloatingTime),
JF("_getYaw", "(J)F", getYaw),
JF("_setYaw", "(JF)Z", setYaw),
JF("_modifyYaw", "(JF)V", modifyYaw),
JF("_modifyPitch", "(JF)V", modifyPitch),
JF("_modifyRoll", "(JF)V", modifyRoll),
JF("_getQuaternion", "(J)[F", getQuaternion),
JF("_setQuaternion", "(JFFFF)V", setQuaternion),
JF("_getFurnitureRotationDegree", "(J)I", getFurnitureRotationDegree),
JF("_saveDecorationLayout", "(JJILjava/lang/String;)V", saveDecorationLayout),
JF("_restoreDecorationLayout", "(JJI)V", restoreDecorationLayout),
JF("_setSlopeModAngle", "(JF)Z", setSlopeModAngle),
JF("_getSlopeModAngle", "(J)F",getSlopeModAngle),
JF("_getTemplateSlopeModAngle", "(J)F",getTemplateSlopeModAngle),
JF("_setSlopeModPercent", "(JF)Z", setSlopeModPercent),
JF("_getSlopeModPercent", "(J)F",getSlopeModPercent),
JF("_getTemplateSlopeModPercent", "(J)F",getTemplateSlopeModPercent),
JF("_setWaterModPercent", "(JF)Z", setWaterModPercent),
JF("_getWaterModPercent", "(J)F",getWaterModPercent),
JF("_getTemplateWaterModPercent", "(J)F",getTemplateWaterModPercent),
JF("_setMovementPercent", "(JF)Z", setMovementPercent),
JF("_getMovementPercent", "(J)F",getMovementPercent),
JF("_setAccelPercent", "(JF)Z", setAccelPercent),
JF("_getAccelPercent", "(J)F",getAccelPercent),
JF("__addLocationTarget", "(JLjava/lang/String;Lscript/location;FZ)V", addLocationTarget),
JF("__removeLocationTarget", "(JLjava/lang/String;)V", removeLocationTarget),
JF("_monitorCreatureMovement", "(JJFF)Z", monitorCreatureMovement),
JF("_ignoreCreatureMovement", "(JJ)Z", ignoreCreatureMovement),
JF("_getApproachSpeed", "(JLscript/location;JLscript/location;F)Lscript/location;", getApproachSpeed),
JF("_getTargetBearing", "(JJ)F", getTargetBearing),
JF("_warpPlayer", "(JLjava/lang/String;FFFJFFFLjava/lang/String;Z)V", warpPlayerCellId),
JF("_warpPlayer", "(JLjava/lang/String;FFFJLjava/lang/String;FFFLjava/lang/String;Z)V", warpPlayerCellName),
JF("_disconnectPlayer", "(J)V", disconnectPlayer),
JF("_isPlayerConnected", "(J)Z", isPlayerConnected),
JF("_getConnectedPlayerLocation", "(J)Lscript/dictionary;", getConnectedPlayerLocation),
JF("_isPlayerActive", "(J)Z", isPlayerActive),
JF("_sendPlayerToTutorial", "(J)V", sendPlayerToTutorial),
JF("_addPassiveReveal", "(JJI)V", addPassiveReveal),
JF("_removePassiveReveal", "(JJ)V", removePassiveReveal),
JF("_clearPassiveRevealList", "(J)V", clearPassiveRevealList),
JF("_getPassiveRevealRange", "(JJ)I", getPassiveRevealRange),
JF("_getPassiveRevealList", "(J)Lscript/dictionary;", getPassiveRevealList),
JF("_requestSendPositionUpdate", "(J)V", requestSendPositionUpdate),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
//========================================================================
// helper functions
//========================================================================
/**
* Tests if an object can be moved. Throws a Java error if the object can't be
* moved.
*
* @param object the object to test
*
* @return true if the object can be moved, false if not
*/
bool ScriptMethodsObjectMoveNamespace::testInvalidObjectMove(const ServerObject * object)
{
if (object->getCacheVersion() > 0 || object->getCellProperty() != NULL)
{
char buffer[1024];
sprintf(buffer, "A script is trying to move object %s, which is a cached "
"or cell object", object->getNetworkId().getValueString().c_str());
WARNING(true, (buffer));
JavaLibrary::throwInternalScriptError(buffer);
return false;
}
return true;
} // testInvalidObjectMove
//========================================================================
// class JavaLibrary JNI object location callback methods
//========================================================================
/**
* Sets an object's location in the world based on a world coordinate.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to move
* @param to where to move the object
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setLocationFromPos(JNIEnv *env, jobject self, jlong objectId, jobject to)
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return JNI_FALSE;
if (!testInvalidObjectMove(object))
return JNI_FALSE;
Vector newPosition_p;
std::string sceneId;
NetworkId cell;
ScriptConversion::convert(to, newPosition_p, sceneId, cell);
if (object->getSceneId() != sceneId)
{
// @todo: can we move the object to a different scene?
// no, we can't without having a world location specified
}
if (cell == NetworkId::cms_invalid)
object->teleportObject(newPosition_p, NetworkId::cms_invalid, "", Vector(), "");
else
{
CellObject *destCell = dynamic_cast<CellObject *>(NetworkIdManager::getObjectById(cell));
if (!destCell)
{
JavaLibrary::throwInternalScriptError("JavaLibrary::setLocationFromPos tried to teleport to a non-cell or unloaded cell");
return JNI_FALSE;
}
Object *topmost = ContainerInterface::getTopmostContainer(*destCell);
object->teleportObject(topmost->getPosition_w(), cell, "", newPosition_p, "");
}
// fix any scene ids that may be incorrect - this was causing an issue with pack houses
object->setSceneIdOnThisAndContents(object->getSceneId());
return JNI_TRUE;
} // JavaLibrary::setLocationFromPos
/**
* Sets an object's location in the world based on another object's position.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to move
* @param toId object to move our object to
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setLocationFromObj(JNIEnv *env, jobject self, jlong objectId, jlong toId)
{
UNREF(self);
ServerObject * object = 0;
ServerObject * toObject = 0;
if (!JavaLibrary::getObject(objectId, object) || !JavaLibrary::getObject(toId, toObject))
return JNI_FALSE;
if (!testInvalidObjectMove(object))
return JNI_FALSE;
Object *toCell = ContainerInterface::getContainedByObject(*toObject);
Object *topmost = ContainerInterface::getTopmostContainer(*toObject);
object->teleportObject(topmost->getPosition_w(), toCell ? toCell->getNetworkId() : NetworkId::cms_invalid, "", toObject->getPosition_p(), "");
// fix any scene ids that may be incorrect - this was causing an issue with pack houses
object->setSceneIdOnThisAndContents(object->getSceneId());
return JNI_TRUE;
} // JavaLibrary::setLocationFromObj
/**
* Returns an object's location.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to get
*
* @return the object's location, or null on error
*/
jobject JNICALL ScriptMethodsObjectMoveNamespace::getLocation(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0;
//-- Retrieve the object's cell. This is not necessarily the object's immediate container Object.
// (e.g. for mounts, the immediate Container is the mount).
NOT_NULL(object);
CellProperty const *const cellProperty = object->getParentCell();
Object const *const cell = (cellProperty != NULL) ? &(cellProperty->getOwner()) : NULL;
// Remember, just because we're not in a cell doesn't mean we're not contained by something else,
// particularly in the case of a rider mounted where the mount is in the world cell.
Vector const positionRelativeToCellOrWorld = (cell != NULL) ? object->getPosition_c() :
object->getPosition_w();
NetworkId const &networkIdForCellOrWorld = (cell != NULL) ? cell->getNetworkId() :
NetworkId::cms_invalid;
LocalRefPtr location;
if (!ScriptConversion::convert(positionRelativeToCellOrWorld, object->getSceneId(),
networkIdForCellOrWorld, location))
{
return 0;
}
return location->getReturnValue();
} // JavaLibrary::getLocation
/**
* Returns an object's world location.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to get
*
* @return the object's world location, or null on error
*/
jobject JNICALL ScriptMethodsObjectMoveNamespace::getWorldLocation(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0;
LocalRefPtr location;
if (!ScriptConversion::convert(object->getPosition_w(), object->getSceneId(), NetworkId::cms_invalid, location))
{
return 0;
}
return location->getReturnValue();
} // JavaLibrary::getWorldLocation
/**
* Returns an object's heading.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to get
*
* @return the object's location, or null on error
*/
jobject JNICALL ScriptMethodsObjectMoveNamespace::getHeading(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0;
const Object * cell = ContainerInterface::getContainedByObject(*object);
LocalRefPtr location;
if (!ScriptConversion::convert(object->getObjectFrameK_p(), object->getSceneId(),
cell ? cell->getNetworkId() : NetworkId::cms_invalid, location))
{
return 0;
}
return location->getReturnValue();
} // JavaLibrary::getLocation
//========================================================================
jboolean JNICALL ScriptMethodsObjectMoveNamespace::stopFloating(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objectId, object)) return JNI_FALSE;
CollisionProperty * collision = object->getCollisionProperty();
if(!collision) return JNI_FALSE;
Footprint * foot = collision->getFootprint();
if(!foot) return JNI_FALSE;
foot->stopFloating();
return JNI_TRUE;
}
//========================================================================
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setFloatingTime(JNIEnv *env, jobject self, jlong objectId, jint seconds )
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(objectId, object)) return JNI_FALSE;
CollisionProperty * collision = object->getCollisionProperty();
if(!collision) return JNI_FALSE;
Footprint * foot = collision->getFootprint();
if(!foot) return JNI_FALSE;
foot->setFloatingTime(static_cast<int>(seconds));
return JNI_TRUE;
}
//========================================================================
// class JavaLibrary JNI object movement callback methods
//========================================================================
/**
* Moves an object to face another object.
*
* @param env Java environment
* @param self class calling this function
* @param mob object to move
* @param target object to face our object to
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::faceToObj(JNIEnv *env, jobject self, jlong mob, jlong target)
{
UNREF(self);
ServerObject * object = 0;
Object * targetObject = 0;
if (!JavaLibrary::getObject(mob, object) || !JavaLibrary::getObject(target, targetObject))
return JNI_FALSE;
if (!testInvalidObjectMove(object))
return JNI_FALSE;
object->lookAt_p(object->rotateTranslate_w2p(targetObject->getPosition_w ()));
return JNI_TRUE;
}
/**
* Moves an object to face a position.
*
* @param env Java environment
* @param self class calling this function
* @param mob object to move
* @param target location to face our object to
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::faceToPos(JNIEnv *env, jobject self, jlong mob, jobject target)
{
UNREF(self);
ServerObject * object = 0;
if (!JavaLibrary::getObject(mob, object))
return JNI_FALSE;
if (!testInvalidObjectMove(object))
return JNI_FALSE;
Vector location;
NetworkId cellId;
if (ScriptConversion::convert(target,location,cellId))
{
object->lookAt_p(location);
return JNI_TRUE;
}
return JNI_FALSE;
}
// ----------------------------------------------------------------------
/**
* Puts an AI into the faceTo behavior - they'll stand in place and keep
* turning to face the target until you tell them to do something else
*
* @param env Java environment
* @param self class calling this function
* @param mob object to move
* @param target object to face our object to
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::faceToBehavior(JNIEnv *env, jobject self, jlong mob, jlong target)
{
UNREF(self);
ServerObject * object = 0;
Object * targetObject = 0;
if (!JavaLibrary::getObject(mob, object) || !JavaLibrary::getObject(target, targetObject))
return JNI_FALSE;
if (!testInvalidObjectMove(object))
return JNI_FALSE;
AICreatureController * controller = 0;
if (JavaLibrary::getObjectController(mob, object, controller))
{
controller->faceTo(NetworkId(target));
return JNI_TRUE;
}
else
{
return JNI_FALSE;
}
}
// ----------------------------------------------------------------
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getYaw(JNIEnv *env, jobject self, jlong target)
{
const ServerObject * object = NULL;
if (!JavaLibrary::getObject(target, object))
return -1.0f;
return convertRadiansToDegrees (object->getObjectFrameK_p ().theta ());
}
// ----------------------------------------------------------------
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setYaw(JNIEnv *env, jobject self, jlong target, jfloat yaw)
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::setYaw");
ServerObject * object = NULL;
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::setYaw::getObject");
if (!JavaLibrary::getObject(target, object))
{
return JNI_FALSE;
}
}
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::setYaw::testInvalidObjectMove");
if (!testInvalidObjectMove(object))
{
return JNI_FALSE;
}
}
float radians = convertDegreesToRadians(yaw) - object->getObjectFrameK_p().theta();
if (object->getClient())
{
Transform t(object->getTransform_o2p());
if (radians != 0.0f)
{
t.yaw_l(radians);
t.reorthonormalize();
ServerController *controller = safe_cast<ServerController*>(object->getController());
ServerObject *destContainer = safe_cast<ServerObject*>(ContainerInterface::getContainedByObject(*object));
controller->teleport(t, destContainer);
}
}
else
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::setYaw::objectYaw");
object->yaw_o(radians);
}
return JNI_TRUE;
}
// ----------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::modifyYaw(JNIEnv *env, jobject self, jlong target, jfloat degrees)
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyYaw");
ServerObject * object = NULL;
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyYaw::getObject");
if (!JavaLibrary::getObject(target, object))
{
return;
}
}
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyYaw::testInvalidObjectMove");
if (!testInvalidObjectMove(object))
{
return;
}
}
float const radians = convertDegreesToRadians(degrees);
if (object->getClient())
{
Transform t(object->getTransform_o2p());
if (radians != 0.0f)
{
t.yaw_l(radians);
t.reorthonormalize();
ServerController *controller = safe_cast<ServerController*>(object->getController());
ServerObject *destContainer = safe_cast<ServerObject*>(ContainerInterface::getContainedByObject(*object));
controller->teleport(t, destContainer);
}
}
else
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyYaw::objectYaw");
object->yaw_o(radians);
}
}
// ----------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::modifyPitch(JNIEnv *env, jobject self, jlong target, jfloat degrees)
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyPitch");
ServerObject * object = NULL;
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyPitch::getObject");
if (!JavaLibrary::getObject(target, object))
{
return;
}
}
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyPitch::testInvalidObjectMove");
if (!testInvalidObjectMove(object))
{
return;
}
}
float const radians = convertDegreesToRadians(degrees);
if (object->getClient())
{
Transform t(object->getTransform_o2p());
if (radians != 0.0f)
{
t.pitch_l(radians);
t.reorthonormalize();
ServerController *controller = safe_cast<ServerController*>(object->getController());
ServerObject *destContainer = safe_cast<ServerObject*>(ContainerInterface::getContainedByObject(*object));
controller->teleport(t, destContainer);
}
}
else
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyPitch::objectPitch");
object->pitch_o(radians);
}
}
// ----------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::modifyRoll(JNIEnv *env, jobject self, jlong target, jfloat degrees)
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyRoll");
ServerObject * object = NULL;
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyRoll::getObject");
if (!JavaLibrary::getObject(target, object))
{
return;
}
}
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyRoll::testInvalidObjectMove");
if (!testInvalidObjectMove(object))
{
return;
}
}
float const radians = convertDegreesToRadians(degrees);
if (object->getClient())
{
Transform t(object->getTransform_o2p());
if (radians != 0.0f)
{
t.roll_l(radians);
t.reorthonormalize();
ServerController *controller = safe_cast<ServerController*>(object->getController());
ServerObject *destContainer = safe_cast<ServerObject*>(ContainerInterface::getContainedByObject(*object));
controller->teleport(t, destContainer);
}
}
else
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::modifyRoll::objectRoll");
object->roll_o(radians);
}
}
// ----------------------------------------------------------------
jfloatArray JNICALL ScriptMethodsObjectMoveNamespace::getQuaternion(JNIEnv *env, jobject self, jlong target)
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::getQuaternion");
ServerObject * object = NULL;
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::getQuaternion::getObject");
if (!JavaLibrary::getObject(target, object))
{
return 0;
}
}
Quaternion const q(object->getTransform_o2p());
LocalFloatArrayRefPtr valueArray = createNewFloatArray(static_cast<jsize>(4));
if (valueArray == LocalFloatArrayRef::cms_nullPtr)
{
return 0;
}
jfloat value = static_cast<jfloat>(q.w);
setFloatArrayRegion(*valueArray, 0, 1, &value);
value = static_cast<jfloat>(q.x);
setFloatArrayRegion(*valueArray, 1, 1, &value);
value = static_cast<jfloat>(q.y);
setFloatArrayRegion(*valueArray, 2, 1, &value);
value = static_cast<jfloat>(q.z);
setFloatArrayRegion(*valueArray, 3, 1, &value);
return valueArray->getReturnValue();
}
// ----------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::setQuaternion(JNIEnv *env, jobject self, jlong target, jfloat qw, jfloat qx, jfloat qy, jfloat qz)
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::setQuaternion");
ServerObject * object = NULL;
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::setQuaternion::getObject");
if (!JavaLibrary::getObject(target, object))
{
return;
}
}
Quaternion const q(static_cast<real>(qw), static_cast<real>(qx), static_cast<real>(qy), static_cast<real>(qz));
Transform t;
q.getTransform(&t);
t.setPosition_p(object->getTransform_o2p().getPosition_p());
if (object->getClient())
{
t.reorthonormalize();
ServerController *controller = safe_cast<ServerController*>(object->getController());
ServerObject *destContainer = safe_cast<ServerObject*>(ContainerInterface::getContainedByObject(*object));
controller->teleport(t, destContainer);
}
else
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::setQuaternion::objectSetQuaternion");
object->setTransform_o2p(t);
}
}
// ----------------------------------------------------------------
jint JNICALL ScriptMethodsObjectMoveNamespace::getFurnitureRotationDegree(JNIEnv *env, jobject self, jlong player)
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::getFurnitureRotationDegree");
ServerObject * object = NULL;
{
PROFILER_AUTO_BLOCK_DEFINE("JavaLibrary::getFurnitureRotationDegree::getObject");
if (!JavaLibrary::getObject(player, object))
{
return 90;
}
}
if (object->getClient())
return abs(object->getClient()->getFurnitureRotationDegree());
return 90;
}
// ----------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::saveDecorationLayout(JNIEnv *env, jobject self, jlong player, jlong pob, jint saveSlotNumber, jstring description)
{
CreatureObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject) || !playerObject)
return;
ServerObject const * pobObject = NULL;
if (!JavaLibrary::getObject(pob, pobObject) || !pobObject)
return;
JavaStringParam localDescription(description);
std::string descriptionStr;
if (!JavaLibrary::convert(localDescription, descriptionStr))
return;
playerObject->saveDecorationLayout(*pobObject, saveSlotNumber, descriptionStr);
}
// ----------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::restoreDecorationLayout(JNIEnv *env, jobject self, jlong player, jlong pob, jint saveSlotNumber)
{
CreatureObject * playerObject = NULL;
if (!JavaLibrary::getObject(player, playerObject) || !playerObject)
return;
ServerObject const * pobObject = NULL;
if (!JavaLibrary::getObject(pob, pobObject) || !pobObject)
return;
playerObject->restoreDecorationLayout(*pobObject, saveSlotNumber);
}
// ----------------------------------------------------------------
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setSlopeModAngle(JNIEnv *env, jobject self, jlong objectId, jfloat value)
{
UNREF(self);
CreatureObject * object = 0;
CreatureController * controller = 0;
if (!JavaLibrary::getObjectController(objectId, object, controller))
return JNI_FALSE;
return controller->setSlopeModAngle(value * PI / 180);
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getSlopeModAngle(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
CreatureObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0.0f;
return object->getSlopeModAngle() * 180 / PI;
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getTemplateSlopeModAngle(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
CreatureObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0.0f;
const SharedCreatureObjectTemplate * sharedTemplate = safe_cast<const SharedCreatureObjectTemplate *>(object->getSharedTemplate());
return sharedTemplate->getSlopeModAngle() * 180 / PI;
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setWaterModPercent(JNIEnv *env, jobject self, jlong objectId, jfloat value)
{
UNREF(self);
CreatureObject * object = 0;
CreatureController * controller = 0;
if (!JavaLibrary::getObjectController(objectId, object, controller))
return JNI_FALSE;
return controller->setWaterModPercent(value);
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getWaterModPercent(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
CreatureObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0.0f;
return object->getWaterModPercent();
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getTemplateWaterModPercent(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
CreatureObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0.0f;
const SharedCreatureObjectTemplate * sharedTemplate = safe_cast<const SharedCreatureObjectTemplate *>(object->getSharedTemplate());
return sharedTemplate->getWaterModPercent();
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setSlopeModPercent(JNIEnv *env, jobject self, jlong objectId, jfloat value)
{
UNREF(self);
CreatureObject * object = 0;
CreatureController * controller = 0;
if (!JavaLibrary::getObjectController(objectId, object, controller))
return JNI_FALSE;
return controller->setSlopeModPercent(value);
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getSlopeModPercent(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
CreatureObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0.0f;
return object->getSlopeModPercent();
}
/**
* Sets the slope aversion for an object. This may cause a repath to take place. The aversion is calculated by adding the
* height delta times the aversion value to the actual distance. So a 5 meter edge with a 1 meter slope difference would
* be pathed as 6 meters with a 1 aversion factor.
*
* @param env Java environment
* @param self class calling this function
* @param objectId object to change the slope aversion
* @param value the aversion value. 0 is no aversion.
*
* @return true on success, false on fail
*/
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getTemplateSlopeModPercent(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
CreatureObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0.0f;
const SharedCreatureObjectTemplate * sharedTemplate = safe_cast<const SharedCreatureObjectTemplate *>(object->getSharedTemplate());
return sharedTemplate->getSlopeModPercent();
}
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setMovementPercent(JNIEnv *, jobject, jlong objectId, jfloat value)
{
TangibleObject *tangibleTarget = 0;
if (JavaLibrary::getObject(objectId, tangibleTarget))
{
if (tangibleTarget->asShipObject())
return tangibleTarget->asShipObject()->setMovementPercent(value);
else if (tangibleTarget->asCreatureObject())
return tangibleTarget->asCreatureObject()->setMovementPercent(value);
}
return static_cast<jboolean>(JNI_FALSE);
}
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getMovementPercent(JNIEnv *, jobject, jlong objectId)
{
TangibleObject *tangibleTarget = 0;
if (JavaLibrary::getObject(objectId, tangibleTarget))
{
if (tangibleTarget->asShipObject())
return tangibleTarget->asShipObject()->getMovementPercent();
else if (tangibleTarget->asCreatureObject())
return tangibleTarget->asCreatureObject()->getMovementPercent();
}
return 0.f;
}
jboolean JNICALL ScriptMethodsObjectMoveNamespace::setAccelPercent(JNIEnv *env, jobject self, jlong objectId, jfloat value)
{
UNREF(self);
CreatureObject * object = 0;
CreatureController * controller = 0;
if (!JavaLibrary::getObjectController(objectId, object, controller))
return JNI_FALSE;
return controller->setAccelPercent(value);
}
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getAccelPercent(JNIEnv *env, jobject self, jlong objectId)
{
UNREF(self);
CreatureObject * object = 0;
if (!JavaLibrary::getObject(objectId, object))
return 0.0f;
return object->getAccelPercent();
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::addLocationTarget(JNIEnv * env, jobject self, jlong target, jstring name, jobject location, jfloat radius, jboolean is3d)
{
JavaStringParam localName(name);
if(! self)
return;
if(!name)
return;
if(!location)
return;
Vector pos;
if (ScriptConversion::convertWorld(location, pos))
{
LocationData d;
// @todo : check scene id!
std::string s;
JavaStringPtr scene = getStringField(LocalRefParam(location), JavaLibrary::getFidLocationArea());
if(JavaLibrary::convert(*scene, s))
{
d.scene = s;
// 3d location targets are denoted by y coordinates > 50k, with 100k added to them
// location targets with y coordinates less than 50k have their y coordinates ignored during comparisons.
if (is3d)
pos.y += 100000.0f;
d.location.setCenter(pos);
d.location.setRadius(radius);
Unicode::String n;
if(JavaLibrary::convert(localName, n))
{
TangibleObject * t = 0;
d.name = n;
if(JavaLibrary::getObject(target, t))
{
if(t)
{
if (testInvalidObjectMove(t))
t->addLocationTarget(d);
}
}
}
}
}
}
//-----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::removeLocationTarget(JNIEnv * env, jobject self, jlong target, jstring name)
{
JavaStringParam localName(name);
if(! self)
return;
if(! name)
return;
Unicode::String n;
if(JavaLibrary::convert(localName, n))
{
TangibleObject * t = 0;
if(JavaLibrary::getObject(target, t))
{
if(t)
{
if (testInvalidObjectMove(t))
t->removeLocationTarget(n);
}
}
}
}
//-----------------------------------------------------------------------
jint JNICALL ScriptMethodsObjectMoveNamespace::elevatorMove(JNIEnv *env, jobject self, jlong mob, jint nFloors )
{
UNREF(env);
UNREF(self);
CreatureObject * creature = 0;
ServerController * controller = 0;
if (JavaLibrary::getObjectController(mob, creature, controller))
{
int movedFloors = controller->elevatorMove(static_cast<int>(nFloors));
return static_cast<jint>(movedFloors);
}
return 0;
}
jboolean JNICALL ScriptMethodsObjectMoveNamespace::monitorCreatureMovement(JNIEnv *env, jobject self, jlong mob, jlong target, jfloat skittishness, jfloat curve)
{
UNREF(env);
UNREF(self);
CreatureObject * creature = 0;
if (JavaLibrary::getObject(mob, creature))
{
CachedNetworkId targetId(target);
if (!targetId)
return false;
return creature->monitorCreatureMovement(targetId, skittishness, curve);
}
return false;
}
jboolean JNICALL ScriptMethodsObjectMoveNamespace::ignoreCreatureMovement(JNIEnv *env, jobject self, jlong mob, jlong target)
{
UNREF(env);
UNREF(self);
CreatureObject * creature = 0;
if (JavaLibrary::getObject(mob, creature))
{
CachedNetworkId targetId(target);
if (targetId == NetworkId::cms_invalid)
return false;
return creature->ignoreCreatureMovement(targetId);
}
return false;
}
jobject JNICALL ScriptMethodsObjectMoveNamespace::getApproachSpeed(JNIEnv *env, jobject self, jlong i_mob, jobject i_mobDelta, jlong i_target, jobject i_targetDelta, jfloat i_time)
{
UNREF(env);
UNREF(self);
Vector resultVector(Vector::zero);
CreatureObject * mob = 0;
Vector mobDelta;
NetworkId mobCell;
CreatureObject * target = 0;
Vector targetDelta;
NetworkId targetCell;
if (i_time > 0 && JavaLibrary::getObject(i_mob, mob) && ScriptConversion::convert(i_mobDelta, mobDelta, mobCell) &&
JavaLibrary::getObject(i_target, target) && ScriptConversion::convert(i_targetDelta, targetDelta, targetCell))
{
Vector mobPosition = mob->getPosition_w();
Vector targetPosition = target->getPosition_w();
float originalDistance = (targetPosition - targetDelta).magnitudeBetween(mobPosition - mobDelta);
float currentDistance = targetPosition.magnitudeBetween(mobPosition);
float approachVelocity = (originalDistance - currentDistance) / i_time;
float tangentVelocity = sqrt(((mobDelta - targetDelta)/i_time).magnitudeSquared() - approachVelocity * approachVelocity);
resultVector.x = approachVelocity;
resultVector.y = tangentVelocity;
resultVector.z = currentDistance;
}
LocalRefPtr result;
if (!ScriptConversion::convert(resultVector, NetworkId::cms_invalid, result))
return 0;
return result->getReturnValue();
}
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getTargetBearing(JNIEnv *env, jobject self, jlong i_mob, jlong i_target)
{
UNREF(env);
UNREF(self);
ServerObject * mob = 0;
ServerObject * target = 0;
float result=0;
if (JavaLibrary::getObject(i_mob, mob) && JavaLibrary::getObject(i_target, target))
{
Vector localPosition = mob->rotateTranslate_w2o(target->getPosition_w());
result = float(atan2(localPosition.x, localPosition.z)) * 180 / PI;
}
return result;
}
void JNICALL ScriptMethodsObjectMoveNamespace::warpPlayerCellId(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))
return;
JavaStringParam localScene(scene);
std::string sceneName;
if (!JavaLibrary::convert(localScene, sceneName))
return;
std::string callbackName;
if (callback)
{
JavaStringParam localCallback(callback);
if (!JavaLibrary::convert(localCallback, callbackName))
return;
}
NetworkId cellId(cell);
GameServer::getInstance().requestSceneWarp(
CachedNetworkId(*playerObject),
sceneName,
Vector(x_w, y_w, z_w),
cellId,
Vector(x_p, y_p, z_p),
callbackName.c_str(),
forceLoadScreen);
}
void JNICALL ScriptMethodsObjectMoveNamespace::warpPlayerCellName(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))
return;
JavaStringParam localScene(scene);
std::string sceneName;
if (!JavaLibrary::convert(localScene, sceneName))
return;
JavaStringParam localCell(cell);
std::string cellName;
if (!JavaLibrary::convert(localCell, cellName))
return;
NetworkId buildingId(building);
if (buildingId == NetworkId::cms_invalid)
return;
std::string callbackName;
if (callback)
{
JavaStringParam localCallback(callback);
if (!JavaLibrary::convert(localCallback, callbackName))
return;
}
GameServer::getInstance().requestSceneWarp(
CachedNetworkId(*playerObject),
sceneName,
Vector(x_w, y_w, z_w),
buildingId,
cellName,
Vector(x_p, y_p, z_p),
callbackName.c_str(),
forceLoadScreen);
}
void JNICALL ScriptMethodsObjectMoveNamespace::disconnectPlayer(JNIEnv *env, jobject self, jlong player)
{
CreatureObject * playerCreature = 0;
if (JavaLibrary::getObject(player, playerCreature))
playerCreature->disconnect();
}
jboolean JNICALL ScriptMethodsObjectMoveNamespace::isPlayerConnected(JNIEnv *env, jobject self, jlong player)
{
CreatureObject const * playerCreature = 0;
if (JavaLibrary::getObject(player, playerCreature) && playerCreature)
{
PlayerObject const * const playerPlayer = PlayerCreatureController::getPlayerObject(playerCreature);
if (playerPlayer && (playerPlayer->getSessionStartPlayTime() != 0))
{
return JNI_TRUE;
}
else
{
return JNI_FALSE;
}
}
// player may be on a different game server, check the cluster wide LFG data
if (ServerUniverse::getConnectedCharacterLfgData().count(NetworkId(static_cast<NetworkId::NetworkIdType>(player))) > 0)
return JNI_TRUE;
return JNI_FALSE;
}
jobject JNICALL ScriptMethodsObjectMoveNamespace::getConnectedPlayerLocation(JNIEnv * env, jobject self, jlong player)
{
std::map<NetworkId, LfgCharacterData> const & connectedCharacterLfgData = ServerUniverse::getConnectedCharacterLfgData();
std::map<NetworkId, LfgCharacterData>::const_iterator const iterFind = connectedCharacterLfgData.find(NetworkId(static_cast<NetworkId::NetworkIdType>(player)));
if (iterFind == connectedCharacterLfgData.end())
return NULL;
LocalRefPtr dictionary = createNewObject(JavaLibrary::getClsDictionary(), JavaLibrary::getMidDictionary());
if (dictionary == LocalRef::cms_nullPtr)
return NULL;
callObjectMethod(*dictionary, JavaLibrary::getMidDictionaryPut(), JavaString("planet").getValue(), JavaString(iterFind->second.locationPlanet).getValue());
if (!iterFind->second.locationRegion.empty())
callObjectMethod(*dictionary, JavaLibrary::getMidDictionaryPut(), JavaString("region").getValue(), JavaString(iterFind->second.locationRegion).getValue());
if (!iterFind->second.locationPlayerCity.empty())
callObjectMethod(*dictionary, JavaLibrary::getMidDictionaryPut(), JavaString("playerCity").getValue(), JavaString(iterFind->second.locationPlayerCity).getValue());
if (env->ExceptionCheck())
{
env->ExceptionDescribe();
return 0;
}
return dictionary->getReturnValue();
}
jboolean JNICALL ScriptMethodsObjectMoveNamespace::isPlayerActive(JNIEnv *env, jobject self, jlong player)
{
CreatureObject const * playerCreature = 0;
if (JavaLibrary::getObject(player, playerCreature) && playerCreature)
{
PlayerObject const * const playerPlayer = PlayerCreatureController::getPlayerObject(playerCreature);
if (playerPlayer && (playerPlayer->getSessionLastActiveTime() != 0))
{
return JNI_TRUE;
}
else
{
return JNI_FALSE;
}
}
// player may be on a different game server, check the cluster wide LFG data
std::map<NetworkId, LfgCharacterData> const & connectedCharacterLfgData = ServerUniverse::getConnectedCharacterLfgData();
std::map<NetworkId, LfgCharacterData>::const_iterator iter = connectedCharacterLfgData.find(NetworkId(static_cast<NetworkId::NetworkIdType>(player)));
if ((iter != connectedCharacterLfgData.end()) && iter->second.active)
return JNI_TRUE;
return JNI_FALSE;
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getMovementSpeed(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
CreatureController * const creatureController = CreatureController::getCreatureController(networkId);
return (creatureController != NULL) ? creatureController->getCurrentVelocity().magnitude() : 0.0f;
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getWalkSpeed(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
return (creatureObject != NULL) ? creatureObject->getWalkSpeed() : 0.0f;
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getRunSpeed(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
return (creatureObject != NULL) ? creatureObject->getRunSpeed() : 0.0f;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::setBaseWalkSpeed(JNIEnv * /*env*/, jobject /*self*/, jlong object, jfloat speed)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
if (creatureObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsObjectMove::setBaseWalkSpeed() Unable to resolve the object(%s) to a CreatureObject.", networkId.getValueString().c_str()));
return;
}
LOGC(ConfigServerGame::isAiLoggingEnabled(), "debug_ai", ("ScriptMethodsObjectMove::setBaseWalkSpeed() object(%s) speed(%.2f)", networkId.getValueString().c_str(), speed));
creatureObject->setBaseWalkSpeed(speed);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getBaseWalkSpeed(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
return (creatureObject != NULL) ? creatureObject->getBaseWalkSpeed() : 0.0f;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::setBaseRunSpeed(JNIEnv * /*env*/, jobject /*self*/, jlong object, jfloat speed)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
if (creatureObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsObjectMove::setBaseRunSpeed() Unable to resolve the object(%s) to a CreatureObject.", networkId.getValueString().c_str()));
return;
}
LOGC(ConfigServerGame::isAiLoggingEnabled(), "debug_ai", ("ScriptMethodsObjectMove::setBaseRunSpeed() object(%s) speed(%.2f)", networkId.getValueString().c_str(), speed));
creatureObject->setBaseRunSpeed(speed);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsObjectMoveNamespace::getBaseRunSpeed(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
return (creatureObject != NULL) ? creatureObject->getBaseRunSpeed() : 0.0f;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::setMovementWalk(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
if (creatureObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsObjectMove::setMovementWalk() Unable to resolve the object(%s) to a CreatureObject.", networkId.getValueString().c_str()));
return;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(creatureObject->getController());
if (aiCreatureController == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsObjectMove::setMovementWalk() Unable to resolve the object's(%s) controller to an AiCreatureController.", creatureObject->getDebugInformation().c_str()));
return;
}
LOGC(ConfigServerGame::isAiLoggingEnabled(), "debug_ai", ("ScriptMethodsObjectMove::setMovementWalk() object(%s)", networkId.getValueString().c_str()));
aiCreatureController->setMovementWalk();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::setMovementRun(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
CreatureObject * const creatureObject = CreatureObject::getCreatureObject(networkId);
if (creatureObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsObjectMove::setMovementRun() Unable to resolve the object(%s) to a CreatureObject.", networkId.getValueString().c_str()));
return;
}
AICreatureController * const aiCreatureController = AICreatureController::asAiCreatureController(creatureObject->getController());
if (aiCreatureController == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsObjectMove::setMovementRun() Unable to resolve the object's(%s) controller to an AiCreatureController.", creatureObject->getDebugInformation().c_str()));
return;
}
LOGC(ConfigServerGame::isAiLoggingEnabled(), "debug_ai", ("ScriptMethodsObjectMove::setMovementRun() object(%s)", networkId.getValueString().c_str()));
aiCreatureController->setMovementRun();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::hideFromClient(JNIEnv *env, jobject self, jlong target, jboolean hide)
{
TangibleObject * tangibleObject = 0;
if (JavaLibrary::getObject(target, tangibleObject))
tangibleObject->setHidden(hide);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::setClientUsesAnimationLocomotion(JNIEnv *env, jobject self, jlong target, jboolean enabled)
{
CreatureObject * creature = 0;
if (JavaLibrary::getObject(target, creature))
{
if (creature->isAuthoritative())
{
creature->setClientUsesAnimationLocomotion(enabled);
return;
}
}
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsObjectMoveNamespace::getTransform_o2w(JNIEnv *env, jobject self, jlong objectId)
{
ServerObject *object = 0;
if (!JavaLibrary::getObject(objectId, object))
{
JavaLibrary::throwInternalScriptError("JavaLibrary::getTransform_o2w could not resolve object");
return 0;
}
LocalRefPtr transform;
if (ScriptConversion::convert(object->getTransform_o2w(), transform))
return transform->getReturnValue();
return 0;
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsObjectMoveNamespace::getTransform_o2p(JNIEnv *env, jobject self, jlong objectId)
{
ServerObject *object = 0;
if (!JavaLibrary::getObject(objectId, object))
JavaLibrary::throwInternalScriptError("JavaLibrary::getTransform_o2p could not resolve object");
else
{
LocalRefPtr transform;
if (ScriptConversion::convert(object->getTransform_o2p(), transform))
return transform->getReturnValue();
}
return 0;
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsObjectMoveNamespace::getAttachedTo(JNIEnv *env, jobject self, jlong objectId)
{
ServerObject *object = 0;
if (!JavaLibrary::getObject(objectId, object))
JavaLibrary::throwInternalScriptError("JavaLibrary::getAttachedTo could not resolve object");
else
{
Object *attachedTo = object->getAttachedTo();
if (attachedTo)
return (attachedTo->getNetworkId()).getValue();
}
return 0;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::setTransform_o2p(JNIEnv *env, jobject self, jlong objectId, jobject transform)
{
ServerObject *object = 0;
if (!JavaLibrary::getObject(objectId, object))
JavaLibrary::throwInternalScriptError("JavaLibrary::setTransform_o2p could not resolve object");
else if (testInvalidObjectMove(object))
{
Transform newTransform;
ScriptConversion::convert(transform, newTransform);
safe_cast<ServerController *>(object->getController())->teleport(newTransform, safe_cast<ServerObject *>(object->getAttachedTo()));
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::sendPlayerToTutorial(JNIEnv *env, jobject self, jlong player)
{
CreatureObject *playerObject = 0;
if (!JavaLibrary::getObject(player, playerObject))
return;
NewbieTutorial::setupCharacterForTutorial(playerObject);
GameServer::getInstance().requestSceneWarp(CachedNetworkId(*playerObject), NewbieTutorial::getSceneId(), NewbieTutorial::getTutorialLocation(), NetworkId::cms_invalid, Vector(0,0,0));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::addPassiveReveal(JNIEnv * env, jobject self, jlong object, jlong target, jint range)
{
TangibleObject * toObject = 0;
if (!JavaLibrary::getObject(object, toObject))
return;
TangibleObject * toTarget = 0;
if (!JavaLibrary::getObject(target, toTarget))
return;
toObject->addPassiveReveal(*toTarget, range);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::removePassiveReveal(JNIEnv * env, jobject self, jlong object, jlong target)
{
TangibleObject * toObject = 0;
if (!JavaLibrary::getObject(object, toObject))
return;
toObject->removePassiveReveal(NetworkId(static_cast<NetworkId::NetworkIdType>(target)));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::clearPassiveRevealList(JNIEnv * env, jobject self, jlong object)
{
TangibleObject * toObject = 0;
if (!JavaLibrary::getObject(object, toObject))
return;
toObject->removeAllPassiveReveal();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsObjectMoveNamespace::getPassiveRevealRange(JNIEnv * env, jobject self, jlong object, jlong target)
{
TangibleObject * toObject = 0;
if (!JavaLibrary::getObject(object, toObject))
return -1;
return toObject->getPassiveRevealRange(NetworkId(static_cast<NetworkId::NetworkIdType>(target)));
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsObjectMoveNamespace::getPassiveRevealList(JNIEnv * env, jobject self, jlong object)
{
TangibleObject * toObject = 0;
if (!JavaLibrary::getObject(object, toObject))
return 0;
std::map<NetworkId, int> const & passiveReveal = toObject->getPassiveReveal();
if (passiveReveal.empty())
return 0;
// params (see below) will be responsible for destructing these
std::vector<NetworkId> * id = new std::vector<NetworkId>;
std::vector<int> * range = new std::vector<int>;
for (std::map<NetworkId, int>::const_iterator iter = passiveReveal.begin(); iter != passiveReveal.end(); ++iter)
{
id->push_back(iter->first);
range->push_back(iter->second);
}
ScriptParams params;
params.addParam(*id, "id", true);
params.addParam(*range, "range", true);
JavaDictionaryPtr dictionary;
JavaLibrary::instance()->convert(params, dictionary);
return dictionary->getReturnValue();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsObjectMoveNamespace::requestSendPositionUpdate(JNIEnv * env, jobject self, jlong object)
{
ServerObject * soObject = 0;
if (!JavaLibrary::getObject(object, soObject))
return;
PositionUpdateTracker::positionChanged(*soObject);
}
// ======================================================================