diff --git a/engine/server/library/serverScript/src/shared/ScriptMethodsPlanet.cpp b/engine/server/library/serverScript/src/shared/ScriptMethodsPlanet.cpp index f0743a00..cb02d2c6 100755 --- a/engine/server/library/serverScript/src/shared/ScriptMethodsPlanet.cpp +++ b/engine/server/library/serverScript/src/shared/ScriptMethodsPlanet.cpp @@ -46,6 +46,7 @@ namespace ScriptMethodsPlanetNamespace jboolean JNICALL isAreaTooFullForTravel (JNIEnv* env, jobject self, jstring planetName_j, jint x, jint z); jstring JNICALL getBuildoutAreaName( JNIEnv *env, jobject self, jfloat x, jfloat z, jstring scene ); jfloatArray JNICALL getBuildoutAreaSizeAndCenter(JNIEnv *env, jobject self, jfloat x, jfloat z, jstring scene, jboolean ignoreInternal, jboolean allowComposite); + jfloatArray JNICALL getBuildoutAreaRect(JNIEnv *env, jobject self, jfloat x, jfloat z, jstring scene, jboolean allowComposite); void JNICALL requestSameServer(JNIEnv *env, jobject self, jlong object1, jlong object2); } @@ -70,6 +71,7 @@ const JNINativeMethod NATIVES[] = { JF("isAreaTooFullForTravel", "(Ljava/lang/String;II)Z", isAreaTooFullForTravel), JF("getBuildoutAreaName", "(FFLjava/lang/String;)Ljava/lang/String;", getBuildoutAreaName), JF("getBuildoutAreaSizeAndCenter", "(FFLjava/lang/String;ZZ)[F", getBuildoutAreaSizeAndCenter), + JF("getBuildoutAreaRect", "(FFLjava/lang/String;Z)[F", getBuildoutAreaRect), JF("_requestSameServer", "(JJ)V", requestSameServer), }; @@ -548,4 +550,43 @@ void JNICALL ScriptMethodsPlanetNamespace::requestSameServer(JNIEnv *env, jobjec GameServer::getInstance().sendToPlanetServer(rssMessage); } +jfloatArray JNICALL ScriptMethodsPlanetNamespace::getBuildoutAreaRect(JNIEnv *env, jobject self, jfloat x, jfloat z, jstring scene, jboolean allowComposite) { + + std::string sceneId; + JavaStringParam sceneId_jsp (scene); + if (!JavaLibrary::convert (sceneId_jsp, sceneId)) + { + WARNING(true,("getBuildoutAreaRect could not convert the scene id to string")); + return 0; + } + + const BuildoutArea * const area = SharedBuildoutAreaManager::findBuildoutAreaAtPosition(sceneId.c_str(), x, z, false, false); + if (!area) + { + return 0; + } + + LocalFloatArrayRefPtr valueArray = createNewFloatArray(static_cast(4)); + if (valueArray == LocalFloatArrayRef::cms_nullPtr) + { + return 0; + } + + Rectangle2d rect = area->getRectangle(allowComposite == JNI_TRUE); + + auto value = static_cast(rect.x0); + setFloatArrayRegion(*valueArray, 0, 1, &value); + + value = static_cast(rect.x1); + setFloatArrayRegion(*valueArray, 1, 1, &value); + + value = static_cast(rect.y0); + setFloatArrayRegion(*valueArray, 2, 1, &value); + + value = static_cast(rect.y1); + setFloatArrayRegion(*valueArray, 3, 1, &value); + + return valueArray->getReturnValue(); +} + // ======================================================================