mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-09-25 10:12:52 -04:00
2809 lines
96 KiB
C++
2809 lines
96 KiB
C++
//========================================================================
|
|
//
|
|
// ScriptMethodsCrafting.cpp - implements script methods dealing with crafting
|
|
// and manufacturing.
|
|
//
|
|
// copyright 2001 Sony Online Entertainment
|
|
//
|
|
//========================================================================
|
|
|
|
#include "serverScript/FirstServerScript.h"
|
|
#include "serverScript/JavaLibrary.h"
|
|
|
|
#include "UnicodeUtils.h"
|
|
#include "serverGame/ContainerInterface.h"
|
|
#include "serverGame/CreatureObject.h"
|
|
#include "serverGame/DraftSchematicObject.h"
|
|
#include "serverGame/FactoryObject.h"
|
|
#include "serverGame/ManufactureInstallationObject.h"
|
|
#include "serverGame/ManufactureObjectInterface.h"
|
|
#include "serverGame/ManufactureSchematicObject.h"
|
|
#include "serverGame/ObserveTracker.h"
|
|
#include "serverGame/PlayerCreatureController.h"
|
|
#include "serverGame/PlayerObject.h"
|
|
#include "serverGame/ResourceContainerObject.h"
|
|
#include "serverGame/ServerWorld.h"
|
|
#include "serverScript/GameScriptObject.h"
|
|
#include "serverScript/ScriptParameters.h"
|
|
#include "sharedFoundation/TemporaryCrcString.h"
|
|
#include "sharedGame/AssetCustomizationManager.h"
|
|
#include "sharedLog/Log.h"
|
|
#include "sharedObject/CustomizationData.h"
|
|
#include "sharedObject/MemoryBlockManagedObject.h"
|
|
#include "sharedObject/NetworkIdManager.h"
|
|
#include "sharedObject/ObjectTemplateList.h"
|
|
#include "sharedObject/PaletteColorCustomizationVariable.h"
|
|
#include "sharedObject/RangedIntCustomizationVariable.h"
|
|
#include "sharedObject/VolumeContainer.h"
|
|
|
|
#include <vector>
|
|
|
|
using namespace JNIWrappersNamespace;
|
|
|
|
|
|
// ======================================================================
|
|
|
|
namespace ScriptMethodsCraftingNamespace
|
|
{
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
struct VariableInfo
|
|
{
|
|
VariableInfo(std::string const &newName, int newMinValueInclusive, int newSetValue, int newMaxValueExclusive);
|
|
|
|
std::string name;
|
|
int minValueInclusive;
|
|
int value;
|
|
int maxValueExclusive;
|
|
};
|
|
|
|
typedef std::vector<VariableInfo> VariableInfoVector;
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
bool install();
|
|
void collectRangedIntVariableCallback(const std::string &fullVariablePathName, const CustomizationVariable *customizationVariable, void *context);
|
|
|
|
jboolean JNICALL startCraftingSession(JNIEnv *env, jobject self, jlong player, jlong station);
|
|
jboolean JNICALL endCraftingSession(JNIEnv *env, jobject self, jlong crafter, jlong tool, jlong prototype);
|
|
jboolean JNICALL setCraftingLevelAndStation(JNIEnv *env, jobject self, jlong player, jint craftingLevel, jlong station);
|
|
jint JNICALL getCraftingLevel(JNIEnv *env, jobject self, jlong player);
|
|
jlong JNICALL getCraftingStation(JNIEnv *env, jobject self, jlong player);
|
|
jboolean JNICALL sendUseableDraftSchematics(JNIEnv *env, jobject self, jlong player, jintArray schematics);
|
|
jboolean JNICALL setSchematicAttribute(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobject attribute, jboolean experiment);
|
|
jboolean JNICALL setSchematicAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray attributes, jboolean experiment);
|
|
jobject JNICALL getSchematicAttribute(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobject name, jboolean experiment);
|
|
jobjectArray JNICALL getSchematicAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray names, jboolean experiment);
|
|
jobjectArray JNICALL getAllSchematicAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jboolean experiment);
|
|
jobject JNICALL getSchematicForExperimentalAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray attributeNames);
|
|
jboolean JNICALL setSchematicExperimentMod(JNIEnv *env, jobject self, jlong manufacturingSchematic, jfloat experimentMod);
|
|
jboolean JNICALL setSchematicAppearances(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray appearances);
|
|
jboolean JNICALL setSchematicCustomizations(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray customizations);
|
|
jint JNICALL getSchematicItemCount(JNIEnv *env, jobject self, jlong manufacturingSchematic);
|
|
jboolean JNICALL setSchematicItemCount(JNIEnv *env, jobject self, jlong manufacturingSchematic, jint count);
|
|
jint JNICALL getSchematicItemsPerContainer(JNIEnv *env, jobject self, jlong manufacturingSchematic);
|
|
jboolean JNICALL setSchematicItemsPerContainer(JNIEnv *env, jobject self, jlong manufacturingSchematic, jint count);
|
|
jfloat JNICALL getSchematicManufactureTime(JNIEnv *env, jobject self, jlong manufacturingSchematic);
|
|
jboolean JNICALL setSchematicManufactureTime(JNIEnv *env, jobject self, jlong manufacturingSchematic, jfloat time);
|
|
jboolean JNICALL setCreatorXp(JNIEnv *env, jobject self, jlong object, jint xp);
|
|
void JNICALL getIngredientsForManufactureStation(JNIEnv *env, jobject self, jlong station, jobjectArray ingredients);
|
|
jlong JNICALL getManufactureStationInputHopper(JNIEnv *env, jobject self, jlong station);
|
|
jlong JNICALL getManufactureStationOutputHopper(JNIEnv *env, jobject self, jlong station);
|
|
jstring JNICALL getManufactureStationSchematic(JNIEnv *env, jobject self, jlong station);
|
|
void JNICALL getValidManufactureSchematicsForStation(JNIEnv *env, jobject self, jlong player, jlong station, jobjectArray schematics);
|
|
jboolean JNICALL hasValidManufactureSchematicsForStation(JNIEnv *env, jobject self, jlong player, jlong station);
|
|
jboolean JNICALL transferManufactureSchematicToPlayer(JNIEnv *env, jobject self, jlong station, jlong player);
|
|
jboolean JNICALL transferManufactureSchematicToStation(JNIEnv *env, jobject self, jlong schematic, jlong station);
|
|
void JNICALL getRepairableObjectsForTool(JNIEnv *env, jobject self, jlong player, jlong tool, jobjectArray objects);
|
|
jintArray JNICALL getAttributeBonuses(JNIEnv *env, jobject self, jlong target);
|
|
jint JNICALL getAttributeBonus(JNIEnv *env, jobject self, jlong target, jint attribute);
|
|
jboolean JNICALL setAttributeBonus(JNIEnv *env, jobject self, jlong target, jint attribute, jint bonus);
|
|
jboolean JNICALL setAttributeBonuses(JNIEnv *env, jobject self, jlong target, jintArray bonuses);
|
|
jobject JNICALL getSkillModBonuses(JNIEnv *env, jobject self, jlong target);
|
|
jint JNICALL getSkillModBonus(JNIEnv *env, jobject self, jlong target, jstring skillMod);
|
|
jboolean JNICALL setSkillModBonus(JNIEnv *env, jobject self, jlong target, jstring skillMod, jint bonus);
|
|
jboolean JNICALL setSkillModBonuses(JNIEnv *env, jobject self, jlong target, jobjectArray skillMod, jintArray bonus);
|
|
jboolean JNICALL setCategorizedSkillModBonus(JNIEnv *env, jobject self, jlong target, jstring category, jstring skillMod, jint bonus);
|
|
void JNICALL removeCategorizedSkillModBonuses(JNIEnv *env, jobject self, jlong target, jstring category);
|
|
jint JNICALL getSkillModSockets(JNIEnv *env, jobject self, jlong target);
|
|
jboolean JNICALL setSkillModSockets(JNIEnv *env, jobject self, jlong target, jint sockets);
|
|
jlong JNICALL makeCraftedItem(JNIEnv *env, jobject self, jstring draftSchematic, jfloat qualityPercent, jlong container);
|
|
jobject JNICALL getSchematicData(JNIEnv *env, jobject self, jlong manufacturingSchematic);
|
|
jobject JNICALL getDraftSchematicData(JNIEnv *env, jobject self, jstring draftSchematic);
|
|
jobject JNICALL getDraftSchematicDataCrc(JNIEnv *env, jobject self, jint draftSchematicCrc);
|
|
void JNICALL recomputeCrateAttributes(JNIEnv *env, jobject self, jlong crate);
|
|
}
|
|
|
|
using namespace ScriptMethodsCraftingNamespace;
|
|
|
|
|
|
//========================================================================
|
|
// install
|
|
//========================================================================
|
|
|
|
bool ScriptMethodsCraftingNamespace::install()
|
|
{
|
|
const JNINativeMethod NATIVES[] = {
|
|
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsCraftingNamespace::c)}
|
|
JF("_startCraftingSession", "(JJ)Z", startCraftingSession),
|
|
JF("_endCraftingSession", "(JJJ)Z", endCraftingSession),
|
|
JF("_setCraftingLevelAndStation", "(JIJ)Z", setCraftingLevelAndStation),
|
|
JF("_getCraftingLevel", "(J)I", getCraftingLevel),
|
|
JF("_getCraftingStation", "(J)J", getCraftingStation),
|
|
JF("_sendUseableDraftSchematics", "(J[I)Z", sendUseableDraftSchematics),
|
|
JF("__setSchematicAttribute", "(JLscript/draft_schematic$attribute;Z)Z", setSchematicAttribute),
|
|
JF("__setSchematicAttributes", "(J[Lscript/draft_schematic$attribute;Z)Z", setSchematicAttributes),
|
|
JF("__getSchematicAttribute", "(JLscript/string_id;Z)Lscript/draft_schematic$attribute;", getSchematicAttribute),
|
|
JF("__getSchematicAttributes", "(J[Lscript/string_id;Z)[Lscript/draft_schematic$attribute;", getSchematicAttributes),
|
|
JF("__getAllSchematicAttributes", "(JZ)[Lscript/draft_schematic$attribute;", getAllSchematicAttributes),
|
|
JF("_getSchematicForExperimentalAttributes", "(J[Lscript/string_id;)Lscript/draft_schematic;", getSchematicForExperimentalAttributes),
|
|
JF("_setSchematicExperimentMod", "(JF)Z", setSchematicExperimentMod),
|
|
JF("_setSchematicAppearances", "(J[Ljava/lang/String;)Z", setSchematicAppearances),
|
|
JF("_setSchematicCustomizations", "(J[Lscript/draft_schematic$custom;)Z", setSchematicCustomizations),
|
|
JF("_getSchematicItemCount", "(J)I", getSchematicItemCount),
|
|
JF("_setSchematicItemCount", "(JI)Z", setSchematicItemCount),
|
|
JF("_getSchematicItemsPerContainer", "(J)I", getSchematicItemsPerContainer),
|
|
JF("_setSchematicItemsPerContainer", "(JI)Z", setSchematicItemsPerContainer),
|
|
JF("_getSchematicManufactureTime", "(J)F", getSchematicManufactureTime),
|
|
JF("_setSchematicManufactureTime", "(JF)Z", setSchematicManufactureTime),
|
|
JF("_setCreatorXp", "(JI)Z", setCreatorXp),
|
|
JF("_getIngredientsForManufactureStation", "(J[[Ljava/lang/String;)V", getIngredientsForManufactureStation),
|
|
JF("_getManufactureStationInputHopper", "(J)J", getManufactureStationInputHopper),
|
|
JF("_getManufactureStationOutputHopper", "(J)J", getManufactureStationOutputHopper),
|
|
JF("_getManufactureStationSchematic", "(J)Ljava/lang/String;", getManufactureStationSchematic),
|
|
JF("_getValidManufactureSchematicsForStation", "(JJ[[Ljava/lang/String;)V", getValidManufactureSchematicsForStation),
|
|
JF("_hasValidManufactureSchematicsForStation", "(JJ)Z", hasValidManufactureSchematicsForStation),
|
|
JF("_transferManufactureSchematicToPlayer", "(JJ)Z", transferManufactureSchematicToPlayer),
|
|
JF("_transferManufactureSchematicToStation", "(JJ)Z", transferManufactureSchematicToStation),
|
|
JF("_getRepairableObjectsForTool", "(JJ[[Ljava/lang/String;)V", getRepairableObjectsForTool),
|
|
JF("_getAttributeBonuses", "(J)[I", getAttributeBonuses),
|
|
JF("_getAttributeBonus", "(JI)I", getAttributeBonus),
|
|
JF("_setAttributeBonus", "(JII)Z", setAttributeBonus),
|
|
JF("_setAttributeBonuses", "(J[I)Z", setAttributeBonuses),
|
|
JF("_getSkillModBonuses", "(J)Lscript/dictionary;", getSkillModBonuses),
|
|
JF("_getSkillModBonus", "(JLjava/lang/String;)I", getSkillModBonus),
|
|
JF("_setSkillModBonus", "(JLjava/lang/String;I)Z", setSkillModBonus),
|
|
JF("_setSkillModBonuses", "(J[Ljava/lang/String;[I)Z", setSkillModBonuses),
|
|
JF("_setCategorizedSkillModBonus", "(JLjava/lang/String;Ljava/lang/String;I)Z", setCategorizedSkillModBonus),
|
|
JF("_removeCategorizedSkillModBonuses", "(JLjava/lang/String;)V", removeCategorizedSkillModBonuses),
|
|
JF("_getSkillModSockets", "(J)I", getSkillModSockets),
|
|
JF("_setSkillModSockets", "(JI)Z", setSkillModSockets),
|
|
JF("_makeCraftedItem", "(Ljava/lang/String;FJ)J", makeCraftedItem),
|
|
JF("_getSchematicData", "(J)Lscript/draft_schematic;", getSchematicData),
|
|
JF("getSchematicData", "(Ljava/lang/String;)Lscript/draft_schematic;", getDraftSchematicData),
|
|
JF("getSchematicData", "(I)Lscript/draft_schematic;", getDraftSchematicDataCrc),
|
|
JF("_recomputeCrateAttributes", "(J)V", recomputeCrateAttributes),
|
|
};
|
|
|
|
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
|
|
}
|
|
|
|
|
|
// ======================================================================
|
|
// namespace ScriptMethodsCraftingNamespace
|
|
// ======================================================================
|
|
|
|
ScriptMethodsCraftingNamespace::VariableInfo::VariableInfo(std::string const &newName, int newMinValueInclusive, int newSetValue, int newMaxValueExclusive):
|
|
name(newName),
|
|
minValueInclusive(newMinValueInclusive),
|
|
value(newSetValue),
|
|
maxValueExclusive(newMaxValueExclusive)
|
|
{
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
void ScriptMethodsCraftingNamespace::collectRangedIntVariableCallback(const std::string &fullVariablePathName, const CustomizationVariable *customizationVariable, void *context)
|
|
{
|
|
//-- Check if variable is a palette-color style variable. If not, ignore for now.
|
|
// NOTE: replace PaletteColorCustomizationVariable with RangedIntCustomizatoinVariable
|
|
// if you want any ranged int (including texture choice ranges and palette colors) to be
|
|
// passed to crafting.
|
|
PaletteColorCustomizationVariable const *const paletteColorVariable = dynamic_cast<PaletteColorCustomizationVariable const *>(customizationVariable);
|
|
if (!paletteColorVariable)
|
|
{
|
|
// Nothing to do.
|
|
return;
|
|
}
|
|
|
|
//-- Check if variable is a ranged int style variable.
|
|
RangedIntCustomizationVariable const *const rangedIntVariable = paletteColorVariable;
|
|
|
|
//-- Get variable info list from context.
|
|
NOT_NULL(context);
|
|
VariableInfoVector *const variableInfoVector = static_cast<VariableInfoVector*>(context);
|
|
|
|
//-- Add variable info to vector.
|
|
int minValueInclusive = 0;
|
|
int maxValueExclusive = 0;
|
|
|
|
rangedIntVariable->getRange(minValueInclusive, maxValueExclusive);
|
|
variableInfoVector->push_back(VariableInfo(fullVariablePathName, minValueInclusive, rangedIntVariable->getValue(), maxValueExclusive));
|
|
}
|
|
|
|
//========================================================================
|
|
// class JavaLibrary crafting utility functions
|
|
//========================================================================
|
|
|
|
/**
|
|
* Creates a Java draft_schematic.attribute instance from an object attribute.
|
|
*
|
|
* @param manfSchematic manufacture schematic the attribute belongs to
|
|
* @param draftSchematic draft schematic the attribute belongs to
|
|
* @param attribIndex index of the attribute
|
|
*
|
|
* @return the attribute instance, or NULL on error
|
|
*/
|
|
LocalRefPtr JavaLibrary::createObjectAttribute(const ManufactureObjectInterface & manfSchematic,
|
|
const DraftSchematicObject & draftSchematic, int attribIndex)
|
|
{
|
|
if (attribIndex < 0 || attribIndex >= draftSchematic.getAttribsCount())
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
const SharedDraftSchematicObjectTemplate::SchematicAttribute &
|
|
minAttrib = draftSchematic.getAttribMin(attribIndex);
|
|
const SharedDraftSchematicObjectTemplate::SchematicAttribute &
|
|
maxAttrib = draftSchematic.getAttribMax(attribIndex);
|
|
|
|
if (minAttrib.name.getTable().empty() || minAttrib.name.getText().empty())
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// create the attribute object
|
|
LocalRefPtr attribute = allocObject(JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// set the name
|
|
LocalRefPtr name;
|
|
if (!ScriptConversion::convert(minAttrib.name, name))
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
setObjectField(*attribute, JavaLibrary::getFidDraftSchematicAttribName(), *name);
|
|
|
|
// get the resourceMax and current values
|
|
float minValue = static_cast<float>(minAttrib.value);
|
|
float maxValue = static_cast<float>(maxAttrib.value);
|
|
float resourceMaxValue = maxValue;
|
|
float currentValue = minValue;
|
|
|
|
std::map<StringId, float>::const_iterator result = manfSchematic.getAttributes().find(
|
|
minAttrib.name);
|
|
if (result != manfSchematic.getAttributes().end())
|
|
currentValue = (*result).second;
|
|
|
|
result = manfSchematic.getResourceMaxAttributes().find(
|
|
minAttrib.name);
|
|
if (result != manfSchematic.getResourceMaxAttributes().end())
|
|
resourceMaxValue = (*result).second;
|
|
|
|
// set the other fields
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribMinValue(), minValue);
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribMaxValue(), maxValue);
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribResourceMaxValue(), resourceMaxValue);
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribCurrentValue(), currentValue);
|
|
|
|
return attribute;
|
|
} // JavaLibrary::createObjectAttribute
|
|
|
|
/**
|
|
* Creates a Java draft_schematic.attribute instance from an experimental attribute.
|
|
*
|
|
* @param manfSchematic manufacture schematic the attribute belongs to
|
|
* @param attribName name of the attribute
|
|
*
|
|
* @return the attribute instance, or NULL on error
|
|
*/
|
|
LocalRefPtr JavaLibrary::createExperimentAttribute(const ManufactureObjectInterface & manfSchematic,
|
|
const StringId & attribName)
|
|
{
|
|
if (attribName.getTable().empty() || attribName.getText().empty())
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// create the attribute object
|
|
LocalRefPtr attribute = allocObject(JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// set the name
|
|
LocalRefPtr name;
|
|
if (!ScriptConversion::convert(attribName, name))
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
setObjectField(*attribute, JavaLibrary::getFidDraftSchematicAttribName(), *name);
|
|
|
|
// set the other fields
|
|
float value, minValue, maxValue, resourceValue;
|
|
manfSchematic.getAllExperimentAttributeValues(attribName, value, minValue, maxValue,
|
|
resourceValue);
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribCurrentValue(), value);
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribMinValue(), minValue);
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribMaxValue(), maxValue);
|
|
setFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribResourceMaxValue(), resourceValue);
|
|
|
|
return attribute;
|
|
} // JavaLibrary::createExperimentAttribute
|
|
|
|
|
|
//========================================================================
|
|
// class JavaLibrary JNI conversion methods
|
|
//========================================================================
|
|
|
|
/**
|
|
* Converts a C++ ManufactureSchematicObject to a Java draft_schematic.
|
|
*
|
|
* @param source the ManufactureSchematicObject to convert
|
|
*
|
|
* @return a new draft_schematic object
|
|
*/
|
|
LocalRefPtr JavaLibrary::convert(const ManufactureObjectInterface & source)
|
|
{
|
|
int i;
|
|
|
|
const DraftSchematicObject * draft = DraftSchematicObject::getSchematic(
|
|
source.getDraftSchematic());
|
|
if (draft == NULL)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
LocalRefPtr target = allocObject(ms_clsDraftSchematic);
|
|
if (target == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// set the ingredients
|
|
int numSlots = source.getSlotsCount();
|
|
LocalObjectArrayRefPtr slots = createNewObjectArray(numSlots, ms_clsDraftSchematicSlot);
|
|
if (slots == LocalObjectArrayRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
Crafting::IngredientSlot sourceSlot;
|
|
ServerDraftSchematicObjectTemplate::IngredientSlot draftSlot;
|
|
for (i = 0; i < numSlots; ++i)
|
|
{
|
|
if (!source.getSlot(i, sourceSlot, true))
|
|
{
|
|
WARNING(true, ("JavaLibrary::convert manf data: unable to get slot %d "
|
|
"from manf schematic %s", i, source.getDerivedNetworkId().getValueString().c_str()));
|
|
break;
|
|
}
|
|
|
|
// get the amount of ingredient required from the draft schematic
|
|
if (!draft->getSlot(draftSlot, sourceSlot.name))
|
|
{
|
|
WARNING(true, ("JavaLibrary::convert manf data: unable to get slot %s "
|
|
"from draft schematic %s", sourceSlot.name.getCanonicalRepresentation().c_str(),
|
|
draft->getObjectTemplateName()));
|
|
break;
|
|
}
|
|
int amountRequired = draftSlot.options[sourceSlot.draftSlotOption].
|
|
ingredients[0].count;
|
|
|
|
// create the ingredient object
|
|
LocalRefPtr slot = convert(source, sourceSlot, amountRequired,
|
|
draftSlot.appearance, draftSlot.options[0].ingredients[0].ingredient);
|
|
if (slot == LocalRef::cms_nullPtr)
|
|
{
|
|
WARNING(true, ("Unable to convert schematic slot %s to Java data",
|
|
sourceSlot.name.getCanonicalRepresentation().c_str()));
|
|
break;
|
|
}
|
|
|
|
setObjectArrayElement(*slots, i, *slot);
|
|
}
|
|
if (i != numSlots)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
setObjectField(*target, ms_fidDraftSchematicSlots, *slots);
|
|
|
|
// if we are converting the schematic in order to manufacture an object,
|
|
// just convert the object attributes and ingredient sources and exit
|
|
if (source.isMakingObject())
|
|
{
|
|
int numObjectAttribs = draft->getAttribsCount();
|
|
LocalObjectArrayRefPtr attributes = createNewObjectArray(numObjectAttribs, JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attributes == LocalObjectArrayRef::cms_nullPtr)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
for (i = 0; i < numObjectAttribs; ++i)
|
|
{
|
|
// create the attribute object
|
|
LocalRefPtr attribute = JavaLibrary::createObjectAttribute(source, *draft, i);
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
break;
|
|
setObjectArrayElement(*attributes, i, *attribute);
|
|
}
|
|
if (i != numObjectAttribs)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
setObjectField(*target, ms_fidDraftSchematicAttribs, *attributes);
|
|
return target;
|
|
}
|
|
|
|
// set the crafting category
|
|
setIntField(*target, ms_fidDraftSchematicCategory, draft->getCategory());
|
|
// set the base complexity
|
|
setFloatField(*target, ms_fidDraftSchematicComplexity, draft->getComplexity());
|
|
|
|
//
|
|
// set the attributes, the experimental attributes, and the mapping between them
|
|
//
|
|
|
|
LocalRefPtr attribMap = createNewObject(ms_clsHashtable, ms_midHashtable);
|
|
if (attribMap == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// create a local frame reference big enough so we can keep around the
|
|
// references to the object attributes and experiment attributes
|
|
const std::vector<StringId> & experimentNames = source.getExperimentAttributeNames();
|
|
int numExperimentAttribs = experimentNames.size();
|
|
int numObjectAttribs = draft->getAttribsCount();
|
|
|
|
// set the experimental attributes
|
|
std::vector<LocalRefPtr> experimentAttribRefs;
|
|
LocalObjectArrayRefPtr attributes = createNewObjectArray(numExperimentAttribs, JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attributes == LocalObjectArrayRef::cms_nullPtr)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
for (i = 0; i < numExperimentAttribs; ++i)
|
|
{
|
|
// create the attribute object
|
|
LocalRefPtr attribute = JavaLibrary::createExperimentAttribute(source, experimentNames[i]);
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
break;
|
|
|
|
setObjectArrayElement(*attributes, i, *attribute);
|
|
experimentAttribRefs.push_back(attribute);
|
|
}
|
|
if (i != numExperimentAttribs)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
setObjectField(*target, ms_fidDraftSchematicExperimentalAttribs, *attributes);
|
|
|
|
// set the object attributes
|
|
attributes = createNewObjectArray(numObjectAttribs, JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attributes == LocalObjectArrayRef::cms_nullPtr)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
for (i = 0; i < numObjectAttribs; ++i)
|
|
{
|
|
// create the attribute object
|
|
LocalRefPtr attribute = JavaLibrary::createObjectAttribute(source, *draft, i);
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
break;
|
|
setObjectArrayElement(*attributes, i, *attribute);
|
|
|
|
// find the experimental attribute associated with the object attibute
|
|
// and add it to the attribute map
|
|
StringId expAttrib(draft->getExperimentalAttributeFromAttribute(i));
|
|
for (int j = 0; j < numExperimentAttribs; ++j)
|
|
{
|
|
if (expAttrib == experimentNames[j])
|
|
{
|
|
callObjectMethod(*attribMap, ms_midMapPut,
|
|
attribute->getValue(), experimentAttribRefs[j]->getValue());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (i != numObjectAttribs)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
setObjectField(*target, JavaLibrary::getFidDraftSchematicAttribs(), *attributes);
|
|
setObjectField(*target, JavaLibrary::getFidDraftSchematicAttribMap(), *attribMap);
|
|
|
|
// restore our frame reference
|
|
experimentAttribRefs.clear();
|
|
|
|
// set the customization info from the shared object template
|
|
const ServerObjectTemplate * objectTemplate = draft->getCraftedObjectTemplate();
|
|
if (objectTemplate == NULL)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
const SharedObjectTemplate * sharedTemplate = safe_cast<const SharedObjectTemplate *>(
|
|
ObjectTemplateList::fetch(objectTemplate->getSharedTemplate()));
|
|
const SharedTangibleObjectTemplate * sharedTangibleTemplate = dynamic_cast<
|
|
const SharedTangibleObjectTemplate *>(sharedTemplate);
|
|
if (sharedTangibleTemplate != NULL)
|
|
{
|
|
// New method using the AssetCustomizationManager mechanism.
|
|
|
|
//-- Retrieve customization declarations for the appearance asset associated with
|
|
// the crafted object's shared object template.
|
|
|
|
// Create a dummy object.
|
|
Object *dummyObject = new MemoryBlockManagedObject();
|
|
NOT_NULL(dummyObject);
|
|
|
|
// Create a CustomizationData instance.
|
|
CustomizationData *customizationData = new CustomizationData(*dummyObject);
|
|
NOT_NULL(customizationData);
|
|
customizationData->fetch();
|
|
|
|
// Retrieve CustomizationData for crafted object's appearance template name.
|
|
bool const skipSharedOwnerVariables = true;
|
|
AssetCustomizationManager::addCustomizationVariablesForAsset(TemporaryCrcString(sharedTangibleTemplate->getAppearanceFilename().c_str(), true), *customizationData, skipSharedOwnerVariables);
|
|
|
|
// Retrieve all ranged int customization variables from CusotmizationData.
|
|
VariableInfoVector variableInfoList;
|
|
bool const includeRemoveVariables = false;
|
|
customizationData->iterateOverConstVariables(collectRangedIntVariableCallback, &variableInfoList, includeRemoveVariables);
|
|
|
|
int const count = static_cast<int>(variableInfoList.size());
|
|
#ifdef _DEBUG
|
|
LOG("crafting-customizations", ("customization variable count: %d for (%s)", count, sharedTangibleTemplate->getAppearanceFilename().c_str()));
|
|
#endif
|
|
|
|
//-- Create the Java array to hold the ranged int customization entries.
|
|
LocalObjectArrayRefPtr customizations = createNewObjectArray(count, ms_clsDraftSchematicCustom);
|
|
if (customizations == LocalObjectArrayRef::cms_nullPtr)
|
|
{
|
|
customizationData->release();
|
|
delete dummyObject;
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
|
|
//-- Fill in the Java array with customization entries.
|
|
int i;
|
|
|
|
for (i = 0; i < count; ++i)
|
|
{
|
|
VariableInfo const &info = variableInfoList[static_cast<VariableInfoVector::size_type>(i)];
|
|
|
|
// create the customization object
|
|
LocalRefPtr customization = allocObject(ms_clsDraftSchematicCustom);
|
|
if (customization == LocalRef::cms_nullPtr)
|
|
break;
|
|
|
|
// set the name
|
|
JavaString name(info.name.c_str());
|
|
setObjectField(*customization, JavaLibrary::getFidDraftSchematicCustomName(), name);
|
|
|
|
// set the values
|
|
setIntField(*customization, JavaLibrary::getFidDraftSchematicCustomValue(), info.value);
|
|
setIntField(*customization, JavaLibrary::getFidDraftSchematicCustomMinValue(), info.minValueInclusive);
|
|
setIntField(*customization, JavaLibrary::getFidDraftSchematicCustomMaxValue(), info.maxValueExclusive - 1);
|
|
// setBooleanField(*customization, ms_fidDraftSchematicCustomLocked,
|
|
// JNI_FALSE);
|
|
|
|
setObjectArrayElement(*customizations, i, *customization);
|
|
}
|
|
if (i != count)
|
|
{
|
|
customizationData->release();
|
|
delete dummyObject;
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
setObjectField(*target, ms_fidDraftSchematicCustomizations, *customizations);
|
|
|
|
//-- Cleanup.
|
|
customizationData->release();
|
|
delete dummyObject;
|
|
}
|
|
else
|
|
setObjectField(*target, ms_fidDraftSchematicCustomizations, LocalRef(0));
|
|
|
|
return target;
|
|
} // JavaLibrary::convert(const ManufactureObjectInterface &)
|
|
|
|
/**
|
|
* Converts a C++ Crafting::IngredientSlot to a Java draft_schematic$slot.
|
|
*
|
|
* @param schematic the manf schematic the slot belongs to
|
|
* @param source the IngredientSlot to convert
|
|
* @param amountRequired amount of ingredients required to fill the slot
|
|
* @param appearance appearance data associated with the slot
|
|
* @param requiredIngredient name of the ingredient needed for the slot
|
|
*
|
|
* @return a new draft_schematic object
|
|
*/
|
|
LocalRefPtr JavaLibrary::convert(const ManufactureObjectInterface & schematic,
|
|
const Crafting::IngredientSlot & source, int amountRequired,
|
|
const std::string & appearance, const std::string & requiredIngredient)
|
|
{
|
|
int i;
|
|
|
|
// create the slot object
|
|
LocalRefPtr slot = allocObject(ms_clsDraftSchematicSlot);
|
|
if (slot == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// set the slot name
|
|
LocalRefPtr slotName;
|
|
if (!ScriptConversion::convert(source.name, slotName))
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
setObjectField(*slot, ms_fidDraftSchematicSlotName, *slotName);
|
|
|
|
// set the slot appearance data
|
|
JavaString appearanceName(appearance.c_str());
|
|
setObjectField(*slot, ms_fidDraftSchematicSlotAppearance, appearanceName);
|
|
|
|
JavaString ingredientName(requiredIngredient);
|
|
if (ingredientName.getValue() == 0)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// set the slot data
|
|
setIntField(*slot, ms_fidDraftSchematicSlotOption, source.draftSlotOption);
|
|
setIntField(*slot, ms_fidDraftSchematicSlotIngredientType, source.ingredientType);
|
|
setFloatField(*slot, ms_fidDraftSchematicSlotComplexity, source.complexity);
|
|
setIntField(*slot, ms_fidDraftSchematicSlotAmountRequired, amountRequired);
|
|
setObjectField(*slot, ms_fidDraftSchematicSlotIngredientName, ingredientName);
|
|
|
|
// create the ingredients array
|
|
int count = source.ingredients.size();
|
|
LocalObjectArrayRefPtr ingredients = createNewObjectArray(count, ms_clsDraftSchematicSimpleIngredient);
|
|
if (ingredients == LocalObjectArrayRef::cms_nullPtr)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
for (i = 0; i < count; ++i)
|
|
{
|
|
// create the ingredient object
|
|
LocalRefPtr ingredient = allocObject(ms_clsDraftSchematicSimpleIngredient);
|
|
if (ingredient == LocalRef::cms_nullPtr)
|
|
{
|
|
WARNING(true, ("Unable to allocate Java memory for simple ingredient data"));
|
|
break;
|
|
}
|
|
|
|
// set the ingredient source and xp type
|
|
LocalRefPtr sourceId = getObjId(source.ingredients[i]->source);
|
|
setObjectField(*ingredient, ms_fidDraftSchematicSimpleIngredientSource,
|
|
*sourceId);
|
|
setIntField(*ingredient, ms_fidDraftSchematicSimpleIngredientXpType,
|
|
source.ingredients[i]->xpType);
|
|
|
|
|
|
// set the ingredient id
|
|
if (source.ingredientType == Crafting::IT_resourceType ||
|
|
source.ingredientType == Crafting::IT_resourceClass)
|
|
{
|
|
LocalRefPtr ingredientId = getObjId(source.ingredients[i]->ingredient);
|
|
if (ingredientId == LocalRef::cms_nullPtr)
|
|
{
|
|
WARNING(true, ("Unable to convert ingredient resource network id "
|
|
"%s to a Java obj_id", source.ingredients[i]->ingredient.getValueString().c_str()));
|
|
break;
|
|
}
|
|
setObjectField(*ingredient, ms_fidDraftSchematicSimpleIngredientIngredient,
|
|
*ingredientId);
|
|
}
|
|
else
|
|
{
|
|
const Crafting::ComponentIngredient * componentData = safe_cast<
|
|
const Crafting::ComponentIngredient *>(source.ingredients[i].get());
|
|
// TangibleObject * component = schematic.getComponent(*componentData);
|
|
// NOT_NULL(component);
|
|
// LocalRef ingredientId(getObjId(component->getNetworkId()));
|
|
LocalRefPtr componentId = getObjId(componentData->ingredient);
|
|
if (componentId == LocalRef::cms_nullPtr)
|
|
{
|
|
WARNING(true, ("Unable to convert ingredient component network id "
|
|
"%s to a Java obj_id", componentData->ingredient.getValueString().c_str()));
|
|
break;
|
|
}
|
|
setObjectField(*ingredient, ms_fidDraftSchematicSimpleIngredientIngredient,
|
|
*componentId);
|
|
setIntField(*ingredient, ms_fidDraftSchematicSimpleIngredientXpAmount,
|
|
componentData->sourceXp);
|
|
}
|
|
|
|
// set the ingredient count
|
|
setIntField(*ingredient, ms_fidDraftSchematicSimpleIngredientCount,
|
|
source.ingredients[i]->count);
|
|
|
|
setObjectArrayElement(*ingredients, i, *ingredient);
|
|
}
|
|
if (i != count)
|
|
{
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
setObjectField(*slot, ms_fidDraftSchematicSlotIngredients, *ingredients);
|
|
|
|
return slot;
|
|
} // JavaLibrary::convert(const Crafting::IngredientSlot &)
|
|
|
|
/**
|
|
* Converts a C++ DraftSchematicObject to a Java draft_schematic.
|
|
*
|
|
* @param source the DraftSchematicObject to convert
|
|
*
|
|
* @return a new draft_schematic object
|
|
*/
|
|
jobject JavaLibrary::convert(const DraftSchematicObject & source)
|
|
{
|
|
int i;
|
|
|
|
LocalRefPtr target = allocObject(ms_clsDraftSchematic);
|
|
if (target == LocalRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
// set the ingredients/slots
|
|
int numSlots = source.getSlotsCount();
|
|
LocalObjectArrayRefPtr slots = createNewObjectArray(numSlots, ms_clsDraftSchematicSlot);
|
|
if (slots == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
ServerDraftSchematicObjectTemplate::IngredientSlot slot;
|
|
for (i = 0; i < numSlots; ++i)
|
|
{
|
|
if (!source.getSlot(slot, i))
|
|
{
|
|
WARNING(true, ("JavaLibrary::convert draft data: unable to get slot %d "
|
|
"from draft schematic %s", i, source.getObjectTemplateName()));
|
|
break;
|
|
}
|
|
|
|
if (slot.options.empty())
|
|
{
|
|
WARNING(true, ("JavaLibrary::convert draft data: slot %d in draft "
|
|
"schematic %s has no options", i, source.getObjectTemplateName()));
|
|
break;
|
|
}
|
|
if (slot.options[0].ingredients.empty())
|
|
{
|
|
WARNING(true, ("JavaLibrary::convert draft data: slot %d in draft "
|
|
"schematic %s has no ingredients", i, source.getObjectTemplateName()));
|
|
break;
|
|
}
|
|
|
|
JavaString appearanceName(slot.appearance);
|
|
if (appearanceName.getValue() == 0)
|
|
break;
|
|
JavaString ingredientName(slot.options[0].ingredients[0].ingredient);
|
|
if (ingredientName.getValue() == 0)
|
|
break;
|
|
LocalRefPtr slotName;
|
|
if (!ScriptConversion::convert(slot.name, slotName))
|
|
break;
|
|
|
|
LocalRefPtr jslot = allocObject(ms_clsDraftSchematicSlot);
|
|
if (jslot == LocalRef::cms_nullPtr)
|
|
break;
|
|
|
|
setObjectField(*jslot, ms_fidDraftSchematicSlotName, *slotName);
|
|
setObjectField(*jslot, ms_fidDraftSchematicSlotIngredientName, ingredientName);
|
|
setObjectField(*jslot, ms_fidDraftSchematicSlotIngredients, LocalRef(0));
|
|
setObjectField(*jslot, ms_fidDraftSchematicSlotAppearance, appearanceName);
|
|
setIntField(*jslot, ms_fidDraftSchematicSlotOption, 0);
|
|
setIntField(*jslot, ms_fidDraftSchematicSlotIngredientType, slot.options[0].ingredientType);
|
|
setIntField(*jslot, ms_fidDraftSchematicSlotAmountRequired, slot.options[0].ingredients[0].count);
|
|
setFloatField(*jslot, ms_fidDraftSchematicSlotComplexity, slot.complexity);
|
|
setObjectArrayElement(*slots, i, *jslot);
|
|
}
|
|
if (i != numSlots)
|
|
{
|
|
return 0;
|
|
}
|
|
setObjectField(*target, ms_fidDraftSchematicSlots, *slots);
|
|
|
|
// set the attributes
|
|
int numAttributes = source.getAttribsCount();
|
|
LocalObjectArrayRefPtr attribs = createNewObjectArray(numAttributes, JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attribs == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
int minValue = 0;
|
|
int maxValue = 0;
|
|
for (i = 0; i < numAttributes; ++i)
|
|
{
|
|
const SharedDraftSchematicObjectTemplate::SchematicAttribute & attrib =
|
|
source.getAttrib(i);
|
|
source.getAttribMinMax(i, minValue, maxValue);
|
|
|
|
LocalRefPtr attribName;
|
|
if (!ScriptConversion::convert(attrib.name, attribName))
|
|
break;
|
|
|
|
LocalRefPtr jattrib = allocObject(JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (jattrib == LocalRef::cms_nullPtr)
|
|
break;
|
|
|
|
setObjectField(*jattrib, JavaLibrary::getFidDraftSchematicAttribName(), *attribName);
|
|
setFloatField(*jattrib, JavaLibrary::getFidDraftSchematicAttribMinValue(), static_cast<float>(minValue));
|
|
setFloatField(*jattrib, JavaLibrary::getFidDraftSchematicAttribMaxValue(), static_cast<float>(maxValue));
|
|
setFloatField(*jattrib, JavaLibrary::getFidDraftSchematicAttribResourceMaxValue(), 0);
|
|
setFloatField(*jattrib, JavaLibrary::getFidDraftSchematicAttribCurrentValue(), 0);
|
|
setObjectArrayElement(*attribs, i, *jattrib);
|
|
}
|
|
if (i != numAttributes)
|
|
{
|
|
return 0;
|
|
}
|
|
setObjectField(*target, JavaLibrary::getFidDraftSchematicAttribs(), *attribs);
|
|
|
|
// set the created item template crc value
|
|
const ServerObjectTemplate * craftedTemplate = source.getCraftedObjectTemplate();
|
|
if (craftedTemplate == NULL)
|
|
{
|
|
WARNING(true, ("JavaLibrary::convert DraftSchematicObject got null crafted "
|
|
"template for draft schematic %s", source.getObjectTemplateName()));
|
|
return 0;
|
|
}
|
|
setIntField(*target, ms_fidDraftSchematicObjectTemplateCreated, craftedTemplate->getCrcName().getCrc());
|
|
|
|
// set the script value
|
|
const ServerDraftSchematicObjectTemplate * const sourceSchematicTemplate =
|
|
safe_cast<const ServerDraftSchematicObjectTemplate *>(source.getObjectTemplate());
|
|
NOT_NULL(sourceSchematicTemplate);
|
|
if (sourceSchematicTemplate == NULL)
|
|
{
|
|
// emergency case for release mode
|
|
return 0;
|
|
}
|
|
const int numScripts = sourceSchematicTemplate->getManufactureScriptsCount();
|
|
LocalObjectArrayRefPtr scripts = createNewObjectArray(numScripts, JavaLibrary::getClsString());
|
|
if (scripts == LocalObjectArrayRef::cms_nullPtr)
|
|
{
|
|
WARNING(true, ("JavaLibrary::convert DraftSchematicObject could not allocate "
|
|
"script array for draft schematic %s", source.getObjectTemplateName()));
|
|
return 0;
|
|
}
|
|
for (i = 0; i < numScripts; ++i)
|
|
{
|
|
JavaString script(sourceSchematicTemplate->getManufactureScripts(i));
|
|
setObjectArrayElement(*scripts, i, script);
|
|
}
|
|
setObjectField(*target, ms_fidDraftSchematicScripts, *scripts);
|
|
|
|
return target->getReturnValue();
|
|
} // JavaLibrary::convert(const DraftSchematicObject &)
|
|
|
|
|
|
//========================================================================
|
|
// class JavaLibrary JNI crafting callback methods
|
|
//========================================================================
|
|
|
|
/**
|
|
* Starts a crafting session.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player who will be crafting
|
|
* @param station the design station a player will be using
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::startCraftingSession(JNIEnv *env, jobject self, jlong player, jlong station)
|
|
{
|
|
UNREF(env);
|
|
UNREF(self);
|
|
|
|
CreatureObject* playerObj = NULL;
|
|
if (!JavaLibrary::getObject(player, playerObj))
|
|
return JNI_FALSE;
|
|
|
|
TangibleObject* stationObj = NULL;
|
|
if (!JavaLibrary::getObject(station, stationObj))
|
|
return JNI_FALSE;
|
|
|
|
if (!stationObj->startCraftingSession(*playerObj))
|
|
return JNI_FALSE;
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::startCraftingSession
|
|
|
|
/**
|
|
* Ends a crafting session.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param crafter the player that was crafting
|
|
* @param tool the crafting tool that was being used
|
|
* @param prototype the prototype that was created (may be null)
|
|
*
|
|
* @return true on success, false on fail
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::endCraftingSession(JNIEnv *env, jobject self, jlong crafter, jlong tool, jlong prototype)
|
|
{
|
|
UNREF(env);
|
|
UNREF(self);
|
|
UNREF(tool);
|
|
|
|
// we're only do things if there's a prototype
|
|
if (prototype == 0)
|
|
return JNI_TRUE;
|
|
|
|
CreatureObject * crafterObj = NULL;
|
|
if (!JavaLibrary::getObject(crafter, crafterObj))
|
|
return JNI_FALSE;
|
|
|
|
TangibleObject * prototypeObj = NULL;
|
|
if (!JavaLibrary::getObject(prototype, prototypeObj))
|
|
return JNI_FALSE;
|
|
|
|
// tell the crafter to create the prototype
|
|
ObserveTracker::onCraftingEndCraftingSession(*crafterObj, *prototypeObj);
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::endCraftingSession
|
|
|
|
/**
|
|
* Sets the crafting level and station of a player's crafting session.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player who's crafting
|
|
* @param craftingLevel the crafting level of the session
|
|
* @param station the crafting station of the session
|
|
*
|
|
* @return true if the data was set, false on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setCraftingLevelAndStation(JNIEnv *env, jobject self, jlong player, jint craftingLevel, jlong station)
|
|
{
|
|
UNREF(self);
|
|
|
|
CreatureObject* creatureObject = NULL;
|
|
if (!JavaLibrary::getObject(player, creatureObject))
|
|
return JNI_FALSE;
|
|
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
|
|
if (playerObject == NULL)
|
|
return JNI_FALSE;
|
|
|
|
if (craftingLevel >= 0 && craftingLevel <= Crafting::MAX_CRAFTING_LEVEL)
|
|
playerObject->setCraftingLevel(craftingLevel);
|
|
|
|
if (station != 0)
|
|
{
|
|
const TangibleObject * stationObject = NULL;
|
|
const NetworkId stationId(station);
|
|
if (stationId != NetworkId::cms_invalid)
|
|
{
|
|
stationObject = dynamic_cast<const TangibleObject *>(ServerWorld::findObjectByNetworkId(stationId));
|
|
if (stationObject == NULL)
|
|
return JNI_FALSE;
|
|
}
|
|
playerObject->setCraftingStation(stationObject);
|
|
}
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setCraftingLevelAndStation
|
|
|
|
/**
|
|
* Gets the crafting level of a player's crafting session.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player who's crafting
|
|
*
|
|
* @return the crafting level, or -1 on error
|
|
*/
|
|
jint JNICALL ScriptMethodsCraftingNamespace::getCraftingLevel(JNIEnv *env, jobject self, jlong player)
|
|
{
|
|
UNREF(self);
|
|
|
|
const CreatureObject* creatureObject = NULL;
|
|
if (!JavaLibrary::getObject(player, creatureObject))
|
|
return -1;
|
|
const PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
|
|
if (playerObject == NULL)
|
|
return -1;
|
|
|
|
return playerObject->getCraftingLevel();
|
|
} // JavaLibrary::getCraftingLevel
|
|
|
|
/**
|
|
* Gets the crafting station of a player's crafting session.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player who's crafting
|
|
*
|
|
* @return the crafting station, or 0 on error
|
|
*/
|
|
jlong JNICALL ScriptMethodsCraftingNamespace::getCraftingStation(JNIEnv *env, jobject self, jlong player)
|
|
{
|
|
UNREF(self);
|
|
|
|
const CreatureObject* creatureObject = NULL;
|
|
if (!JavaLibrary::getObject(player, creatureObject))
|
|
return 0;
|
|
const PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
|
|
if (playerObject == NULL)
|
|
return 0;
|
|
|
|
return (playerObject->getCraftingStation()).getValue();
|
|
} // JavaLibrary::getCraftingStation
|
|
|
|
/**
|
|
* Sends a list of draft schematics to a player that he may select to craft an item.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player trying to use the station
|
|
* @param schematics list of schematic template name crcs the player may use to craft an item
|
|
*
|
|
* @return true on success, false if there was an error
|
|
**/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::sendUseableDraftSchematics(JNIEnv *env, jobject self, jlong player, jintArray schematics)
|
|
{
|
|
UNREF(self);
|
|
|
|
CreatureObject* creatureObject = NULL;
|
|
if (!JavaLibrary::getObject(player, creatureObject))
|
|
return JNI_FALSE;
|
|
PlayerObject * playerObject = PlayerCreatureController::getPlayerObject(creatureObject);
|
|
if (playerObject == NULL)
|
|
{
|
|
DEBUG_WARNING(true, ("JavaLibrary::sendUseableDraftSchematics non-player "
|
|
"object %s\n", creatureObject->getNetworkId().getValueString().c_str()));
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
int count = env->GetArrayLength(schematics);
|
|
if (count == 0)
|
|
return JNI_FALSE;
|
|
|
|
jint * schematicsArray = env->GetIntArrayElements(schematics, NULL);
|
|
if (schematicsArray != NULL)
|
|
{
|
|
std::vector<uint32> schematicCrcs(schematicsArray, &schematicsArray[count]);
|
|
playerObject->sendUseableDraftSchematics(schematicCrcs);
|
|
env->ReleaseIntArrayElements(schematics, schematicsArray, JNI_ABORT);
|
|
}
|
|
else
|
|
{
|
|
std::vector<uint32> schematicCrcs;
|
|
playerObject->sendUseableDraftSchematics(schematicCrcs);
|
|
}
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::sendUseableDraftSchematics
|
|
|
|
/**
|
|
* Sets an attribute for a manufacturing schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param attribute the attribute info to set
|
|
* @param experiment flag that these are experimental attributes
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicAttribute(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobject attribute, jboolean experiment)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0 || attribute == 0)
|
|
return JNI_FALSE;
|
|
|
|
ManufactureObjectInterface * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
LocalRefPtr attrName = getObjectField(LocalRefParam(attribute), JavaLibrary::getFidDraftSchematicAttribName());
|
|
jfloat value = env->GetFloatField(attribute, JavaLibrary::getFidDraftSchematicAttribCurrentValue());
|
|
jfloat resourceValue = env->GetFloatField(attribute, JavaLibrary::getFidDraftSchematicAttribResourceMaxValue());
|
|
|
|
if (attrName == LocalRef::cms_nullPtr)
|
|
return JNI_FALSE;
|
|
|
|
StringId name;
|
|
if (!ScriptConversion::convert(*attrName, name))
|
|
return JNI_FALSE;
|
|
|
|
if (experiment)
|
|
{
|
|
schematic->setExperimentAttribute(name, value);
|
|
jfloat minValue = env->GetFloatField(attribute, JavaLibrary::getFidDraftSchematicAttribMinValue());
|
|
jfloat maxValue = env->GetFloatField(attribute, JavaLibrary::getFidDraftSchematicAttribMaxValue());
|
|
schematic->setExperimentAttributeLimits(name, minValue, maxValue, resourceValue);
|
|
}
|
|
else
|
|
{
|
|
schematic->setAttribute(name, value);
|
|
schematic->setResourceMaxAttribute(name, resourceValue);
|
|
}
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicAttribute
|
|
|
|
/**
|
|
* Sets attributes for a manufacturing schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param attributes list of attribute info to set
|
|
* @param experiment flag that these are experimental attributes
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray attributes, jboolean experiment)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0 || attributes == 0)
|
|
return JNI_FALSE;
|
|
|
|
ManufactureObjectInterface * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
StringId name;
|
|
int count = env->GetArrayLength(attributes);
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
LocalRefPtr attribute = getObjectArrayElement(LocalObjectArrayRefParam(attributes), i);
|
|
if (attribute != LocalRef::cms_nullPtr)
|
|
{
|
|
LocalRefPtr attrName = getObjectField(*attribute, JavaLibrary::getFidDraftSchematicAttribName());
|
|
jfloat value = getFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribCurrentValue());
|
|
jfloat resourceValue = getFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribResourceMaxValue());
|
|
|
|
if (attrName != LocalRef::cms_nullPtr)
|
|
{
|
|
if (ScriptConversion::convert(*attrName, name))
|
|
{
|
|
if (experiment)
|
|
{
|
|
schematic->setExperimentAttribute(name, value);
|
|
jfloat minValue = getFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribMinValue());
|
|
jfloat maxValue = getFloatField(*attribute, JavaLibrary::getFidDraftSchematicAttribMaxValue());
|
|
schematic->setExperimentAttributeLimits(name,
|
|
minValue, maxValue, resourceValue);
|
|
}
|
|
else
|
|
{
|
|
schematic->setAttribute(name, value);
|
|
schematic->setResourceMaxAttribute(name, resourceValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicAttributes
|
|
|
|
/**
|
|
* Gets an attribute of a manufacturing schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param name name of the attribute to get
|
|
* @param experiment flag that these are experimental attributes
|
|
*
|
|
* @return the attribute, or null on error
|
|
*/
|
|
jobject JNICALL ScriptMethodsCraftingNamespace::getSchematicAttribute(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobject name, jboolean experiment)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0 || name == 0)
|
|
return 0;
|
|
|
|
ManufactureObjectInterface * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return 0;
|
|
|
|
const DraftSchematicObject * draft = DraftSchematicObject::getSchematic(
|
|
schematic->getDraftSchematic());
|
|
if (draft == NULL)
|
|
return 0;
|
|
|
|
StringId nameId;
|
|
if (!ScriptConversion::convert(name, nameId))
|
|
return 0;
|
|
|
|
if (experiment)
|
|
{
|
|
return JavaLibrary::createExperimentAttribute(*schematic, nameId)->getReturnValue();
|
|
}
|
|
else
|
|
{
|
|
return JavaLibrary::createObjectAttribute(*schematic, *draft, draft->getAttribIndex(nameId))->getReturnValue();
|
|
}
|
|
} // JavaLibrary::getSchematicAttribute
|
|
|
|
/**
|
|
* Gets a select list of the attributes of a manufacturing schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param names names of the attributes to get
|
|
* @param experiment flag that these are experimental attributes
|
|
*
|
|
* @return the attributes, or null on error
|
|
*/
|
|
jobjectArray JNICALL ScriptMethodsCraftingNamespace::getSchematicAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray names, jboolean experiment)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return 0;
|
|
|
|
ManufactureObjectInterface * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return 0;
|
|
|
|
const DraftSchematicObject * draft = DraftSchematicObject::getSchematic(
|
|
schematic->getDraftSchematic());
|
|
if (draft == NULL)
|
|
return 0;
|
|
|
|
int numAttribs = env->GetArrayLength(names);
|
|
|
|
// create the attribute array
|
|
LocalObjectArrayRefPtr attributes = createNewObjectArray(numAttribs, JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attributes == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
int i;
|
|
StringId attribName;
|
|
for (i = 0; i < numAttribs; ++i)
|
|
{
|
|
LocalRefPtr name = getObjectArrayElement(LocalObjectArrayRefParam(names), i);
|
|
if (!ScriptConversion::convert(*name, attribName))
|
|
break;
|
|
|
|
// create the attribute object
|
|
LocalRefPtr attribute;
|
|
if (experiment)
|
|
{
|
|
attribute = JavaLibrary::createExperimentAttribute(*schematic, attribName);
|
|
}
|
|
else
|
|
{
|
|
attribute = JavaLibrary::createObjectAttribute(*schematic, *draft, draft->getAttribIndex(
|
|
attribName));
|
|
}
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
break;
|
|
|
|
setObjectArrayElement(*attributes, i, *attribute);
|
|
}
|
|
|
|
if (i != numAttribs)
|
|
{
|
|
attributes = LocalObjectArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
return attributes->getReturnValue();
|
|
} // JavaLibrary::getSchematicAttributes
|
|
|
|
/**
|
|
* Gets all the attributes of a manufacturing schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param experiment flag that these are experimental attributes
|
|
*
|
|
* @return the attributes, or null on error
|
|
*/
|
|
jobjectArray JNICALL ScriptMethodsCraftingNamespace::getAllSchematicAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jboolean experiment)
|
|
{
|
|
UNREF(env);
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return 0;
|
|
|
|
ManufactureObjectInterface * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return 0;
|
|
|
|
const DraftSchematicObject * draft = DraftSchematicObject::getSchematic(
|
|
schematic->getDraftSchematic());
|
|
if (draft == NULL)
|
|
return 0;
|
|
|
|
// set the attributes
|
|
int numAttribs = 0;
|
|
const std::vector<StringId> & experimentNames = schematic->getExperimentAttributeNames();
|
|
if (experiment)
|
|
numAttribs = experimentNames.size();
|
|
else
|
|
numAttribs = draft->getAttribsCount();
|
|
LocalObjectArrayRefPtr attributes = createNewObjectArray(numAttribs, JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (attributes == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
for (int i = 0; i < numAttribs; ++i)
|
|
{
|
|
// create the attribute object
|
|
LocalRefPtr attribute;
|
|
if (experiment)
|
|
{
|
|
attribute = JavaLibrary::createExperimentAttribute(*schematic, experimentNames[i]);
|
|
}
|
|
else
|
|
{
|
|
attribute = JavaLibrary::createObjectAttribute(*schematic, *draft, i);
|
|
}
|
|
|
|
setObjectArrayElement(*attributes, i, *attribute);
|
|
}
|
|
|
|
return attributes->getReturnValue();
|
|
} // JavaLibrary::getAllSchematicAttributes
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns a draft_schematic structure filled in with info about requested
|
|
* experimental attributes. The info will consist of the experimentation attribute
|
|
* data, the object attributes associated with them, and a mapping between the two.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic to get the data from
|
|
* @param attributeNames the experimental attributes we're interested about
|
|
*
|
|
* @return the draft_schematic object, or null on error
|
|
*/
|
|
jobject JNICALL ScriptMethodsCraftingNamespace::getSchematicForExperimentalAttributes(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray attributeNames)
|
|
{
|
|
int i;
|
|
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0 || attributeNames == 0)
|
|
return 0;
|
|
|
|
const ManufactureObjectInterface * manfSchematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, manfSchematic))
|
|
return 0;
|
|
|
|
const DraftSchematicObject * draftSchematic = DraftSchematicObject::getSchematic(
|
|
manfSchematic->getDraftSchematic());
|
|
if (draftSchematic == NULL)
|
|
return 0;
|
|
|
|
// create a draft_schematic object to return
|
|
LocalRefPtr target = allocObject(JavaLibrary::getClsDraftSchematic());
|
|
if (target == LocalRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
// create the experimental attributes array
|
|
int numExperimentAttribs = env->GetArrayLength(attributeNames);
|
|
LocalObjectArrayRefPtr experimentalAttribs = createNewObjectArray(numExperimentAttribs,
|
|
JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (experimentalAttribs == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
// create the object attributes array
|
|
int numObjectAttribs = draftSchematic->getAttribsCount();
|
|
LocalObjectArrayRefPtr objectAttribs = createNewObjectArray(numObjectAttribs,
|
|
JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (objectAttribs == LocalObjectArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
// create a map of experimental attributes to object attributes
|
|
LocalRefPtr attribMap = createNewObject(JavaLibrary::getClsHashtable(), JavaLibrary::getMidHashtable());
|
|
if (attribMap == LocalRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
std::vector<LocalRefPtr> objectAttribRefs;
|
|
|
|
// create the object attributes objects
|
|
for (i = 0; i < numObjectAttribs; ++i)
|
|
{
|
|
// create the attribute object
|
|
LocalRefPtr attribute = JavaLibrary::createObjectAttribute(*manfSchematic, *draftSchematic, i);
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
{
|
|
objectAttribRefs.clear();
|
|
return 0;
|
|
}
|
|
|
|
setObjectArrayElement(*objectAttribs, i, *attribute);
|
|
objectAttribRefs.push_back(attribute);
|
|
}
|
|
setObjectField(*target, JavaLibrary::getFidDraftSchematicAttribs(), *objectAttribs);
|
|
|
|
// create the experimental attribute objects
|
|
StringId experimentAttribName;
|
|
for (i = 0; i < numExperimentAttribs; ++i)
|
|
{
|
|
// get the experimental attribute name
|
|
LocalRefPtr name = getObjectArrayElement(LocalObjectArrayRefParam(attributeNames), i);
|
|
if (name == LocalRef::cms_nullPtr)
|
|
{
|
|
objectAttribRefs.clear();
|
|
return 0;
|
|
}
|
|
|
|
if (!ScriptConversion::convert(*name, experimentAttribName))
|
|
{
|
|
objectAttribRefs.clear();
|
|
return 0;
|
|
}
|
|
|
|
// get the data for the experimental attribute
|
|
LocalRefPtr attribute = JavaLibrary::createExperimentAttribute(*manfSchematic,
|
|
experimentAttribName);
|
|
if (attribute == LocalRef::cms_nullPtr)
|
|
{
|
|
objectAttribRefs.clear();
|
|
return 0;
|
|
}
|
|
|
|
setObjectArrayElement(*experimentalAttribs, i, *attribute);
|
|
|
|
// find all the object attributes associated with this experimental
|
|
// attribute and map them to each other
|
|
LocalObjectArrayRefPtr mappedObjectAttribs = createNewObjectArray(numObjectAttribs,
|
|
JavaLibrary::getClsDraftSchematicAttrib());
|
|
if (mappedObjectAttribs == LocalObjectArrayRef::cms_nullPtr)
|
|
{
|
|
objectAttribRefs.clear();
|
|
return 0;
|
|
}
|
|
|
|
int j;
|
|
int mappedObjectIndex = 0;
|
|
for (j = 0; j < numObjectAttribs; ++j)
|
|
{
|
|
if (draftSchematic->getAttribMin(j).value != draftSchematic->getAttribMax(j).value)
|
|
{
|
|
const SharedDraftSchematicObjectTemplate::SchematicAttribute &
|
|
objectAttrib = draftSchematic->getAttribMin(j);
|
|
if (objectAttrib.experiment == experimentAttribName)
|
|
{
|
|
setObjectArrayElement(*mappedObjectAttribs, mappedObjectIndex++, *objectAttribRefs[j]);
|
|
}
|
|
}
|
|
}
|
|
for (j = mappedObjectIndex; j < numObjectAttribs; ++j)
|
|
{
|
|
setObjectArrayElement(*mappedObjectAttribs, j, LocalRef(0));
|
|
}
|
|
callObjectMethod(*attribMap, JavaLibrary::getMidMapPut(), attribute->getValue(), mappedObjectAttribs->getValue());
|
|
}
|
|
setObjectField(*target, JavaLibrary::getFidDraftSchematicExperimentalAttribs(), *experimentalAttribs);
|
|
setObjectField(*target, JavaLibrary::getFidDraftSchematicAttribMap(), *attribMap);
|
|
|
|
objectAttribRefs.clear();
|
|
|
|
return target->getReturnValue();
|
|
} // JavaLibrary::getSchematicForExperimentalAttributes
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets an approximate experiment mod for an assembled schematic so the player will have some idea of
|
|
* the risk experimenting with an item.
|
|
*
|
|
* @param manufacturingSchematic the schematic
|
|
* @param experimentMod approximent mod that will be applied during experimentation
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicExperimentMod(JNIEnv *env, jobject self, jlong manufacturingSchematic, jfloat experimentMod)
|
|
{
|
|
UNREF(self);
|
|
|
|
ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
schematic->setExperimentMod(experimentMod);
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicExperimentMod
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the appearances that will be available to the player during customization.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic that will create the
|
|
* customized object
|
|
* @param appearances appearance filenames that the player may choose
|
|
*
|
|
* @return JNI_TRUE on success, JNI_FALSE on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicAppearances(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray appearances)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0 || appearances == 0)
|
|
return JNI_FALSE;
|
|
|
|
ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
std::string appearance;
|
|
int count = env->GetArrayLength(appearances);
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
JavaString appearanceString(static_cast<jstring>(env->GetObjectArrayElement(
|
|
appearances, i)));
|
|
if (JavaLibrary::convert(appearanceString, appearance))
|
|
{
|
|
schematic->addAppearance(appearance);
|
|
}
|
|
}
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicAppearances
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the customization parameters that a player is allowed to change, or
|
|
* differ in their default value from the template. You do not have to set
|
|
* fixed customization parameters that use their default value.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic that will create the
|
|
* customized object
|
|
* @param customizations customization info
|
|
*
|
|
* @return JNI_TRUE on success, JNI_FALSE if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicCustomizations(JNIEnv *env, jobject self, jlong manufacturingSchematic, jobjectArray customizations)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0 || customizations == 0)
|
|
return JNI_FALSE;
|
|
|
|
ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
std::string name;
|
|
int count = env->GetArrayLength(customizations);
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
LocalRefPtr custom = getObjectArrayElement(LocalObjectArrayRefParam(customizations), i);
|
|
if (custom == LocalRef::cms_nullPtr)
|
|
continue;
|
|
|
|
JavaStringPtr jname = getStringField(*custom, JavaLibrary::getFidDraftSchematicCustomName());
|
|
if (jname == JavaString::cms_nullPtr)
|
|
continue;
|
|
if (!JavaLibrary::convert(*jname, name))
|
|
return JNI_FALSE;
|
|
|
|
int value = getIntField(*custom, JavaLibrary::getFidDraftSchematicCustomValue());
|
|
int minValue = getIntField(*custom, JavaLibrary::getFidDraftSchematicCustomMinValue());
|
|
int maxValue = getIntField(*custom, JavaLibrary::getFidDraftSchematicCustomMaxValue());
|
|
|
|
schematic->setCustomization(name, value, minValue, maxValue);
|
|
}
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicCustomizations
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the number of items a manufacturing schematic can create.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
*
|
|
* @return the number of items, or -1 on error
|
|
*/
|
|
jint JNICALL ScriptMethodsCraftingNamespace::getSchematicItemCount(JNIEnv *env, jobject self, jlong manufacturingSchematic)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return -1;
|
|
|
|
const ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return -1;
|
|
|
|
return schematic->getCount();
|
|
} // JavaLibrary::getSchematicItemCount
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the number of items a manufacturing schematic can create.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param count the number of items
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicItemCount(JNIEnv *env, jobject self, jlong manufacturingSchematic, jint count)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return JNI_FALSE;
|
|
|
|
ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
schematic->setCount(count);
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicItemCount
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the numer of items per container a manufacturing schematic will
|
|
* create.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
*
|
|
* @return the number of items, or -1 on error
|
|
*/
|
|
jint JNICALL ScriptMethodsCraftingNamespace::getSchematicItemsPerContainer(JNIEnv *env, jobject self, jlong manufacturingSchematic)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return -1;
|
|
|
|
const ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return -1;
|
|
|
|
return schematic->getItemsPerContainer();
|
|
} // JavaLibrary::getSchematicItemsPerContainer
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the numer of items per container a manufacturing schematic will
|
|
* create.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param count the number of items
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicItemsPerContainer(JNIEnv *env, jobject self, jlong manufacturingSchematic, jint count)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return JNI_FALSE;
|
|
|
|
ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
schematic->setItemsPerContainer(count);
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicItemsPerContainer
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the time per complexity point it takes to manufacture an item with
|
|
* a manufacturing schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
*
|
|
* @return the time, or -1 on error
|
|
*/
|
|
jfloat JNICALL ScriptMethodsCraftingNamespace::getSchematicManufactureTime(JNIEnv *env, jobject self, jlong manufacturingSchematic)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return -1.0f;
|
|
|
|
const ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return -1.0f;
|
|
|
|
return schematic->getManufactureTime();
|
|
} // JavaLibrary::getSchematicManufactureTime
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the time per complexity point it takes to manufacture an item with
|
|
* a manufacturing schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic
|
|
* @param time the manufacturing time per complexity
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSchematicManufactureTime(JNIEnv *env, jobject self, jlong manufacturingSchematic, jfloat time)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (manufacturingSchematic == 0)
|
|
return JNI_FALSE;
|
|
|
|
ManufactureSchematicObject * schematic = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematic))
|
|
return JNI_FALSE;
|
|
|
|
schematic->setManufactureTime(time);
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSchematicManufactureTime
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the amount of xp the creator of an object will get when an object is "used".
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param object the object that will grant the xp
|
|
* @param xp the amount of xp to grant
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setCreatorXp(JNIEnv *env, jobject self, jlong object, jint xp)
|
|
{
|
|
UNREF(self);
|
|
|
|
TangibleObject * target = NULL;
|
|
if (!JavaLibrary::getObject(object, target))
|
|
return JNI_FALSE;
|
|
|
|
target->setCreatorXp(xp);
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setCreatorXp
|
|
|
|
/**
|
|
* Gets a list of ingredients needed to craft using the current manufacturing
|
|
* schematic in a manufacturing station.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param station the manufacturing station id
|
|
* @param ingredients array to be filled in with a string array of ingredients
|
|
*/
|
|
void JNICALL ScriptMethodsCraftingNamespace::getIngredientsForManufactureStation(JNIEnv *env, jobject self, jlong station, jobjectArray ingredients)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (station == 0 || ingredients == 0)
|
|
return;
|
|
|
|
const ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return;
|
|
|
|
if (env->GetArrayLength(ingredients) != 1)
|
|
return;
|
|
|
|
const ManufactureSchematicObject * const schematic = manfStation->getSchematic();
|
|
if (schematic == NULL)
|
|
return;
|
|
|
|
static ManufactureSchematicObject::IngredientInfoVector iiv;
|
|
iiv.clear ();
|
|
|
|
schematic->getIngredientInfo (iiv);
|
|
|
|
if (iiv.empty ())
|
|
return;
|
|
|
|
const size_t count = iiv.size();
|
|
|
|
LocalObjectArrayRefPtr ingredientList = createNewObjectArray(count, JavaLibrary::getClsString());
|
|
if (ingredientList == LocalObjectArrayRef::cms_nullPtr)
|
|
return;
|
|
|
|
char buf [128];
|
|
const size_t buf_size = sizeof (buf);
|
|
|
|
for (size_t i = 0; i < count; ++i)
|
|
{
|
|
const ManufactureSchematicObject::IngredientInfo & info = iiv [i];
|
|
|
|
const Unicode::String & name = info.first;
|
|
const int numPerItem = info.second.second;
|
|
|
|
if (name.empty ())
|
|
continue;
|
|
|
|
snprintf (buf, buf_size, ":\\>200%d", numPerItem);
|
|
|
|
Unicode::String element = name;
|
|
|
|
if (name [0] == '@')
|
|
element.push_back ('\0');
|
|
|
|
element += Unicode::narrowToWide (buf);
|
|
|
|
JavaString jelement(element);
|
|
setObjectArrayElement(*ingredientList, i, jelement);
|
|
}
|
|
|
|
setObjectArrayElement(LocalObjectArrayRefParam(ingredients), 0, *ingredientList);
|
|
} // JavaLibrary::getIngredientsForManufactureStation
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Gets the id of a manufacture station's input hopper.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param station the station id
|
|
*
|
|
* @return the hopper id, or null on error
|
|
*/
|
|
jlong JNICALL ScriptMethodsCraftingNamespace::getManufactureStationInputHopper(JNIEnv *env, jobject self, jlong station)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (station == 0)
|
|
return 0;
|
|
|
|
const ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return 0;
|
|
|
|
ServerObject * hopper = manfStation->getInputHopper();
|
|
if (hopper == NULL)
|
|
return 0;
|
|
|
|
return (hopper->getNetworkId()).getValue();
|
|
} // JavaLibrary::getManufactureStationInputHopper
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Gets the id of a manufacture station's output hopper.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param station the station id
|
|
*
|
|
* @return the hopper id, or null on error
|
|
*/
|
|
jlong JNICALL ScriptMethodsCraftingNamespace::getManufactureStationOutputHopper(JNIEnv *env, jobject self, jlong station)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (station == 0)
|
|
return 0;
|
|
|
|
const ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return 0;
|
|
|
|
ServerObject * hopper = manfStation->getOutputHopper();
|
|
if (hopper == NULL)
|
|
return 0;
|
|
|
|
return (hopper->getNetworkId()).getValue();
|
|
} // JavaLibrary::getManufactureStationOutputHopper
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Gets the id and name of the schematic in a manufacture station.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param station the station id
|
|
*
|
|
* @return a string of the form <id> "*" <name>, or null if the station has no schematic
|
|
*/
|
|
jstring JNICALL ScriptMethodsCraftingNamespace::getManufactureStationSchematic(JNIEnv *env, jobject self, jlong station)
|
|
{
|
|
static const Unicode::String SEPARATOR(Unicode::narrowToWide("*"));
|
|
|
|
UNREF(self);
|
|
|
|
const ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return 0;
|
|
|
|
const ManufactureSchematicObject * manfSchematic = manfStation->getSchematic();
|
|
if (manfSchematic == NULL)
|
|
return 0;
|
|
|
|
return JavaString(
|
|
Unicode::narrowToWide(manfSchematic->getNetworkId().getValueString()) +
|
|
SEPARATOR +
|
|
manfSchematic->getObjectName()
|
|
).getReturnValue();
|
|
} // JavaLibrary::getManufactureStationSchematic
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Gets a list of manufacture schematics that could be used at a given manufacturing
|
|
* station.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player whose schematics to get
|
|
* @param station the manufacturing station
|
|
* @param schematics array to be filled in with a string array of schematics
|
|
*/
|
|
void JNICALL ScriptMethodsCraftingNamespace::getValidManufactureSchematicsForStation(JNIEnv *env, jobject self, jlong player, jlong station, jobjectArray schematics)
|
|
{
|
|
static const Unicode::String SEPARATOR(Unicode::narrowToWide("*"));
|
|
|
|
UNREF(self);
|
|
|
|
if (player == 0 || station == 0 || schematics == 0)
|
|
return;
|
|
|
|
CreatureObject * playerCreature = NULL;
|
|
if (!JavaLibrary::getObject(player, playerCreature))
|
|
return;
|
|
|
|
const ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return;
|
|
|
|
if (env->GetArrayLength(schematics) != 1)
|
|
return;
|
|
|
|
std::vector<const ManufactureSchematicObject *> manfSchematics;
|
|
uint32 stationTypes = manfStation->getValidSchematicTypes();
|
|
playerCreature->getManufactureSchematics(manfSchematics, stationTypes);
|
|
|
|
int count = manfSchematics.size();
|
|
LocalObjectArrayRefPtr schematicList = createNewObjectArray(count, JavaLibrary::getClsString());
|
|
if (schematicList == LocalObjectArrayRef::cms_nullPtr)
|
|
return;
|
|
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
const ManufactureSchematicObject * manfSchematic = manfSchematics[i];
|
|
setObjectArrayElement(*schematicList, i,
|
|
JavaString(
|
|
Unicode::narrowToWide(manfSchematic->getNetworkId().getValueString()) +
|
|
SEPARATOR +
|
|
manfSchematic->getObjectName()
|
|
));
|
|
}
|
|
|
|
setObjectArrayElement(LocalObjectArrayRefParam(schematics), 0, *schematicList);
|
|
} // JavaLibrary::getValidManufactureSchematicsForStation
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Checks if a player has any manufacture schematics that could be used at a
|
|
* given manufacturing station.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player whose schematics to check
|
|
* @param station the manufacturing station
|
|
*
|
|
* @return true if the player has any schematics, false if not
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::hasValidManufactureSchematicsForStation(JNIEnv *env, jobject self, jlong player, jlong station)
|
|
{
|
|
static const Unicode::String SEPARATOR(Unicode::narrowToWide("*"));
|
|
|
|
UNREF(self);
|
|
|
|
if (player == 0 || station == 0)
|
|
return JNI_FALSE;
|
|
|
|
CreatureObject * playerCreature = NULL;
|
|
if (!JavaLibrary::getObject(player, playerCreature))
|
|
return JNI_FALSE;
|
|
|
|
const ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return JNI_FALSE;
|
|
|
|
std::vector<const ManufactureSchematicObject *> manfSchematics;
|
|
playerCreature->getManufactureSchematics(manfSchematics,
|
|
manfStation->getValidSchematicTypes());
|
|
|
|
if (manfSchematics.empty())
|
|
return JNI_FALSE;
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::hasValidManufactureSchematicsForStation
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Transfers the manufacture schematic in a manufacturing station to a player.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param station the manufacturing station id
|
|
* @param player the the player to transfer to
|
|
*
|
|
* @return true if the schematic was transferred, false if not
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::transferManufactureSchematicToPlayer(JNIEnv *env, jobject self, jlong station, jlong player)
|
|
{
|
|
UNREF(self);
|
|
|
|
const ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return JNI_FALSE;
|
|
|
|
ManufactureSchematicObject * schematic = manfStation->getSchematic();
|
|
if (schematic == NULL)
|
|
return JNI_TRUE;
|
|
|
|
CreatureObject * playerCreature = NULL;
|
|
if (!JavaLibrary::getObject(player, playerCreature))
|
|
return JNI_FALSE;
|
|
|
|
ServerObject * datapad = playerCreature->getDatapad();
|
|
if (datapad == NULL)
|
|
return JNI_FALSE;
|
|
|
|
Container::ContainerErrorCode tmp = Container::CEC_Success;
|
|
if (ContainerInterface::transferItemToVolumeContainer(*datapad, *schematic, NULL, tmp))
|
|
return JNI_TRUE;
|
|
return JNI_FALSE;
|
|
} // JavaLibrary::transferManufactureSchematicToPlayer
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Transfers a manufacture schematic to a manufacturing station.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param schematic the schematic id
|
|
* @param station the manufacturing station id
|
|
*
|
|
* @return true if the schematic was transferred, false if not
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::transferManufactureSchematicToStation(JNIEnv *env, jobject self, jlong schematic, jlong station)
|
|
{
|
|
UNREF(self);
|
|
|
|
ManufactureSchematicObject * manfSchematic = NULL;
|
|
if (!JavaLibrary::getObject(schematic, manfSchematic))
|
|
return JNI_FALSE;
|
|
|
|
ManufactureInstallationObject * manfStation = NULL;
|
|
if (!JavaLibrary::getObject(station, manfStation))
|
|
return JNI_FALSE;
|
|
|
|
if (manfStation->addSchematic(*manfSchematic, NULL))
|
|
return JNI_TRUE;
|
|
return JNI_FALSE;
|
|
} // JavaLibrary::transferManufactureSchematicToStation
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Gets a list of objects that can be repaired by a given repair tool.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param player the player whose objects to get
|
|
* @param tool the repair tool
|
|
* @param objects array to be filled in with a string array of objects
|
|
*/
|
|
void JNICALL ScriptMethodsCraftingNamespace::getRepairableObjectsForTool(JNIEnv *env, jobject self, jlong player, jlong tool, jobjectArray objects)
|
|
{
|
|
static const Unicode::String SEPARATOR(Unicode::narrowToWide("*"));
|
|
|
|
if (player == 0 || tool == 0 || objects == 0)
|
|
return;
|
|
|
|
CreatureObject * playerCreature = NULL;
|
|
if (!JavaLibrary::getObject(player, playerCreature))
|
|
return;
|
|
|
|
const TangibleObject * toolObject = NULL;
|
|
if (!JavaLibrary::getObject(tool, toolObject))
|
|
return;
|
|
if (!toolObject->isRepairTool())
|
|
return;
|
|
int toolType = toolObject->getCraftingType();
|
|
|
|
// determine if the repair tool repairs a specific GOT or a category
|
|
bool genericTool = false;
|
|
if ((toolType & 0x000000ff) == 0)
|
|
genericTool = true;
|
|
|
|
if (env->GetArrayLength(objects) != 1)
|
|
return;
|
|
|
|
// @todo: we need to get a list of things the player owns that are loaded,
|
|
// so non-inventory objects can be repaired. For now, just repair inventory
|
|
// objects
|
|
|
|
const ServerObject * inventory = playerCreature->getInventory();
|
|
if (inventory == NULL)
|
|
return;
|
|
|
|
const VolumeContainer * inventoryContainer = ContainerInterface::getVolumeContainer(*inventory);
|
|
if (inventoryContainer == NULL)
|
|
return;
|
|
|
|
std::vector<Unicode::String> objList;
|
|
for (ContainerConstIterator iter(inventoryContainer->begin());
|
|
iter != inventoryContainer->end(); ++iter)
|
|
{
|
|
const CachedNetworkId & objId = (*iter);
|
|
const TangibleObject * obj = safe_cast<const TangibleObject *>(objId.getObject());
|
|
if (obj != NULL && !obj->isCraftingTool() && !obj->isRepairTool() &&
|
|
obj->getDamageTaken() > 0)
|
|
{
|
|
if ((genericTool && (toolType & obj->getGameObjectType()) != 0) ||
|
|
(!genericTool && toolType == obj->getGameObjectType()))
|
|
{
|
|
objList.push_back(
|
|
Unicode::narrowToWide(obj->getNetworkId().getValueString()) +
|
|
SEPARATOR +
|
|
obj->getEncodedObjectName ());
|
|
}
|
|
}
|
|
}
|
|
|
|
int count = objList.size();
|
|
LocalObjectArrayRefPtr objectStringList = createNewObjectArray(count, JavaLibrary::getClsString());
|
|
if (objectStringList == LocalObjectArrayRef::cms_nullPtr)
|
|
return;
|
|
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
setObjectArrayElement(*objectStringList, i, JavaString(objList[i]));
|
|
}
|
|
|
|
setObjectArrayElement(LocalObjectArrayRefParam(objects), 0, *objectStringList);
|
|
} // JavaLibrary::getRepairableObjectsForTool
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the attribute bonuses an object grants when equipped.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
*
|
|
* @return an array with the bonus for each attribute, or null on error
|
|
*/
|
|
jintArray JNICALL ScriptMethodsCraftingNamespace::getAttributeBonuses(JNIEnv *env, jobject self, jlong target)
|
|
{
|
|
UNREF(self);
|
|
|
|
const ServerObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return 0;
|
|
|
|
std::vector<std::pair<int, int> > bonuses;
|
|
if (object->asTangibleObject() != NULL)
|
|
{
|
|
object->asTangibleObject()->getAttribBonuses(bonuses);
|
|
}
|
|
else if (object->asManufactureSchematicObject() != NULL)
|
|
{
|
|
object->asManufactureSchematicObject()->getAttribBonuses(bonuses);
|
|
}
|
|
else
|
|
return 0;
|
|
|
|
jint bonusesArray[Attributes::NumberOfAttributes];
|
|
{
|
|
for (int i = 0; i < Attributes::NumberOfAttributes; ++i)
|
|
bonusesArray[i] = 0;
|
|
}
|
|
{
|
|
for (std::vector<std::pair<int, int> >::const_iterator i = bonuses.begin();
|
|
i != bonuses.end(); ++i)
|
|
{
|
|
if ((*i).first >= 0 && (*i).first < Attributes::NumberOfAttributes)
|
|
bonusesArray[(*i).first] = (*i).second;
|
|
}
|
|
}
|
|
|
|
LocalIntArrayRefPtr jbonuses = createNewIntArray(Attributes::NumberOfAttributes);
|
|
if (jbonuses == LocalIntArrayRef::cms_nullPtr)
|
|
return 0;
|
|
|
|
setIntArrayRegion(*jbonuses, 0, Attributes::NumberOfAttributes, &bonusesArray[0]);
|
|
return jbonuses->getReturnValue();
|
|
} // JavaLibrary::getAttributeBonuses
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the attribute bonus of an object for a given attribute.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param attribute the attribute to get
|
|
*
|
|
* @return the attribute bonus
|
|
*/
|
|
jint JNICALL ScriptMethodsCraftingNamespace::getAttributeBonus(JNIEnv *env, jobject self, jlong target, jint attribute)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (attribute < 0 || attribute >= Attributes::NumberOfAttributes)
|
|
return 0;
|
|
|
|
const ServerObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return 0;
|
|
|
|
jint bonus = 0;
|
|
if (object->asTangibleObject() != NULL)
|
|
{
|
|
bonus = object->asTangibleObject()->getAttribBonus(attribute);
|
|
}
|
|
else if (object->asManufactureSchematicObject() != NULL)
|
|
{
|
|
bonus = object->asManufactureSchematicObject()->getAttribBonus(attribute);
|
|
}
|
|
return bonus;
|
|
} // JavaLibrary::getAttributeBonus
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the attribute bonus an object applies when equipped.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param attribute the attribute to set
|
|
* @param bonus the attribute bonus value
|
|
*
|
|
* @return true on success, false on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setAttributeBonus(JNIEnv *env, jobject self, jlong target, jint attribute, jint bonus)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (attribute < 0 || attribute >= Attributes::NumberOfAttributes)
|
|
return JNI_FALSE;
|
|
|
|
ServerObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return JNI_FALSE;
|
|
|
|
if (object->asTangibleObject() != NULL)
|
|
{
|
|
object->asTangibleObject()->setAttribBonus(attribute, bonus);
|
|
}
|
|
else if (object->asManufactureSchematicObject() != NULL)
|
|
{
|
|
object->asManufactureSchematicObject()->setAttribBonus(attribute, bonus);
|
|
}
|
|
else
|
|
return JNI_FALSE;
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setAttributeBonus
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the attribute bonuses an object applies when equipped.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param bonuses the attribute bonus values
|
|
*
|
|
* @return true on success, false on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setAttributeBonuses(JNIEnv *env, jobject self, jlong target, jintArray bonuses)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (bonuses == 0)
|
|
return JNI_FALSE;
|
|
|
|
ServerObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return JNI_FALSE;
|
|
|
|
jsize count = env->GetArrayLength(bonuses);
|
|
if (count != Attributes::NumberOfAttributes)
|
|
{
|
|
WARNING(true, ("JavaLibrary::setAttributeBonuses passed bad array of "
|
|
"size %u", count));
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
jint buffer[Attributes::NumberOfAttributes];
|
|
env->GetIntArrayRegion(bonuses, 0, count, buffer);
|
|
|
|
if (object->asTangibleObject() != NULL)
|
|
{
|
|
TangibleObject * tangibleObject = object->asTangibleObject();
|
|
for (jsize i = 0; i < count; ++i)
|
|
tangibleObject->setAttribBonus(i, buffer[i]);
|
|
}
|
|
else if (object->asManufactureSchematicObject() != NULL)
|
|
{
|
|
ManufactureSchematicObject * manufactureSchematicObject = object->asManufactureSchematicObject();
|
|
for (jsize i = 0; i < count; ++i)
|
|
manufactureSchematicObject->setAttribBonus(i, buffer[i]);
|
|
}
|
|
else
|
|
return JNI_FALSE;
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setAttributeBonus
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the skill mod bonuses an object grants when equipped.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
*
|
|
* @return a dictionary of skill mod names -> mod values, or null on error
|
|
*/
|
|
jobject JNICALL ScriptMethodsCraftingNamespace::getSkillModBonuses(JNIEnv *env, jobject self, jlong target)
|
|
{
|
|
UNREF(self);
|
|
|
|
const TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return 0;
|
|
|
|
std::vector<std::pair<std::string, int> > skillModBonuses;
|
|
object->getSkillModBonuses(skillModBonuses);
|
|
|
|
// put the bonuses into ScriptParams, and then convert to a dictionary
|
|
ScriptParams params;
|
|
int count = skillModBonuses.size();
|
|
for (int i = 0; i < count; ++i)
|
|
{
|
|
params.addParam(skillModBonuses[i].second, skillModBonuses[i].first);
|
|
}
|
|
JavaDictionaryPtr dictionary;
|
|
JavaLibrary::instance()->convert(params, dictionary);
|
|
|
|
return dictionary->getReturnValue();
|
|
} // JavaLibrary::getSkillModBonuses
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the skill mod bonus of an object for a given skill mod.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param skillMod the skill mod to get
|
|
*
|
|
* @return the skill mod value
|
|
*/
|
|
jint JNICALL ScriptMethodsCraftingNamespace::getSkillModBonus(JNIEnv *env, jobject self, jlong target, jstring skillMod)
|
|
{
|
|
UNREF(self);
|
|
|
|
JavaStringParam jskillMod(skillMod);
|
|
|
|
const TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return 0;
|
|
|
|
std::string skillModName;
|
|
if (!JavaLibrary::convert(jskillMod, skillModName))
|
|
return 0;
|
|
|
|
return object->getSkillModBonus(skillModName);
|
|
} // JavaLibrary::getSkillModBonus
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the base skill mod bonus an object applies when equipped.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param skillMod the skill mod to set
|
|
* @param bonus the skill mod bonus value
|
|
*
|
|
* @return true on success, false on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSkillModBonus(JNIEnv *env, jobject self, jlong target, jstring skillMod, jint bonus)
|
|
{
|
|
UNREF(self);
|
|
|
|
JavaStringParam jskillMod(skillMod);
|
|
|
|
TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return JNI_FALSE;
|
|
|
|
std::string skillModName;
|
|
if (!JavaLibrary::convert(jskillMod, skillModName))
|
|
return JNI_FALSE;
|
|
|
|
object->setSkillModBonus(skillModName, bonus);
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSkillModBonus
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the base skill mod bonuses an object applies when equipped.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param skillMod the skill mods to set
|
|
* @param bonus the skill mod bonus values
|
|
*
|
|
* @return true on success, false on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSkillModBonuses(JNIEnv *env, jobject self, jlong target, jobjectArray skillMod, jintArray bonus)
|
|
{
|
|
UNREF(self);
|
|
|
|
TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return JNI_FALSE;
|
|
|
|
if (skillMod == 0 || bonus == 0)
|
|
return JNI_FALSE;
|
|
|
|
int skillModCount = env->GetArrayLength(skillMod);
|
|
int bonusCount = env->GetArrayLength(bonus);
|
|
if (skillModCount != bonusCount)
|
|
{
|
|
DEBUG_WARNING(true, ("[designer bug] setSkillModBonuses called with unequal "
|
|
"array sizes"));
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
std::string skillName;
|
|
const jint * bonusArray = env->GetIntArrayElements(bonus, NULL);
|
|
for (int i = 0; i < skillModCount; ++i)
|
|
{
|
|
JavaStringParam jskillName(static_cast<jstring>(env->GetObjectArrayElement(skillMod, i)));
|
|
JavaLibrary::convert(jskillName, skillName);
|
|
object->setSkillModBonus(skillName, bonusArray[i]);
|
|
}
|
|
env->ReleaseIntArrayElements(bonus, const_cast<jint *>(bonusArray), JNI_ABORT);
|
|
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSkillModBonuses
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the base skill mod bonus an object applies when equipped.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param category the category of the skill mod bonus
|
|
* multiple/independent bonuses can be granted
|
|
* for a particular skill mod by putting them
|
|
* into different categories
|
|
* @param skillMod the skill mod to set
|
|
* @param bonus the skill mod bonus value
|
|
*
|
|
* @return true on success, false on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setCategorizedSkillModBonus(JNIEnv *env, jobject self, jlong target, jstring category, jstring skillMod, jint bonus)
|
|
{
|
|
UNREF(self);
|
|
|
|
JavaStringParam jcategory(category);
|
|
JavaStringParam jskillMod(skillMod);
|
|
|
|
TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return JNI_FALSE;
|
|
|
|
std::string categoryName;
|
|
if (!JavaLibrary::convert(jcategory, categoryName))
|
|
return JNI_FALSE;
|
|
|
|
std::string skillModName;
|
|
if (!JavaLibrary::convert(jskillMod, skillModName))
|
|
return JNI_FALSE;
|
|
|
|
object->setSkillModBonus(categoryName, skillModName, bonus);
|
|
return JNI_TRUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Removes all skill mod bonuses in a particular category on an object.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param category the category of the skill mod bonus
|
|
* multiple/independent bonuses can be granted
|
|
* for a particular skill mod by putting them
|
|
* into different categories
|
|
*/
|
|
void JNICALL ScriptMethodsCraftingNamespace::removeCategorizedSkillModBonuses(JNIEnv *env, jobject self, jlong target, jstring category)
|
|
{
|
|
UNREF(self);
|
|
|
|
JavaStringParam jcategory(category);
|
|
|
|
TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return;
|
|
|
|
std::string categoryName;
|
|
if (!JavaLibrary::convert(jcategory, categoryName))
|
|
return;
|
|
|
|
object->removeCategorizedSkillModBonuses(categoryName);
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the number of available skill mod sockets of an object.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
*
|
|
* @return the number of sockets
|
|
*/
|
|
jint JNICALL ScriptMethodsCraftingNamespace::getSkillModSockets(JNIEnv *env, jobject self, jlong target)
|
|
{
|
|
UNREF(self);
|
|
|
|
const TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return 0;
|
|
|
|
return object->getSkillModSockets();
|
|
} // JavaLibrary::getSkillModSockets
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Sets the number of available skill mod sockets for an object.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param target the object
|
|
* @param sockets the number of sockets
|
|
*
|
|
* @return true on success, false on error
|
|
*/
|
|
jboolean JNICALL ScriptMethodsCraftingNamespace::setSkillModSockets(JNIEnv *env, jobject self, jlong target, jint sockets)
|
|
{
|
|
UNREF(self);
|
|
|
|
TangibleObject * object = NULL;
|
|
if (!JavaLibrary::getObject(target, object))
|
|
return JNI_FALSE;
|
|
|
|
object->setSkillModSockets(sockets);
|
|
return JNI_TRUE;
|
|
} // JavaLibrary::setSkillModSockets
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Creates a new item based on a draft schematic. The item will have stats
|
|
* based on a % value passed in (0 = worst possible stats, 100 = best possible
|
|
* stats).
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param draftSchematic draft schematic to make the object from
|
|
* @param qualityPercent % stat adjustment
|
|
* @param container the container to create the item in
|
|
*
|
|
* @return the item, or null on error
|
|
*/
|
|
jlong JNICALL ScriptMethodsCraftingNamespace::makeCraftedItem(JNIEnv *env, jobject self, jstring draftSchematic, jfloat qualityPercent, jlong container)
|
|
{
|
|
UNREF(self);
|
|
|
|
if (draftSchematic == 0 || container == 0)
|
|
{
|
|
WARNING(true, ("[script bug] null schematic or container passed to "
|
|
"makeCraftedItem"));
|
|
return 0;
|
|
}
|
|
|
|
JavaStringParam jDraftSchematic(draftSchematic);
|
|
std::string draftSchematicName;
|
|
if (!JavaLibrary::convert(jDraftSchematic, draftSchematicName))
|
|
{
|
|
WARNING(true, ("JavaLibrary::makeCraftedItem can't convert schematic "
|
|
"name to string"));
|
|
return 0;
|
|
}
|
|
|
|
const DraftSchematicObject * schematic = DraftSchematicObject::getSchematic(
|
|
draftSchematicName);
|
|
if (schematic == NULL)
|
|
{
|
|
WARNING(true, ("[script bug] bad schematic name %s passed to "
|
|
"makeCraftedItem", draftSchematicName.c_str()));
|
|
return 0;
|
|
}
|
|
|
|
ServerObject * target = NULL;
|
|
if (!JavaLibrary::getObject(container, target))
|
|
{
|
|
WARNING(true, ("[script bug] bad container id passed to makeCraftedItem"));
|
|
return 0;
|
|
}
|
|
Object * targetParent = ContainerInterface::getFirstParentInWorld(*target);
|
|
if (targetParent == NULL)
|
|
{
|
|
WARNING(true, ("JavaLibrary::makeCraftedItem can't find parent in world "
|
|
"for container %s", target->getNetworkId().getValueString().c_str()));
|
|
return 0;
|
|
}
|
|
Vector createPos(targetParent->getPosition_w());
|
|
createPos.y = -100000.0f;
|
|
|
|
// create a manf schematic and prototype
|
|
ManufactureSchematicObject * manfSchematic = ServerWorld::createNewManufacturingSchematic(
|
|
*schematic, createPos, false);
|
|
if (manfSchematic == NULL)
|
|
{
|
|
WARNING(true, ("JavaLibrary::makeCraftedItem: error creating manf "
|
|
"schematic!"));
|
|
return 0;
|
|
}
|
|
ServerObject * prototype = manfSchematic->manufactureObject(createPos);
|
|
if (prototype == NULL)
|
|
{
|
|
WARNING(true, ("JavaLibrary::makeCraftedItem: error creating "
|
|
"prototype!"));
|
|
manfSchematic->permanentlyDestroy(DeleteReasons::SetupFailed);
|
|
return false;
|
|
}
|
|
|
|
if (qualityPercent < 0.0f)
|
|
qualityPercent = 0.0f;
|
|
else if (qualityPercent > 100.0f)
|
|
qualityPercent = 100.0f;
|
|
|
|
ScriptParams params;
|
|
params.addParam(prototype->getNetworkId());
|
|
params.addParam(*manfSchematic);
|
|
params.addParam(qualityPercent);
|
|
IGNORE_RETURN(manfSchematic->getScriptObject()->trigAllScripts(
|
|
Scripting::TRIG_MAKE_CRAFTED_ITEM, params));
|
|
|
|
manfSchematic->permanentlyDestroy(DeleteReasons::Consumed);
|
|
Container::ContainerErrorCode error;
|
|
if (!ContainerInterface::transferItemToVolumeContainer (*target, *prototype,
|
|
NULL, error, true))
|
|
{
|
|
WARNING(true, ("JavaLibrary::makeCraftedItem: error can't store prototype "
|
|
"in container, error = %d", error));
|
|
prototype->permanentlyDestroy(DeleteReasons::BadContainerTransfer);
|
|
return 0;
|
|
}
|
|
|
|
return (prototype->getNetworkId()).getValue();
|
|
} // JavaLibrary::makeCraftedItem
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns a draft_schematic structure filled in with info used by a manufacturing
|
|
* schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param manufacturingSchematic the schematic to get the data from
|
|
*
|
|
* @return the draft_schematic object, or null on error
|
|
*/
|
|
jobject JNICALL ScriptMethodsCraftingNamespace::getSchematicData(JNIEnv *env, jobject self, jlong manufacturingSchematic)
|
|
{
|
|
if (manufacturingSchematic == 0)
|
|
return 0;
|
|
|
|
const ManufactureSchematicObject * schematicObject = NULL;
|
|
if (!JavaLibrary::getObject(manufacturingSchematic, schematicObject))
|
|
return 0;
|
|
|
|
return JavaLibrary::convert(*schematicObject)->getReturnValue();
|
|
} // JavaLibrary::getSchematicData
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns a draft_schematic structure filled in with info used by a draft
|
|
* schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param draftSchematic the schematic to get the data from
|
|
*
|
|
* @return the draft_schematic object, or null on error
|
|
*/
|
|
jobject JNICALL ScriptMethodsCraftingNamespace::getDraftSchematicData(JNIEnv *env, jobject self,
|
|
jstring draftSchematic)
|
|
{
|
|
if (draftSchematic == 0)
|
|
return 0;
|
|
|
|
JavaStringParam jdraftSchematic(draftSchematic);
|
|
std::string schematicName;
|
|
if (!JavaLibrary::convert(jdraftSchematic, schematicName))
|
|
return 0;
|
|
|
|
const DraftSchematicObject * schematicObject = DraftSchematicObject::getSchematic(schematicName);
|
|
if (schematicObject == NULL)
|
|
return 0;
|
|
|
|
return JavaLibrary::convert(*schematicObject);
|
|
} // JavaLibrary::getSchematicData
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns a draft_schematic structure filled in with info used by a draft
|
|
* schematic.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param draftSchematicCrc the schematic to get the data from
|
|
*
|
|
* @return the draft_schematic object, or null on error
|
|
*/
|
|
jobject JNICALL ScriptMethodsCraftingNamespace::getDraftSchematicDataCrc(JNIEnv *env, jobject self,
|
|
jint draftSchematicCrc)
|
|
{
|
|
if (draftSchematicCrc == 0)
|
|
return 0;
|
|
|
|
const DraftSchematicObject * schematicObject = DraftSchematicObject::getSchematic(draftSchematicCrc);
|
|
if (schematicObject == NULL)
|
|
return 0;
|
|
|
|
return JavaLibrary::convert(*schematicObject);
|
|
} // JavaLibrary::getSchematicDataCrc
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Causes the stats of a crate of manufactured objects to get recomputed from the
|
|
* crate's objvars.
|
|
* IMPORTANT: This only affects the stats of new objects that get pulled out of the
|
|
* crate! It is up to the caller to modify the "examine" item stored in the crate.
|
|
*
|
|
* @param env Java environment
|
|
* @param self class calling this function
|
|
* @param crate the crate to recompute the stats of
|
|
*/
|
|
void JNICALL ScriptMethodsCraftingNamespace::recomputeCrateAttributes(JNIEnv *env, jobject self, jlong crate)
|
|
{
|
|
FactoryObject * factory = NULL;
|
|
if (!JavaLibrary::getObject(crate, factory))
|
|
return;
|
|
|
|
factory->calculateAttributes();
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|