mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-07-15 00:08:07 -04:00
383 lines
13 KiB
C++
Executable File
383 lines
13 KiB
C++
Executable File
//========================================================================
|
|
//
|
|
// ScriptMethodsMap.cpp - implements script methods dealing with bank
|
|
//
|
|
// copyright 2001 Sony Online Entertainment
|
|
//
|
|
//========================================================================
|
|
|
|
#include "serverScript/FirstServerScript.h"
|
|
#include "serverScript/JavaLibrary.h"
|
|
|
|
#include "serverGame/PlanetMapManagerServer.h"
|
|
#include "serverGame/ServerObject.h"
|
|
#include "sharedGame/PlanetMapManager.h"
|
|
#include "sharedNetworkMessages/MapLocation.h"
|
|
#include "UnicodeUtils.h"
|
|
#include <vector>
|
|
|
|
using namespace JNIWrappersNamespace;
|
|
|
|
|
|
// ======================================================================
|
|
// ScriptMethodsMapNamespace
|
|
// ======================================================================
|
|
|
|
namespace ScriptMethodsMapNamespace
|
|
{
|
|
bool install();
|
|
|
|
bool JNICALL addPlanetaryMapLocation (JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring category, jstring subCategory, jint mapLocationType, jbyte flags);
|
|
bool JNICALL addPlanetaryMapLocationIgnoreLocationCountLimits(JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring category, jstring subCategory, jint mapLocationType, jbyte flags);
|
|
bool JNICALL removePlanetaryMapLocation (JNIEnv *env, jobject script, jlong locationId);
|
|
jobjectArray JNICALL getPlanetaryMapLocations (JNIEnv *env, jobject script, jstring category, jstring subCategory);
|
|
jobjectArray JNICALL getPlanetaryMapCategories (JNIEnv *env, jobject script, jstring category);
|
|
jobject JNICALL getPlanetaryMapLocation (JNIEnv *env, jobject script, jlong locationId);
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
// install
|
|
//========================================================================
|
|
|
|
bool ScriptMethodsMapNamespace::install()
|
|
{
|
|
const JNINativeMethod NATIVES[] = {
|
|
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsMapNamespace::c)}
|
|
JF("_addPlanetaryMapLocation", "(JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;IB)Z",addPlanetaryMapLocation),
|
|
JF("_addPlanetaryMapLocationIgnoreLocationCountLimits", "(JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;IB)Z",addPlanetaryMapLocationIgnoreLocationCountLimits),
|
|
JF("_removePlanetaryMapLocation", "(J)Z", removePlanetaryMapLocation),
|
|
JF("getPlanetaryMapLocations", "(Ljava/lang/String;Ljava/lang/String;)[Lscript/map_location;", getPlanetaryMapLocations),
|
|
JF("getPlanetaryMapCategories", "(Ljava/lang/String;)[Ljava/lang/String;", getPlanetaryMapCategories),
|
|
JF("_getPlanetaryMapLocation", "(J)Lscript/map_location;", getPlanetaryMapLocation),
|
|
};
|
|
|
|
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
bool JNICALL ScriptMethodsMapNamespace::addPlanetaryMapLocation(
|
|
JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring jCategoryName, jstring jSubCategoryName, jint mapLocationType, jbyte flags)
|
|
{
|
|
|
|
if (mapLocationType < 0 || mapLocationType >= PlanetMapManager::MLT_numTypes)
|
|
{
|
|
WARNING(true, ("[script bug] invalid mapLocationType [%d] passed to addPlanetaryMapLocation", mapLocationType));
|
|
return false;
|
|
}
|
|
|
|
NetworkId id(locationId);
|
|
if (id == NetworkId::cms_invalid)
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to addPlanetaryMapLocation"));
|
|
return false;
|
|
}
|
|
|
|
JavaStringParam localLocationName(locationName);
|
|
Unicode::String wideLocationName;
|
|
if(!JavaLibrary::convert(localLocationName, wideLocationName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid locationName passed to addPlanetaryMapLocation"));
|
|
return false;
|
|
}
|
|
|
|
if (wideLocationName.empty ())
|
|
{
|
|
DEBUG_WARNING (true, ("[script bug] empty locationName passed to addPlanetaryMapLocation"));
|
|
return false;
|
|
}
|
|
|
|
JavaStringParam localCategory(jCategoryName);
|
|
std::string categoryName;
|
|
if(!JavaLibrary::convert(localCategory, categoryName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid category passed to addPlanetaryMapLocation"));
|
|
return false;
|
|
}
|
|
|
|
std::string subCategoryName;
|
|
if (jSubCategoryName)
|
|
{
|
|
JavaStringParam localSubCategory(jSubCategoryName);
|
|
if(!JavaLibrary::convert(localSubCategory, subCategoryName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid SubCategory passed to addPlanetaryMapLocation"));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
const uint8 category = PlanetMapManager::findCategory (categoryName);
|
|
if (!category)
|
|
{
|
|
WARNING(true, ("[script bug] invalid category [%s] passed to addPlanetaryMapLocation", categoryName.c_str ()));
|
|
return false;
|
|
|
|
}
|
|
|
|
const uint8 subCategory = PlanetMapManager::findCategory (subCategoryName);
|
|
|
|
if (!subCategory && !subCategoryName.empty ())
|
|
{
|
|
WARNING(true, ("[script bug] invalid subcategory [%s] passed to addPlanetaryMapLocation", categoryName.c_str ()));
|
|
return false;
|
|
}
|
|
|
|
const Vector2d v2d (static_cast<float>(xLoc), static_cast<float>(yLoc));
|
|
|
|
bool result = false;
|
|
const MapLocation loc = PlanetMapManager::makeMapLocation (id, wideLocationName, v2d, categoryName, subCategoryName, flags, result);
|
|
|
|
if (!result)
|
|
{
|
|
WARNING(true, ("[script bug] invalid location passed to addPlanetaryMapLocation"));
|
|
return false;
|
|
}
|
|
|
|
PlanetMapManagerServer::addMapLocation (loc, mapLocationType, true);
|
|
return true;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
bool JNICALL ScriptMethodsMapNamespace::addPlanetaryMapLocationIgnoreLocationCountLimits(
|
|
JNIEnv *env, jobject script, jlong locationId, jstring locationName, jint xLoc, jint yLoc, jstring jCategoryName, jstring jSubCategoryName, jint mapLocationType, jbyte flags)
|
|
{
|
|
|
|
if (mapLocationType < 0 || mapLocationType >= PlanetMapManager::MLT_numTypes)
|
|
{
|
|
WARNING(true, ("[script bug] invalid mapLocationType [%d] passed to addPlanetaryMapLocationIgnoreLocationCountLimits", mapLocationType));
|
|
return false;
|
|
}
|
|
|
|
NetworkId id(locationId);
|
|
if (id == NetworkId::cms_invalid)
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
|
|
return false;
|
|
}
|
|
|
|
JavaStringParam localLocationName(locationName);
|
|
Unicode::String wideLocationName;
|
|
if(!JavaLibrary::convert(localLocationName, wideLocationName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid locationName passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
|
|
return false;
|
|
}
|
|
|
|
if (wideLocationName.empty ())
|
|
{
|
|
DEBUG_WARNING (true, ("[script bug] empty locationName passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
|
|
return false;
|
|
}
|
|
|
|
JavaStringParam localCategory(jCategoryName);
|
|
std::string categoryName;
|
|
if(!JavaLibrary::convert(localCategory, categoryName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid category passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
|
|
return false;
|
|
}
|
|
|
|
std::string subCategoryName;
|
|
if (jSubCategoryName)
|
|
{
|
|
JavaStringParam localSubCategory(jSubCategoryName);
|
|
if(!JavaLibrary::convert(localSubCategory, subCategoryName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid SubCategory passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
const uint8 category = PlanetMapManager::findCategory (categoryName);
|
|
if (!category)
|
|
{
|
|
WARNING(true, ("[script bug] invalid category [%s] passed to addPlanetaryMapLocationIgnoreLocationCountLimits", categoryName.c_str ()));
|
|
return false;
|
|
|
|
}
|
|
|
|
const uint8 subCategory = PlanetMapManager::findCategory (subCategoryName);
|
|
|
|
if (!subCategory && !subCategoryName.empty ())
|
|
{
|
|
WARNING(true, ("[script bug] invalid subcategory [%s] passed to addPlanetaryMapLocationIgnoreLocationCountLimits", categoryName.c_str ()));
|
|
return false;
|
|
}
|
|
|
|
const Vector2d v2d (static_cast<float>(xLoc), static_cast<float>(yLoc));
|
|
|
|
bool result = false;
|
|
const MapLocation loc = PlanetMapManager::makeMapLocation (id, wideLocationName, v2d, categoryName, subCategoryName, flags, result);
|
|
|
|
if (!result)
|
|
{
|
|
WARNING(true, ("[script bug] invalid location passed to addPlanetaryMapLocationIgnoreLocationCountLimits"));
|
|
return false;
|
|
}
|
|
|
|
PlanetMapManagerServer::addMapLocation (loc, mapLocationType, false);
|
|
return true;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool JNICALL ScriptMethodsMapNamespace::removePlanetaryMapLocation(JNIEnv *env, jobject script, jlong locationId)
|
|
{
|
|
NetworkId id(locationId);
|
|
if (id == NetworkId::cms_invalid)
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to removePlanetaryMapLocation"));
|
|
return false;
|
|
}
|
|
|
|
PlanetMapManagerServer::removeMapLocation (id);
|
|
return true;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
jobjectArray JNICALL ScriptMethodsMapNamespace::getPlanetaryMapLocations(
|
|
JNIEnv *env,
|
|
jobject script,
|
|
jstring jCategoryName,
|
|
jstring jSubCategoryName)
|
|
|
|
{
|
|
std::string categoryName;
|
|
if (jCategoryName)
|
|
{
|
|
JavaStringParam localCategory(jCategoryName);
|
|
if(!JavaLibrary::convert(localCategory, categoryName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid category passed to getPlanetaryMapLocations"));
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
std::string subCategoryName;
|
|
if (jSubCategoryName)
|
|
{
|
|
JavaStringParam localSubCategory(jSubCategoryName);
|
|
if(!JavaLibrary::convert(localSubCategory, subCategoryName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid SubCategory passed to getPlanetaryMapLocations"));
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
static PlanetMapManagerServer::MapLocationVector locs;
|
|
locs.clear ();
|
|
//@todo: this must be passed in from script
|
|
PlanetMapManagerServer::getMapLocationsByCategories (PlanetMapManager::MLT_static, categoryName, subCategoryName, locs);
|
|
|
|
LocalObjectArrayRefPtr jlocs = createNewObjectArray(locs.size(), JavaLibrary::getClsMapLocation());
|
|
|
|
int index = 0;
|
|
for (PlanetMapManagerServer::MapLocationVector::const_iterator i = locs.begin(); i < locs.end(); ++i, ++index)
|
|
{
|
|
const MapLocation & mapLocation = *i;
|
|
|
|
jlong jLocationId = mapLocation.getLocationId().getValue();
|
|
if (!jLocationId)
|
|
return nullptr;
|
|
|
|
JavaString jNameString(mapLocation.getLocationName());
|
|
|
|
if (jNameString.getValue() == 0)
|
|
return nullptr;
|
|
|
|
LocalRefPtr jMapLocation = createNewObject(JavaLibrary::getClsMapLocation(),
|
|
JavaLibrary::getMidMapLocation(),
|
|
jLocationId, jNameString.getValue(),
|
|
jCategoryName,
|
|
jSubCategoryName,
|
|
static_cast<jlong> (mapLocation.getLocation().x),
|
|
static_cast<jlong> (mapLocation.getLocation().y),
|
|
static_cast<jbyte> (mapLocation.getFlags()));
|
|
|
|
if (jMapLocation == LocalRef::cms_nullPtr)
|
|
return nullptr;
|
|
|
|
setObjectArrayElement(*jlocs, index, *jMapLocation);
|
|
}
|
|
|
|
return jlocs->getReturnValue();
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
jobjectArray JNICALL ScriptMethodsMapNamespace::getPlanetaryMapCategories (JNIEnv *env, jobject , jstring jCategoryName)
|
|
{
|
|
std::string categoryName;
|
|
if (jCategoryName)
|
|
{
|
|
JavaStringParam localCategory(jCategoryName);
|
|
if(!JavaLibrary::convert(localCategory, categoryName))
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid category passed to getPlanetaryMapCategories"));
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
const int theCategory = PlanetMapManager::findCategory (categoryName);
|
|
|
|
static PlanetMapManagerServer::IntVector iv;
|
|
iv.clear ();
|
|
PlanetMapManagerServer::getCategories (theCategory, iv);
|
|
|
|
LocalObjectArrayRefPtr jcats = createNewObjectArray (iv.size (), JavaLibrary::getClsString());
|
|
|
|
size_t i = 0;
|
|
for (PlanetMapManagerServer::IntVector::const_iterator it = iv.begin (); it != iv.end (); ++it, ++i)
|
|
{
|
|
const int cat = *it;
|
|
const std::string & catName = PlanetMapManager::findCategoryName (static_cast<uint8>(cat));
|
|
const JavaString jval(catName);
|
|
setObjectArrayElement(*jcats, i, jval);
|
|
}
|
|
|
|
return jcats->getReturnValue();
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
jobject JNICALL ScriptMethodsMapNamespace::getPlanetaryMapLocation (JNIEnv *env, jobject, jlong jLocationId)
|
|
{
|
|
NetworkId id(jLocationId);
|
|
if (id == NetworkId::cms_invalid)
|
|
{
|
|
DEBUG_WARNING(true, ("[script bug] invalid locationId passed to getPlanetaryMapCategories"));
|
|
return nullptr;
|
|
}
|
|
|
|
int mlt = 0;
|
|
const MapLocation * const mapLocation = PlanetMapManagerServer::getLocation (id, mlt);
|
|
|
|
if (!mapLocation)
|
|
return nullptr;
|
|
|
|
const JavaString jLocName (mapLocation->m_locationName);
|
|
const JavaString jLocCategoryName (PlanetMapManager::findCategoryName (mapLocation->m_category));
|
|
const JavaString jLocSubCategoryName (PlanetMapManager::findCategoryName (mapLocation->m_subCategory));
|
|
|
|
LocalRefPtr jMapLocation = createNewObject(JavaLibrary::getClsMapLocation(),
|
|
JavaLibrary::getMidMapLocation(),
|
|
jLocationId,
|
|
|
|
jLocName.getValue (),
|
|
jLocCategoryName.getValue (),
|
|
jLocSubCategoryName.getValue (),
|
|
|
|
static_cast<jlong> (mapLocation->getLocation().x),
|
|
static_cast<jlong> (mapLocation->getLocation().y),
|
|
static_cast<jbyte> (mapLocation->getFlags()));
|
|
|
|
return jMapLocation->getReturnValue();
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|