mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-07-31 01:15:48 -04:00
Added serverScript library
This commit is contained in:
@@ -0,0 +1,861 @@
|
||||
//========================================================================
|
||||
//
|
||||
// ScriptMethodsInteriors.cpp - implements script methods dealing with cells and interiors
|
||||
//
|
||||
// copyright 2002 Sony Online Entertainment
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#include "serverScript/FirstServerScript.h"
|
||||
#include "serverScript/JavaLibrary.h"
|
||||
|
||||
#include "serverGame/BuildingObject.h"
|
||||
#include "serverGame/CellObject.h"
|
||||
#include "serverGame/ContainerInterface.h"
|
||||
#include "serverGame/CreatureObject.h"
|
||||
#include "serverGame/GameServer.h"
|
||||
#include "serverGame/ServerObject.h"
|
||||
#include "serverGame/ServerWorld.h"
|
||||
#include "sharedCollision/Floor.h"
|
||||
#include "sharedCollision/FloorLocator.h"
|
||||
#include "sharedMath/Ray3d.h"
|
||||
#include "sharedObject/CellProperty.h"
|
||||
#include "sharedObject/NetworkIdManager.h"
|
||||
#include "sharedObject/PortalProperty.h"
|
||||
#include "sharedObject/PortalPropertyTemplate.h"
|
||||
|
||||
using namespace JNIWrappersNamespace;
|
||||
|
||||
|
||||
// ======================================================================
|
||||
// ScriptMethodsInteriorsNamespace
|
||||
// ======================================================================
|
||||
|
||||
namespace ScriptMethodsInteriorsNamespace
|
||||
{
|
||||
bool install();
|
||||
|
||||
jlong JNICALL createObjectInCell(JNIEnv *env, jobject self, jlong source, jlong building, jstring cellName, jobject pos);
|
||||
jlong JNICALL createObjectInCellString(JNIEnv *env, jobject self, jobject source, jlong building, jstring cellName, jobject pos);
|
||||
jlong JNICALL _createObjectInCellInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName, jobject pos);
|
||||
jlong JNICALL createObjectInCellAnywhere(JNIEnv *env, jobject self, jlong original, jlong building, jstring cellName);
|
||||
jlong JNICALL createObjectInCellAnywhereString(JNIEnv *env, jobject self, jobject original, jlong building, jstring cellName);
|
||||
jlong JNICALL _createObjectInCellAnywhereInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName);
|
||||
jobjectArray JNICALL getCellNames(JNIEnv *env, jobject self, jlong target);
|
||||
jstring JNICALL getCellName(JNIEnv *env, jobject self, jlong target);
|
||||
jlongArray JNICALL getCellIds(JNIEnv *env, jobject self, jlong target);
|
||||
jlong JNICALL getCellId(JNIEnv *env, jobject self, jlong building, jstring cellName);
|
||||
jobject JNICALL getLocationForWorldCoordinate(JNIEnv *env, jobject self, jfloat x, jfloat y, jfloat z);
|
||||
jboolean JNICALL hasCell(JNIEnv *env, jobject self, jlong building, jstring cellName);
|
||||
jobject JNICALL getGoodLocationInterior(JNIEnv *env, jobject self, jlong building, jstring cellName);
|
||||
jobject JNICALL getBuildingEjectLocation(JNIEnv *env, jobject self, jlong building);
|
||||
jboolean JNICALL isValidInteriorLocation (JNIEnv * env, jobject self, jobject location);
|
||||
jlong JNICALL moveHouseItemToPlayer(JNIEnv *env, jobject self, jlong building, jlong player, int index);
|
||||
jlong JNICALL moveHouseItemToPlayer2(JNIEnv *env, jobject self, jlong building, jlong player, jlong item);
|
||||
void JNICALL deleteAllHouseItems(JNIEnv *env, jobject self, jlong building, jlong player);
|
||||
jboolean JNICALL areAllContentsLoaded(JNIEnv *env, jobject self, jlong building);
|
||||
void JNICALL loadBuildingContents(JNIEnv *env, jobject self, jlong player, jlong building);
|
||||
jint JNICALL getPobBaseItemLimit(JNIEnv *env, jobject self, jlong building);
|
||||
jboolean JNICALL isAtPendingLoadRequestLimit(JNIEnv * env, jobject self);
|
||||
|
||||
jstring JNICALL getCellLabel(JNIEnv * env, jobject self, jlong target);
|
||||
jboolean JNICALL setCellLabel(JNIEnv * env, jobject self, jlong target, jstring cellLabel);
|
||||
jboolean JNICALL setCellLabelOffset(JNIEnv * env, jobject self, jlong target, jfloat x, jfloat y, jfloat z);
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// install
|
||||
//========================================================================
|
||||
|
||||
bool ScriptMethodsInteriorsNamespace::install()
|
||||
{
|
||||
const JNINativeMethod NATIVES[] = {
|
||||
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsInteriorsNamespace::c)}
|
||||
JF("_createObjectInCell", "(Ljava/lang/String;JLjava/lang/String;Lscript/location;)J", createObjectInCellString),
|
||||
JF("_createObjectInCell", "(JJLjava/lang/String;Lscript/location;)J", createObjectInCell),
|
||||
JF("_createObjectInCell", "(Ljava/lang/String;JLjava/lang/String;)J", createObjectInCellAnywhereString),
|
||||
JF("_createObjectInCell", "(JJLjava/lang/String;)J", createObjectInCellAnywhere),
|
||||
JF("_getCellNames", "(J)[Ljava/lang/String;", getCellNames),
|
||||
JF("_getCellName", "(J)Ljava/lang/String;", getCellName),
|
||||
JF("_getCellIds", "(J)[J", getCellIds),
|
||||
JF("_getCellId", "(JLjava/lang/String;)J", getCellId),
|
||||
JF("getLocationForWorldCoordinate", "(FFF)Lscript/location;", getLocationForWorldCoordinate),
|
||||
JF("_hasCell", "(JLjava/lang/String;)Z", hasCell),
|
||||
JF("_getGoodLocation", "(JLjava/lang/String;)Lscript/location;", getGoodLocationInterior),
|
||||
JF("_getBuildingEjectLocation", "(J)Lscript/location;", getBuildingEjectLocation),
|
||||
JF("isValidInteriorLocation", "(Lscript/location;)Z", isValidInteriorLocation),
|
||||
JF("_moveHouseItemToPlayer", "(JJI)J", moveHouseItemToPlayer),
|
||||
JF("_moveHouseItemToPlayer", "(JJJ)J", moveHouseItemToPlayer2),
|
||||
JF("_deleteAllHouseItems", "(JJ)V", deleteAllHouseItems),
|
||||
JF("_areAllContentsLoaded", "(J)Z", areAllContentsLoaded),
|
||||
JF("_loadBuildingContents", "(JJ)V", loadBuildingContents),
|
||||
JF("_getPobBaseItemLimit", "(J)I", getPobBaseItemLimit),
|
||||
JF("isAtPendingLoadRequestLimit", "()Z", isAtPendingLoadRequestLimit),
|
||||
JF("_getCellLabel", "(J)Ljava/lang/String;", getCellLabel),
|
||||
JF("_setCellLabel", "(JLjava/lang/String;)Z", setCellLabel),
|
||||
JF("_setCellLabelOffset", "(JFFF)Z", setCellLabelOffset),
|
||||
};
|
||||
|
||||
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// class JavaLibrary JNI Container methods
|
||||
//========================================================================
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCellString(JNIEnv *env, jobject self, jobject source, jlong building, jstring cellName, jobject pos)
|
||||
{
|
||||
UNREF(self);
|
||||
NOT_NULL(env);
|
||||
|
||||
if (source == 0)
|
||||
return 0;
|
||||
if (building == 0)
|
||||
return 0;
|
||||
|
||||
std::string templateName;
|
||||
if (env->IsInstanceOf(source, JavaLibrary::getClsString()) == JNI_TRUE)
|
||||
{
|
||||
JavaStringParam localSource(static_cast<jstring>(source));
|
||||
JavaLibrary::convert(localSource, templateName);
|
||||
return _createObjectInCellInternal(env, self, templateName, building, cellName, pos);
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCell(JNIEnv *env, jobject self, jlong source, jlong building, jstring cellName, jobject pos)
|
||||
{
|
||||
UNREF(self);
|
||||
NOT_NULL(env);
|
||||
|
||||
if (source == 0)
|
||||
return 0;
|
||||
if (building == 0)
|
||||
return 0;
|
||||
|
||||
std::string templateName;
|
||||
ServerObject* sourceObject = NULL;
|
||||
if (!JavaLibrary::getObject(source, sourceObject))
|
||||
return 0;
|
||||
templateName = sourceObject->getTemplateName();
|
||||
|
||||
return _createObjectInCellInternal(env, self, templateName, building, cellName, pos);
|
||||
}
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::_createObjectInCellInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName, jobject pos)
|
||||
{
|
||||
JavaStringParam localCellName(cellName);
|
||||
|
||||
ServerObject * portallizedObject = NULL;
|
||||
if (!JavaLibrary::getObject(building, portallizedObject))
|
||||
return 0;
|
||||
|
||||
std::string cellNameString;
|
||||
JavaLibrary::convert(localCellName, cellNameString);
|
||||
|
||||
PortalProperty* portalProp = portallizedObject->getPortalProperty();
|
||||
if (!portalProp)
|
||||
return 0;
|
||||
|
||||
ServerObject* cellObject = (portalProp->getCell(cellNameString.c_str()))->getOwner().asServerObject();
|
||||
|
||||
if (!cellObject)
|
||||
return 0;
|
||||
|
||||
CellProperty * cellProperty = ContainerInterface::getCell(*cellObject);
|
||||
|
||||
if (!cellProperty)
|
||||
return 0;
|
||||
|
||||
// This code is a little iffy - The position object we get contains a
|
||||
// vector and a cell ID, but when we create the object we use the vector
|
||||
// and a different cell ID. It's possible that we would need to transform
|
||||
// newPos from the
|
||||
|
||||
Vector newPos;
|
||||
NetworkId newCell;
|
||||
ScriptConversion::convert(pos, newPos, newCell);
|
||||
UNREF(newCell);
|
||||
|
||||
Transform tr;
|
||||
tr.setPosition_p(newPos);
|
||||
ServerObject *newObject = ServerWorld::createNewObject(templateName, tr, cellObject, false);
|
||||
if (newObject == NULL)
|
||||
return 0;
|
||||
|
||||
//@todo do we need to snap to floor or something?
|
||||
FloorLocator dropLoc;
|
||||
Floor const * floor = cellProperty->getFloor();
|
||||
|
||||
if (!floor)
|
||||
return 0;
|
||||
|
||||
bool foundLoc = floor->findClosestLocation(newPos,dropLoc);
|
||||
if(foundLoc)
|
||||
{
|
||||
newObject->setPosition_p(dropLoc.getPosition_p());
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_REPORT_LOG(true, ("Danger, could not find floor under location in createNewObjectInCell\n"));
|
||||
}
|
||||
|
||||
// create an networkId to return
|
||||
NetworkId netId = (newObject->getNetworkId());
|
||||
if (netId == NetworkId::cms_invalid)
|
||||
{
|
||||
delete newObject;
|
||||
return 0;
|
||||
}
|
||||
return netId.getValue();
|
||||
}
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCellAnywhere(JNIEnv *env, jobject self, jlong source, jlong building, jstring cellName)
|
||||
{
|
||||
//@todo need to find a way to get a good location in a cell. For now just use the coordinates of the cell?
|
||||
UNREF(self);
|
||||
NOT_NULL(env);
|
||||
|
||||
if (source == 0)
|
||||
return 0;
|
||||
if (building == 0)
|
||||
return 0;
|
||||
|
||||
std::string templateName;
|
||||
ServerObject* sourceObject = NULL;
|
||||
if (!JavaLibrary::getObject(source, sourceObject))
|
||||
return 0;
|
||||
templateName = sourceObject->getTemplateName();
|
||||
|
||||
return _createObjectInCellAnywhereInternal(env, self, templateName, building, cellName);
|
||||
}
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::createObjectInCellAnywhereString(JNIEnv *env, jobject self, jobject source, jlong building, jstring cellName)
|
||||
{
|
||||
//@todo need to find a way to get a good location in a cell. For now just use the coordinates of the cell?
|
||||
UNREF(self);
|
||||
NOT_NULL(env);
|
||||
|
||||
if (source == 0)
|
||||
return 0;
|
||||
if (building == 0)
|
||||
return 0;
|
||||
|
||||
std::string templateName;
|
||||
if (env->IsInstanceOf(source, JavaLibrary::getClsString()) == JNI_TRUE)
|
||||
{
|
||||
JavaStringParam localSource(static_cast<jstring>(source));
|
||||
JavaLibrary::convert(localSource, templateName);
|
||||
return _createObjectInCellAnywhereInternal(env, self, templateName, building, cellName);
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::_createObjectInCellAnywhereInternal(JNIEnv *env, jobject self, std::string & templateName, jlong building, jstring cellName)
|
||||
{
|
||||
//@todo need to find a way to get a good location in a cell. For now just use the coordinates of the cell?
|
||||
JavaStringParam localCellName(cellName);
|
||||
|
||||
ServerObject *portallizedObject = NULL;
|
||||
if (!JavaLibrary::getObject(building, portallizedObject))
|
||||
return 0;
|
||||
|
||||
std::string cellNameString;
|
||||
JavaLibrary::convert(localCellName, cellNameString);
|
||||
|
||||
PortalProperty* portalProp = portallizedObject->getPortalProperty();
|
||||
if (!portalProp)
|
||||
return 0;
|
||||
|
||||
CellProperty* cellProp = portalProp->getCell(cellNameString.c_str());
|
||||
if (!cellProp)
|
||||
return 0;
|
||||
|
||||
ServerObject* cellObject = cellProp->getOwner().asServerObject();
|
||||
if (!cellObject)
|
||||
return 0;
|
||||
|
||||
Vector createPosition;
|
||||
Floor const * floor = cellProp->getFloor();
|
||||
bool foundLoc = floor->getGoodLocation(0.5f,createPosition);
|
||||
if(!foundLoc)
|
||||
return 0;
|
||||
|
||||
Transform tr;
|
||||
tr.setPosition_p(createPosition);
|
||||
ServerObject *newObject = ServerWorld::createNewObject(templateName, tr, cellObject, false);
|
||||
if (newObject == NULL)
|
||||
return 0;
|
||||
|
||||
// create an networkId to return
|
||||
NetworkId netId = (newObject->getNetworkId());
|
||||
if (netId == NetworkId::cms_invalid)
|
||||
{
|
||||
delete newObject;
|
||||
return 0;
|
||||
}
|
||||
return netId.getValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jobjectArray JNICALL ScriptMethodsInteriorsNamespace::getCellNames(JNIEnv *env, jobject self, jlong target)
|
||||
{
|
||||
ServerObject const *portallizedObject = NULL;
|
||||
if (!JavaLibrary::getObject(target, portallizedObject))
|
||||
return 0;
|
||||
|
||||
PortalProperty const *cellProp = portallizedObject->getPortalProperty();
|
||||
if (!cellProp)
|
||||
return 0;
|
||||
|
||||
PortalProperty::CellNameList const &nameList = cellProp->getCellNames();
|
||||
if (nameList.empty())
|
||||
return 0;
|
||||
|
||||
LocalObjectArrayRefPtr nameArray;
|
||||
if (!ScriptConversion::convert(nameList, nameArray))
|
||||
return 0;
|
||||
|
||||
return nameArray->getReturnValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jstring JNICALL ScriptMethodsInteriorsNamespace::getCellName(JNIEnv *env, jobject self, jlong target)
|
||||
{
|
||||
CellObject const *cellObject = NULL;
|
||||
if (!JavaLibrary::getObject(target, cellObject))
|
||||
return 0;
|
||||
|
||||
// remember: cell object indexes start with 1, but the cell names are 0-based
|
||||
int cellIndex = cellObject->getCell();
|
||||
if (cellIndex <= 0)
|
||||
{
|
||||
// cell is uninitialized
|
||||
return 0;
|
||||
}
|
||||
|
||||
ServerObject const * const portallizedObject = safe_cast<ServerObject const *>(ContainerInterface::getContainedByObject(*cellObject));
|
||||
if (portallizedObject == NULL)
|
||||
return 0;
|
||||
|
||||
PortalProperty const * const cellProp = portallizedObject->getPortalProperty();
|
||||
if (!cellProp)
|
||||
return 0;
|
||||
|
||||
PortalProperty::CellNameList const &nameList = cellProp->getCellNames();
|
||||
if (nameList.empty())
|
||||
return 0;
|
||||
|
||||
if (static_cast<size_t>(cellIndex) > nameList.size())
|
||||
{
|
||||
WARNING(true, ("JavaLibrary::getCellName cell %s has a cell index of %d"
|
||||
"(base-1), when its owner building %s has only %u cells(base-0)",
|
||||
cellObject->getNetworkId().getValueString().c_str(), cellIndex,
|
||||
portallizedObject->getNetworkId().getValueString().c_str(), nameList.size()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
JavaString cellName(nameList[cellIndex-1]);
|
||||
return cellName.getReturnValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jlongArray JNICALL ScriptMethodsInteriorsNamespace::getCellIds(JNIEnv *env, jobject self, jlong target)
|
||||
{
|
||||
ServerObject const *portallizedObject = NULL;
|
||||
if (!JavaLibrary::getObject(target, portallizedObject))
|
||||
return 0;
|
||||
|
||||
PortalProperty const * const portalProp = portallizedObject->getPortalProperty();
|
||||
if (!portalProp)
|
||||
return 0;
|
||||
|
||||
PortalProperty::CellNameList const &nameList = portalProp->getCellNames();
|
||||
if (nameList.empty())
|
||||
return 0;
|
||||
|
||||
int count = nameList.size();
|
||||
std::vector<NetworkId> cellIds;
|
||||
cellIds.reserve(count);
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
ServerObject const * cellObject = NULL;
|
||||
CellProperty const * const cellProp = portalProp->getCell(nameList[i]);
|
||||
if (cellProp != NULL)
|
||||
cellObject = cellProp->getOwner().asServerObject();
|
||||
if (cellObject != NULL)
|
||||
{
|
||||
cellIds.push_back(cellObject->getNetworkId());
|
||||
}
|
||||
else
|
||||
cellIds.push_back(NetworkId::cms_invalid);
|
||||
}
|
||||
|
||||
LocalLongArrayRefPtr idArray;
|
||||
if (!ScriptConversion::convert(cellIds, idArray))
|
||||
return 0;
|
||||
|
||||
return idArray->getReturnValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jboolean JNICALL ScriptMethodsInteriorsNamespace::hasCell(JNIEnv *env, jobject self, jlong portallizedObject, jstring cellName)
|
||||
{
|
||||
JavaStringParam localCellName(cellName);
|
||||
|
||||
ServerObject const * serverObject = NULL;
|
||||
if (!JavaLibrary::getObject(portallizedObject, serverObject))
|
||||
{
|
||||
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::hasCell passed invalid object"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
PortalProperty const * const portalProp = serverObject->getPortalProperty();
|
||||
if (!portalProp)
|
||||
{
|
||||
DEBUG_WARNING(true, ("JavaLibrary::hasCell server object %s has no portal property", serverObject->getDebugInformation().c_str()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string cellNameString;
|
||||
if (!JavaLibrary::convert(localCellName, cellNameString))
|
||||
{
|
||||
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::hasCell error converting cell name to C string"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool found = false;
|
||||
|
||||
CellProperty const * const cellProp = portalProp->getCell(cellNameString.c_str());
|
||||
if (cellProp && cellProp->getOwner().asServerObject())
|
||||
found = true;
|
||||
|
||||
return static_cast<jboolean>(found);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::getCellId(JNIEnv *env, jobject self, jlong portallizedObject, jstring cellName)
|
||||
{
|
||||
JavaStringParam localCellName(cellName);
|
||||
|
||||
ServerObject const * serverObject = NULL;
|
||||
if (!JavaLibrary::getObject(portallizedObject, serverObject))
|
||||
{
|
||||
JAVA_THROW_SCRIPT_EXCEPTION(true, ("[script bug] JavaLibrary::getCellId passed invalid object"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
PortalProperty const * const portalProp = serverObject->getPortalProperty();
|
||||
if (!portalProp)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[script bug] JavaLibrary::getCellId server object %s has no portal property", serverObject->getDebugInformation().c_str()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string cellNameString;
|
||||
if (!JavaLibrary::convert(localCellName, cellNameString))
|
||||
{
|
||||
DEBUG_WARNING(true, ("[programmer bug] JavaLibrary::getCellId error converting cell name to C string"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
CellProperty const * const cellProp = portalProp->getCell(cellNameString.c_str());
|
||||
if (!cellProp)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[script bug] JavaLibrary::getCellId passed bad cell name %s for portallized object %s", cellNameString.c_str(), serverObject->getDebugInformation().c_str()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
ServerObject const * const cellObject = cellProp->getOwner().asServerObject();
|
||||
if (!cellObject)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[programmer bug] JavaLibrary::getCellId error getting cell object from cell property"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (cellObject->getNetworkId()).getValue();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
jobject JNICALL ScriptMethodsInteriorsNamespace::getLocationForWorldCoordinate(JNIEnv *env, jobject self, jfloat x, jfloat y, jfloat z)
|
||||
{
|
||||
UNREF(self);
|
||||
NOT_NULL(env);
|
||||
|
||||
Vector position_w(x, y, z);
|
||||
|
||||
LocalRefPtr location;
|
||||
Vector position_l(position_w);
|
||||
NetworkId cellId;
|
||||
|
||||
CellProperty const * cellProperty = ServerWorld::findCellAtLocation(position_w);
|
||||
if (cellProperty)
|
||||
{
|
||||
Object const & cellObject = cellProperty->getOwner();
|
||||
|
||||
position_l = cellObject.rotateTranslate_w2o(position_w);
|
||||
cellId = cellObject.getNetworkId();
|
||||
|
||||
if (!ScriptConversion::convert(position_l, ServerWorld::getSceneId(), cellId, location))
|
||||
{
|
||||
DEBUG_WARNING(true, ("getLocationForWorldCoordinate failed creating location object"));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return location->getReturnValue();
|
||||
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
jobject JNICALL ScriptMethodsInteriorsNamespace::getGoodLocationInterior(JNIEnv *env, jobject self, jlong building, jstring cellName)
|
||||
{
|
||||
UNREF(self);
|
||||
NOT_NULL(env);
|
||||
|
||||
JavaStringParam localCellName(cellName);
|
||||
|
||||
if (building == 0)
|
||||
return 0;
|
||||
|
||||
ServerObject const *portallizedObject = 0;
|
||||
if (!JavaLibrary::getObject(building, portallizedObject))
|
||||
return 0;
|
||||
|
||||
std::string cellNameString;
|
||||
JavaLibrary::convert(localCellName, cellNameString);
|
||||
|
||||
PortalProperty const *portalProp = portallizedObject->getPortalProperty();
|
||||
if (!portalProp)
|
||||
return 0;
|
||||
|
||||
CellProperty const *cellProp = portalProp->getCell(cellNameString.c_str());
|
||||
if (!cellProp)
|
||||
return 0;
|
||||
|
||||
ServerObject const *cellObject = cellProp->getOwner().asServerObject();
|
||||
if (!cellObject)
|
||||
return 0;
|
||||
|
||||
Vector location;
|
||||
Floor const *floor = cellProp->getFloor();
|
||||
bool foundLoc = floor->getGoodLocation(0.5f,location);
|
||||
if (!foundLoc)
|
||||
return 0;
|
||||
|
||||
LocalRefPtr goodLocation;
|
||||
if (!ScriptConversion::convert(location, cellObject->getSceneId(), cellObject->getNetworkId(), goodLocation))
|
||||
return 0;
|
||||
|
||||
return goodLocation->getReturnValue();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
jobject JNICALL ScriptMethodsInteriorsNamespace::getBuildingEjectLocation(JNIEnv *env, jobject self, jlong building)
|
||||
{
|
||||
UNREF(self);
|
||||
NOT_NULL(env);
|
||||
|
||||
if (building == 0)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] getBuildingEjectLocation was passed a NULL building objid"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
ServerObject const *portallizedObject = 0;
|
||||
if (!JavaLibrary::getObject(building, portallizedObject))
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] getBuildingEjectLocation was passed a non-ServerObject objid"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
PortalProperty const *portalProp = portallizedObject->getPortalProperty();
|
||||
if (!portalProp)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] getBuildingEjectLocation was passed an objid (%s) of an object that has no PortalProperty", portallizedObject->getDebugInformation().c_str()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
PortalPropertyTemplate const &ppTemplate = portalProp->getPortalPropertyTemplate();
|
||||
|
||||
Transform ejectionTransform(Transform::IF_none);
|
||||
ejectionTransform.multiply(portallizedObject->getTransform_o2w(), ppTemplate.getEjectionLocationTransform());
|
||||
|
||||
Vector ejectionWorldPos = ejectionTransform.getPosition_p();
|
||||
|
||||
CellProperty const *worldCell = CellProperty::getWorldCellProperty();
|
||||
if (!worldCell)
|
||||
{
|
||||
DEBUG_WARNING(true, ("getBuildingEjectLocation get a NULL worldCell back from CellProperty::getWorldCellProperty()"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
NetworkId const &worldCellId = worldCell->getOwner().getNetworkId();
|
||||
|
||||
LocalRefPtr goodLocation;
|
||||
if (!ScriptConversion::convert(ejectionWorldPos, portallizedObject->getSceneId(), worldCellId, goodLocation))
|
||||
return 0;
|
||||
|
||||
return goodLocation->getReturnValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jboolean JNICALL ScriptMethodsInteriorsNamespace::isValidInteriorLocation (JNIEnv * /*env*/, jobject /*self*/, jobject jobject_location)
|
||||
{
|
||||
NetworkId cellNetworkId;
|
||||
Vector position_p;
|
||||
if (!ScriptConversion::convert (jobject_location, position_p, cellNetworkId))
|
||||
{
|
||||
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB failed to convert parameter 1 (location) to cellNetworkId and position_w"));
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
Object const * const object = NetworkIdManager::getObjectById (cellNetworkId);
|
||||
if (!object)
|
||||
{
|
||||
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB could not find cell with object id=%s", cellNetworkId.getValueString ().c_str ()));
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
CellObject const * const cellObject = dynamic_cast<CellObject const *> (object);
|
||||
if (!cellObject)
|
||||
{
|
||||
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB object id=%s is not a cell", cellNetworkId.getValueString ().c_str ()));
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
CellProperty const * const cellProperty = cellObject->getCellProperty ();
|
||||
if (!cellProperty)
|
||||
{
|
||||
DEBUG_WARNING (true, ("isValidInteriorLocation (): PB could not find cellProperty for cell id=%s name=%s", cellNetworkId.getValueString ().c_str (), cellProperty->getCellName ()));
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
Floor const * const floor = cellProperty->getFloor ();
|
||||
if (!floor)
|
||||
{
|
||||
DEBUG_WARNING (true, ("isValidInteriorLocation (): DB could not find floor for cell id=%s name=%s", cellNetworkId.getValueString ().c_str (), cellProperty->getCellName ()));
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
FloorLocator result;
|
||||
Vector const direction_p = Vector::negativeUnitY;
|
||||
Ray3d ray_p (position_p + Vector::unitY, direction_p);
|
||||
if (floor->intersectClosest (ray_p, result))
|
||||
return JNI_TRUE;
|
||||
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::moveHouseItemToPlayer(JNIEnv * /*env*/, jobject /*self*/, jlong building, jlong player, int index)
|
||||
{
|
||||
if (building == 0)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer was passed a NULL building objid"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
TangibleObject *pob = 0;
|
||||
if (!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer was passed a non-tangible-pob building objid"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
CreatureObject *creatureObject = 0;
|
||||
if (!JavaLibrary::getObject(player, creatureObject))
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer was passed a non-CreatureObject player"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pob->movePobItemToPlayer(*creatureObject, index, false).getValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jlong JNICALL ScriptMethodsInteriorsNamespace::moveHouseItemToPlayer2(JNIEnv * /*env*/, jobject /*self*/, jlong building, jlong player, jlong item)
|
||||
{
|
||||
if (building == 0)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer2 was passed a NULL building objid"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
TangibleObject *pob = 0;
|
||||
if (!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer2 was passed a non-tangible-pob building objid"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
CreatureObject *creatureObject = 0;
|
||||
if (!JavaLibrary::getObject(player, creatureObject))
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] moveHouseItemToPlayer2 was passed a non-CreatureObject player"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pob->movePobItemToPlayer(*creatureObject, NetworkId(static_cast<NetworkId::NetworkIdType>(item)), false).getValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
void JNICALL ScriptMethodsInteriorsNamespace::deleteAllHouseItems(JNIEnv * /*env*/, jobject /*self*/, jlong building, jlong player)
|
||||
|
||||
{
|
||||
if (building == 0)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] deleteAllHouseItems was passed a NULL building objid"));
|
||||
return ;
|
||||
}
|
||||
|
||||
TangibleObject *pob = 0;
|
||||
if (!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] deleteAllHouseItems was passed a non-tangible-pob building objid"));
|
||||
return;
|
||||
}
|
||||
|
||||
CreatureObject const *creatureObject = 0;
|
||||
if (!JavaLibrary::getObject(player, creatureObject))
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] deleteAllHouseItems was passed a non-CreatereObject player"));
|
||||
return;
|
||||
}
|
||||
pob->deletePobPersistedContents(creatureObject, DeleteReasons::Player);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jboolean JNICALL ScriptMethodsInteriorsNamespace::areAllContentsLoaded(JNIEnv * /*env*/, jobject /*self*/, jlong building)
|
||||
{
|
||||
if (building == 0)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] areAllContentsLoaded was passed a NULL building objid"));
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
const BuildingObject * buildingObject = NULL;
|
||||
if (!JavaLibrary::getObject(building, buildingObject))
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] areAllContentsLoaded was passed a non-ServerObject objid"));
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
return static_cast<jboolean>(buildingObject->getContentsLoaded() ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
void JNICALL ScriptMethodsInteriorsNamespace::loadBuildingContents(JNIEnv * /*env*/, jobject /*self*/, jlong player, jlong building)
|
||||
{
|
||||
if (building == 0)
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] loadBuildingContents was passed a NULL building objid"));
|
||||
return;
|
||||
}
|
||||
|
||||
BuildingObject * buildingObject = NULL;
|
||||
if (!JavaLibrary::getObject(building, buildingObject))
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] loadBuildingContents was passed a non-ServerObject objid"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (GameServer::isAtPendingLoadRequestLimit())
|
||||
{
|
||||
WARNING(true, ("loadBuildingContents attempted to load building contents while at the request limit"));
|
||||
return;
|
||||
}
|
||||
|
||||
GameServer::addPendingLoadRequest(buildingObject->getNetworkId());
|
||||
|
||||
// Check for loading objvar first
|
||||
buildingObject->loadContents();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jint JNICALL ScriptMethodsInteriorsNamespace::getPobBaseItemLimit(JNIEnv * /*env*/, jobject /*self*/, jlong building)
|
||||
{
|
||||
TangibleObject *pob = 0;
|
||||
if(!JavaLibrary::getObject(building, pob) || !pob->getPortalProperty())
|
||||
{
|
||||
DEBUG_WARNING(true, ("[designer bug] getPobBaseItemLimit() was passed a non-tangible-pob building objid"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pob->getPobBaseItemLimit();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jboolean JNICALL ScriptMethodsInteriorsNamespace::isAtPendingLoadRequestLimit(JNIEnv * /*env*/, jobject /*self*/)
|
||||
{
|
||||
return GameServer::isAtPendingLoadRequestLimit();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jstring JNICALL ScriptMethodsInteriorsNamespace::getCellLabel(JNIEnv * env, jobject self, jlong target)
|
||||
{
|
||||
CellObject const *cellObject = NULL;
|
||||
if (!JavaLibrary::getObject(target, cellObject))
|
||||
return NULL;
|
||||
|
||||
JavaString cellLabel(cellObject->getCellLabel());
|
||||
return cellLabel.getReturnValue();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jboolean JNICALL ScriptMethodsInteriorsNamespace::setCellLabel(JNIEnv * env, jobject self, jlong target, jstring cellLabel)
|
||||
{
|
||||
JavaStringParam localCellLabel(cellLabel);
|
||||
|
||||
Unicode::String cellLabelString;
|
||||
if (!JavaLibrary::convert(localCellLabel, cellLabelString))
|
||||
return JNI_FALSE;
|
||||
|
||||
CellObject * cellObject = NULL;
|
||||
if (!JavaLibrary::getObject(target, cellObject))
|
||||
return JNI_FALSE;
|
||||
|
||||
cellObject->setCellLabel(cellLabelString);
|
||||
|
||||
return JNI_TRUE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
jboolean JNICALL ScriptMethodsInteriorsNamespace::setCellLabelOffset(JNIEnv * env, jobject self, jlong target, jfloat x, jfloat y, jfloat z)
|
||||
{
|
||||
CellObject * cellObject = NULL;
|
||||
if (!JavaLibrary::getObject(target, cellObject))
|
||||
return JNI_FALSE;
|
||||
|
||||
Vector offset(x, y, z);
|
||||
|
||||
cellObject->setLabelLocationOffset(offset);
|
||||
|
||||
return JNI_TRUE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user