Files
src-1.2/engine/server/library/serverScript/src/shared/ScriptMethodsHateList.cpp
T

461 lines
20 KiB
C++
Executable File

// ======================================================================
//
// ScriptMethodsHateList.cpp
// Copyright 2005 Sony Online Eentertainment, Inc.
// All rights reserved.
//
// ======================================================================
#include "serverScript/FirstServerScript.h"
#include "serverScript/JavaLibrary.h"
#include "serverGame/AiLogManager.h"
#include "serverGame/ConfigServerGame.h"
#include "serverGame/CreatureObject.h"
#include "serverGame/HateList.h"
#include "serverGame/PlayerCreatureController.h"
#include "serverGame/PlayerObject.h"
#include "serverGame/TangibleObject.h"
#include "sharedLog/Log.h"
using namespace JNIWrappersNamespace;
// ======================================================================
// ScriptMethodsHateListNamespace
// ======================================================================
namespace ScriptMethodsHateListNamespace
{
bool install();
void JNICALL setAggroImmuneDuration(JNIEnv * env, jobject self, jlong player, jint duration);
jboolean JNICALL isAggroImmune(JNIEnv * env, jobject self, jlong player);
void JNICALL addHate(JNIEnv * env, jobject self, jlong object, jlong hateTarget, jfloat hate);
void JNICALL addHateDot(JNIEnv * env, jobject self, jlong object, jlong hateTarget, jfloat hate, jint seconds);
void JNICALL setHate(JNIEnv * env, jobject self, jlong object, jlong hateTarget, jfloat hate);
void JNICALL removeHateTarget(JNIEnv * env, jobject self, jlong object, jlong hateTarget);
jfloat JNICALL getHate(JNIEnv * env, jobject self, jlong object, jlong hateTarget);
jfloat JNICALL getMaxHate(JNIEnv * env, jobject self, jlong object);
void JNICALL clearHateList(JNIEnv * env, jobject self, jlong object);
jlong JNICALL getHateTarget(JNIEnv * env, jobject self, jlong object);
jlongArray JNICALL getHateList(JNIEnv * env, jobject self, jlong object);
jboolean JNICALL isOnHateList(JNIEnv * env, jobject self, jlong object, jlong target);
void JNICALL resetHateTimer(JNIEnv * env, jobject self, jlong object);
void JNICALL setAILeashTime(JNIEnv * env, jobject self, jlong object, jfloat time);
jfloat JNICALL getAILeashTime(JNIEnv * env, jobject self, jlong object);
void JNICALL forceHateTarget(JNIEnv * env, jobject self, jlong object, jlong target);
}
//========================================================================
// install
//========================================================================
bool ScriptMethodsHateListNamespace::install()
{
const JNINativeMethod NATIVES[] = {
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsHateListNamespace::c)}
JF("_setAggroImmuneDuration", "(JI)V", setAggroImmuneDuration),
JF("_isAggroImmune", "(J)Z", isAggroImmune),
JF("_addHate", "(JJF)V", addHate),
JF("_addHateDot", "(JJFI)V", addHateDot),
JF("_setHate", "(JJF)V", setHate),
JF("_removeHateTarget", "(JJ)V", removeHateTarget),
JF("_getHate", "(JJ)F", getHate),
JF("_getMaxHate", "(J)F", getMaxHate),
JF("_clearHateList", "(J)V", clearHateList),
JF("_getHateTarget", "(J)J", getHateTarget),
JF("_getHateList", "(J)[J", getHateList),
JF("_isOnHateList", "(JJ)Z", isOnHateList),
JF("_resetHateTimer", "(J)V", resetHateTimer),
JF("_setAILeashTime", "(JF)V", setAILeashTime),
JF("_getAILeashTime", "(J)F", getAILeashTime),
JF("_forceHateTarget", "(JJ)V", forceHateTarget),
};
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
}
// ======================================================================
//
// ScriptMethodsHateList
//
// ======================================================================
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::setAggroImmuneDuration(JNIEnv * /*env*/, jobject /*self*/, jlong player, jint duration)
{
NetworkId const playerNetworkId(player);
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(CreatureObject::getCreatureObject(playerNetworkId));
if (playerObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setAggroImmuneDuration() player(%s) Unable to resolve the object to a PlayerObject.", playerNetworkId.getValueString().c_str()));
return;
}
playerObject->setAggroImmuneDuration(duration);
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsHateListNamespace::isAggroImmune(JNIEnv * /*env*/, jobject /*self*/, jlong player)
{
NetworkId const playerNetworkId(player);
PlayerObject * const playerObject = PlayerCreatureController::getPlayerObject(CreatureObject::getCreatureObject(playerNetworkId));
if (playerObject == NULL)
{
return JNI_FALSE;
}
return playerObject->isAggroImmune();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::addHate(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget, jfloat hate)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHate() object(%s) hateTarget(%s) hate(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHate() object(%s) hate(%.2f) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hate, hateTargetNetworkId.getValueString().c_str()));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHate() object(%s) hateTarget(%s) hate(%.2f) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
objectTangibleObject->addHate(hateTargetNetworkId, hate);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::addHateDot(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget, jfloat hate, jint seconds)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHateDot() object(%s) hateTarget(%s) hate(%.2f) seconds(%d) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate, seconds));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHateDot() object(%s) hate(%.2f) seconds(%d) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate, seconds));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::addHateDot() object(%s) hateTarget(%s) hate(%.2f) seconds(%d) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate, seconds));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::addHateDot() object(%s) hateTarget(%s) hate(%.2f+%.2f) seconds(%d)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), objectTangibleObject->getHate(hateTargetNetworkId), hate, seconds));
objectTangibleObject->addHateOverTime(hateTargetNetworkId, hate, seconds);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::setHate(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget, jfloat hate)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
WARNING(true, ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f) Unable to resolve the hateTarget to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::setHate() object(%s) hateTarget(%s) hate(%.2f)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str(), hate));
objectTangibleObject->setHate(hateTargetNetworkId, hate);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::removeHateTarget(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
WARNING(true, ("ScriptMethodsHateList::removeHateTarget() object(%s) hateTarget(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::removeHateTarget() object(%s) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::removeHateTarget() object(%s) hateTarget(%s) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::removeHateTarget() object(%s) hateTarget(%s)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
objectTangibleObject->removeHateTarget(hateTargetNetworkId);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsHateListNamespace::getHate(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong hateTarget)
{
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(hateTarget);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getHate() object(%s) hateTarget(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return 0.0f;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::getHate() object(%s) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return 0.0f;
}
if (networkId == hateTargetNetworkId)
{
return 0.0f;
}
return objectTangibleObject->getHate(hateTargetNetworkId);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsHateListNamespace::getMaxHate(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getMaxHate() object(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str()));
return 0.0f;
}
float const maxHate = objectTangibleObject->getMaxHate();
return maxHate;
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::clearHateList(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::clearHateList() Unable to resolve the object(%s) to a TangibleObject.", networkId.getValueString().c_str()));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::clearHateList() object(%s)", networkId.getValueString().c_str()));
objectTangibleObject->clearHateList();
}
// ----------------------------------------------------------------------
jlong JNICALL ScriptMethodsHateListNamespace::getHateTarget(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getHateTarget() Unable to resolve the object(%s) to a TangibleObject.", networkId.getValueString().c_str()));
return 0;
}
CachedNetworkId const & hateTarget = objectTangibleObject->getHateTarget();
return hateTarget.getValue();
}
// ----------------------------------------------------------------------
jlongArray JNICALL ScriptMethodsHateListNamespace::getHateList(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::getHateList() object(%s)", networkId.getValueString().c_str()));
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::getHateList() Unable to resolve the object(%s) to a TangibleObject.", networkId.getValueString().c_str()));
return 0;
}
HateList::SortedList sortedHateList;
objectTangibleObject->getSortedHateList(sortedHateList);
LocalLongArrayRefPtr hateList = createNewLongArray(static_cast<long>(sortedHateList.size()));
HateList::SortedList::const_iterator iterSortedHateList = sortedHateList.begin();
int index = 0;
jlong jlongTmp;
for (; iterSortedHateList != sortedHateList.end(); ++iterSortedHateList)
{
jlongTmp = (iterSortedHateList->first).getValue();
setLongArrayRegion(*hateList, index, 1, &jlongTmp);
++index;
}
return hateList->getReturnValue();
}
// ----------------------------------------------------------------------
jboolean JNICALL ScriptMethodsHateListNamespace::isOnHateList(JNIEnv * /*env*/, jobject /*self*/, jlong object, jlong target)
{
NetworkId const networkId(object);
NetworkId const targetNetworkId(target);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::isOnHateList() object(%s) target(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), targetNetworkId.getValueString().c_str()));
return JNI_FALSE;
}
if (targetNetworkId == NetworkId::cms_invalid)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::isOnHateList() object(%s) Unable to resolve the target(%s) to a NetworkId.", networkId.getValueString().c_str(), targetNetworkId.getValueString().c_str()));
return JNI_FALSE;
}
return objectTangibleObject->isOnHateList(targetNetworkId);
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::resetHateTimer(JNIEnv * /*env*/, jobject /*self*/, jlong object)
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::resetHateTimer() object(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str()));
return;
}
objectTangibleObject->resetHateTimer();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::setAILeashTime(JNIEnv * /*env*/, jobject /*self*/, jlong object, jfloat time )
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setAILeashTime() object(%s) time(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), time));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai",
("ScriptMethodsHateList::setAILeashTime() object(%s) time(%f)",
networkId.getValueString().c_str(),
time
));
objectTangibleObject->setAILeashTime(time);
}
// ----------------------------------------------------------------------
jfloat JNICALL ScriptMethodsHateListNamespace::getAILeashTime(JNIEnv * /*env*/, jobject /*self*/, jlong object )
{
NetworkId const networkId(object);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::setAILeashTime() object(%s) time(%.2f) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), time));
return 0.0;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai",
("ScriptMethodsHateList::setAILeashTime() object(%s) time(%f)",
networkId.getValueString().c_str(),
time
));
return objectTangibleObject->getAILeashTime();
}
// ----------------------------------------------------------------------
void JNICALL ScriptMethodsHateListNamespace::forceHateTarget(JNIEnv * env, jobject self, jlong object, jlong target)
{
UNREF(env);
UNREF(self);
NetworkId const networkId(object);
NetworkId const hateTargetNetworkId(target);
TangibleObject * const objectTangibleObject = TangibleObject::getTangibleObject(networkId);
if (objectTangibleObject == NULL)
{
WARNING(true, ("ScriptMethodsHateList::forceHateTarget() object(%s) hateTarget(%s) Unable to resolve the object to a TangibleObject.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (hateTargetNetworkId == NetworkId::cms_invalid)
{
WARNING(true, ("ScriptMethodsHateList::forceHateTarget() object(%s) Unable to resolve the hateTarget(%s) to a NetworkId.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
if (networkId == hateTargetNetworkId)
{
JAVA_THROW_SCRIPT_EXCEPTION(true, ("ScriptMethodsHateList::forceHateTarget() object(%s) hateTarget(%s) The object is trying to add itself to its hate list.", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
return;
}
LOGC(AiLogManager::isLogging(networkId), "debug_ai", ("ScriptMethodsHateList::forceHateTarget() object(%s) hateTarget(%s)", networkId.getValueString().c_str(), hateTargetNetworkId.getValueString().c_str()));
objectTangibleObject->forceHateTarget(hateTargetNetworkId);
}
// ======================================================================