mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-07-31 01:15:48 -04:00
442 lines
16 KiB
C++
Executable File
442 lines
16 KiB
C++
Executable File
// ScriptMethodsWaypoint.cpp
|
|
// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved.
|
|
// Author: Justin Randall
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
#include "serverScript/FirstServerScript.h"
|
|
#include "serverScript/JavaLibrary.h"
|
|
|
|
#include "serverGame/CreatureObject.h"
|
|
#include "serverGame/MissionObject.h"
|
|
#include "serverGame/ObjectIdManager.h"
|
|
#include "serverGame/PlayerCreatureController.h"
|
|
#include "serverGame/PlayerObject.h"
|
|
#include "serverGame/Region.h"
|
|
#include "serverGame/RegionMaster.h"
|
|
#include "serverGame/ServerWorld.h"
|
|
#include "sharedFoundation/TemporaryCrcString.h"
|
|
#include "sharedGame/Waypoint.h"
|
|
#include "sharedMathArchive/VectorArchive.h"
|
|
|
|
|
|
namespace ScriptMethodsWaypointNamespace
|
|
{
|
|
NetworkId getWaypointCellIdFromTemplateNameAndCelllName(jstring const & buildingTemplate, jstring const & cellName)
|
|
{
|
|
JavaStringParam jbt(buildingTemplate);
|
|
Unicode::String jbtn;
|
|
if (!JavaLibrary::convert(jbt, jbtn))
|
|
{
|
|
DEBUG_WARNING(true, ("JavaLibrary::createWaypointInMissionInternal(): failed to buildingTemplate to a string"));
|
|
}
|
|
TemporaryCrcString crcBuilding(Unicode::wideToNarrow(jbtn).c_str(), true);
|
|
uint64 buildingValue(crcBuilding.getCrc());
|
|
buildingValue <<= static_cast<uint64>(32);
|
|
|
|
JavaStringParam jcn(cellName);
|
|
Unicode::String jcnb;
|
|
if (!JavaLibrary::convert(jcn, jcnb))
|
|
{
|
|
DEBUG_WARNING(true, ("JavaLibrary::createWaypointInMissionInternal(): failed to cellName to a string"));
|
|
}
|
|
TemporaryCrcString crcCell(Unicode::wideToNarrow(jcnb).c_str(), true);
|
|
uint64 cellValue(crcCell.getCrc());
|
|
|
|
// rls - since the cell id is not used in the waypoint system,
|
|
// we will combine the building and cell name crcs into the cell id.
|
|
NetworkId const staticCellId(static_cast<NetworkId::NetworkIdType>(buildingValue | cellValue));
|
|
|
|
return staticCellId;
|
|
}
|
|
|
|
bool install();
|
|
|
|
jlong JNICALL createWaypointInDatapadFromLocation (JNIEnv * env, jobject self, jlong target, jobject loc);
|
|
jlong JNICALL createWaypointInMissionObjectFromLocation (JNIEnv * env, jobject self, jlong target, jobject loc);
|
|
jlong JNICALL createWaypointInDatapadFromObject (JNIEnv * env, jobject self, jlong target, jlong obj);
|
|
jlong JNICALL createWaypointInMissionObjectFromObject (JNIEnv * env, jobject self, jlong target, jlong obj);
|
|
jlong JNICALL createWaypointInDatapadWithLimitsFromLocation (JNIEnv * env, jobject self, jlong target, jobject obj);
|
|
jlong JNICALL createWaypointInMissionInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName);
|
|
jlong JNICALL createWaypointInDatapadInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName);
|
|
void JNICALL destroyWaypointInDatapad (JNIEnv * env, jobject self, jlong waypoint, jlong player);
|
|
jboolean JNICALL getWaypointActive (JNIEnv * env, jobject self, jlong waypoint);
|
|
jobject JNICALL getWaypointLocation (JNIEnv * env, jobject self, jlong waypoint);
|
|
jstring JNICALL getWaypointName (JNIEnv *, jobject, jlong waypoint);
|
|
jlongArray JNICALL getWaypointsInDatapad (JNIEnv *, jobject, jlong player);
|
|
jobject JNICALL getWaypointRegion (JNIEnv * env, jobject self, jlong waypoint);
|
|
void JNICALL setWaypointActive (JNIEnv * env, jobject self, jlong waypoint, jboolean isActive);
|
|
void JNICALL setWaypointName (JNIEnv * env, jobject, jlong waypoint, jstring name);
|
|
void JNICALL setWaypointLocation (JNIEnv * env, jobject self, jlong waypoint, jobject loc);
|
|
jboolean JNICALL setWaypointColor (JNIEnv * env, jobject self, jlong waypoint, jstring jscolor);
|
|
}
|
|
|
|
using namespace JNIWrappersNamespace;
|
|
using namespace ScriptMethodsWaypointNamespace;
|
|
|
|
|
|
//========================================================================
|
|
// install
|
|
//========================================================================
|
|
|
|
bool ScriptMethodsWaypointNamespace::install()
|
|
{
|
|
const JNINativeMethod NATIVES[] = {
|
|
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsWaypointNamespace::c)}
|
|
JF("_createWaypointInDatapad", "(JLscript/location;)J", createWaypointInDatapadFromLocation),
|
|
JF("_createWaypointInMissionObject", "(JLscript/location;)J", createWaypointInMissionObjectFromLocation),
|
|
JF("_createWaypointInDatapad", "(JJ)J", createWaypointInDatapadFromObject),
|
|
JF("_createWaypointInMissionObject", "(JJ)J", createWaypointInMissionObjectFromObject),
|
|
JF("_createWaypointInDatapadWithLimits", "(JLscript/location;)J", createWaypointInDatapadWithLimitsFromLocation),
|
|
JF("_createWaypointInMissionInternal", "(JLscript/location;Ljava/lang/String;Ljava/lang/String;)J", createWaypointInMissionInternal),
|
|
JF("_createWaypointInDatapadInternal", "(JLscript/location;Ljava/lang/String;Ljava/lang/String;)J", createWaypointInDatapadInternal),
|
|
JF("_destroyWaypointInDatapad", "(JJ)V", destroyWaypointInDatapad),
|
|
JF("_getWaypointActive", "(J)Z", getWaypointActive),
|
|
JF("_getWaypointsInDatapad", "(J)[J", getWaypointsInDatapad),
|
|
JF("_getWaypointLocation", "(J)Lscript/location;", getWaypointLocation),
|
|
JF("_getWaypointName", "(J)Ljava/lang/String;", getWaypointName),
|
|
JF("_getWaypointRegion", "(J)Lscript/region;", getWaypointRegion),
|
|
JF("_setWaypointName", "(JLjava/lang/String;)V", setWaypointName),
|
|
JF("__setWaypointActiveNative", "(JZ)V", setWaypointActive),
|
|
JF("__setWaypointLocationNative", "(JLscript/location;)V", setWaypointLocation),
|
|
JF("__setWaypointColorNative", "(JLjava/lang/String;)Z", setWaypointColor),
|
|
};
|
|
|
|
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadFromLocation(JNIEnv * env, jobject self, jlong target, jobject jLoc)
|
|
{
|
|
CreatureObject *targetCreature = 0;
|
|
Location location;
|
|
if (env && target && jLoc && JavaLibrary::getObject(target, targetCreature) && ScriptConversion::convert(LocalRefParam(jLoc), location))
|
|
{
|
|
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
|
|
if(player)
|
|
{
|
|
Waypoint waypoint(player->createWaypoint(location, true));
|
|
return (waypoint.getNetworkId()).getValue();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadWithLimitsFromLocation(JNIEnv * env, jobject self, jlong target, jobject jLoc)
|
|
{
|
|
CreatureObject *targetCreature = 0;
|
|
Location location;
|
|
if (env && target && jLoc && JavaLibrary::getObject(target, targetCreature) && ScriptConversion::convert(LocalRefParam(jLoc), location))
|
|
{
|
|
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
|
|
if(player)
|
|
{
|
|
Waypoint waypoint(player->createWaypoint(location, false));
|
|
if (waypoint.isValid())
|
|
return (waypoint.getNetworkId()).getValue();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInMissionObjectFromLocation(JNIEnv * env, jobject self, jlong target, jobject jLoc)
|
|
{
|
|
MissionObject *targetMissionObj = 0;
|
|
Location location;
|
|
if (env && target && jLoc && JavaLibrary::getObject(target, targetMissionObj) && ScriptConversion::convert(LocalRefParam(jLoc), location))
|
|
{
|
|
Waypoint w = targetMissionObj->getWaypoint();
|
|
w.setLocation(location);
|
|
targetMissionObj->setWaypoint(w);
|
|
return (w.getNetworkId()).getValue();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadFromObject(JNIEnv * env, jobject self, jlong target, jlong obj)
|
|
{
|
|
CreatureObject *targetCreature = 0;
|
|
ServerObject *s = 0;
|
|
if (env && target && obj && JavaLibrary::getObject(target, targetCreature) && JavaLibrary::getObject(obj, s))
|
|
{
|
|
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
|
|
if(player)
|
|
{
|
|
Waypoint w(player->createWaypoint(Location(s->getPosition_w(), NetworkId::cms_invalid, Location::getCrcBySceneName(ServerWorld::getSceneId())), true));
|
|
w.setName(s->getAssignedObjectName());
|
|
return (w.getNetworkId()).getValue();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInMissionObjectFromObject(JNIEnv * env, jobject self, jlong target, jlong obj)
|
|
{
|
|
MissionObject *targetMissionObj = 0;
|
|
ServerObject *s = 0;
|
|
if (env && target && obj && JavaLibrary::getObject(target, targetMissionObj) && JavaLibrary::getObject(obj, s))
|
|
{
|
|
Waypoint w = targetMissionObj->getWaypoint();
|
|
w.setLocation(Location(s->getPosition_w(), NetworkId::cms_invalid, Location::getCrcBySceneName(ServerWorld::getSceneId())));
|
|
w.setName(s->getAssignedObjectName());
|
|
targetMissionObj->setWaypoint(w);
|
|
return (w.getNetworkId()).getValue();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInMissionInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName)
|
|
{
|
|
MissionObject *targetMissionObj = 0;
|
|
Location location;
|
|
if (env && target && jLoc && JavaLibrary::getObject(target, targetMissionObj) && ScriptConversion::convert(LocalRefParam(jLoc), location))
|
|
{
|
|
Waypoint w = targetMissionObj->getWaypoint();
|
|
|
|
NetworkId const & staticCellId = getWaypointCellIdFromTemplateNameAndCelllName(buildingTemplate, cellName);
|
|
location.setCell(staticCellId);
|
|
|
|
w.setLocation(location);
|
|
targetMissionObj->setWaypoint(w);
|
|
return (w.getNetworkId()).getValue();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlong JNICALL ScriptMethodsWaypointNamespace::createWaypointInDatapadInternal(JNIEnv * env, jobject self, jlong target, jobject jLoc, jstring buildingTemplate, jstring cellName)
|
|
{
|
|
CreatureObject *targetCreature = 0;
|
|
Location location;
|
|
if (env && target && jLoc && JavaLibrary::getObject(target, targetCreature) && ScriptConversion::convert(LocalRefParam(jLoc), location))
|
|
{
|
|
PlayerObject * player = PlayerCreatureController::getPlayerObject(targetCreature);
|
|
if(player)
|
|
{
|
|
NetworkId const & staticCellId = getWaypointCellIdFromTemplateNameAndCelllName(buildingTemplate, cellName);
|
|
location.setCell(staticCellId);
|
|
|
|
Waypoint waypoint(player->createWaypoint(location, true));
|
|
if (waypoint.isValid())
|
|
return (waypoint.getNetworkId()).getValue();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsWaypointNamespace::destroyWaypointInDatapad(JNIEnv *, jobject, jlong waypoint, jlong player)
|
|
{
|
|
CreatureObject * targetCreature = 0;
|
|
if (JavaLibrary::getObject(player, targetCreature))
|
|
{
|
|
PlayerObject * p = PlayerCreatureController::getPlayerObject(targetCreature);
|
|
if(p)
|
|
{
|
|
if(waypoint)
|
|
{
|
|
NetworkId id(waypoint);
|
|
p->destroyWaypoint(id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jboolean JNICALL ScriptMethodsWaypointNamespace::getWaypointActive(JNIEnv * env, jobject self, jlong waypoint)
|
|
{
|
|
jboolean result = JNI_FALSE;
|
|
if(env)
|
|
{
|
|
if(waypoint)
|
|
{
|
|
NetworkId id(waypoint);
|
|
const Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
result = w.isActive();
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jobject JNICALL ScriptMethodsWaypointNamespace::getWaypointLocation(JNIEnv * env, jobject self, jlong waypoint)
|
|
{
|
|
if(waypoint)
|
|
{
|
|
NetworkId id(waypoint);
|
|
const Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
LocalRefPtr result;
|
|
if (ScriptConversion::convert(w.getLocation(), result))
|
|
return result->getReturnValue();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jobject JNICALL ScriptMethodsWaypointNamespace::getWaypointRegion(JNIEnv * env, jobject self, jlong waypoint)
|
|
{
|
|
if (waypoint != 0)
|
|
{
|
|
NetworkId id(waypoint);
|
|
const Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
const Region * region = RegionMaster::getSmallestVisibleRegionAtPoint(w.getLocation().getSceneId(), w.getLocation().getCoordinates().x, w.getLocation().getCoordinates().z);
|
|
if (region != nullptr)
|
|
{
|
|
LocalRefPtr result;
|
|
if (ScriptConversion::convert(*region, result))
|
|
return result->getReturnValue();
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlongArray JNICALL ScriptMethodsWaypointNamespace::getWaypointsInDatapad(JNIEnv *, jobject, jlong player)
|
|
{
|
|
CreatureObject * creature = 0;
|
|
if (JavaLibrary::getObject(player, creature))
|
|
{
|
|
PlayerObject * player = PlayerCreatureController::getPlayerObject(creature);
|
|
if (player)
|
|
{
|
|
std::vector<NetworkId> waypoints;
|
|
player->getWaypointsInDatapad(waypoints);
|
|
LocalLongArrayRefPtr result;
|
|
if (ScriptConversion::convert(waypoints, result))
|
|
return result->getReturnValue();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jstring JNICALL ScriptMethodsWaypointNamespace::getWaypointName(JNIEnv *, jobject, jlong waypoint)
|
|
{
|
|
jstring result = 0;
|
|
if(waypoint)
|
|
{
|
|
NetworkId id(waypoint);
|
|
const Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
result = JavaString(w.getName()).getReturnValue();
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsWaypointNamespace::setWaypointActive(JNIEnv * env, jobject self, jlong waypoint, jboolean isActive)
|
|
{
|
|
if(env)
|
|
{
|
|
if(waypoint)
|
|
{
|
|
NetworkId id(waypoint);
|
|
Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
w.setActive(isActive == JNI_TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsWaypointNamespace::setWaypointLocation(JNIEnv * env, jobject self, jlong waypoint, jobject jLoc)
|
|
{
|
|
if(env)
|
|
{
|
|
if(waypoint)
|
|
{
|
|
if(jLoc)
|
|
{
|
|
NetworkId id(waypoint);
|
|
Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
Location location;
|
|
if(ScriptConversion::convert(LocalRefParam(jLoc), location))
|
|
{
|
|
w.setLocation(location);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsWaypointNamespace::setWaypointName(JNIEnv *, jobject, jlong waypoint, jstring name)
|
|
{
|
|
JavaStringParam localName(name);
|
|
|
|
NetworkId id(waypoint);
|
|
Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
Unicode::String n;
|
|
if (!JavaLibrary::convert (localName, n))
|
|
{
|
|
DEBUG_WARNING (true, ("setWaypointColor (): failed to convert name to string"));
|
|
}
|
|
else
|
|
{
|
|
w.setName(n);
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jboolean JNICALL ScriptMethodsWaypointNamespace::setWaypointColor(JNIEnv * env, jobject self, jlong waypoint, jstring jscolor)
|
|
{
|
|
JavaStringParam localColor(jscolor);
|
|
|
|
NetworkId id(waypoint);
|
|
Waypoint w = Waypoint::getWaypointById(id);
|
|
if(w.isValid())
|
|
{
|
|
std::string color;
|
|
if (!JavaLibrary::convert (localColor, color))
|
|
{
|
|
DEBUG_WARNING (true, ("setWaypointColor (): failed to convert color to string"));
|
|
return JNI_FALSE;
|
|
}
|
|
w.setColor(Waypoint::getColorIdByName(color));
|
|
}
|
|
return JNI_TRUE;
|
|
}
|