From c2379ca5d6fa67bac952d716b55b12fa4209fdc1 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Fri, 28 Jul 2023 16:41:07 +0200 Subject: [PATCH 01/13] Created converter for schematic_group.sdb and converted the file --- serverdata/crafting/schematic_group.sdb | 1653 +++++++++++++++++ .../utility/ClientdataConvertAll.java | 35 +- .../utility/clientdata/Converters.java | 27 + 3 files changed, 1711 insertions(+), 4 deletions(-) create mode 100644 serverdata/crafting/schematic_group.sdb diff --git a/serverdata/crafting/schematic_group.sdb b/serverdata/crafting/schematic_group.sdb new file mode 100644 index 000000000..fdc40765a --- /dev/null +++ b/serverdata/crafting/schematic_group.sdb @@ -0,0 +1,1653 @@ +groupid schematicname + +craftArmorCoreGroupA object/draft_schematic/armor/component/armor_segment_recon.iff +craftArmorCoreGroupA object/draft_schematic/armor/component/armor_segment_battle.iff +craftArmorCoreGroupA object/draft_schematic/armor/component/armor_segment_assault.iff +craftArmorCoreGroupA object/draft_schematic/armor/component/armor_core_recon_basic.iff +craftArmorCoreGroupA object/draft_schematic/armor/component/armor_core_battle_basic.iff +craftArmorCoreGroupA object/draft_schematic/armor/component/armor_core_assault_basic.iff +craftArmorCoreGroupB object/draft_schematic/armor/component/armor_core_recon_standard.iff +craftArmorCoreGroupC object/draft_schematic/armor/component/armor_core_battle_standard.iff +craftArmorCoreGroupD object/draft_schematic/armor/component/armor_core_assault_standard.iff +craftArmorCoreGroupE object/draft_schematic/armor/component/armor_core_recon_advanced.iff +craftArmorCoreGroupF object/draft_schematic/armor/component/armor_core_battle_advanced.iff +craftArmorCoreGroupF object/draft_schematic/armor/component/armor_core_assault_advanced.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_chest.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_leggings.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_helmet.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_bicep_l.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_bicep_r.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_bracer_l.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_bracer_r.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_boots.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_bone_gloves.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_mabari_chest.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_mabari_leggings.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_mabari_helmet.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_mabari_gloves.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_mabari_boots.iff +craftArmorAppearanceGroupA object/draft_schematic/armor/armor_appearance_mabari_belt.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_chest.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_leggings.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_helmet.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_bicep_l.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_bicep_r.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_bracer_l.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_bracer_r.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_boots.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_chitin_gloves.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_kashyyykian_ceremonial_chestplate.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_kashyyykian_ceremonial_leggings.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_kashyyykian_ceremonial_bracer_l.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_kashyyykian_ceremonial_bracer_r.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_kashyyykian_ceremonial_bicep_l.iff +craftArmorAppearanceGroupB object/draft_schematic/armor/armor_appearance_kashyyykian_ceremonial_bicep_r.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_chest.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_leggings.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_helmet.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_bicep_l.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_bicep_r.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_bracer_l.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_bracer_r.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_boots.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_tantel_gloves.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_chest.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_leggings.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_helmet.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_bicep_l.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_bicep_r.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_bracer_l.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_bracer_r.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_boots.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_gloves.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_padded_belt.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_chest.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_leggings.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_helmet.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_bicep_l.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_bicep_r.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_bracer_l.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_bracer_r.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_boots.iff +craftArmorAppearanceGroupC object/draft_schematic/armor/armor_appearance_ithorian_guardian_gloves.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_chest.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_leggings.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_helmet.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_bracer_l.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_bracer_r.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_boots.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_gloves.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_shirt.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ubese_bandolier.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_kashyyykian_black_mtn_chestplate.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_kashyyykian_black_mtn_leggings.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_kashyyykian_black_mtn_bracer_l.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_kashyyykian_black_mtn_bracer_r.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_kashyyykian_black_mtn_bicep_l.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_kashyyykian_black_mtn_bicep_r.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_chest.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_leggings.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_helmet.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_bicep_l.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_bicep_r.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_bracer_l.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_bracer_r.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_boots.iff +craftArmorAppearanceGroupD object/draft_schematic/armor/armor_appearance_ithorian_sentinel_gloves.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_chest.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_leggings.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_helmet.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_bicep_l.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_bicep_r.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_bracer_l.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_bracer_r.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_boots.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_marauder_s01_gloves.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_chest.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_leggings.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_helmet.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_bicep_l.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_bicep_r.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_bracer_l.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_bracer_r.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_boots.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_composite_gloves.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_chest.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_leggings.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_helmet.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_bicep_l.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_bicep_r.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_bracer_l.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_bracer_r.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_boots.iff +craftArmorAppearanceGroupE object/draft_schematic/armor/armor_appearance_ithorian_defender_gloves.iff +craftArmorAppearanceGroupF object/draft_schematic/armor/armor_appearance_kashyyykian_hunting_chestplate.iff +craftArmorAppearanceGroupF object/draft_schematic/armor/armor_appearance_kashyyykian_hunting_leggings.iff +craftArmorAppearanceGroupF object/draft_schematic/armor/armor_appearance_kashyyykian_hunting_bracer_l.iff +craftArmorAppearanceGroupF object/draft_schematic/armor/armor_appearance_kashyyykian_hunting_bracer_r.iff +craftArmorAppearanceGroupF object/draft_schematic/armor/armor_appearance_kashyyykian_hunting_bicep_l.iff +craftArmorAppearanceGroupF object/draft_schematic/armor/armor_appearance_kashyyykian_hunting_bicep_r.iff +craftArmorLightLayersGroupA object/draft_schematic/armor/component/armor_layer_energy.iff +craftArmorLightLayersGroupA object/draft_schematic/armor/component/armor_layer_heat.iff +craftArmorLightLayersGroupB object/draft_schematic/armor/component/armor_layer_cold.iff +craftArmorLightLayersGroupB object/draft_schematic/armor/component/armor_layer_electrical.iff +craftArmorLightLayersGroupC object/draft_schematic/armor/component/armor_layer_kinetic.iff +craftArmorLightLayersGroupC object/draft_schematic/armor/component/armor_layer_acid.iff +craftArmorHeavyLayersGroupA object/draft_schematic/armor/component/armor_layer_advanced_one.iff +craftArmorHeavyLayersGroupA object/draft_schematic/armor/component/armor_layer_advanced_two.iff +craftArmorHeavyLayersGroupB object/draft_schematic/armor/component/armor_layer_advanced_three.iff +craftArmorShieldsGroupA object/draft_schematic/armor/component/deflector_shield_generator_particle.iff +craftArmorShieldsGroupA object/draft_schematic/armor/component/deflector_shield_generator_energy_ray.iff +craftArmorShieldsGroupA object/draft_schematic/armor/component/deflector_shield_emitter_assembly.iff +craftArmorShieldsGroupA object/draft_schematic/armor/component/deflector_shield_projector_plate.iff +craftArmorShieldsGroupB object/draft_schematic/armor/shield_generator_personal.iff +craftArmorShieldsGroupC object/draft_schematic/armor/shield_generator_personal_b.iff +craftArmorShieldsGroupD object/draft_schematic/armor/shield_generator_personal_c.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_chest.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_leggings.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_helmet.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_bicep_l.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_bicep_r.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_bracer_l.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_bracer_r.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_boots.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s02_gloves.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_chest.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_leggings.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_helmet.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_bicep_l.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_bicep_r.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_bracer_l.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_bracer_r.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_boots.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_marauder_s03_gloves.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_chest.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_leggings.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_helmet.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_bicep_l.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_bicep_r.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_bracer_l.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_bracer_r.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_boots.iff +craftArmorTesting object/draft_schematic/armor/armor_appearance_ris_gloves.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/component/new_armor_layer_heat_test.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/component/new_armor_layer_electricity_test.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/component/new_armor_layer_energy_test.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/component/new_armor_advanced_layer_1_test.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/component/new_armor_segment_test.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/component/new_armor_core_basic_test.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/component/new_armor_core_advanced_test.iff +craftNewArmorPersonalGroupA object/draft_schematic/armor/test_an_armor_final.iff +craftArtisanSurveyGroupA object/draft_schematic/item/item_survey_tool_gas.iff +craftArtisanSurveyGroupA object/draft_schematic/item/item_survey_tool_liquid.iff +craftArtisanSurveyGroupA object/draft_schematic/item/item_survey_tool_mineral.iff +craftArtisanSurveyGroupA object/draft_schematic/item/item_survey_tool_moisture.iff +craftArtisanSurveyGroupA object/draft_schematic/item/item_survey_tool_flora.iff +craftArtisanSurveyGroupA object/draft_schematic/item/item_survey_tool_solar.iff +craftArtisanSurveyGroupA object/draft_schematic/item/item_survey_tool_wind.iff +craftArtisanToolGroupA object/draft_schematic/item/item_food_tool.iff +craftArtisanToolGroupA object/draft_schematic/item/item_clothing_tool.iff +craftArtisanToolGroupA object/draft_schematic/item/item_structure_tool.iff +craftArtisanToolGroupA object/draft_schematic/item/item_weapon_tool.iff +craftArtisanToolGroupA object/draft_schematic/item/item_space_tool.iff +craftArtisanNewbieGroupA object/draft_schematic/weapon/knife_survival.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_chance_cube.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_six_sided_dice.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_ten_sided_dice.iff +craftArtisanNewbieGroupA object/draft_schematic/weapon/pistol_blaster_cdef.iff +craftArtisanNewbieGroupA object/draft_schematic/weapon/carbine_blaster_cdef.iff +craftArtisanNewbieGroupA object/draft_schematic/weapon/rifle_blaster_cdef.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_generic_tool.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_fishing_pole.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_firework_one.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_firework_two.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_firework_three.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_powerup_weapon_ranged_one.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_powerup_weapon_ranged_two.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_powerup_weapon_melee_balancing_weights.iff +craftArtisanNewbieGroupA object/draft_schematic/item/item_powerup_weapon_melee_element_dispursal_tuner.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_twelve_sided_dice.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_twenty_sided_dice.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_hundred_sided_dice.iff +craftArtisanEngineeringGroupA object/draft_schematic/weapon/staff.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_battery_droid.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_powerup_weapon_ranged_three.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_powerup_weapon_ranged_four.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_powerup_weapon_melee_hilt_reinforcement.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_powerup_weapon_melee_inertial_fluctuator.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_firework_four.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/item_firework_five.iff +craftArtisanEngineeringGroupA object/draft_schematic/item/craftable_bug_habitat.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_repairkit_weapon.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_repairkit_armor.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_configurable_sided_dice.iff +craftArtisanEngineeringGroupB object/draft_schematic/weapon/staff_reinforced.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_powerup_weapon_thrown_wiring.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_firework_ten.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_powerup_weapon_ranged_five.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_powerup_weapon_melee_surface_serration.iff +craftArtisanEngineeringGroupB object/draft_schematic/item/item_powerup_weapon_melee_tactical_grip_modifier.iff +craftArtisanEngineeringGroupC object/draft_schematic/weapon/knife_twilek_dagger.iff +craftArtisanEngineeringGroupC object/draft_schematic/structure/installation_generator_wind.iff +craftArtisanEngineeringGroupC object/draft_schematic/structure/installation_mining_ore_light.iff +craftArtisanEngineeringGroupC object/draft_schematic/structure/installation_mining_organic_flora_light.iff +craftArtisanEngineeringGroupC object/draft_schematic/item/item_firework_eleven.iff +craftArtisanEngineeringGroupC object/draft_schematic/item/item_powerup_weapon_mine_explosive.iff +craftArtisanEngineeringGroupC object/draft_schematic/item/item_firework_show.iff +craftArtisanEngineeringGroupD object/draft_schematic/weapon/axe.iff +craftArtisanEngineeringGroupD object/draft_schematic/structure/installation_mining_gas_light.iff +craftArtisanEngineeringGroupD object/draft_schematic/structure/installation_mining_liquid_light.iff +craftArtisanEngineeringGroupD object/draft_schematic/structure/installation_mining_liquid_vapor_light.iff +craftArtisanEngineeringGroupD object/draft_schematic/item/item_powerup_weapon_ranged_six.iff +craftArtisanEngineeringGroupD object/draft_schematic/item/item_powerup_weapon_thrown_explosive.iff +craftArtisanEngineeringGroupD object/draft_schematic/item/item_firework_eighteen.iff +craftArtisanNewbieGroupB object/draft_schematic/food/dessert_bofa_treat.iff +craftArtisanNewbieGroupB object/draft_schematic/food/dish_travel_biscuits.iff +craftArtisanNewbieGroupB object/draft_schematic/food/drink_spiced_tea.iff +craftArtisanNewbieGroupB object/draft_schematic/food/component/container_small_glass.iff +craftArtisanNewbieGroupB object/draft_schematic/clothing/clothing_shirt_casual_04.iff +craftArtisanNewbieGroupB object/draft_schematic/clothing/clothing_shoes_casual_02.iff +craftArtisanNewbieGroupB object/draft_schematic/clothing/clothing_pants_casual_25.iff +craftArtisanNewbieGroupB object/draft_schematic/clothing/clothing_wke_shirt_s01.iff +craftArtisanDomesticGroupA object/draft_schematic/food/component/ingredient_carbosyrup.iff +craftArtisanDomesticGroupA object/draft_schematic/food/dessert_blob_candy.iff +craftArtisanDomesticGroupA object/draft_schematic/food/dish_exo_protein_wafers.iff +craftArtisanDomesticGroupA object/draft_schematic/food/drink_aitha.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/component/clothing_fiberplast_panel.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_pants_casual_17.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_pants_casual_10.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_ith_pants_casual_01.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_hat_casual_14.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_dress_casual_10.iff +craftArtisanDomesticGroupA object/draft_schematic/item/item_repairkit_clothing.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_wke_gloves_s02.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_wke_skirt_s04.iff +craftArtisanDomesticGroupA object/draft_schematic/clothing/clothing_ith_shirt_casual_01.iff +craftArtisanDomesticGroupB object/draft_schematic/food/component/ingredient_ball_of_dough.iff +craftArtisanDomesticGroupB object/draft_schematic/food/dish_rations.iff +craftArtisanDomesticGroupB object/draft_schematic/food/dish_crispic.iff +craftArtisanDomesticGroupB object/draft_schematic/food/drink_caf.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/component/clothing_metal_fasteners.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_boots_casual_04.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_dress_casual_12.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_wke_hood_s01.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_jacket_casual_02.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_skirt_casual_10.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_shirt_casual_27.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_ith_vest_field_01.iff +craftArtisanDomesticGroupB object/draft_schematic/clothing/clothing_ith_shirt_casual_06.iff +craftArtisanDomesticGroupC object/draft_schematic/food/dessert_pkneb.iff +craftArtisanDomesticGroupC object/draft_schematic/food/dish_kanali_wafers.iff +craftArtisanDomesticGroupC object/draft_schematic/food/drink_ruby_bliel.iff +craftArtisanDomesticGroupC object/draft_schematic/food/drink_jawa_beer.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_pants_field_04.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_pants_field_12.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_ith_pants_casual_17.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_ith_pants_field_04.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_belt_field_07.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_belt_field_11.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_shirt_casual_34.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_gloves_field_12.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_jacket_casual_12.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_wke_shirt_s02.iff +craftArtisanDomesticGroupC object/draft_schematic/clothing/clothing_ith_shirt_casual_07.iff +craftArtisanDomesticGroupD object/draft_schematic/food/additive/additive_light.iff +craftArtisanDomesticGroupD object/draft_schematic/food/component/container_large_glass.iff +craftArtisanDomesticGroupD object/draft_schematic/food/drink_jaar.iff +craftArtisanDomesticGroupD object/draft_schematic/food/drink_starshine_surprise.iff +craftArtisanDomesticGroupD object/draft_schematic/food/dish_dustcrepe.iff +craftArtisanDomesticGroupD object/draft_schematic/food/dish_teltier_noodles.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_dress_formal_18.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_dress_formal_26.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_boots_field_03.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_jacket_field_15.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_bandolier_field_07.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_bandolier_field_08.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_dress_casual_06.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_backpack_field_01.iff +craftArtisanDomesticGroupD object/draft_schematic/clothing/clothing_wke_hood_s03.iff +craftArtisanMasterGroupA object/draft_schematic/item/item_parrot_cage.iff +craftArtisanMasterGroupA object/draft_schematic/item/component/item_micro_sensor_suite.iff +craftArtisanMasterGroupA object/draft_schematic/item/component/item_electronics_memory_module.iff +craftArtisanMasterGroupA object/draft_schematic/item/component/item_electronics_gp_module.iff +craftArtisanMasterGroupA object/draft_schematic/item/component/item_electronic_power_conditioner.iff +craftArtisanMasterGroupA object/draft_schematic/item/component/item_electronic_energy_distributor.iff +craftArtisanMasterGroupA object/draft_schematic/item/component/item_electronic_control_unit.iff +craftArtisanMasterGroupA object/draft_schematic/space/repair/generic_repair_kit.iff +craftArtisanMasterGroupA object/draft_schematic/item/doctor_bag/doc_bag.iff +craftArtisanMasterGroupA object/draft_schematic/item/item_barc_repair_tool.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_backpack_field_03.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/component/clothing_synthetic_cloth.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_jacket_field_08.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_shirt_casual_03.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_shirt_casual_07.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_pants_casual_01.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_pants_casual_05.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_pants_casual_06.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_jacket_casual_05.iff +craftClothingNoviceGroupA object/draft_schematic/clothing/clothing_jacket_casual_14.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_belt_field_04.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_gloves_field_02.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_ith_gloves_field_02.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_pants_field_14.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_shirt_field_09.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_wke_skirt_s03.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_wke_hat_s01.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_ith_shirt_casual_08.iff +craftClothingNoviceGroupB object/draft_schematic/clothing/clothing_ith_shirt_casual_12.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_dress_formal_13.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_dress_formal_23.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_dress_formal_29.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_jewelry_bracelet_05.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_jewelry_bracelet_06.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_shirt_formal_13.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_shirt_formal_05.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_jewelry_necklace_06.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_ith_jewelry_necklace_06.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_jewelry_necklace_08.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_ith_jewelry_necklace_08.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_jewelry_necklace_11.iff +craftClothingNoviceGroupC object/draft_schematic/clothing/clothing_ith_jewelry_necklace_11.iff +craftClothingCasualGroupA object/draft_schematic/clothing/component/clothing_shoe_sole.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_boots_casual_15.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_boots_casual_21.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_gloves_casual_03.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_gloves_casual_06.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_wke_gloves_s04.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_dress_casual_09.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_skirt_casual_04.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_skirt_casual_05.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_shoes_casual_03.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_shoes_casual_07.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_shoes_casual_08.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_ith_hat_casual_01.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_ith_pants_casual_02.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_ith_pants_casual_03.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_ith_jacket_casual_01.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_ith_jacket_casual_03.iff +craftClothingCasualGroupA object/draft_schematic/clothing/clothing_ith_shirt_casual_04.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_ith_shirt_casual_03.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_ith_shirt_casual_13.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_ith_shirt_casual_14.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_shirt_casual_16.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_shirt_casual_42.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_shirt_casual_38.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_jacket_casual_07.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_jacket_casual_17.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_jacket_casual_19.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_pants_casual_08.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_pants_casual_11.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_pants_casual_26.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_pants_casual_09.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_vest_casual_04.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_vest_casual_05.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_vest_casual_10.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_wke_shoulder_pad_s01.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_ith_pants_casual_08.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_ith_pants_casual_09.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_ith_jacket_casual_06.iff +craftClothingCasualGroupB object/draft_schematic/clothing/clothing_ith_jacket_casual_09.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_boots_casual_12.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_boots_casual_19.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_dress_casual_05.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_dress_casual_07.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_robe_casual_04.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_robe_casual_05.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_robe_casual_05b.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_robe_casual_18.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_hat_casual_02.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_hat_casual_10.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_hat_casual_12.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_bustier_casual_01.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_bustier_casual_02.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_bustier_casual_03.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_ith_bodysuit_casual_04.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_wke_gloves_s03.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_ith_hat_casual_03.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_ith_pants_casual_16.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_ith_pants_casual_18.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_ith_jacket_casual_12.iff +craftClothingCasualGroupC object/draft_schematic/clothing/clothing_ith_jacket_casual_14.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_ith_shirt_casual_09.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_shirt_casual_11.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_shirt_casual_24.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_shirt_casual_30.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_jacket_casual_18.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_jacket_casual_24.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_jacket_casual_36.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_pants_casual_18.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_pants_casual_24.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_vest_casual_01.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_vest_casual_02.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_vest_casual_03.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_vest_casual_11.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_hat_twilek_casual_01.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_hat_twilek_casual_02.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_ith_bodysuit_casual_01.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_ith_bodysuit_casual_03.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_ith_bodysuit_casual_05.iff +craftClothingCasualGroupD object/draft_schematic/clothing/clothing_ith_pants_casual_21.iff +craftClothingFieldGroupA object/draft_schematic/clothing/component/clothing_cargo_pocket.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_backpack_field_04.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_boots_field_05.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_boots_field_14.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_boots_field_34.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_hat_field_04.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_belt_field_09.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_gloves_field_07.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_jacket_field_13.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_jacket_field_16.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_wke_gloves_s01.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_ith_pants_field_05.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_ith_pants_field_06.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_ith_jacket_field_02.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_vest_field_06.iff +craftClothingFieldGroupA object/draft_schematic/clothing/clothing_vest_field_09.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_ith_shirt_field_05.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_ith_shirt_field_11.iff +craftClothingFieldGroupB object/draft_schematic/clothing/component/clothing_reinforced_fiber_panels.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_shirt_field_10.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_shirt_field_14.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_shirt_field_26.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_pants_field_27.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_pants_field_29.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_pants_field_07.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_belt_field_01.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_gloves_field_11.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_gloves_field_14.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_bandolier_field_05.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_bandolier_field_06.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_backpack_field_05.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_wke_shirt_s03.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_ith_pants_field_07.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_ith_pants_field_12.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_ith_jacket_field_05.iff +craftClothingFieldGroupB object/draft_schematic/clothing/clothing_ith_jacket_field_07.iff +craftClothingFieldGroupC object/draft_schematic/clothing/component/clothing_padding_segment.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_backpack_field_06.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_bandolier_field_02.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_bandolier_field_03.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_bandolier_field_04.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_jacket_field_10.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_jacket_field_21.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_jacket_field_35.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_pants_field_28.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_pants_field_30.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_ith_pants_field_13.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_ith_pants_field_15.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_belt_field_02.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_wke_shoulder_pad_s02.iff +craftClothingFieldGroupC object/draft_schematic/clothing/clothing_ith_jacket_field_13.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_pants_field_21.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_pants_field_22.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_ith_pants_field_19.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_ith_pants_field_20.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_belt_field_03.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_belt_field_05.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_gloves_field_10.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_gloves_field_13.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_bodysuit_field_13.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_bodysuit_field_16.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_robe_field_27.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_wke_shirt_s04.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_ith_bodysuit_field_02.iff +craftClothingFieldGroupD object/draft_schematic/clothing/clothing_ith_jacket_field_11.iff +craftClothingFormalGroupA object/draft_schematic/clothing/component/clothing_trim.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_shirt_formal_08.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_shirt_formal_28.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_ith_shirt_formal_02.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_belt_formal_15.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_belt_formal_16.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_belt_formal_18.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_jewelry_necklace_01.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_ith_jewelry_necklace_01.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_jewelry_necklace_03.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_ith_jewelry_necklace_03.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_jewelry_necklace_07.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_ith_jewelry_necklace_07.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_shoes_formal_01.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_shoes_formal_09.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_skirt_formal_06.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_skirt_formal_07.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_skirt_formal_14.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_wke_skirt_s02.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_ith_dress_formal_03.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_ith_jacket_formal_08.iff +craftClothingFormalGroupA object/draft_schematic/clothing/clothing_ith_skirt_formal_01.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_ith_skirt_formal_02.iff +craftClothingFormalGroupB object/draft_schematic/clothing/component/clothing_jewelry_setting.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_dress_formal_11.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_dress_formal_16.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_dress_formal_32.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_belt_formal_12.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_belt_formal_14.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_belt_formal_19.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_jewelry_bracelet_02.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_jewelry_bracelet_03.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_jewelry_bracelet_04.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_jacket_formal_06.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_jacket_formal_11.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_jacket_formal_26.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_vest_formal_15.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_skirt_formal_09.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_wke_hood_s02.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_hat_chef_02.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_ith_hat_chef_02.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_ith_pants_formal_10.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_ith_dress_formal_04.iff +craftClothingFormalGroupB object/draft_schematic/clothing/clothing_ith_jacket_formal_04.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_skirt_formal_03.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_shirt_formal_12.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_shirt_formal_15.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_shirt_formal_32.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_dress_formal_19.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_dress_formal_27.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_dress_formal_30.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_dress_formal_31.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_jewelry_necklace_09.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_jewelry_necklace_09.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_jewelry_necklace_10.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_jewelry_necklace_10.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_jewelry_necklace_12.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_jewelry_necklace_12.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_jewelry_ring_01.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_jewelry_ring_02.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_hat_formal_13.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_pants_formal_31.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_pants_formal_33.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_wke_skirt_s01.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_hat_chef_01.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_hat_chef_01.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_hat_formal_02.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_pants_formal_11.iff +craftClothingFormalGroupC object/draft_schematic/clothing/clothing_ith_jacket_formal_10.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_dress_formal_14.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_dress_formal_33.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_dress_formal_34.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_belt_formal_13.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_belt_formal_17.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_belt_formal_20.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_jacket_formal_03.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_jacket_formal_22.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_jacket_formal_25.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_jewelry_necklace_02.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_ith_jewelry_necklace_02.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_skirt_formal_11.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_skirt_formal_12.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_skirt_formal_13.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_pants_formal_13.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_pants_formal_15.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_pants_formal_32.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_apron_chef_01.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_ith_apron_chef_01.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_ith_hat_formal_04.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_ith_robe_formal_01.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_ith_pants_formal_14.iff +craftClothingFormalGroupD object/draft_schematic/clothing/clothing_ith_jacket_formal_15.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bikini_casual_01.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bikini_casual_02.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bikini_casual_03.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bikini_casual_04.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bikini_leggings_casual_01.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bodysuit_casual_08.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bodysuit_casual_12.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bodysuit_field_01.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bodysuit_field_14.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bodysuit_field_15.iff +craftClothingMaster object/draft_schematic/clothing/clothing_bodysuit_formal_06.iff +craftClothingMaster object/draft_schematic/clothing/clothing_ith_bodysuit_formal_06.iff +craftClothingMaster object/draft_schematic/clothing/clothing_ith_shirt_formal_10.iff +craftClothingMaster object/draft_schematic/clothing/clothing_dress_formal_08.iff +craftClothingMaster object/draft_schematic/clothing/clothing_dress_formal_15.iff +craftClothingMaster object/draft_schematic/clothing/clothing_dress_formal_35.iff +craftClothingMaster object/draft_schematic/clothing/clothing_pants_casual_02.iff +craftClothingMaster object/draft_schematic/clothing/clothing_robe_formal_01.iff +craftClothingMaster object/draft_schematic/clothing/clothing_robe_formal_12.iff +craftClothingMaster object/draft_schematic/clothing/clothing_ith_robe_formal_02.iff +craftClothingMaster object/draft_schematic/clothing/clothing_hat_twilek_formal_03.iff +craftClothingMaster object/draft_schematic/clothing/clothing_hat_twilek_formal_04.iff +craftClothingMaster object/draft_schematic/clothing/clothing_hat_twilek_formal_05.iff +craftClothingMaster object/draft_schematic/clothing/clothing_jewelry_necklace_04.iff +craftClothingMaster object/draft_schematic/clothing/clothing_ith_jewelry_necklace_04.iff +craftClothingMaster object/draft_schematic/clothing/clothing_jewelry_necklace_05.iff +craftClothingMaster object/draft_schematic/clothing/clothing_ith_jewelry_necklace_05.iff +craftClothingMaster object/draft_schematic/clothing/clothing_skirt_casual_03.iff +craftFoodNoviceGroupA object/draft_schematic/food/additive/additive_medium.iff +craftFoodNoviceGroupA object/draft_schematic/food/dish_soypro.iff +craftFoodNoviceGroupA object/draft_schematic/food/dessert_air_cake.iff +craftFoodNoviceGroupB object/draft_schematic/food/dessert_almond_kwevvu_crisp_munchies.iff +craftFoodNoviceGroupB object/draft_schematic/food/dessert_blap_biscuit.iff +craftFoodNoviceGroupC object/draft_schematic/food/drink_alcohol.iff +craftFoodDishGroupA object/draft_schematic/food/dish_protato.iff +craftFoodDishGroupA object/draft_schematic/food/dish_synthsteak.iff +craftFoodDishGroupA object/draft_schematic/food/dish_cho_nor_hoola.iff +craftFoodDishGroupA object/draft_schematic/food/dish_blood_chowder.iff +craftFoodDishGroupB object/draft_schematic/food/dish_karkan_ribenes.iff +craftFoodDishGroupB object/draft_schematic/food/dish_trimpian.iff +craftFoodDishGroupB object/draft_schematic/food/dish_veghash.iff +craftFoodDishGroupB object/draft_schematic/food/dish_ormachek.iff +craftFoodDishGroupC object/draft_schematic/food/dish_gruuvan_shaal.iff +craftFoodDishGroupC object/draft_schematic/food/dish_havla.iff +craftFoodDishGroupC object/draft_schematic/food/dish_scrimpi.iff +craftFoodDishGroupC object/draft_schematic/food/dish_ahrisa.iff +craftFoodDishGroupD object/draft_schematic/food/dish_vegeparsine.iff +craftFoodDishGroupD object/draft_schematic/food/dish_bivoli_tempari.iff +craftFoodDishGroupD object/draft_schematic/food/dish_terratta.iff +craftFoodDishGroupD object/draft_schematic/food/dish_rakririan_burnout_sauce.iff +craftFoodDessertGroupA object/draft_schematic/food/dessert_bantha_butter.iff +craftFoodDessertGroupA object/draft_schematic/food/dessert_pastebread.iff +craftFoodDessertGroupA object/draft_schematic/food/dessert_won_won.iff +craftFoodDessertGroupA object/draft_schematic/food/dessert_chandad.iff +craftFoodDessertGroupB object/draft_schematic/food/dessert_sweet_cake_mix.iff +craftFoodDessertGroupB object/draft_schematic/food/dessert_parwan_nutricake.iff +craftFoodDessertGroupB object/draft_schematic/food/dessert_pyollian_cake.iff +craftFoodDessertGroupB object/draft_schematic/food/dessert_dweezel.iff +craftFoodDessertGroupB object/draft_schematic/food/dessert_felbar.iff +craftFoodDessertGroupC object/draft_schematic/food/dessert_citros_snow_cake.iff +craftFoodDessertGroupC object/draft_schematic/food/dessert_pikatta_pie.iff +craftFoodDessertGroupC object/draft_schematic/food/dessert_gorrnar.iff +craftFoodDessertGroupC object/draft_schematic/food/dessert_kiwik_clusjo_swirl.iff +craftFoodDessertGroupD object/draft_schematic/food/dessert_cavaellin_creams.iff +craftFoodDessertGroupD object/draft_schematic/food/dessert_vagnerian_canape.iff +craftFoodDessertGroupD object/draft_schematic/food/dessert_sweesonberry_rolls.iff +craftFoodDessertGroupD object/draft_schematic/food/dessert_smugglers_delight.iff +craftFoodDrinkGroupA object/draft_schematic/food/drink_deuterium_pyro.iff +craftFoodDrinkGroupA object/draft_schematic/food/drink_gralinyn_juice.iff +craftFoodDrinkGroupA object/draft_schematic/food/drink_corellian_ale.iff +craftFoodDrinkGroupA object/draft_schematic/food/drink_blue_milk.iff +craftFoodDrinkGroupB object/draft_schematic/food/component/container_cask.iff +craftFoodDrinkGroupB object/draft_schematic/food/drink_veronian_berry_wine.iff +craftFoodDrinkGroupB object/draft_schematic/food/drink_durindfire.iff +craftFoodDrinkGroupB object/draft_schematic/food/drink_ithorian_mist.iff +craftFoodDrinkGroupB object/draft_schematic/food/drink_corellian_brandy.iff +craftFoodDrinkGroupC object/draft_schematic/food/drink_tssolok.iff +craftFoodDrinkGroupC object/draft_schematic/food/drink_vasarian_brandy.iff +craftFoodDrinkGroupC object/draft_schematic/food/drink_accarragm.iff +craftFoodDrinkGroupC object/draft_schematic/food/drink_garrmorl.iff +craftFoodDrinkGroupC object/draft_schematic/food/drink_rancoraid.iff +craftFoodDrinkGroupD object/draft_schematic/food/drink_bespin_port.iff +craftFoodDrinkGroupD object/draft_schematic/food/drink_elshandruu_pica_thundercloud.iff +craftFoodDrinkGroupD object/draft_schematic/food/drink_tilla_tiil.iff +craftFoodDrinkGroupD object/draft_schematic/food/drink_vayerbok.iff +craftFoodMaster object/draft_schematic/food/additive/additive_heavy.iff +craftFoodMaster object/draft_schematic/food/component/container_barrel.iff +craftFoodMaster object/draft_schematic/food/drink_breath_of_heaven.iff +craftFoodMaster object/draft_schematic/food/drink_flameout.iff +craftFoodMaster object/draft_schematic/food/dish_thakitillo.iff +craftFoodMaster object/draft_schematic/food/dish_vercupti_of_agazza_boleruuee.iff +craftFoodMaster object/draft_schematic/food/dessert_deneelian_fizz_pudding.iff +craftdroidGroupA object/draft_schematic/droid/droid_mse.iff +craftdroidGroupA object/draft_schematic/droid/component/manipulator_arm.iff +craftdroidGroupA object/draft_schematic/droid/component/droid_motive_system.iff +craftdroidGroupA object/draft_schematic/droid/component/droid_storage_compartment.iff +craftdroidGroupA object/draft_schematic/droid/droid_customization_kit.iff +craftdroidGroupA object/draft_schematic/droid/navicomputer_1.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/medic_module_1.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/data_storage_module_1.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/item_storage_module_1.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/personality_module_stupid.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/playback_module.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/performer_effects_a.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/performer_effects_aa.iff +craftdroidgenmodGroupA object/draft_schematic/droid/component/droid_space_memory_module_1.iff +craftdroiddefmodGroupA object/draft_schematic/droid/component/armor_module_1.iff +craftdroidGroupB object/draft_schematic/droid/droid_treadwell.iff +craftdroidGroupB object/draft_schematic/droid/droid_dz70.iff +craftdroidGroupB object/draft_schematic/droid/droid_r5.iff +craftdroidGroupB object/draft_schematic/droid/bounty_seeker_transmitter.iff +craftdroidGroupB object/draft_schematic/droid/component/sensor_package_droid.iff +craftdroidGroupB object/draft_schematic/droid/droid_mse_advanced.iff +craftdroidGroupB object/draft_schematic/droid/component/manipulator_arm_package_set.iff +craftdroidGroupB object/draft_schematic/droid/navicomputer_2.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/medic_module_2.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/data_storage_module_2.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/item_storage_module_2.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/harvest_module.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/personality_module_sarcastic.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/crafting_module_weapon.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/struct_maint_module_1.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/merchant_barker.iff +craftdroidgenmodGroupB object/draft_schematic/droid/component/performer_effects_b.iff +craftdroiddefmodGroupB object/draft_schematic/droid/component/armor_module_2.iff +craftdroidGroupC object/draft_schematic/droid/component/droid_motive_system_advanced.iff +craftdroidGroupC object/draft_schematic/droid/droid_power.iff +craftdroidGroupC object/draft_schematic/droid/droid_r4.iff +craftdroidGroupC object/draft_schematic/droid/component/droid_brain.iff +craftdroidGroupC object/draft_schematic/droid/component/advanced_droid_frame.iff +craftdroidGroupC object/draft_schematic/droid/droid_treadwell_advanced.iff +craftdroidGroupC object/draft_schematic/droid/droid_dz70_advanced.iff +craftdroidGroupC object/draft_schematic/droid/droid_r5_advanced.iff +craftdroidGroupC object/draft_schematic/droid/component/chassis_droid_r4.iff +craftdroidGroupC object/draft_schematic/droid/navicomputer_3.iff +craftdroidgenmodGroupC object/draft_schematic/droid/component/medic_module_3.iff +craftdroidgenmodGroupC object/draft_schematic/droid/component/trap_module.iff +craftdroidgenmodGroupC object/draft_schematic/droid/component/data_storage_module_3.iff +craftdroidgenmodGroupC object/draft_schematic/droid/component/item_storage_module_3.iff +craftdroidgenmodGroupC object/draft_schematic/droid/component/personality_module_prissy.iff +craftdroidgenmodGroupC object/draft_schematic/droid/component/stimpack_dispensor.iff +craftdroidgenmodGroupC object/draft_schematic/droid/component/performer_effects_c.iff +craftdroiddefmodGroupC object/draft_schematic/droid/component/armor_module_3.iff +craftdroiddefmodGroupC object/draft_schematic/droid/component/repair_module.iff +craftdroiddefmodGroupC object/draft_schematic/droid/component/crafting_module_food.iff +craftdroiddefmodGroupC object/draft_schematic/droid/component/combat_module.iff +craftdroiddefmodGroupC object/draft_schematic/droid/component/combat_socket_bank.iff +craftdroidGroupD object/draft_schematic/droid/droid_le_repair.iff +craftdroidGroupD object/draft_schematic/droid/droid_surgical.iff +craftdroidGroupD object/draft_schematic/droid/droid_r2.iff +craftdroidGroupD object/draft_schematic/droid/droid_probot.iff +craftdroidGroupD object/draft_schematic/droid/bounty_probot_transmitter.iff +craftdroidGroupD object/draft_schematic/droid/component/droid_brain_advanced.iff +craftdroidGroupD object/draft_schematic/droid/droid_power_advanced.iff +craftdroidGroupD object/draft_schematic/droid/droid_r4_advanced.iff +craftdroidGroupD object/draft_schematic/droid/component/chassis_droid_r2.iff +craftdroidGroupD object/draft_schematic/droid/component/chassis_droid_probot.iff +craftdroidGroupD object/draft_schematic/droid/component/chassis_droid_le_repair.iff +craftdroidGroupD object/draft_schematic/droid/component/chassis_droid_surgical.iff +craftdroidGroupD object/draft_schematic/droid/navicomputer_4.iff +craftdroidgenmodGroupD object/draft_schematic/droid/component/medic_module_4.iff +craftdroidgenmodGroupD object/draft_schematic/droid/component/data_storage_module_4.iff +craftdroidgenmodGroupD object/draft_schematic/droid/component/item_storage_module_4.iff +craftdroidgenmodGroupD object/draft_schematic/droid/component/personality_module_worshipful.iff +craftdroidgenmodGroupD object/draft_schematic/droid/component/struct_maint_module_2.iff +craftdroidgenmodGroupD object/draft_schematic/droid/component/auto_repair_module.iff +craftdroidgenmodGroupD object/draft_schematic/droid/component/performer_effects_d.iff +craftdroiddefmodGroupD object/draft_schematic/droid/component/armor_module_4.iff +craftdroiddefmodGroupD object/draft_schematic/droid/component/crafting_module_clothing.iff +craftdroidgenmodGroupDD object/draft_schematic/droid/component/module_socket_bank.iff +craftdroidGroupE object/draft_schematic/droid/droid_r3.iff +craftdroidGroupE object/draft_schematic/droid/droid_binary_load_lifter.iff +craftdroidGroupE object/draft_schematic/droid/droid_3p0.iff +craftdroidGroupE object/draft_schematic/droid/droid_r2_advanced.iff +craftdroidGroupE object/draft_schematic/droid/droid_probot_advanced.iff +craftdroidGroupE object/draft_schematic/droid/droid_le_repair_advanced.iff +craftdroidGroupE object/draft_schematic/droid/droid_surgical_advanced.iff +craftdroidGroupE object/draft_schematic/droid/component/chassis_droid_r3.iff +craftdroidGroupE object/draft_schematic/droid/component/chassis_droid_binary_load_lifter.iff +craftdroidGroupE object/draft_schematic/droid/component/chassis_droid_3p0.iff +craftdroidGroupE object/draft_schematic/droid/navicomputer_5.iff +craftdroidgenmodGroupE object/draft_schematic/droid/component/medic_module_5.iff +craftdroidgenmodGroupE object/draft_schematic/droid/component/data_storage_module_5.iff +craftdroidgenmodGroupE object/draft_schematic/droid/component/item_storage_module_5.iff +craftdroidgenmodGroupE object/draft_schematic/droid/component/personality_module_slang.iff +craftdroidgenmodGroupE object/draft_schematic/droid/component/crafting_module_structure.iff +craftdroidgenmodGroupE object/draft_schematic/droid/component/performer_effects_e.iff +craftdroiddefmodGroupE object/draft_schematic/droid/component/armor_module_5.iff +craftdroidGroupF object/draft_schematic/droid/droid_r3_advanced.iff +craftdroidGroupF object/draft_schematic/droid/droid_binary_load_lifter_advanced.iff +craftdroidGroupF object/draft_schematic/droid/droid_3p0_advanced.iff +craftdroidGroupF object/draft_schematic/droid/droid_interplanetary_survey.iff +craftdroidGroupF object/draft_schematic/droid/navicomputer_6.iff +craftdroidgenmodGroupF object/draft_schematic/droid/component/medic_module_6.iff +craftdroidgenmodGroupF object/draft_schematic/droid/component/data_storage_module_6.iff +craftdroidgenmodGroupF object/draft_schematic/droid/component/item_storage_module_6.iff +craftdroidgenmodGroupF object/draft_schematic/droid/component/personality_module_geek.iff +craftdroidgenmodGroupF object/draft_schematic/droid/component/struct_maint_module_3.iff +craftdroidgenmodGroupF object/draft_schematic/droid/component/detonation_module.iff +craftdroidgenmodGroupF object/draft_schematic/droid/component/crafting_module_space.iff +craftdroiddefmodGroupF object/draft_schematic/droid/component/armor_module_6.iff +craftDroidRepairCompA object/draft_schematic/droid/component/unit_delivery_cartridge.iff +craftDroidRepairCompA object/draft_schematic/droid/component/repair_unit_casing.iff +craftDroidRepairCompA object/draft_schematic/droid/component/power_supply_redundant.iff +craftDroidRepairCompA object/draft_schematic/droid/component/diagnostic_circuit.iff +craftDroidRepairCompA object/draft_schematic/droid/component/capacitor_low_discharge.iff +craftDroidRepairCompB object/draft_schematic/droid/component/unit_delivery_cartridge_advanced.iff +craftDroidRepairCompB object/draft_schematic/droid/component/repair_unit_casing_advanced.iff +craftDroidRepairCompB object/draft_schematic/droid/component/power_supply_redundant_advanced.iff +craftDroidRepairCompB object/draft_schematic/droid/component/diagnostic_circuit_advanced.iff +craftDroidRepairCompB object/draft_schematic/droid/component/capacitor_high_discharge.iff +craftDroidWoundRepairA object/draft_schematic/droid/droid_wound_repair_kit_a.iff +craftDroidWoundRepairB object/draft_schematic/droid/droid_wound_repair_kit_b.iff +craftDroidWoundRepairC object/draft_schematic/droid/droid_wound_repair_kit_c.iff +craftDroidWoundRepairD object/draft_schematic/droid/droid_wound_repair_kit_d.iff +craftDroidDamageRepairA object/draft_schematic/droid/droid_damage_repair_kit_a.iff +craftDroidDamageRepairB object/draft_schematic/droid/droid_damage_repair_kit_b.iff +craftDroidDamageRepairC object/draft_schematic/droid/droid_damage_repair_kit_c.iff +craftDroidDamageRepairD object/draft_schematic/droid/droid_damage_repair_kit_d.iff +craftMedicalEnhancersA object/draft_schematic/chemistry/enhancer/enhancer_bactatoss.iff +craftMedicalEnhancersA object/draft_schematic/chemistry/enhancer/enhancer_stabilizer.iff +craftMedicalEnhancersB object/draft_schematic/chemistry/enhancer/enhancer_bactaspray.iff +craftMedicalEnhancersB object/draft_schematic/chemistry/enhancer/enhancer_nutrientinjection.iff +craftMedicalEnhancersC object/draft_schematic/chemistry/enhancer/enhancer_bactajab.iff +craftMedicalEnhancersC object/draft_schematic/chemistry/enhancer/enhancer_neurotoxin.iff +craftMedicalEnhancersC object/draft_schematic/chemistry/enhancer/enhancer_endorphineinjection.iff +craftMedicalEnhancersC object/draft_schematic/chemistry/enhancer/enhancer_bactainfusion.iff +craftMedicalEnhancersD object/draft_schematic/chemistry/enhancer/enhancer_deuteriumtoss.iff +craftMedicalEnhancersD object/draft_schematic/chemistry/enhancer/enhancer_thyroidrupture.iff +craftMedicalEnhancersD object/draft_schematic/chemistry/enhancer/enhancer_traumatize.iff +craftMedicalEnhancersD object/draft_schematic/chemistry/enhancer/enhancer_disinfect.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_tree_potted.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_tiki_torch.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_plants_potted_large.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_plants_potted_small.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_armoire_cheap.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_chair_loveseat_cheap.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_bookcase_cheap.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_chest_cheap.iff +craftFurnitureGroupAA object/draft_schematic/furniture/furniture_couch_cheap.iff +craftFurnitureGroupAA object/draft_schematic/item/item_weapon_station.iff +craftFurnitureGroupAA object/draft_schematic/item/item_structure_station.iff +craftFurnitureGroupAA object/draft_schematic/item/item_food_station.iff +craftFurnitureGroupAA object/draft_schematic/item/item_clothing_station.iff +craftFurnitureGroupAA object/draft_schematic/item/item_space_station.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_toolchest_medium.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_table_coffee_cheap.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_cheap.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_table_endtable_cheap.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_divan.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_futon.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_kitchen.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_love_seat.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_table_small_tatooine.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_table_tatooine_cafe.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_metal.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_metal_wheeled.iff +craftFurnitureGroupA object/draft_schematic/furniture/furniture_chair_ottoman.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_bed_small.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_toolchest_large.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_chair_recliner.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_chair_tatooine_cafe.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_chair_upholstered.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_chair_wooden.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_couch_large.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_couch_small.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_droid_detector.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_candle_free_s01_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_candle_free_s02_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_candle_table_s01_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_candle_table_s02_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_candle_table_s03_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_desk.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_desk_s01_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_desk_s02_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_freestanding.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_free_s01_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_free_s02_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_free_s03_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_free_s04_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_tatt_s01_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_table.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_table_s01_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_table_s02_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_table_s03_on.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_lamp_table_cantina.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_armoire_modern.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_bookcase_modern.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_cabinet_modern.iff +craftFurnitureGroupB object/draft_schematic/furniture/furniture_chair_loveseat_modern.iff +craftFurnitureGroupC object/draft_schematic/item/item_ballot_box_terminal.iff +craftFurnitureGroupC object/draft_schematic/furniture/furniture_bed_large.iff +craftFurnitureGroupC object/draft_schematic/furniture/furniture_couch_modern.iff +craftFurnitureGroupC object/draft_schematic/furniture/furniture_chest_modern.iff +craftFurnitureGroupC object/draft_schematic/furniture/furniture_chair_modern.iff +craftFurnitureGroupC object/draft_schematic/furniture/furniture_terminal_freestanding.iff +craftFurnitureGroupD object/draft_schematic/furniture/furniture_terminal_wall.iff +craftFurnitureGroupD object/draft_schematic/furniture/furniture_sofachair_modern.iff +craftFurnitureGroupD object/draft_schematic/furniture/furniture_table_endtable_modern.iff +craftFurnitureGroupD object/draft_schematic/furniture/furniture_table_endtable_small_modern.iff +craftFurnitureGroupD object/draft_schematic/furniture/furniture_table_modern.iff +craftFurnitureGroupD object/draft_schematic/furniture/furniture_table_coffee_modern.iff +craftFurnitureGroupD object/draft_schematic/furniture/furniture_table_dining_modern.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_table_coffee_elegant.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_table_endtable_elegant.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_couch_elegant.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_armoire_elegant.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_bookcase_elegant.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_chair_elegant.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_chair_loveseat_elegant.iff +craftFurnitureGroupE object/draft_schematic/furniture/furniture_chest_elegant.iff +craftGrenadeGroupA object/draft_schematic/munition/component/enhanced_charge_composition.iff +craftGrenadeGroupB object/draft_schematic/munition/component/enhanced_charge_shaping.iff +craftGrenadeGroupB object/draft_schematic/munition/component/enhanced_fragmentation_sleeve.iff +craftGrenadeGroupC object/draft_schematic/munition/component/enhanced_destructive_pulse_channeling.iff +craftDancePropA object/draft_schematic/dance_prop/prop_staff_r.iff +craftDancePropA object/draft_schematic/dance_prop/prop_staff_l.iff +craftDancePropB object/draft_schematic/dance_prop/prop_sword_r.iff +craftDancePropB object/draft_schematic/dance_prop/prop_sword_l.iff +craftDancePropC object/draft_schematic/dance_prop/prop_sparkler_r.iff +craftDancePropC object/draft_schematic/dance_prop/prop_sparkler_l.iff +craftDancePropD object/draft_schematic/dance_prop/prop_glowstick_r.iff +craftDancePropD object/draft_schematic/dance_prop/prop_glowstick_l.iff +craftDancePropE object/draft_schematic/dance_prop/prop_torch_r.iff +craftDancePropE object/draft_schematic/dance_prop/prop_torch_l.iff +craftDancePropF object/draft_schematic/dance_prop/prop_ribbon_r.iff +craftDancePropF object/draft_schematic/dance_prop/prop_ribbon_l.iff +craftDancePropG object/draft_schematic/dance_prop/prop_double_ribbon_r.iff +craftDancePropG object/draft_schematic/dance_prop/prop_double_ribbon_l.iff +craftDancePropH object/draft_schematic/dance_prop/prop_ribbon_magic_r.iff +craftDancePropH object/draft_schematic/dance_prop/prop_ribbon_magic_l.iff +craftDancePropI object/draft_schematic/dance_prop/prop_double_ribbon_magic_r.iff +craftDancePropI object/draft_schematic/dance_prop/prop_double_ribbon_magic_l.iff +craftDancePropJ object/draft_schematic/dance_prop/prop_ribbon_spark_r.iff +craftDancePropJ object/draft_schematic/dance_prop/prop_ribbon_spark_l.iff +craftDancePropK object/draft_schematic/dance_prop/prop_double_ribbon_spark_r.iff +craftDancePropK object/draft_schematic/dance_prop/prop_double_ribbon_spark_l.iff +craftInstrumentGroupA object/draft_schematic/instrument/instrument_slitherhorn.iff +craftInstrumentGroupB object/draft_schematic/instrument/instrument_fizz.iff +craftInstrumentGroupBB object/draft_schematic/instrument/instrument_fanfar.iff +craftInstrumentGroupBBB object/draft_schematic/instrument/instrument_mandoviol.iff +craftInstrumentGroupC object/draft_schematic/instrument/instrument_kloo_horn.iff +craftInstrumentGroupC object/draft_schematic/instrument/component/dual_wave_synthesizer.iff +craftInstrumentGroupD object/draft_schematic/instrument/instrument_traz.iff +craftInstrumentGroupE object/draft_schematic/instrument/instrument_bandfill.iff +craftInstrumentGroupEE object/draft_schematic/instrument/instrument_flute_droopy.iff +craftInstrumentGroupF object/draft_schematic/instrument/instrument_omni_box.iff +craftInstrumentGroupFF object/draft_schematic/instrument/instrument_nalargon.iff +craftMedicineComponentGroupA object/draft_schematic/item/item_food_tool.iff +craftMedicineComponentGroupB object/draft_schematic/chemistry/component/biologic_effect_controller.iff +craftMedicineComponentGroupB object/draft_schematic/chemistry/component/liquid_delivery_suspension.iff +craftMedicineComponentGroupC object/draft_schematic/chemistry/component/solid_delivery_shell.iff +craftMedicineComponentGroupC object/draft_schematic/chemistry/component/dispersal_mechanism.iff +craftMedicineComponentGroupD object/draft_schematic/chemistry/component/release_mechanism_duration.iff +craftMedicineComponentGroupD object/draft_schematic/chemistry/component/infection_amplifier.iff +craftMedicineComponentGroupE object/draft_schematic/chemistry/component/biologic_effect_controller_advanced.iff +craftMedicineComponentGroupE object/draft_schematic/chemistry/component/liquid_delivery_suspension_advanced.iff +craftMedicineComponentGroupE object/draft_schematic/chemistry/component/resilience_compound.iff +craftMedicineComponentGroupF object/draft_schematic/chemistry/component/solid_delivery_shell_advanced.iff +craftMedicineComponentGroupF object/draft_schematic/chemistry/component/dispersal_mechanism_advanced.iff +craftMedicineComponentGroupG object/draft_schematic/chemistry/component/release_mechanism_duration_advanced.iff +craftMedicineComponentGroupH object/draft_schematic/chemistry/component/infection_amplifier_advanced.iff +craftMedicineComponentGroupI object/draft_schematic/chemistry/component/resilience_compound_advanced.iff +craftMedicineStimpackGroupA object/draft_schematic/chemistry/instant_stimpack/stimpack_a.iff +craftMedicineStimpackGroupB object/draft_schematic/chemistry/instant_stimpack/stimpack_b.iff +craftMedicineStimpackGroupC object/draft_schematic/chemistry/instant_stimpack/stimpack_c.iff +craftMedicineStimpackGroupD object/draft_schematic/chemistry/instant_stimpack/stimpack_d.iff +craftMedicineStimpackGroupE object/draft_schematic/chemistry/instant_stimpack/stimpack_e.iff +craftMunitionsGroupA object/draft_schematic/munition/component/warhead_fusing_mechanism.iff +craftMunitionsGroupA object/draft_schematic/munition/component/warhead_light.iff +craftMunitionsGroupA object/draft_schematic/munition/grenade_fragmentation_c_12.iff +craftMunitionsGroupB object/draft_schematic/munition/component/warhead_chemical.iff +craftMunitionsGroupB object/draft_schematic/munition/component/warhead_medium.iff +craftMunitionsGroupB object/draft_schematic/munition/grenade_fragmentation_c_22.iff +craftMunitionsGroupB object/draft_schematic/munition/mine_dxr55.iff +craftMunitionsGroupC object/draft_schematic/munition/grenade_glop.iff +craftMunitionsGroupC object/draft_schematic/munition/grenade_cryoban_ww_41.iff +craftMunitionsGroupC object/draft_schematic/munition/component/warhead_stabilizer.iff +craftMunitionsGroupC object/draft_schematic/munition/component/warhead_heavy.iff +craftMunitionsGroupD object/draft_schematic/munition/detonator_thermal_class_a.iff +craftMunitionsGroupD object/draft_schematic/munition/mine_xg.iff +craftMunitionsGroupE object/draft_schematic/munition/grenade_proton.iff +craftMunitionsGroupE object/draft_schematic/munition/mine_anti_vehicle.iff +craftMunitionsGroupF object/draft_schematic/weapon/heavy_rocket_launcher.iff +craftMunitionsGroupF object/draft_schematic/munition/detonator_thermal_imperial_issue.iff +craftStructureGroupAA object/draft_schematic/structure/component/structural_module.iff +craftStructureGroupAA object/draft_schematic/structure/component/structure_light_power_core_unit.iff +craftStructureGroupAA object/draft_schematic/structure/component/structure_small_storage_section.iff +craftStructureGroupAA object/draft_schematic/structure/house_player_small.iff +craftStructureGroupAA object/draft_schematic/structure/corellia_house_player_small.iff +craftStructureGroupAA object/draft_schematic/structure/corellia_house_player_small_floorplan_02.iff +craftStructureGroupAA object/draft_schematic/structure/naboo_house_player_small.iff +craftStructureGroupAA object/draft_schematic/structure/component/structure_generator_turbine.iff +craftStructureGroupAA object/draft_schematic/structure/component/wall_module.iff +craftStructureGroupA object/draft_schematic/structure/component/structure_power_core_unit.iff +craftStructureGroupA object/draft_schematic/structure/component/structure_storage_section.iff +craftStructureGroupA object/draft_schematic/structure/corellia_house_player_small_style_02_floorplan_02.iff +craftStructureGroupA object/draft_schematic/structure/corellia_house_player_small_style_02.iff +craftStructureGroupA object/draft_schematic/structure/naboo_house_player_small_style_02.iff +craftStructureGroupA object/draft_schematic/structure/house_player_small_style_02.iff +craftStructureGroupA object/draft_schematic/structure/generic_house_player_small_floorplan_02.iff +craftStructureGroupA object/draft_schematic/structure/generic_house_player_small.iff +craftStructureGroupB object/draft_schematic/structure/corellia_house_player_medium.iff +craftStructureGroupB object/draft_schematic/structure/naboo_house_player_medium.iff +craftStructureGroupB object/draft_schematic/structure/house_player_medium.iff +craftStructureGroupB object/draft_schematic/structure/generic_house_player_small_style_02.iff +craftStructureGroupB object/draft_schematic/structure/generic_house_player_small_style_02_floorplan_02.iff +craftStructureGroupC object/draft_schematic/structure/corellia_house_player_large.iff +craftStructureGroupC object/draft_schematic/structure/naboo_house_player_large.iff +craftStructureGroupC object/draft_schematic/structure/house_player_large.iff +craftStructureGroupC object/draft_schematic/structure/generic_house_player_medium.iff +craftStructureGroupD object/draft_schematic/structure/generic_house_player_medium_style_02.iff +craftStructureGroupD object/draft_schematic/structure/corellia_house_player_large_style_02.iff +craftStructureGroupD object/draft_schematic/structure/generic_house_player_large.iff +craftStructureGroupD object/draft_schematic/structure/generic_house_player_large_style_02.iff +craftStructureGroupE object/draft_schematic/structure/corellia_house_guild_hall.iff +craftStructureGroupE object/draft_schematic/structure/generic_house_guild_hall.iff +craftStructureGroupE object/draft_schematic/structure/house_guild_hall.iff +craftStructureGroupE object/draft_schematic/structure/naboo_house_guild_hall.iff +craftInstallationGroupAA object/draft_schematic/structure/installation_factory_weapon.iff +craftInstallationGroupAA object/draft_schematic/structure/installation_mining_liquid_vapor.iff +craftInstallationGroupAA object/draft_schematic/structure/component/structure_fluidic_drilling_pumping_unit.iff +craftInstallationGroupAA object/draft_schematic/structure/component/structure_harvesting_mechanism.iff +craftInstallationGroupAA object/draft_schematic/structure/component/structure_ore_mining_unit.iff +craftInstallationGroupAA object/draft_schematic/structure/component/structure_manufacturing_mechanism.iff +craftInstallationGroupAA object/draft_schematic/structure/component/structure_light_ore_mining_unit.iff +craftInstallationGroupA object/draft_schematic/structure/installation_factory_clothing.iff +craftInstallationGroupA object/draft_schematic/structure/installation_factory_food.iff +craftInstallationGroupA object/draft_schematic/structure/installation_factory_structure.iff +craftInstallationGroupB object/draft_schematic/structure/installation_mining_ore.iff +craftInstallationGroupB object/draft_schematic/structure/installation_generator_solar.iff +craftInstallationGroupB object/draft_schematic/structure/installation_mining_gas.iff +craftInstallationGroupB object/draft_schematic/structure/installation_mining_liquid.iff +craftInstallationGroupB object/draft_schematic/structure/component/structure_heavy_harvesting_mechanism.iff +craftInstallationGroupB object/draft_schematic/structure/component/structure_turbo_fluidic_drilling_pumping_unit.iff +craftInstallationGroupC object/draft_schematic/structure/installation_mining_liquid_heavy.iff +craftInstallationGroupC object/draft_schematic/structure/installation_mining_organic_flora.iff +craftInstallationGroupD object/draft_schematic/structure/installation_mining_liquid_vapor_heavy.iff +craftInstallationGroupD object/draft_schematic/structure/installation_mining_organic_flora_heavy.iff +craftInstallationGroupD object/draft_schematic/structure/installation_mining_gas_heavy.iff +craftInstallationGroupD object/draft_schematic/structure/installation_mining_ore_heavy.iff +craftInstallationGroupD object/draft_schematic/structure/installation_generator_fusion.iff +craftWeaponMeleeGroupA object/draft_schematic/weapon/component/blade_vibro_unit.iff +craftWeaponMeleeGroupA object/draft_schematic/weapon/component/sword_core.iff +craftWeaponMeleeGroupA object/draft_schematic/weapon/component/reinforcement_core.iff +craftWeaponMeleeGroupA object/draft_schematic/weapon/sword.iff +craftWeaponMeleeGroupA object/draft_schematic/weapon/staff_metal.iff +craftWeaponMeleeGroupB object/draft_schematic/weapon/lance_vibro_controller_fp.iff +craftWeaponMeleeGroupB object/draft_schematic/weapon/baton_gaderiffi.iff +craftWeaponMeleeGroupB object/draft_schematic/weapon/battleaxe.iff +craftWeaponMeleeGroupC object/draft_schematic/weapon/knuckler_vibro.iff +craftWeaponMeleeGroupC object/draft_schematic/weapon/sword_curved.iff +craftWeaponMeleeGroupC object/draft_schematic/weapon/component/sword_core_advanced.iff +craftWeaponMeleeGroupC object/draft_schematic/weapon/component/reinforcement_core_advanced.iff +craftWeaponMeleeGroupD object/draft_schematic/weapon/knife_vibroblade.iff +craftWeaponMeleeGroupD object/draft_schematic/weapon/sword_ryyk_blade.iff +craftWeaponMeleeGroupD object/draft_schematic/weapon/katana.iff +craftWeaponMeleeGroupD object/draft_schematic/weapon/component/blade_vibro_unit_advanced.iff +craftWeaponMeleeGroupD object/draft_schematic/weapon/sword_rsf.iff +craftWeaponMeleeGroupD object/draft_schematic/weapon/polearm_electric.iff +craftWeaponMeleeGroupD object/draft_schematic/weapon/lance_cryo.iff +craftWeaponMeleeGroupE object/draft_schematic/weapon/baton_stun.iff +craftWeaponMeleeGroupE object/draft_schematic/weapon/axe_vibro.iff +craftWeaponMeleeGroupE object/draft_schematic/weapon/lance_vibro.iff +craftWeaponMeleeGroupE object/draft_schematic/weapon/cleaver.iff +craftWeaponMeleeGroupF object/draft_schematic/weapon/poleaxe_vibro.iff +craftWeaponMeleeGroupF object/draft_schematic/weapon/maul.iff +craftWeaponMeleeGroupF object/draft_schematic/weapon/massassiknuckler.iff +craftWeaponMeleeGroupF object/draft_schematic/weapon/blasterfist.iff +craftWeaponRangedGroupA object/draft_schematic/weapon/component/blaster_pistol_barrel.iff +craftWeaponRangedGroupA object/draft_schematic/weapon/component/blaster_power_handler.iff +craftWeaponRangedGroupA object/draft_schematic/weapon/component/projectile_feed_mechanism.iff +craftWeaponRangedGroupA object/draft_schematic/weapon/component/projectile_pistol_barrel.iff +craftWeaponRangedGroupA object/draft_schematic/weapon/component/scope_weapon.iff +craftWeaponRangedGroupA object/draft_schematic/weapon/component/stock.iff +craftWeaponRangedGroupA object/draft_schematic/weapon/pistol_blaster_d18.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/rifle_blaster_dlt20.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/component/blaster_rifle_barrel.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/component/projectile_rifle_barrel.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/component/chemical_dispersion_mechanism.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/rifle_light_blaster_dh17_carbine.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/pistol_blaster_dl44.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/pistol_blaster_scout_trooper.iff +craftWeaponRangedGroupB object/draft_schematic/weapon/rifle_blaster_dlt20a.iff +craftWeaponRangedGroupC object/draft_schematic/weapon/pistol_flechette_fwg5.iff +craftWeaponRangedGroupC object/draft_schematic/weapon/pistol_projectile_striker.iff +craftWeaponRangedGroupC object/draft_schematic/weapon/pistol_scatter_light.iff +craftWeaponRangedGroupC object/draft_schematic/weapon/pistol_dl44_metal_light.iff +craftWeaponRangedGroupC object/draft_schematic/weapon/rifle_light_blaster_dh17_carbine_snubnose.iff +craftWeaponRangedGroupC object/draft_schematic/weapon/rifle_projectile_tusken.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/pistol_blaster_dh17.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/pistol_blaster_power5.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/rifle_light_blaster_e11_carbine.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/rifle_blaster_e11.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/carbine_e11_mk2.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/rifle_sonic_sg82.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/carbine_alliance_needler.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/component/blaster_pistol_barrel_advanced.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/component/blaster_power_handler_advanced.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/component/projectile_feed_mechanism_advanced.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/component/projectile_pistol_barrel_advanced.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/component/scope_weapon_advanced.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/component/stock_advanced.iff +craftWeaponRangedGroupD object/draft_schematic/weapon/pistol_launcher.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/pistol_blaster_short_range_combat.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_light_blaster_laser_carbine.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_laser_light.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_light_blaster_ee3.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_spray_stick_stohli.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_lightning_basic.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/component/blaster_rifle_barrel_advanced.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/component/projectile_rifle_barrel_advanced.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/component/chemical_dispersion_mechanism_advanced.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/heavy_particle_beam.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/heavy_lightning_beam.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_lightning.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_beam.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/pistol_renegade.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/pistol_scatter.iff +craftWeaponRangedGroupE object/draft_schematic/weapon/rifle_flame_thrower_light.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_blaster_laser_rifle.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_tangle_gun7.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/pistol_disrupter_dx2.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_light_blaster_imperial_scout_carbine.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_disrupter_dxr6.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_blaster_ionization_jawa.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_t21.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/heavy_acid_beam.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/pistol_republic_blaster.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_acid_beam.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_flame_thrower.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/carbine_czerka_dart.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/pistol_deathhammer_needle.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/pistol_alliance_disruptor.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/pistol_intimidator.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/pistol_blaster_dl44_metal.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/carbine_e5.iff +craftWeaponRangedGroupF object/draft_schematic/weapon/rifle_lightning_heavy.iff +craftScoutCampGroupA object/draft_schematic/scout/item_camp_basic.iff +craftScoutCampGroupB object/draft_schematic/scout/item_camp_multi.iff +craftScoutCampGroupC object/draft_schematic/scout/item_camp_improved.iff +craftRangerCampGroupA object/draft_schematic/scout/item_camp_quality.iff +craftRangerCampGroupB object/draft_schematic/scout/item_camp_elite.iff +craftRangerCampGroupC object/draft_schematic/scout/item_camp_luxury.iff +craftScoutTrapGroupNovice object/draft_schematic/scout/item_trap_drowsy_dart.iff +craftScoutTrapGroupNovice object/draft_schematic/scout/item_trap_melee_def_1.iff +craftScoutTrapGroupA object/draft_schematic/scout/item_trap_enraging_spur.iff +craftScoutTrapGroupA object/draft_schematic/scout/item_trap_ranged_def_1.iff +craftScoutTrapGroupB object/draft_schematic/scout/item_trap_noise_maker.iff +craftScoutTrapGroupB object/draft_schematic/scout/item_trap_state_def_1.iff +craftScoutTrapGroupC object/draft_schematic/scout/item_trap_tranq_dart.iff +craftScoutTrapGroupC object/draft_schematic/scout/item_trap_melee_ranged_def_1.iff +craftScoutTrapGroupD object/draft_schematic/scout/item_trap_webber.iff +craftRangerTrapGroupA object/draft_schematic/scout/item_trap_flash_bomb.iff +craftRangerTrapGroupB object/draft_schematic/scout/item_trap_sonic_pulse.iff +craftRangerCamoGroupA object/draft_schematic/scout/item_camokit_corellia.iff +craftRangerCamoGroupA object/draft_schematic/scout/item_camokit_naboo.iff +craftRangerCamoGroupA object/draft_schematic/scout/item_camokit_tatooine.iff +craftRangerCamoGroupB object/draft_schematic/scout/item_camokit_rori.iff +craftRangerCamoGroupB object/draft_schematic/scout/item_camokit_talus.iff +craftRangerCamoGroupC object/draft_schematic/scout/item_camokit_yavin.iff +craftRangerCamoGroupC object/draft_schematic/scout/item_camokit_dantooine.iff +craftRangerCamoGroupD object/draft_schematic/scout/item_camokit_lok.iff +craftRangerCamoGroupD object/draft_schematic/scout/item_camokit_endor.iff +craftRangerCamoGroupMaster object/draft_schematic/scout/item_camokit_dathomir.iff +craftBasicTissueGroup object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_bleeding.iff +craftBasicTissueGroup object/draft_schematic/bio_engineer/bio_component/bio_component_food_light_flavor.iff +craftBasicTissueGroup object/draft_schematic/bio_engineer/instant_stimpack/stimpack_pet_a.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/dna_template/dna_template_generic.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_bearded_jax.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_eopie.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_kaadu.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_gnort.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_durni.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_vir_vur.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_squall.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_ikopi.iff +craftBasicCreatureGroup object/draft_schematic/bio_engineer/creature/creature_swirl_prong.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_dewback.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_gualama.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_kahmurra.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_krahbu.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_tybis.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_kwi.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_mott.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_verne.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_cu_pa.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_roba.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_huurton.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_bageraset.iff +craftDomesticCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_gurnaset.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_choku.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_carrion_spat.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_pugoriss.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_kusak.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_gurrcat.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_zucca_boar.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_langlatch.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_kima.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_dune_lizard.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_bocatt.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_boar_wolf.iff +craftAggressiveCreatureGroupA object/draft_schematic/bio_engineer/creature/creature_vesp.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_blurrg.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_bantha.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_bol.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_bolle_bol.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_bolma.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_brackaset.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_falumpaset.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_ronto.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_snorbal.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_bordok.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_gronda.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_piket.iff +craftDomesticCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_thune.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_angler.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_dalyrake.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_guf_drolg.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_gurreck.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_narglatch.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_sand_panther.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_slice_hound.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_kliknik.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_mawgax.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_merek.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_hermit_spider.iff +craftAggressiveCreatureGroupB object/draft_schematic/bio_engineer/creature/creature_shear_mite.iff +craftTissueGroupA object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_casual_entertainer.iff +craftTissueGroupA object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_intimidate.iff +craftTissueGroupA object/draft_schematic/bio_engineer/bio_component/bio_component_food_light_nutrition.iff +craftTissueGroupA object/draft_schematic/bio_engineer/bio_component/bio_component_food_light_quantity.iff +craftTissueGroupA object/draft_schematic/bio_engineer/utilities/pet_vitapack_a.iff +craftTissueGroupB object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_casual_medic.iff +craftTissueGroupB object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_casual_taming.iff +craftTissueGroupB object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_camo.iff +craftTissueGroupB object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_cover.iff +craftTissueGroupB object/draft_schematic/bio_engineer/bio_component/bio_component_food_light_filling.iff +craftTissueGroupB object/draft_schematic/bio_engineer/bio_component/bio_component_food_medium_quantity.iff +craftTissueGroupB object/draft_schematic/bio_engineer/instant_stimpack/stimpack_pet_b.iff +craftTissueGroupC object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_defense.iff +craftTissueGroupC object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_casual_entertainer_2.iff +craftTissueGroupC object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_bleeding_2.iff +craftTissueGroupC object/draft_schematic/bio_engineer/bio_component/bio_component_food_medium_flavor.iff +craftTissueGroupC object/draft_schematic/bio_engineer/bio_component/bio_component_food_medium_nutrition.iff +craftTissueGroupC object/draft_schematic/bio_engineer/bio_component/bio_component_food_medium_filling.iff +craftTissueGroupC object/draft_schematic/bio_engineer/utilities/pet_vitapack_b.iff +craftTissueGroupD object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_casual_medic_2.iff +craftTissueGroupD object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_casual_taming_2.iff +craftTissueGroupD object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_camo_2.iff +craftTissueGroupD object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_cover_2.iff +craftTissueGroupD object/draft_schematic/bio_engineer/bio_component/bio_component_food_heavy_flavor.iff +craftTissueGroupD object/draft_schematic/bio_engineer/bio_component/bio_component_food_heavy_quantity.iff +craftTissueGroupD object/draft_schematic/bio_engineer/instant_stimpack/stimpack_pet_c.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_torton.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_kimogila.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_rancor.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_fambaa.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_veermok.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_graul.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_huf_dun.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_malkloc.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_sharnaff.iff +craftAdvancedCreatureGroup object/draft_schematic/bio_engineer/creature/creature_woolamander.iff +craftAdvancedTissueGroup object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_defense_2.iff +craftAdvancedTissueGroup object/draft_schematic/bio_engineer/bio_component/bio_component_clothing_field_intimidate_2.iff +craftAdvancedTissueGroup object/draft_schematic/bio_engineer/bio_component/bio_component_food_heavy_filling.iff +craftAdvancedTissueGroup object/draft_schematic/bio_engineer/bio_component/bio_component_food_heavy_nutrition.iff +craftAdvancedTissueGroup object/draft_schematic/bio_engineer/utilities/pet_vitapack_c.iff +craftAdvancedTissueGroup object/draft_schematic/bio_engineer/instant_stimpack/stimpack_pet_d.iff +craftSmugglerSpiceNovice object/draft_schematic/spices/spice_grey_gabaki.iff +craftSmugglerSpiceNovice object/draft_schematic/spices/spice_scramjet.iff +craftSmugglerSpiceNovice object/draft_schematic/spices/spice_shadowpaw.iff +craftSmugglerSpiceA object/draft_schematic/spices/spice_yarrock.iff +craftSmugglerSpiceA object/draft_schematic/spices/spice_giggledust.iff +craftSmugglerSpiceA object/draft_schematic/spices/spice_sweetblossom.iff +craftSmugglerSpiceB object/draft_schematic/spices/spice_droid_lube.iff +craftSmugglerSpiceB object/draft_schematic/spices/spice_pyrepenol.iff +craftSmugglerSpiceB object/draft_schematic/spices/spice_sedative_h4b.iff +craftSmugglerSpiceC object/draft_schematic/spices/spice_crash_n_burn.iff +craftSmugglerSpiceC object/draft_schematic/spices/spice_gunjack.iff +craftSmugglerSpiceC object/draft_schematic/spices/spice_thruster_head.iff +craftSmugglerSpiceD object/draft_schematic/spices/spice_booster_blue.iff +craftSmugglerSpiceD object/draft_schematic/spices/spice_muon_gold.iff +craftSmugglerSpiceD object/draft_schematic/spices/spice_neutron_pixey.iff +craftWookieItems object/draft_schematic/weapon/rifle_bowcaster.iff +craftWookieItems object/draft_schematic/weapon/bowcaster_recon.iff +craftWookieItems object/draft_schematic/weapon/bowcaster_assault.iff +craftJediStuff object/draft_schematic/item/item_powerup_weapon_melee_lightsaber.iff +craftJediTool object/draft_schematic/item/item_jedi_tool.iff +craftJediTool object/draft_schematic/weapon/lightsaber/lightsaber_refined_crystal_pack.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_training.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_one_hand_gen1.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_two_hand_gen1.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_polearm_gen1.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_one_hand_gen2.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_one_hand_gen3.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_two_hand_gen2.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_two_hand_gen3.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_polearm_gen2.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_polearm_gen3.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_polearm_gen4.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_one_hand_gen4.iff +craftSaberAll object/draft_schematic/weapon/lightsaber/lightsaber_two_hand_gen4.iff +craftPlayerCityA object/draft_schematic/structure/city/bank_corellia.iff +craftPlayerCityA object/draft_schematic/structure/city/bank_naboo.iff +craftPlayerCityA object/draft_schematic/structure/city/bank_tatooine.iff +craftPlayerCityA object/draft_schematic/furniture/city/furniture_streetlamp.iff +craftPlayerCityA object/draft_schematic/furniture/city/furniture_statue.iff +craftPlayerCityA object/draft_schematic/structure/merchant_tent.iff +craftPlayerCityB object/draft_schematic/structure/city/cloning_corellia.iff +craftPlayerCityB object/draft_schematic/structure/city/cloning_naboo.iff +craftPlayerCityB object/draft_schematic/structure/city/cloning_tatooine.iff +craftPlayerCityB object/draft_schematic/structure/city/shuttleport_corellia.iff +craftPlayerCityB object/draft_schematic/structure/city/shuttleport_naboo.iff +craftPlayerCityB object/draft_schematic/structure/city/shuttleport_tatooine.iff +craftPlayerCityB object/draft_schematic/furniture/city/furniture_fountain.iff +craftPlayerCityB object/draft_schematic/structure/city/garden_small.iff +craftPlayerCityC object/draft_schematic/structure/city/cantina_corellia.iff +craftPlayerCityC object/draft_schematic/structure/city/cantina_naboo.iff +craftPlayerCityC object/draft_schematic/structure/city/cantina_tatooine.iff +craftPlayerCityC object/draft_schematic/structure/city/hospital_corellia.iff +craftPlayerCityC object/draft_schematic/structure/city/hospital_naboo.iff +craftPlayerCityC object/draft_schematic/structure/city/hospital_tatooine.iff +craftPlayerCityC object/draft_schematic/structure/city/theater_corellia.iff +craftPlayerCityC object/draft_schematic/structure/city/theater_naboo.iff +craftPlayerCityC object/draft_schematic/structure/city/theater_tatooine.iff +craftPlayerCityC object/draft_schematic/structure/city/garden_medium.iff +craftPlayerCityC object/draft_schematic/structure/city/garage_corellia.iff +craftPlayerCityC object/draft_schematic/structure/city/garage_naboo.iff +craftPlayerCityC object/draft_schematic/structure/city/garage_tatooine.iff +craftPlayerCityD object/draft_schematic/structure/city/cityhall_corellia.iff +craftPlayerCityD object/draft_schematic/structure/city/cityhall_naboo.iff +craftPlayerCityD object/draft_schematic/structure/city/cityhall_tatooine.iff +craftPlayerCityD object/draft_schematic/structure/city/garden_large.iff +craftPlayerCityE object/draft_schematic/structure/city/garden_exotic_dantooine.iff +craftPlayerCityE object/draft_schematic/structure/city/garden_exotic_dathomir.iff +craftPlayerCityE object/draft_schematic/structure/city/garden_exotic_endor.iff +craftArtisanVehicle object/draft_schematic/vehicle/civilian/landspeeder_x34.iff +craftArtisanVehicle object/draft_schematic/vehicle/civilian/speeder_bike_swoop.iff +craftArtisanVehicle object/draft_schematic/vehicle/civilian/speeder_bike.iff +craftArtisanVehicle object/draft_schematic/vehicle/vehicle_customization_kit.iff +craftArtisanVehicle object/draft_schematic/vehicle/civilian/landspeeder_v35.iff +craftArtisanVehicle object/draft_schematic/vehicle/civilian/landspeeder_xp38.iff +craftArtisanVehicle object/draft_schematic/vehicle/civilian/landspeeder_ab1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/chassis/z95.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/chassis/tie_light_duty.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/chassis/hutt_light_s01.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/chassis/hutt_light_s02.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/armor/light_durasteel_plating.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/capacitor/capacitor_mk1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/engine/eng_mk1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/reactor/fusion_reactor_mk1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/shields/light_deflector_shields.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/reverse_engineering/analysis_tool.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/armor_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/engine_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/chassis_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/reactor_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/booster_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/capacitor_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/droid_interface_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/plasma_conduit_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/shield_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/repair/weapon_repair_kit.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/booster/booster_mk1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/droid_interface/ddi_mk1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/wpn_light_blaster.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/wpn_light_blaster_green.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/wpn_light_disruptor.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/wpn_light_ioncannon.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/missile/countermeasure_chaff_launcher.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/missile/countermeasure_chaff_pack.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/missile/wpn_launcher_proton_mk1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/weapon/missile/wpn_proton_missile_mk1.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/chassis/texture_kit_s01.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/chassis/texture_kit_s02.iff +craftShipwrightNoviceGroupA object/draft_schematic/space/cargo_hold/crg_starfighter_small.iff +craftShipwrightEngGroupA object/draft_schematic/space/chassis/tiefighter.iff +craftShipwrightEngGroupA object/draft_schematic/space/armor/armor_reinforcement_panel_mk1.iff +craftShipwrightEngGroupA object/draft_schematic/space/armor/mass_reduction_kit_mk1.iff +craftShipwrightEngGroupA object/draft_schematic/space/chassis/ywing.iff +craftShipwrightEngGroupA object/draft_schematic/space/chassis/xwing_customization_kit.iff +craftShipwrightEngGroupA object/draft_schematic/space/chassis/hutt_medium_s01.iff +craftShipwrightEngGroupA object/draft_schematic/space/chassis/hutt_medium_s02.iff +craftShipwrightEngGroupA object/draft_schematic/space/chassis/texture_kit_s03.iff +craftShipwrightEngGroupA object/draft_schematic/space/armor/durasteel_plating.iff +craftShipwrightEngGroupA object/draft_schematic/space/modification/z95_modification_s01.iff +craftShipwrightEngGroupA object/draft_schematic/space/cargo_hold/crg_starfighter_medium.iff +craftShipwrightEngGroupA object/draft_schematic/space/cargo_hold/crg_pob_small.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/ywing_longprobe.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/tie_in.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/hutt_heavy_s01.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/hutt_heavy_s02.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/blacksun_light_s01.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/blacksun_light_s02.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/blacksun_light_s03.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/blacksun_light_s04.iff +craftShipwrightEngGroupB object/draft_schematic/space/chassis/texture_kit_s04.iff +craftShipwrightEngGroupB object/draft_schematic/space/armor/armor_reinforcement_panel_mk2.iff +craftShipwrightEngGroupB object/draft_schematic/space/armor/mass_reduction_kit_mk2.iff +craftShipwrightEngGroupB object/draft_schematic/space/armor/heavy_durasteel_plating.iff +craftShipwrightEngGroupB object/draft_schematic/space/modification/xwing_modification_s01.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/xwing.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/tieinterceptor.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/tiebomber.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/texture_kit_s05.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/blacksun_medium_s01.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/blacksun_medium_s02.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/blacksun_medium_s03.iff +craftShipwrightEngGroupC object/draft_schematic/space/chassis/blacksun_medium_s04.iff +craftShipwrightEngGroupC object/draft_schematic/space/armor/adv_durasteel_plating.iff +craftShipwrightEngGroupC object/draft_schematic/space/armor/armor_reinforcement_panel_mk3.iff +craftShipwrightEngGroupC object/draft_schematic/space/armor/mass_reduction_kit_mk3.iff +craftShipwrightEngGroupC object/draft_schematic/space/modification/tieadvanced_modification_s01.iff +craftShipwrightEngGroupC object/draft_schematic/space/cargo_hold/crg_starfighter_large.iff +craftShipwrightEngGroupC object/draft_schematic/space/cargo_hold/crg_pob_medium.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/tieadvanced.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/tieaggressor.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/awing.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/blacksun_heavy_s01.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/blacksun_heavy_s02.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/blacksun_heavy_s03.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/blacksun_heavy_s04.iff +craftShipwrightEngGroupD object/draft_schematic/space/chassis/texture_kit_s06.iff +craftShipwrightEngGroupD object/draft_schematic/space/armor/exp_durasteel_plating.iff +craftShipwrightEngGroupD object/draft_schematic/space/armor/armor_reinforcement_panel_mk4.iff +craftShipwrightEngGroupD object/draft_schematic/space/armor/mass_reduction_kit_mk4.iff +craftShipwrightEngGroupD object/draft_schematic/space/modification/hutt_heavy_modification_s01.iff +craftShipwrightEngGroupD object/draft_schematic/space/cargo_hold/crg_pob_large.iff +craftShipwrightEngGroupD object/draft_schematic/space/cargo_hold/crg_mining_small.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/engine/engine_overdriver_mk1.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/engine/engine_limiter_mk1.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/booster/booster_overdriver_mk1.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/booster/extended_life_fuel_cell_mk1.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/booster/fast_charge_fuel_cell_mk1.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/booster/heavy_fuel_cell_mk1.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/engine/eng_mk2.iff +craftShipwrightPropulsionGroupA object/draft_schematic/space/booster/booster_mk2.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/engine/engine_overdriver_mk2.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/engine/engine_limiter_mk2.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/booster/booster_overdriver_mk2.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/booster/extended_life_fuel_cell_mk2.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/booster/fast_charge_fuel_cell_mk2.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/booster/heavy_fuel_cell_mk2.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/engine/eng_mk3.iff +craftShipwrightPropulsionGroupB object/draft_schematic/space/booster/booster_mk3.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/booster/booster_overdriver_mk3.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/booster/extended_life_fuel_cell_mk3.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/booster/fast_charge_fuel_cell_mk3.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/booster/heavy_fuel_cell_mk3.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/engine/engine_overdriver_mk3.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/engine/engine_limiter_mk3.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/booster/booster_mk4.iff +craftShipwrightPropulsionGroupC object/draft_schematic/space/engine/eng_mk4.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/booster/booster_overdriver_mk4.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/booster/extended_life_fuel_cell_mk4.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/booster/fast_charge_fuel_cell_mk4.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/booster/heavy_fuel_cell_mk4.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/booster/booster_mk5.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/engine/engine_overdriver_mk4.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/engine/engine_limiter_mk4.iff +craftShipwrightPropulsionGroupD object/draft_schematic/space/engine/eng_mk5.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/droid_interface/droid_brain_upgrade_mk1.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/droid_interface/maintenance_reduction_kit_mk1.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/capacitor/energy_saver_battery_mk1.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/capacitor/extended_life_battery_mk1.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/capacitor/heavy_battery_mk1.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/capacitor/quick_recharge_battery_mk1.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/droid_interface/ddi_mk2.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/capacitor/capacitor_mk2.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/reactor/fusion_reactor_mk2.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/reactor/reactor_limiter_mk1.iff +craftShipwrightSystemsGroupA object/draft_schematic/space/reactor/reactor_overcharger_mk1.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/capacitor/capacitor_mk3.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/droid_interface/ddi_mk3.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/droid_interface/droid_brain_upgrade_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/droid_interface/maintenance_reduction_kit_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/capacitor/energy_saver_battery_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/capacitor/extended_life_battery_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/capacitor/heavy_battery_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/capacitor/quick_recharge_battery_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/reactor/reactor_limiter_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/reactor/reactor_overcharger_mk2.iff +craftShipwrightSystemsGroupB object/draft_schematic/space/reactor/fusion_reactor_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/capacitor/energy_saver_battery_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/capacitor/extended_life_battery_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/capacitor/heavy_battery_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/capacitor/quick_recharge_battery_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/droid_interface/droid_brain_upgrade_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/droid_interface/maintenance_reduction_kit_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/reactor/reactor_limiter_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/reactor/reactor_overcharger_mk3.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/droid_interface/ddi_mk4.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/reactor/fusion_reactor_mk4.iff +craftShipwrightSystemsGroupC object/draft_schematic/space/capacitor/capacitor_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/droid_interface/droid_brain_upgrade_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/droid_interface/maintenance_reduction_kit_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/capacitor/energy_saver_battery_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/capacitor/extended_life_battery_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/capacitor/heavy_battery_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/capacitor/quick_recharge_battery_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/reactor/reactor_limiter_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/reactor/reactor_overcharger_mk4.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/reactor/fusion_reactor_mk5.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/droid_interface/ddi_mk5.iff +craftShipwrightSystemsGroupD object/draft_schematic/space/capacitor/capacitor_mk5.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/missile/countermeasure_decoy_launcher.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/missile/countermeasure_decoy_pack.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/missile/wpn_launcher_concussion_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/missile/wpn_concussion_missile_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/armor_effectiveness_intensifier_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/max_damage_intensifier_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/min_damage_intensifier_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/quick_shot_upgrade_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/shield_effectiveness_intensifier_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/speed_limiter_upgrade_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/shields/shield_energy_saver_kit_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/shields/shield_intensifier_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/shields/shield_limiter_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/shields/shield_overcharger_mk1.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/wpn_medium_blaster.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/wpn_medium_blaster_green.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/wpn_medium_ioncannon.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/wpn_medium_disruptor.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/shields/deflector_shields.iff +craftShipwrightDefenseGroupA object/draft_schematic/space/weapon/wpn_mining_laser_mk1.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/wpn_launcher_seismic_mk1.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/wpn_seismic_missile_mk1.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/wpn_launcher_proton_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/wpn_proton_missile_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/countermeasure_microchaff_launcher.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/countermeasure_microchaff_pack.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/wpn_launcher_imagerec_mk1.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/missile/wpn_imagerec_missile_mk1.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/armor_effectiveness_intensifier_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/max_damage_intensifier_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/min_damage_intensifier_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/quick_shot_upgrade_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/shield_effectiveness_intensifier_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/speed_limiter_upgrade_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/shields/shield_energy_saver_kit_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/shields/shield_intensifier_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/shields/shield_limiter_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/shields/shield_overcharger_mk2.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/wpn_heavy_blaster.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/wpn_heavy_blaster_green.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/wpn_heavy_ioncannon.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/wpn_heavy_disruptor.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/shields/heavy_deflector_shields.iff +craftShipwrightDefenseGroupB object/draft_schematic/space/weapon/wpn_tractor_beam.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/missile/countermeasure_confuser_launcher.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/missile/countermeasure_confuser_pack.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/missile/wpn_launcher_spacebomb_mk1.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/missile/wpn_spacebomb_missile_mk1.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/missile/wpn_launcher_concussion_mk2.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/missile/wpn_concussion_missile_mk2.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/wpn_advanced_blaster.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/wpn_advanced_blaster_green.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/wpn_advanced_ioncannon.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/wpn_advanced_disruptor.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/shields/adv_deflector_shields.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/armor_effectiveness_intensifier_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/max_damage_intensifier_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/min_damage_intensifier_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/quick_shot_upgrade_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/shield_effectiveness_intensifier_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/speed_limiter_upgrade_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/shields/shield_energy_saver_kit_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/shields/shield_intensifier_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/shields/shield_limiter_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/shields/shield_overcharger_mk3.iff +craftShipwrightDefenseGroupC object/draft_schematic/space/weapon/wpn_mining_laser_mk2.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/missile/countermeasure_em_launcher.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/missile/countermeasure_em_pack.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/missile/wpn_launcher_seismic_mk2.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/missile/wpn_seismic_missile_mk2.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/missile/wpn_launcher_proton_mk3.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/missile/wpn_proton_missile_mk3.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/shields/shield_energy_saver_kit_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/shields/shield_intensifier_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/shields/shield_limiter_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/shields/shield_overcharger_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/armor_effectiveness_intensifier_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/max_damage_intensifier_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/min_damage_intensifier_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/quick_shot_upgrade_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/shield_effectiveness_intensifier_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/speed_limiter_upgrade_mk4.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/wpn_experimental_blaster.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/wpn_experimental_blaster_green.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/wpn_experimental_ioncannon.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/wpn_experimental_disruptor.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/shields/exp_deflector_shields.iff +craftShipwrightDefenseGroupD object/draft_schematic/space/weapon/wpn_mining_laser_mk3.iff +craftShipwrightMaster object/draft_schematic/space/weapon/wpn_mining_laser_elite.iff +craftShipwrightMaster object/draft_schematic/space/booster/booster_overdriver_mk5.iff +craftShipwrightMaster object/draft_schematic/space/booster/extended_life_fuel_cell_mk5.iff +craftShipwrightMaster object/draft_schematic/space/booster/fast_charge_fuel_cell_mk5.iff +craftShipwrightMaster object/draft_schematic/space/booster/heavy_fuel_cell_mk5.iff +craftShipwrightMaster object/draft_schematic/space/engine/engine_overdriver_mk5.iff +craftShipwrightMaster object/draft_schematic/space/engine/engine_limiter_mk5.iff +craftShipwrightMaster object/draft_schematic/space/armor/armor_reinforcement_panel_mk5.iff +craftShipwrightMaster object/draft_schematic/space/armor/mass_reduction_kit_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/quick_shot_upgrade_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/shield_effectiveness_intensifier_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/speed_limiter_upgrade_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/armor_effectiveness_intensifier_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/max_damage_intensifier_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/min_damage_intensifier_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_launcher_proton_mk4.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_proton_missile_mk4.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_launcher_seismic_mk3.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_seismic_missile_mk3.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_launcher_concussion_mk3.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_concussion_missile_mk3.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_launcher_imagerec_mk2.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_imagerec_missile_mk2.iff +craftShipwrightMaster object/draft_schematic/space/shields/shield_energy_saver_kit_mk5.iff +craftShipwrightMaster object/draft_schematic/space/shields/shield_intensifier_mk5.iff +craftShipwrightMaster object/draft_schematic/space/chassis/bwing.iff +craftShipwrightMaster object/draft_schematic/space/chassis/hutt_turret_ship.iff +craftShipwrightMaster object/draft_schematic/space/chassis/yt1300.iff +craftShipwrightMaster object/draft_schematic/space/chassis/tieoppressor.iff +craftShipwrightMaster object/draft_schematic/space/chassis/decimator.iff +craftShipwrightMaster object/draft_schematic/space/chassis/ykl37r.iff +craftShipwrightMaster object/draft_schematic/space/droid_interface/droid_brain_upgrade_mk5.iff +craftShipwrightMaster object/draft_schematic/space/capacitor/energy_saver_battery_mk5.iff +craftShipwrightMaster object/draft_schematic/space/capacitor/extended_life_battery_mk5.iff +craftShipwrightMaster object/draft_schematic/space/reactor/reactor_limiter_mk5.iff +craftShipwrightMaster object/draft_schematic/space/shields/shield_limiter_mk5.iff +craftShipwrightMaster object/draft_schematic/space/shields/shield_overcharger_mk5.iff +craftShipwrightMaster object/draft_schematic/space/reactor/reactor_overcharger_mk5.iff +craftShipwrightMaster object/draft_schematic/space/capacitor/heavy_battery_mk5.iff +craftShipwrightMaster object/draft_schematic/space/capacitor/quick_recharge_battery_mk5.iff +craftShipwrightMaster object/draft_schematic/space/droid_interface/maintenance_reduction_kit_mk5.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_launcher_spacebomb_mk2.iff +craftShipwrightMaster object/draft_schematic/space/weapon/missile/wpn_spacebomb_missile_mk2.iff +craftShipwrightMaster object/draft_schematic/space/armor/elite_armor.iff +craftShipwrightMaster object/draft_schematic/space/booster/elite_booster.iff +craftShipwrightMaster object/draft_schematic/space/capacitor/elite_capacitor.iff +craftShipwrightMaster object/draft_schematic/space/capacitor/mining_grade_capacitor.iff +craftShipwrightMaster object/draft_schematic/space/engine/elite_engine.iff +craftShipwrightMaster object/draft_schematic/space/chassis/hutt_light_heavy.iff +craftShipwrightMaster object/draft_schematic/space/chassis/z95_heavy.iff +craftShipwrightMaster object/draft_schematic/space/chassis/tiefighter_heavy.iff +craftShipwrightMaster object/draft_schematic/space/reactor/elite_reactor.iff +craftShipwrightMaster object/draft_schematic/space/shields/elite_shields.iff +craftShipwrightMaster object/draft_schematic/space/reactor/mining_grade_reactor.iff +craftShipwrightMaster object/draft_schematic/space/weapon/wpn_elite_gauss.iff +craftShipwrightMaster object/draft_schematic/space/weapon/wpn_elite_null_bolt.iff +craftShipwrightMaster object/draft_schematic/space/weapon/wpn_elite_railgun.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_arc170_s01.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_arc170_s02.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_awing_s06.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_bwing_s06.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_bwing_s07.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_xwing_s06.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_xwing_s07.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_ywing_s06.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_ywing_longprobe_s06.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_z95_s06.iff +craftShipwrightMaster object/draft_schematic/space/chassis/texture_kit_z95_s07.iff +craftShipwrightMaster object/draft_schematic/space/modification/blacksun_heavy_modification_s01.iff +craftShipwrightMaster object/draft_schematic/space/cargo_hold/crg_mining_large.iff +craftShipwrightMaster object/draft_schematic/space/cargo_hold/crg_mining_medium.iff +end end diff --git a/src/utility/java/com/projectswg/utility/ClientdataConvertAll.java b/src/utility/java/com/projectswg/utility/ClientdataConvertAll.java index 5e3c63d79..df38944ba 100644 --- a/src/utility/java/com/projectswg/utility/ClientdataConvertAll.java +++ b/src/utility/java/com/projectswg/utility/ClientdataConvertAll.java @@ -1,3 +1,29 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ package com.projectswg.utility; import com.projectswg.utility.clientdata.Converters; @@ -5,8 +31,8 @@ import java.io.IOException; public class ClientdataConvertAll { - - public static void main(String [] args) throws IOException { + + public static void main(String[] args) throws IOException { Converters.OBJECTS_OBJECT_DATA.load(); Converters.ABSTRACT_SLOT_DEFINITION.load(); @@ -17,7 +43,7 @@ public static void main(String [] args) throws IOException { Converters.BUILDOUT_OBJECTS.load(); Converters.PROFESSION_TEMPLATES.load(); - + Converters.ROLES.load(); Converters.COMMANDS_GLOBAL.load(); Converters.COMMANDS_GROUND.load(); @@ -25,6 +51,7 @@ public static void main(String [] args) throws IOException { Converters.BUFFS.load(); Converters.SKILLS.load(); Converters.APPEARANCE_TABLE.load(); + Converters.SCHEMATIC_GROUP.load(); } - + } diff --git a/src/utility/java/com/projectswg/utility/clientdata/Converters.java b/src/utility/java/com/projectswg/utility/clientdata/Converters.java index 1d79d69cf..3deac729c 100644 --- a/src/utility/java/com/projectswg/utility/clientdata/Converters.java +++ b/src/utility/java/com/projectswg/utility/clientdata/Converters.java @@ -1,3 +1,29 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ package com.projectswg.utility.clientdata; import java.util.function.Supplier; @@ -19,6 +45,7 @@ public enum Converters { SKILLS (() -> new ConvertDatatable("datatables/skill/skills.iff", "serverdata/skill/skills.sdb", true)), PROFESSION_TEMPLATES (ConvertProfessionTemplates::new), APPEARANCE_TABLE (() -> new ConvertDatatable("datatables/appearance/appearance_table.iff", "serverdata/appearance/appearance_table.sdb", true)), + SCHEMATIC_GROUP (() -> new ConvertDatatable("datatables/crafting/schematic_group.iff", "serverdata/crafting/schematic_group.sdb", true)), TERRAINS (ConvertTerrain::new); private final Supplier converter; From 6cdc573ccfaeb7bdf1e638050354029c475e5e33 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Fri, 28 Jul 2023 17:00:04 +0200 Subject: [PATCH 02/13] Created data loader for schematic groups, which we will need later to grant draft schematics when relevant skills are granted --- .../loader/SchematicGroupLoader.kt | 69 +++++++++++++++++++ .../data/server_info/loader/ServerData.kt | 1 + .../loader/SchematicGroupLoaderTest.kt | 67 ++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoader.kt create mode 100644 src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoaderTest.kt diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoader.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoader.kt new file mode 100644 index 000000000..b640b3d91 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoader.kt @@ -0,0 +1,69 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.data.server_info.SdbLoader +import java.io.File + +class SchematicGroupLoader : DataLoader() { + + private val schematicGroupMap = mutableMapOf>() + + /** + * Returns a collection of all schematic names in the given group + * Example: getSchematicsInGroup("craftDroidDamageRepairA") returns a collection of ["object/draft_schematic/droid/droid_damage_repair_kit_a.iff"] + */ + fun getSchematicsInGroup(groupId: String): Collection { + return schematicGroupMap.getOrElse(groupId) { emptyList() } + } + + override fun load() { + val set = SdbLoader.load(File("serverdata/crafting/schematic_group.sdb")) + + set.use { + while (set.next()) { + val groupid = set.getText("groupid") + val schematicname = set.getText("schematicname") + + if (groupid != "end") { + ensureSchematicGroupExists(groupid) + appendSchematicToGroup(groupid, schematicname) + } + } + } + } + + private fun appendSchematicToGroup(groupid: String, schematicname: String) { + schematicGroupMap[groupid]?.add(schematicname) + } + + private fun ensureSchematicGroupExists(groupid: String) { + if (!schematicGroupMap.containsKey(groupid)) { + schematicGroupMap[groupid] = mutableListOf() + } + } +} diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt index 0cf1f6f79..776c9ec11 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt @@ -111,6 +111,7 @@ object ServerData { val defaultChatRooms by SoftDataLoaderDelegate(::DefaultChatRoomLoader) val planetChatRooms by SoftDataLoaderDelegate(::PlanetChatRoomLoader) val staticCityPoints by SoftDataLoaderDelegate(::StaticCityPointLoader) + val schematicGroups by SoftDataLoaderDelegate(::SchematicGroupLoader) private class WeakDataLoaderDelegate(loaderCreator: () -> T): DataLoaderDelegate(::WeakReference, loaderCreator) private class SoftDataLoaderDelegate(loaderCreator: () -> T): DataLoaderDelegate(::SoftReference, loaderCreator) diff --git a/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoaderTest.kt b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoaderTest.kt new file mode 100644 index 000000000..953a68dfd --- /dev/null +++ b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/SchematicGroupLoaderTest.kt @@ -0,0 +1,67 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class SchematicGroupLoaderTest { + @Test + fun groupsByGroupIdCorrectly() { + val groupId = "craftAdvancedCreatureGroup" + val expected = setOf( + "object/draft_schematic/bio_engineer/creature/creature_torton.iff", + "object/draft_schematic/bio_engineer/creature/creature_kimogila.iff", + "object/draft_schematic/bio_engineer/creature/creature_rancor.iff", + "object/draft_schematic/bio_engineer/creature/creature_fambaa.iff", + "object/draft_schematic/bio_engineer/creature/creature_veermok.iff", + "object/draft_schematic/bio_engineer/creature/creature_graul.iff", + "object/draft_schematic/bio_engineer/creature/creature_huf_dun.iff", + "object/draft_schematic/bio_engineer/creature/creature_malkloc.iff", + "object/draft_schematic/bio_engineer/creature/creature_sharnaff.iff", + "object/draft_schematic/bio_engineer/creature/creature_woolamander.iff", + ) + + val schematicsInGroup = ServerData.schematicGroups.getSchematicsInGroup(groupId) + + assertEquals(expected.size, schematicsInGroup.size) + assertTrue(schematicsInGroup.containsAll(expected)) + } + + @Test + fun unknownGroupIdGivesEmptyCollection() { + val schematicsInGroup = ServerData.schematicGroups.getSchematicsInGroup("thisGroupDefinitelyDoesNotExist") + assertTrue(schematicsInGroup.isEmpty()) + } + + @Test + fun endGroupIdIsIgnored() { + // There's a group called "end" in the client info file, but it's not a real group + val schematicsInGroup = ServerData.schematicGroups.getSchematicsInGroup("end") + assertTrue(schematicsInGroup.isEmpty()) + } +} \ No newline at end of file From 6af3bd9ece3846ce2c5a9653e4d76ba921dd8917 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Fri, 28 Jul 2023 18:32:18 +0200 Subject: [PATCH 03/13] Grant draft schematics from skills --- .../objects/swg/player/PlayerObject.kt | 4 ++ .../objects/swg/player/PlayerObjectOwnerNP.kt | 12 +++- .../experience/skills/SkillService.java | 55 ++++++++++++++++++- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt index dfaaeb541..fd1a8f020 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt @@ -277,6 +277,10 @@ class PlayerObject(objectId: Long) : IntangibleObject(objectId, BaselineType.PLA fun setDraftSchematic(serverCrc: Int, clientCrc: Int, counter: Int) { play9.setDraftSchematic(serverCrc, clientCrc, counter) } + + fun revokeDraftSchematic(serverCrc: Int, clientCrc: Int) { + play9.revokeDraftSchematic(serverCrc, clientCrc) + } var craftingComponentBioLink by play9::craftingComponentBioLink var experimentPoints by play9::experimentPoints diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt index c7727f9d9..23bc6fc17 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt @@ -70,10 +70,20 @@ internal class PlayerObjectOwnerNP(private val obj: PlayerObject) : MongoPersist } fun setDraftSchematic(serverCrc: Int, clientCrc: Int, counter: Int) { - val combinedCrc = serverCrc.toLong() shl 32 and -0x100000000L or (clientCrc.toLong() and 0x00000000FFFFFFFFL) + val combinedCrc = combinedCrc(serverCrc, clientCrc) draftSchematics[combinedCrc] = counter draftSchematics.sendDeltaMessage(obj) } + + fun revokeDraftSchematic(serverCrc: Int, clientCrc: Int) { + val combinedCrc = combinedCrc(serverCrc, clientCrc) + draftSchematics.remove(combinedCrc) + draftSchematics.sendDeltaMessage(obj) + } + + private fun combinedCrc(serverCrc: Int, clientCrc: Int): Long { + return serverCrc.toLong() shl 32 and -0x100000000L or (clientCrc.toLong() and 0x00000000FFFFFFFFL) + } fun getFriendsList(): List { return Collections.unmodifiableList(friendsList) diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java index c3e9453c3..881b6f9c9 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java +++ b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java @@ -26,15 +26,15 @@ ***********************************************************************************/ package com.projectswg.holocore.services.gameplay.player.experience.skills; +import com.projectswg.common.data.CRC; +import com.projectswg.common.data.swgfile.ClientFactory; import com.projectswg.holocore.intents.gameplay.player.badge.GrantBadgeIntent; import com.projectswg.holocore.intents.gameplay.player.badge.SetTitleIntent; import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent; import com.projectswg.holocore.intents.gameplay.player.experience.skills.SkillModIntent; import com.projectswg.holocore.intents.gameplay.player.experience.skills.SurrenderSkillIntent; import com.projectswg.holocore.resources.support.data.server_info.StandardLog; -import com.projectswg.holocore.resources.support.data.server_info.loader.BadgeLoader; -import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader; -import com.projectswg.holocore.resources.support.data.server_info.loader.SkillLoader; +import com.projectswg.holocore.resources.support.data.server_info.loader.*; import com.projectswg.holocore.resources.support.data.server_info.loader.SkillLoader.SkillInfo; import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject; @@ -197,6 +197,10 @@ private void handleSurrenderSkillIntent(SurrenderSkillIntent ssi) { target.removeSkill(surrenderedSkill); target.removeCommands(skillInfo.getCommands()); + String[] schematicGroups = skillInfo.getSchematicsGranted(); + for (String schematicGroup : schematicGroups) { + revokeSchematicGroup(target, schematicGroup); + } skillInfo.getSkillMods().forEach((skillModName, skillModValue) -> new SkillModIntent(skillModName, 0, -skillModValue, target).broadcast()); CombatLevel newCombatLevel = getCombatLevel(target); @@ -272,9 +276,54 @@ private void grantSkill(CreatureObject target, SkillInfo skill) { target.addCommand(skill.getCommands()); skill.getSkillMods().forEach((skillModName, skillModValue) -> new SkillModIntent(skillModName, skillModValue, 0, target).broadcast()); + String[] schematicGroups = skill.getSchematicsGranted(); + for (String schematicGroup : schematicGroups) { + grantSchematicGroup(target, schematicGroup); + } new GrantSkillIntent(GrantSkillIntent.IntentType.GIVEN, skill.getName(), target, false).broadcast(); } + private static void grantSchematicGroup(CreatureObject target, String schematicGroup) { + SchematicGroupLoader schematicGroupLoader = ServerData.INSTANCE.getSchematicGroups(); + Collection schematicsInGroup = schematicGroupLoader.getSchematicsInGroup(schematicGroup); + + for (String schematicInGroup : schematicsInGroup) { + grantSchematic(target, schematicInGroup); + } + } + + private static void grantSchematic(CreatureObject target, String schematicInGroup) { + String schematicInGroupShared = ClientFactory.formatToSharedFile(schematicInGroup); + int serverCrc = getDraftSchematicServerCrc(schematicInGroupShared); + int clientCrc = getDraftSchematicClientCrc(schematicInGroupShared); + target.getPlayerObject().setDraftSchematic(serverCrc, clientCrc, 1); + } + + private static void revokeSchematicGroup(CreatureObject target, String schematicGroup) { + SchematicGroupLoader schematicGroupLoader = ServerData.INSTANCE.getSchematicGroups(); + Collection schematicsInGroup = schematicGroupLoader.getSchematicsInGroup(schematicGroup); + + for (String schematicInGroup : schematicsInGroup) { + revokeSchematic(target, schematicInGroup); + } + } + + private static void revokeSchematic(CreatureObject target, String schematicInGroup) { + String schematicInGroupShared = ClientFactory.formatToSharedFile(schematicInGroup); + int serverCrc = getDraftSchematicServerCrc(schematicInGroupShared); + int clientCrc = getDraftSchematicClientCrc(schematicInGroupShared); + target.getPlayerObject().revokeDraftSchematic(serverCrc, clientCrc); + } + + private static int getDraftSchematicServerCrc(String schematicInGroupShared) { + return CRC.getCrc(schematicInGroupShared); + } + + private static int getDraftSchematicClientCrc(String schematicInGroupShared) { + String templateWithoutPrefix = schematicInGroupShared.replace("object/draft_schematic/", ""); + return CRC.getCrc(templateWithoutPrefix); + } + private int skillPointsSpent(CreatureObject creature) { return creature.getSkills().stream() .map(skillName -> DataLoader.Companion.skills().getSkillByName(skillName)) From 63b47fd94263a715be5854b03667cb16ff5bf49b Mon Sep 17 00:00:00 2001 From: Ziggy Date: Fri, 28 Jul 2023 21:37:38 +0200 Subject: [PATCH 04/13] Bump pswgcommon to get revised draft schematic packets --- pswgcommon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pswgcommon b/pswgcommon index 3d45d7f48..084b1c8c2 160000 --- a/pswgcommon +++ b/pswgcommon @@ -1 +1 @@ -Subproject commit 3d45d7f482535c129be4323603ad486918ad8a3a +Subproject commit 084b1c8c2403a341d6be16ac828ada383ad1df57 From e3668b8bda58457b8ca57dcae5cdb30e33ff4b19 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Fri, 28 Jul 2023 23:44:23 +0200 Subject: [PATCH 05/13] Fixed draft schematic persistence problem, where a server reboot would cause the client to not display any draft schematics --- .../support/objects/swg/player/PlayerObjectOwnerNP.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt index 23bc6fc17..6414f2777 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt @@ -173,7 +173,7 @@ internal class PlayerObjectOwnerNP(private val obj: PlayerObject) : MongoPersist bb.addInt(maxMeds) // 15 bb.addObject(groupWaypoints) // 16 bb.addInt(jediState) // 17 - bb.incrementOperandCount(19) + bb.incrementOperandCount(18) } fun parseBaseline9(buffer: NetBuffer) { @@ -233,6 +233,7 @@ internal class PlayerObjectOwnerNP(private val obj: PlayerObject) : MongoPersist craftingStage = data.getInteger("craftingStage", craftingStage) nearbyCraftStation = data.getLong("nearbyCraftStation", nearbyCraftStation) draftSchematics.putAll(data.getMap("draftSchematics", Long::class.java, Int::class.java)) + draftSchematics.resetUpdateCount() // If we don't do this, the client will display 0 draft schematics after a server reboot for all players craftingComponentBioLink = data.getLong("craftingComponentBioLink", craftingComponentBioLink) experimentPoints = data.getInteger("experimentPoints", experimentPoints) expModified = data.getInteger("expModified", expModified) From a34d16279ae69637f7164a65870e3ba760d022c8 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sat, 29 Jul 2023 01:49:05 +0200 Subject: [PATCH 06/13] Bump pswgcommon to get revised DraftSchematic without hardcoded testdata --- pswgcommon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pswgcommon b/pswgcommon index 084b1c8c2..945bc5d1b 160000 --- a/pswgcommon +++ b/pswgcommon @@ -1 +1 @@ -Subproject commit 084b1c8c2403a341d6be16ac828ada383ad1df57 +Subproject commit 945bc5d1b055f87e579de5c8e06d6c50b65642ed From 21b55b0b324329b8a6cf6dc5db43aeb47da773b4 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sat, 29 Jul 2023 07:22:52 +0200 Subject: [PATCH 07/13] DraftSchematicLoader that parses all the json files under server_data/draft_schematic/ --- .../loader/DraftSchematicLoader.kt | 201 ++++++++++++++++++ .../data/server_info/loader/ServerData.kt | 1 + .../loader/DraftSchematicLoaderTest.kt | 136 ++++++++++++ 3 files changed, 338 insertions(+) create mode 100644 src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt create mode 100644 src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt new file mode 100644 index 000000000..92117c4d7 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt @@ -0,0 +1,201 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.common.data.CRC +import com.projectswg.common.data.encodables.oob.StringId +import com.projectswg.common.data.schematic.DraftSchematic +import com.projectswg.common.data.schematic.DraftSlotDataOption +import com.projectswg.common.data.schematic.IngridientSlot +import com.projectswg.common.data.schematic.IngridientSlot.IngridientType +import com.projectswg.common.data.swgfile.ClientFactory +import com.projectswg.holocore.resources.support.data.server_info.StandardLog +import me.joshlarson.json.JSON +import me.joshlarson.json.JSONObject +import java.io.File +import java.nio.file.Files +import java.nio.file.Paths +import kotlin.text.Charsets.UTF_8 + +class DraftSchematicLoader : DataLoader() { + + private val draftSchematics: MutableMap = HashMap() + + fun getDraftSchematic(draftSchematicIff: String): DraftSchematic? { + return draftSchematics[draftSchematicIff] + } + + override fun load() { + val what = "draft schematics" + val start = StandardLog.onStartLoad(what) + + loadAllDraftSchematics() + + StandardLog.onEndLoad(draftSchematics.size, what, start) + } + + private fun loadAllDraftSchematics() { + val files = findAllDraftSchematicJsonFiles() + + for (file in files) { + val jsonFilePath = file.path + val iffDraftSchematicPath = jsonFilePath.replace("\\", "/").replaceFirst("serverdata/", "object/").replace(".json", ".iff") + val fileToJsonString = fileToJsonString(file) + val sharedIffDraftSchematicPath = ClientFactory.formatToSharedFile(iffDraftSchematicPath) + val draftSchematic = jsonToDraftSchematic(fileToJsonString, sharedIffDraftSchematicPath) + draftSchematic.isCanManufacture = true + + draftSchematics[sharedIffDraftSchematicPath] = draftSchematic + } + } + + private fun findAllDraftSchematicJsonFiles(): List { + val base = Paths.get("serverdata/draft_schematic") + val pathStream = Files.find(base, 10, { path, _ -> path.toString().endsWith(".json") }) + + return pathStream.map { it.toFile() }.toList() + } + + private fun fileToJsonString(file: File): String { + return file.readText(charset = UTF_8) + } + + private fun jsonToDraftSchematic(json: String, iffDraftSchematicPath: String): DraftSchematic { + val draftSchematic = DraftSchematic() + val jsonObject = JSON.readObject(json) + + setItemsPerContainer(jsonObject, draftSchematic) + setCraftedSharedTemplate(jsonObject, draftSchematic) + setCombinedCrc(iffDraftSchematicPath, draftSchematic) + setVolume(jsonObject, draftSchematic) + setComplexity(jsonObject, draftSchematic) + setSlots(jsonObject, draftSchematic) + + return draftSchematic + } + + private fun setSlots(jsonObject: JSONObject, draftSchematic: DraftSchematic) { + if (jsonObject.containsKey("slots")) { + val array = jsonObject.getArray("slots") + for (any in array) { + val slotObject = any as Map<*, *> + val name = stringIdName(slotObject) + val optional = slotObject["optional"] as Boolean + val slot = IngridientSlot(name, optional) + draftSchematic.ingridientSlot.add(slot) + + setOptions(slotObject, slot) + } + } + } + + private fun setOptions(slotObject: Map<*, *>, slot: IngridientSlot) { + val options = slotObject["options"] as List> + for (option in options) { + val ingredientType = ingridientType(option) + setIngredients(option, slot, ingredientType) + } + } + + private fun ingridientType(option: Map<*, *>) : IngridientType { + val value = option["ingredientType"] as String + + return when (value) { + "IT_none" -> IngridientType.IT_NONE + "IT_resourceType" -> IngridientType.IT_RESOURCE_TYPE + "IT_resourceClass" -> IngridientType.IT_RESOURCE_CLASS + "IT_template" -> IngridientType.IT_TEMPLATE + "IT_templateGeneric" -> IngridientType.IT_TEMPLATE + "IT_schematic" -> IngridientType.IT_SCHEMATIC + else -> throw IllegalArgumentException("Unknown ingredient type: $value. Maybe it just needs to be mapped?") + } + } + + private fun setIngredients(option: Map<*, *>, slot: IngridientSlot, ingredientType: IngridientType) { + val ingredients = option["ingredients"] as List> + + for (ingredient in ingredients) { + val name = stringIdName(ingredient) + val ingredientName = ingredient["ingredient"] as String + val amount = (ingredient["count"] as Long).toInt() + slot.addSlotDataOption(DraftSlotDataOption(name, ingredientName, ingredientType, amount)) + } + } + + private fun setComplexity(jsonObject: JSONObject, draftSchematic: DraftSchematic) { + val complexity = jsonObject["complexity"] as Long? + if (complexity != null) { + draftSchematic.complexity = complexity.toInt() + } + } + + private fun setVolume(jsonObject: JSONObject, draftSchematic: DraftSchematic) { + val volume = jsonObject["volume"] as Long? + if (volume != null) { + draftSchematic.volume = volume.toInt() + } + } + + private fun setItemsPerContainer(jsonObject: JSONObject, draftSchematic: DraftSchematic) { + val itemsPerContainer = jsonObject["itemsPerContainer"] as Long? + if (itemsPerContainer != null) { + draftSchematic.itemsPerContainer = itemsPerContainer.toInt() + } + } + + private fun setCraftedSharedTemplate(jsonObject: JSONObject, draftSchematic: DraftSchematic) { + val craftedObjectTemplate = jsonObject["craftedObjectTemplate"] as String? + if (!craftedObjectTemplate.isNullOrEmpty()) { + draftSchematic.craftedSharedTemplate = ClientFactory.formatToSharedFile(craftedObjectTemplate) + } + } + + private fun setCombinedCrc(iffDraftSchematicPath: String, draftSchematic: DraftSchematic) { + val serverCrc = getDraftSchematicServerCrc(iffDraftSchematicPath) + val clientCrc = getDraftSchematicClientCrc(iffDraftSchematicPath) + val combinedCrc = combinedCrc(serverCrc = serverCrc, clientCrc = clientCrc) + draftSchematic.combinedCrc = combinedCrc + } + + private fun stringIdName(map: Map<*, *>): StringId { + val nameStrings = map["name"] as List + return StringId(nameStrings[0], nameStrings[1]) + } + + private fun getDraftSchematicServerCrc(schematicInGroupShared: String): Int { + return CRC.getCrc(schematicInGroupShared) + } + + private fun getDraftSchematicClientCrc(schematicInGroupShared: String): Int { + val templateWithoutPrefix = schematicInGroupShared.replace("object/draft_schematic/", "") + return CRC.getCrc(templateWithoutPrefix) + } + + private fun combinedCrc(serverCrc: Int, clientCrc: Int): Long { + return serverCrc.toLong() shl 32 and -0x100000000L or (clientCrc.toLong() and 0x00000000FFFFFFFFL) + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt index 776c9ec11..d4efa09ec 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt @@ -112,6 +112,7 @@ object ServerData { val planetChatRooms by SoftDataLoaderDelegate(::PlanetChatRoomLoader) val staticCityPoints by SoftDataLoaderDelegate(::StaticCityPointLoader) val schematicGroups by SoftDataLoaderDelegate(::SchematicGroupLoader) + val draftSchematics by SoftDataLoaderDelegate(::DraftSchematicLoader) private class WeakDataLoaderDelegate(loaderCreator: () -> T): DataLoaderDelegate(::WeakReference, loaderCreator) private class SoftDataLoaderDelegate(loaderCreator: () -> T): DataLoaderDelegate(::SoftReference, loaderCreator) diff --git a/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt new file mode 100644 index 000000000..740bbbcce --- /dev/null +++ b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt @@ -0,0 +1,136 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.common.data.encodables.oob.StringId +import com.projectswg.common.data.schematic.IngridientSlot.IngridientType +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +class DraftSchematicLoaderTest { + + @Test + fun craftedTemplateIsTransformedIntoSharedTemplate() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals("object/tangible/deed/camp_deed/shared_camp_luxury_deed.iff", draftSchematic.craftedSharedTemplate) + } + + @Test + fun itemsPerContainer() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(10, draftSchematic.itemsPerContainer) + } + + @Test + fun volume() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(1, draftSchematic.volume) + } + + @Test + fun complexity() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(17, draftSchematic.complexity) + } + + @Test + fun combinedCrc() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/instrument/shared_instrument_slitherhorn.iff") ?: fail("Could not find draft schematic") + + assertEquals(8706505225174593761, draftSchematic.combinedCrc) + } + + @Nested + inner class Slots { + + @Test + fun allSlotsAreLoaded() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(10, draftSchematic.ingridientSlot.size) + } + + @Test + fun optional() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertFalse(draftSchematic.ingridientSlot[0].isOptional) + } + + @Test + fun name() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(StringId("craft_item_ingredients_n", "shelter_panels"), draftSchematic.ingridientSlot[0].name) + } + + @Nested + inner class Ingredients { + + @Test + fun ingredientType() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(IngridientType.IT_RESOURCE_CLASS, draftSchematic.ingridientSlot[0].fromSlotDataOption[0].ingredientType) + } + + @Test + fun allIngredientsAreLoaded() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(1, draftSchematic.ingridientSlot[0].fromSlotDataOption.size) + } + + @Test + fun name() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(StringId("craft_item_ingredients_n", "shelter_panels"), draftSchematic.ingridientSlot[0].fromSlotDataOption[0].stfName) + } + + @Test + fun ingredient() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals("aluminum", draftSchematic.ingridientSlot[0].fromSlotDataOption[0].ingredientName) + } + + @Test + fun count() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") + + assertEquals(250, draftSchematic.ingridientSlot[0].fromSlotDataOption[0].amount) + } + } + } +} \ No newline at end of file From 3faede64826c26986bfae594cb648361b08555d2 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sat, 29 Jul 2023 22:53:17 +0200 Subject: [PATCH 08/13] Evaluate canManufacture on draft schematics instead of hardcoding it --- .../support/data/server_info/loader/DraftSchematicLoader.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt index 92117c4d7..d01b1bd33 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt @@ -67,7 +67,6 @@ class DraftSchematicLoader : DataLoader() { val fileToJsonString = fileToJsonString(file) val sharedIffDraftSchematicPath = ClientFactory.formatToSharedFile(iffDraftSchematicPath) val draftSchematic = jsonToDraftSchematic(fileToJsonString, sharedIffDraftSchematicPath) - draftSchematic.isCanManufacture = true draftSchematics[sharedIffDraftSchematicPath] = draftSchematic } @@ -164,6 +163,7 @@ class DraftSchematicLoader : DataLoader() { val itemsPerContainer = jsonObject["itemsPerContainer"] as Long? if (itemsPerContainer != null) { draftSchematic.itemsPerContainer = itemsPerContainer.toInt() + draftSchematic.isCanManufacture = itemsPerContainer > 0 } } From 96eccd50dd696c55b4c9549d7c9d8c16a558c286 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sun, 30 Jul 2023 01:52:58 +0200 Subject: [PATCH 09/13] Bumped pswgcommon to get updated DraftSlotsQueryResponse object controller packet --- pswgcommon | 2 +- .../support/data/server_info/loader/DraftSchematicLoader.kt | 2 +- .../data/server_info/loader/DraftSchematicLoaderTest.kt | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pswgcommon b/pswgcommon index 945bc5d1b..e5d00f0d7 160000 --- a/pswgcommon +++ b/pswgcommon @@ -1 +1 @@ -Subproject commit 945bc5d1b055f87e579de5c8e06d6c50b65642ed +Subproject commit e5d00f0d7e7848e248de0c7b5188f3ba61bd63c3 diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt index d01b1bd33..ca2f6e327 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt @@ -141,7 +141,7 @@ class DraftSchematicLoader : DataLoader() { val name = stringIdName(ingredient) val ingredientName = ingredient["ingredient"] as String val amount = (ingredient["count"] as Long).toInt() - slot.addSlotDataOption(DraftSlotDataOption(name, ingredientName, ingredientType, amount)) + slot.addSlotDataOption(DraftSlotDataOption(name, ingredientName, ingredientType.slotType, amount)) } } diff --git a/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt index 740bbbcce..244783487 100644 --- a/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt +++ b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt @@ -27,9 +27,8 @@ package com.projectswg.holocore.resources.support.data.server_info.loader import com.projectswg.common.data.encodables.oob.StringId -import com.projectswg.common.data.schematic.IngridientSlot.IngridientType +import com.projectswg.common.data.schematic.SlotType import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test @@ -101,7 +100,7 @@ class DraftSchematicLoaderTest { fun ingredientType() { val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") - assertEquals(IngridientType.IT_RESOURCE_CLASS, draftSchematic.ingridientSlot[0].fromSlotDataOption[0].ingredientType) + assertEquals(SlotType.RESOURCES, draftSchematic.ingridientSlot[0].fromSlotDataOption[0].slotType) } @Test From 7d07f2c334893a9dfc1d367bad422f9279142a2c Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sun, 30 Jul 2023 02:05:57 +0200 Subject: [PATCH 10/13] Show resource requirements on draft schematics when viewing them in the datapad --- .../callbacks/RequestDraftSlotsCallback.kt | 52 +++++++++++++++++++ .../commands/CommandExecutionService.java | 9 +++- 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestDraftSlotsCallback.kt diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestDraftSlotsCallback.kt b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestDraftSlotsCallback.kt new file mode 100644 index 000000000..95c45fdc5 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestDraftSlotsCallback.kt @@ -0,0 +1,52 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.global.commands.callbacks + +import com.projectswg.common.data.CRC +import com.projectswg.common.data.schematic.DraftSchematic +import com.projectswg.common.network.packets.swg.zone.object_controller.DraftSlotsQueryResponse +import com.projectswg.holocore.resources.support.data.server_info.loader.ServerData +import com.projectswg.holocore.resources.support.global.commands.ICmdCallback +import com.projectswg.holocore.resources.support.global.player.Player +import com.projectswg.holocore.resources.support.objects.swg.SWGObject + +class RequestDraftSlotsCallback : ICmdCallback { + override fun execute(player: Player, target: SWGObject?, args: String) { + val crcs = args.trim().split(" ").map { it.toUInt() } + val clientCrc = crcs[0] + val serverCrc = crcs[1] + val schematic = draftSchematic(serverCrc) ?: return + val draftSlotsQueryResponse = DraftSlotsQueryResponse(schematic, player.creatureObject.objectId, clientCrc.toInt(), serverCrc.toInt()) + player.sendPacket(draftSlotsQueryResponse) + } + + private fun draftSchematic(serverCrc: UInt): DraftSchematic? { + val draftSchematicIff = CRC.getString(serverCrc.toInt()) + return ServerData.draftSchematics.getDraftSchematic(draftSchematicIff) + } + +} diff --git a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java index 75d1f1ed1..056174498 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java @@ -119,8 +119,8 @@ private void registerCallbacks() { registerCppCallback("transferItemArmor", TransferItemCallback::new); registerCppCallback("transferItemWeapon", TransferItemCallback::new); registerScriptCallback("cmdStartLogout", LogoutCmdCallback::new); - registerCppCallback("requestDraftSlots", RequestDraftSlotsCallback::new); registerScriptCallback("knockdownRecovery", KnockdownRecoveryCmdCallback::new); + registerScriptCallback("burstRun", BurstRunCmdCallback::new); registerScriptCallback("cmdMeditate", CmdMeditate::new); @@ -135,8 +135,13 @@ private void registerCallbacks() { addConversationScripts(); addQuestScripts(); addEntertainerScripts(); + addCraftingScripts(); } - + + private void addCraftingScripts() { + registerCppCallback("requestDraftSlotsBatch", RequestDraftSlotsCallback::new); + } + private void addEntertainerScripts() { registerScriptCallback("cmdStartDance", StartDanceCallback::new); registerScriptCallback("cmdChangeDance", ChangeDanceCallback::new); From 92573fd7064fa9eec81898fcf23e007462e271a7 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sun, 30 Jul 2023 03:26:48 +0200 Subject: [PATCH 11/13] Created placeholder command handler for "requestResourceWeightsBatch" --- ...=> RequestResourceWeightsBatchCallback.kt} | 34 +++++++++++-------- .../commands/CommandExecutionService.java | 1 + 2 files changed, 20 insertions(+), 15 deletions(-) rename src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/{RequestDraftSlotsCallback.java => RequestResourceWeightsBatchCallback.kt} (72%) diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestDraftSlotsCallback.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestResourceWeightsBatchCallback.kt similarity index 72% rename from src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestDraftSlotsCallback.java rename to src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestResourceWeightsBatchCallback.kt index 1e2fee9ae..43cfc38d3 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestDraftSlotsCallback.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/RequestResourceWeightsBatchCallback.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2018 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * * * * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * @@ -24,20 +24,24 @@ * You should have received a copy of the GNU Affero General Public License * * along with Holocore. If not, see . * ***********************************************************************************/ -package com.projectswg.holocore.resources.support.global.commands.callbacks; +package com.projectswg.holocore.resources.support.global.commands.callbacks -import com.projectswg.common.data.schematic.DraftSchematic; -import com.projectswg.common.network.packets.swg.zone.object_controller.DraftSlotsQueryResponse; -import com.projectswg.holocore.resources.support.global.commands.ICmdCallback; -import com.projectswg.holocore.resources.support.global.player.Player; -import com.projectswg.holocore.resources.support.objects.swg.SWGObject; -import org.jetbrains.annotations.NotNull; +import com.projectswg.common.data.CRC +import com.projectswg.common.network.packets.swg.zone.resource.ResourceWeight +import com.projectswg.holocore.resources.support.global.commands.ICmdCallback +import com.projectswg.holocore.resources.support.global.player.Player +import com.projectswg.holocore.resources.support.objects.swg.SWGObject -public class RequestDraftSlotsCallback implements ICmdCallback{ - - @Override - public void execute(@NotNull Player player, SWGObject target, @NotNull String args) { - DraftSchematic schematic = new DraftSchematic(); - player.sendPacket(new DraftSlotsQueryResponse(schematic)); +class RequestResourceWeightsBatchCallback : ICmdCallback { + override fun execute(player: Player, target: SWGObject?, args: String) { + val clientCrc = args.trim().toInt() + val resourceWeight = ResourceWeight(player.creatureObject.objectId) + resourceWeight.attributes[0x00] = emptyList() + resourceWeight.resourceMaxWeights[0x00] = emptyList() + val serverCrc = 2027141215 // TODO don't hardcode slitherhorn CRCs + val combinedCrc = 8706505225174593761L + resourceWeight.schematicId = CRC.getCrc("object/draft_schematic/instrument/instrument_slitherhorn.iff") + resourceWeight.schematicCrc = CRC.getCrc("object/draft_schematic/instrument/instrument_slitherhorn.iff") + player.sendPacket(resourceWeight) } -} +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java index 056174498..424ef5815 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java @@ -140,6 +140,7 @@ private void registerCallbacks() { private void addCraftingScripts() { registerCppCallback("requestDraftSlotsBatch", RequestDraftSlotsCallback::new); + registerCppCallback("requestResourceWeightsBatch", RequestResourceWeightsBatchCallback::new); } private void addEntertainerScripts() { From a02d8c96029c4f4af0afe1d37b6b70d184b508d6 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sun, 30 Jul 2023 23:59:56 +0200 Subject: [PATCH 12/13] Component ingredients should have default object display names instead of paths to .iff files --- .../server_info/loader/DraftSchematicLoader.kt | 15 ++++++++++++++- .../loader/DraftSchematicLoaderTest.kt | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt index ca2f6e327..7b2d5eeaf 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoader.kt @@ -33,6 +33,7 @@ import com.projectswg.common.data.schematic.DraftSlotDataOption import com.projectswg.common.data.schematic.IngridientSlot import com.projectswg.common.data.schematic.IngridientSlot.IngridientType import com.projectswg.common.data.swgfile.ClientFactory +import com.projectswg.common.data.swgfile.visitors.ObjectData import com.projectswg.holocore.resources.support.data.server_info.StandardLog import me.joshlarson.json.JSON import me.joshlarson.json.JSONObject @@ -141,7 +142,7 @@ class DraftSchematicLoader : DataLoader() { val name = stringIdName(ingredient) val ingredientName = ingredient["ingredient"] as String val amount = (ingredient["count"] as Long).toInt() - slot.addSlotDataOption(DraftSlotDataOption(name, ingredientName, ingredientType.slotType, amount)) + slot.addSlotDataOption(DraftSlotDataOption(name, resolveIngredientName(ingredientName), ingredientType.slotType, amount)) } } @@ -198,4 +199,16 @@ class DraftSchematicLoader : DataLoader() { private fun combinedCrc(serverCrc: Int, clientCrc: Int): Long { return serverCrc.toLong() shl 32 and -0x100000000L or (clientCrc.toLong() and 0x00000000FFFFFFFFL) } + + private fun resolveIngredientName(ingredientName: String): String { + if (ingredientName.endsWith(".iff")) { + val attributes = ServerData.objectData.getAttributes(ClientFactory.formatToSharedFile(ingredientName)) + if (attributes != null) { + val stringId = attributes[ObjectData.ObjectDataAttribute.OBJECT_NAME] as StringId + return stringId.toString() + } + } + + return ingredientName + } } \ No newline at end of file diff --git a/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt index 244783487..f4d4e246f 100644 --- a/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt +++ b/src/test/java/com/projectswg/holocore/resources/support/data/server_info/loader/DraftSchematicLoaderTest.kt @@ -124,6 +124,13 @@ class DraftSchematicLoaderTest { assertEquals("aluminum", draftSchematic.ingridientSlot[0].fromSlotDataOption[0].ingredientName) } + @Test + fun ingredientIffResolved() { + val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/weapon/shared_bowcaster_assault.iff") ?: fail("Could not find draft schematic") + + assertEquals("@craft_weapon_ingredients_n:blaster_power_handler_advanced", draftSchematic.ingridientSlot[4].fromSlotDataOption[0].ingredientName) + } + @Test fun count() { val draftSchematic = ServerData.draftSchematics.getDraftSchematic("object/draft_schematic/camp/shared_camp_luxury.iff") ?: fail("Could not find draft schematic") From 133b7a9efd9da14277877bbae21ec6eacf76ec1c Mon Sep 17 00:00:00 2001 From: Ziggy Date: Sat, 5 Aug 2023 08:22:17 +0200 Subject: [PATCH 13/13] Moved the complexities of the combined CRCs to a dedicated DraftSchematicCombinedCrc class We now persist object templates instead of the combined CRC, as these are not humanly readable. It's a networking implementation detail and having it leak into the persistence layer doesn't seem like a good idea. --- .../swg/player/DraftSchematicCombinedCrc.kt | 106 ++++++++++++++++++ .../objects/swg/player/PlayerObject.kt | 10 +- .../objects/swg/player/PlayerObjectOwnerNP.kt | 22 ++-- .../experience/skills/SkillService.java | 26 ++--- .../player/DraftSchematicCombinedCrcTest.kt | 80 +++++++++++++ 5 files changed, 206 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrc.kt create mode 100644 src/test/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrcTest.kt diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrc.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrc.kt new file mode 100644 index 000000000..08d1cc61d --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrc.kt @@ -0,0 +1,106 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.objects.swg.player + +import com.projectswg.common.data.CRC +import com.projectswg.common.data.encodables.mongo.MongoData +import com.projectswg.common.data.encodables.mongo.MongoPersistable +import com.projectswg.common.data.swgfile.ClientFactory +import com.projectswg.common.encoding.Encodable +import com.projectswg.common.network.NetBuffer + +/** + * Wraps the complex logic of the draft schematic CRCs. + * Ensures they are readable by humans when persisted and work with the client. + */ +class DraftSchematicCombinedCrc : Encodable, MongoPersistable { + + var objectTemplate = "" + set(value) { + field = ClientFactory.formatToSharedFile(value) + } + + override fun readMongo(data: MongoData) { + objectTemplate = data.getString("objectTemplate", "") + } + + override fun saveMongo(data: MongoData) { + data.putString("objectTemplate", objectTemplate) + } + + override fun decode(data: NetBuffer) { + val combinedCrc = data.long + val serverCrc = serverCrcFromCombinedCrc(combinedCrc) + objectTemplate = CRC.getString(serverCrc) + } + + override fun encode(): ByteArray { + val buffer = NetBuffer.allocate(length) + val serverCrc = getDraftSchematicServerCrc(objectTemplate) + val clientCrc = getDraftSchematicClientCrc(objectTemplate) + val combinedCrc = combinedCrc(serverCrc, clientCrc) + buffer.addLong(combinedCrc) + return buffer.array() + } + + override val length = Long.SIZE_BYTES + + private fun combinedCrc(serverCrc: Int, clientCrc: Int): Long { + return serverCrc.toLong() shl 32 and -0x100000000L or (clientCrc.toLong() and 0x00000000FFFFFFFFL) + } + + private fun serverCrcFromCombinedCrc(combinedCrc: Long): Int { + return (combinedCrc shr 32).toInt() + } + + private fun getDraftSchematicServerCrc(schematicInGroupShared: String): Int { + return CRC.getCrc(schematicInGroupShared) + } + + private fun getDraftSchematicClientCrc(schematicInGroupShared: String): Int { + val templateWithoutPrefix = schematicInGroupShared.replace("object/draft_schematic/", "") + return CRC.getCrc(templateWithoutPrefix) + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as DraftSchematicCombinedCrc + + return objectTemplate == other.objectTemplate + } + + override fun hashCode(): Int { + return objectTemplate.hashCode() + } + + override fun toString(): String { + return "DraftSchematicCombinedCrc(objectTemplate='$objectTemplate')" + } + +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt index fd1a8f020..d1e9d7ac1 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt @@ -271,15 +271,15 @@ class PlayerObject(objectId: Long) : IntangibleObject(objectId, BaselineType.PLA var craftingLevel by play9::craftingLevel var craftingStage by play9::craftingStage var nearbyCraftStation by play9::nearbyCraftStation - val draftSchematics: Map + val draftSchematics: Map get() = play9.getDraftSchematics() - fun setDraftSchematic(serverCrc: Int, clientCrc: Int, counter: Int) { - play9.setDraftSchematic(serverCrc, clientCrc, counter) + fun setDraftSchematic(draftSchematicCombinedCrc: DraftSchematicCombinedCrc, counter: Int) { + play9.setDraftSchematic(draftSchematicCombinedCrc, counter) } - fun revokeDraftSchematic(serverCrc: Int, clientCrc: Int) { - play9.revokeDraftSchematic(serverCrc, clientCrc) + fun revokeDraftSchematic(draftSchematicCombinedCrc: DraftSchematicCombinedCrc) { + play9.revokeDraftSchematic(draftSchematicCombinedCrc) } var craftingComponentBioLink by play9::craftingComponentBioLink diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt index 6414f2777..6fa20a96b 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwnerNP.kt @@ -45,7 +45,7 @@ import java.util.stream.Collectors */ internal class PlayerObjectOwnerNP(private val obj: PlayerObject) : MongoPersistable { - private val draftSchematics = SWGMap(9, 3) + private val draftSchematics = SWGMap(9, 3) private val friendsList: SWGList = createAsciiList(9, 7) private val ignoreList: SWGList = createAsciiList(9, 8) private val groupWaypoints = SWGMap(9, 16) @@ -65,26 +65,20 @@ internal class PlayerObjectOwnerNP(private val obj: PlayerObject) : MongoPersist var maxMeds by IndirectBaselineDelegate(obj = obj, value = 100, page = 9, update = 15) var jediState by IndirectBaselineDelegate(obj = obj, value = 0, page = 9, update = 17) - fun getDraftSchematics(): Map { + fun getDraftSchematics(): Map { return Collections.unmodifiableMap(draftSchematics) } - fun setDraftSchematic(serverCrc: Int, clientCrc: Int, counter: Int) { - val combinedCrc = combinedCrc(serverCrc, clientCrc) - draftSchematics[combinedCrc] = counter + fun setDraftSchematic(draftSchematicCombinedCrc: DraftSchematicCombinedCrc, counter: Int) { + draftSchematics[draftSchematicCombinedCrc] = counter draftSchematics.sendDeltaMessage(obj) } - fun revokeDraftSchematic(serverCrc: Int, clientCrc: Int) { - val combinedCrc = combinedCrc(serverCrc, clientCrc) - draftSchematics.remove(combinedCrc) + fun revokeDraftSchematic(draftSchematicCombinedCrc: DraftSchematicCombinedCrc) { + draftSchematics.remove(draftSchematicCombinedCrc) draftSchematics.sendDeltaMessage(obj) } - private fun combinedCrc(serverCrc: Int, clientCrc: Int): Long { - return serverCrc.toLong() shl 32 and -0x100000000L or (clientCrc.toLong() and 0x00000000FFFFFFFFL) - } - fun getFriendsList(): List { return Collections.unmodifiableList(friendsList) } @@ -184,7 +178,7 @@ internal class PlayerObjectOwnerNP(private val obj: PlayerObject) : MongoPersist craftingLevel = buffer.int craftingStage = buffer.int nearbyCraftStation = buffer.long - draftSchematics.putAll(SWGMap.getSwgMap(buffer, 9, 3, Long::class.java, Int::class.java)) + draftSchematics.putAll(SWGMap.getSwgMap(buffer, 9, 3, DraftSchematicCombinedCrc::class.java, Int::class.java)) craftingComponentBioLink = buffer.long experimentPoints = buffer.int expModified = buffer.int @@ -232,7 +226,7 @@ internal class PlayerObjectOwnerNP(private val obj: PlayerObject) : MongoPersist craftingLevel = data.getInteger("craftingLevel", craftingLevel) craftingStage = data.getInteger("craftingStage", craftingStage) nearbyCraftStation = data.getLong("nearbyCraftStation", nearbyCraftStation) - draftSchematics.putAll(data.getMap("draftSchematics", Long::class.java, Int::class.java)) + draftSchematics.putAll(data.getMap("draftSchematics", DraftSchematicCombinedCrc::class.java, Int::class.java)) draftSchematics.resetUpdateCount() // If we don't do this, the client will display 0 draft schematics after a server reboot for all players craftingComponentBioLink = data.getLong("craftingComponentBioLink", craftingComponentBioLink) experimentPoints = data.getInteger("experimentPoints", experimentPoints) diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java index 881b6f9c9..b065f70f9 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java +++ b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillService.java @@ -26,8 +26,6 @@ ***********************************************************************************/ package com.projectswg.holocore.services.gameplay.player.experience.skills; -import com.projectswg.common.data.CRC; -import com.projectswg.common.data.swgfile.ClientFactory; import com.projectswg.holocore.intents.gameplay.player.badge.GrantBadgeIntent; import com.projectswg.holocore.intents.gameplay.player.badge.SetTitleIntent; import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent; @@ -37,6 +35,7 @@ import com.projectswg.holocore.resources.support.data.server_info.loader.*; import com.projectswg.holocore.resources.support.data.server_info.loader.SkillLoader.SkillInfo; import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; +import com.projectswg.holocore.resources.support.objects.swg.player.DraftSchematicCombinedCrc; import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject; import com.projectswg.holocore.services.gameplay.player.experience.*; import me.joshlarson.jlcommon.control.IntentHandler; @@ -293,10 +292,9 @@ private static void grantSchematicGroup(CreatureObject target, String schematicG } private static void grantSchematic(CreatureObject target, String schematicInGroup) { - String schematicInGroupShared = ClientFactory.formatToSharedFile(schematicInGroup); - int serverCrc = getDraftSchematicServerCrc(schematicInGroupShared); - int clientCrc = getDraftSchematicClientCrc(schematicInGroupShared); - target.getPlayerObject().setDraftSchematic(serverCrc, clientCrc, 1); + DraftSchematicCombinedCrc draftSchematicCombinedCrc = new DraftSchematicCombinedCrc(); + draftSchematicCombinedCrc.setObjectTemplate(schematicInGroup); + target.getPlayerObject().setDraftSchematic(draftSchematicCombinedCrc, 1); } private static void revokeSchematicGroup(CreatureObject target, String schematicGroup) { @@ -309,19 +307,9 @@ private static void revokeSchematicGroup(CreatureObject target, String schematic } private static void revokeSchematic(CreatureObject target, String schematicInGroup) { - String schematicInGroupShared = ClientFactory.formatToSharedFile(schematicInGroup); - int serverCrc = getDraftSchematicServerCrc(schematicInGroupShared); - int clientCrc = getDraftSchematicClientCrc(schematicInGroupShared); - target.getPlayerObject().revokeDraftSchematic(serverCrc, clientCrc); - } - - private static int getDraftSchematicServerCrc(String schematicInGroupShared) { - return CRC.getCrc(schematicInGroupShared); - } - - private static int getDraftSchematicClientCrc(String schematicInGroupShared) { - String templateWithoutPrefix = schematicInGroupShared.replace("object/draft_schematic/", ""); - return CRC.getCrc(templateWithoutPrefix); + DraftSchematicCombinedCrc draftSchematicCombinedCrc = new DraftSchematicCombinedCrc(); + draftSchematicCombinedCrc.setObjectTemplate(schematicInGroup); + target.getPlayerObject().revokeDraftSchematic(draftSchematicCombinedCrc); } private int skillPointsSpent(CreatureObject creature) { diff --git a/src/test/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrcTest.kt b/src/test/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrcTest.kt new file mode 100644 index 000000000..62abe9423 --- /dev/null +++ b/src/test/java/com/projectswg/holocore/resources/support/objects/swg/player/DraftSchematicCombinedCrcTest.kt @@ -0,0 +1,80 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.objects.swg.player + +import com.projectswg.common.data.encodables.mongo.MongoData +import com.projectswg.common.network.NetBuffer +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class DraftSchematicCombinedCrcTest { + + @Test + fun restoreFromPersistenceLayer() { + val draftSchematicCombinedCrc = DraftSchematicCombinedCrc() + val mongoData = MongoData() + mongoData.putString("objectTemplate", "object/draft_schematic/weapon/shared_carbine_blaster_cdef.iff") + + draftSchematicCombinedCrc.readMongo(mongoData) + + assertEquals(draftSchematicCombinedCrc.objectTemplate, "object/draft_schematic/weapon/shared_carbine_blaster_cdef.iff") + } + + @Test + fun saveToPersistenceLayer() { + val draftSchematicCombinedCrc = DraftSchematicCombinedCrc() + draftSchematicCombinedCrc.objectTemplate = "object/draft_schematic/weapon/carbine_blaster_cdef.iff" + val mongoData = MongoData() + + draftSchematicCombinedCrc.saveMongo(mongoData) + + assertEquals(mongoData.getString("objectTemplate"), "object/draft_schematic/weapon/shared_carbine_blaster_cdef.iff") + } + + @Test + fun packetEncode() { + val draftSchematicCombinedCrc = DraftSchematicCombinedCrc() + draftSchematicCombinedCrc.objectTemplate = "object/draft_schematic/instrument/instrument_slitherhorn.iff" + + val encode = draftSchematicCombinedCrc.encode() + + val buffer = NetBuffer.wrap(encode) + assertEquals(buffer.long, 8706505225174593761) + } + + @Test + fun packetDecode() { + val draftSchematicCombinedCrc = DraftSchematicCombinedCrc() + val buffer = NetBuffer.allocate(8) + buffer.addLong(8706505225174593761) + buffer.rewind() + + draftSchematicCombinedCrc.decode(buffer) + + assertEquals(draftSchematicCombinedCrc.objectTemplate, "object/draft_schematic/instrument/shared_instrument_slitherhorn.iff") + } +} \ No newline at end of file