//======================================================================== // // ScriptMethodsWorldInfo.cpp - implements script methods for querying // world objects // // copyright 2001 Sony Online Entertainment // //======================================================================== #include "serverScript/FirstServerScript.h" #include "serverScript/JavaLibrary.h" #include "UnicodeUtils.h" #include "boost/smart_ptr.hpp" // for boost::shared_ptr and friends #include "serverGame/ContainerInterface.h" #include "sharedDebug/Profiler.h" #include "serverGame/CreatureObject.h" #include "serverGame/PlanetObject.h" #include "serverGame/ServerBuildoutManager.h" #include "serverGame/ServerObject.h" #include "serverGame/ServerUniverse.h" #include "serverGame/ServerWorld.h" #include "serverGame/TangibleObject.h" #include "serverScript/GameScriptObject.h" #include "serverScript/ScriptParameters.h" #include "sharedCollision/CollisionWorld.h" #include "sharedFoundation/DynamicVariableList.h" #include "sharedMath/Sphere.h" #include "sharedObject/NetworkIdManager.h" #include "sharedRandom/Random.h" #include "sharedTerrain/TerrainObject.h" #include using namespace JNIWrappersNamespace; // ====================================================================== // ScriptMethodsWorldInfoNamespace // ====================================================================== namespace ScriptMethodsWorldInfoNamespace { bool install(); jlongArray JNICALL getObjectsInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range); jlongArray JNICALL getObjectsInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range); jlongArray JNICALL getCreaturesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range); jlongArray JNICALL getCreaturesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range); jlongArray JNICALL getCreaturesOfNicheInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range, jint niche, jint mask); jlongArray JNICALL getCreaturesOfNicheInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range, jint niche, jint mask); jlongArray JNICALL getCreaturesOfSpeciesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range, jint species); jlongArray JNICALL getCreaturesOfSpeciesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range, jint species); jlongArray JNICALL getCreaturesOfRaceInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range, jint species, jint race); jlongArray JNICALL getCreaturesOfRaceInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range, jint species, jint race); jlongArray JNICALL getNonCreaturesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range); jlongArray JNICALL getNonCreaturesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range); jlongArray JNICALL getNPCsInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range); jlongArray JNICALL getNPCsInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range); jlongArray JNICALL getPlayerCreaturesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range); jlongArray JNICALL getPlayerCreaturesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range); jlongArray JNICALL getObjectsInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle); jlongArray JNICALL getObjectsInConeLocation(JNIEnv *env, jobject self, jlong coneCenterObjectId, jobject coneDirectionLocation, jfloat range, jfloat angle); jlongArray JNICALL getCreaturesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle); jlongArray JNICALL getCreaturesInConeLocation(JNIEnv *env, jobject self, jlong coneCenterObjectId, jobject coneDirectionLocation, jfloat range, jfloat angle); jlongArray JNICALL getCreaturesOfNicheInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle, jint niche, jint mask); jlongArray JNICALL getCreaturesOfSpeciesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle, jint species); jlongArray JNICALL getCreaturesOfRaceInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle, jint species, jint race); jlongArray JNICALL getNonCreaturesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle); jlongArray JNICALL getNPCsInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle); jlongArray JNICALL getPlayerCreaturesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle); jlongArray JNICALL getPerformanceListenersInRange(JNIEnv *env, jobject self, jlong performer, jfloat range); jlongArray JNICALL getPerformanceWatchersInRange(JNIEnv *env, jobject self, jlong performer, jfloat range); jboolean JNICALL isSpaceBattlefieldZone(JNIEnv *env, jobject self); jboolean JNICALL isSpaceScene(JNIEnv *env, jobject self); jboolean JNICALL isValidLocation(JNIEnv *env, jobject self, jobject objectPosition, jfloat objectRadius ); jobject JNICALL getValidLocation(JNIEnv *env, jobject self, jobject corralCenter, jfloat corralRadius, jobject desiredPosition, jfloat objectRadius ); jboolean JNICALL canSee(JNIEnv *env, jobject self, jlong source, jlong target); jboolean JNICALL canSeeLocation(JNIEnv *env, jobject self, jlong source, jobject target); jboolean JNICALL canManipulate(JNIEnv *env, jobject self, jlong player, jlong target, jboolean move, jboolean doPermission, float distance, jboolean sendMessage, jboolean skipNoTradeCheck); jfloat JNICALL getElevation(JNIEnv *env, jobject self, jobject loc); jfloat JNICALL getDirection(JNIEnv *env, jobject self, jobject loc1, jobject loc2); jobject JNICALL findSpotNear(JNIEnv *env, jobject self, jlong target, jobject loc, jfloat radius); jlongArray JNICALL getAllNpcs(JNIEnv *env, jobject self, jobject loc, jfloat radius); jlongArray JNICALL getAllPlayers(JNIEnv *env, jobject self, jobject loc, jfloat radius); jlong JNICALL getClosestMobile(JNIEnv *env, jobject self, jobject loc); jlong JNICALL getClosestPlayer(JNIEnv *env, jobject self, jobject loc); jlong JNICALL getFirstObjectWithScript(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring script); jlong JNICALL getFirstObjectWithObjVar(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring objvar); jlong JNICALL getFirstObjectWithTemplate(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring templateName); jlongArray JNICALL getAllObjectsWithScript(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring script); jlongArray JNICALL getAllObjectsWithObjVar(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring objvar); jlongArray JNICALL getAllObjectsWithTemplate(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring templateName); jobject JNICALL getLocationBetweenLocs(JNIEnv *env, jobject self, jobject target1, jobject target2); jlong JNICALL getPlanetByName(JNIEnv * env, jobject self, jstring name); jstring JNICALL getNameForPlanetObject(JNIEnv * env, jobject self, jlong planet); jboolean JNICALL getCollidesWithObject(JNIEnv * env, jobject self, jobject loc, jfloat radius); jboolean JNICALL startUniverseWideEvent(JNIEnv * env, jobject self, jstring eventName); jboolean JNICALL stopUniverseWideEvent(JNIEnv * env, jobject self, jstring eventName); jstring JNICALL getCurrentUniverseWideEvents(JNIEnv * env, jobject self); } //======================================================================== // install //======================================================================== bool ScriptMethodsWorldInfoNamespace::install() { const JNINativeMethod NATIVES[] = { #define JF(a,b,c) {a,b,(void*)(ScriptMethodsWorldInfoNamespace::c)} JF("_getObjectsInRange", "(JF)[J", getObjectsInRangeObject), JF("_getObjectsInRange", "(Lscript/location;F)[J", getObjectsInRangeLocation), JF("_getCreaturesInRange", "(JF)[J", getCreaturesInRangeObject), JF("_getCreaturesInRange", "(Lscript/location;F)[J", getCreaturesInRangeLocation), JF("_getCreaturesOfNicheInRange", "(JFII)[J", getCreaturesOfNicheInRangeObject), JF("_getCreaturesOfNicheInRange", "(Lscript/location;FII)[J", getCreaturesOfNicheInRangeLocation), JF("_getCreaturesOfSpeciesInRange", "(JFI)[J", getCreaturesOfSpeciesInRangeObject), JF("_getCreaturesOfSpeciesInRange", "(Lscript/location;FI)[J", getCreaturesOfSpeciesInRangeLocation), JF("_getCreaturesOfRaceInRange", "(JFII)[J", getCreaturesOfRaceInRangeObject), JF("_getCreaturesOfRaceInRange", "(Lscript/location;FII)[J", getCreaturesOfRaceInRangeLocation), JF("_getNonCreaturesInRange", "(JF)[J", getNonCreaturesInRangeObject), JF("_getNonCreaturesInRange", "(Lscript/location;F)[J", getNonCreaturesInRangeLocation), JF("_getNPCsInRange", "(JF)[J", getNPCsInRangeObject), JF("_getNPCsInRange", "(Lscript/location;F)[J", getNPCsInRangeLocation), JF("_getPlayerCreaturesInRange", "(JF)[J", getPlayerCreaturesInRangeObject), JF("_getPlayerCreaturesInRange", "(Lscript/location;F)[J", getPlayerCreaturesInRangeLocation), JF("_getPerformanceListenersInRange", "(JF)[J", getPerformanceListenersInRange), JF("_getPerformanceWatchersInRange", "(JF)[J", getPerformanceWatchersInRange), JF("isSpaceBattlefieldZone", "()Z", isSpaceBattlefieldZone), JF("isSpaceScene", "()Z", isSpaceScene), JF("_getObjectsInCone", "(JJFF)[J", getObjectsInCone), JF("_getObjectsInCone", "(JLscript/location;FF)[J", getObjectsInConeLocation), JF("_getCreaturesInCone", "(JJFF)[J", getCreaturesInCone), JF("_getCreaturesInCone", "(JLscript/location;FF)[J", getCreaturesInConeLocation), JF("_getCreaturesOfNicheInCone", "(JJFFII)[J", getCreaturesOfNicheInCone), JF("_getCreaturesOfSpeciesInCone", "(JJFFI)[J", getCreaturesOfSpeciesInCone), JF("_getCreaturesOfRaceInCone", "(JJFFII)[J", getCreaturesOfRaceInCone), JF("_getNonCreaturesInCone", "(JJFF)[J", getNonCreaturesInCone), JF("_getNPCsInCone", "(JJFF)[J", getNPCsInCone), JF("_getPlayerCreaturesInCone", "(JJFF)[J", getPlayerCreaturesInCone), JF("isValidLocation","(Lscript/location;F)Z",isValidLocation), JF("getValidLocation","(Lscript/location;FLscript/location;F)Lscript/location;",getValidLocation), JF("_canSee", "(JJ)Z", canSee), JF("_canSee", "(JLscript/location;)Z", canSeeLocation), JF("_canManipulate", "(JJZZFZZ)Z", canManipulate), JF("getElevation", "(Lscript/location;)F",getElevation), JF("getDirection", "(Lscript/location;Lscript/location;)F",getDirection), JF("_findSpotNear", "(JLscript/location;F)Lscript/location;",findSpotNear), JF("_getAllNpcs", "(Lscript/location;F)[J",getAllNpcs), JF("_getAllPlayers", "(Lscript/location;F)[J",getAllPlayers), JF("_getClosestMobile", "(Lscript/location;)J",getClosestMobile), JF("_getClosestPlayer", "(Lscript/location;)J",getClosestPlayer), JF("_getFirstObjectWithScript", "(Lscript/location;FLjava/lang/String;)J",getFirstObjectWithScript), JF("_getFirstObjectWithObjVar", "(Lscript/location;FLjava/lang/String;)J",getFirstObjectWithObjVar), JF("_getFirstObjectWithTemplate", "(Lscript/location;FLjava/lang/String;)J",getFirstObjectWithTemplate), JF("_getAllObjectsWithScript", "(Lscript/location;FLjava/lang/String;)[J",getAllObjectsWithScript), JF("_getAllObjectsWithObjVar", "(Lscript/location;FLjava/lang/String;)[J",getAllObjectsWithObjVar), JF("_getAllObjectsWithTemplate", "(Lscript/location;FLjava/lang/String;)[J",getAllObjectsWithTemplate), JF("getLocationBetweenLocs", "(Lscript/location;Lscript/location;)Lscript/location;",getLocationBetweenLocs), JF("_getPlanetByName", "(Ljava/lang/String;)J", getPlanetByName), JF("_getNameForPlanetObject", "(J)Ljava/lang/String;", getNameForPlanetObject), JF("_getCollidesWithObject", "(Lscript/location;F)Z", getCollidesWithObject), JF("_startUniverseWideEvent", "(Ljava/lang/String;)Z", startUniverseWideEvent), JF("_stopUniverseWideEvent", "(Ljava/lang/String;)Z", stopUniverseWideEvent), JF("_getCurrentUniverseWideEvents", "()Ljava/lang/String;", getCurrentUniverseWideEvents), }; return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0])); } //======================================================================== // class JavaLibrary JNI world info callback methods //======================================================================== /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getObjectsInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range) { PROFILER_AUTO_BLOCK_DEFINE("JNI::getObjectsInRange"); UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findObjectsInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getObjectsInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range) { PROFILER_AUTO_BLOCK_DEFINE("JNI::getObjectsInRange"); UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findObjectsInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range) { UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findCreaturesInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range) { UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findCreaturesInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * @param type * @param mask * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfNicheInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range, jint type, jint mask) { UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findCreaturesOfNicheInRange(target, range, type, mask, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * @param type * @param mask * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfNicheInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range, jint type, jint mask) { UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findCreaturesOfNicheInRange(target, range, type, mask, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * @param species * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfSpeciesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range, jint species) { UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findCreaturesOfSpeciesInRange(target, range, species, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * @param species * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfSpeciesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range, jint species) { UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findCreaturesOfSpeciesInRange(target, range, species, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * @param species * @param race * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfRaceInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range, jint species, jint race) { UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findCreaturesOfRaceInRange(target, range, species, race, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * @param species * @param race * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfRaceInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range, jint species, jint race) { UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findCreaturesOfRaceInRange(target, range, species, race, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getNonCreaturesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range) { UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findNonCreaturesInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getNonCreaturesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range) { UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findNonCreaturesInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getNPCsInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range) { UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findNPCsInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getNPCsInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range) { UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findNPCsInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location location that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getPlayerCreaturesInRangeLocation(JNIEnv *env, jobject self, jobject location, jfloat range) { UNREF(self); if (location == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(location, target)) return 0; ServerWorld::findPlayerCreaturesInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } /** * * * @param env Java environment * @param self class calling this function * @param location object that is the center of the search area * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getPlayerCreaturesInRangeObject(JNIEnv *env, jobject self, jlong object, jfloat range) { UNREF(self); if (object == 0) return 0; std::vector results; Vector target; if (!ScriptConversion::convertWorld(object, target)) return 0; ServerWorld::findPlayerCreaturesInRange(target, range, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getObjectsInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findObjectsInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * Get an array of objects which are in a cone of a location. * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getObjectsInConeLocation(JNIEnv *env, jobject self, jlong coneCenterObjectId, jobject coneDirectionLocation, jfloat range, jfloat angle) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionLocation) return 0; Object * coneCenterObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; Location coneDirection; if (!ScriptConversion::convert(LocalRefParam(coneDirectionLocation), coneDirection)) return 0; // Query for the results. std::vector results; ServerWorld::findObjectsInCone(*coneCenterObject, coneDirection, range, convertDegreesToRadians(angle), results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findCreaturesInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), results); // Convert C-style results to Java. LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * Get an array of creatures which are in a specified cone. * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesInConeLocation(JNIEnv *env, jobject self, jlong coneCenterObjectId, jobject coneDirectionLocation, jfloat range, jfloat angle) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionLocation) return 0; Object * coneCenterObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; Location coneDirection; if (!ScriptConversion::convert(LocalRefParam(coneDirectionLocation), coneDirection)) return 0; // Query for the results. std::vector results; ServerWorld::findCreaturesInCone(*coneCenterObject, coneDirection, range, convertDegreesToRadians(angle), results); // Convert C-style results to Java. LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfNicheInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle, jint niche, jint mask) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findCreaturesOfNicheInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), niche, mask, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfSpeciesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle, jint species) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findCreaturesOfSpeciesInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), species, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getCreaturesOfRaceInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle, jint species, jint race) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findCreaturesOfRaceInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), species, race, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getNonCreaturesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findNonCreaturesInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getNPCsInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findNPCsInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * * * @param env Java environment * @param self class calling this function * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getPlayerCreaturesInCone(JNIEnv *env, jobject self, jlong coneCenterObjectId, jlong coneDirectionObjectId, jfloat range, jfloat angle) { UNREF(self); // Validate preconditions. if (!coneCenterObjectId || !coneDirectionObjectId) return 0; Object * coneCenterObject = 0; Object * coneDirectionObject = 0; // Get the cone and base objects. if (!JavaLibrary::getObject(coneCenterObjectId, coneCenterObject)) return 0; if (!JavaLibrary::getObject(coneDirectionObjectId, coneDirectionObject)) return 0; // Query for the results. std::vector results; ServerWorld::findPlayerCreaturesInCone(*coneCenterObject, *coneDirectionObject, range, convertDegreesToRadians(angle), results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- jfloat JNICALL ScriptMethodsWorldInfoNamespace::getElevation(JNIEnv *env, jobject self, jobject loc) { PROFILER_AUTO_BLOCK_DEFINE("JNI::getElevation"); Vector where; NetworkId cell; if (!ScriptConversion::convert(loc, where, cell)) return 0.0f; const TerrainObject *terrain=TerrainObject::getConstInstance (); NOT_NULL(terrain); float height; if (terrain->getHeight(where,height)) return height; else return 0.0f; } jfloat JNICALL ScriptMethodsWorldInfoNamespace::getDirection(JNIEnv *env, jobject self, jobject loc1, jobject loc2) { Vector from; if (!ScriptConversion::convertWorld(loc1, from)) { return 0.0f; } Vector to; if (!ScriptConversion::convertWorld(loc2, to)) { return 0.0f; } Vector difference=(to-from); float theta=convertRadiansToDegrees(difference.theta()); if (theta > 0) return theta; else return (360.0f+theta); } jobject JNICALL ScriptMethodsWorldInfoNamespace::findSpotNear(JNIEnv *env, jobject self, jlong target, jobject loc, jfloat radius) { PROFILER_AUTO_BLOCK_DEFINE("JNI::findSpotNear"); Vector where; if (!ScriptConversion::convertWorld(loc, where)) { return 0; } Vector result(where.x+Random::randomReal(radius*2) - radius,0,where.z+Random::randomReal(radius*2) - radius); const TerrainObject *terrain=TerrainObject::getConstInstance(); NOT_NULL(terrain); float height; if (terrain->getHeight(where,height)) { result.y=height; LocalRefPtr temp; if (ScriptConversion::convert(result, NetworkId(), temp)) return temp->getReturnValue(); else return 0; } else return 0; } jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getAllNpcs(JNIEnv *env, jobject self, jobject loc, jfloat radius) { UNREF(self); std::vector results; Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; ServerWorld::findNPCsInRange(target, radius, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getAllPlayers(JNIEnv *env, jobject self, jobject loc, jfloat radius) { UNREF(self); std::vector results; Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; ServerWorld::findPlayerCreaturesInRange(target, radius, results); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } jlong JNICALL ScriptMethodsWorldInfoNamespace::getClosestMobile(JNIEnv *env, jobject self, jobject loc) //TODO: Rename getClosestNPC for consistency { jfloat radius=128; //TODO: make this a paramter UNREF(self); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; ServerObject * npc = ServerWorld::findClosestNPC(target, radius); if (npc == NULL) return 0; return (npc->getNetworkId()).getValue(); } jlong JNICALL ScriptMethodsWorldInfoNamespace::getClosestPlayer(JNIEnv *env, jobject self, jobject loc) { jfloat radius=128; //TODO: make this a paramter UNREF(self); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; ServerObject * player = ServerWorld::findClosestPlayer(target, radius); if (player == NULL) return 0; return (player->getNetworkId()).getValue(); } jlong JNICALL ScriptMethodsWorldInfoNamespace::getFirstObjectWithScript(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring script) { JavaStringParam localScript(script); UNREF(self); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; std::string scriptName; if (!JavaLibrary::convert(localScript, scriptName)) return 0; typedef std::vector ResultsType; ResultsType results; ServerWorld::findObjectsInRange(target, range, results); for (ResultsType::iterator i=results.begin(); i!=results.end(); ++i) { if (*i != NULL && (*i)->getScriptObject()->hasScript(scriptName)) return ((*i)->getNetworkId()).getValue(); } return 0; } jlong JNICALL ScriptMethodsWorldInfoNamespace::getFirstObjectWithObjVar(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring objvar) { PROFILER_AUTO_BLOCK_DEFINE("JNI::getFirstObjectWithObjvar"); JavaStringParam localObjvar(objvar); UNREF(self); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; std::string objvarName; if (!JavaLibrary::convert(localObjvar, objvarName)) return 0; typedef std::vector ResultsType; ResultsType results; ServerWorld::findObjectsInRange(target, range, results); for (ResultsType::iterator i=results.begin(); i!=results.end(); ++i) { if (*i != NULL && (*i)->getObjVars().hasItem(objvarName)) return ((*i)->getNetworkId()).getValue(); } return 0; } jlong JNICALL ScriptMethodsWorldInfoNamespace::getFirstObjectWithTemplate(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring templateName) { PROFILER_AUTO_BLOCK_DEFINE("JNI::getFirstObjectWithTemplate"); JavaStringParam localTemplateName(templateName); UNREF(self); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; std::string templateStr; if (!JavaLibrary::convert(localTemplateName, templateStr)) return 0; typedef std::vector ResultsType; ResultsType results; ServerWorld::findObjectsInRange(target, range, results); for (ResultsType::iterator i=results.begin(); i!=results.end(); ++i) { if (*i != NULL && templateStr == (*i)->getTemplateName()) return ((*i)->getNetworkId()).getValue(); } return 0; } jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getAllObjectsWithScript(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring script) { JavaStringParam localScript(script); UNREF(self); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; std::string scriptName; if (!JavaLibrary::convert(localScript,scriptName)) return 0; typedef std::vector ResultsType; ResultsType results, filteredResults; ServerWorld::findObjectsInRange(target, range, results); for (ResultsType::iterator i=results.begin(); i!=results.end(); ++i) { if ((*i)->getScriptObject()->hasScript(scriptName)) filteredResults.push_back(*i); } LocalLongArrayRefPtr rv; if (ScriptConversion::convert(filteredResults, rv)) return rv->getReturnValue(); return 0; } jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getAllObjectsWithObjVar(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring objvar) { UNREF(self); PROFILER_AUTO_BLOCK_DEFINE("JNI::getObjectsWithObjvar"); JavaStringParam localObjvar(objvar); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; std::string objvarName; if (!JavaLibrary::convert(localObjvar, objvarName)) return 0; typedef std::vector ResultsType; ResultsType results, filteredResults; ServerWorld::findObjectsInRange(target, range, results); for (ResultsType::iterator i=results.begin(); i!=results.end(); ++i) { if ((*i)->getObjVars().hasItem(objvarName)) filteredResults.push_back(*i); } LocalLongArrayRefPtr rv; if (ScriptConversion::convert(filteredResults, rv)) return rv->getReturnValue(); return 0; } jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getAllObjectsWithTemplate(JNIEnv *env, jobject self, jobject loc, jfloat range, jstring templateName) { UNREF(self); PROFILER_AUTO_BLOCK_DEFINE("JNI::getAllObjectsWithTemplate"); JavaStringParam localTemplateName(templateName); Vector target; if (!ScriptConversion::convertWorld(loc, target)) return 0; std::string templateStr; if (!JavaLibrary::convert(localTemplateName, templateStr)) return 0; typedef std::vector ResultsType; ResultsType results, filteredResults; ServerWorld::findObjectsInRange(target, range, results); for (ResultsType::iterator i=results.begin(); i!=results.end(); ++i) { if (templateStr == (*i)->getTemplateName()) filteredResults.push_back(*i); } LocalLongArrayRefPtr rv; if (ScriptConversion::convert(filteredResults, rv)) return rv->getReturnValue(); return 0; } jobject JNICALL ScriptMethodsWorldInfoNamespace::getLocationBetweenLocs(JNIEnv *env, jobject self, jobject target1, jobject target2) { Vector loc1; if (!ScriptConversion::convertWorld(target1, loc1)) return 0; Vector loc2; if (!ScriptConversion::convertWorld(target2, loc2)) return 0; float factor=Random::randomReal(); // how far along the line between the two points Vector result(loc1.x+(loc2.x-loc1.x)*factor,0,loc1.z+(loc2.z-loc1.z)*factor); const TerrainObject *terrain=TerrainObject::getConstInstance(); NOT_NULL(terrain); float height; if (terrain->getHeight(result,height)) { result.y=height; LocalRefPtr temp; // @todo: what cell do we use? if (ScriptConversion::convert(result, NetworkId::cms_invalid, temp)) return temp->getReturnValue(); else { DEBUG_REPORT_LOG(true,("(ScriptConversion::convert(result,temp)) failed.\n")); } } DEBUG_REPORT_LOG(true,("(terrain->getHeight(result,height)) failed\n")); return 0; } //----------------------------------------------------------------------- jlong JNICALL ScriptMethodsWorldInfoNamespace::getPlanetByName(JNIEnv * env, jobject self, jstring name) { JavaStringParam localName(name); PROFILER_AUTO_BLOCK_DEFINE("JNI::getPlanetByName"); jlong result = 0; std::string n; if(JavaLibrary::convert(localName, n)) { PlanetObject * p = ServerUniverse::getInstance().getPlanetByName(n); if (p) { result = (p->getNetworkId()).getValue(); } } return result; } // ---------------------------------------------------------------------- jstring JNICALL ScriptMethodsWorldInfoNamespace::getNameForPlanetObject(JNIEnv * env, jobject self, jlong planet) { NetworkId planetObjId(planet); if (planetObjId!=NetworkId::cms_invalid) { const PlanetObject *planetObj = dynamic_cast(NetworkIdManager::getObjectById(planetObjId)); if (planetObj) { JavaString str(Unicode::narrowToWide(planetObj->getName())); return str.getReturnValue(); } } return NULL; } // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsWorldInfoNamespace::isValidLocation(JNIEnv *env, jobject self, jobject jObjectPos, jfloat jObjectRadius ) { return true; } jobject JNICALL ScriptMethodsWorldInfoNamespace::getValidLocation(JNIEnv *env, jobject self, jobject jCorralCenter, jfloat jCorralRadius, jobject jDesiredPos, jfloat jObjectRadius ) { // convert java objects to C++ objects PROFILER_AUTO_BLOCK_DEFINE("JNI::getValidLocation"); Vector corralCenter; float corralRadius = jCorralRadius; Vector desiredPos; float objectRadius = jObjectRadius; UNREF(corralRadius); UNREF(objectRadius); ScriptConversion::convertWorld(jCorralCenter, corralCenter); ScriptConversion::convertWorld(jDesiredPos, desiredPos); // ---------- const TerrainObject *terrain=TerrainObject::getConstInstance (); NOT_NULL(terrain); for (int testCount = 0; testCount < 20; testCount++) { // ---------- // Find a random point inside the corral float rad = (corralRadius - objectRadius); float rad2 = rad * rad; Vector corralPoint; do { corralPoint.x = Random::randomReal(-rad,rad); corralPoint.y = 0; corralPoint.z = Random::randomReal(-rad,rad); } while(corralPoint.magnitudeSquared() > rad2); corralPoint += corralCenter; // ---------- // CorralPoint is now a random point in the corral. // Pop CorralPoint down onto the terrain. If we can't, try and find another point. if (!terrain->getHeight(corralPoint,corralPoint.y)) { continue; } // Determine if it's a valid point, and if not search for another one. bool isValid = !CollisionWorld::query( Sphere(corralPoint,objectRadius),NULL); // ---------- if(isValid) { LocalRefPtr result; if (ScriptConversion::convert(corralPoint, NetworkId(), result)) return result->getReturnValue(); } else { continue; } } // We failed to find a valid location return NULL; } // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsWorldInfoNamespace::getCollidesWithObject(JNIEnv * env, jobject self, jobject jlocation, jfloat jradius) { if (jlocation == NULL) return JNI_FALSE; float const radius = jradius; Vector location; if (!ScriptConversion::convertWorld(jlocation, location)) return JNI_FALSE; bool const result = CollisionWorld::query(Sphere(location, radius), NULL); if(result) return JNI_TRUE; else return JNI_FALSE; } // ---------------------------------------------------------------------- /** * Tests to see if an object can see another object. * * @param env Java environment * @param self class calling this function * @param source object that is looking * @param target object that is being looked at * * @return JNI_TRUE if the source can see the target, JNI_FALSE otherwise */ jboolean JNICALL ScriptMethodsWorldInfoNamespace::canSee(JNIEnv *env, jobject self, jlong source, jlong target) { UNREF(self); const ServerObject * sourceObject = NULL; if (!JavaLibrary::getObject(source, sourceObject)) { NetworkId id(source); if (id == NetworkId::cms_invalid) { DEBUG_WARNING(true,("JavaLibrary::canSee - source object %s doesn't exist, returning true as a workaround\n",id.getValueString().c_str())); } else { DEBUG_WARNING(true,("JavaLibrary::canSee - source object doesn't exist and we can't get a network ID for it, returning true as a workaround\n")); } return JNI_TRUE; } const ServerObject * targetObject = NULL; if (!JavaLibrary::getObject(target, targetObject)) { NetworkId id(target); if (id == NetworkId::cms_invalid) { DEBUG_WARNING(true,("JavaLibrary::canSee - target object %s doesn't exist, returning true as a workaround\n",id.getValueString().c_str())); } else { DEBUG_WARNING(true,("JavaLibrary::canSee - target object doesn't exist and we can't get a network ID for it, returning true as a workaround\n")); } return JNI_TRUE; } return sourceObject->checkLOSTo(*targetObject); } // JavaLibrary::canSee // ---------------------------------------------------------------------- /** * Tests to see if an object can see a location. * * @param env Java environment * @param self class calling this function * @param source object that is looking * @param target location the source is looking at * * @return JNI_TRUE if the source can see the target, JNI_FALSE otherwise */ jboolean JNICALL ScriptMethodsWorldInfoNamespace::canSeeLocation(JNIEnv *env, jobject self, jlong source, jobject target) { UNREF(self); const ServerObject * sourceObject = NULL; if (!JavaLibrary::getObject(source, sourceObject)) { NetworkId id(source); if (id == NetworkId::cms_invalid) { DEBUG_WARNING(true,("JavaLibrary::canSee - source object %s doesn't exist, returning true as a workaround\n",id.getValueString().c_str())); } else { DEBUG_WARNING(true,("JavaLibrary::canSee - source object doesn't exist and we can't get a network ID for it, returning true as a workaround\n")); } return JNI_TRUE; } Location targetLocation; if (!ScriptConversion::convert(LocalRefParam(target), targetLocation)) { DEBUG_WARNING(true,("JavaLibrary::canSeeLocation - can't convert target location, returning true as a workaround\n")); return JNI_TRUE; } return sourceObject->checkLOSTo(targetLocation); } // JavaLibrary::canSeeLocation // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsWorldInfoNamespace::canManipulate(JNIEnv *env, jobject self, jlong player, jlong target, jboolean move, jboolean doPermission, float distance, jboolean sendMessage, jboolean skipNoTradeCheck) { UNREF(self); const CreatureObject * sourceObject = NULL; if (!JavaLibrary::getObject(player, sourceObject)) return JNI_FALSE; const ServerObject * targetObject = NULL; if (!JavaLibrary::getObject(target, targetObject)) return JNI_FALSE; Container::ContainerErrorCode code = Container::CEC_Success; bool retval = sourceObject->canManipulateObject(*targetObject, move, doPermission, doPermission, distance, code, skipNoTradeCheck); if (!retval && sendMessage && sourceObject->getClient()) { ContainerInterface::sendContainerMessageToClient(*sourceObject, code); } return retval; } /** * @param env Java environment * @param self class calling this function * @param performer performer we are looking for listeners of * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getPerformanceListenersInRange(JNIEnv *env, jobject self, jlong performer, jfloat range) { UNREF(self); if (performer == 0) return 0; std::vector creatures; const TangibleObject * object = 0; if (!JavaLibrary::getObject(performer, object)) return 0; ServerWorld::findCreaturesInRange(object->getPosition_w(), range, creatures); std::vector results; for (std::vector::iterator i = creatures.begin(); i != creatures.end(); ++i) if (safe_cast(*i)->getPerformanceListenTarget() == object->getNetworkId()) results.push_back(*i); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- /** * @param env Java environment * @param self class calling this function * @param performer performer we are looking for watchers of * @param range radius of search area * * @return array of obj_ids of the objects in range, or null on error */ jlongArray JNICALL ScriptMethodsWorldInfoNamespace::getPerformanceWatchersInRange(JNIEnv *env, jobject self, jlong performer, jfloat range) { UNREF(self); if (performer == 0) return 0; std::vector creatures; const TangibleObject * object = 0; if (!JavaLibrary::getObject(performer, object)) return 0; ServerWorld::findCreaturesInRange(object->getPosition_w(), range, creatures); std::vector results; for (std::vector::iterator i = creatures.begin(); i != creatures.end(); ++i) if (safe_cast(*i)->getPerformanceWatchTarget() == object->getNetworkId()) results.push_back(*i); LocalLongArrayRefPtr rv; if (ScriptConversion::convert(results, rv)) return rv->getReturnValue(); return 0; } // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsWorldInfoNamespace::isSpaceBattlefieldZone(JNIEnv *, jobject) { return static_cast(ServerWorld::isSpaceBattlefieldZone()); } // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsWorldInfoNamespace::isSpaceScene(JNIEnv *, jobject) { return static_cast(ServerWorld::isSpaceScene()); } // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsWorldInfoNamespace::startUniverseWideEvent(JNIEnv * env, jobject self, jstring eventName) { JavaStringParam localEventName(eventName); std::string eventString; if (!JavaLibrary::convert(localEventName, eventString)) return JNI_FALSE; ServerUniverse::addUniverseEvent(eventString); //ServerBuildoutManager::onEventStarted(eventString); return JNI_TRUE; } // ---------------------------------------------------------------------- jboolean JNICALL ScriptMethodsWorldInfoNamespace::stopUniverseWideEvent(JNIEnv * env, jobject self, jstring eventName) { JavaStringParam localEventName(eventName); std::string eventString; if (!JavaLibrary::convert(localEventName, eventString)) return JNI_FALSE; ServerUniverse::removeUniverseEvent(eventString); //ServerBuildoutManager::onEventStopped(eventString); return JNI_TRUE; } // ---------------------------------------------------------------------- jstring JNICALL ScriptMethodsWorldInfoNamespace::getCurrentUniverseWideEvents(JNIEnv * env, jobject self) { const std::string events = ServerUniverse::getCurrentEvents(); JavaString str(Unicode::narrowToWide(events)); return str.getReturnValue(); } // ======================================================================