Files

1672 lines
69 KiB
C++
Executable File

// ======================================================================
//
// ScriptMethodsPilot.cpp
// Copyright 2003, Sony Online Entertainment, Inc.
// All rights reserved.
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/AiShipAttackTargetList.h"
#include "serverGame/AiShipController.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/ServerWorld.h"
#include "serverGame/ShipObject.h"
#include "serverGame/SpaceDockingManager.h"
#include "serverGame/SpacePath.h"
#include "serverGame/SpacePathManager.h"
#include "serverGame/SpaceSquad.h"
#include "serverGame/SpaceSquadManager.h"
#include "sharedFoundation/NetworkId.h"
#include "sharedLog/Log.h"
#include "sharedMath/Transform.h"
#include "sharedObject/Appearance.h"
#include "sharedTerrain/TerrainObject.h"
using namespace JNIWrappersNamespace;
// ======================================================================
namespace ScriptMethodsPilotNamespace
{
bool verifyShipsEnabled()
{
if (!ConfigServerGame::getShipsEnabled())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("Ship support is not enabled. Make sure [GameServer] shipsEnabled=1 is in your config file."));
return false;
}
return true;
}
bool install();
jint JNICALL spaceUnitGetBehavior(JNIEnv * env, jobject self, jlong unit);
void JNICALL spaceUnitIdle(JNIEnv * env, jobject self, jlong unit);
void JNICALL spaceUnitTrack(JNIEnv * env, jobject self, jlong unit, jlong target);
void JNICALL spaceUnitMoveTo(JNIEnv * env, jobject self, jlong unit, jobjectArray path);
void JNICALL spaceUnitAddPatrolPath(JNIEnv * env, jobject self, jlong unit, jobjectArray path);
void JNICALL spaceUnitClearPatrolPath(JNIEnv * env, jobject self, jlong unit);
void JNICALL spaceUnitFollow(JNIEnv * env, jobject self, jlong unit, jlong followedUnit, jobject direction_o, jfloat distance);
void JNICALL spaceUnitAddDamageTaken(JNIEnv * env, jobject self, jlong unit, jlong targetUnit, jfloat damage);
void JNICALL spaceUnitSetAttackOrders(JNIEnv * env, jobject self, jlong unit, jint attackOrders);
void JNICALL spaceUnitSetPilotType(JNIEnv * env, jobject self, jlong unit, jstring pilotType);
jstring JNICALL spaceUnitGetPilotType(JNIEnv * env, jobject self, jlong unit);
jlong JNICALL spaceUnitGetPrimaryAttackTarget(JNIEnv * env, jobject self, jlong unit);
jlongArray JNICALL spaceUnitGetAttackTargetList(JNIEnv * env, jobject self, jlong unit);
jlongArray JNICALL spaceUnitGetWhoIsTargetingMe(JNIEnv * env, jobject self, jlong unit);
jboolean JNICALL spaceUnitIsAttacking(JNIEnv * env, jobject self, jlong unit);
void JNICALL spaceUnitRemoveAttackTarget(JNIEnv * env, jobject self, jlong unit, jlong targetUnit);
void JNICALL spaceUnitSetLeashDistance(JNIEnv * env, jobject self, jlong unit, jfloat distance);
void JNICALL spaceUnitSetSquadId(JNIEnv * env, jobject self, jlong unit, jint squadId);
jint JNICALL spaceUnitGetSquadId(JNIEnv * env, jobject self, jlong unit);
void JNICALL spaceUnitDock(JNIEnv * env, jobject self, jlong unit, jlong dockTarget, jfloat timeAtDock);
void JNICALL spaceUnitUnDock(JNIEnv * env, jobject self, jlong unit);
jboolean JNICALL spaceUnitIsDocked(JNIEnv * env, jobject self, jlong unit);
jboolean JNICALL spaceUnitIsDocking(JNIEnv * env, jobject self, jlong unit);
void JNICALL spaceUnitSetAutoAggroImmuneTime(JNIEnv * env, jobject self, jlong unit, jfloat time);
jboolean JNICALL spaceUnitIsAutoAggroImmune(JNIEnv * env, jobject self, jlong unit);
void JNICALL spaceUnitSetDamageAggroImmune(JNIEnv * env, jobject self, jlong unit, jboolean enabled);
jobject JNICALL spaceUnitGetDockTransform(JNIEnv * env, jobject self, jlong dockTarget, jlong dockingUnit);
void JNICALL spaceUnitAddExclusiveAggro(JNIEnv * env, jobject self, jlong unit, jlong pilot);
void JNICALL spaceUnitRemoveExclusiveAggro(JNIEnv * env, jobject self, jlong unit, jlong pilot);
jint JNICALL spaceSquadCreateSquadId(JNIEnv * env, jobject self);
jint JNICALL spaceSquadRemoveUnit(JNIEnv * env, jobject self, jlong unit);
jint JNICALL spaceSquadCombine(JNIEnv * env, jobject self, jint squadId1, jint squadId2);
jint JNICALL spaceSquadGetSize(JNIEnv * env, jobject self, jint squadId);
jlongArray JNICALL spaceSquadGetUnitList(JNIEnv * env, jobject self, jint squadId);
void JNICALL spaceSquadSetFormation(JNIEnv * env, jobject self, jint squadId, jint formation);
void JNICALL spaceSquadSetFormationSpacing(JNIEnv * env, jobject self, jint squadId, jfloat scale);
jint JNICALL spaceSquadGetFormation(JNIEnv * env, jobject self, jint squadId);
void JNICALL spaceSquadSetLeader(JNIEnv * env, jobject self, jint squadId, jlong unit);
jlong JNICALL spaceSquadGetLeader(JNIEnv * env, jobject self, jint squadId);
void JNICALL spaceSquadIdle(JNIEnv * env, jobject self, jint squadId);
void JNICALL spaceSquadTrack(JNIEnv * env, jobject self, jint squadId, jlong target);
void JNICALL spaceSquadMoveTo(JNIEnv * env, jobject self, jint squadId, jobjectArray path);
void JNICALL spaceSquadAddPatrolPath(JNIEnv * env, jobject self, jint squadId, jobjectArray path);
void JNICALL spaceSquadClearPatrolPath(JNIEnv * env, jobject self, jint squadId);
void JNICALL spaceSquadFollow(JNIEnv * env, jobject self, jint squadId, jlong followedUnit, jobject direction_o, jfloat distance);
void JNICALL spaceSquadSetGuardTarget(JNIEnv * env, jobject self, jint squad, jint targetSquad);
jint JNICALL spaceSquadGetGuardTarget(JNIEnv * env, jobject self, jint squad);
void JNICALL spaceSquadRemoveGuardTarget(JNIEnv * env, jobject self, jint squad);
jboolean JNICALL spaceSquadIsSquadIdValid(JNIEnv *env, jobject self, jint squadId);
void JNICALL setShipAggroDistance(JNIEnv *env, jobject self, jlong shipId, jfloat aggroDistance);
}
using namespace ScriptMethodsPilotNamespace;
//========================================================================
// install
//========================================================================
bool ScriptMethodsPilotNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsPilotNamespace::c)}
JF("__spaceUnitGetBehavior", "(J)I", spaceUnitGetBehavior),
JF("__spaceUnitIdle", "(J)V", spaceUnitIdle),
JF("__spaceUnitTrack", "(JJ)V", spaceUnitTrack),
JF("__spaceUnitMoveTo", "(J[Lscript/transform;)V", spaceUnitMoveTo),
JF("__spaceUnitAddPatrolPath", "(J[Lscript/transform;)V", spaceUnitAddPatrolPath),
JF("__spaceUnitClearPatrolPath", "(J)V", spaceUnitClearPatrolPath),
JF("__spaceUnitFollow", "(JJLscript/vector;F)V", spaceUnitFollow),
JF("__spaceUnitAddDamageTaken", "(JJF)V", spaceUnitAddDamageTaken),
JF("__spaceUnitSetAttackOrders", "(JI)V", spaceUnitSetAttackOrders),
JF("__spaceUnitSetPilotType", "(JLjava/lang/String;)V", spaceUnitSetPilotType),
JF("__spaceUnitGetPilotType", "(J)Ljava/lang/String;", spaceUnitGetPilotType),
JF("__spaceUnitGetPrimaryAttackTarget", "(J)J", spaceUnitGetPrimaryAttackTarget),
JF("__spaceUnitGetAttackTargetList", "(J)[J", spaceUnitGetAttackTargetList),
JF("__spaceUnitGetWhoIsTargetingMe", "(J)[J", spaceUnitGetWhoIsTargetingMe),
JF("__spaceUnitIsAttacking", "(J)Z", spaceUnitIsAttacking),
JF("__spaceUnitRemoveAttackTarget", "(JJ)V", spaceUnitRemoveAttackTarget),
JF("__spaceUnitSetLeashDistance", "(JF)V", spaceUnitSetLeashDistance),
JF("__spaceUnitSetSquadId", "(JI)V", spaceUnitSetSquadId),
JF("__spaceUnitGetSquadId", "(J)I", spaceUnitGetSquadId),
JF("__spaceUnitDock", "(JJF)V", spaceUnitDock),
JF("__spaceUnitUnDock", "(J)V", spaceUnitUnDock),
JF("__spaceUnitIsDocked", "(J)Z", spaceUnitIsDocked),
JF("__spaceUnitIsDocking", "(J)Z", spaceUnitIsDocking),
JF("__spaceUnitSetAutoAggroImmuneTime", "(JF)V", spaceUnitSetAutoAggroImmuneTime),
JF("__spaceUnitIsAutoAggroImmune", "(J)Z", spaceUnitIsAutoAggroImmune),
JF("__spaceUnitSetDamageAggroImmune", "(JZ)V", spaceUnitSetDamageAggroImmune),
JF("__spaceUnitGetDockTransform", "(JJ)Lscript/transform;", spaceUnitGetDockTransform),
JF("__spaceUnitAddExclusiveAggro", "(JJ)V", spaceUnitAddExclusiveAggro),
JF("__spaceUnitRemoveExclusiveAggro", "(JJ)V", spaceUnitRemoveExclusiveAggro),
JF("_spaceSquadCreateSquadId", "()I", spaceSquadCreateSquadId),
JF("__spaceSquadRemoveUnit", "(J)I", spaceSquadRemoveUnit),
JF("_spaceSquadCombine", "(II)I", spaceSquadCombine),
JF("_spaceSquadGetSize", "(I)I", spaceSquadGetSize),
JF("__spaceSquadGetUnitList", "(I)[J", spaceSquadGetUnitList),
JF("_spaceSquadSetFormation", "(II)V", spaceSquadSetFormation),
JF("_spaceSquadSetFormationSpacing", "(IF)V", spaceSquadSetFormationSpacing),
JF("_spaceSquadGetFormation", "(I)I", spaceSquadGetFormation),
JF("__spaceSquadSetLeader", "(IJ)V", spaceSquadSetLeader),
JF("__spaceSquadGetLeader", "(I)J", spaceSquadGetLeader),
JF("_spaceSquadIdle", "(I)V", spaceSquadIdle),
JF("__spaceSquadTrack", "(IJ)V", spaceSquadTrack),
JF("_spaceSquadMoveTo", "(I[Lscript/transform;)V", spaceSquadMoveTo),
JF("_spaceSquadAddPatrolPath", "(I[Lscript/transform;)V", spaceSquadAddPatrolPath),
JF("_spaceSquadClearPatrolPath", "(I)V", spaceSquadClearPatrolPath),
JF("__spaceSquadFollow", "(IJLscript/vector;F)V", spaceSquadFollow),
JF("_spaceSquadSetGuardTarget", "(II)V", spaceSquadSetGuardTarget),
JF("_spaceSquadGetGuardTarget", "(I)I", spaceSquadGetGuardTarget),
JF("_spaceSquadRemoveGuardTarget", "(I)V", spaceSquadRemoveGuardTarget),
JF("_spaceSquadIsSquadIdValid", "(I)Z", spaceSquadIsSquadIdValid),
JF("_setShipAggroDistance", "(JF)V", setShipAggroDistance),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceUnitGetBehavior(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitGetBehavior()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitGetBehavior() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetBehavior() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return aiShipController->getBehaviorType();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsPilotNamespace::spaceUnitGetPrimaryAttackTarget(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitGetPrimaryAttackTarget()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitGetPrimaryAttackTarget() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetPrimaryAttackTarget() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return (aiShipController->getPrimaryAttackTarget()).getValue();
}
// ----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsPilotNamespace::spaceUnitGetAttackTargetList(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitGetAttackTargetList()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitGetAttackTargetList() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetAttackTargetList() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
AiShipAttackTargetList::SortedTargetList targetList;
aiShipController->getAttackTargetList().getSortedTargetList(targetList);
LocalLongArrayRefPtr attackTargetList = createNewLongArray(static_cast<long>(targetList.size()));
AiShipAttackTargetList::SortedTargetList::const_iterator iterTargetList = targetList.begin();
int index = 0;
jlong jlongTmp;
for (; iterTargetList != targetList.end(); ++iterTargetList)
{
jlongTmp = ((iterTargetList->first).getValue());
setLongArrayRegion(*attackTargetList, index, 1, &jlongTmp);
++index;
}
return attackTargetList->getReturnValue();
}
// ----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsPilotNamespace::spaceUnitGetWhoIsTargetingMe(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitGetWhoIsTargetingMe()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitGetWhoIsTargetingMe() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
ShipController * const shipController = shipObject->getController()->asShipController();
if (!shipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetWhoIsTargetingMe() called on unit(%s) without ShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
ShipController::CachedNetworkIdList const & aiTargetingMeList = shipController->getAiTargetingMeList();
#ifdef _DEBUG
if (ConfigServerGame::isSpaceAiLoggingEnabled())
{
ShipController::CachedNetworkIdList::const_iterator iterAiTargetingMeList = aiTargetingMeList.begin();
int index = 0;
for (; iterAiTargetingMeList != aiTargetingMeList.end(); ++iterAiTargetingMeList)
{
LOG("debug_ai", ("ScriptMethodsPilot::spaceUnitGetWhoIsTargetingMe() [%d] unit(%s)", ++index, iterAiTargetingMeList->getValueString().c_str()));
}
}
#endif // _DEBUG
LocalLongArrayRefPtr attackTargetList = createNewLongArray(static_cast<long>(aiTargetingMeList.size()));
ShipController::CachedNetworkIdList::const_iterator iterAiTargetingMeList = aiTargetingMeList.begin();
int index = 0;
jlong jlongTmp;
for (; iterAiTargetingMeList != aiTargetingMeList.end(); ++iterAiTargetingMeList)
{
jlongTmp = (*iterAiTargetingMeList).getValue();
setLongArrayRegion(*attackTargetList, index, 1, &jlongTmp);
++index;
}
return attackTargetList->getReturnValue();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPilotNamespace::spaceUnitIsAttacking(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitIsAttacking()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitIsAttacking() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitIsAttacking() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return aiShipController->isAttacking();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitIdle(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitIdle()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitIdle() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitIdle() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
aiShipController->idle();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitTrack(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jlong jobject_target)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitTrack()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitTrack() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitTrack() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
Object * target = nullptr;
if (!JavaLibrary::getObject(jobject_target, target))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitTrack() The target did not resolve to an Object"));
return;
}
aiShipController->track(*target);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitMoveTo(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jobjectArray jobjectArray_path)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitMoveTo()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitMoveTo() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitMoveTo() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
//-- Convert the path
AiShipController::TransformList convertedPath;
if (!ScriptConversion::convert(jobjectArray_path, convertedPath))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitMoveTo() unit(%s) scene(%s) Failed to convert the path to a vector of transforms.", shipObject->getDebugInformation().c_str(), ServerWorld::getSceneId().c_str()));
return;
}
if (convertedPath.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitMoveTo() unit(%s) scene(%s) Specifying an empty path transform list. Are you sure you wanted to do that?", shipObject->getDebugInformation().c_str(), ServerWorld::getSceneId().c_str()));
return;
}
SpacePath * const path = SpacePathManager::fetch(nullptr, aiShipController->getOwner(), aiShipController->getShipRadius());
AiShipController::TransformList::const_iterator iterTransformList = convertedPath.begin();
for (; iterTransformList != convertedPath.end(); ++iterTransformList)
{
path->addTransform(*iterTransformList);
}
aiShipController->moveTo(path);
SpacePathManager::release(path, aiShipController->getOwner());
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitAddPatrolPath(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jobjectArray jobjectArray_path)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddPatrolPath()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitAddPatrolPath() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddPatrolPath() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
//-- Convert the path
AiShipController::TransformList convertedPath;
if (!ScriptConversion::convert(jobjectArray_path, convertedPath))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddPatrolPath() unit(%s) scene(%s) Failed to convert the path to a vector of transforms.", shipObject->getDebugInformation().c_str(), ServerWorld::getSceneId().c_str()));
return;
}
if (convertedPath.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddPatrolPath() unit(%s) scene(%s) Specifying an empty path transform list. Are you sure you wanted to do that?", shipObject->getDebugInformation().c_str(), ServerWorld::getSceneId().c_str()));
return;
}
SpacePath * const path = SpacePathManager::fetch(aiShipController->getPath(), aiShipController->getOwner(), aiShipController->getShipRadius());
AiShipController::TransformList::const_iterator iterTransformList = convertedPath.begin();
for (; iterTransformList != convertedPath.end(); ++iterTransformList)
{
path->addTransform(*iterTransformList);
}
aiShipController->addPatrolPath(path);
SpacePathManager::release(path, aiShipController->getOwner());
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitClearPatrolPath(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitClearPatrolPath()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitClearPatrolPath() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitClearPatrolPath() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
aiShipController->clearPatrolPath();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitFollow(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jlong jobject_followedUnit, jobject jobject_direction_o, jfloat jfloat_distance)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitFollow()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitFollow() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitFollow() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
Object * followedUnit = nullptr;
if (!JavaLibrary::getObject(jobject_followedUnit, followedUnit))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitFollow() followedUnit did not resolve to an Object"));
return;
}
Vector direction_o;
if (!ScriptConversion::convert(jobject_direction_o, direction_o))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitFollow() direction did not resolve to a Vector"));
return;
}
NetworkId const followedUnitId(jobject_followedUnit);
if (followedUnitId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitFollow() DB failed to convert parameter 2 (followedUnit) to NetworkId"));
return;
}
aiShipController->follow(followedUnitId, direction_o, jfloat_distance);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitAddDamageTaken(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jlong jobject_targetUnit, jfloat jfloat_damage)
{
if (!verifyShipsEnabled())
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddDamageTaken() ERROR: Ships are disabled."));
return;
}
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitAddDamageTaken() unit did not resolve to a ShipObject");
if (!shipObject)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddDamageTaken() ERROR: Unable to resolve the attacking unit to a ShipObject."));
return;
}
ShipObject * const targetShipObject = JavaLibrary::getShipThrow(env, jobject_targetUnit, "ScriptMethodsPilot::spaceUnitAddDamageTaken() targetUnit did not resolve to a ShipObject");
if (!targetShipObject)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddDamageTaken() ERROR: Unable to resolve target_unit to a ShipObject."));
return;
}
if (shipObject->getNetworkId() == targetShipObject->getNetworkId())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddDamageTaken() unit(%s) is attempting to attack itself", shipObject->getNetworkId().getValueString().c_str()));
return;
}
{
float const chassisHitPointsCurrent = targetShipObject->getCurrentChassisHitPoints();
float const chassisHitPointsMaximum = targetShipObject->getMaximumChassisHitPoints();
float const currentChassisPercent = (chassisHitPointsMaximum > 0.0f) ? (chassisHitPointsCurrent / chassisHitPointsMaximum) * 100.0f : -1.0f;
float const frontArmorCurrent = targetShipObject->getComponentHitpointsCurrent(ShipChassisSlotType::SCST_armor_0);
float const frontArmorMaximum = targetShipObject->getComponentHitpointsMaximum(ShipChassisSlotType::SCST_armor_0);
float const frontArmorPercent = (frontArmorMaximum > 0.0f) ? (frontArmorCurrent / frontArmorMaximum) * 100.0f : -1.0f;
float const backArmorCurrent = targetShipObject->getComponentHitpointsCurrent(ShipChassisSlotType::SCST_armor_1);
float const backArmorMaximum = targetShipObject->getComponentHitpointsMaximum(ShipChassisSlotType::SCST_armor_1);
float const backArmorPercent = (backArmorMaximum > 0.0f) ? (backArmorCurrent / backArmorMaximum) * 100.0f : -1.0f;
float const frontShieldCurrent = targetShipObject->getShieldHitpointsFrontCurrent();
float const frontShieldMaximum = targetShipObject->getShieldHitpointsFrontMaximum();
float const frontShieldPercent = (frontShieldMaximum > 0.0f) ? (frontShieldCurrent / frontShieldMaximum) * 100.0f : -1.0f;
float const backShieldCurrent = targetShipObject->getShieldHitpointsFrontCurrent();
float const backShieldMaximum = targetShipObject->getShieldHitpointsBackMaximum();
float const backShieldPercent = (backShieldMaximum > 0.0f) ? (backShieldCurrent / backShieldMaximum) * 100.0f : -1.0f;
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddDamageTaken() target(%s) dmg(%.2f) ch(%.0f) af(%.0f) ab(%.0f) sf(%.0f) sb(%.0f)", targetShipObject->getNetworkId().getValueString().c_str(), jfloat_damage, currentChassisPercent, frontArmorPercent, backArmorPercent, frontShieldPercent, backShieldPercent));
}
ShipController * const shipController = shipObject->getController()->asShipController();
AiShipController * const aiShipController = (shipController != nullptr) ? shipController->asAiShipController() : nullptr;
bool const verifyAttacker = true;
if (aiShipController != nullptr)
{
// This adds damage to an AI unit
bool const notifySquad = true;
bool const checkPlayerAttacker = true;
if (!aiShipController->addDamageTaken(targetShipObject->getNetworkId(), jfloat_damage, verifyAttacker, notifySquad, checkPlayerAttacker))
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddDamageTaken() targetUnit(%s) is not attackable", targetShipObject->getNetworkId().getValueString().c_str()));
}
}
else if (shipController != nullptr)
{
// This adds damage to a player unit
if (!shipController->addDamageTaken(targetShipObject->getNetworkId(), jfloat_damage, verifyAttacker))
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddDamageTaken() targetUnit(%s) is not attackable", targetShipObject->getNetworkId().getValueString().c_str()));
}
}
else
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddDamageTaken() unit(%s) Why does this ship not have a ShipController?", shipObject->getNetworkId().getValueString().c_str()));
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitSetAttackOrders(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jint jint_attackOrders)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitSetAttackOrder()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitSetAttackOrder() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitSetAttackOrder() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
if ( (jint_attackOrders < 0)
|| (jint_attackOrders >= static_cast<int>(AiShipController::AO_count)))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitSetAttackOrder() called on unit(%s) with out of range attack orders %d valid range [0...%d]", shipObject->getNetworkId().getValueString().c_str(), jint_attackOrders, static_cast<int>(AiShipController::AO_count) - 1));
return;
}
aiShipController->setAttackOrders(static_cast<AiShipController::AttackOrders>(jint_attackOrders));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitSetPilotType(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jstring jstring_pilotType)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitSetPilotType()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitSetPilotType() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitSetPilotType() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
JavaStringParam javaStringParam_pilotType (jstring_pilotType);
std::string pilotType;
if (!JavaLibrary::convert (javaStringParam_pilotType, pilotType))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitSetPilotType() DB failed to convert parameter 2 (pilotType) to string"));
return;
}
if (pilotType.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::spaceUnitSetPilotType empty pilotType for ship [%s]",
shipObject ? shipObject->getDebugInformation().c_str() : "NONE"));
return;
}
aiShipController->setPilotType(pilotType);
}
// ----------------------------------------------------------------------
jstring JNICALL ScriptMethodsPilotNamespace::spaceUnitGetPilotType(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitGetPilotType()"));
if (!verifyShipsEnabled())
return nullptr;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitGetPilotType() unit did not resolve to a ShipObject");
if (!shipObject)
return nullptr;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetPilotType() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return JavaString(aiShipController->getPilotType()).getReturnValue();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitRemoveAttackTarget(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jlong jobject_targetUnit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitRemoveAttackTarget()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitRemoveAttackTarget() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitRemoveAttackTarget() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
NetworkId const targetUnit(jobject_targetUnit);
if (targetUnit == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitRemoveAttackTarget() DB failed to convert parameter 2 (targetUnit) to NetworkId"));
return;
}
if (targetUnit == shipObject->getNetworkId())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitRemoveAttackTarget() unit(%s) is attempting to remove itself from its target list", shipObject->getNetworkId().getValueString().c_str()));
return;
}
if (!aiShipController->removeAttackTarget(targetUnit))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitRemoveAttackTarget() The targetUnit(%s) is not in the units(%s) target list", targetUnit.getValueString().c_str(), shipObject->getNetworkId().getValueString().c_str()));
}
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitSetLeashDistance(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jfloat jfloat_radius)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitSetLeashDistance()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitSetLeashDistance() unit did not resolve to a ShipObject");
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitSetLeashDistance() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
aiShipController->setLeashRadius(jfloat_radius);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitSetSquadId(JNIEnv * /*env*/, jobject /*self*/, jlong jobject_unit, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitSetSquadId()"));
if (!verifyShipsEnabled())
return;
NetworkId unit(jobject_unit);
if (!SpaceSquadManager::setSquadId(unit, jint_squadId))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitSetSquadId() called on unit(%s) without AiShipController", unit.getValueString().c_str()));
}
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceUnitGetSquadId(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitGetSquadId()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitGetSquadId() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetSquadId() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return aiShipController->getSquad().getId();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadMoveTo(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId, jobjectArray jobjectArray_path)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadMoveTo()"));
if (!verifyShipsEnabled())
return;
//-- Convert the path
AiShipController::TransformList convertedPath;
if (!ScriptConversion::convert(jobjectArray_path, convertedPath))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadMoveTo() squadId(%d) scene(%s) Failed to convert the path to a vector of transforms.", jint_squadId, ServerWorld::getSceneId().c_str()));
return;
}
if (convertedPath.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadMoveTo() squadId(%d) scene(%s) Specifying an empty path transform list. Are you sure you wanted to do that?", jint_squadId, ServerWorld::getSceneId().c_str()));
return;
}
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadMoveTo() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
float const largestShipRadius = squad->getLargestShipRadius();
SpacePath * const path = SpacePathManager::fetch(nullptr, squad, largestShipRadius);
AiShipController::TransformList::const_iterator iterTransformList = convertedPath.begin();
for (; iterTransformList != convertedPath.end(); ++iterTransformList)
{
path->addTransform(*iterTransformList);
}
squad->moveTo(path);
SpacePathManager::release(path, squad);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadAddPatrolPath(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId, jobjectArray jobjectArray_path)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadAddPatrolPath()"));
if (!verifyShipsEnabled())
return;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadAddPatrolPath() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
//-- Convert the path
AiShipController::TransformList convertedPath;
if (!ScriptConversion::convert(jobjectArray_path, convertedPath))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadAddPatrolPath() squadId(%d) scene(%s) Failed to convert the path to a vector of transforms.", jint_squadId, ServerWorld::getSceneId().c_str()));
return;
}
if (convertedPath.empty())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadAddPatrolPath() squadId(%d) scene(%s) Specifying an empty path transform list. Are you sure you wanted to do that?", jint_squadId, ServerWorld::getSceneId().c_str()));
return;
}
//-- Add the transforms to the path
float const largestShipRadius = squad->getLargestShipRadius();
SpacePath * const path = SpacePathManager::fetch(squad->getPath(), squad, largestShipRadius);
AiShipController::TransformList::const_iterator iterTransformList = convertedPath.begin();
for (; iterTransformList != convertedPath.end(); ++iterTransformList)
{
path->addTransform(*iterTransformList);
}
//-- Patrol
squad->addPatrolPath(path);
SpacePathManager::release(path, squad);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceSquadCreateSquadId(JNIEnv * /*env*/, jobject /*self*/)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadCreateSquadId()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
return SpaceSquadManager::createSquadId();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceSquadRemoveUnit(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadRemoveUnit()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceSquadRemoveUnit() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadRemoveUnit() called on unit(%s) without AiShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
SpaceSquad * const squad = SpaceSquadManager::createSquad();
IGNORE_RETURN(SpaceSquadManager::setSquadId(shipObject->getNetworkId(), squad->getId()));
return squad->getId();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceSquadCombine(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId1, jint jint_squadId2)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadCombine()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
SpaceSquad * const squad1 = SpaceSquadManager::getSquad(jint_squadId1);
if (!squad1)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadCombine() Unable to resolve squadId1(%d) to a SpaceSquad", jint_squadId1));
return JNI_FALSE;
}
SpaceSquad * const squad2 = SpaceSquadManager::getSquad(jint_squadId2);
if (!squad2)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadCombine() Unable to resolve squadId2(%d) to a SpaceSquad", jint_squadId2));
return JNI_FALSE;
}
squad1->combineWith(*squad2);
return squad1->getId();
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceSquadGetSize(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadGetSize()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadGetSize() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return JNI_FALSE;
}
return squad->getUnitCount();
}
// ----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsPilotNamespace::spaceSquadGetUnitList(JNIEnv * env, jobject /*self*/, jint jint_squadId)
{
UNREF(env);
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadGetUnitList()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadGetUnitList() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return JNI_FALSE;
}
SpaceSquad::UnitList unitList;
squad->getUnitList(unitList);
LocalLongArrayRefPtr resultUnitList = createNewLongArray(static_cast<long>(unitList.size()));
SpaceSquad::UnitList::const_iterator iterUnitList = unitList.begin();
int index = 0;
jlong jlongTmp;
for (; iterUnitList != unitList.end(); ++iterUnitList)
{
jlongTmp = (*iterUnitList).getValue();
setLongArrayRegion(*resultUnitList, index, 1, &jlongTmp);
++index;
}
return resultUnitList->getReturnValue();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadSetFormation(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId, jint jint_formation)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadSetFormation()"));
if (!verifyShipsEnabled())
return;
if ( (jint_formation <= static_cast<int>(Formation::S_invalid))
|| (jint_formation >= static_cast<int>(Formation::S_count)))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetFormation() Invalid formation(%d) specified", jint_formation));
return;
}
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetFormation() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
squad->getFormation().setShape(static_cast<Formation::Shape>(jint_formation));
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadSetFormationSpacing(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId, jfloat jfloat_scale)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadSetFormationSpacing()"));
if (!verifyShipsEnabled())
return;
if (jfloat_scale < 1.0f)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetFormationSpacing() Invalid scale specified(%.2f) specified. Valid range is [1.0f...n]", jfloat_scale));
return;
}
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetFormationSpacing() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
squad->getFormation().setSpacing(jfloat_scale);
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceSquadGetFormation(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadGetFormation()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadGetFormation() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return JNI_FALSE;
}
return static_cast<int>(squad->getFormation().getShape());
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadIdle(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadIdle()"));
if (!verifyShipsEnabled())
return;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadIdle() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
squad->idle();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadTrack(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId, jlong jobject_target)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadTrack()"));
if (!verifyShipsEnabled())
return;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadTrack() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
Object * target = nullptr;
if (!JavaLibrary::getObject(jobject_target, target))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadTrack() The target did not resolve to an Object"));
return;
}
squad->track(*target);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadSetLeader(JNIEnv * env, jobject /*self*/, jint jint_squadId, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadSetLeader()"));
if (!verifyShipsEnabled())
return;
ShipObject * const leaderShipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceSquadSetLeader() unit did not resolve to a ShipObject");
if (!leaderShipObject)
return;
AiShipController * const aiShipController = (leaderShipObject->getController()->asShipController() != nullptr) ? leaderShipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetLeader() called on unit(%s) without AiShipController", leaderShipObject->getNetworkId().getValueString().c_str()));
return;
}
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetLeader() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
bool const rebuildFormation = true;
if (!squad->setLeader(leaderShipObject->getNetworkId(), rebuildFormation))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetLeader() The specified leader(%s) is not a member of the squad(%i).", leaderShipObject->getNetworkId().getValueString().c_str(), jint_squadId));
}
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsPilotNamespace::spaceSquadGetLeader(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadGetLeader()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadGetLeader() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return JNI_FALSE;
}
return (squad->getLeader()).getValue();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadClearPatrolPath(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadClearPatrolPath()"));
if (!verifyShipsEnabled())
return;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadClearPatrolPath() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
squad->clearPatrolPath();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadFollow(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId, jlong jobject_followedUnit, jobject jobject_direction_o, jfloat jfloat_distance)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadFollow()"));
if (!verifyShipsEnabled())
return;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadFollow() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
Object * followedUnit = nullptr;
if (!JavaLibrary::getObject(jobject_followedUnit, followedUnit))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadFollow() followedUnit did not resolve to an Object"));
return;
}
Vector direction_o;
if (!ScriptConversion::convert(jobject_direction_o, direction_o))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadFollow() direction did not resolve to a Vector"));
return;
}
NetworkId const followedUnitId(jobject_followedUnit);
if (followedUnitId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadFollow() DB failed to convert parameter 2 (followedUnit) to NetworkId"));
return;
}
squad->follow(followedUnitId, direction_o, jfloat_distance);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitDock(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jlong jobject_dockTarget, jfloat jfloat_timeAtDock)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitDock()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitDock() The unit did not resolve to a ShipObject");
if (!shipObject)
return;
ShipController * const shipController = shipObject->getController()->asShipController();
if (!shipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitDock() called on unit(%s) without ShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
ShipObject * const targetShipObject = JavaLibrary::getShipThrow(env, jobject_dockTarget, "ScriptMethodsPilot::spaceUnitDock() The dockTarget did not resolve to a ShipObject");
if (!targetShipObject)
return;
ShipController * const targetShipController = targetShipObject->getController()->asShipController();
if (!targetShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitDock() called on target(%s) without ShipController", targetShipObject->getNetworkId().getValueString().c_str()));
return;
}
shipController->dock(*targetShipObject, jfloat_timeAtDock);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitUnDock(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitUnDock()"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitUnDock() unit did not resolve to a ShipObject");
if (!shipObject)
return;
ShipController * const shipController = shipObject->getController()->asShipController();
if (!shipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitUnDock() called on unit(%s) without a ShipController", shipObject->getNetworkId().getValueString().c_str()));
return;
}
shipController->unDock();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPilotNamespace::spaceUnitIsDocked(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitDock()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitDock() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
ShipController * const shipController = shipObject->getController()->asShipController();
if (!shipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitIsDocked() called on unit(%s) without ShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return shipController->isDocked();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPilotNamespace::spaceUnitIsDocking(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitIsDocking()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitIsDocking() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
ShipController * const shipController = shipObject->getController()->asShipController();
if (!shipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitIsDocking() called on unit(%s) without ShipController", shipObject->getNetworkId().getValueString().c_str()));
return JNI_FALSE;
}
return shipController->isDocking();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadSetGuardTarget(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId, jint jint_targetSquadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadSetGuardTarget()"));
if (!verifyShipsEnabled())
return;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetGuardTarget() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
if (!squad->setGuardTarget(jint_targetSquadId))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadSetGuardTarget() Unable to resolve targetSquadId(%d) to a SpaceSquad", jint_targetSquadId));
}
}
// ----------------------------------------------------------------------
jint JNICALL ScriptMethodsPilotNamespace::spaceSquadGetGuardTarget(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadGetGuardTarget()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadGetGuardTarget() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return JNI_FALSE;
}
if (squad->getGuardTarget() == nullptr)
{
return 0;
}
return squad->getGuardTarget()->getId();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceSquadRemoveGuardTarget(JNIEnv * /*env*/, jobject /*self*/, jint jint_squadId)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceSquadRemoveGuardTarget()"));
if (!verifyShipsEnabled())
return;
SpaceSquad * const squad = SpaceSquadManager::getSquad(jint_squadId);
if (!squad)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceSquadRemoveGuardTarget() Unable to resolve squadId(%d) to a SpaceSquad", jint_squadId));
return;
}
squad->removeGuardTarget();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPilotNamespace::spaceSquadIsSquadIdValid(JNIEnv * env, jobject /*self*/, jint squadId)
{
if (SpaceSquadManager::getSquad(squadId))
return static_cast<jboolean>(JNI_TRUE);
return static_cast<jboolean>(JNI_FALSE);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::setShipAggroDistance(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jfloat jfloat_aggroRadius)
{
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::setShipAggroDistance(): jobject_unit did not resolve to a ShipObject", false);
if (!shipObject)
return;
AiShipController * const aiShipController = (shipObject->getController()->asShipController() != nullptr) ? shipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!aiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::setShipAggroDistance(): unit(%s) does not have an AiShipController",shipObject->getNetworkId().getValueString().c_str()));
return;
}
TerrainObject const * const terrain = TerrainObject::getInstance();
if (!terrain)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::setShipAggroDistance(): unit(%s) Unable to get the terrain object to determine the map side length.",shipObject->getNetworkId().getValueString().c_str()));
return;
}
if (jfloat_aggroRadius > terrain->getMapWidthInMeters())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::setShipAggroDistance(): unit(%s) aggroRadius(%f) > mapSideLength(%f).",shipObject->getNetworkId().getValueString().c_str(), jfloat_aggroRadius, terrain->getMapWidthInMeters()));
return;
}
if (jfloat_aggroRadius <= 1.0f)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::setShipAggroDistance(): unit(%s) aggroRadius(%f) <= 1.",shipObject->getNetworkId().getValueString().c_str(), jfloat_aggroRadius));
return;
}
aiShipController->setAggroRadius(jfloat_aggroRadius);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitSetAutoAggroImmuneTime(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jfloat jfloat_time)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitSetAutoAggroImmuneTime() time(%.2f)", jfloat_time));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitSetAutoAggroImmuneTime() unit did not resolve to a ShipObject");
if (!shipObject)
return;
if ( (jfloat_time < 0.0f)
&& !WithinEpsilonInclusive(-1.0f, jfloat_time, 0.00001f))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitSetAutoAggroImmuneTime(): unit(%s) The time(%f) must be >= 0.0f", shipObject->getNetworkId().getValueString().c_str(), jfloat_time));
return;
}
shipObject->setAutoAggroImmuneTime(jfloat_time);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsPilotNamespace::spaceUnitIsAutoAggroImmune(JNIEnv * env, jobject /*self*/, jlong jobject_unit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitIsAutoAggroImmune()"));
if (!verifyShipsEnabled())
return JNI_FALSE;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitIsAutoAggroImmune() unit did not resolve to a ShipObject");
if (!shipObject)
return JNI_FALSE;
return shipObject->isAutoAggroImmune();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitSetDamageAggroImmune(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jboolean jboolean_enabled)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitSetDamageAggroImmune() enabled(%s)", jboolean_enabled ? "yes" : "no"));
if (!verifyShipsEnabled())
return;
ShipObject * const shipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitSetDamageAggroImmune() unit did not resolve to a ShipObject");
if (!shipObject)
return;
shipObject->setDamageAggroImmune(jboolean_enabled);
}
// ----------------------------------------------------------------------
jobject JNICALL ScriptMethodsPilotNamespace::spaceUnitGetDockTransform(JNIEnv * /*env*/, jobject /*self*/, jlong jobject_dockTarget, jlong jobject_dockingUnit)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitGetDockTransform()"));
if (!verifyShipsEnabled())
return 0;
Object * dockTarget = nullptr;
if (!JavaLibrary::getObject(jobject_dockTarget, dockTarget))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetDockTransform() dockTarget did not resolve to an Object"));
return 0;
}
Object * dockingUnit = nullptr;
if (!JavaLibrary::getObject(jobject_dockingUnit, dockingUnit))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitGetDockTransform() dockingUnit did not resolve to an Object"));
return 0;
}
Transform dockHardPoint;
SpaceDockingManager::HardPointList approachHardPointList;
SpaceDockingManager::HardPointList exitHardPointList;
SpaceDockingManager::fetchDockingProcedure(*dockingUnit, *dockTarget, dockHardPoint, approachHardPointList, exitHardPointList);
SpaceDockingManager::releaseDockingProcedure(dockingUnit->getNetworkId(), dockTarget->getNetworkId());
LocalRefPtr transform;
if (ScriptConversion::convert(dockHardPoint, transform))
return transform->getReturnValue();
return 0;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitAddExclusiveAggro(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jlong jobject_pilot)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitAddExclusiveAggro()"));
if (!verifyShipsEnabled())
return;
ShipObject * const unitShipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitAddExclusiveAggro() unit did not resolve to a ShipObject");
if (!unitShipObject)
{
return;
}
AiShipController * const unitAiShipController = (unitShipObject->getController()->asShipController() != nullptr) ? unitShipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!unitAiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddExclusiveAggro() called on unit(%s) without AiShipController", unitShipObject->getDebugInformation().c_str()));
return;
}
Object * pilotObject = nullptr;
if (!JavaLibrary::getObject(jobject_pilot, pilotObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddExclusiveAggro() pilot did not resolve to an Object"));
return;
}
ServerObject * const pilotServerObject = pilotObject->asServerObject();
if ( !pilotServerObject
|| !pilotServerObject->isPlayerControlled())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitAddExclusiveAggro() pilot(%s) did not resolve to player-controlled ServerObject", pilotObject->getDebugInformation().c_str()));
return;
}
unitAiShipController->addExclusiveAggro(pilotObject->getNetworkId());
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsPilotNamespace::spaceUnitRemoveExclusiveAggro(JNIEnv * env, jobject /*self*/, jlong jobject_unit, jlong jobject_pilot)
{
LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "debug_ai", ("ScriptMethodsPilot::spaceUnitRemoveExclusiveAggro()"));
if (!verifyShipsEnabled())
return;
ShipObject * const unitShipObject = JavaLibrary::getShipThrow(env, jobject_unit, "ScriptMethodsPilot::spaceUnitRemoveExclusiveAggro() unit did not resolve to a ShipObject");
if (!unitShipObject)
{
return;
}
AiShipController * const unitAiShipController = (unitShipObject->getController()->asShipController() != nullptr) ? unitShipObject->getController()->asShipController()->asAiShipController() : nullptr;
if (!unitAiShipController)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitRemoveExclusiveAggro() called on unit(%s) without AiShipController", unitShipObject->getDebugInformation().c_str()));
return;
}
Object * pilotObject = nullptr;
if (!JavaLibrary::getObject(jobject_pilot, pilotObject))
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitRemoveExclusiveAggro() pilot did not resolve to an Object"));
return;
}
ServerObject * const pilotServerObject = pilotObject->asServerObject();
if ( !pilotServerObject
|| !pilotServerObject->isPlayerControlled())
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsPilot::spaceUnitRemoveExclusiveAggro() pilot(%s) did not resolve to player-controlled ServerObject", pilotObject->getDebugInformation().c_str()));
return;
}
unitAiShipController->removeExclusiveAggro(pilotObject->getNetworkId());
}
// ======================================================================