diff --git a/serverdata/player/planet_map_cat.sdb b/serverdata/player/planet_map_cat.sdb new file mode 100644 index 00000000..a4189b53 --- /dev/null +++ b/serverdata/player/planet_map_cat.sdb @@ -0,0 +1,94 @@ +name index iscategory issubcategory can_be_active faction faction_visible_only +STRING INTEGER BOOLEAN BOOLEAN BOOLEAN STRING BOOLEAN +unknown 1 true false false false +bank 2 true false false false +cantina 3 true false true false +capitol 4 true false false false +cloningfacility 5 true false false false +garage 6 true false false false +guild 7 true false false false +guild_combat 8 false true false false +guild_commerce 9 false true false false +guild_theater 10 false true true false +guild_university 11 false true false false +hotel 12 true false false false +medicalcenter 13 true false true false +shuttleport 14 true false false false +starport 15 true false false false +themepark 16 true false false false +city 17 true false false false +waypoint 18 true false false false +trainer 19 true false false false +trainer_brawler 20 false true false false +trainer_artisan 21 false true false false +trainer_scout 22 false true false false +trainer_marksman 23 false true false false +trainer_entertainer 24 false true false false +trainer_medic 25 false true false false +junkshop 26 true false false false +tavern 27 true false true false +barracks 28 true false true false +vendor 29 true false false false +vendor_armor 30 false true false false +vendor_clothing 31 false true false false +vendor_components 32 false true false false +vendor_droids 33 false true false false +vendor_equipment 34 false true false false +vendor_food 35 false true false false +vendor_housing 36 false true false false +vendor_resources 37 false true false false +vendor_tools 38 false true false false +vendor_weapons 39 false true false false +vendor_junk 40 false true false false +terminal 41 true false false false +terminal_bank 42 false true false false +terminal_bazaar 43 false true false false +terminal_mission 44 false true false false +rebel 45 true false false rebel true +imperial 46 true false false imperial true +rebel_hq 47 false true true rebel true +imperial_hq 48 false true true imperial true +camp 49 false true true false +cityhall 50 false false true false +theater 51 false false true false +vendor_pets 52 false true false false +vendor_medical 53 false true false false +poi 54 true false false false +garage 55 true false false false +museum 56 true false false false +salon 57 true false false false +space 58 true false false false +space_recruiter 59 false true false false +space_chassis_broker 60 false true false false +space_chassis 61 true false false false +trainer_starfighter_engineer 62 false true false false +trainer_shipwright 63 false true false false +trainer_pilot_privateer 64 false true false false +trainer_pilot_rebel 65 false true false false +trainer_pilot_imperial 66 false true false false +vendor_ships 67 false true false false +sf_rebel_forward_base 68 false true true rebel true +sf_imperial_forward_base 69 false true true imperial true +sf_rebel_minor_base 70 false true true rebel true +sf_imperial_minor_base 71 false true true imperial true +sf_rebel_major_base 72 false true true rebel true +sf_imperial_major_base 73 false true true imperial true +sf_rebel_hq 47 false true true rebel true +sf_imperial_hq 48 false true true imperial true +terminal_gcw_static_base 74 false true true false +terminal_mission_entertainer 75 false true false false +terminal_mission_artisan 76 false true false false +terminal_mission_scout 77 false true false false +terminal_mission_bounty 78 false true false false +terminal_mission_rebel 79 false true false rebel true +terminal_mission_imperial 80 false true false imperial true +city_junk_dealer 81 false true false false +gcw_region 82 true false false false +gcw_factional_presence 83 true false false false +gcw_factional_presence_rebel_only 84 false true false false +gcw_factional_presence_imperial_only 85 false true false false +gcw_factional_presence_rebel_and_imperial 86 false true false false +player_placed_factional_base 87 true false false false +player_placed_factional_base_rebel 88 false true true false +player_placed_factional_base_imperial 89 false true true false +vendor_chronicles 90 false true false false diff --git a/serverdata/player/role.sdb b/serverdata/player/role.sdb new file mode 100644 index 00000000..1e4714ce --- /dev/null +++ b/serverdata/player/role.sdb @@ -0,0 +1,24 @@ +index role_icon qualifying_skill +INTEGER STRING STRING +0 artisan class_trader +5 entertainer class_entertainer_phase1_novice +10 medic class_medic_phase1_novice +15 officer class_officer_phase1_novice +20 bounty_hunter class_bountyhunter_phase1_novice +25 smuggler class_smuggler_phase1_novice +30 commando class_commando_phase1_novice +35 utility class_spy_phase1_novice +40 jedisaber class_forcesensitive_phase1_novice +45 advancedmedic class_medic_phase4_master +50 advancedbountyhunter class_bountyhunter_phase4_master +55 advancedcommando class_commando_phase4_master +60 advancedjedisaber class_forcesensitive_phase4_master +65 advancedartisan class_structures_phase4_master +65 advancedartisan class_munitions_phase4_master +65 advancedartisan class_domestics_phase4_master +65 advancedartisan class_engineering_phase4_master +70 advancedentertainer class_entertainer_phase4_master +75 advancedsmuggler class_smuggler_phase4_master +80 advancedofficer class_officer_phase4_master +85 advancedutilities class_spy_phase4_master +115 pet pet_special diff --git a/serverdata/roadmap/item_rewards.sdb b/serverdata/roadmap/item_rewards.sdb new file mode 100644 index 00000000..eeb6928c --- /dev/null +++ b/serverdata/roadmap/item_rewards.sdb @@ -0,0 +1,306 @@ +roadmap_template_name roadmap_skill_name appearance_name string_id item_default item_wookiee item_ithorian +STRING STRING STRING STRING STRING STRING STRING +bounty_hunter_1a class_bountyhunter_phase1_novice +bounty_hunter_1a class_bountyhunter_phase1_02 +bounty_hunter_1a class_bountyhunter_phase1_03 +bounty_hunter_1a class_bountyhunter_phase1_04 appearance/backpack_s05_m.sat @ui_roadmap:bounty_hunter_backpack item_bounty_hunter_backpack_01_02 +bounty_hunter_1a class_bountyhunter_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_bounty_hunter_10_n object/tangible/quest/quest_start/profession_bounty_hunter_10.iff +bounty_hunter_1a class_bountyhunter_phase1_master +bounty_hunter_1a class_bountyhunter_phase2_novice appearance/armor_composite_s01_chest_plate_m.sat @ui_roadmap:bounty_hunter_armor armor_bounty_hunter_roadmap_chest_02_01,armor_bounty_hunter_roadmap_leggings_02_01,armor_bounty_hunter_roadmap_helmet_02_01,armor_bounty_hunter_roadmap_bicep_l_02_01,armor_bounty_hunter_roadmap_bicep_r_02_01,armor_bounty_hunter_roadmap_bracer_l_02_01,armor_bounty_hunter_roadmap_bracer_r_02_01,armor_bounty_hunter_roadmap_gloves_02_01,armor_bounty_hunter_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_03,armor_wookiee_roadmap_leggings_02_03,armor_wookiee_roadmap_bicep_l_02_03,armor_wookiee_roadmap_bicep_r_02_03,armor_wookiee_roadmap_bracer_l_02_03,armor_wookiee_roadmap_bracer_r_02_03 armor_ithorian_roadmap_chest_02_03,armor_ithorian_roadmap_leggings_02_03,armor_ithorian_roadmap_helmet_02_03,armor_ithorian_roadmap_bicep_l_02_03,armor_ithorian_roadmap_bicep_r_02_03,armor_ithorian_roadmap_bracer_l_02_03,armor_ithorian_roadmap_bracer_r_02_03,armor_ithorian_roadmap_gloves_02_03,armor_ithorian_roadmap_boots_02_03 +bounty_hunter_1a class_bountyhunter_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_bounty_hunter_20_n object/tangible/quest/quest_start/profession_bounty_hunter_20.iff +bounty_hunter_1a class_bountyhunter_phase2_03 appearance/wp_carbine_ee3_combined.apt @ui_roadmap:bounty_hunter_weapon_30 weapon_carbine_bh_roadmap_01_02 +bounty_hunter_1a class_bountyhunter_phase2_04 +bounty_hunter_1a class_bountyhunter_phase2_05 appearance/ring_s02.apt @ui_roadmap:bounty_hunter_ring item_bounty_hunter_ring_01_02 +bounty_hunter_1a class_bountyhunter_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_bounty_hunter_30_n object/tangible/quest/quest_start/profession_bounty_hunter_30.iff +bounty_hunter_1a class_bountyhunter_phase3_novice +bounty_hunter_1a class_bountyhunter_phase3_02 appearance/wp_rifle_lightning_cannon.apt @ui_roadmap:bounty_hunter_weapon_50 weapon_rifle_bh_roadmap_01_02 +bounty_hunter_1a class_bountyhunter_phase3_03 +bounty_hunter_1a class_bountyhunter_phase3_04 +bounty_hunter_1a class_bountyhunter_phase3_05 +bounty_hunter_1a class_bountyhunter_phase3_master appearance/necklace_s02_f.sat @ui_roadmap:bounty_hunter_necklace item_bounty_hunter_pendant_01_02 +bounty_hunter_1a class_bountyhunter_phase4_novice +bounty_hunter_1a class_bountyhunter_phase4_02 +bounty_hunter_1a class_bountyhunter_phase4_03 appearance/eqp_survey_survey_pad_advanced_s1.apt @ui_roadmap:bounty_hunter_usable item_bounty_hunter_clicky_01_02 +bounty_hunter_1a class_bountyhunter_phase4_04 +bounty_hunter_1a class_bountyhunter_phase4_05 +bounty_hunter_1a class_bountyhunter_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:bounty_hunter_belt item_roadmap_belt_bounty_hunter_01_02 +commando_1a class_commando_phase1_novice +commando_1a class_commando_phase1_02 +commando_1a class_commando_phase1_03 +commando_1a class_commando_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:commando_backpack item_commando_backpack_01_02 +commando_1a class_commando_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_commando_10_n object/tangible/quest/quest_start/profession_commando_10.iff +commando_1a class_commando_phase1_master +commando_1a class_commando_phase2_novice appearance/armor_composite_s01_chest_plate_m.sat @ui_roadmap:commando_armor armor_commando_roadmap_chest_02_01,armor_commando_roadmap_leggings_02_01,armor_commando_roadmap_helmet_02_01,armor_commando_roadmap_bicep_l_02_01,armor_commando_roadmap_bicep_r_02_01,armor_commando_roadmap_bracer_l_02_01,armor_commando_roadmap_bracer_r_02_01,armor_commando_roadmap_gloves_02_01,armor_commando_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_03,armor_wookiee_roadmap_leggings_02_03,armor_wookiee_roadmap_bicep_l_02_03,armor_wookiee_roadmap_bicep_r_02_03,armor_wookiee_roadmap_bracer_l_02_03,armor_wookiee_roadmap_bracer_r_02_03 armor_ithorian_roadmap_chest_02_03,armor_ithorian_roadmap_leggings_02_03,armor_ithorian_roadmap_helmet_02_03,armor_ithorian_roadmap_bicep_l_02_03,armor_ithorian_roadmap_bicep_r_02_03,armor_ithorian_roadmap_bracer_l_02_03,armor_ithorian_roadmap_bracer_r_02_03,armor_ithorian_roadmap_gloves_02_03,armor_ithorian_roadmap_boots_02_03 +commando_1a class_commando_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_commando_20_n object/tangible/quest/quest_start/profession_commando_20.iff +commando_1a class_commando_phase2_03 appearance/wp_rifle_dlt20.apt @ui_roadmap:commando_weapon_30 weapon_lightningbeam_commando_roadmap_01_02 +commando_1a class_commando_phase2_04 +commando_1a class_commando_phase2_05 appearance/ring_s03.apt @ui_roadmap:commando_ring item_commando_ring_01_02 +commando_1a class_commando_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_commando_30_n object/tangible/quest/quest_start/profession_commando_30.iff +commando_1a class_commando_phase3_novice +commando_1a class_commando_phase3_02 appearance/wp_carbine_e11.apt @ui_roadmap:commando_weapon_50 weapon_acidbeam_commando_roadmap_01_02 +commando_1a class_commando_phase3_03 +commando_1a class_commando_phase3_04 +commando_1a class_commando_phase3_05 +commando_1a class_commando_phase3_master appearance/necklace_s07_f.sat @ui_roadmap:commando_necklace item_commando_pendant_01_02 +commando_1a class_commando_phase4_novice +commando_1a class_commando_phase4_02 +commando_1a class_commando_phase4_03 appearance/eqp_comp_weapon_high_power_module.apt @ui_roadmap:commando_usable item_commando_clicky_01_02 +commando_1a class_commando_phase4_04 +commando_1a class_commando_phase4_05 +commando_1a class_commando_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:commando_belt item_roadmap_belt_commando_01_02 +smuggler_1a class_smuggler_phase1_novice +smuggler_1a class_smuggler_phase1_02 +smuggler_1a class_smuggler_phase1_03 +smuggler_1a class_smuggler_phase1_04 appearance/backpack_s05_m.sat @ui_roadmap:smuggler_backpack item_smuggler_backpack_01_02 +smuggler_1a class_smuggler_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_smuggler_10_n object/tangible/quest/quest_start/profession_smuggler_10.iff +smuggler_1a class_smuggler_phase1_master +smuggler_1a class_smuggler_phase2_novice appearance/armor_tantel_skreej_chest_plate_m.sat @ui_roadmap:smuggler_armor armor_smuggler_roadmap_chest_02_01,armor_smuggler_roadmap_leggings_02_01,armor_smuggler_roadmap_helmet_02_01,armor_smuggler_roadmap_bicep_l_02_01,armor_smuggler_roadmap_bicep_r_02_01,armor_smuggler_roadmap_bracer_l_02_01,armor_smuggler_roadmap_bracer_r_02_01,armor_smuggler_roadmap_gloves_02_01,armor_smuggler_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_01,armor_wookiee_roadmap_leggings_02_01,armor_wookiee_roadmap_bicep_l_02_01,armor_wookiee_roadmap_bicep_r_02_01,armor_wookiee_roadmap_bracer_l_02_01,armor_wookiee_roadmap_bracer_r_02_01 armor_ithorian_roadmap_chest_02_01,armor_ithorian_roadmap_leggings_02_01,armor_ithorian_roadmap_helmet_02_01,armor_ithorian_roadmap_bicep_l_02_01,armor_ithorian_roadmap_bicep_r_02_01,armor_ithorian_roadmap_bracer_l_02_01,armor_ithorian_roadmap_bracer_r_02_01,armor_ithorian_roadmap_gloves_02_01,armor_ithorian_roadmap_boots_02_01 +smuggler_1a class_smuggler_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_smuggler_20_n object/tangible/quest/quest_start/profession_smuggler_20.iff +smuggler_1a class_smuggler_phase2_03 appearance/wp_pistol_scout_combined.apt @ui_roadmap:smuggler_weapon_30 weapon_knuckler_smuggler_roadmap_01_02 +smuggler_1a class_smuggler_phase2_04 +smuggler_1a class_smuggler_phase2_05 appearance/ring_s03.apt @ui_roadmap:smuggler_ring item_smuggler_ring_01_02 +smuggler_1a class_smuggler_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_smuggler_30_n object/tangible/quest/quest_start/profession_smuggler_30.iff +smuggler_1a class_smuggler_phase3_novice +smuggler_1a class_smuggler_phase3_02 appearance/wp_pistol_striker.apt @ui_roadmap:smuggler_weapon_50 weapon_pistol_smuggler_roadmap_02_02 +smuggler_1a class_smuggler_phase3_03 +smuggler_1a class_smuggler_phase3_04 +smuggler_1a class_smuggler_phase3_05 +smuggler_1a class_smuggler_phase3_master appearance/necklace_s11_f.sat @ui_roadmap:smuggler_necklace item_smuggler_pendant_01_02 +smuggler_1a class_smuggler_phase4_novice +smuggler_1a class_smuggler_phase4_02 +smuggler_1a class_smuggler_phase4_03 appearance/eqp_data_disk.apt @ui_roadmap:smuggler_usable item_smuggler_clicky_01_02 +smuggler_1a class_smuggler_phase4_04 +smuggler_1a class_smuggler_phase4_05 +smuggler_1a class_smuggler_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:smuggler_belt item_roadmap_belt_smuggler_01_02 +force_sensitive_1a class_forcesensitive_phase1_novice +force_sensitive_1a class_forcesensitive_phase1_02 +force_sensitive_1a class_forcesensitive_phase1_03 +force_sensitive_1a class_forcesensitive_phase1_04 appearance/ring_s02.apt @ui_roadmap:force_sensitive_ring_2 item_force_sensitive_ring_02_01 +force_sensitive_1a class_forcesensitive_phase1_05 appearance/eqp_force_crystal.apt @obj_n:profession_force_sensitive_10_n object/tangible/quest/quest_start/profession_force_sensitive_10.iff +force_sensitive_1a class_forcesensitive_phase1_master +force_sensitive_1a class_forcesensitive_phase2_novice appearance/robe_jedi_padawan_f.sat @ui_roadmap:force_sensitive_armor item_npe_fs_robe_02_02 +force_sensitive_1a class_forcesensitive_phase2_02 appearance/thm_prp_holocron_splinters.apt @obj_n:profession_force_sensitive_20_n object/tangible/quest/quest_start/profession_force_sensitive_20.iff +force_sensitive_1a class_forcesensitive_phase2_03 appearance/wp_mle_sword_lightsaber_blade_anakin.lsb @ui_roadmap:force_sensitive_weapon_30 weapon_roadmap_lightsaber_02_02 +force_sensitive_1a class_forcesensitive_phase2_04 +force_sensitive_1a class_forcesensitive_phase2_05 appearance/ring_s01.apt @ui_roadmap:force_sensitive_ring item_force_sensitive_ring_01_02 +force_sensitive_1a class_forcesensitive_phase2_master appearance/atf_sith_s01.apt @obj_n:profession_force_sensitive_30_n object/tangible/quest/quest_start/profession_force_sensitive_30.iff +force_sensitive_1a class_forcesensitive_phase3_novice +force_sensitive_1a class_forcesensitive_phase3_02 appearance/dragon_pearl.apt @ui_roadmap:force_sensitive_weapon_50 item_krayt_pearl_04_01 +force_sensitive_1a class_forcesensitive_phase3_03 +force_sensitive_1a class_forcesensitive_phase3_04 +force_sensitive_1a class_forcesensitive_phase3_05 +force_sensitive_1a class_forcesensitive_phase3_master appearance/necklace_s12_f.sat @ui_roadmap:force_sensitive_necklace item_force_sensitive_pendant_01_02 +force_sensitive_1a class_forcesensitive_phase4_novice +force_sensitive_1a class_forcesensitive_phase4_02 +force_sensitive_1a class_forcesensitive_phase4_03 appearance/force_amplification_crystal.apt @ui_roadmap:force_sensitive_usable item_force_sensitive_clicky_01_02 +force_sensitive_1a class_forcesensitive_phase4_04 +force_sensitive_1a class_forcesensitive_phase4_05 +force_sensitive_1a class_forcesensitive_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:force_sensitive_belt item_roadmap_belt_force_sensitive_01_02 +officer_1a class_officer_phase1_novice +officer_1a class_officer_phase1_02 +officer_1a class_officer_phase1_03 +officer_1a class_officer_phase1_04 appearance/backpack_s03_m.sat @ui_roadmap:officer_backpack item_officer_backpack_01_02 +officer_1a class_officer_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_officer_10_n object/tangible/quest/quest_start/profession_officer_10.iff +officer_1a class_officer_phase1_master +officer_1a class_officer_phase2_novice appearance/armor_composite_s01_chest_plate_m.sat @ui_roadmap:officer_armor armor_officer_roadmap_chest_02_01,armor_officer_roadmap_leggings_02_01,armor_officer_roadmap_helmet_02_01,armor_officer_roadmap_bicep_l_02_01,armor_officer_roadmap_bicep_r_02_01,armor_officer_roadmap_bracer_l_02_01,armor_officer_roadmap_bracer_r_02_01,armor_officer_roadmap_gloves_02_01,armor_officer_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_02,armor_wookiee_roadmap_leggings_02_02,armor_wookiee_roadmap_bicep_l_02_02,armor_wookiee_roadmap_bicep_r_02_02,armor_wookiee_roadmap_bracer_l_02_02,armor_wookiee_roadmap_bracer_r_02_02 armor_ithorian_roadmap_chest_02_02,armor_ithorian_roadmap_leggings_02_02,armor_ithorian_roadmap_helmet_02_02,armor_ithorian_roadmap_bicep_l_02_02,armor_ithorian_roadmap_bicep_r_02_02,armor_ithorian_roadmap_bracer_l_02_02,armor_ithorian_roadmap_bracer_r_02_02,armor_ithorian_roadmap_gloves_02_02,armor_ithorian_roadmap_boots_02_02 +officer_1a class_officer_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_officer_20_n object/tangible/quest/quest_start/profession_officer_20.iff +officer_1a class_officer_phase2_03 appearance/wp_pistol_dl44_metal_combined.apt @ui_roadmap:officer_weapon_30 weapon_pistol_officer_roadmap_02_02 +officer_1a class_officer_phase2_04 +officer_1a class_officer_phase2_05 appearance/ring_s04.apt @ui_roadmap:officer_ring item_officer_ring_01_02 +officer_1a class_officer_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_officer_30_n object/tangible/quest/quest_start/profession_officer_30.iff +officer_1a class_officer_phase3_novice +officer_1a class_officer_phase3_02 appearance/wp_pistol_dl44_metal_combined.apt @ui_roadmap:officer_weapon_50 weapon_pistol_officer_roadmap_01_02 +officer_1a class_officer_phase3_03 +officer_1a class_officer_phase3_04 +officer_1a class_officer_phase3_05 +officer_1a class_officer_phase3_master appearance/necklace_s08_f.sat @ui_roadmap:officer_necklace item_officer_pendant_01_02 +officer_1a class_officer_phase4_novice +officer_1a class_officer_phase4_02 +officer_1a class_officer_phase4_03 appearance/eqp_tool_sensor_frequency_jammer.apt @ui_roadmap:officer_usable item_officer_clicky_01_02 +officer_1a class_officer_phase4_04 +officer_1a class_officer_phase4_05 +officer_1a class_officer_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:officer_belt item_roadmap_belt_officer_01_02 +medic_1a science_doctor_prereq_novice +medic_1a class_medic_phase1_novice +medic_1a class_medic_phase1_02 +medic_1a class_medic_phase1_03 +medic_1a class_medic_phase1_04 appearance/backpack_s03_m.sat @ui_roadmap:medic_backpack item_medic_backpack_01_02 +medic_1a class_medic_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_medic_10_n object/tangible/quest/quest_start/profession_medic_10.iff +medic_1a class_medic_phase1_master +medic_1a class_medic_phase2_novice appearance/armor_tantel_skreej_chest_plate_m.sat @ui_roadmap:medic_armor armor_medic_roadmap_chest_02_01,armor_medic_roadmap_leggings_02_01,armor_medic_roadmap_helmet_02_01,armor_medic_roadmap_bicep_l_02_01,armor_medic_roadmap_bicep_r_02_01,armor_medic_roadmap_bracer_l_02_01,armor_medic_roadmap_bracer_r_02_01,armor_medic_roadmap_gloves_02_01,armor_medic_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_01,armor_wookiee_roadmap_leggings_02_01,armor_wookiee_roadmap_bicep_l_02_01,armor_wookiee_roadmap_bicep_r_02_01,armor_wookiee_roadmap_bracer_l_02_01,armor_wookiee_roadmap_bracer_r_02_01 armor_ithorian_roadmap_chest_02_01,armor_ithorian_roadmap_leggings_02_01,armor_ithorian_roadmap_helmet_02_01,armor_ithorian_roadmap_bicep_l_02_01,armor_ithorian_roadmap_bicep_r_02_01,armor_ithorian_roadmap_bracer_l_02_01,armor_ithorian_roadmap_bracer_r_02_01,armor_ithorian_roadmap_gloves_02_01,armor_ithorian_roadmap_boots_02_01 +medic_1a class_medic_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_medic_20_n object/tangible/quest/quest_start/profession_medic_20.iff +medic_1a class_medic_phase2_03 appearance/wp_pistol_scout_combined.apt @ui_roadmap:medic_weapon_30 weapon_pistol_medic_roadmap_01_02 +medic_1a class_medic_phase2_04 +medic_1a class_medic_phase2_05 appearance/ring_s01.apt @ui_roadmap:medic_ring item_medic_ring_01_02 +medic_1a class_medic_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_medic_30_n object/tangible/quest/quest_start/profession_medic_30.iff +medic_1a class_medic_phase3_novice +medic_1a class_medic_phase3_02 appearance/wp_carbine_laser_combined.apt @ui_roadmap:medic_weapon_50 weapon_carbine_medic_roadmap_01_02 +medic_1a class_medic_phase3_03 +medic_1a class_medic_phase3_04 +medic_1a class_medic_phase3_05 +medic_1a class_medic_phase3_master appearance/necklace_s09_f.sat @ui_roadmap:medic_necklace item_medic_pendant_01_02 +medic_1a class_medic_phase4_novice +medic_1a class_medic_phase4_02 +medic_1a class_medic_phase4_03 appearance/eqp_comp_chemical_dispersion.apt @ui_roadmap:medic_usable item_medic_clicky_01_02 +medic_1a class_medic_phase4_04 +medic_1a class_medic_phase4_05 +medic_1a class_medic_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:medic_belt item_roadmap_belt_medic_01_02 +spy_1a class_spy_phase1_novice +spy_1a class_spy_phase1_02 +spy_1a class_spy_phase1_03 +spy_1a class_spy_phase1_04 appearance/backpack_s06_m.sat @ui_roadmap:spy_backpack item_spy_backpack_01_02 +spy_1a class_spy_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_spy_10_n object/tangible/quest/quest_start/profession_spy_10.iff +spy_1a class_spy_phase1_master +spy_1a class_spy_phase2_novice appearance/armor_padded_s01_chest_plate_m.sat @ui_roadmap:spy_armor armor_spy_roadmap_chest_02_01,armor_spy_roadmap_leggings_02_01,armor_spy_roadmap_helmet_02_01,armor_spy_roadmap_bicep_l_02_01,armor_spy_roadmap_bicep_r_02_01,armor_spy_roadmap_bracer_l_02_01,armor_spy_roadmap_bracer_r_02_01,armor_spy_roadmap_gloves_02_01,armor_spy_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_02,armor_wookiee_roadmap_leggings_02_02,armor_wookiee_roadmap_bicep_l_02_02,armor_wookiee_roadmap_bicep_r_02_02,armor_wookiee_roadmap_bracer_l_02_02,armor_wookiee_roadmap_bracer_r_02_02 armor_ithorian_roadmap_chest_02_02,armor_ithorian_roadmap_leggings_02_02,armor_ithorian_roadmap_helmet_02_02,armor_ithorian_roadmap_bicep_l_02_02,armor_ithorian_roadmap_bicep_r_02_02,armor_ithorian_roadmap_bracer_l_02_02,armor_ithorian_roadmap_bracer_r_02_02,armor_ithorian_roadmap_gloves_02_02,armor_ithorian_roadmap_boots_02_02 +spy_1a class_spy_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_spy_20_n object/tangible/quest/quest_start/profession_spy_20.iff +spy_1a class_spy_phase2_03 appearance/wp_pistol_striker.apt @ui_roadmap:spy_weapon_30 weapon_pistol_spy_roadmap_01_02 +spy_1a class_spy_phase2_04 +spy_1a class_spy_phase2_05 appearance/ring_s02.apt @ui_roadmap:spy_ring item_spy_ring_01_02 +spy_1a class_spy_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_spy_30_n object/tangible/quest/quest_start/profession_spy_30.iff +spy_1a class_spy_phase3_novice +spy_1a class_spy_phase3_02 appearance/wp_carbine_e11.apt @ui_roadmap:spy_weapon_50 weapon_carbine_spy_roadmap_01_02 +spy_1a class_spy_phase3_03 +spy_1a class_spy_phase3_04 +spy_1a class_spy_phase3_05 +spy_1a class_spy_phase3_master appearance/necklace_s01_f.sat @ui_roadmap:spy_necklace item_spy_pendant_01_02 +spy_1a class_spy_phase4_novice +spy_1a class_spy_phase4_02 +spy_1a class_spy_phase4_03 appearance/eqp_data_disk.apt @ui_roadmap:spy_usable item_spy_clicky_01_02 +spy_1a class_spy_phase4_04 +spy_1a class_spy_phase4_05 +spy_1a class_spy_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:spy_belt item_roadmap_belt_spy_01_02 +entertainer_1a class_entertainer_phase1 +entertainer_1a class_entertainer_phase1_novice +entertainer_1a class_entertainer_phase1_02 +entertainer_1a class_entertainer_phase1_03 +entertainer_1a class_entertainer_phase1_04 appearance/backpack_s01_m.sat @ui_roadmap:entertainer_backpack item_entertainer_backpack_01_02 +entertainer_1a class_entertainer_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_entertainer_10_n object/tangible/quest/quest_start/profession_entertainer_10.iff,weapon_knuckler_ent_roadmap_02_01 +entertainer_1a class_entertainer_phase1_master +entertainer_1a class_entertainer_phase2_novice appearance/robe_s05_h0_f.sat @ui_roadmap:entertainer_captivator item_entertainer_roadmap_cloak_02_01,item_entertainer_roadmap_boots_02_01,item_entertainer_roadmap_gloves_02_01,item_entertainer_roadmap_pants_02_01,weapon_knuckler_ent_roadmap_02_02 item_entertainer_roadmap_robe_02_01,item_entertainer_roadmap_gloves_02_02,weapon_knuckler_ent_roadmap_02_02 item_entertainer_roadmap_jumpsuit_02_01,item_entertainer_roadmap_hat_02_01,weapon_knuckler_ent_roadmap_02_02 +entertainer_1a class_entertainer_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_entertainer_20_n object/tangible/quest/quest_start/profession_entertainer_20.iff +entertainer_1a class_entertainer_phase2_03 appearance/wp_sp_vibroknuckler.apt @ui_roadmap:entertainer_weapon_30 weapon_knuckler_ent_roadmap_02_04 +entertainer_1a class_entertainer_phase2_04 +entertainer_1a class_entertainer_phase2_05 appearance/ring_s04.apt @ui_roadmap:entertainer_ring item_entertainer_ring_01_02,weapon_knuckler_ent_roadmap_02_03 +entertainer_1a class_entertainer_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_entertainer_30_n object/tangible/quest/quest_start/profession_entertainer_30.iff +entertainer_1a class_entertainer_phase3_novice +entertainer_1a class_entertainer_phase3_02 appearance/wp_pistol_striker.apt @ui_roadmap:entertainer_weapon_50 weapon_pistol_entertainer_roadmap_01_02 +entertainer_1a class_entertainer_phase3_03 +entertainer_1a class_entertainer_phase3_04 +entertainer_1a class_entertainer_phase3_05 +entertainer_1a class_entertainer_phase3_master appearance/necklace_s12_f.sat @ui_roadmap:entertainer_necklace item_entertainer_pendant_01_02 +entertainer_1a class_entertainer_phase4_novice +entertainer_1a class_entertainer_phase4_02 +entertainer_1a class_entertainer_phase4_03 appearance/eqp_speaker.apt @ui_roadmap:entertainer_usable item_entertainer_clicky_01_02 +entertainer_1a class_entertainer_phase4_04 +entertainer_1a class_entertainer_phase4_05 +entertainer_1a class_entertainer_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:entertainer_belt item_roadmap_belt_entertainer_01_02 +trader_0a class_domestics_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01 +trader_0a class_domestics_phase1_02 +trader_0a class_domestics_phase1_03 +trader_0a class_domestics_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02 +trader_0a class_domestics_phase1_05 +trader_0a class_domestics_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff +trader_0a class_domestics_phase2_novice +trader_0a class_domestics_phase2_02 +trader_0a class_domestics_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01 +trader_0a class_domestics_phase2_04 +trader_0a class_domestics_phase2_05 +trader_0a class_domestics_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02 +trader_0a class_domestics_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff +trader_0a class_domestics_phase3_02 +trader_0a class_domestics_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02 +trader_0a class_domestics_phase3_04 +trader_0a class_domestics_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02 +trader_0a class_domestics_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff +trader_0a class_domestics_phase4_novice +trader_0a class_domestics_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02 +trader_0a class_domestics_phase4_03 +trader_0a class_domestics_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02 +trader_0a class_domestics_phase4_05 +trader_0a class_domestics_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02 +trader_0b class_structures_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01 +trader_0b class_structures_phase1_02 +trader_0b class_structures_phase1_03 +trader_0b class_structures_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02 +trader_0b class_structures_phase1_05 +trader_0b class_structures_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff +trader_0b class_structures_phase2_novice +trader_0b class_structures_phase2_02 +trader_0b class_structures_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01 +trader_0b class_structures_phase2_04 +trader_0b class_structures_phase2_05 +trader_0b class_structures_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02 +trader_0b class_structures_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff +trader_0b class_structures_phase3_02 +trader_0b class_structures_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02 +trader_0b class_structures_phase3_04 +trader_0b class_structures_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02 +trader_0b class_structures_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff +trader_0b class_structures_phase4_novice +trader_0b class_structures_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02 +trader_0b class_structures_phase4_03 +trader_0b class_structures_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02 +trader_0b class_structures_phase4_05 +trader_0b class_structures_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02 +trader_0c class_munitions_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01 +trader_0c class_munitions_phase1_02 +trader_0c class_munitions_phase1_03 +trader_0c class_munitions_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02 +trader_0c class_munitions_phase1_05 +trader_0c class_munitions_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff +trader_0c class_munitions_phase2_novice +trader_0c class_munitions_phase2_02 +trader_0c class_munitions_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01 +trader_0c class_munitions_phase2_04 +trader_0c class_munitions_phase2_05 +trader_0c class_munitions_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02 +trader_0c class_munitions_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff +trader_0c class_munitions_phase3_02 +trader_0c class_munitions_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02 +trader_0c class_munitions_phase3_04 +trader_0c class_munitions_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02 +trader_0c class_munitions_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff +trader_0c class_munitions_phase4_novice +trader_0c class_munitions_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02 +trader_0c class_munitions_phase4_03 +trader_0c class_munitions_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02 +trader_0c class_munitions_phase4_05 +trader_0c class_munitions_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02 +trader_0d class_engineering_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01 +trader_0d class_engineering_phase1_02 +trader_0d class_engineering_phase1_03 +trader_0d class_engineering_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02 +trader_0d class_engineering_phase1_05 +trader_0d class_engineering_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff +trader_0d class_engineering_phase2_novice +trader_0d class_engineering_phase2_02 +trader_0d class_engineering_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01 +trader_0d class_engineering_phase2_04 +trader_0d class_engineering_phase2_05 +trader_0d class_engineering_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02 +trader_0d class_engineering_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff +trader_0d class_engineering_phase3_02 +trader_0d class_engineering_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02 +trader_0d class_engineering_phase3_04 +trader_0d class_engineering_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02 +trader_0d class_engineering_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff +trader_0d class_engineering_phase4_novice +trader_0d class_engineering_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02 +trader_0d class_engineering_phase4_03 +trader_0d class_engineering_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02 +trader_0d class_engineering_phase4_05 +trader_0d class_engineering_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02 +chronicles class_chronicles_novice appearance/eqp_booster_pack.apt @static_item_n:item_pgc_starter_kit item_pgc_starter_kit +chronicles class_chronicles_2 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_4 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_5 appearance/pcg_robe_statue.apt @static_item_n:item_pgc_chronicle_master_statuette item_pgc_chronicle_master_statuette +chronicles class_chronicles_6 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_8 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_10 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_11 appearance/thm_sign_pgc_hanging.apt @static_item_n:item_special_sign_pgc_consumable item_special_sign_pgc_consumable +chronicles class_chronicles_12 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_13 appearance/thm_sign_pgc_standing.apt @static_item_n:item_special_sign_pgc_consumable_02 item_special_sign_pgc_consumable_02 +chronicles class_chronicles_14 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_15 appearance/ply_pgc_merchant_tent_s01_r0.apt @static_item_n:item_pgc_chronicler_tent_deed item_pgc_chronicler_tent_deed +chronicles class_chronicles_16 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack +chronicles class_chronicles_master appearance/pgc_robe_s01_m.sat @static_item_n:item_pgc_chronicle_master_robe item_pgc_booster_pack,item_pgc_chronicle_master_robe diff --git a/serverdata/skill/skill_template.sdb b/serverdata/skill/skill_template.sdb new file mode 100644 index 00000000..28c4fc35 --- /dev/null +++ b/serverdata/skill/skill_template.sdb @@ -0,0 +1,38 @@ +template_name starting_template_name str_class_name user_interface_priority template level_based expertise_trees respec_allowed +STRING STRING STRING INTEGER STRING BOOLEAN STRING INTEGER +smuggler_1a smuggler smuggler 3 class_smuggler_phase1_novice,class_smuggler_phase1_02,class_smuggler_phase1_03,class_smuggler_phase1_04,class_smuggler_phase1_05,class_smuggler_phase1_master,class_smuggler_phase2_novice,class_smuggler_phase2_02,class_smuggler_phase2_03,class_smuggler_phase2_04,class_smuggler_phase2_05,class_smuggler_phase2_master,class_smuggler_phase3_novice,class_smuggler_phase3_02,class_smuggler_phase3_03,class_smuggler_phase3_04,class_smuggler_phase3_05,class_smuggler_phase3_master,class_smuggler_phase4_novice,class_smuggler_phase4_02,class_smuggler_phase4_03,class_smuggler_phase4_04,class_smuggler_phase4_05,class_smuggler_phase4_master true 7,8,30 1 +smuggler_2a smuggler 0 combat_smuggler_prereq_novice,combat_smuggler_prereq_01,combat_smuggler_prereq_02,combat_smuggler_prereq_03,combat_smuggler_prereq_04,combat_smuggler_prereq_master,combat_smuggler_novice,combat_unarmed_prereq_novice,combat_unarmed_prereq_01,combat_unarmed_prereq_02,combat_unarmed_prereq_03,combat_unarmed_prereq_04,combat_unarmed_prereq_master,combat_unarmed_novice,science_doctor_prereq_novice,combat_smuggler_underworld_01,combat_smuggler_slicing_01,combat_smuggler_combat_01,combat_smuggler_spice_01,science_doctor_prereq_01,combat_unarmed_accuracy_01,combat_unarmed_speed_01,combat_unarmed_ability_01,combat_unarmed_support_01,science_doctor_prereq_02,combat_smuggler_underworld_02,combat_smuggler_slicing_02,science_doctor_prereq_03,combat_smuggler_combat_02,combat_smuggler_spice_02,science_doctor_prereq_04,combat_unarmed_accuracy_02,combat_unarmed_speed_02,science_doctor_prereq_master,combat_unarmed_ability_02,combat_unarmed_support_02,science_doctor_novice,combat_smuggler_underworld_03,combat_smuggler_slicing_03,combat_smuggler_combat_03,combat_smuggler_spice_03,science_doctor_wound_speed_01,combat_unarmed_accuracy_03,combat_unarmed_speed_03,combat_unarmed_ability_03,combat_unarmed_support_03,science_doctor_wound_speed_02,combat_smuggler_underworld_04,combat_smuggler_slicing_04,combat_smuggler_combat_04,combat_smuggler_spice_04,science_doctor_wound_speed_03,combat_unarmed_accuracy_04,combat_unarmed_speed_04,combat_unarmed_ability_04,combat_unarmed_support_04,science_doctor_wound_speed_04,combat_unarmed_master,combat_smuggler_master true 7,8,30 0 +smuggler_2b smuggler 0 combat_smuggler_prereq_novice,combat_smuggler_prereq_01,combat_smuggler_prereq_02,combat_smuggler_prereq_03,combat_smuggler_prereq_04,combat_smuggler_prereq_master,combat_smuggler_novice,combat_pistol_prereq_novice,combat_pistol_prereq_01,combat_pistol_prereq_02,combat_pistol_prereq_03,combat_pistol_prereq_04,combat_pistol_prereq_master,combat_pistol_novice,science_doctor_prereq_novice,combat_smuggler_underworld_01,combat_smuggler_slicing_01,combat_smuggler_combat_01,combat_smuggler_spice_01,science_doctor_prereq_01,combat_pistol_accuracy_01,combat_pistol_speed_01,combat_pistol_ability_01,combat_pistol_support_01,science_doctor_prereq_02,combat_smuggler_underworld_02,combat_smuggler_slicing_02,science_doctor_prereq_03,combat_smuggler_combat_02,combat_smuggler_spice_02,science_doctor_prereq_04,combat_pistol_accuracy_02,combat_pistol_speed_02,science_doctor_prereq_master,combat_pistol_ability_02,combat_pistol_support_02,science_doctor_novice,combat_smuggler_underworld_03,combat_smuggler_slicing_03,combat_smuggler_combat_03,combat_smuggler_spice_03,science_doctor_wound_speed_01,combat_pistol_accuracy_03,combat_pistol_speed_03,combat_pistol_ability_03,combat_pistol_support_03,science_doctor_wound_speed_02,combat_smuggler_underworld_04,combat_smuggler_slicing_04,combat_smuggler_combat_04,combat_smuggler_spice_04,science_doctor_wound_speed_03,combat_pistol_accuracy_04,combat_pistol_speed_04,combat_pistol_ability_04,combat_pistol_support_04,science_doctor_wound_speed_04,combat_pistol_master,combat_smuggler_master true 7,8,30 0 +bounty_hunter_1a bounty_hunter bounty_hunter 2 class_bountyhunter_phase1_novice,class_bountyhunter_phase1_02,class_bountyhunter_phase1_03,class_bountyhunter_phase1_04,class_bountyhunter_phase1_05,class_bountyhunter_phase1_master,class_bountyhunter_phase2_novice,class_bountyhunter_phase2_02,class_bountyhunter_phase2_03,class_bountyhunter_phase2_04,class_bountyhunter_phase2_05,class_bountyhunter_phase2_master,class_bountyhunter_phase3_novice,class_bountyhunter_phase3_02,class_bountyhunter_phase3_03,class_bountyhunter_phase3_04,class_bountyhunter_phase3_05,class_bountyhunter_phase3_master,class_bountyhunter_phase4_novice,class_bountyhunter_phase4_02,class_bountyhunter_phase4_03,class_bountyhunter_phase4_04,class_bountyhunter_phase4_05,class_bountyhunter_phase4_master true 1,2,30 1 +bounty_hunter_2a bounty_hunter 0 combat_bountyhunter_prereq_novice,combat_bountyhunter_prereq_01,combat_bountyhunter_prereq_02,combat_bountyhunter_prereq_03,combat_bountyhunter_prereq_04,combat_bountyhunter_prereq_master,combat_bountyhunter_novice,combat_rifleman_prereq_novice,combat_rifleman_prereq_01,combat_rifleman_prereq_02,combat_rifleman_prereq_03,combat_rifleman_prereq_04,combat_rifleman_prereq_master,combat_rifleman_novice,science_doctor_prereq_novice,combat_bountyhunter_investigation_01,combat_bountyhunter_droidcontrol_01,combat_bountyhunter_droidresponse_01,combat_bountyhunter_support_01,science_doctor_prereq_01,combat_rifleman_accuracy_01,combat_rifleman_speed_01,combat_rifleman_ability_01,combat_rifleman_support_01,science_doctor_prereq_02,combat_bountyhunter_investigation_02,combat_bountyhunter_droidcontrol_02,science_doctor_prereq_03,combat_bountyhunter_droidresponse_02,combat_bountyhunter_support_02,science_doctor_prereq_04,combat_rifleman_accuracy_02,combat_rifleman_speed_02,science_doctor_prereq_master,combat_rifleman_ability_02,combat_rifleman_support_02,science_doctor_novice,combat_bountyhunter_investigation_03,combat_bountyhunter_droidcontrol_03,combat_bountyhunter_droidresponse_03,combat_bountyhunter_support_03,science_doctor_wound_speed_01,combat_rifleman_accuracy_03,combat_rifleman_speed_03,combat_rifleman_ability_03,combat_rifleman_support_03,science_doctor_wound_speed_02,combat_bountyhunter_investigation_04,combat_bountyhunter_droidcontrol_04,combat_bountyhunter_droidresponse_04,combat_bountyhunter_support_04,science_doctor_wound_speed_03,combat_rifleman_accuracy_04,combat_rifleman_speed_04,combat_rifleman_ability_04,combat_rifleman_support_04,science_doctor_wound_speed_04,combat_rifleman_master,combat_bountyhunter_master true 1,2,30 0 +bounty_hunter_2b bounty_hunter 0 combat_bountyhunter_prereq_novice,combat_bountyhunter_prereq_01,combat_bountyhunter_prereq_02,combat_bountyhunter_prereq_03,combat_bountyhunter_prereq_04,combat_bountyhunter_prereq_master,combat_bountyhunter_novice,combat_carbine_prereq_novice,combat_carbine_prereq_01,combat_carbine_prereq_02,combat_carbine_prereq_03,combat_carbine_prereq_04,combat_carbine_prereq_master,combat_carbine_novice,science_doctor_prereq_novice,combat_bountyhunter_investigation_01,combat_bountyhunter_droidcontrol_01,combat_bountyhunter_droidresponse_01,combat_bountyhunter_support_01,science_doctor_prereq_01,combat_carbine_accuracy_01,combat_carbine_speed_01,combat_carbine_ability_01,combat_carbine_support_01,science_doctor_prereq_02,combat_bountyhunter_investigation_02,combat_bountyhunter_droidcontrol_02,science_doctor_prereq_03,combat_bountyhunter_droidresponse_02,combat_bountyhunter_support_02,science_doctor_prereq_04,combat_carbine_accuracy_02,combat_carbine_speed_02,science_doctor_prereq_master,combat_carbine_ability_02,combat_carbine_support_02,science_doctor_novice,combat_bountyhunter_investigation_03,combat_bountyhunter_droidcontrol_03,combat_bountyhunter_droidresponse_03,combat_bountyhunter_support_03,science_doctor_wound_speed_01,combat_carbine_accuracy_03,combat_carbine_speed_03,combat_carbine_ability_03,combat_carbine_support_03,science_doctor_wound_speed_02,combat_bountyhunter_investigation_04,combat_bountyhunter_droidcontrol_04,combat_bountyhunter_droidresponse_04,combat_bountyhunter_support_04,science_doctor_wound_speed_03,combat_carbine_accuracy_04,combat_carbine_speed_04,combat_carbine_ability_04,combat_carbine_support_04,science_doctor_wound_speed_04,combat_carbine_master,combat_bountyhunter_master true 1,2,30 0 +officer_1a officer officer 4 class_officer_phase1_novice,class_officer_phase1_02,class_officer_phase1_03,class_officer_phase1_04,class_officer_phase1_05,class_officer_phase1_master,class_officer_phase2_novice,class_officer_phase2_02,class_officer_phase2_03,class_officer_phase2_04,class_officer_phase2_05,class_officer_phase2_master,class_officer_phase3_novice,class_officer_phase3_02,class_officer_phase3_03,class_officer_phase3_04,class_officer_phase3_05,class_officer_phase3_master,class_officer_phase4_novice,class_officer_phase4_02,class_officer_phase4_03,class_officer_phase4_04,class_officer_phase4_05,class_officer_phase4_master true 10,11,30 1 +officer_2a officer 0 outdoors_squadleader_prereq_novice,outdoors_squadleader_prereq_01,outdoors_squadleader_prereq_02,outdoors_squadleader_prereq_03,outdoors_squadleader_prereq_04,outdoors_squadleader_prereq_master,outdoors_squadleader_novice,combat_pistol_prereq_novice,combat_pistol_prereq_01,combat_pistol_prereq_02,combat_pistol_prereq_03,combat_pistol_prereq_04,combat_pistol_prereq_master,combat_pistol_novice,science_doctor_prereq_novice,outdoors_squadleader_movement_01,outdoors_squadleader_offense_01,outdoors_squadleader_defense_01,outdoors_squadleader_support_01,science_doctor_prereq_01,combat_pistol_accuracy_01,combat_pistol_speed_01,combat_pistol_ability_01,combat_pistol_support_01,science_doctor_prereq_02,outdoors_squadleader_movement_02,outdoors_squadleader_offense_02,science_doctor_prereq_03,outdoors_squadleader_defense_02,outdoors_squadleader_support_02,science_doctor_prereq_04,combat_pistol_accuracy_02,combat_pistol_speed_02,science_doctor_prereq_master,combat_pistol_ability_02,combat_pistol_support_02,science_doctor_novice,outdoors_squadleader_movement_03,outdoors_squadleader_offense_03,outdoors_squadleader_defense_03,outdoors_squadleader_support_03,science_doctor_wound_speed_01,combat_pistol_accuracy_03,combat_pistol_speed_03,combat_pistol_ability_03,combat_pistol_support_03,science_doctor_wound_speed_02,outdoors_squadleader_movement_04,outdoors_squadleader_offense_04,outdoors_squadleader_defense_04,outdoors_squadleader_support_04,science_doctor_wound_speed_03,combat_pistol_accuracy_04,combat_pistol_speed_04,combat_pistol_ability_04,combat_pistol_support_04,science_doctor_wound_speed_04,combat_pistol_master,outdoors_squadleader_master true 10,11,30 0 +officer_2b officer 0 outdoors_squadleader_prereq_novice,outdoors_squadleader_prereq_01,outdoors_squadleader_prereq_02,outdoors_squadleader_prereq_03,outdoors_squadleader_prereq_04,outdoors_squadleader_prereq_master,outdoors_squadleader_novice,combat_1hsword_prereq_novice,combat_1hsword_prereq_01,combat_1hsword_prereq_02,combat_1hsword_prereq_03,combat_1hsword_prereq_04,combat_1hsword_prereq_master,combat_1hsword_novice,science_doctor_prereq_novice,outdoors_squadleader_movement_01,outdoors_squadleader_offense_01,outdoors_squadleader_defense_01,outdoors_squadleader_support_01,science_doctor_prereq_01,combat_1hsword_accuracy_01,combat_1hsword_speed_01,combat_1hsword_ability_01,combat_1hsword_support_01,science_doctor_prereq_02,outdoors_squadleader_movement_02,outdoors_squadleader_offense_02,science_doctor_prereq_03,outdoors_squadleader_defense_02,outdoors_squadleader_support_02,science_doctor_prereq_04,combat_1hsword_accuracy_02,combat_1hsword_speed_02,science_doctor_prereq_master,combat_1hsword_ability_02,combat_1hsword_support_02,science_doctor_novice,outdoors_squadleader_movement_03,outdoors_squadleader_offense_03,outdoors_squadleader_defense_03,outdoors_squadleader_support_03,science_doctor_wound_speed_01,combat_1hsword_accuracy_03,combat_1hsword_speed_03,combat_1hsword_ability_03,combat_1hsword_support_03,science_doctor_wound_speed_02,outdoors_squadleader_movement_04,outdoors_squadleader_offense_04,outdoors_squadleader_defense_04,outdoors_squadleader_support_04,science_doctor_wound_speed_03,combat_1hsword_accuracy_04,combat_1hsword_speed_04,combat_1hsword_ability_04,combat_1hsword_support_04,science_doctor_wound_speed_04,combat_1hsword_master,outdoors_squadleader_master true 10,11,30 0 +commando_1a commando commando 5 class_commando_phase1_novice,class_commando_phase1_02,class_commando_phase1_03,class_commando_phase1_04,class_commando_phase1_05,class_commando_phase1_master,class_commando_phase2_novice,class_commando_phase2_02,class_commando_phase2_03,class_commando_phase2_04,class_commando_phase2_05,class_commando_phase2_master,class_commando_phase3_novice,class_commando_phase3_02,class_commando_phase3_03,class_commando_phase3_04,class_commando_phase3_05,class_commando_phase3_master,class_commando_phase4_novice,class_commando_phase4_02,class_commando_phase4_03,class_commando_phase4_04,class_commando_phase4_05,class_commando_phase4_master true 13,14,30 1 +commando_2a commando 0 combat_commando_prereq_novice,combat_commando_prereq_01,combat_commando_prereq_02,combat_commando_prereq_03,combat_commando_prereq_04,combat_commando_prereq_master,combat_commando_novice,combat_rifleman_prereq_novice,combat_rifleman_prereq_01,combat_rifleman_prereq_02,combat_rifleman_prereq_03,combat_rifleman_prereq_04,combat_rifleman_prereq_master,combat_rifleman_novice,science_doctor_prereq_novice,combat_commando_heavyweapon_accuracy_01,combat_commando_heavyweapon_speed_01,combat_commando_thrownweapon_01,combat_commando_support_01,science_doctor_prereq_01,combat_rifleman_accuracy_01,combat_rifleman_speed_01,combat_rifleman_ability_01,combat_rifleman_support_01,science_doctor_prereq_02,combat_commando_heavyweapon_accuracy_02,combat_commando_heavyweapon_speed_02,science_doctor_prereq_03,combat_commando_thrownweapon_02,combat_commando_support_02,science_doctor_prereq_04,combat_rifleman_accuracy_02,combat_rifleman_speed_02,science_doctor_prereq_master,combat_rifleman_ability_02,combat_rifleman_support_02,science_doctor_novice,combat_commando_heavyweapon_accuracy_03,combat_commando_heavyweapon_speed_03,combat_commando_thrownweapon_03,combat_commando_support_03,science_doctor_wound_speed_01,combat_rifleman_accuracy_03,combat_rifleman_speed_03,combat_rifleman_ability_03,combat_rifleman_support_03,science_doctor_wound_speed_02,combat_commando_heavyweapon_accuracy_04,combat_commando_heavyweapon_speed_04,combat_commando_thrownweapon_04,combat_commando_support_04,science_doctor_wound_speed_03,combat_rifleman_accuracy_04,combat_rifleman_speed_04,combat_rifleman_ability_04,combat_rifleman_support_04,science_doctor_wound_speed_04,combat_rifleman_master,combat_commando_master true 13,14,30 0 +commando_2b commando 0 combat_commando_prereq_novice,combat_commando_prereq_01,combat_commando_prereq_02,combat_commando_prereq_03,combat_commando_prereq_04,combat_commando_prereq_master,combat_commando_novice,combat_2hsword_prereq_novice,combat_2hsword_prereq_01,combat_2hsword_prereq_02,combat_2hsword_prereq_03,combat_2hsword_prereq_04,combat_2hsword_prereq_master,combat_2hsword_novice,science_doctor_prereq_novice,combat_commando_heavyweapon_accuracy_01,combat_commando_heavyweapon_speed_01,combat_commando_thrownweapon_01,combat_commando_support_01,science_doctor_prereq_01,combat_2hsword_accuracy_01,combat_2hsword_speed_01,combat_2hsword_ability_01,combat_2hsword_support_01,science_doctor_prereq_02,combat_commando_heavyweapon_accuracy_02,combat_commando_heavyweapon_speed_02,science_doctor_prereq_03,combat_commando_thrownweapon_02,combat_commando_support_02,science_doctor_prereq_04,combat_2hsword_accuracy_02,combat_2hsword_speed_02,science_doctor_prereq_master,combat_2hsword_ability_02,combat_2hsword_support_02,science_doctor_novice,combat_commando_heavyweapon_accuracy_03,combat_commando_heavyweapon_speed_03,combat_commando_thrownweapon_03,combat_commando_support_03,science_doctor_wound_speed_01,combat_2hsword_accuracy_03,combat_2hsword_speed_03,combat_2hsword_ability_03,combat_2hsword_support_03,science_doctor_wound_speed_02,combat_commando_heavyweapon_accuracy_04,combat_commando_heavyweapon_speed_04,combat_commando_thrownweapon_04,combat_commando_support_04,science_doctor_wound_speed_03,combat_2hsword_accuracy_04,combat_2hsword_speed_04,combat_2hsword_ability_04,combat_2hsword_support_04,science_doctor_wound_speed_04,combat_2hsword_master,combat_commando_master true 13,14,30 0 +force_sensitive_1a force_sensitive force_sensitive 1 class_forcesensitive_phase1_novice,class_forcesensitive_phase1_02,class_forcesensitive_phase1_03,class_forcesensitive_phase1_04,class_forcesensitive_phase1_05,class_forcesensitive_phase1_master,class_forcesensitive_phase2_novice,class_forcesensitive_phase2_02,class_forcesensitive_phase2_03,class_forcesensitive_phase2_04,class_forcesensitive_phase2_05,class_forcesensitive_phase2_master,class_forcesensitive_phase3_novice,class_forcesensitive_phase3_02,class_forcesensitive_phase3_03,class_forcesensitive_phase3_04,class_forcesensitive_phase3_05,class_forcesensitive_phase3_master,class_forcesensitive_phase4_novice,class_forcesensitive_phase4_02,class_forcesensitive_phase4_03,class_forcesensitive_phase4_04,class_forcesensitive_phase4_05,class_forcesensitive_phase4_master true 4,5,30 1 +force_sensitive_2a force_sensitive 0 combat_unarmed_prereq_novice,combat_unarmed_prereq_01,combat_unarmed_prereq_02,combat_unarmed_prereq_03,combat_unarmed_prereq_04,combat_unarmed_prereq_master,combat_unarmed_novice,combat_2hsword_prereq_novice,combat_2hsword_prereq_01,combat_2hsword_prereq_02,combat_2hsword_prereq_03,combat_2hsword_prereq_04,combat_2hsword_prereq_master,combat_2hsword_novice,science_doctor_prereq_novice,combat_unarmed_accuracy_01,combat_unarmed_speed_01,combat_unarmed_ability_01,combat_unarmed_support_01,science_doctor_prereq_01,combat_2hsword_accuracy_01,combat_2hsword_speed_01,combat_2hsword_ability_01,combat_2hsword_support_01,science_doctor_prereq_02,combat_unarmed_accuracy_02,combat_unarmed_speed_02,science_doctor_prereq_03,combat_unarmed_ability_02,combat_unarmed_support_02,science_doctor_prereq_04,combat_2hsword_accuracy_02,combat_2hsword_speed_02,science_doctor_prereq_master,combat_2hsword_ability_02,combat_2hsword_support_02,science_doctor_novice,combat_unarmed_accuracy_03,combat_unarmed_speed_03,combat_unarmed_ability_03,combat_unarmed_support_03,science_doctor_wound_speed_01,combat_2hsword_accuracy_03,combat_2hsword_speed_03,combat_2hsword_ability_03,combat_2hsword_support_03,science_doctor_wound_speed_02,combat_unarmed_accuracy_04,combat_unarmed_speed_04,combat_unarmed_ability_04,combat_unarmed_support_04,science_doctor_wound_speed_03,combat_2hsword_accuracy_04,combat_2hsword_speed_04,combat_2hsword_ability_04,combat_2hsword_support_04,science_doctor_wound_speed_04,combat_2hsword_master,combat_unarmed_master true 4,5,30 0 +force_sensitive_2b force_sensitive 0 combat_unarmed_prereq_novice,combat_unarmed_prereq_01,combat_unarmed_prereq_02,combat_unarmed_prereq_03,combat_unarmed_prereq_04,combat_unarmed_prereq_master,combat_unarmed_novice,combat_polearm_prereq_novice,combat_polearm_prereq_01,combat_polearm_prereq_02,combat_polearm_prereq_03,combat_polearm_prereq_04,combat_polearm_prereq_master,combat_polearm_novice,science_doctor_prereq_novice,combat_unarmed_accuracy_01,combat_unarmed_speed_01,combat_unarmed_ability_01,combat_unarmed_support_01,science_doctor_prereq_01,combat_polearm_accuracy_01,combat_polearm_speed_01,combat_polearm_ability_01,combat_polearm_support_01,science_doctor_prereq_02,combat_unarmed_accuracy_02,combat_unarmed_speed_02,science_doctor_prereq_03,combat_unarmed_ability_02,combat_unarmed_support_02,science_doctor_prereq_04,combat_polearm_accuracy_02,combat_polearm_speed_02,science_doctor_prereq_master,combat_polearm_ability_02,combat_polearm_support_02,science_doctor_novice,combat_unarmed_accuracy_03,combat_unarmed_speed_03,combat_unarmed_ability_03,combat_unarmed_support_03,science_doctor_wound_speed_01,combat_polearm_accuracy_03,combat_polearm_speed_03,combat_polearm_ability_03,combat_polearm_support_03,science_doctor_wound_speed_02,combat_unarmed_accuracy_04,combat_unarmed_speed_04,combat_unarmed_ability_04,combat_unarmed_support_04,science_doctor_wound_speed_03,combat_polearm_accuracy_04,combat_polearm_speed_04,combat_polearm_ability_04,combat_polearm_support_04,science_doctor_wound_speed_04,combat_polearm_master,combat_unarmed_master true 4,5,30 0 +medic_1a medic medic 8 class_medic_phase1_novice,class_medic_phase1_02,class_medic_phase1_03,class_medic_phase1_04,class_medic_phase1_05,class_medic_phase1_master,class_medic_phase2_novice,class_medic_phase2_02,class_medic_phase2_03,class_medic_phase2_04,class_medic_phase2_05,class_medic_phase2_master,class_medic_phase3_novice,class_medic_phase3_02,class_medic_phase3_03,class_medic_phase3_04,class_medic_phase3_05,class_medic_phase3_master,class_medic_phase4_novice,class_medic_phase4_02,class_medic_phase4_03,class_medic_phase4_04,class_medic_phase4_05,class_medic_phase4_master true 16,17,30 1 +medic_2a medic 0 science_doctor_prereq_novice,science_doctor_prereq_01,science_doctor_prereq_02,science_doctor_prereq_03,science_doctor_prereq_04,science_doctor_prereq_master,science_doctor_novice,science_combatmedic_prereq_novice,science_combatmedic_prereq_01,science_combatmedic_prereq_02,science_combatmedic_prereq_03,science_combatmedic_prereq_04,science_combatmedic_prereq_master,science_combatmedic_novice,combat_pistol_prereq_novice,science_doctor_wound_speed_01,science_doctor_wound_01,science_doctor_ability_01,science_doctor_support_01,combat_pistol_prereq_01,science_combatmedic_healing_range_01,science_combatmedic_healing_range_speed_01,science_combatmedic_medicine_01,science_combatmedic_support_01,combat_pistol_prereq_02,science_doctor_wound_speed_02,science_doctor_wound_02,combat_pistol_prereq_03,science_doctor_ability_02,science_doctor_support_02,combat_pistol_prereq_04,science_combatmedic_healing_range_02,science_combatmedic_healing_range_speed_02,combat_pistol_prereq_master,science_combatmedic_medicine_02,science_combatmedic_support_02,combat_pistol_novice,science_doctor_wound_speed_03,science_doctor_wound_03,science_doctor_ability_03,science_doctor_support_03,combat_pistol_support_01,science_combatmedic_healing_range_03,science_combatmedic_healing_range_speed_03,science_combatmedic_medicine_03,science_combatmedic_support_03,combat_pistol_support_02,science_doctor_wound_speed_04,science_doctor_wound_04,science_doctor_ability_04,science_doctor_support_04,combat_pistol_support_03,science_combatmedic_healing_range_04,science_combatmedic_healing_range_speed_04,science_combatmedic_medicine_04,science_combatmedic_support_04,combat_pistol_support_04,science_combatmedic_master,science_doctor_master true 16,17,30 0 +medic_2b medic 0 science_doctor_prereq_novice,science_doctor_prereq_01,science_doctor_prereq_02,science_doctor_prereq_03,science_doctor_prereq_04,science_doctor_prereq_master,science_doctor_novice,combat_pistol_prereq_novice,combat_pistol_prereq_01,combat_pistol_prereq_02,combat_pistol_prereq_03,combat_pistol_prereq_04,combat_pistol_prereq_master,combat_pistol_novice,science_combatmedic_prereq_novice,science_doctor_wound_speed_01,science_doctor_wound_01,science_doctor_ability_01,science_doctor_support_01,science_combatmedic_prereq_01,combat_pistol_accuracy_01,combat_pistol_speed_01,combat_pistol_ability_01,combat_pistol_support_01,science_combatmedic_prereq_02,science_doctor_wound_speed_02,science_doctor_wound_02,science_combatmedic_prereq_03,science_doctor_ability_02,science_doctor_support_02,science_combatmedic_prereq_04,combat_pistol_accuracy_02,combat_pistol_speed_02,science_combatmedic_prereq_master,combat_pistol_ability_02,combat_pistol_support_02,science_combatmedic_novice,science_doctor_wound_speed_03,science_doctor_wound_03,science_doctor_ability_03,science_doctor_support_03,science_combatmedic_healing_range_01,combat_pistol_accuracy_03,combat_pistol_speed_03,combat_pistol_ability_03,combat_pistol_support_03,science_combatmedic_healing_range_02,science_doctor_wound_speed_04,science_doctor_wound_04,science_doctor_ability_04,science_doctor_support_04,science_combatmedic_healing_range_03,combat_pistol_accuracy_04,combat_pistol_speed_04,combat_pistol_ability_04,combat_pistol_support_04,science_combatmedic_healing_range_04,combat_pistol_master,science_doctor_master true 16,17,30 0 +spy_1a spy spy 6 class_spy_phase1_novice,class_spy_phase1_02,class_spy_phase1_03,class_spy_phase1_04,class_spy_phase1_05,class_spy_phase1_master,class_spy_phase2_novice,class_spy_phase2_02,class_spy_phase2_03,class_spy_phase2_04,class_spy_phase2_05,class_spy_phase2_master,class_spy_phase3_novice,class_spy_phase3_02,class_spy_phase3_03,class_spy_phase3_04,class_spy_phase3_05,class_spy_phase3_master,class_spy_phase4_novice,class_spy_phase4_02,class_spy_phase4_03,class_spy_phase4_04,class_spy_phase4_05,class_spy_phase4_master true 19,20,30 1 +spy_2a spy 0 outdoors_ranger_prereq_novice,outdoors_ranger_prereq_01,outdoors_ranger_prereq_02,outdoors_ranger_prereq_03,outdoors_ranger_prereq_04,outdoors_ranger_prereq_master,outdoors_ranger_novice,combat_carbine_prereq_novice,combat_carbine_prereq_01,combat_carbine_prereq_02,combat_carbine_prereq_03,combat_carbine_prereq_04,combat_carbine_prereq_master,combat_carbine_novice,science_doctor_prereq_novice,outdoors_ranger_movement_01,outdoors_ranger_tracking_01,outdoors_ranger_harvest_01,outdoors_ranger_support_01,science_doctor_prereq_01,combat_carbine_accuracy_01,combat_carbine_speed_01,combat_carbine_ability_01,combat_carbine_support_01,science_doctor_prereq_02,outdoors_ranger_movement_02,outdoors_ranger_tracking_02,science_doctor_prereq_03,outdoors_ranger_harvest_02,outdoors_ranger_support_02,science_doctor_prereq_04,combat_carbine_accuracy_02,combat_carbine_speed_02,science_doctor_prereq_master,combat_carbine_ability_02,combat_carbine_support_02,science_doctor_novice,outdoors_ranger_movement_03,outdoors_ranger_tracking_03,outdoors_ranger_harvest_03,outdoors_ranger_support_03,science_doctor_wound_speed_01,combat_carbine_accuracy_03,combat_carbine_speed_03,combat_carbine_ability_03,combat_carbine_support_03,science_doctor_wound_speed_02,combat_carbine_accuracy_04,combat_carbine_speed_04,combat_carbine_ability_04,combat_carbine_support_04,science_doctor_wound_speed_03,outdoors_ranger_movement_04,outdoors_ranger_tracking_04,outdoors_ranger_harvest_04,outdoors_ranger_support_04,science_doctor_wound_speed_04,outdoors_ranger_master,combat_carbine_master true 19,20,30 0 +spy_2b spy 0 outdoors_ranger_prereq_novice,outdoors_ranger_prereq_01,outdoors_ranger_prereq_02,outdoors_ranger_prereq_03,outdoors_ranger_prereq_04,outdoors_ranger_prereq_master,outdoors_ranger_novice,combat_bountyhunter_prereq_novice,combat_bountyhunter_prereq_01,combat_bountyhunter_prereq_02,combat_bountyhunter_prereq_03,combat_bountyhunter_prereq_04,combat_bountyhunter_prereq_master,combat_bountyhunter_novice,science_doctor_prereq_novice,outdoors_ranger_movement_01,outdoors_ranger_tracking_01,outdoors_ranger_harvest_01,outdoors_ranger_support_01,science_doctor_prereq_01,combat_bountyhunter_investigation_01,combat_bountyhunter_droidcontrol_01,combat_bountyhunter_droidresponse_01,combat_bountyhunter_support_01,science_doctor_prereq_02,outdoors_ranger_movement_02,outdoors_ranger_tracking_02,science_doctor_prereq_03,outdoors_ranger_harvest_02,outdoors_ranger_support_02,science_doctor_prereq_04,combat_bountyhunter_investigation_02,combat_bountyhunter_droidcontrol_02,science_doctor_prereq_master,combat_bountyhunter_droidresponse_02,combat_bountyhunter_support_02,science_doctor_novice,outdoors_ranger_movement_03,outdoors_ranger_tracking_03,outdoors_ranger_harvest_03,outdoors_ranger_support_03,science_doctor_wound_speed_01,combat_bountyhunter_investigation_03,combat_bountyhunter_droidcontrol_03,combat_bountyhunter_droidresponse_03,combat_bountyhunter_support_03,science_doctor_wound_speed_02,combat_bountyhunter_investigation_04,combat_bountyhunter_droidcontrol_04,combat_bountyhunter_droidresponse_04,combat_bountyhunter_support_04,science_doctor_wound_speed_03,outdoors_ranger_movement_04,outdoors_ranger_tracking_04,outdoors_ranger_harvest_04,outdoors_ranger_support_04,science_doctor_wound_speed_04,outdoors_ranger_master,combat_bountyhunter_master true 19,20,30 0 +entertainer_1a entertainer entertainer 9 class_entertainer_phase1_novice,class_entertainer_phase1_02,class_entertainer_phase1_03,class_entertainer_phase1_04,class_entertainer_phase1_05,class_entertainer_phase1_master,class_entertainer_phase2_novice,class_entertainer_phase2_02,class_entertainer_phase2_03,class_entertainer_phase2_04,class_entertainer_phase2_05,class_entertainer_phase2_master,class_entertainer_phase3_novice,class_entertainer_phase3_02,class_entertainer_phase3_03,class_entertainer_phase3_04,class_entertainer_phase3_05,class_entertainer_phase3_master,class_entertainer_phase4_novice,class_entertainer_phase4_02,class_entertainer_phase4_03,class_entertainer_phase4_04,class_entertainer_phase4_05,class_entertainer_phase4_master true 22,23,30 1 +entertainer_2a entertainer 0 social_entertainer_novice,social_entertainer_dance_01,social_entertainer_music_01,social_entertainer_healing_01,social_entertainer_hairstyle_01,social_entertainer_dance_02,social_entertainer_music_02,social_entertainer_healing_02,social_entertainer_hairstyle_02,social_entertainer_dance_03,social_entertainer_music_03,social_entertainer_healing_03,social_entertainer_hairstyle_03,social_entertainer_dance_04,social_entertainer_music_04,social_entertainer_healing_04,social_entertainer_hairstyle_04,social_entertainer_master,social_dancer_novice,social_musician_novice,social_imagedesigner_novice,social_dancer_ability_01,social_dancer_wound_01,social_dancer_knowledge_01,social_dancer_shock_01,social_musician_ability_01,social_musician_wound_01,social_musician_knowledge_01,social_musician_shock_01,social_imagedesigner_hairstyle_01,social_imagedesigner_exotic_01,social_imagedesigner_bodyform_01,social_imagedesigner_markings_01,social_dancer_ability_02,social_dancer_wound_02,social_dancer_knowledge_02,social_dancer_shock_02,social_musician_ability_02,social_musician_wound_02,social_musician_knowledge_02,social_musician_shock_02,social_imagedesigner_hairstyle_02,social_imagedesigner_exotic_02,social_imagedesigner_bodyform_02,social_imagedesigner_markings_02,social_dancer_ability_03,social_dancer_wound_03,social_dancer_knowledge_03,social_dancer_shock_03,social_musician_ability_03,social_musician_wound_03,social_musician_knowledge_03,social_musician_shock_03,social_imagedesigner_hairstyle_03,social_imagedesigner_exotic_03,social_imagedesigner_bodyform_03,social_imagedesigner_markings_03,social_dancer_ability_04,social_dancer_wound_04,social_dancer_knowledge_04,social_dancer_shock_04,social_musician_ability_04,social_musician_wound_04,social_musician_knowledge_04,social_musician_shock_04,social_imagedesigner_hairstyle_04,social_imagedesigner_exotic_04,social_imagedesigner_bodyform_04,social_imagedesigner_markings_04,social_imagedesigner_master,social_musician_master,social_dancer_master false 0 +trader_0a trader trader 7 class_domestics_phase1_novice,class_domestics_phase1_02,class_domestics_phase1_03,class_domestics_phase1_04,class_domestics_phase1_05,class_domestics_phase1_master,class_domestics_phase2_novice,class_domestics_phase2_02,class_domestics_phase2_03,class_domestics_phase2_04,class_domestics_phase2_05,class_domestics_phase2_master,class_domestics_phase3_novice,class_domestics_phase3_02,class_domestics_phase3_03,class_domestics_phase3_04,class_domestics_phase3_05,class_domestics_phase3_master,class_domestics_phase4_novice,class_domestics_phase4_02,class_domestics_phase4_03,class_domestics_phase4_04,class_domestics_phase4_05,class_domestics_phase4_master true 25,29,30 1 +trader_0b trader 0 class_structures_phase1_novice,class_structures_phase1_02,class_structures_phase1_03,class_structures_phase1_04,class_structures_phase1_05,class_structures_phase1_master,class_structures_phase2_novice,class_structures_phase2_02,class_structures_phase2_03,class_structures_phase2_04,class_structures_phase2_05,class_structures_phase2_master,class_structures_phase3_novice,class_structures_phase3_02,class_structures_phase3_03,class_structures_phase3_04,class_structures_phase3_05,class_structures_phase3_master,class_structures_phase4_novice,class_structures_phase4_02,class_structures_phase4_03,class_structures_phase4_04,class_structures_phase4_05,class_structures_phase4_master true 26,29,30 1 +trader_0c trader 0 class_munitions_phase1_novice,class_munitions_phase1_02,class_munitions_phase1_03,class_munitions_phase1_04,class_munitions_phase1_05,class_munitions_phase1_master,class_munitions_phase2_novice,class_munitions_phase2_02,class_munitions_phase2_03,class_munitions_phase2_04,class_munitions_phase2_05,class_munitions_phase2_master,class_munitions_phase3_novice,class_munitions_phase3_02,class_munitions_phase3_03,class_munitions_phase3_04,class_munitions_phase3_05,class_munitions_phase3_master,class_munitions_phase4_novice,class_munitions_phase4_02,class_munitions_phase4_03,class_munitions_phase4_04,class_munitions_phase4_05,class_munitions_phase4_master true 27,29,30 1 +trader_0d trader 0 class_engineering_phase1_novice,class_engineering_phase1_02,class_engineering_phase1_03,class_engineering_phase1_04,class_engineering_phase1_05,class_engineering_phase1_master,class_engineering_phase2_novice,class_engineering_phase2_02,class_engineering_phase2_03,class_engineering_phase2_04,class_engineering_phase2_05,class_engineering_phase2_master,class_engineering_phase3_novice,class_engineering_phase3_02,class_engineering_phase3_03,class_engineering_phase3_04,class_engineering_phase3_05,class_engineering_phase3_master,class_engineering_phase4_novice,class_engineering_phase4_02,class_engineering_phase4_03,class_engineering_phase4_04,class_engineering_phase4_05,class_engineering_phase4_master true 28,29,30 1 +trader_1a trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_domestic_01,crafting_artisan_domestic_02,crafting_artisan_domestic_03,crafting_artisan_domestic_04,crafting_chef_novice,crafting_tailor_novice,crafting_chef_dish_01,crafting_chef_dessert_01,crafting_chef_drink_01,crafting_chef_techniques_01,crafting_tailor_casual_01,crafting_tailor_field_01,crafting_tailor_formal_01,crafting_tailor_production_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_chef_dish_02,crafting_chef_dessert_02,crafting_chef_drink_02,crafting_chef_techniques_02,crafting_tailor_casual_02,crafting_tailor_field_02,crafting_tailor_formal_02,crafting_tailor_production_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_chef_dish_03,crafting_chef_dessert_03,crafting_chef_drink_03,crafting_chef_techniques_03,crafting_tailor_casual_03,crafting_tailor_field_03,crafting_tailor_formal_03,crafting_tailor_production_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_chef_dish_04,crafting_chef_dessert_04,crafting_chef_drink_04,crafting_chef_techniques_04,crafting_tailor_casual_04,crafting_tailor_field_04,crafting_tailor_formal_04,crafting_tailor_production_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_chef_master,crafting_tailor_master,crafting_merchant_master false 0 +trader_1b trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_engineering_01,crafting_artisan_engineering_02,crafting_artisan_engineering_03,crafting_artisan_engineering_04,crafting_architect_novice,crafting_shipwright_novice,crafting_architect_production_01,crafting_architect_techniques_01,crafting_architect_harvesting_01,crafting_architect_blueprints_01,crafting_shipwright_engineering_01,crafting_shipwright_propulsion_01,crafting_shipwright_systems_01,crafting_shipwright_defense_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_architect_production_02,crafting_architect_techniques_02,crafting_architect_harvesting_02,crafting_architect_blueprints_02,crafting_shipwright_engineering_02,crafting_shipwright_propulsion_02,crafting_shipwright_systems_02,crafting_shipwright_defense_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_architect_production_03,crafting_architect_techniques_03,crafting_architect_harvesting_03,crafting_architect_blueprints_03,crafting_shipwright_engineering_03,crafting_shipwright_propulsion_03,crafting_shipwright_systems_03,crafting_shipwright_defense_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_architect_production_04,crafting_architect_techniques_04,crafting_architect_harvesting_04,crafting_architect_blueprints_04,crafting_shipwright_engineering_04,crafting_shipwright_propulsion_04,crafting_shipwright_systems_04,crafting_shipwright_defense_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_architect_master,crafting_shipwright_master,crafting_merchant_master false 0 +trader_1c trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_engineering_01,crafting_artisan_engineering_02,crafting_artisan_engineering_03,crafting_artisan_engineering_04,crafting_weaponsmith_novice,crafting_armorsmith_novice,crafting_weaponsmith_melee_01,crafting_weaponsmith_firearms_01,crafting_weaponsmith_munitions_01,crafting_weaponsmith_techniques_01,crafting_armorsmith_personal_01,crafting_armorsmith_heavy_01,crafting_armorsmith_deflectors_01,crafting_armorsmith_complexity_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_weaponsmith_melee_02,crafting_weaponsmith_firearms_02,crafting_weaponsmith_munitions_02,crafting_weaponsmith_techniques_02,crafting_armorsmith_personal_02,crafting_armorsmith_heavy_02,crafting_armorsmith_deflectors_02,crafting_armorsmith_complexity_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_weaponsmith_melee_03,crafting_weaponsmith_firearms_03,crafting_weaponsmith_munitions_03,crafting_weaponsmith_techniques_03,crafting_armorsmith_personal_03,crafting_armorsmith_heavy_03,crafting_armorsmith_deflectors_03,crafting_armorsmith_complexity_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_weaponsmith_melee_04,crafting_weaponsmith_firearms_04,crafting_weaponsmith_munitions_04,crafting_weaponsmith_techniques_04,crafting_armorsmith_personal_04,crafting_armorsmith_heavy_04,crafting_armorsmith_deflectors_04,crafting_armorsmith_complexity_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_weaponsmith_master,crafting_armorsmith_master,crafting_merchant_master false 0 +trader_1d trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_engineering_01,crafting_artisan_domestic_01,crafting_artisan_engineering_02,crafting_artisan_domestic_02,crafting_artisan_engineering_03,crafting_artisan_domestic_03,crafting_artisan_engineering_04,crafting_artisan_domestic_04,crafting_artisan_master,crafting_weaponsmith_novice,crafting_droidengineer_novice,crafting_droidengineer_production_01,crafting_droidengineer_techniques_01,crafting_droidengineer_refinement_01,crafting_droidengineer_blueprints_01,crafting_weaponsmith_melee_01,crafting_weaponsmith_firearms_01,crafting_weaponsmith_techniques_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_droidengineer_production_02,crafting_droidengineer_techniques_02,crafting_droidengineer_refinement_02,crafting_droidengineer_blueprints_02,crafting_weaponsmith_melee_02,crafting_weaponsmith_firearms_02,crafting_weaponsmith_techniques_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_droidengineer_production_03,crafting_droidengineer_techniques_03,crafting_droidengineer_refinement_03,crafting_droidengineer_blueprints_03,crafting_weaponsmith_melee_03,crafting_weaponsmith_firearms_03,crafting_weaponsmith_techniques_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_droidengineer_production_04,crafting_droidengineer_techniques_04,crafting_droidengineer_refinement_04,crafting_droidengineer_blueprints_04,crafting_weaponsmith_melee_04,crafting_weaponsmith_firearms_04,crafting_weaponsmith_techniques_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_droidengineer_master,crafting_merchant_master false 0 +space_pilot_rebel 0 pilot_rebel_navy_novice,pilot_rebel_navy_starships_01,pilot_rebel_navy_weapons_01,pilot_rebel_navy_procedures_01,pilot_rebel_navy_droid_01,pilot_rebel_navy_starships_02,pilot_rebel_navy_weapons_02,pilot_rebel_navy_procedures_02,pilot_rebel_navy_droid_02,pilot_rebel_navy_starships_03,pilot_rebel_navy_weapons_03,pilot_rebel_navy_procedures_03,pilot_rebel_navy_droid_03,pilot_rebel_navy_starships_04,pilot_rebel_navy_weapons_04,pilot_rebel_navy_procedures_04,pilot_rebel_navy_droid_04,pilot_rebel_navy_master false 0 +space_pilot_imperial 0 pilot_imperial_navy_novice,pilot_imperial_navy_starships_01,pilot_imperial_navy_weapons_01,pilot_imperial_navy_procedures_01,pilot_imperial_navy_droid_01,pilot_imperial_navy_starships_02,pilot_imperial_navy_weapons_02,pilot_imperial_navy_procedures_02,pilot_imperial_navy_droid_02,pilot_imperial_navy_starships_03,pilot_imperial_navy_weapons_03,pilot_imperial_navy_procedures_03,pilot_imperial_navy_droid_03,pilot_imperial_navy_starships_04,pilot_imperial_navy_weapons_04,pilot_imperial_navy_procedures_04,pilot_imperial_navy_droid_04,pilot_imperial_navy_master false 0 +space_pilot_neutral 0 pilot_neutral_novice,pilot_neutral_starships_01,pilot_neutral_weapons_01,pilot_neutral_procedures_01,pilot_neutral_droid_01,pilot_neutral_starships_02,pilot_neutral_weapons_02,pilot_neutral_procedures_02,pilot_neutral_droid_02,pilot_neutral_starships_03,pilot_neutral_weapons_03,pilot_neutral_procedures_03,pilot_neutral_droid_03,pilot_neutral_starships_04,pilot_neutral_weapons_04,pilot_neutral_procedures_04,pilot_neutral_droid_04,pilot_neutral_master false 0 +politician 0 social_politician_novice,social_politician_fiscal_01,social_politician_fiscal_02,social_politician_fiscal_03,social_politician_fiscal_04,social_politician_martial_01,social_politician_martial_02,social_politician_martial_03,social_politician_martial_04,social_politician_civic_01,social_politician_civic_02,social_politician_civic_03,social_politician_civic_04,social_politician_urban_01,social_politician_urban_02,social_politician_urban_03,social_politician_urban_04,social_politician_master false 0 +chronicles 0 class_chronicles_novice,class_chronicles_1,class_chronicles_2,class_chronicles_3,class_chronicles_4,class_chronicles_5,class_chronicles_6,class_chronicles_7,class_chronicles_8,class_chronicles_9,class_chronicles_10,class_chronicles_11,class_chronicles_12,class_chronicles_13,class_chronicles_14,class_chronicles_15,class_chronicles_16,class_chronicles_master true 0 diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DataLoader.java b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DataLoader.java index 4c5721db..e0694be1 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DataLoader.java +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/DataLoader.java @@ -1,5 +1,6 @@ package com.projectswg.holocore.resources.support.data.server_info.loader; +import com.projectswg.holocore.resources.support.data.server_info.loader.SkillTemplateLoader.SkillTemplateInfo; import com.projectswg.holocore.resources.support.data.server_info.loader.npc.*; import me.joshlarson.jlcommon.log.Log; @@ -49,10 +50,22 @@ public abstract class DataLoader { return getInstance(SkillLoader.class, SkillLoader::new); } + public static SkillTemplateLoader skillTemplates() { + return getInstance(SkillTemplateLoader.class, SkillTemplateLoader::new); + } + public static PlayerLevelLoader playerLevels() { return getInstance(PlayerLevelLoader.class, PlayerLevelLoader::new); } + public static PlayerRoleLoader playerRoles() { + return getInstance(PlayerRoleLoader.class, PlayerRoleLoader::new); + } + + public static RoadmapRewardLoader roadmapRewards() { + return getInstance(RoadmapRewardLoader.class, RoadmapRewardLoader::new); + } + public static BuildoutLoader buildouts() { return BuildoutLoader.load(List.of()); } diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/PlayerRoleLoader.java b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/PlayerRoleLoader.java index 72b2f3e5..80752bf8 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/PlayerRoleLoader.java +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/PlayerRoleLoader.java @@ -29,14 +29,31 @@ package com.projectswg.holocore.resources.support.data.server_info.loader; import com.projectswg.holocore.resources.support.data.server_info.SdbLoader; import com.projectswg.holocore.resources.support.data.server_info.SdbLoader.SdbResultSet; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public final class PlayerRoleLoader extends DataLoader { + private final Map rolesByIndex; + private final Map rolesBySkill; + PlayerRoleLoader() { - + this.rolesByIndex = new HashMap<>(); + this.rolesBySkill = new HashMap<>(); + } + + @Nullable + public RoleInfo getRoleByIndex(int index) { + return rolesByIndex.get(index); + } + + @Nullable + public RoleInfo getRoleBySkill(String skill) { + return rolesBySkill.get(skill); } @Override @@ -44,7 +61,8 @@ public final class PlayerRoleLoader extends DataLoader { try (SdbResultSet set = SdbLoader.load(new File("serverdata/player/role.sdb"))) { while (set.next()) { RoleInfo role = new RoleInfo(set); - // TODO: Store information + rolesByIndex.put(role.getIndex(), role); + rolesBySkill.put(role.getQualifyingSkill(), role); } } } @@ -60,5 +78,18 @@ public final class PlayerRoleLoader extends DataLoader { this.roleIcon = set.getText("role_icon"); this.qualifyingSkill = set.getText("qualifying_skill"); } + + public int getIndex() { + return index; + } + + public String getRoleIcon() { + return roleIcon; + } + + public String getQualifyingSkill() { + return qualifyingSkill; + } + } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/RoadmapRewardLoader.java b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/RoadmapRewardLoader.java index 3263ba11..2ca29ab0 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/RoadmapRewardLoader.java +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/RoadmapRewardLoader.java @@ -29,14 +29,25 @@ package com.projectswg.holocore.resources.support.data.server_info.loader; import com.projectswg.holocore.resources.support.data.server_info.SdbLoader; import com.projectswg.holocore.resources.support.data.server_info.SdbLoader.SdbResultSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public final class RoadmapRewardLoader extends DataLoader { + private final Map rewardsBySkillName; + RoadmapRewardLoader() { - + this.rewardsBySkillName = new HashMap<>(); + } + + @Nullable + public RoadmapRewardInfo getRewardBySkillName(String skillName) { + return rewardsBySkillName.get(skillName); } @Override @@ -44,29 +55,71 @@ public final class RoadmapRewardLoader extends DataLoader { try (SdbResultSet set = SdbLoader.load(new File("serverdata/roadmap/item_rewards.sdb"))) { while (set.next()) { RoadmapRewardInfo rewardInfo = new RoadmapRewardInfo(set); - // TODO: Store information + rewardsBySkillName.put(rewardInfo.getSkillName(), rewardInfo); } } } public static class RoadmapRewardInfo { - private final String roadmapTemplateName; - private final String roadmapSkillName; + private final String templateName; + private final String skillName; private final String appearanceName; private final String stringId; - private final String itemDefault; - private final String itemWookiee; - private final String itemIthorian; + private final String [] defaultItems; + private final String [] wookieeItems; + private final String [] ithorianItems; public RoadmapRewardInfo(SdbResultSet set) { - this.roadmapTemplateName = set.getText("roadmap_template_name"); - this.roadmapSkillName = set.getText("roadmap_skill_name"); + this.templateName = set.getText("roadmap_template_name"); + this.skillName = set.getText("roadmap_skill_name"); this.appearanceName = set.getText("appearance_name"); this.stringId = set.getText("string_id"); - this.itemDefault = set.getText("item_default"); - this.itemWookiee = set.getText("item_wookiee"); - this.itemIthorian = set.getText("item_ithorian"); + this.defaultItems = splitCsv(set.getText("item_default")); + this.wookieeItems = splitCsv(set.getText("item_wookiee")); + this.ithorianItems = splitCsv(set.getText("item_ithorian")); } + + @NotNull + public String getTemplateName() { + return templateName; + } + + @NotNull + public String getSkillName() { + return skillName; + } + + @NotNull + public String getAppearanceName() { + return appearanceName; + } + + @NotNull + public String getStringId() { + return stringId; + } + + @NotNull + public String[] getDefaultItems() { + return defaultItems.clone(); + } + + @NotNull + public String[] getWookieeItems() { + return wookieeItems.clone(); + } + + @NotNull + public String[] getIthorianItems() { + return ithorianItems.clone(); + } + + private static String [] splitCsv(String val) { + if (val.isBlank()) + return new String[0]; + return val.split(","); + } + } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SkillTemplateLoader.java b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SkillTemplateLoader.java index d4c99e97..3f476105 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SkillTemplateLoader.java +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/SkillTemplateLoader.java @@ -29,46 +29,95 @@ package com.projectswg.holocore.resources.support.data.server_info.loader; import com.projectswg.holocore.resources.support.data.server_info.SdbLoader; import com.projectswg.holocore.resources.support.data.server_info.SdbLoader.SdbResultSet; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public final class SkillTemplateLoader extends DataLoader { + private final Map templateFromName; + SkillTemplateLoader() { - + this.templateFromName = new HashMap<>(); + } + + @Nullable + public SkillTemplateInfo getTemplateFromName(String name) { + return templateFromName.get(name); } @Override public final void load() throws IOException { try (SdbResultSet set = SdbLoader.load(new File("serverdata/skill/skill_template.sdb"))) { while (set.next()) { - SkillTemplateInfo skillTemplate = new SkillTemplateInfo(set); - // TODO: Store information + SkillTemplateInfo templateInfo = new SkillTemplateInfo(set); + templateFromName.put(templateInfo.getName(), templateInfo); } } } public static class SkillTemplateInfo { - private final String templateName; - private final String startingTemplateName; - private final String strClassName; - private final int userInterfacePriority; - private final String template; + private final String name; + private final String startingName; + private final String className; + private final int uiPriority; + private final String [] templates; private final boolean levelBased; private final String expertiseTrees; - private final int respecAllowed; + private final boolean respecAllowed; public SkillTemplateInfo(SdbResultSet set) { - this.templateName = set.getText("template_name"); - this.startingTemplateName = set.getText("starting_template_name"); - this.strClassName = set.getText("str_class_name"); - this.userInterfacePriority = (int) set.getInt("user_interface_priority"); - this.template = set.getText("template"); + this.name = set.getText("template_name"); + this.startingName = set.getText("starting_template_name"); + this.className = set.getText("str_class_name"); + this.uiPriority = (int) set.getInt("user_interface_priority"); + this.templates = splitCsv(set.getText("template")); this.levelBased = set.getBoolean("level_based"); this.expertiseTrees = set.getText("expertise_trees"); - this.respecAllowed = (int) set.getInt("respec_allowed"); + this.respecAllowed = set.getInt("respec_allowed") != 0; } + + public String getName() { + return name; + } + + public String getStartingName() { + return startingName; + } + + public String getClassName() { + return className; + } + + public int getUiPriority() { + return uiPriority; + } + + public String [] getTemplates() { + return templates.clone(); + } + + public boolean isLevelBased() { + return levelBased; + } + + public String getExpertiseTrees() { + return expertiseTrees; + } + + public boolean isRespecAllowed() { + return respecAllowed; + } + + private static String [] splitCsv(String val) { + if (val.isBlank()) + return new String[0]; + return val.split(","); + } + } } diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/ExperienceRoleService.java b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/ExperienceRoleService.java index cdf74628..b25cbfcf 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/ExperienceRoleService.java +++ b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/ExperienceRoleService.java @@ -1,42 +1,22 @@ package com.projectswg.holocore.services.gameplay.player.experience; -import com.projectswg.common.data.swgfile.ClientFactory; -import com.projectswg.common.data.swgfile.visitors.DatatableData; import com.projectswg.common.network.packets.SWGPacket; import com.projectswg.common.network.packets.swg.zone.object_controller.ChangeRoleIconChoice; +import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent; +import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent.IntentType; import com.projectswg.holocore.intents.support.global.network.InboundPacketIntent; +import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader; +import com.projectswg.holocore.resources.support.data.server_info.loader.PlayerRoleLoader.RoleInfo; import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject; import me.joshlarson.jlcommon.control.IntentHandler; import me.joshlarson.jlcommon.control.Service; import me.joshlarson.jlcommon.log.Log; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - public class ExperienceRoleService extends Service { - private final Map> roleIconMap; - public ExperienceRoleService() { - roleIconMap = new HashMap<>(); - } - - @Override - public boolean initialize() { - DatatableData roleIconTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/role/role.iff"); - for (int i = 0; i < roleIconTable.getRowCount(); i++) { - int iconIndex = (int) roleIconTable.getCell(i, 0); - String qualifyingSkill = (String) roleIconTable.getCell(i, 2); - - Set qualifyingSkills = roleIconMap.computeIfAbsent(iconIndex, k -> new HashSet<>()); - - qualifyingSkills.add(qualifyingSkill); - } - return true; } @IntentHandler @@ -48,8 +28,23 @@ public class ExperienceRoleService extends Service { } } + @IntentHandler + private void handleGrantSkillIntent(GrantSkillIntent gsi) { + if (gsi.getIntentType() != IntentType.GIVEN) + return; + + RoleInfo qualifyingSkills = DataLoader.playerRoles().getRoleBySkill(gsi.getSkillName()); + if (qualifyingSkills == null) + return; + + PlayerObject playerObject = gsi.getTarget().getPlayerObject(); + assert playerObject != null; + + playerObject.setProfessionIcon(qualifyingSkills.getIndex()); + } + private void changeRoleIcon(CreatureObject creature, int chosenIcon) { - Set qualifyingSkills = roleIconMap.get(chosenIcon); + RoleInfo qualifyingSkills = DataLoader.playerRoles().getRoleByIndex(chosenIcon); if (qualifyingSkills == null) { Log.w("%s tried to use undefined role icon %d", creature, chosenIcon); return; @@ -57,13 +52,8 @@ public class ExperienceRoleService extends Service { PlayerObject playerObject = creature.getPlayerObject(); assert playerObject != null; - for (String qualifyingSkill : qualifyingSkills) { - if (creature.hasSkill(qualifyingSkill)) { - playerObject.setProfessionIcon(chosenIcon); - return; - } - } - Log.e("%s could not be given role icon %d - does not have qualifying skill! Qualifying: %s", creature, chosenIcon, qualifyingSkills); + if (creature.hasSkill(qualifyingSkills.getQualifyingSkill())) + playerObject.setProfessionIcon(qualifyingSkills.getIndex()); } } 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 1822bc2e..ed569fc4 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 @@ -1,7 +1,6 @@ package com.projectswg.holocore.services.gameplay.player.experience.skills; import com.projectswg.holocore.intents.gameplay.player.badge.SetTitleIntent; -import com.projectswg.holocore.intents.gameplay.player.experience.LevelChangedIntent; import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent; import com.projectswg.holocore.intents.gameplay.player.experience.skills.SkillModIntent; import com.projectswg.holocore.resources.support.data.server_info.StandardLog; @@ -10,6 +9,7 @@ import com.projectswg.holocore.resources.support.data.server_info.loader.SkillLo import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; import me.joshlarson.jlcommon.control.IntentHandler; import me.joshlarson.jlcommon.control.Service; +import me.joshlarson.jlcommon.log.Log; public class SkillService extends Service { @@ -26,6 +26,7 @@ public class SkillService extends Service { String skillName = gsi.getSkillName(); CreatureObject target = gsi.getTarget(); SkillInfo skillData = DataLoader.skills().getSkillByName(skillName); + Log.t("skillData=%s", skillData); if (skillData == null) return; @@ -60,11 +61,6 @@ public class SkillService extends Service { sti.getRequester().setTitle(title); } - @IntentHandler - private void handleLevelChangedIntent(LevelChangedIntent lci) { - - } - private boolean hasRequiredSkills(SkillInfo skillData, CreatureObject creatureObject) { String[] requiredSkills = skillData.getSkillsRequired(); if (requiredSkills == null) diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillTemplateService.java b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillTemplateService.java index cc5ad352..8631a41f 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillTemplateService.java +++ b/src/main/java/com/projectswg/holocore/services/gameplay/player/experience/skills/SkillTemplateService.java @@ -29,8 +29,6 @@ package com.projectswg.holocore.services.gameplay.player.experience.skills; import com.projectswg.common.data.RGB; import com.projectswg.common.data.encodables.oob.StringId; import com.projectswg.common.data.encodables.tangible.Race; -import com.projectswg.common.data.swgfile.ClientFactory; -import com.projectswg.common.data.swgfile.visitors.DatatableData; import com.projectswg.common.network.packets.swg.zone.PlayClientEffectObjectMessage; import com.projectswg.common.network.packets.swg.zone.PlayMusicMessage; import com.projectswg.common.network.packets.swg.zone.object_controller.ShowFlyText; @@ -40,9 +38,11 @@ import com.projectswg.holocore.intents.gameplay.player.experience.LevelChangedIn import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent; import com.projectswg.holocore.intents.support.objects.items.CreateStaticItemIntent; import com.projectswg.holocore.intents.support.objects.swg.ObjectCreatedIntent; +import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader; +import com.projectswg.holocore.resources.support.data.server_info.loader.RoadmapRewardLoader.RoadmapRewardInfo; +import com.projectswg.holocore.resources.support.data.server_info.loader.SkillTemplateLoader.SkillTemplateInfo; import com.projectswg.holocore.resources.support.global.player.Player; import com.projectswg.holocore.resources.support.objects.ObjectCreator; -import com.projectswg.holocore.resources.support.objects.items.RoadmapReward; import com.projectswg.holocore.resources.support.objects.swg.SWGObject; import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject; @@ -52,10 +52,7 @@ import me.joshlarson.jlcommon.control.IntentHandler; import me.joshlarson.jlcommon.control.Service; import me.joshlarson.jlcommon.log.Log; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * This is a service that listens for {@link LevelChangedIntent} and grants @@ -64,14 +61,9 @@ import java.util.Map; */ public final class SkillTemplateService extends Service { - private final Map skillTemplates; - private final Map rewards; private final Map badgeNames; public SkillTemplateService() { - skillTemplates = new HashMap<>(); - rewards = new HashMap<>(); - badgeNames = new HashMap<>(); badgeNames.put("bounty_hunter_1a", new String[]{"new_prof_bountyhunter_master"}); badgeNames.put("commando_1a", new String[]{"new_prof_commando_master"}); @@ -87,22 +79,6 @@ public final class SkillTemplateService extends Service { badgeNames.put("trader_0c", new String[]{"new_prof_crafting_merchant_master", "new_prof_crafting_artisan_master", "new_prof_crafting_armorsmith_master", "new_prof_crafting_weaponsmith_master"}); badgeNames.put("trader_0d", new String[]{"new_prof_crafting_merchant_master", "new_prof_crafting_artisan_master", "new_prof_crafting_droidengineer_master"}); } - - @Override - public boolean initialize() { - DatatableData skillTemplateTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/skill_template/skill_template.iff"); - - for (int row = 0; row < skillTemplateTable.getRowCount(); row++) { - String profession = (String) skillTemplateTable.getCell(row, 0); - String[] templates = ((String) skillTemplateTable.getCell(row, 4)).split(","); - - skillTemplates.put(profession, templates); - } - - loadRewardItemsIff(); - - return super.initialize(); - } @IntentHandler private void handleLevelChangedIntent(LevelChangedIntent lci) { @@ -115,10 +91,10 @@ public final class SkillTemplateService extends Service { for (int level = oldLevel + 1; level <= newLevel; level++) { // Skills are only awarded every third or fourth level - if ((level == 4 || level == 7 || level == 10) || ((level > 10) && (((level - 10) % 4) == 0))) { + if ((level == 1 || level == 4 || level == 7 || level == 10) || ((level > 10) && (((level - 10) % 4) == 0))) { PlayerObject playerObject = creatureObject.getPlayerObject(); Profession profession = playerObject.getProfession(); - String[] templates = skillTemplates.get(profession.getClientName()); + SkillTemplateInfo templates = DataLoader.skillTemplates().getTemplateFromName(profession.getClientName()); if (templates == null) { Log.w("%s tried to level up to %d with invalid profession %s", creatureObject, level, profession); @@ -127,7 +103,7 @@ public final class SkillTemplateService extends Service { int skillIndex = (level <= 10) ? ((level - 1) / 3) : (((level - 10) / 4) + 3); - String skillName = templates[skillIndex]; + String skillName = templates.getTemplates()[skillIndex]; new GrantSkillIntent(GrantSkillIntent.IntentType.GRANT, skillName, creatureObject, true).broadcast(); playerObject.setProfWheelPosition(skillName); @@ -161,57 +137,37 @@ public final class SkillTemplateService extends Service { } private void giveRewardItems(CreatureObject creatureObject, String skillName) { - RoadmapReward reward = rewards.get(skillName); + RoadmapRewardInfo reward = DataLoader.roadmapRewards().getRewardBySkillName(skillName); + if (reward == null) + return; // No reward to give + Race characterRace = creatureObject.getRace(); - String species = characterRace.getSpecies().toUpperCase(); + String species = characterRace.getSpecies().toUpperCase(Locale.US); SWGObject inventory = creatureObject.getSlottedObject("inventory"); String[] items; - if (reward.hasItems() || reward.isUniversalReward()) { - if (reward.isUniversalReward()) - items = reward.getDefaultRewardItems(); - else if (species.equals("ITHORIAN")) - items = reward.getIthorianRewardItems(); - else if (species.equals("WOOKIEE")) - items = reward.getWookieeRewardItems(); - else - items = reward.getDefaultRewardItems(); + if (species.equals("ITHORIAN") && reward.getIthorianItems().length > 0) + items = reward.getIthorianItems(); + else if (species.equals("WOOKIEE") && reward.getWookieeItems().length > 0) + items = reward.getWookieeItems(); + else + items = reward.getDefaultItems(); - Collection staticItems = new ArrayList<>(); - - for (String item : items) { - if (item.endsWith(".iff")) { - SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(ClientFactory.formatToSharedFile(item)); - - if (nonStaticItem != null) { - nonStaticItem.moveToContainer(inventory); - } - new ObjectCreatedIntent(nonStaticItem).broadcast(); - } else { - staticItems.add(item); - } - } - - // No reason to broadcast this intent if we don't need new static items anyways - if (!staticItems.isEmpty()) - new CreateStaticItemIntent(creatureObject, inventory, new StaticItemService.LootBoxHandler(creatureObject), staticItems.toArray(new String[0])).broadcast(); - } - } - - private void loadRewardItemsIff() { - DatatableData rewardsTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/roadmap/item_rewards.iff"); + Collection staticItems = new ArrayList<>(); - for (int row = 0; row < rewardsTable.getRowCount(); row++) { - String roadmapTemplate = rewardsTable.getCell(row, 0).toString(); - String roadmapSkillName = rewardsTable.getCell(row, 1).toString(); - String appearanceName = rewardsTable.getCell(row, 2).toString(); - String stringId = rewardsTable.getCell(row, 3).toString(); - String itemDefault = rewardsTable.getCell(row, 4).toString(); - String itemWookiee = rewardsTable.getCell(row, 5).toString(); - String itemIthorian = rewardsTable.getCell(row, 6).toString(); - - rewards.put(roadmapSkillName, new RoadmapReward(roadmapTemplate, roadmapSkillName, appearanceName, stringId, itemDefault, itemWookiee, itemIthorian)); + for (String item : items) { + if (item.endsWith(".iff")) { + SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(item); + nonStaticItem.moveToContainer(inventory); + new ObjectCreatedIntent(nonStaticItem).broadcast(); + } else { + staticItems.add(item); + } } + + // No reason to broadcast this intent if we don't need new static items anyways + if (!staticItems.isEmpty()) + new CreateStaticItemIntent(creatureObject, inventory, new StaticItemService.LootBoxHandler(creatureObject), staticItems.toArray(String[]::new)).broadcast(); } private void grantMasteryBadge(CreatureObject creature, Profession profession, String skillName) { diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TestSkillTemplateService.java b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TestSkillTemplateService.java new file mode 100644 index 00000000..68f43fee --- /dev/null +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TestSkillTemplateService.java @@ -0,0 +1,58 @@ +/*********************************************************************************** + * Copyright (c) 2019 /// 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.services.gameplay.player.experience; + +import com.projectswg.holocore.intents.gameplay.player.experience.LevelChangedIntent; +import com.projectswg.holocore.resources.support.objects.swg.player.Profession; +import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService; +import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillTemplateService; +import com.projectswg.holocore.test.resources.GenericCreatureObject; +import com.projectswg.holocore.test.runners.TestRunnerSynchronousIntents; +import org.junit.Assert; +import org.junit.Test; + +public class TestSkillTemplateService extends TestRunnerSynchronousIntents { + + @Test + public void testStartingProfessionIcon() { + registerService(new SkillService()); + registerService(new SkillTemplateService()); + registerService(new ExperienceRoleService()); + + GenericCreatureObject creature = new GenericCreatureObject(1); + creature.setLevel(0); + creature.getPlayerObject().setProfession(Profession.SMUGGLER); + Assert.assertEquals(0, creature.getPlayerObject().getProfessionIcon()); + + creature.setLevel(1); + broadcastAndWait(new LevelChangedIntent(creature, (short) 0, (short) 1)); + Assert.assertEquals(25, creature.getPlayerObject().getProfessionIcon()); + Assert.assertTrue(creature.getSkills().contains("class_smuggler_phase1_novice")); + } + +}