//======================================================================== // // 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 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 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(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(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(minAttrib.value); float maxValue = static_cast(maxAttrib.value); float resourceMaxValue = maxValue; float currentValue = minValue; std::map::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 & experimentNames = source.getExperimentAttributeNames(); int numExperimentAttribs = experimentNames.size(); int numObjectAttribs = draft->getAttribsCount(); // set the experimental attributes std::vector 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( 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(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(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(minValue)); setFloatField(*jattrib, JavaLibrary::getFidDraftSchematicAttribMaxValue(), static_cast(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(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(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 schematicCrcs(schematicsArray, &schematicsArray[count]); playerObject->sendUseableDraftSchematics(schematicCrcs); env->ReleaseIntArrayElements(schematics, schematicsArray, JNI_ABORT); } else { std::vector 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 & 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 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(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 "*" , 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 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 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 objList; for (ContainerConstIterator iter(inventoryContainer->begin()); iter != inventoryContainer->end(); ++iter) { const CachedNetworkId & objId = (*iter); const TangibleObject * obj = safe_cast(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 > 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 >::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 > 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(env->GetObjectArrayElement(skillMod, i))); JavaLibrary::convert(jskillName, skillName); object->setSkillModBonus(skillName, bonusArray[i]); } env->ReleaseIntArrayElements(bonus, const_cast(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(); } //----------------------------------------------------------------------