//----------------------------------------------------------------------- // ScriptMethodsClientEffect.cpp // Copyright 2002, Sony Online Entertainment Inc., all rights reserved. //----------------------------------------------------------------------- #include "serverScript/FirstServerScript.h" #include "serverScript/JavaLibrary.h" #include "serverGame/GameServer.h" #include "serverGame/ServerObject.h" #include "serverGame/TangibleObject.h" #include "sharedObject/CellProperty.h" #include "sharedMath/PackedArgb.h" #include "sharedNetworkMessages/ClientEffectMessages.h" #include "sharedNetworkMessages/MessageQueueGenericValueType.h" #include "sharedNetworkMessages/PlayMusicMessage.h" // ====================================================================== // ScriptMethodsClientEffectNamespace // ====================================================================== namespace ScriptMethodsClientEffectNamespace { bool install(); jboolean JNICALL playClientEventObj(JNIEnv *env, jobject self, jlong client, jstring eventType, jlong obj, jstring hardpoint, jobject jTransform); jboolean JNICALL playClientEventObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring eventType, jlong obj, jstring hardpoint, jobject jTransform); jboolean JNICALL playClientEventLoc(JNIEnv *env, jobject self, jlong client, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta); jboolean JNICALL playClientEventLocLimited(JNIEnv *env, jobject self, jlongArray client, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta); jboolean JNICALL playUiEffect(JNIEnv *env, jobject self, jlong client, jstring uiEffectString); jboolean JNICALL playClientEffectObj(JNIEnv *env, jobject self, jlong client, jstring effectName, jlong obj, jstring hardpoint, jobject jTransform, jstring labelName); jboolean JNICALL playClientEffectObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jlong obj, jstring hardpoint, jobject jTransform, jstring labelName); jboolean JNICALL playClientEffectLoc(JNIEnv *env, jobject self, jlong client, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName); jboolean JNICALL playClientEffectLocLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName); jboolean JNICALL stopClientEffectObjByLabel(JNIEnv *env, jobject self, jlong client, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate); jboolean JNICALL stopClientEffectObjByLabelLimited(JNIEnv *env, jobject self, jlongArray clients, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate); jboolean JNICALL play2dNonLoopingMusic(JNIEnv *env, jobject self, jlong client, jstring musicName); jboolean JNICALL play2dNonLoopingSound(JNIEnv *env, jobject self, jlong client, jstring musicName); jboolean JNICALL playMusicWithParms(JNIEnv *env, jobject self, jlong client, jlong source, jstring musicName, jint playtype, bool loop); void JNICALL sendMusicFlourish(JNIEnv *env, jobject self, jlong performer, jint flourishIndex); jboolean JNICALL createClientProjectile(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject start, jobject end, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a); jboolean JNICALL createClientProjectileObjectToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a); jboolean JNICALL createClientProjectileLocationToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject source, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a); jboolean JNICALL createClientProjectileObjectToLocation(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jobject target, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a); void JNICALL addObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring filename, jstring hardpoint, jobject offset, jfloat scale, jstring label); void JNICALL removeObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label); void JNICALL removeAllObjectEffects(JNIEnv * env, jobject self, jlong obj); jboolean JNICALL hasObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label); } //======================================================================== // install //======================================================================== bool ScriptMethodsClientEffectNamespace::install() { const JNINativeMethod NATIVES[] = { #define JF(a,b,c) {a,b,(void*)(ScriptMethodsClientEffectNamespace::c)} JF("_playClientEventObj", "(JLjava/lang/String;JLjava/lang/String;Lscript/transform;)Z", playClientEventObj), JF("_playClientEventObj", "([JLjava/lang/String;JLjava/lang/String;Lscript/transform;)Z", playClientEventObjLimited), JF("_playClientEventLoc", "(JLjava/lang/String;Ljava/lang/String;Lscript/location;F)Z", playClientEventLoc), JF("_playClientEventLoc", "([JLjava/lang/String;Ljava/lang/String;Lscript/location;F)Z", playClientEventLocLimited), JF("_playUiEffect", "(JLjava/lang/String;)Z", playUiEffect), JF("_playClientEffectObj", "(JLjava/lang/String;JLjava/lang/String;Lscript/transform;Ljava/lang/String;)Z", playClientEffectObj), JF("_playClientEffectObj", "([JLjava/lang/String;JLjava/lang/String;Lscript/transform;Ljava/lang/String;)Z", playClientEffectObjLimited), JF("_playClientEffectLoc", "(JLjava/lang/String;Lscript/location;FLjava/lang/String;)Z", playClientEffectLoc), JF("_playClientEffectLoc", "([JLjava/lang/String;Lscript/location;FLjava/lang/String;)Z", playClientEffectLocLimited), JF("_stopClientEffectObjByLabel", "(JJLjava/lang/String;Z)Z", stopClientEffectObjByLabel), JF("_stopClientEffectObjByLabel", "([JJLjava/lang/String;Z)Z", stopClientEffectObjByLabelLimited), JF("_play2dNonLoopingMusic", "(JLjava/lang/String;)Z", play2dNonLoopingMusic), JF("_play2dNonLoopingSound", "(JLjava/lang/String;)Z", play2dNonLoopingSound), JF("_playMusic", "(JJLjava/lang/String;IZ)Z", playMusicWithParms), JF("_createClientProjectile", "(JLjava/lang/String;Lscript/location;Lscript/location;FFZIIII)Z", createClientProjectile), JF("_createClientProjectileObjectToObject", "(JLjava/lang/String;JLjava/lang/String;JLjava/lang/String;FFZIIII)Z", createClientProjectileObjectToObject), JF("_createClientProjectileLocationToObject", "(JLjava/lang/String;Lscript/location;JLjava/lang/String;FFZIIII)Z", createClientProjectileLocationToObject), JF("_createClientProjectileObjectToLocation", "(JLjava/lang/String;JLjava/lang/String;Lscript/location;FFZIIII)Z", createClientProjectileObjectToLocation), JF("_addObjectEffect", "(JLjava/lang/String;Ljava/lang/String;Lscript/vector;FLjava/lang/String;)V", addObjectEffect), JF("_removeObjectEffect", "(JLjava/lang/String;)V", removeObjectEffect), JF("_removeAllObjectEffects", "(J)V", removeAllObjectEffects), JF("_hasObjectEffect", "(JLjava/lang/String;)Z", hasObjectEffect), }; return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0])); } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventObj(JNIEnv *env, jobject self, jlong client, jstring eventType, jlong objectToPlayEventOn, jstring jHardpoint, jobject jTransform) { JavaStringParam localEventType(eventType); ServerObject* so = NULL; if(!JavaLibrary::getObject(client, so)) return JNI_FALSE; Client* c = so->getClient(); if(!c) return JNI_FALSE; if (!objectToPlayEventOn) return JNI_FALSE; ServerObject* target = NULL; if(!JavaLibrary::getObject(objectToPlayEventOn, target)) return JNI_FALSE; if(!target) return JNI_FALSE; //get the event std::string event; JavaLibrary::convert(localEventType, event); if (event == "") return JNI_FALSE; //get the hardpoint std::string hp; if (NULL != jHardpoint) { JavaStringParam localHardpoint(jHardpoint); JavaLibrary::convert(localHardpoint, hp); } //get the transform Transform transform; if (NULL != jTransform) { ScriptConversion::convert(jTransform, transform); } JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEventObj received valid hardpoint AND valid transform.")); const NetworkId nid(objectToPlayEventOn); if (hp.empty() && transform != Transform::identity) { PlayClientEventObjectTransformMessage const pceotm(nid, event, transform); so->sendToClientsInUpdateRange(pceotm, true); } else { PlayClientEventObjectMessage const pceom(nid, event, hp); so->sendToClientsInUpdateRange(pceom, true); } return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring eventType, jlong objectToPlayEventOn, jstring jHardpoint, jobject jTransform) { JavaStringParam localEventType(eventType); std::vector clientIds; if (!ScriptConversion::convert(clients, clientIds)) return JNI_FALSE; if (!objectToPlayEventOn) return JNI_FALSE; ServerObject* target = NULL; if(!JavaLibrary::getObject(objectToPlayEventOn, target)) return JNI_FALSE; if(!target) return JNI_FALSE; //get the event std::string event; JavaLibrary::convert(localEventType, event); if (event == "") return JNI_FALSE; //get the hardpoint std::string hp; if (NULL != jHardpoint) { JavaStringParam localHardpoint(jHardpoint); JavaLibrary::convert(localHardpoint, hp); } //get the transform Transform transform; if (NULL != jTransform) { ScriptConversion::convert(jTransform, transform); } JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEventObj received valid hardpoint AND valid transform.")); const NetworkId nid(objectToPlayEventOn); if (hp.empty() && transform != Transform::identity) { PlayClientEventObjectTransformMessage const pceotm(nid, event, transform); ServerObject::sendToSpecifiedClients(pceotm, true, clientIds); } else { PlayClientEventObjectMessage const pceom(nid, event, hp); ServerObject::sendToSpecifiedClients(pceom, true, clientIds); } return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventLoc(JNIEnv *env, jobject self, jlong client, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta) { JavaStringParam localEventSourceType(eventSourceType); JavaStringParam localEventDestType(eventDestType); ServerObject* so = NULL; if(!JavaLibrary::getObject(client, so)) return JNI_FALSE; Client* c = so->getClient(); if(!c) return JNI_FALSE; //get the events std::string eventSource; JavaLibrary::convert(localEventSourceType, eventSource); if(eventSource == "") return JNI_FALSE; std::string eventDest; JavaLibrary::convert(localEventDestType, eventDest); if(eventDest == "") return JNI_FALSE; //get the location Vector locationVec; std::string sceneId; NetworkId cell; if (!ScriptConversion::convert(loc, locationVec, sceneId, cell)) return JNI_FALSE; PlayClientEventLocMessage const pcelm(eventSource, eventDest, locationVec, sceneId, cell, terrainDelta); so->sendToClientsInUpdateRange(pcelm, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEventLocLimited(JNIEnv *env, jobject self, jlongArray clients, jstring eventSourceType, jstring eventDestType, jobject loc, jfloat terrainDelta) { JavaStringParam localEventSourceType(eventSourceType); JavaStringParam localEventDestType(eventDestType); std::vector clientIds; if (!ScriptConversion::convert(clients, clientIds)) return JNI_FALSE; //get the events std::string eventSource; JavaLibrary::convert(localEventSourceType, eventSource); if(eventSource == "") return JNI_FALSE; std::string eventDest; JavaLibrary::convert(localEventDestType, eventDest); if(eventDest == "") return JNI_FALSE; //get the location Vector locationVec; std::string sceneId; NetworkId cell; if (!ScriptConversion::convert(loc, locationVec, sceneId, cell)) return JNI_FALSE; PlayClientEventLocMessage const pcelm(eventSource, eventDest, locationVec, sceneId, cell, terrainDelta); ServerObject::sendToSpecifiedClients(pcelm, true, clientIds); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectObj(JNIEnv *env, jobject self, jlong client, jstring effectName, jlong objectToPlayEffectOn, jstring jHardpoint, jobject jTransform, jstring labelName) { JavaStringParam localEffectName(effectName); ServerObject* so = NULL; if(!JavaLibrary::getObject(objectToPlayEffectOn, so)) return JNI_FALSE; /* TPERRY - This isn't used @TODO: We should take the client parameter out of this function and only use objectToPlayEffectOn Client* c = so->getClient(); if(!c) return JNI_FALSE; */ if (!objectToPlayEffectOn) return JNI_FALSE; ServerObject* target = NULL; if(!JavaLibrary::getObject(objectToPlayEffectOn, target)) return JNI_FALSE; if(!target) return JNI_FALSE; //get the effect std::string effect; JavaLibrary::convert(localEffectName, effect); if(effect == "") return JNI_FALSE; //get the hardpoint std::string hp; if (NULL != jHardpoint) { JavaStringParam localHardpoint(jHardpoint); JavaLibrary::convert(localHardpoint, hp); } //get the transform Transform transform; if (NULL != jTransform) { ScriptConversion::convert(jTransform, transform); } //get the optional labelName std::string strLabelName; if (NULL != labelName) { JavaStringParam localLabel(labelName); JavaLibrary::convert(localLabel, strLabelName); } JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEffectObj received valid hardpoint AND valid transform.")); const NetworkId nid(objectToPlayEffectOn); if (hp.empty() && transform != Transform::identity) { PlayClientEffectObjectTransformMessage const pceotm(nid, effect, transform, strLabelName); so->sendToClientsInUpdateRange(pceotm, true); } else { PlayClientEffectObjectMessage const pceom(nid, effect, hp, strLabelName); so->sendToClientsInUpdateRange(pceom, true); } return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectObjLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jlong objectToPlayEffectOn, jstring jHardpoint, jobject jTransform, jstring labelName) { JavaStringParam localEffectName(effectName); std::vector clientIds; if (!ScriptConversion::convert(clients, clientIds)) return JNI_FALSE; if (!objectToPlayEffectOn) return JNI_FALSE; ServerObject* target = NULL; if(!JavaLibrary::getObject(objectToPlayEffectOn, target)) return JNI_FALSE; if(!target) return JNI_FALSE; //get the effect std::string effect; JavaLibrary::convert(localEffectName, effect); if(effect == "") return JNI_FALSE; //get the hardpoint std::string hp; if (NULL != jHardpoint) { JavaStringParam localHardpoint(jHardpoint); JavaLibrary::convert(localHardpoint, hp); } //get the transform Transform transform; if (NULL != jTransform) { ScriptConversion::convert(jTransform, transform); } //get the optional labelName std::string strLabelName; if (NULL != labelName) { JavaStringParam localLabel(labelName); JavaLibrary::convert(localLabel, strLabelName); } JAVA_THROW_SCRIPT_EXCEPTION(!hp.empty() && transform != Transform::identity, ("playClientEffectObj received valid hardpoint AND valid transform.")); const NetworkId nid(objectToPlayEffectOn); if (hp.empty() && transform != Transform::identity) { PlayClientEffectObjectTransformMessage const pceotm(nid, effect, transform, strLabelName); ServerObject::sendToSpecifiedClients(pceotm, true, clientIds); } else { PlayClientEffectObjectMessage const pceom(nid, effect, hp, strLabelName); ServerObject::sendToSpecifiedClients(pceom, true, clientIds); } return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectLoc(JNIEnv *env, jobject self, jlong client, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName) { JavaStringParam localEffectName(effectName); ServerObject* so = NULL; if(!JavaLibrary::getObject(client, so)) return JNI_FALSE; /* TPERRY - This isn't used @TODO: We should take the client parameter out of this function and only use objectToPlayEffectOn Client* c = so->getClient(); if(!c) return JNI_FALSE; */ //get the effect std::string effect; JavaLibrary::convert(localEffectName, effect); if(effect == "") return JNI_FALSE; //get the location Vector locationVec; std::string sceneId; NetworkId cell; if (!ScriptConversion::convert(loc, locationVec, sceneId, cell)) return JNI_FALSE; //get the optional labelName std::string strLabelName; if (NULL != labelName) { JavaStringParam localLabel(labelName); JavaLibrary::convert(localLabel, strLabelName); } PlayClientEffectLocMessage const pcelm(effect, locationVec, sceneId, cell, terrainDelta, strLabelName); so->sendToClientsInUpdateRange(pcelm, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playClientEffectLocLimited(JNIEnv *env, jobject self, jlongArray clients, jstring effectName, jobject loc, jfloat terrainDelta, jstring labelName) { JavaStringParam localEffectName(effectName); std::vector clientIds; if (!ScriptConversion::convert(clients, clientIds)) return JNI_FALSE; //get the effect std::string effect; JavaLibrary::convert(localEffectName, effect); if(effect == "") return JNI_FALSE; //get the location Vector locationVec; std::string sceneId; NetworkId cell; if (!ScriptConversion::convert(loc, locationVec, sceneId, cell)) return JNI_FALSE; //get the optional labelName std::string strLabelName; if (NULL != labelName) { JavaStringParam localLabel(labelName); JavaLibrary::convert(localLabel, strLabelName); } PlayClientEffectLocMessage const pcelm(effect, locationVec, sceneId, cell, terrainDelta, strLabelName); ServerObject::sendToSpecifiedClients(pcelm, true, clientIds); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playUiEffect(JNIEnv * /*env*/, jobject /*self*/, jlong client, jstring uiEffectString) { JavaStringParam localUiEffectString(uiEffectString); ServerObject* so = NULL; if(!JavaLibrary::getObject(client, so)) { NetworkId const networkId(client); JAVA_THROW_SCRIPT_EXCEPTION(true, ("playUiEffect - could not find player %s.", networkId.getValueString().c_str())); return JNI_FALSE; } //get the event std::string uiEffect; JavaLibrary::convert(localUiEffectString, uiEffect); if (uiEffect.empty()) { JAVA_THROW_SCRIPT_EXCEPTION(true, ("playUiEffect - empty effect string for %s.", so->getDebugInformation().c_str())); return JNI_FALSE; } //format the message. MessageQueueGenericValueType > * const msg = new MessageQueueGenericValueType >(std::make_pair(so->getNetworkId(), uiEffect)); so->appendMessage(CM_uiPlayEffect, 0.0f, msg); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::stopClientEffectObjByLabel(JNIEnv *env, jobject self, jlong client, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate) { JavaStringParam localLabel(labelName); ServerObject* so = NULL; if(!JavaLibrary::getObject(objectEffectIsOn, so)) return JNI_FALSE; /* TPERRY - This isn't used @TODO: We should take the client parameter out of this function and only use objectToPlayEffectOn Client* c = so->getClient(); if(!c) return JNI_FALSE; */ if (!objectEffectIsOn) return JNI_FALSE; ServerObject* target = NULL; if(!JavaLibrary::getObject(objectEffectIsOn, target)) return JNI_FALSE; if(!target) return JNI_FALSE; //get the effect std::string strLabelName; JavaLibrary::convert(localLabel, strLabelName); if(strLabelName == "") return JNI_FALSE; const NetworkId nid(objectEffectIsOn); StopClientEffectObjectByLabelMessage const pceotm(nid, strLabelName, softTerminate); so->sendToClientsInUpdateRange(pceotm, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::stopClientEffectObjByLabelLimited(JNIEnv *env, jobject self, jlongArray clients, jlong objectEffectIsOn, jstring labelName, jboolean softTerminate) { JavaStringParam localLabel(labelName); std::vector clientIds; if (!ScriptConversion::convert(clients, clientIds)) return JNI_FALSE; if (!objectEffectIsOn) return JNI_FALSE; ServerObject* target = NULL; if(!JavaLibrary::getObject(objectEffectIsOn, target)) return JNI_FALSE; if(!target) return JNI_FALSE; //get the effect std::string strLabelName; JavaLibrary::convert(localLabel, strLabelName); if(strLabelName == "") return JNI_FALSE; const NetworkId nid(objectEffectIsOn); StopClientEffectObjectByLabelMessage const pceotm(nid, strLabelName, softTerminate); ServerObject::sendToSpecifiedClients(pceotm, true, clientIds); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::play2dNonLoopingMusic(JNIEnv *env, jobject self, jlong client, jstring musicName) { JavaStringParam localMusicName(musicName); ServerObject* so = NULL; if (!JavaLibrary::getObject(client, so)) return JNI_FALSE; Client* c = so->getClient(); if (!c) return JNI_FALSE; std::string music; JavaLibrary::convert(localMusicName, music); if (music == "") return JNI_FALSE; PlayMusicMessage const msg(music, NetworkId::cms_invalid, 0, false); c->send(msg, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::play2dNonLoopingSound(JNIEnv *env, jobject self, jlong client, jstring musicName) { JavaStringParam localMusicName(musicName); ServerObject* so = NULL; if (!JavaLibrary::getObject(client, so)) return JNI_FALSE; Client* c = so->getClient(); if (!c) return JNI_FALSE; std::string music; JavaLibrary::convert(localMusicName, music); if (music == "") return JNI_FALSE; PlayMusicMessage const msg(music, NetworkId::cms_invalid, 1, false); c->send(msg, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::playMusicWithParms(JNIEnv *env, jobject self, jlong client, jlong source, jstring musicName, jint playType, bool loop) { JavaStringParam localMusicName(musicName); ServerObject* so = NULL; if (!JavaLibrary::getObject(client, so)) return JNI_FALSE; Client* c = so->getClient(); if (!c) return JNI_FALSE; std::string music; JavaLibrary::convert(localMusicName, music); if (music == "") return JNI_FALSE; PlayMusicMessage const msg(music, NetworkId(source), playType, loop); c->send(msg, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectile(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject start, jobject end, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a) { JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName); ServerObject* so = NULL; if (!JavaLibrary::getObject(client, so)) return JNI_FALSE; // verify a client exists Client * c = so->getClient(); if (!c) return JNI_FALSE; // get the weapon object template name string std::string weaponObjectTemplateNameString; JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString); if (weaponObjectTemplateNameString == "") return JNI_FALSE; // get the start location Vector startLocationVec; std::string startSceneId; NetworkId startCell; if (!ScriptConversion::convert(start, startLocationVec, startSceneId, startCell)) return JNI_FALSE; // get the end location Vector endLocationVec; std::string endSceneId; NetworkId endCell; if (!ScriptConversion::convert(end, endLocationVec, endSceneId, endCell)) return JNI_FALSE; CreateClientProjectileMessage const ccpm(weaponObjectTemplateNameString, startLocationVec, startCell, endLocationVec, speed, expiration, trail, PackedArgb(static_cast(a), static_cast(r), static_cast(g), static_cast(b)).getArgb()); so->sendToClientsInUpdateRange(ccpm, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectileObjectToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a) { JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName); ServerObject* so = NULL; if (!JavaLibrary::getObject(client, so)) return JNI_FALSE; // verify a client exists Client * c = so->getClient(); if (!c) return JNI_FALSE; // get the weapon object template name string std::string weaponObjectTemplateNameString; JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString); if (weaponObjectTemplateNameString == "") return JNI_FALSE; // Get our source object ServerObject* sourceObject = NULL; if (!JavaLibrary::getObject(source, sourceObject)) return JNI_FALSE; NetworkId sourceId = sourceObject->getNetworkId(); // The target of our effect ServerObject* targetObject = NULL; if (!JavaLibrary::getObject(target, targetObject)) return JNI_FALSE; NetworkId targetId = targetObject->getNetworkId(); // Optional Source hardpoint JavaStringParam localSourceHardpointName(sourceHardpoint); std::string sourceHardpointString; JavaLibrary::convert(localSourceHardpointName, sourceHardpointString); // Optional Target hardpoint JavaStringParam localTargetHardpointName(targetHardpoint); std::string targetHardpointString; JavaLibrary::convert(localTargetHardpointName, targetHardpointString); // Source's Cell ID CellProperty const * const cellProperty = sourceObject->getParentCell(); Object const * const cellObject = (cellProperty != NULL) ? &cellProperty->getOwner() : NULL; NetworkId const & networkIdForCellOrWorld = (cellObject != NULL) ? cellObject->getNetworkId() : NetworkId::cms_invalid; CreateClientProjectileObjectToObjectMessage const ccpmoto(weaponObjectTemplateNameString, sourceId, sourceHardpointString, networkIdForCellOrWorld, targetId, targetHardpointString, speed, expiration, trail, PackedArgb(static_cast(a), static_cast(r), static_cast(g), static_cast(b)).getArgb()); so->sendToClientsInUpdateRange(ccpmoto, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectileObjectToLocation(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jlong source, jstring sourceHardpoint, jobject target, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a) { JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName); ServerObject* so = NULL; if (!JavaLibrary::getObject(client, so)) return JNI_FALSE; // verify a client exists Client * c = so->getClient(); if (!c) return JNI_FALSE; // get the weapon object template name string std::string weaponObjectTemplateNameString; JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString); if (weaponObjectTemplateNameString == "") return JNI_FALSE; // Get our source object ServerObject* sourceObject = NULL; if (!JavaLibrary::getObject(source, sourceObject)) return JNI_FALSE; NetworkId sourceId = sourceObject->getNetworkId(); // Optional Source hardpoint JavaStringParam localSourceHardpointName(sourceHardpoint); std::string sourceHardpointString; JavaLibrary::convert(localSourceHardpointName, sourceHardpointString); // The target of our effect Vector targetLocationVec; std::string startSceneId; NetworkId startCell; if (!ScriptConversion::convert(target, targetLocationVec, startSceneId, startCell)) return JNI_FALSE; // Source's Cell ID CellProperty const * const cellProperty = sourceObject->getParentCell(); Object const * const cellObject = (cellProperty != NULL) ? &cellProperty->getOwner() : NULL; NetworkId const & networkIdForCellOrWorld = (cellObject != NULL) ? cellObject->getNetworkId() : NetworkId::cms_invalid; CreateClientProjectileObjectToLocationMessage const ccpmotl(weaponObjectTemplateNameString, sourceId, sourceHardpointString, networkIdForCellOrWorld, targetLocationVec, speed, expiration, trail, PackedArgb(static_cast(a), static_cast(r), static_cast(g), static_cast(b)).getArgb()); so->sendToClientsInUpdateRange(ccpmotl, true); return JNI_TRUE; } //----------------------------------------------------------------------- jboolean JNICALL ScriptMethodsClientEffectNamespace::createClientProjectileLocationToObject(JNIEnv *env, jobject self, jlong client, jstring weaponObjectTemplateName, jobject source, jlong target, jstring targetHardpoint, jfloat speed, jfloat expiration, jboolean trail, jint r, jint g, jint b, jint a) { JavaStringParam localWeaponObjectTemplateName(weaponObjectTemplateName); ServerObject* so = NULL; if (!JavaLibrary::getObject(client, so)) return JNI_FALSE; // verify a client exists Client * c = so->getClient(); if (!c) return JNI_FALSE; // get the weapon object template name string std::string weaponObjectTemplateNameString; JavaLibrary::convert(localWeaponObjectTemplateName, weaponObjectTemplateNameString); if (weaponObjectTemplateNameString == "") return JNI_FALSE; // Get our target object ServerObject* targetObject = NULL; if (!JavaLibrary::getObject(target, targetObject)) return JNI_FALSE; NetworkId targetId = targetObject->getNetworkId(); // Optional Target hardpoint JavaStringParam localTargetHardpointName(targetHardpoint); std::string targetHardpointString; JavaLibrary::convert(localTargetHardpointName, targetHardpointString); Vector sourceLocationVec; std::string startSceneId; NetworkId startCell; if (!ScriptConversion::convert(source, sourceLocationVec, startSceneId, startCell)) return JNI_FALSE; // Target's Cell ID CellProperty const * const cellProperty = targetObject->getParentCell(); Object const * const cellObject = (cellProperty != NULL) ? &cellProperty->getOwner() : NULL; NetworkId const & networkIdForCellOrWorld = (cellObject != NULL) ? cellObject->getNetworkId() : NetworkId::cms_invalid; CreateClientProjectileLocationToObjectMessage const ccpmlto(weaponObjectTemplateNameString, sourceLocationVec, networkIdForCellOrWorld, targetId, targetHardpointString, speed, expiration, trail, PackedArgb(static_cast(a), static_cast(r), static_cast(g), static_cast(b)).getArgb()); so->sendToClientsInUpdateRange(ccpmlto, true); return JNI_TRUE; } void JNICALL ScriptMethodsClientEffectNamespace::addObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring filename, jstring hardpoint, jobject offset, jfloat scale, jstring label) { ServerObject* so = NULL; if (!JavaLibrary::getObject(obj, so)) return; TangibleObject * tang = so->asTangibleObject(); if(!tang) return; JavaStringParam javaFilename(filename); std::string localFilename; JavaLibrary::convert(javaFilename, localFilename); JavaStringParam javaLabel(label); std::string localLabel; JavaLibrary::convert(javaLabel, localLabel); JavaStringParam javaHardpoint(hardpoint); std::string localHardpoint; JavaLibrary::convert(javaHardpoint, localHardpoint); Vector offsetVector; ScriptConversion::convert(offset, offsetVector); if(localLabel.empty() || localFilename.empty()) return; tang->addObjectEffect(localFilename, localHardpoint, offsetVector, scale, localLabel); } void JNICALL ScriptMethodsClientEffectNamespace::removeObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label) { ServerObject* so = NULL; if (!JavaLibrary::getObject(obj, so)) return; TangibleObject * tang = so->asTangibleObject(); if(!tang) return; JavaStringParam javaLabel(label); std::string localLabel; JavaLibrary::convert(javaLabel, localLabel); if(localLabel.empty()) return; tang->removeObjectEffect(localLabel); } void JNICALL ScriptMethodsClientEffectNamespace::removeAllObjectEffects(JNIEnv * env, jobject self, jlong obj) { ServerObject* so = NULL; if (!JavaLibrary::getObject(obj, so)) return; TangibleObject * tang = so->asTangibleObject(); if(!tang) return; tang->removeAllObjectEffects(); } jboolean JNICALL ScriptMethodsClientEffectNamespace::hasObjectEffect(JNIEnv * env, jobject self, jlong obj, jstring label) { ServerObject* so = NULL; if (!JavaLibrary::getObject(obj, so)) return JNI_FALSE; TangibleObject * tang = so->asTangibleObject(); if(!tang) return JNI_FALSE; JavaStringParam javaLabel(label); std::string localLabel; JavaLibrary::convert(javaLabel, localLabel); if(localLabel.empty()) return JNI_FALSE; return tang->hasObjectEffect(localLabel); } //-----------------------------------------------------------------------