diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..34d04fbb1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: BUG +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Perform this commad '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [Windows or Linux] + +**Additional context** +Add any other context about the problem here. diff --git a/.idea/copyright/Holocore.xml b/.idea/copyright/Holocore.xml index 9c6aaef28..3cf9fad5a 100644 --- a/.idea/copyright/Holocore.xml +++ b/.idea/copyright/Holocore.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/copyright/PSWGCommon.xml b/.idea/copyright/PSWGCommon.xml index 8418d9cba..f6adf2550 100644 --- a/.idea/copyright/PSWGCommon.xml +++ b/.idea/copyright/PSWGCommon.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 20d4c4b5b..869c34c56 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -82,7 +82,7 @@ dependencies { utilityImplementation(project(":")) utilityImplementation(project(":pswgcommon")) - val junit5Version = "5.10.1" + val junit5Version = "5.10.3" testImplementation(group="org.junit.jupiter", name="junit-jupiter-api", version=junit5Version) testRuntimeOnly(group="org.junit.jupiter", name="junit-jupiter-engine", version=junit5Version) testRuntimeOnly(group="org.junit.platform", name="junit-platform-launcher", version="1.10.1") diff --git a/docker-compose.yml b/docker-compose.yml index 6a6703231..649199154 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,7 +30,7 @@ services: ME_CONFIG_BASICAUTH_USERNAME: "" ME_CONFIG_BASICAUTH_PASSWORD: "" healthcheck: - test: "wget -O - localhost:8081" + test: "wget -O - 127.0.0.1:8081" interval: 5s timeout: 5s retries: 5 diff --git a/serverdata/conversation/cybernetics.sdb b/serverdata/conversation/cybernetics.sdb new file mode 100644 index 000000000..3d2ee99fc --- /dev/null +++ b/serverdata/conversation/cybernetics.sdb @@ -0,0 +1,3 @@ +conversation_id conversation_file +TEXT TEXT +cybernetics cybernetics/start \ No newline at end of file diff --git a/serverdata/conversation/cybernetics/install.json b/serverdata/conversation/cybernetics/install.json new file mode 100644 index 000000000..ad6ac4aee --- /dev/null +++ b/serverdata/conversation/cybernetics/install.json @@ -0,0 +1,15 @@ +{ + "npcMessage": { + "file": "conversation/cyborg_install_naboo", + "key": "s_195", + "comment": "I see. I don't know where you got that, but I suppose I could go ahead and install it for you." + }, + "playerResponses": [], + "requirements": [], + "events": [ + { + "type": "show_sellable_items", + "args": {} + } + ] +} \ No newline at end of file diff --git a/serverdata/conversation/cybernetics/remove.json b/serverdata/conversation/cybernetics/remove.json new file mode 100644 index 000000000..1b37d5d74 --- /dev/null +++ b/serverdata/conversation/cybernetics/remove.json @@ -0,0 +1,15 @@ +{ + "npcMessage": { + "file": "conversation/cyborg_install_naboo", + "key": "s_42", + "comment": "What would you like for me to remove?" + }, + "playerResponses": [], + "requirements": [], + "events": [ + { + "type": "show_sellable_items", + "args": {} + } + ] +} \ No newline at end of file diff --git a/serverdata/conversation/cybernetics/repair.json b/serverdata/conversation/cybernetics/repair.json new file mode 100644 index 000000000..3b7612ddf --- /dev/null +++ b/serverdata/conversation/cybernetics/repair.json @@ -0,0 +1,15 @@ +{ + "npcMessage": { + "file": "conversation/cyborg_install_naboo", + "key": "s_46", + "comment": "I see. What do you need repaired?" + }, + "playerResponses": [], + "requirements": [], + "events": [ + { + "type": "show_sellable_items", + "args": {} + } + ] +} \ No newline at end of file diff --git a/serverdata/conversation/cybernetics/start.json b/serverdata/conversation/cybernetics/start.json new file mode 100644 index 000000000..6613e0105 --- /dev/null +++ b/serverdata/conversation/cybernetics/start.json @@ -0,0 +1,42 @@ +{ + "npcMessage": { + "file": "conversation/cyborg_install_naboo", + "key": "s_192", + "comment": "The Empire has banned the installation of cybernetic enhancements for non-emergency reasons. We don't have any cybernetic enhancements here that I could install." + }, + "playerResponses": [ + { + "playerMessage": { + "file": "conversation/cyborg_install_naboo", + "key": "s_34", + "comment": "Install cybernetics." + }, + "next": "cybernetics/install" + }, + { + "playerMessage": { + "file": "conversation/cyborg_install_naboo", + "key": "s_44", + "comment": "Repair cybernetics." + }, + "next": "cybernetics/repair" + }, + { + "playerMessage": { + "file": "conversation/cyborg_install_naboo", + "key": "s_40", + "comment": "Remove cybernetics." + }, + "next": "cybernetics/remove" + } + ], + "requirements": [], + "events": [ + { + "type": "npc_animation", + "args": { + "animation": "survey" + } + } + ] +} \ No newline at end of file diff --git a/serverdata/conversation/spawn_conversation_map.msdb b/serverdata/conversation/spawn_conversation_map.msdb index 60d89eee8..462a49d3c 100644 --- a/serverdata/conversation/spawn_conversation_map.msdb +++ b/serverdata/conversation/spawn_conversation_map.msdb @@ -4,6 +4,7 @@ bartender.sdb TRUE chassis_dealer.sdb TRUE cloning_droid.sdb TRUE commoner.sdb TRUE +cybernetics.sdb TRUE junk_dealer.sdb TRUE recruiter.sdb TRUE droids.sdb TRUE diff --git a/serverdata/conversation/tatooine_mos_eisley_bib_fortuna/start.json b/serverdata/conversation/tatooine_mos_eisley_bib_fortuna/start.json index 11cfe6488..d39fb9e45 100644 --- a/serverdata/conversation/tatooine_mos_eisley_bib_fortuna/start.json +++ b/serverdata/conversation/tatooine_mos_eisley_bib_fortuna/start.json @@ -1,8 +1,8 @@ { "npcMessage": { - "file": "conversation/bib_fortuna_mos_eisley", - "key": "s_195", - "comment": "I'm waiting for someone at the moment and it isn't you." + "file": "conversation/bib_newbie_quest_1", + "key": "bib_24", + "comment": "I don't have any work for you right now. Come back later." }, "playerResponses": [], "requirements": [], diff --git a/serverdata/conversation/tatooine_mos_eisley_cheated_gambler/hear.json b/serverdata/conversation/tatooine_mos_eisley_cheated_gambler/hear.json index 5df987775..2ad451d5c 100644 --- a/serverdata/conversation/tatooine_mos_eisley_cheated_gambler/hear.json +++ b/serverdata/conversation/tatooine_mos_eisley_cheated_gambler/hear.json @@ -1,8 +1,8 @@ { "npcMessage": { "file": "conversation/ep3_cheated_gambler", - "key": "s_347", - "comment": "What do you want? Just go away." + "key": "s_305", + "comment": "Well, at least I still have that." }, "playerResponses": [], "requirements": [], diff --git a/serverdata/cybernetics/cybernetics.sdb b/serverdata/cybernetics/cybernetics.sdb new file mode 100644 index 000000000..c62e191bb --- /dev/null +++ b/serverdata/cybernetics/cybernetics.sdb @@ -0,0 +1,14 @@ +template comment hue protection condition procEffect reacEffect moveRateBuff throwRangeMod rangedRangeMod healingMod rangedAccuracyMod meleeDefMod meleeAccuracyMod commandoLegs specialCommand installCost repairCost removeCost +TEXT TEXT INTEGER FLOAT FLOAT TEXT TEXT TEXT INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER TEXT INTEGER INTEGER INTEGER +object/tangible/wearables/cybernetic/s01/cybernetic_s01_arm_l.iff death penalty 0 0 40000 0 1 1000 +object/tangible/wearables/cybernetic/s01/cybernetic_s01_arm_r.iff death penalty 0 0 40000 0 1 1000 +object/tangible/wearables/cybernetic/s01/cybernetic_s01_legs.iff death penalty 0 0 40000 0 1 1000 +object/tangible/wearables/cybernetic/s02/cybernetic_s02_arm_l.iff lowered melee defense, increased melee accuracy 110 0.8 40000 cyborgStrengthBuff 5000 1 5000 +object/tangible/wearables/cybernetic/s02/cybernetic_s02_arm_r.iff cyber_shock proc 110 0.8 40000 proc_cyber_shock cyborgLightning 5000 2 5000 +object/tangible/wearables/cybernetic/s02/cybernetic_s02_legs.iff runspeed buff, low armor 110 0.8 40000 cyberneticLegs cyborgBurstRun 5000 3 5000 +object/tangible/wearables/cybernetic/s03/cybernetic_s03_arm_l.iff increased healing mod, lowered accuracy 22 0.8 40000 cyborgRevive 5000 1 5000 +object/tangible/wearables/cybernetic/s03/cybernetic_s03_arm_r.iff increased trap throw range, lower Other combat mods 119 0.95 40000 5000 2 5000 +object/tangible/wearables/cybernetic/s04/cybernetic_s04_arm_r.iff Reverse Engineering Arm 1 0 40000 5000 2 5000 +object/tangible/wearables/cybernetic/s05/cybernetic_s05_arm_l.iff increase range, increased ranged accuracy, lowered melee defense, lowered melee accuracy 38 0.8 40000 cyborgSureShot 5000 3 5000 +object/tangible/wearables/cybernetic/s05/cybernetic_s05_arm_r.iff increased range, lowered accuracy 38 0.8 40000 cyborgCriticalSnipe 5000 1 5000 +object/tangible/wearables/cybernetic/s05/cybernetic_s05_legs.iff fire heavy weapons from standing, lowered throw range, lowered accuracy, lowered defense 38 0.8 40000 cyborgKickDown 5000 2 5000 \ No newline at end of file diff --git a/serverdata/items/items_weapon_cu.sdb b/serverdata/items/items_weapon_cu.sdb index ba2dc0c5c..bd7c4d867 100644 --- a/serverdata/items/items_weapon_cu.sdb +++ b/serverdata/items/items_weapon_cu.sdb @@ -1,287 +1,288 @@ item_name string_name iff_template type volume hit_points weapon_category weapon_type min_damage max_damage damage_type elemental_type elemental_damage attack_speed special_attack_cost min_range_distance max_range_distance proc_effect lifespan required_faction required_level required_skill skill_mods accuracy_bonus wound_chance splash_damage radius no_trade bio_link deconstruct sockets value isUnique charges comments TEXT PRIMARY KEY TEXT TEXT NOT NULL TEXT INTEGER INTEGER TEXT TEXT INTEGER INTEGER TEXT TEXT INTEGER FLOAT INTEGER INTEGER INTEGER TEXT INTEGER TEXT INTEGER TEXT TEXT INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER TEXT -axe_heavy_duty Heavy Axe object/weapon/melee/axe/axe_heavy_duty.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 22 85 kinetic 0 3 140 0 5 0 1 0 20 0 0 0 0 0 0 100 0 0 - -axe_vibro Vibro Axe object/weapon/melee/axe/axe_vibroaxe.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 148 645 kinetic 0 3 140 0 5 0 30 0 14 0 0 0 0 0 0 3000 0 0 - -baton_gaderiffi Gaderiffi Baton object/weapon/melee/baton/baton_gaderiffi.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 63 310 kinetic 0 2.5 120 0 5 0 14 0 21 0 0 0 0 0 0 1400 0 0 - -baton_stun Stun Baton object/weapon/melee/baton/baton_stun.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 160 762 energy electricity 65 2.5 120 0 5 0 54 combat_1hsword_master 0 3 0 0 0 0 0 0 5400 0 0 - -blacksun_razor Black Sun Razor Knuckler object/weapon/melee/special/blacksun_razor.iff weapon 1 1000 melee_weapon UNARMED 177 825 energy 0 2.5 120 0 5 0 54 combat_unarmed_master 0 28 0 0 0 0 0 0 5400 0 0 - -carbine_alliance_needler Alliance Needler Carbine object/weapon/ranged/carbine/carbine_alliance_needler.iff weapon 1 1000 ranged_weapon CARBINE 117 590 kinetic 0 2.75 130 0 50 0 30 0 16 0 0 0 0 0 0 3000 0 0 - -carbine_bothan_bola Bothan Bola Carbine object/weapon/ranged/carbine/carbine_bothan_bola.iff weapon 1 1000 ranged_weapon CARBINE 144 695 energy 0 2.75 130 0 50 0 40 0 23 0 0 0 0 0 0 4000 0 0 - -carbine_cdef CDEF Carbine object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 20 77 energy 0 2.75 130 0 35 0 1 0 5 0 0 0 0 0 0 100 0 0 - -carbine_cdef_corsec Corsec CDEF Carbine object/weapon/ranged/carbine/carbine_cdef_corsec.iff weapon 1 1000 ranged_weapon CARBINE 22 85 energy 0 2.75 130 0 35 0 1 0 4 0 0 0 0 0 0 100 0 0 - -carbine_czerka Czerka Dart Carbine object/weapon/ranged/carbine/carbine_czerka_dart.iff weapon 1 1000 ranged_weapon CARBINE 172 810 kinetic 0 2.75 130 0 50 0 50 combat_bountyhunter_droidcontrol_04 0 16 0 0 0 0 0 0 5000 0 0 - -carbine_dc15 DC15 Carbine object/weapon/ranged/carbine/ep3/carbine_dc15.iff weapon 1 1000 ranged_weapon CARBINE 204 935 energy 0 2.75 130 0 35 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -carbine_dh17 DH17 Carbine object/weapon/ranged/carbine/carbine_dh17.iff weapon 1 1000 ranged_weapon CARBINE 23 94 energy 0 2.75 130 0 30 0 6 0 15 0 0 0 0 0 0 600 0 0 - -carbine_dh17_short DH17 Short Carbine object/weapon/ranged/carbine/carbine_dh17_snubnose.iff weapon 1 1000 ranged_weapon CARBINE 33 185 energy 0 2.75 130 0 35 0 10 0 12 0 0 0 0 0 0 1000 0 0 - -carbine_dxr6 DXR6 Carbine object/weapon/ranged/carbine/carbine_dxr6.iff weapon 1 1000 ranged_weapon CARBINE 164 773 energy 0 2.75 130 0 50 0 40 0 20 0 0 0 0 0 0 4000 0 0 - -carbine_e11 E11 Carbine object/weapon/ranged/carbine/carbine_e11.iff weapon 1 1000 ranged_weapon CARBINE 57 345 energy 0 2.75 130 0 40 0 14 0 13 0 0 0 0 0 0 1400 0 0 - -carbine_e11_mark2 E11Carbine Mark2 object/weapon/ranged/carbine/carbine_e11_mark2.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 combat_carbine_master 0 25 0 0 0 0 0 0 5400 0 0 - -carbine_e11_quest Enhanced E11 Carbine object/weapon/ranged/carbine/carbine_e11_quest.iff weapon 1 1000 ranged_weapon CARBINE 60 360 energy 0 2.75 130 0 40 0 14 0 13 0 0 0 0 0 0 1400 0 0 - -carbine_e11_victor_quest Lithitanium Carbine object/weapon/ranged/carbine/carbine_e11_victor_quest.iff weapon 1 1000 ranged_weapon CARBINE 62 365 energy 0 2.75 130 0 40 0 14 0 20 0 0 0 0 0 0 1400 0 0 - -carbine_e5 E5 Carbine object/weapon/ranged/carbine/carbine_e5.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 outdoors_squadleader_master 0 9 0 0 0 0 0 0 5400 0 0 - -carbine_ee3 EE3 Carbine object/weapon/ranged/carbine/carbine_ee3.iff weapon 1 1000 ranged_weapon CARBINE 87 465 energy 0 2.75 130 0 50 0 22 0 9 0 0 0 0 0 0 2200 0 0 - -carbine_elite Elite Carbine object/weapon/ranged/carbine/carbine_elite.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 0 16 0 0 0 0 0 0 5400 0 0 - -carbine_geo Kalranoos Carbine object/weapon/ranged/carbine/carbine_geo.iff weapon 1 1000 ranged_weapon CARBINE 117 590 energy 0 2.75 130 0 50 0 50 0 9 0 0 0 0 0 0 5000 0 0 - -carbine_laser Laser Carbine object/weapon/ranged/carbine/carbine_laser.iff weapon 1 1000 ranged_weapon CARBINE 157 745 energy heat 70 2.75 130 0 50 0 50 0 16 0 0 0 0 0 0 5000 0 0 - -carbine_nym_slugthrower Nym’s Slug-thrower Carbine object/weapon/ranged/carbine/carbine_nym_slugthrower.iff weapon 1 1000 ranged_weapon CARBINE 134 655 kinetic acid 160 2.75 130 0 50 0 50 0 16 0 0 0 0 0 0 5000 0 0 - -carbine_proton Proton Carbine object/weapon/ranged/carbine/carbine_proton.iff weapon 1 1000 ranged_weapon CARBINE 184 855 energy cold 90 2.75 130 0 50 0 54 combat_bountyhunter_master 0 16 0 0 0 0 0 0 5400 0 0 - -carbine_republic_sfor Sfor Republic Carbine object/weapon/ranged/carbine/som_carbine_republic_sfor.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -carbine_underslung Underslung Carbine object/weapon/ranged/carbine/carbine_underslung.iff weapon 1 1000 ranged_weapon CARBINE 144 695 kinetic 0 2.75 130 0 50 0 40 0 9 0 0 0 0 0 0 4000 0 0 - -carbine_wookiee_bowcaster Modified X1 Carbine object/weapon/ranged/carbine/ep3/carbine_wookiee_bowcaster.iff weapon 1 1000 ranged_weapon CARBINE 175 822 kinetic heat 120 2.75 130 0 35 0 54 combat_carbine_master 0 27 0 0 0 0 0 0 5400 0 0 - -ep3_loot_blackbane Blackbane Nail object/weapon/melee/knife/ep3_loot_blackbane.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 121 540 kinetic 0 2.5 120 0 5 0 30 combat_1hsword_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_blackhand Blackhand Annihilater object/weapon/ranged/pistol/ep3_loot_blackhand.iff weapon 1 1000 ranged_weapon PISTOL 137 670 kinetic 0 2.5 140 0 60 0 30 combat_marksman_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_calibrated Perfectly-Calibrated Pistol object/weapon/ranged/pistol/ep3_loot_calibrated.iff weapon 1 1000 ranged_weapon PISTOL 182 850 energy 0 2.5 120 0 25 0 54 combat_smuggler_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_corellian Corellian Destroyer object/weapon/ranged/heavy/ep3_loot_corellian.iff weapon 1 1000 ranged_weapon HEAVY 154 735 energy 0 3.25 150 0 55 0 30 combat_commando_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_corestrike Corestrike Rancor object/weapon/ranged/carbine/ep3_loot_corestrike.iff weapon 1 1000 ranged_weapon CARBINE 150 720 energy 0 2.75 130 0 35 0 40 combat_carbine_accuracy_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_darksting Darksting Assassin object/weapon/ranged/rifle/ep3_loot_darksting.iff weapon 1 1000 ranged_weapon RIFLE 182 850 energy 0 3 120 0 25 0 54 combat_marksman_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_dawnsorrow Dawnsorrow Rifle object/weapon/ranged/rifle/ep3_loot_dawnsorrow.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 60 0 54 combat_bountyhunter_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_deathrain Deathrain D-50 object/weapon/ranged/pistol/ep3_loot_deathrain.iff weapon 1 1000 ranged_weapon PISTOL 209 955 energy 0 2.75 130 0 35 0 54 combat_pistol_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_dragoneye C-10 “Dragoneye Reaper” object/weapon/ranged/pistol/ep3_loot_dragoneye.iff weapon 1 1000 ranged_weapon PISTOL 106 541 energy 0 2.5 120 0 25 0 30 combat_bountyhunter_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_eventide Eventide Smasher object/weapon/melee/sword/ep3_loot_eventide.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 148 645 kinetic 0 2.5 120 0 5 0 40 combat_1hsword_ability_02 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_executer N-K Executer object/weapon/melee/2h_sword/ep3_loot_executer.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 226 960 kinetic 0 2.75 130 0 5 0 54 combat_2hsword_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_firestar Firestar 10-K object/weapon/ranged/carbine/ep3_loot_firestar.iff weapon 1 1000 ranged_weapon CARBINE 170 800 energy 0 2.75 140 0 60 0 40 combat_marksman_rifle_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_grievance Grievance Striker object/weapon/ranged/carbine/ep3_loot_grievance.iff weapon 1 1000 ranged_weapon CARBINE 234 1055 energy 0 2.75 140 0 60 0 54 combat_rifleman_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_heartstriker Sayormi Heartstriker object/weapon/melee/special/ep3_loot_heartstriker.iff weapon 1 1000 melee_weapon UNARMED 105 540 kinetic 0 2.5 120 0 25 0 30 combat_unarmed_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_hydra Red Hydra Z-5 object/weapon/ranged/pistol/ep3_loot_hydra.iff weapon 1 1000 ranged_weapon PISTOL 105 542 energy 0 2.5 120 0 25 0 30 outdoors_squadleader_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_lifeblood Lifeblood Cleaver object/weapon/melee/2h_sword/ep3_loot_lifeblood.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 153 670 kinetic 0 3 140 0 5 0 30 combat_2hsword_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_liquidsilver Liquidsilver L7 object/weapon/ranged/pistol/ep3_loot_liquidsilver.iff weapon 1 1000 ranged_weapon PISTOL 106 541 energy 0 2.5 120 0 25 0 30 combat_smuggler_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_mark Exemplar’s Mark object/weapon/ranged/carbine/ep3_loot_mark.iff weapon 1 1000 ranged_weapon CARBINE 150 720 energy 0 2.75 130 0 35 0 40 outdoors_squadleader_offense_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_necrosis Necrosis Nightblade object/weapon/melee/special/ep3_loot_necrosis.iff weapon 1 1000 melee_weapon UNARMED 182 850 kinetic 0 2.5 120 0 25 0 54 combat_unarmed_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_nullifier Nullifier X object/weapon/ranged/rifle/ep3_loot_nullifier.iff weapon 1 1000 ranged_weapon RIFLE 260 1160 energy 0 3.25 150 0 55 0 54 combat_rifleman_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_pestilence Pestilence object/weapon/melee/polearm/ep3_loot_pestilence.iff weapon 1 1000 melee_weapon POLEARM_MELEE 166 720 kinetic 0 2.75 130 0 5 0 40 combat_polearm_accuracy_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_poisonspike Poisonspike object/weapon/melee/polearm/ep3_loot_poisonspike.iff weapon 1 1000 melee_weapon POLEARM_MELEE 235 1060 kinetic 0 2.75 130 0 60 0 54 combat_polearm_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_quicktrigger Quicktrigger Countermand object/weapon/ranged/pistol/ep3_loot_quicktrigger.iff weapon 1 1000 ranged_weapon PISTOL 132 645 energy 0 2.5 120 0 25 0 40 combat_smuggler_underworld_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_retaliation Covert Retaliation object/weapon/ranged/rifle/ep3_loot_retaliation.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 60 0 54 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_retribution Retribution object/weapon/ranged/carbine/ep3_loot_retribution.iff weapon 1 1000 ranged_weapon CARBINE 150 720 energy 0 2.75 130 0 35 0 40 combat_bountyhunter_support_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_rhiss Rhiss Mark-20 object/weapon/ranged/pistol/ep3_loot_rhiss.iff weapon 1 1000 ranged_weapon PISTOL 107 545 energy 0 2.5 120 0 25 0 30 combat_pistol_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_rilctur Rilctur Carbine object/weapon/ranged/carbine/ep3_loot_rilctur.iff weapon 1 1000 ranged_weapon CARBINE 122 610 energy 0 2.75 130 0 35 0 30 combat_carbine_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_ripper Bloodshot Ripper object/weapon/melee/sword/ep3_loot_ripper.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 250 1055 kinetic 0 2.5 140 0 5 0 54 combat_2hsword_master 0 29 0 0 0 0 0 0 5400 0 0 - -ep3_loot_sharpshooter Vershyi Sharpshooter object/weapon/ranged/rifle/ep3_loot_sharpshooter.iff weapon 1 1000 ranged_weapon RIFLE 137 670 energy 0 3 140 0 60 0 30 combat_rifleman_novice 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_sickle Darstai’is Sickle object/weapon/melee/2h_sword/ep3_loot_sickle.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 186 800 kinetic 0 3 140 0 5 0 40 combat_2hsword_ability_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_silencer The Silencer object/weapon/ranged/pistol/ep3_loot_silencer.iff weapon 1 1000 ranged_weapon PISTOL 132 645 kinetic 0 2.5 120 0 25 0 40 combat_pistol_support_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_soulstinger Sayormi Soulstinger object/weapon/melee/special/ep3_loot_soulstinger.iff weapon 1 1000 melee_weapon UNARMED 132 645 energy 0 2.5 120 0 25 0 40 combat_unarmed_speed_03 0 29 0 0 0 0 0 0 4000 0 0 - -ep3_loot_strike Strike Assault Lance object/weapon/melee/polearm/ep3_loot_strike.iff weapon 1 1000 melee_weapon POLEARM_MELEE 138 605 kinetic 0 2.75 130 0 5 0 30 combat_polearm_master 0 29 0 0 0 0 0 0 3000 0 0 - -ep3_loot_void The Void object/weapon/ranged/heavy/ep3_loot_void.iff weapon 1 1000 ranged_weapon HEAVY 189 875 kinetic 0 3.25 150 0 55 0 40 combat_commando_heavyweapon_accuracy_03 0 29 0 0 0 0 0 0 4000 0 0 - -grenade_bug_bomb Zicx-bug Bomb object/weapon/ranged/grenade/grenade_bug_bomb.iff weapon 1 1000 ranged_weapon THROWN 162 645 energy 0 11 85 0 5 0 9 combat_commando_heavyweapon_accuracy_02 0 27 0 0 0 0 0 0 900 0 0 - -grenade_cryoban CryoBan Grenade object/weapon/ranged/grenade/grenade_cryoban.iff weapon 1 1000 ranged_weapon THROWN 129 515 energy 0 11 85 0 5 0 8 combat_commando_heavyweapon_accuracy_01 0 27 0 0 0 0 0 0 800 0 0 - -grenade_fragmentation C22 Fragmentation Grenade object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 70 280 kinetic 0 11 85 20 40 0 7 combat_commando_novice 0 27 0 0 0 0 0 0 700 0 0 - -grenade_fragmentation_light C12 Fragmentation Grenade object/weapon/ranged/grenade/grenade_fragmentation_light.iff weapon 1 1000 ranged_weapon THROWN 162 645 kinetic 0 11 100 5 10 0 9 combat_commando_heavyweapon_accuracy_02 0 27 0 0 0 0 0 0 900 0 0 - -grenade_glop Glop Grenade object/weapon/ranged/grenade/grenade_glop.iff weapon 1 1000 ranged_weapon THROWN 182 725 energy 0 11 110 5 10 0 10 combat_commando_heavyweapon_accuracy_03 0 27 0 0 0 0 0 0 1000 0 0 - -grenade_imperial_detonator Imperial Detonator object/weapon/ranged/grenade/grenade_imperial_detonator.iff weapon 1 1000 ranged_weapon THROWN 87 345 energy 0 11 65 10 30 0 1 0 27 0 0 0 0 0 0 100 0 0 - -grenade_proton Proton Grenade object/weapon/ranged/grenade/grenade_proton.iff weapon 1 1000 ranged_weapon THROWN 260 1040 energy 0 11 140 0 0 0 12 combat_commando_master 0 27 0 0 0 0 0 0 1200 0 0 - -grenade_thermal_detonator Thermal Detonator object/weapon/ranged/grenade/grenade_thermal_detonator.iff weapon 1 1000 ranged_weapon THROWN 229 915 energy 0 11 120 5 15 0 11 combat_commando_heavyweapon_accuracy_04 0 27 0 0 0 0 0 0 1100 0 0 - -heavy_acid_beam Acid Stream Launcher object/weapon/ranged/heavy/heavy_acid_beam.iff weapon 1 1000 ranged_weapon HEAVY 132 645 energy acid 220 3.25 150 0 65 0 40 combat_commando_support_03 0 35 0 0 0 0 0 0 4000 0 0 - -heavy_lightning_beam Lightning Beam Cannon object/weapon/ranged/heavy/heavy_lightning_beam.iff weapon 1 1000 ranged_weapon HEAVY 163 772 energy electricity 220 3.25 150 0 40 0 50 combat_commando_heavyweapon_speed_04 0 23 0 0 0 0 0 0 5000 0 0 - -heavy_particle_beam Heavy Particle Beam Cannon object/weapon/ranged/heavy/heavy_particle_beam.iff weapon 1 1000 ranged_weapon HEAVY 111 563 energy heat 150 3.25 150 0 40 0 30 combat_commando_heavyweapon_speed_02 0 25 0 0 0 0 0 0 3000 0 0 - -knife_dagger Dagger object/weapon/melee/knife/knife_dagger.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 12 0 0 0 0 0 0 100 0 0 - -knife_donkuwah Donkuwah Knife object/weapon/melee/knife/knife_donkuwah.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 11 0 0 0 0 0 0 100 0 0 - -knife_janta Janta Knife object/weapon/melee/knife/knife_janta.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 67 kinetic 0 2.5 120 0 5 0 1 0 13 0 0 0 0 0 0 100 0 0 - -knife_naktra_crystal Nak’tra Crystal Knife object/weapon/melee/knife/ep3/knife_naktra_crystal.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 166 722 kinetic 0 2.5 120 0 5 0 40 0 29 0 0 0 0 0 0 4000 0 0 - -knife_stone Stone Knife object/weapon/melee/knife/knife_stone.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 10 0 0 0 0 0 0 100 0 0 - -knife_survival Survival Knife object/weapon/melee/knife/knife_survival.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 11 0 0 0 0 0 0 100 0 0 - -knife_trando_skinner Sinew Wrapped Knife object/weapon/melee/knife/ep3/knife_trando_skinner.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 143 625 kinetic 0 2.5 120 0 5 0 40 0 27 0 0 0 0 0 0 4000 0 0 - -knife_vibroblade Vibroblade object/weapon/melee/knife/knife_vibroblade.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 28 165 energy 0 2.5 120 0 5 0 10 0 15 0 0 0 0 0 0 1000 0 0 - -knife_vibroblade_quest Jagged Vibroblade object/weapon/melee/knife/knife_vibroblade_quest.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 28 170 energy 0 2.5 120 0 5 0 10 0 20 0 0 0 0 0 0 1000 0 0 - -knuckler_blasterfist Blaster Fist object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 112 570 energy heat 50 2.5 120 0 5 0 40 0 26 0 0 0 0 0 0 4000 0 0 - -knuckler_massassi Massassi Knuckler object/weapon/melee/special/massassiknuckler.iff weapon 1 1000 melee_weapon UNARMED 47 310 energy 0 2.5 120 0 5 0 14 0 30 0 0 0 0 0 0 1400 0 0 - -lance_controllerfp Lance object/weapon/melee/polearm/lance_controllerfp.iff weapon 1 1000 melee_weapon POLEARM_MELEE 57 345 kinetic 0 2.75 130 0 5 0 14 0 18 0 0 0 0 0 0 1400 0 0 - -lance_controllerfp_nightsister Nightsister Lance object/weapon/melee/polearm/lance_controllerfp_nightsister.iff weapon 1 1000 melee_weapon POLEARM_MELEE 115 580 kinetic 0 2.75 130 0 5 0 30 0 13 0 0 0 0 0 0 3000 0 0 - -lance_cryo Cryo Lance object/weapon/melee/polearm/lance_cryo.iff weapon 1 1000 melee_weapon POLEARM_MELEE 116 520 kinetic cold 65 2.75 130 0 5 0 30 0 18 0 0 0 0 0 0 3000 0 0 - -lance_electric_polearm Electric Polearm object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 141 620 kinetic electricity 80 2.75 130 0 5 0 40 0 33 0 0 0 0 0 0 4000 0 0 - -lance_kaminoan Kaminoan Great Staff object/weapon/melee/polearm/lance_kaminoan.iff weapon 1 1000 melee_weapon POLEARM_MELEE 103 465 kinetic 0 2.75 130 0 5 0 54 0 18 0 0 0 0 0 0 5400 0 0 - -lance_kashyyk Kashyyyk Blade Stick object/weapon/melee/polearm/lance_kashyyk.iff weapon 1 1000 melee_weapon POLEARM_MELEE 191 820 kinetic 0 2.75 130 0 5 0 50 0 33 0 0 0 0 0 0 5000 0 0 - -lance_lightsaber Double-Bladed Lightsaber object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_s1.iff weapon 1 1000 melee_weapon POLEARM_SABER 226 960 energy heat 110 2.75 130 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -lance_massassi Massassi Lance object/weapon/melee/polearm/lance_massassi.iff weapon 1 1000 melee_weapon POLEARM_MELEE 218 925 kinetic 0 2.75 130 0 5 0 54 combat_polearm_master 0 26 0 0 0 0 0 0 5400 0 0 - -lance_nightsister Nightsister Energy Lance object/weapon/melee/polearm/lance_nightsister.iff weapon 1 1000 melee_weapon POLEARM_MELEE 202 925 kinetic 0 2.75 130 0 5 0 54 combat_polearm_master 0 35 0 0 0 0 0 0 5400 0 0 - -lance_shock Shock Lance object/weapon/melee/polearm/lance_shock.iff weapon 1 1000 melee_weapon POLEARM_MELEE 104 538 kinetic electricity 50 2.75 130 0 5 0 54 0 25 0 0 0 0 0 0 5400 0 0 - -lance_som_obsidian Obsidian Lance object/weapon/melee/polearm/som_lance_obsidian.iff weapon 1 1000 melee_weapon POLEARM_MELEE 218 925 energy 0 2.75 130 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -lance_som_xandank Xandank Lance object/weapon/melee/polearm/som_lance_xandank.iff weapon 1 1000 melee_weapon POLEARM_MELEE 218 925 energy 0 2.75 130 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -lance_staff_janta Janta Staff object/weapon/melee/polearm/lance_staff_janta.iff weapon 1 1000 melee_weapon POLEARM_MELEE 23 92 kinetic 0 2.75 130 0 5 0 6 0 10 0 0 0 0 0 0 600 0 0 - -lance_staff_metal Metal Staff object/weapon/melee/polearm/lance_staff_metal.iff weapon 1 1000 melee_weapon POLEARM_MELEE 27 140 kinetic 0 2.75 130 0 5 0 7 0 7 0 0 0 0 0 0 700 0 0 - -lance_staff_wood_s1 Wood Staff object/weapon/melee/polearm/lance_staff_wood_s1.iff weapon 1 1000 melee_weapon POLEARM_MELEE 19 75 kinetic 0 2.75 130 0 5 0 1 0 7 0 0 0 0 0 0 100 0 0 - -lance_staff_wood_s2 Reinforced Combat Staff object/weapon/melee/polearm/lance_staff_wood_s2.iff weapon 1 1000 melee_weapon POLEARM_MELEE 24 98 kinetic 0 2.75 130 0 5 0 6 0 7 0 0 0 0 0 0 600 0 0 - -lance_trando Trandoshan Hunter’s Lance object/weapon/melee/polearm/ep3/lance_trando.iff weapon 1 1000 melee_weapon POLEARM_MELEE 133 590 kinetic 0 2.75 130 0 5 0 30 0 27 0 0 0 0 0 0 3000 0 0 - -lance_vibro_axe Long Vibro Axe object/weapon/melee/axe/axe_vibroaxe.iff weapon 1 1000 melee_weapon POLEARM_MELEE 144 695 kinetic 0 2.75 130 0 5 0 40 0 33 0 0 0 0 0 0 4000 0 0 - -lance_vibrolance Vibro Lance object/weapon/melee/polearm/lance_vibrolance.iff weapon 1 1000 melee_weapon POLEARM_MELEE 202 925 kinetic 0 2.75 130 0 5 0 54 0 26 0 0 0 0 0 0 5400 0 0 - -pistol_ad Alliance Disruptor object/weapon/ranged/pistol/pistol_alliance_disruptor.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 science_combatmedic_master 0 23 0 0 0 0 0 0 5400 0 0 - -pistol_cdef CDEF Pistol object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 17 67 energy 0 2.5 120 0 35 0 1 0 5 0 0 0 0 0 0 100 0 0 - -pistol_cdef_corsec Corsec CDEF Pistol object/weapon/ranged/pistol/pistol_cdef_corsec.iff weapon 1 1000 ranged_weapon PISTOL 17 68 energy 0 2.5 120 0 35 0 1 0 12 0 0 0 0 0 0 100 0 0 - -pistol_d18 D18 Pistol object/weapon/ranged/pistol/pistol_d18.iff weapon 1 1000 ranged_weapon PISTOL 20 80 energy 0 2.5 120 0 35 0 6 0 8 0 0 0 0 0 0 600 0 0 - -pistol_de_10 DE-10 Pistol object/weapon/ranged/pistol/pistol_de_10.iff weapon 1 1000 ranged_weapon PISTOL 179 835 energy 0 2.5 120 0 35 0 54 0 20 0 0 0 0 0 0 5400 0 0 - -pistol_deathhammer Death-Hammer Pistol object/weapon/ranged/pistol/pistol_deathhammer.iff weapon 1 1000 ranged_weapon PISTOL 125 617 energy 0 2.5 120 0 35 0 40 0 23 0 0 0 0 0 0 4000 0 0 - -pistol_dh17 DH17 Pistol object/weapon/ranged/pistol/pistol_dh17.iff weapon 1 1000 ranged_weapon PISTOL 72 410 energy 0 2.5 120 0 35 0 22 0 13 0 0 0 0 0 0 2200 0 0 - -pistol_dl44 DL44 Pistol object/weapon/ranged/pistol/pistol_dl44.iff weapon 1 1000 ranged_weapon PISTOL 18 125 energy 0 2.5 120 0 35 0 7 0 9 0 0 0 0 0 0 700 0 0 - -pistol_dl44_metal DL44 XT object/weapon/ranged/pistol/pistol_dl44_metal.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 0 9 0 0 0 0 0 0 5400 0 0 - -pistol_dl44_metal_light DL44 Metal Pistol object/weapon/ranged/pistol/pistol_dl44_metal_light.iff weapon 1 1000 ranged_weapon PISTOL 63 310 energy 0 2.5 120 0 35 0 12 combat_marksman_master 0 25 0 0 0 0 0 0 1200 0 0 - -pistol_dx2 DX2 Pistol object/weapon/ranged/pistol/pistol_dx2.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 combat_pistol_master 0 16 0 0 0 0 0 0 5400 0 0 - -pistol_flare Tchotchee Pistol object/weapon/ranged/pistol/pistol_flare.iff weapon 1 1000 ranged_weapon PISTOL 115 580 kinetic heat 40 2.5 120 0 35 0 50 outdoors_squadleader_offense_03 0 23 0 0 0 0 0 0 5000 0 0 - -pistol_flechette Vexa Flechette Pistol object/weapon/ranged/pistol/pistol_flechette.iff weapon 1 1000 ranged_weapon PISTOL 150 720 kinetic 0 2.5 120 0 35 0 50 0 12 0 0 0 0 0 0 5000 0 0 - -pistol_fwg5 FWG5 Pistol object/weapon/ranged/pistol/pistol_fwg5.iff weapon 1 1000 ranged_weapon PISTOL 177 825 kinetic 0 2.5 120 0 35 0 54 0 12 0 0 0 0 0 0 5400 0 0 - -pistol_fwg5_quest Featherweight FWG5 Pistol object/weapon/ranged/pistol/pistol_fwg5_quest.iff weapon 1 1000 ranged_weapon PISTOL 180 840 kinetic 0 2.5 120 0 35 0 54 0 12 0 0 0 0 0 0 5400 0 0 - -pistol_geonosian_sonic_blaster Geonosian Sonic Blaster object/weapon/ranged/pistol/pistol_geonosian_sonic_blaster_loot.iff weapon 1 1000 ranged_weapon PISTOL 99 515 energy 0 2.5 120 0 35 0 30 0 16 0 0 0 0 0 0 3000 0 0 - -pistol_intimidator Intimidator Pistol object/weapon/ranged/pistol/pistol_intimidator.iff weapon 1 1000 ranged_weapon PISTOL 177 825 kinetic 0 2.5 120 0 35 0 54 outdoors_squadleader_master 0 23 0 0 0 0 0 0 5400 0 0 - -pistol_jawa Jawa Ion Pistol object/weapon/ranged/pistol/pistol_jawa.iff weapon 1 1000 ranged_weapon PISTOL 67 385 energy electricity 40 2.5 120 0 35 0 30 0 23 0 0 0 0 0 0 3000 0 0 - -pistol_kyd21 KYD21 Pistol object/weapon/ranged/pistol/pistol_kyd21_generic.iff weapon 1 1000 ranged_weapon PISTOL 179 833 kinetic 0 2.5 120 0 25 0 54 combat_pistol_master 0 27 0 0 0 0 0 0 5400 0 0 - -pistol_launcher Launcher Pistol object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 60 360 kinetic heat 80 3.25 150 0 45 0 14 combat_commando_novice 0 35 0 0 0 0 0 0 1400 0 0 - -pistol_power5 Power5 Pistol object/weapon/ranged/pistol/pistol_power5.iff weapon 1 1000 ranged_weapon PISTOL 125 620 energy 0 2.5 120 0 35 0 40 0 13 0 0 0 0 0 0 4000 0 0 - -pistol_renegade Renegade Pistol object/weapon/ranged/pistol/pistol_renegade.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 combat_smuggler_master 0 32 0 0 0 0 0 0 5400 0 0 - -pistol_republic_blaster Republic Blaster object/weapon/ranged/pistol/pistol_republic_blaster.iff weapon 1 1000 ranged_weapon PISTOL 167 785 energy acid 60 2.5 120 0 35 0 54 combat_pistol_master 0 20 0 0 0 0 0 0 5400 0 0 - -pistol_republic_blaster_quest Modified Republic Blaster object/weapon/ranged/pistol/pistol_republic_blaster_quest.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 combat_pistol_master 0 25 0 0 0 0 0 0 5400 0 0 - -pistol_scatter High Capacity Scatter Pistol object/weapon/ranged/pistol/pistol_scatter.iff weapon 1 1000 ranged_weapon PISTOL 177 825 kinetic 0 2.5 120 0 35 0 54 combat_bountyhunter_master 0 27 0 0 0 0 0 0 5400 0 0 - -pistol_scatter_light Scatter Pistol object/weapon/ranged/pistol/pistol_scatter_light.iff weapon 1 1000 ranged_weapon PISTOL 47 310 energy 0 2.5 120 0 35 0 14 combat_brawler_novice 0 25 0 0 0 0 0 0 1400 0 0 - -pistol_scout_blaster Scout Blaster object/weapon/ranged/pistol/pistol_scout_blaster.iff weapon 1 1000 ranged_weapon PISTOL 28 165 energy 0 2.5 120 0 35 0 10 0 9 0 0 0 0 0 0 1000 0 0 - -pistol_scout_blaster_corsec Corsec Scout Blaster object/weapon/ranged/pistol/pistol_scout_blaster_corsec.iff weapon 1 1000 ranged_weapon PISTOL 28 165 energy 0 2.5 120 0 35 0 10 0 11 0 0 0 0 0 0 1000 0 0 - -pistol_srcombat SR Combat Pistol object/weapon/ranged/pistol/pistol_srcombat.iff weapon 1 1000 ranged_weapon PISTOL 117 590 energy cold 30 2.5 120 0 25 0 40 0 17 0 0 0 0 0 0 4000 0 0 - -pistol_striker Striker Pistol object/weapon/ranged/pistol/pistol_striker.iff weapon 1 1000 ranged_weapon PISTOL 47 310 kinetic 0 2.5 120 0 35 0 14 0 13 0 0 0 0 0 0 1400 0 0 - -pistol_tangle Tangle Pistol object/weapon/ranged/pistol/pistol_tangle.iff weapon 1 1000 ranged_weapon PISTOL 132 645 kinetic 0 2.5 120 0 35 0 30 0 4 0 0 0 0 0 0 3000 0 0 - -pistol_trando_suppressor Trandoshan Suppressor Pistol object/weapon/ranged/pistol/ep3/pistol_trando_suppressor.iff weapon 1 1000 ranged_weapon PISTOL 149 715 energy electricity 120 2.5 120 0 30 0 54 combat_pistol_master 0 27 0 0 0 0 0 0 5400 0 0 - -pistol_wookiee UR-G8 Pistol object/weapon/ranged/pistol/ep3/pistol_wookiee.iff weapon 1 1000 ranged_weapon PISTOL 179 835 energy 0 2.5 120 0 30 0 54 combat_pistol_master 0 27 0 0 0 0 0 0 5400 0 0 - -pistol_wookiee_bowcaster Kashyyyk Stalker Pistol object/weapon/ranged/pistol/ep3/pistol_wookiee_bowcaster.iff weapon 1 1000 ranged_weapon PISTOL 149 718 kinetic heat 120 2.5 120 0 30 0 54 combat_pistol_master 0 27 0 0 0 0 0 0 5400 0 0 - -rifle_acid_beam Heavy Acid Rifle object/weapon/ranged/rifle/rifle_acid_beam.iff weapon 1 1000 ranged_weapon HEAVY 80 440 energy acid 130 3.25 150 0 45 0 22 combat_commando_support_01 0 30 0 0 0 0 0 0 2200 0 0 - -rifle_adventurer Fallann Hyper-Rifle object/weapon/ranged/rifle/rifle_adventurer.iff weapon 1 1000 ranged_weapon RIFLE 199 915 kinetic 0 3 140 0 65 0 50 0 5 0 0 0 0 0 0 5000 0 0 - -rifle_beam Beam Rifle object/weapon/ranged/rifle/rifle_beam.iff weapon 1 1000 ranged_weapon RIFLE 102 525 energy heat 120 3 140 0 65 0 30 0 30 0 0 0 0 0 0 3000 0 0 - -rifle_berserker Berserker Rifle object/weapon/ranged/rifle/rifle_berserker.iff weapon 1 1000 ranged_weapon RIFLE 163 772 kinetic 0 3 140 0 65 0 40 0 35 0 0 0 0 0 0 4000 0 0 - -rifle_bowcaster Light Bowcaster object/weapon/ranged/rifle/rifle_bowcaster.iff weapon 1 1000 ranged_weapon RIFLE 22 85 kinetic 0 3 140 0 30 0 1 0 17 0 0 0 0 0 0 100 0 0 - -rifle_bowcaster_heavy Assault Bowcaster object/weapon/ranged/rifle/rifle_bowcaster_heavy.iff weapon 1 1000 ranged_weapon RIFLE 227 1030 kinetic 0 3 140 0 65 0 54 species_wookiee 0 25 0 0 0 0 0 0 5400 0 0 - -rifle_bowcaster_medium Recon Bowcaster object/weapon/ranged/rifle/rifle_bowcaster_medium.iff weapon 1 1000 ranged_weapon RIFLE 38 205 kinetic 0 3 140 0 65 0 10 species_wookiee 0 25 0 0 0 0 0 0 1000 0 0 - -rifle_cdef CDEF Rifle object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 22 85 energy 0 3 140 0 35 0 1 0 5 0 0 0 0 0 0 100 0 0 - -rifle_dc15 DC15 Rifle object/weapon/ranged/rifle/ep3/rifle_dc15.iff weapon 1 1000 ranged_weapon RIFLE 230 1040 energy 0 3 140 0 60 0 54 outdoors_squadleader_master 0 27 0 0 0 0 0 0 5400 0 0 - -rifle_dlt20 DLT20 Rifle object/weapon/ranged/rifle/rifle_dlt20.iff weapon 1 1000 ranged_weapon RIFLE 27 105 energy 0 3 140 0 40 0 6 0 12 0 0 0 0 0 0 600 0 0 - -rifle_dlt20a DLT20a Rifle object/weapon/ranged/rifle/rifle_dlt20a.iff weapon 1 1000 ranged_weapon RIFLE 25 155 energy 0 3 140 0 45 0 7 0 12 0 0 0 0 0 0 700 0 0 - -rifle_e11 E11 Rifle object/weapon/ranged/rifle/rifle_e11.iff weapon 1 1000 ranged_weapon RIFLE 99 515 energy 0 3 140 0 45 0 22 0 13 0 0 0 0 0 0 2200 0 0 - -rifle_flame_thrower Plasma Flame Thrower object/weapon/ranged/rifle/rifle_flame_thrower.iff weapon 1 1000 ranged_weapon HEAVY 222 1010 energy heat 140 3.25 150 0 25 0 54 combat_commando_master 0 19 0 0 0 0 0 0 5400 0 0 - -rifle_flame_thrower_light Flame Thrower object/weapon/ranged/rifle/rifle_flame_thrower_light.iff weapon 1 1000 ranged_weapon HEAVY 154 735 energy heat 120 3.25 150 0 40 0 40 combat_commando_thrownweapon_03 0 25 0 0 0 0 0 0 4000 0 0 - -rifle_geo_drill Geonosian Drill object/weapon/ranged/rifle/rifle_geo_drill.iff weapon 1 1000 ranged_weapon RIFLE 164 773 kinetic 0 3 140 0 65 0 40 0 18 0 0 0 0 0 0 4000 0 0 - -rifle_jawa_ion Jawa Ion Rifle object/weapon/ranged/rifle/rifle_jawa_ion.iff weapon 1 1000 ranged_weapon RIFLE 164 775 energy electricity 130 3 140 0 65 0 50 0 5 0 0 0 0 0 0 5000 0 0 - -rifle_laser Advanced Laser Rifle object/weapon/ranged/rifle/rifle_laser.iff weapon 1 1000 ranged_weapon RIFLE 227 1030 energy 0 3 140 0 65 0 54 0 13 0 0 0 0 0 0 5400 0 0 - -rifle_laser_light Light Laser Rifle object/weapon/ranged/rifle/rifle_laser_light.iff weapon 1 1000 ranged_weapon RIFLE 163 772 energy 0 3 140 0 65 0 40 0 25 0 0 0 0 0 0 4000 0 0 - -rifle_ld1 LD-1 Rifle object/weapon/ranged/rifle/rifle_ld1.iff weapon 1 1000 ranged_weapon RIFLE 199 915 kinetic 0 3 140 0 65 0 50 0 9 0 0 0 0 0 0 5000 0 0 - -rifle_lightning Light Lightning Cannon object/weapon/ranged/rifle/rifle_lightning.iff weapon 1 1000 ranged_weapon RIFLE 107 545 energy electricity 100 3 140 0 65 0 30 combat_bountyhunter_novice 0 16 0 0 0 0 0 0 3000 0 0 - -rifle_lightning_light Lightning Rifle object/weapon/ranged/rifle/rifle_lightning_light.iff weapon 1 1000 ranged_weapon RIFLE 40 280 energy electricity 110 3 140 0 65 0 14 combat_bountyhunter_novice 0 25 0 0 0 0 0 0 1400 0 0 - -rifle_massassi_ink Massassi Ink Rifle object/weapon/ranged/rifle/rifle_massassi_ink.iff weapon 1 1000 ranged_weapon RIFLE 134 655 energy 0 3 140 0 65 0 30 0 23 0 0 0 0 0 0 3000 0 0 - -rifle_naktra_crystal Nak’tra Crystal Rifle object/weapon/ranged/rifle/ep3/rifle_naktra_crystal.iff weapon 1 1000 ranged_weapon RIFLE 230 1040 energy 0 3 140 0 65 0 40 combat_rifleman_speed_03 0 27 0 0 0 0 0 0 4000 0 0 - -rifle_odararissl Odara’rissl Rifle object/weapon/ranged/rifle/rifle_odararissl.iff weapon 1 1000 ranged_weapon RIFLE 167 785 kinetic 0 3 140 0 65 0 40 0 25 0 0 0 0 0 0 4000 0 0 - -rifle_proton Proton Rifle object/weapon/ranged/rifle/rifle_proton.iff weapon 1 1000 ranged_weapon RIFLE 257 1150 energy 0 3 140 0 65 0 54 combat_commando_master 0 13 0 0 0 0 0 0 5400 0 0 - -rifle_quest_tusken Tusken King’s Rifle object/weapon/ranged/rifle/event_rifle_tusken_berserker.iff weapon 1 1000 ranged_weapon RIFLE 167 785 kinetic 0 3 140 0 65 0 40 0 17 0 0 0 0 0 0 4000 0 0 - -rifle_sg82 SG82 Rifle object/weapon/ranged/rifle/rifle_sg82.iff weapon 1 1000 ranged_weapon RIFLE 38 208 energy 0 3 140 0 40 0 10 0 18 0 0 0 0 0 0 1000 0 0 - -rifle_spraystick Spraystick object/weapon/ranged/rifle/rifle_spraystick.iff weapon 1 1000 ranged_weapon RIFLE 40 280 kinetic heat 110 3 140 0 65 0 14 combat_rifleman_novice 0 22 0 0 0 0 0 0 1400 0 0 - -rifle_t21 T21 Rifle object/weapon/ranged/rifle/rifle_t21.iff weapon 1 1000 ranged_weapon RIFLE 227 1030 energy 0 3 140 0 65 0 54 combat_rifleman_master 0 29 0 0 0 0 0 0 5400 0 0 - -rifle_tenloss_dxr6_disruptor Tenloss DXR-6 Disruptor Rifle object/weapon/ranged/rifle/rifle_tenloss_dxr6_disruptor_loot.iff weapon 1 1000 ranged_weapon RIFLE 163 772 energy 0 3 140 0 65 0 40 combat_rifleman_novice 0 35 0 0 0 0 0 0 4000 0 0 - -rifle_trando_hunter Trandoshan Hunting Rifle object/weapon/ranged/rifle/ep3/rifle_trando_hunter.iff weapon 1 1000 ranged_weapon RIFLE 230 1040 energy 0 3 140 0 65 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -rifle_tusken Tusken Rifle object/weapon/ranged/rifle/rifle_tusken.iff weapon 1 1000 ranged_weapon RIFLE 163 772 kinetic 0 3 140 0 65 0 40 0 12 0 0 0 0 0 0 4000 0 0 - -rifle_victor_tusken Lithitanium Rifle object/weapon/ranged/rifle/rifle_victor_tusken.iff weapon 1 1000 ranged_weapon RIFLE 165 780 kinetic 0 3 140 0 65 0 40 0 17 0 0 0 0 0 0 4000 0 0 - -rocket_launcher Rocket Launcher object/weapon/ranged/heavy/launcher.iff weapon 1 1000 ranged_weapon HEAVY 62 370 kinetic heat 200 3.25 150 0 64 0 20 combat_commando_thrownweapon_01 0 31 0 0 0 0 0 0 2000 0 0 - -som_hvy_lava_cannon Lava Cannon object/weapon/ranged/heavy/som_lava_cannon.iff weapon 1 1000 ranged_weapon HEAVY 222 1010 energy heat 140 3.25 150 0 65 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -som_hvy_republic_flamer Heavy Republic Flame Thrower object/weapon/ranged/heavy/som_republic_flamer.iff weapon 1 1000 ranged_weapon HEAVY 222 1010 energy heat 140 3.25 150 0 35 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -som_pistol_disruptor_pistol Disruptor Pistol object/weapon/ranged/pistol/som_disruptor_pistol.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -som_pistol_ion_relic Ion Relic Pistol object/weapon/ranged/pistol/som_ion_relic_pistol.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -som_rifle_dp23 DP-23 Rifle object/weapon/ranged/rifle/som_rifle_dp23.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 65 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -som_rifle_mustafar_disruptor Disruptor Rifle object/weapon/ranged/rifle/som_rifle_mustafar_disruptor.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 65 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_01 Sword object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 27 105 kinetic 0 2.5 140 0 5 0 6 0 18 0 0 0 0 0 0 600 0 0 - -sword_02 Curved Sword object/weapon/melee/sword/sword_02.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 63 310 kinetic 0 2.5 120 0 5 0 14 0 24 0 0 0 0 0 0 1400 0 0 - -sword_2h_axe Two-handed Axe object/weapon/melee/2h_sword/2h_sword_battleaxe.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 27 105 kinetic 0 3 140 0 5 0 6 0 25 0 0 0 0 0 0 600 0 0 - -sword_2h_axe_quest Gamorrean Battleaxe object/weapon/melee/2h_sword/2h_sword_battleaxe_quest.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 27 110 kinetic 0 3 140 0 5 0 6 0 25 0 0 0 0 0 0 600 0 0 - -sword_2h_blacksun_hack Black Sun Executioner’s Hack object/weapon/melee/2h_sword/2h_sword_blacksun_hack.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 148 645 kinetic 0 3 140 0 5 0 30 0 24 0 0 0 0 0 0 3000 0 0 - -sword_2h_cleaver Two-handed Cleaver object/weapon/melee/2h_sword/2h_sword_cleaver.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 44 205 kinetic 0 3 140 0 5 0 10 0 35 0 0 0 0 0 0 1000 0 0 - -sword_2h_kashyyk Two-handed Kashyyyk Sword object/weapon/melee/2h_sword/2h_sword_kashyyk.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 115 515 kinetic 0 3 140 0 5 0 22 0 25 0 0 0 0 0 0 2200 0 0 - -sword_2h_katana Two-handed Curved Sword object/weapon/melee/2h_sword/2h_sword_katana.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 69 310 kinetic 0 2.5 120 0 5 0 12 0 27 0 0 0 0 0 0 1200 0 0 - -sword_2h_katana_quest Grooved Two-handed Sword object/weapon/melee/2h_sword/2h_sword_katana_quest.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 71 315 kinetic 0 2.5 120 0 5 0 12 0 30 0 0 0 0 0 0 1200 0 0 - -sword_2h_maul Power Hammer object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 243 1030 kinetic 0 3 140 0 5 0 54 combat_2hsword_master 0 25 0 0 0 0 0 0 5400 0 0 - -sword_2h_scythe Scythe Blade object/weapon/melee/2h_sword/2h_sword_scythe.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 190 815 kinetic acid 90 3 140 0 5 0 50 combat_1hsword_support_04 0 25 0 0 0 0 0 0 5000 0 0 - -sword_2h_sith Two-handed Sith Sword object/weapon/melee/2h_sword/2h_sword_sith.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 200 853 kinetic cold 50 3 140 0 5 0 50 0 25 0 0 0 0 0 0 5000 0 0 - -sword_acid Xris Acid Sword object/weapon/melee/sword/sword_acid.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 231 980 kinetic acid 50 2.5 140 0 5 0 54 0 3 0 0 0 0 0 0 5400 0 0 - -sword_blade_rantok Rantok object/weapon/melee/sword/sword_rantok.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 88 410 kinetic 0 2.5 120 0 5 0 22 0 23 0 0 0 0 0 0 2200 0 0 - -sword_blade_ryyk Ryyk Blade object/weapon/melee/sword/sword_blade_ryyk.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 166 720 kinetic 0 2.5 120 0 5 0 50 0 29 0 0 0 0 0 0 5000 0 0 - -sword_curved_nyax Curved Nyax Sword object/weapon/melee/sword/sword_curved_nyax.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 141 620 kinetic 0 2.5 120 0 5 0 40 0 27 0 0 0 0 0 0 4000 0 0 - -sword_junti_mace Junti Mace object/weapon/melee/sword/sword_mace_junti.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 148 645 kinetic 0 2.5 140 0 5 0 50 0 29 0 0 0 0 0 0 5000 0 0 - -sword_lightsaber Lightsaber object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s1.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 226 960 energy heat 110 2.5 120 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_lightsaber_2h Two-Handed Lightsaber object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s1.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 226 960 energy heat 110 3 140 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_lightsaber_training A Training Lightsaber object/weapon/melee/sword/crafted_saber/sword_lightsaber_training.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 226 960 energy heat 110 2.5 120 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_marauder Champion’s Sword object/weapon/melee/sword/sword_marauder.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 115 515 kinetic 0 2.5 120 0 5 0 30 0 25 0 0 0 0 0 0 3000 0 0 - -sword_massassi Urnsor’is Soulleecher object/weapon/melee/sword/sword_massassi.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 211 900 kinetic 0 2.5 140 0 5 0 50 0 29 0 0 0 0 0 0 5000 0 0 - -sword_nyax Nyax Sword object/weapon/melee/sword/sword_nyax.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 115 515 kinetic 0 2.5 140 0 5 0 22 0 20 0 0 0 0 0 0 2200 0 0 - -sword_rsf RSF Sword object/weapon/melee/sword/sword_rsf.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 141 620 kinetic 0 2.5 120 0 5 0 40 0 24 0 0 0 0 0 0 4000 0 0 - -sword_som_2h_obsidian Two-Handed Obsidian Sword object/weapon/melee/2h_sword/som_2h_sword_obsidian.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 226 960 energy 0 3 140 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_som_2h_tulrus Two-Handed Tulrus Sword object/weapon/melee/2h_sword/som_2h_sword_tulrus.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 226 960 energy 0 3 140 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_som_mustafar_bandit Mustafar Bandit Sword object/weapon/melee/sword/som_sword_mustafar_bandit.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 250 1055 energy 0 2.5 120 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_som_obsidian Obsidian Sword object/weapon/melee/sword/som_sword_obsidian.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 250 1055 energy 0 2.5 120 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -sword_wookiee Blade of Nyenthi’oris object/weapon/melee/sword/ep3/sword_wookiee.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 246 1040 kinetic 0 2.5 140 0 5 0 54 0 27 0 0 0 0 0 0 5400 0 0 - -vibroknuckler Vibro Knuckler object/weapon/melee/special/vibroknuckler.iff weapon 1 1000 melee_weapon UNARMED 77 425 energy 0 2.5 120 0 5 0 14 0 26 0 0 0 0 0 0 1400 0 0 - -victor_baton_gaderiffi Black Metal Gaderiffi Baton object/weapon/melee/baton/victor_baton_gaderiffi.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 63 310 kinetic 0 2.5 120 0 5 0 14 0 25 0 0 0 0 0 0 1400 0 0 - -wookiee_knuckler Knuckles of the Katarn object/weapon/melee/special/ep3/wookiee_knuckler.iff weapon 1 1000 melee_weapon UNARMED 149 715 kinetic cold 120 2.5 120 0 5 0 54 combat_unarmed_master 0 27 0 0 0 0 0 0 5400 0 0 - +axe_heavy_duty Heavy Axe object/weapon/melee/axe/axe_heavy_duty.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 22 85 kinetic 0 3 140 0 5 0 1 0 100 0 0 0 0 0 0 100 0 0 - +axe_vibro Vibro Axe object/weapon/melee/axe/axe_vibroaxe.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 148 645 kinetic 0 3 140 0 5 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +baton_gaderiffi Gaderiffi Baton object/weapon/melee/baton/baton_gaderiffi.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 63 310 kinetic 0 2.5 120 0 5 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +baton_stun Stun Baton object/weapon/melee/baton/baton_stun.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 160 762 energy electricity 65 2.5 120 0 5 0 54 combat_1hsword_master 0 100 0 0 0 0 0 0 5400 0 0 - +blacksun_razor Black Sun Razor Knuckler object/weapon/melee/special/blacksun_razor.iff weapon 1 1000 melee_weapon UNARMED 177 825 energy 0 2.5 120 0 5 0 54 combat_unarmed_master 0 100 0 0 0 0 0 0 5400 0 0 - +carbine_alliance_needler Alliance Needler Carbine object/weapon/ranged/carbine/carbine_alliance_needler.iff weapon 1 1000 ranged_weapon CARBINE 117 590 kinetic 0 2.75 130 0 50 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +carbine_bothan_bola Bothan Bola Carbine object/weapon/ranged/carbine/carbine_bothan_bola.iff weapon 1 1000 ranged_weapon CARBINE 144 695 energy 0 2.75 130 0 50 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +carbine_cdef CDEF Carbine object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 20 77 energy 0 2.75 130 0 35 0 1 0 100 0 0 0 0 0 0 100 0 0 - +carbine_cdef_corsec Corsec CDEF Carbine object/weapon/ranged/carbine/carbine_cdef_corsec.iff weapon 1 1000 ranged_weapon CARBINE 22 85 energy 0 2.75 130 0 35 0 1 0 100 0 0 0 0 0 0 100 0 0 - +carbine_czerka Czerka Dart Carbine object/weapon/ranged/carbine/carbine_czerka_dart.iff weapon 1 1000 ranged_weapon CARBINE 172 810 kinetic 0 2.75 130 0 50 0 50 combat_bountyhunter_droidcontrol_04 0 100 0 0 0 0 0 0 5000 0 0 - +carbine_dc15 DC15 Carbine object/weapon/ranged/carbine/ep3/carbine_dc15.iff weapon 1 1000 ranged_weapon CARBINE 204 935 energy 0 2.75 130 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +carbine_dh17 DH17 Carbine object/weapon/ranged/carbine/carbine_dh17.iff weapon 1 1000 ranged_weapon CARBINE 23 94 energy 0 2.75 130 0 30 0 6 0 100 0 0 0 0 0 0 600 0 0 - +carbine_dh17_short DH17 Short Carbine object/weapon/ranged/carbine/carbine_dh17_snubnose.iff weapon 1 1000 ranged_weapon CARBINE 33 185 energy 0 2.75 130 0 35 0 10 0 100 0 0 0 0 0 0 1000 0 0 - +carbine_dxr6 DXR6 Carbine object/weapon/ranged/carbine/carbine_dxr6.iff weapon 1 1000 ranged_weapon CARBINE 164 773 energy 0 2.75 130 0 50 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +carbine_e11 E11 Carbine object/weapon/ranged/carbine/carbine_e11.iff weapon 1 1000 ranged_weapon CARBINE 57 345 energy 0 2.75 130 0 40 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +carbine_e11_mark2 E11Carbine Mark2 object/weapon/ranged/carbine/carbine_e11_mark2.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 combat_carbine_master 0 100 0 0 0 0 0 0 5400 0 0 - +carbine_e11_quest Enhanced E11 Carbine object/weapon/ranged/carbine/carbine_e11_quest.iff weapon 1 1000 ranged_weapon CARBINE 60 360 energy 0 2.75 130 0 40 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +carbine_e11_victor_quest Lithitanium Carbine object/weapon/ranged/carbine/carbine_e11_victor_quest.iff weapon 1 1000 ranged_weapon CARBINE 62 365 energy 0 2.75 130 0 40 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +carbine_e5 E5 Carbine object/weapon/ranged/carbine/carbine_e5.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 outdoors_squadleader_master 0 100 0 0 0 0 0 0 5400 0 0 - +carbine_ee3 EE3 Carbine object/weapon/ranged/carbine/carbine_ee3.iff weapon 1 1000 ranged_weapon CARBINE 87 465 energy 0 2.75 130 0 50 0 22 0 100 0 0 0 0 0 0 2200 0 0 - +carbine_elite Elite Carbine object/weapon/ranged/carbine/carbine_elite.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +carbine_geo Kalranoos Carbine object/weapon/ranged/carbine/carbine_geo.iff weapon 1 1000 ranged_weapon CARBINE 117 590 energy 0 2.75 130 0 50 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +carbine_laser Laser Carbine object/weapon/ranged/carbine/carbine_laser.iff weapon 1 1000 ranged_weapon CARBINE 157 745 energy heat 70 2.75 130 0 50 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +carbine_nym_slugthrower Nym’s Slug-thrower Carbine object/weapon/ranged/carbine/carbine_nym_slugthrower.iff weapon 1 1000 ranged_weapon CARBINE 134 655 kinetic acid 160 2.75 130 0 50 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +carbine_proton Proton Carbine object/weapon/ranged/carbine/carbine_proton.iff weapon 1 1000 ranged_weapon CARBINE 184 855 energy cold 90 2.75 130 0 50 0 54 combat_bountyhunter_master 0 100 0 0 0 0 0 0 5400 0 0 - +carbine_republic_sfor Sfor Republic Carbine object/weapon/ranged/carbine/som_carbine_republic_sfor.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.75 130 0 50 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +carbine_underslung Underslung Carbine object/weapon/ranged/carbine/carbine_underslung.iff weapon 1 1000 ranged_weapon CARBINE 144 695 kinetic 0 2.75 130 0 50 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +carbine_wookiee_bowcaster Modified X1 Carbine object/weapon/ranged/carbine/ep3/carbine_wookiee_bowcaster.iff weapon 1 1000 ranged_weapon CARBINE 175 822 kinetic heat 120 2.75 130 0 35 0 54 combat_carbine_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_blackbane Blackbane Nail object/weapon/melee/knife/ep3_loot_blackbane.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 121 540 kinetic 0 2.5 120 0 5 0 30 combat_1hsword_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_blackhand Blackhand Annihilater object/weapon/ranged/pistol/ep3_loot_blackhand.iff weapon 1 1000 ranged_weapon PISTOL 137 670 kinetic 0 2.5 140 0 60 0 30 combat_marksman_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_calibrated Perfectly-Calibrated Pistol object/weapon/ranged/pistol/ep3_loot_calibrated.iff weapon 1 1000 ranged_weapon PISTOL 182 850 energy 0 2.5 120 0 25 0 54 combat_smuggler_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_corellian Corellian Destroyer object/weapon/ranged/heavy/ep3_loot_corellian.iff weapon 1 1000 ranged_weapon HEAVY 154 735 energy 0 3.25 150 0 55 0 30 combat_commando_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_corestrike Corestrike Rancor object/weapon/ranged/carbine/ep3_loot_corestrike.iff weapon 1 1000 ranged_weapon CARBINE 150 720 energy 0 2.75 130 0 35 0 40 combat_carbine_accuracy_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_darksting Darksting Assassin object/weapon/ranged/rifle/ep3_loot_darksting.iff weapon 1 1000 ranged_weapon RIFLE 182 850 energy 0 3 120 0 25 0 54 combat_marksman_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_dawnsorrow Dawnsorrow Rifle object/weapon/ranged/rifle/ep3_loot_dawnsorrow.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 60 0 54 combat_bountyhunter_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_deathrain Deathrain D-50 object/weapon/ranged/pistol/ep3_loot_deathrain.iff weapon 1 1000 ranged_weapon PISTOL 209 955 energy 0 2.75 130 0 35 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_dragoneye C-10 “Dragoneye Reaper” object/weapon/ranged/pistol/ep3_loot_dragoneye.iff weapon 1 1000 ranged_weapon PISTOL 106 541 energy 0 2.5 120 0 25 0 30 combat_bountyhunter_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_eventide Eventide Smasher object/weapon/melee/sword/ep3_loot_eventide.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 148 645 kinetic 0 2.5 120 0 5 0 40 combat_1hsword_ability_02 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_executer N-K Executer object/weapon/melee/2h_sword/ep3_loot_executer.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 226 960 kinetic 0 2.75 130 0 5 0 54 combat_2hsword_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_firestar Firestar 10-K object/weapon/ranged/carbine/ep3_loot_firestar.iff weapon 1 1000 ranged_weapon CARBINE 170 800 energy 0 2.75 140 0 60 0 40 combat_marksman_rifle_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_grievance Grievance Striker object/weapon/ranged/carbine/ep3_loot_grievance.iff weapon 1 1000 ranged_weapon CARBINE 234 1055 energy 0 2.75 140 0 60 0 54 combat_rifleman_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_heartstriker Sayormi Heartstriker object/weapon/melee/special/ep3_loot_heartstriker.iff weapon 1 1000 melee_weapon UNARMED 105 540 kinetic 0 2.5 120 0 25 0 30 combat_unarmed_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_hydra Red Hydra Z-5 object/weapon/ranged/pistol/ep3_loot_hydra.iff weapon 1 1000 ranged_weapon PISTOL 105 542 energy 0 2.5 120 0 25 0 30 outdoors_squadleader_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_lifeblood Lifeblood Cleaver object/weapon/melee/2h_sword/ep3_loot_lifeblood.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 153 670 kinetic 0 3 140 0 5 0 30 combat_2hsword_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_liquidsilver Liquidsilver L7 object/weapon/ranged/pistol/ep3_loot_liquidsilver.iff weapon 1 1000 ranged_weapon PISTOL 106 541 energy 0 2.5 120 0 25 0 30 combat_smuggler_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_mark Exemplar’s Mark object/weapon/ranged/carbine/ep3_loot_mark.iff weapon 1 1000 ranged_weapon CARBINE 150 720 energy 0 2.75 130 0 35 0 40 outdoors_squadleader_offense_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_necrosis Necrosis Nightblade object/weapon/melee/special/ep3_loot_necrosis.iff weapon 1 1000 melee_weapon UNARMED 182 850 kinetic 0 2.5 120 0 25 0 54 combat_unarmed_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_nullifier Nullifier X object/weapon/ranged/rifle/ep3_loot_nullifier.iff weapon 1 1000 ranged_weapon RIFLE 260 1160 energy 0 3.25 150 0 55 0 54 combat_rifleman_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_pestilence Pestilence object/weapon/melee/polearm/ep3_loot_pestilence.iff weapon 1 1000 melee_weapon POLEARM_MELEE 166 720 kinetic 0 2.75 130 0 5 0 40 combat_polearm_accuracy_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_poisonspike Poisonspike object/weapon/melee/polearm/ep3_loot_poisonspike.iff weapon 1 1000 melee_weapon POLEARM_MELEE 235 1060 kinetic 0 2.75 130 0 60 0 54 combat_polearm_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_quicktrigger Quicktrigger Countermand object/weapon/ranged/pistol/ep3_loot_quicktrigger.iff weapon 1 1000 ranged_weapon PISTOL 132 645 energy 0 2.5 120 0 25 0 40 combat_smuggler_underworld_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_retaliation Covert Retaliation object/weapon/ranged/rifle/ep3_loot_retaliation.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 60 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_retribution Retribution object/weapon/ranged/carbine/ep3_loot_retribution.iff weapon 1 1000 ranged_weapon CARBINE 150 720 energy 0 2.75 130 0 35 0 40 combat_bountyhunter_support_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_rhiss Rhiss Mark-20 object/weapon/ranged/pistol/ep3_loot_rhiss.iff weapon 1 1000 ranged_weapon PISTOL 107 545 energy 0 2.5 120 0 25 0 30 combat_pistol_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_rilctur Rilctur Carbine object/weapon/ranged/carbine/ep3_loot_rilctur.iff weapon 1 1000 ranged_weapon CARBINE 122 610 energy 0 2.75 130 0 35 0 30 combat_carbine_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_ripper Bloodshot Ripper object/weapon/melee/sword/ep3_loot_ripper.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 250 1055 kinetic 0 2.5 140 0 5 0 54 combat_2hsword_master 0 100 0 0 0 0 0 0 5400 0 0 - +ep3_loot_sharpshooter Vershyi Sharpshooter object/weapon/ranged/rifle/ep3_loot_sharpshooter.iff weapon 1 1000 ranged_weapon RIFLE 137 670 energy 0 3 140 0 60 0 30 combat_rifleman_novice 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_sickle Darstai’is Sickle object/weapon/melee/2h_sword/ep3_loot_sickle.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 186 800 kinetic 0 3 140 0 5 0 40 combat_2hsword_ability_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_silencer The Silencer object/weapon/ranged/pistol/ep3_loot_silencer.iff weapon 1 1000 ranged_weapon PISTOL 132 645 kinetic 0 2.5 120 0 25 0 40 combat_pistol_support_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_soulstinger Sayormi Soulstinger object/weapon/melee/special/ep3_loot_soulstinger.iff weapon 1 1000 melee_weapon UNARMED 132 645 energy 0 2.5 120 0 25 0 40 combat_unarmed_speed_03 0 100 0 0 0 0 0 0 4000 0 0 - +ep3_loot_strike Strike Assault Lance object/weapon/melee/polearm/ep3_loot_strike.iff weapon 1 1000 melee_weapon POLEARM_MELEE 138 605 kinetic 0 2.75 130 0 5 0 30 combat_polearm_master 0 100 0 0 0 0 0 0 3000 0 0 - +ep3_loot_void The Void object/weapon/ranged/heavy/ep3_loot_void.iff weapon 1 1000 ranged_weapon HEAVY 189 875 kinetic 0 3.25 150 0 55 0 40 combat_commando_heavyweapon_accuracy_03 0 100 0 0 0 0 0 0 4000 0 0 - +grenade_bug_bomb Zicx-bug Bomb object/weapon/ranged/grenade/grenade_bug_bomb.iff weapon 1 1000 ranged_weapon THROWN 162 645 energy 0 11 85 0 5 0 9 combat_commando_heavyweapon_accuracy_02 0 100 0 0 0 0 0 0 900 0 0 - +grenade_cryoban CryoBan Grenade object/weapon/ranged/grenade/grenade_cryoban.iff weapon 1 1000 ranged_weapon THROWN 129 515 energy 0 11 85 0 5 0 8 combat_commando_heavyweapon_accuracy_01 0 100 0 0 0 0 0 0 800 0 0 - +grenade_fragmentation C22 Fragmentation Grenade object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 70 280 kinetic 0 11 85 20 40 0 7 combat_commando_novice 0 100 0 0 0 0 0 0 700 0 0 - +grenade_fragmentation_light C12 Fragmentation Grenade object/weapon/ranged/grenade/grenade_fragmentation_light.iff weapon 1 1000 ranged_weapon THROWN 162 645 kinetic 0 11 100 5 10 0 9 combat_commando_heavyweapon_accuracy_02 0 100 0 0 0 0 0 0 900 0 0 - +grenade_glop Glop Grenade object/weapon/ranged/grenade/grenade_glop.iff weapon 1 1000 ranged_weapon THROWN 182 725 energy 0 11 110 5 10 0 10 combat_commando_heavyweapon_accuracy_03 0 100 0 0 0 0 0 0 1000 0 0 - +grenade_imperial_detonator Imperial Detonator object/weapon/ranged/grenade/grenade_imperial_detonator.iff weapon 1 1000 ranged_weapon THROWN 87 345 energy 0 11 65 10 30 0 1 0 100 0 0 0 0 0 0 100 0 0 - +grenade_proton Proton Grenade object/weapon/ranged/grenade/grenade_proton.iff weapon 1 1000 ranged_weapon THROWN 260 1040 energy 0 11 140 0 0 0 12 combat_commando_master 0 100 0 0 0 0 0 0 1200 0 0 - +grenade_thermal_detonator Thermal Detonator object/weapon/ranged/grenade/grenade_thermal_detonator.iff weapon 1 1000 ranged_weapon THROWN 229 915 energy 0 11 120 5 15 0 11 combat_commando_heavyweapon_accuracy_04 0 100 0 0 0 0 0 0 1100 0 0 - +heavy_acid_beam Acid Stream Launcher object/weapon/ranged/heavy/heavy_acid_beam.iff weapon 1 1000 ranged_weapon HEAVY 132 645 energy acid 220 3.25 150 0 65 0 40 combat_commando_support_03 0 100 0 0 0 0 0 0 4000 0 0 - +heavy_lightning_beam Lightning Beam Cannon object/weapon/ranged/heavy/heavy_lightning_beam.iff weapon 1 1000 ranged_weapon HEAVY 163 772 energy electricity 220 3.25 150 0 40 0 50 combat_commando_heavyweapon_speed_04 0 100 0 0 0 0 0 0 5000 0 0 - +heavy_particle_beam Heavy Particle Beam Cannon object/weapon/ranged/heavy/heavy_particle_beam.iff weapon 1 1000 ranged_weapon HEAVY 111 563 energy heat 150 3.25 150 0 40 0 30 combat_commando_heavyweapon_speed_02 0 100 0 0 0 0 0 0 3000 0 0 - +knife_dagger Dagger object/weapon/melee/knife/knife_dagger.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 100 0 0 0 0 0 0 100 0 0 - +knife_donkuwah Donkuwah Knife object/weapon/melee/knife/knife_donkuwah.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 100 0 0 0 0 0 0 100 0 0 - +knife_janta Janta Knife object/weapon/melee/knife/knife_janta.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 67 kinetic 0 2.5 120 0 5 0 1 0 100 0 0 0 0 0 0 100 0 0 - +knife_naktra_crystal Nak’tra Crystal Knife object/weapon/melee/knife/ep3/knife_naktra_crystal.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 166 722 kinetic 0 2.5 120 0 5 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +knife_stone Stone Knife object/weapon/melee/knife/knife_stone.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 100 0 0 0 0 0 0 100 0 0 - +knife_survival Survival Knife object/weapon/melee/knife/knife_survival.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 17 68 kinetic 0 2.5 120 0 5 0 1 0 100 0 0 0 0 0 0 100 0 0 - +knife_trando_skinner Sinew Wrapped Knife object/weapon/melee/knife/ep3/knife_trando_skinner.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 143 625 kinetic 0 2.5 120 0 5 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +knife_vibroblade Vibroblade object/weapon/melee/knife/knife_vibroblade.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 28 165 energy 0 2.5 120 0 5 0 10 0 100 0 0 0 0 0 0 1000 0 0 - +knife_vibroblade_quest Jagged Vibroblade object/weapon/melee/knife/knife_vibroblade_quest.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 28 170 energy 0 2.5 120 0 5 0 10 0 100 0 0 0 0 0 0 1000 0 0 - +knuckler_blasterfist Blaster Fist object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 112 570 energy heat 50 2.5 120 0 5 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +knuckler_massassi Massassi Knuckler object/weapon/melee/special/massassiknuckler.iff weapon 1 1000 melee_weapon UNARMED 47 310 energy 0 2.5 120 0 5 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +lance_controllerfp Lance object/weapon/melee/polearm/lance_controllerfp.iff weapon 1 1000 melee_weapon POLEARM_MELEE 57 345 kinetic 0 2.75 130 0 5 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +lance_controllerfp_nightsister Nightsister Lance object/weapon/melee/polearm/lance_controllerfp_nightsister.iff weapon 1 1000 melee_weapon POLEARM_MELEE 115 580 kinetic 0 2.75 130 0 5 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +lance_cryo Cryo Lance object/weapon/melee/polearm/lance_cryo.iff weapon 1 1000 melee_weapon POLEARM_MELEE 116 520 kinetic cold 65 2.75 130 0 5 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +lance_electric_polearm Electric Polearm object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 141 620 kinetic electricity 80 2.75 130 0 5 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +lance_kaminoan Kaminoan Great Staff object/weapon/melee/polearm/lance_kaminoan.iff weapon 1 1000 melee_weapon POLEARM_MELEE 103 465 kinetic 0 2.75 130 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +lance_kashyyk Kashyyyk Blade Stick object/weapon/melee/polearm/lance_kashyyk.iff weapon 1 1000 melee_weapon POLEARM_MELEE 191 820 kinetic 0 2.75 130 0 5 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +lance_lightsaber Double-Bladed Lightsaber object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_s1.iff weapon 1 1000 melee_weapon POLEARM_SABER 226 960 energy heat 110 2.75 130 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +lance_massassi Massassi Lance object/weapon/melee/polearm/lance_massassi.iff weapon 1 1000 melee_weapon POLEARM_MELEE 218 925 kinetic 0 2.75 130 0 5 0 54 combat_polearm_master 0 100 0 0 0 0 0 0 5400 0 0 - +lance_nightsister Nightsister Energy Lance object/weapon/melee/polearm/lance_nightsister.iff weapon 1 1000 melee_weapon POLEARM_MELEE 202 925 kinetic 0 2.75 130 0 5 0 54 combat_polearm_master 0 100 0 0 0 0 0 0 5400 0 0 - +lance_shock Shock Lance object/weapon/melee/polearm/lance_shock.iff weapon 1 1000 melee_weapon POLEARM_MELEE 104 538 kinetic electricity 50 2.75 130 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +lance_som_obsidian Obsidian Lance object/weapon/melee/polearm/som_lance_obsidian.iff weapon 1 1000 melee_weapon POLEARM_MELEE 218 925 energy 0 2.75 130 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +lance_som_xandank Xandank Lance object/weapon/melee/polearm/som_lance_xandank.iff weapon 1 1000 melee_weapon POLEARM_MELEE 218 925 energy 0 2.75 130 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +lance_staff_janta Janta Staff object/weapon/melee/polearm/lance_staff_janta.iff weapon 1 1000 melee_weapon POLEARM_MELEE 23 92 kinetic 0 2.75 130 0 5 0 6 0 100 0 0 0 0 0 0 600 0 0 - +lance_staff_metal Metal Staff object/weapon/melee/polearm/lance_staff_metal.iff weapon 1 1000 melee_weapon POLEARM_MELEE 27 140 kinetic 0 2.75 130 0 5 0 7 0 100 0 0 0 0 0 0 700 0 0 - +lance_staff_wood_s1 Wood Staff object/weapon/melee/polearm/lance_staff_wood_s1.iff weapon 1 1000 melee_weapon POLEARM_MELEE 19 75 kinetic 0 2.75 130 0 5 0 1 0 100 0 0 0 0 0 0 100 0 0 - +lance_staff_wood_s2 Reinforced Combat Staff object/weapon/melee/polearm/lance_staff_wood_s2.iff weapon 1 1000 melee_weapon POLEARM_MELEE 24 98 kinetic 0 2.75 130 0 5 0 6 0 100 0 0 0 0 0 0 600 0 0 - +lance_trando Trandoshan Hunter’s Lance object/weapon/melee/polearm/ep3/lance_trando.iff weapon 1 1000 melee_weapon POLEARM_MELEE 133 590 kinetic 0 2.75 130 0 5 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +lance_vibro_axe Long Vibro Axe object/weapon/melee/axe/axe_vibroaxe.iff weapon 1 1000 melee_weapon POLEARM_MELEE 144 695 kinetic 0 2.75 130 0 5 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +lance_vibrolance Vibro Lance object/weapon/melee/polearm/lance_vibrolance.iff weapon 1 1000 melee_weapon POLEARM_MELEE 202 925 kinetic 0 2.75 130 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_ad Alliance Disruptor object/weapon/ranged/pistol/pistol_alliance_disruptor.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 science_combatmedic_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_cdef CDEF Pistol object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 17 67 energy 0 2.5 120 0 35 0 1 0 100 0 0 0 0 0 0 100 0 0 - +pistol_cdef_corsec Corsec CDEF Pistol object/weapon/ranged/pistol/pistol_cdef_corsec.iff weapon 1 1000 ranged_weapon PISTOL 17 68 energy 0 2.5 120 0 35 0 1 0 100 0 0 0 0 0 0 100 0 0 - +pistol_d18 D18 Pistol object/weapon/ranged/pistol/pistol_d18.iff weapon 1 1000 ranged_weapon PISTOL 20 80 energy 0 2.5 120 0 35 0 6 0 100 0 0 0 0 0 0 600 0 0 - +pistol_de_10 DE-10 Pistol object/weapon/ranged/pistol/pistol_de_10.iff weapon 1 1000 ranged_weapon PISTOL 179 835 energy 0 2.5 120 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_deathhammer Death-Hammer Pistol object/weapon/ranged/pistol/pistol_deathhammer.iff weapon 1 1000 ranged_weapon PISTOL 125 617 energy 0 2.5 120 0 35 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +pistol_dh17 DH17 Pistol object/weapon/ranged/pistol/pistol_dh17.iff weapon 1 1000 ranged_weapon PISTOL 72 410 energy 0 2.5 120 0 35 0 22 0 100 0 0 0 0 0 0 2200 0 0 - +pistol_dl44 DL44 Pistol object/weapon/ranged/pistol/pistol_dl44.iff weapon 1 1000 ranged_weapon PISTOL 18 125 energy 0 2.5 120 0 35 0 7 0 100 0 0 0 0 0 0 700 0 0 - +pistol_dl44_metal DL44 XT object/weapon/ranged/pistol/pistol_dl44_metal.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_dl44_metal_light DL44 Metal Pistol object/weapon/ranged/pistol/pistol_dl44_metal_light.iff weapon 1 1000 ranged_weapon PISTOL 63 310 energy 0 2.5 120 0 35 0 12 combat_marksman_master 0 100 0 0 0 0 0 0 1200 0 0 - +pistol_dx2 DX2 Pistol object/weapon/ranged/pistol/pistol_dx2.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_flare Tchotchee Pistol object/weapon/ranged/pistol/pistol_flare.iff weapon 1 1000 ranged_weapon PISTOL 115 580 kinetic heat 40 2.5 120 0 35 0 50 outdoors_squadleader_offense_03 0 100 0 0 0 0 0 0 5000 0 0 - +pistol_flechette Vexa Flechette Pistol object/weapon/ranged/pistol/pistol_flechette.iff weapon 1 1000 ranged_weapon PISTOL 150 720 kinetic 0 2.5 120 0 35 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +pistol_fwg5 FWG5 Pistol object/weapon/ranged/pistol/pistol_fwg5.iff weapon 1 1000 ranged_weapon PISTOL 177 825 kinetic 0 2.5 120 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_fwg5_quest Featherweight FWG5 Pistol object/weapon/ranged/pistol/pistol_fwg5_quest.iff weapon 1 1000 ranged_weapon PISTOL 180 840 kinetic 0 2.5 120 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_geonosian_sonic_blaster Geonosian Sonic Blaster object/weapon/ranged/pistol/pistol_geonosian_sonic_blaster_loot.iff weapon 1 1000 ranged_weapon PISTOL 99 515 energy 0 2.5 120 0 35 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +pistol_intimidator Intimidator Pistol object/weapon/ranged/pistol/pistol_intimidator.iff weapon 1 1000 ranged_weapon PISTOL 177 825 kinetic 0 2.5 120 0 35 0 54 outdoors_squadleader_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_jawa Jawa Ion Pistol object/weapon/ranged/pistol/pistol_jawa.iff weapon 1 1000 ranged_weapon PISTOL 67 385 energy electricity 40 2.5 120 0 35 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +pistol_kyd21 KYD21 Pistol object/weapon/ranged/pistol/pistol_kyd21_generic.iff weapon 1 1000 ranged_weapon PISTOL 179 833 kinetic 0 2.5 120 0 25 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_launcher Launcher Pistol object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 60 360 kinetic heat 80 3.25 150 0 45 0 14 combat_commando_novice 0 100 0 0 0 0 0 0 1400 0 0 - +pistol_power5 Power5 Pistol object/weapon/ranged/pistol/pistol_power5.iff weapon 1 1000 ranged_weapon PISTOL 125 620 energy 0 2.5 120 0 35 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +pistol_renegade Renegade Pistol object/weapon/ranged/pistol/pistol_renegade.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 combat_smuggler_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_republic_blaster Republic Blaster object/weapon/ranged/pistol/pistol_republic_blaster.iff weapon 1 1000 ranged_weapon PISTOL 167 785 energy acid 60 2.5 120 0 35 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_republic_blaster_quest Modified Republic Blaster object/weapon/ranged/pistol/pistol_republic_blaster_quest.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_scatter High Capacity Scatter Pistol object/weapon/ranged/pistol/pistol_scatter.iff weapon 1 1000 ranged_weapon PISTOL 177 825 kinetic 0 2.5 120 0 35 0 54 combat_bountyhunter_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_scatter_light Scatter Pistol object/weapon/ranged/pistol/pistol_scatter_light.iff weapon 1 1000 ranged_weapon PISTOL 47 310 energy 0 2.5 120 0 35 0 14 combat_brawler_novice 0 100 0 0 0 0 0 0 1400 0 0 - +pistol_scout_blaster Scout Blaster object/weapon/ranged/pistol/pistol_scout_blaster.iff weapon 1 1000 ranged_weapon PISTOL 28 165 energy 0 2.5 120 0 35 0 10 0 100 0 0 0 0 0 0 1000 0 0 - +pistol_scout_blaster_corsec Corsec Scout Blaster object/weapon/ranged/pistol/pistol_scout_blaster_corsec.iff weapon 1 1000 ranged_weapon PISTOL 28 165 energy 0 2.5 120 0 35 0 10 0 100 0 0 0 0 0 0 1000 0 0 - +pistol_srcombat SR Combat Pistol object/weapon/ranged/pistol/pistol_srcombat.iff weapon 1 1000 ranged_weapon PISTOL 117 590 energy cold 30 2.5 120 0 25 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +pistol_striker Striker Pistol object/weapon/ranged/pistol/pistol_striker.iff weapon 1 1000 ranged_weapon PISTOL 47 310 kinetic 0 2.5 120 0 35 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +pistol_tangle Tangle Pistol object/weapon/ranged/pistol/pistol_tangle.iff weapon 1 1000 ranged_weapon PISTOL 132 645 kinetic 0 2.5 120 0 35 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +pistol_trando_suppressor Trandoshan Suppressor Pistol object/weapon/ranged/pistol/ep3/pistol_trando_suppressor.iff weapon 1 1000 ranged_weapon PISTOL 149 715 energy electricity 120 2.5 120 0 30 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_wookiee UR-G8 Pistol object/weapon/ranged/pistol/ep3/pistol_wookiee.iff weapon 1 1000 ranged_weapon PISTOL 179 835 energy 0 2.5 120 0 30 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +pistol_wookiee_bowcaster Kashyyyk Stalker Pistol object/weapon/ranged/pistol/ep3/pistol_wookiee_bowcaster.iff weapon 1 1000 ranged_weapon PISTOL 149 718 kinetic heat 120 2.5 120 0 30 0 54 combat_pistol_master 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_acid_beam Heavy Acid Rifle object/weapon/ranged/rifle/rifle_acid_beam.iff weapon 1 1000 ranged_weapon HEAVY 80 440 energy acid 130 3.25 150 0 45 0 22 combat_commando_support_01 0 100 0 0 0 0 0 0 2200 0 0 - +rifle_adventurer Fallann Hyper-Rifle object/weapon/ranged/rifle/rifle_adventurer.iff weapon 1 1000 ranged_weapon RIFLE 199 915 kinetic 0 3 140 0 65 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +rifle_beam Beam Rifle object/weapon/ranged/rifle/rifle_beam.iff weapon 1 1000 ranged_weapon RIFLE 102 525 energy heat 120 3 140 0 65 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +rifle_berserker Berserker Rifle object/weapon/ranged/rifle/rifle_berserker.iff weapon 1 1000 ranged_weapon RIFLE 163 772 kinetic 0 3 140 0 65 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_bowcaster Light Bowcaster object/weapon/ranged/rifle/rifle_bowcaster.iff weapon 1 1000 ranged_weapon RIFLE 22 85 kinetic 0 3 140 0 30 0 1 0 100 0 0 0 0 0 0 100 0 0 - +rifle_bowcaster_heavy Assault Bowcaster object/weapon/ranged/rifle/rifle_bowcaster_heavy.iff weapon 1 1000 ranged_weapon RIFLE 227 1030 kinetic 0 3 140 0 65 0 54 species_wookiee 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_bowcaster_medium Recon Bowcaster object/weapon/ranged/rifle/rifle_bowcaster_medium.iff weapon 1 1000 ranged_weapon RIFLE 38 205 kinetic 0 3 140 0 65 0 10 species_wookiee 0 100 0 0 0 0 0 0 1000 0 0 - +rifle_cdef CDEF Rifle object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 22 85 energy 0 3 140 0 35 0 1 0 100 0 0 0 0 0 0 100 0 0 - +rifle_dc15 DC15 Rifle object/weapon/ranged/rifle/ep3/rifle_dc15.iff weapon 1 1000 ranged_weapon RIFLE 230 1040 energy 0 3 140 0 60 0 54 outdoors_squadleader_master 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_dlt20 DLT20 Rifle object/weapon/ranged/rifle/rifle_dlt20.iff weapon 1 1000 ranged_weapon RIFLE 27 105 energy 0 3 140 0 40 0 6 0 100 0 0 0 0 0 0 600 0 0 - +rifle_dlt20a DLT20a Rifle object/weapon/ranged/rifle/rifle_dlt20a.iff weapon 1 1000 ranged_weapon RIFLE 25 155 energy 0 3 140 0 45 0 7 0 100 0 0 0 0 0 0 700 0 0 - +rifle_e11 E11 Rifle object/weapon/ranged/rifle/rifle_e11.iff weapon 1 1000 ranged_weapon RIFLE 99 515 energy 0 3 140 0 45 0 22 0 100 0 0 0 0 0 0 2200 0 0 - +rifle_flame_thrower Plasma Flame Thrower object/weapon/ranged/rifle/rifle_flame_thrower.iff weapon 1 1000 ranged_weapon HEAVY 222 1010 energy heat 140 3.25 150 0 25 0 54 combat_commando_master 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_flame_thrower_light Flame Thrower object/weapon/ranged/rifle/rifle_flame_thrower_light.iff weapon 1 1000 ranged_weapon HEAVY 154 735 energy heat 120 3.25 150 0 40 0 40 combat_commando_thrownweapon_03 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_geo_drill Geonosian Drill object/weapon/ranged/rifle/rifle_geo_drill.iff weapon 1 1000 ranged_weapon RIFLE 164 773 kinetic 0 3 140 0 65 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_jawa_ion Jawa Ion Rifle object/weapon/ranged/rifle/rifle_jawa_ion.iff weapon 1 1000 ranged_weapon RIFLE 164 775 energy electricity 130 3 140 0 65 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +rifle_laser Advanced Laser Rifle object/weapon/ranged/rifle/rifle_laser.iff weapon 1 1000 ranged_weapon RIFLE 227 1030 energy 0 3 140 0 65 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_laser_light Light Laser Rifle object/weapon/ranged/rifle/rifle_laser_light.iff weapon 1 1000 ranged_weapon RIFLE 163 772 energy 0 3 140 0 65 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_ld1 LD-1 Rifle object/weapon/ranged/rifle/rifle_ld1.iff weapon 1 1000 ranged_weapon RIFLE 199 915 kinetic 0 3 140 0 65 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +rifle_lightning Light Lightning Cannon object/weapon/ranged/rifle/rifle_lightning.iff weapon 1 1000 ranged_weapon RIFLE 107 545 energy electricity 100 3 140 0 65 0 30 combat_bountyhunter_novice 0 100 0 0 0 0 0 0 3000 0 0 - +rifle_lightning_light Lightning Rifle object/weapon/ranged/rifle/rifle_lightning_light.iff weapon 1 1000 ranged_weapon RIFLE 40 280 energy electricity 110 3 140 0 65 0 14 combat_bountyhunter_novice 0 100 0 0 0 0 0 0 1400 0 0 - +rifle_massassi_ink Massassi Ink Rifle object/weapon/ranged/rifle/rifle_massassi_ink.iff weapon 1 1000 ranged_weapon RIFLE 134 655 energy 0 3 140 0 65 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +rifle_naktra_crystal Nak’tra Crystal Rifle object/weapon/ranged/rifle/ep3/rifle_naktra_crystal.iff weapon 1 1000 ranged_weapon RIFLE 230 1040 energy 0 3 140 0 65 0 40 combat_rifleman_speed_03 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_odararissl Odara’rissl Rifle object/weapon/ranged/rifle/rifle_odararissl.iff weapon 1 1000 ranged_weapon RIFLE 167 785 kinetic 0 3 140 0 65 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_proton Proton Rifle object/weapon/ranged/rifle/rifle_proton.iff weapon 1 1000 ranged_weapon RIFLE 257 1150 energy 0 3 140 0 65 0 54 combat_commando_master 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_quest_tusken Tusken King’s Rifle object/weapon/ranged/rifle/event_rifle_tusken_berserker.iff weapon 1 1000 ranged_weapon RIFLE 167 785 kinetic 0 3 140 0 65 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_sg82 SG82 Rifle object/weapon/ranged/rifle/rifle_sg82.iff weapon 1 1000 ranged_weapon RIFLE 38 208 energy 0 3 140 0 40 0 10 0 100 0 0 0 0 0 0 1000 0 0 - +rifle_spraystick Spraystick object/weapon/ranged/rifle/rifle_spraystick.iff weapon 1 1000 ranged_weapon RIFLE 40 280 kinetic heat 110 3 140 0 65 0 14 combat_rifleman_novice 0 100 0 0 0 0 0 0 1400 0 0 - +rifle_t21 T21 Rifle object/weapon/ranged/rifle/rifle_t21.iff weapon 1 1000 ranged_weapon RIFLE 227 1030 energy 0 3 140 0 65 0 54 combat_rifleman_master 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_tenloss_dxr6_disruptor Tenloss DXR-6 Disruptor Rifle object/weapon/ranged/rifle/rifle_tenloss_dxr6_disruptor_loot.iff weapon 1 1000 ranged_weapon RIFLE 163 772 energy 0 3 140 0 65 0 40 combat_rifleman_novice 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_trando_hunter Trandoshan Hunting Rifle object/weapon/ranged/rifle/ep3/rifle_trando_hunter.iff weapon 1 1000 ranged_weapon RIFLE 230 1040 energy 0 3 140 0 65 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +rifle_tusken Tusken Rifle object/weapon/ranged/rifle/rifle_tusken.iff weapon 1 1000 ranged_weapon RIFLE 163 772 kinetic 0 3 140 0 65 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +rifle_victor_tusken Lithitanium Rifle object/weapon/ranged/rifle/rifle_victor_tusken.iff weapon 1 1000 ranged_weapon RIFLE 165 780 kinetic 0 3 140 0 65 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +rocket_launcher Rocket Launcher object/weapon/ranged/heavy/launcher.iff weapon 1 1000 ranged_weapon HEAVY 62 370 kinetic heat 200 3.25 150 0 64 0 20 combat_commando_thrownweapon_01 0 100 0 0 0 0 0 0 2000 0 0 - +som_hvy_lava_cannon Lava Cannon object/weapon/ranged/heavy/som_lava_cannon.iff weapon 1 1000 ranged_weapon HEAVY 222 1010 energy heat 140 3.25 150 0 65 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +som_hvy_republic_flamer Heavy Republic Flame Thrower object/weapon/ranged/heavy/som_republic_flamer.iff weapon 1 1000 ranged_weapon HEAVY 222 1010 energy heat 140 3.25 150 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +som_pistol_disruptor_pistol Disruptor Pistol object/weapon/ranged/pistol/som_disruptor_pistol.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +som_pistol_ion_relic Ion Relic Pistol object/weapon/ranged/pistol/som_ion_relic_pistol.iff weapon 1 1000 ranged_weapon PISTOL 177 825 energy 0 2.5 120 0 35 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +som_rifle_dp23 DP-23 Rifle object/weapon/ranged/rifle/som_rifle_dp23.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 65 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +som_rifle_mustafar_disruptor Disruptor Rifle object/weapon/ranged/rifle/som_rifle_mustafar_disruptor.iff weapon 1 1000 ranged_weapon RIFLE 234 1055 energy 0 3 140 0 65 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_01 Sword object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 27 105 kinetic 0 2.5 140 0 5 0 6 0 100 0 0 0 0 0 0 600 0 0 - +sword_02 Curved Sword object/weapon/melee/sword/sword_02.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 63 310 kinetic 0 2.5 120 0 5 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +sword_2h_axe Two-handed Axe object/weapon/melee/2h_sword/2h_sword_battleaxe.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 27 105 kinetic 0 3 140 0 5 0 6 0 100 0 0 0 0 0 0 600 0 0 - +sword_2h_axe_quest Gamorrean Battleaxe object/weapon/melee/2h_sword/2h_sword_battleaxe_quest.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 27 110 kinetic 0 3 140 0 5 0 6 0 100 0 0 0 0 0 0 600 0 0 - +sword_2h_blacksun_hack Black Sun Executioner’s Hack object/weapon/melee/2h_sword/2h_sword_blacksun_hack.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 148 645 kinetic 0 3 140 0 5 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +sword_2h_cleaver Two-handed Cleaver object/weapon/melee/2h_sword/2h_sword_cleaver.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 44 205 kinetic 0 3 140 0 5 0 10 0 100 0 0 0 0 0 0 1000 0 0 - +sword_2h_kashyyk Two-handed Kashyyyk Sword object/weapon/melee/2h_sword/2h_sword_kashyyk.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 115 515 kinetic 0 3 140 0 5 0 22 0 100 0 0 0 0 0 0 2200 0 0 - +sword_2h_katana Two-handed Curved Sword object/weapon/melee/2h_sword/2h_sword_katana.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 69 310 kinetic 0 2.5 120 0 5 0 12 0 100 0 0 0 0 0 0 1200 0 0 - +sword_2h_katana_quest Grooved Two-handed Sword object/weapon/melee/2h_sword/2h_sword_katana_quest.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 71 315 kinetic 0 2.5 120 0 5 0 12 0 100 0 0 0 0 0 0 1200 0 0 - +sword_2h_maul Power Hammer object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 243 1030 kinetic 0 3 140 0 5 0 54 combat_2hsword_master 0 100 0 0 0 0 0 0 5400 0 0 - +sword_2h_scythe Scythe Blade object/weapon/melee/2h_sword/2h_sword_scythe.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 190 815 kinetic acid 90 3 140 0 5 0 50 combat_1hsword_support_04 0 100 0 0 0 0 0 0 5000 0 0 - +sword_2h_sith Two-handed Sith Sword object/weapon/melee/2h_sword/2h_sword_sith.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 200 853 kinetic cold 50 3 140 0 5 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +sword_acid Xris Acid Sword object/weapon/melee/sword/sword_acid.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 231 980 kinetic acid 50 2.5 140 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_blade_rantok Rantok object/weapon/melee/sword/sword_rantok.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 88 410 kinetic 0 2.5 120 0 5 0 22 0 100 0 0 0 0 0 0 2200 0 0 - +sword_blade_ryyk Ryyk Blade object/weapon/melee/sword/sword_blade_ryyk.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 166 720 kinetic 0 2.5 120 0 5 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +sword_curved_nyax Curved Nyax Sword object/weapon/melee/sword/sword_curved_nyax.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 141 620 kinetic 0 2.5 120 0 5 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +sword_junti_mace Junti Mace object/weapon/melee/sword/sword_mace_junti.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 148 645 kinetic 0 2.5 140 0 5 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +sword_lightsaber Lightsaber object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s1.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 226 960 energy heat 110 2.5 120 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_lightsaber_2h Two-Handed Lightsaber object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s1.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 226 960 energy heat 110 3 140 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_lightsaber_training A Training Lightsaber object/weapon/melee/sword/crafted_saber/sword_lightsaber_training.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 226 960 energy heat 110 2.5 120 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_marauder Champion’s Sword object/weapon/melee/sword/sword_marauder.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 115 515 kinetic 0 2.5 120 0 5 0 30 0 100 0 0 0 0 0 0 3000 0 0 - +sword_massassi Urnsor’is Soulleecher object/weapon/melee/sword/sword_massassi.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 211 900 kinetic 0 2.5 140 0 5 0 50 0 100 0 0 0 0 0 0 5000 0 0 - +sword_nyax Nyax Sword object/weapon/melee/sword/sword_nyax.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 115 515 kinetic 0 2.5 140 0 5 0 22 0 100 0 0 0 0 0 0 2200 0 0 - +sword_rsf RSF Sword object/weapon/melee/sword/sword_rsf.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 141 620 kinetic 0 2.5 120 0 5 0 40 0 100 0 0 0 0 0 0 4000 0 0 - +sword_som_2h_obsidian Two-Handed Obsidian Sword object/weapon/melee/2h_sword/som_2h_sword_obsidian.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 226 960 energy 0 3 140 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_som_2h_tulrus Two-Handed Tulrus Sword object/weapon/melee/2h_sword/som_2h_sword_tulrus.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 226 960 energy 0 3 140 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_som_mustafar_bandit Mustafar Bandit Sword object/weapon/melee/sword/som_sword_mustafar_bandit.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 250 1055 energy 0 2.5 120 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_som_obsidian Obsidian Sword object/weapon/melee/sword/som_sword_obsidian.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 250 1055 energy 0 2.5 120 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +sword_wookiee Blade of Nyenthi’oris object/weapon/melee/sword/ep3/sword_wookiee.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 246 1040 kinetic 0 2.5 140 0 5 0 54 0 100 0 0 0 0 0 0 5400 0 0 - +vibroknuckler Vibro Knuckler object/weapon/melee/special/vibroknuckler.iff weapon 1 1000 melee_weapon UNARMED 77 425 energy 0 2.5 120 0 5 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +victor_baton_gaderiffi Black Metal Gaderiffi Baton object/weapon/melee/baton/victor_baton_gaderiffi.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 63 310 kinetic 0 2.5 120 0 5 0 14 0 100 0 0 0 0 0 0 1400 0 0 - +wookiee_knuckler Knuckles of the Katarn object/weapon/melee/special/ep3/wookiee_knuckler.iff weapon 1 1000 melee_weapon UNARMED 149 715 kinetic cold 120 2.5 120 0 5 0 54 combat_unarmed_master 0 100 0 0 0 0 0 0 5400 0 0 - +weapon_wound_testing Wound test carbine object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 100 100 energy 0 2.5 100 0 50 0 1 0 10000 0 0 0 0 0 0 1000 0 0 - weapon_cl1_carbine Carbine (CL 1) object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 20 77 energy 0 2.5 100 0 50 0 1 0 120 0 0 0 0 0 0 1000 0 0 - weapon_cl10_carbine Carbine (CL 10) object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 33 185 energy 0 2.5 100 0 50 0 10 0 120 0 0 0 0 0 0 1000 0 0 - weapon_cl20_carbine Carbine (CL 20) object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 87 465 energy 0 2.5 100 0 50 0 20 0 120 0 0 0 0 0 0 1000 0 0 - weapon_cl30_carbine Carbine (CL 30) object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 117 590 energy 0 2.5 100 0 50 0 30 0 120 0 0 0 0 0 0 1000 0 0 - weapon_cl40_carbine Carbine (CL 40) object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 144 695 energy 0 2.5 100 0 50 0 40 0 120 0 0 0 0 0 0 1000 0 0 - weapon_cl50_carbine Carbine (CL 50) object/weapon/ranged/carbine/carbine_cdef.iff weapon 1 1000 ranged_weapon CARBINE 202 925 energy 0 2.5 100 0 50 0 50 0 120 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_heavy Heavy (CL 1) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 20 77 kinetic 0 2.5 100 0 64 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_heavy Heavy (CL 1) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 20 77 kinetic 0 2.5 100 0 64 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_heavy Heavy (CL 10) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 33 185 kinetic 0 2.5 100 0 64 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_heavy Heavy (CL 20) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 87 465 kinetic 0 2.5 100 0 64 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_heavy Heavy (CL 30) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 117 590 kinetic 0 2.5 100 0 64 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_heavy Heavy (CL 40) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 144 695 kinetic 0 2.5 100 0 64 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_heavy Heavy (CL 50) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 202 925 kinetic 0 2.5 100 0 64 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_1h 1h sword (CL 1) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 20 77 kinetic 0 2.5 100 0 5 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl20_heavy Heavy (CL 20) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 87 465 kinetic 0 2.5 100 0 64 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_heavy Heavy (CL 30) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 117 590 kinetic 0 2.5 100 0 64 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_heavy Heavy (CL 40) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 144 695 kinetic 0 2.5 100 0 64 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_heavy Heavy (CL 50) object/weapon/ranged/pistol/pistol_launcher.iff weapon 1 1000 ranged_weapon HEAVY 202 925 kinetic 0 2.5 100 0 64 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_1h 1h sword (CL 1) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 20 77 kinetic 0 2.5 100 0 5 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_1h 1h sword (CL 10) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 33 185 kinetic 0 2.5 100 0 5 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_1h 1h sword (CL 20) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 87 465 kinetic 0 2.5 100 0 5 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_1h 1h sword (CL 30) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 117 590 kinetic 0 2.5 100 0 5 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_1h 1h sword (CL 40) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 144 695 kinetic 0 2.5 100 0 5 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_1h 1h sword (CL 50) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 202 925 kinetic 0 2.5 100 0 5 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_pistol Pistol (CL 1) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 20 77 kinetic 0 2.5 100 0 35 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl20_1h 1h sword (CL 20) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 87 465 kinetic 0 2.5 100 0 5 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_1h 1h sword (CL 30) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 117 590 kinetic 0 2.5 100 0 5 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_1h 1h sword (CL 40) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 144 695 kinetic 0 2.5 100 0 5 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_1h 1h sword (CL 50) object/weapon/melee/sword/sword_01.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 202 925 kinetic 0 2.5 100 0 5 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_pistol Pistol (CL 1) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 20 77 kinetic 0 2.5 100 0 35 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_pistol Pistol (CL 10) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 33 185 kinetic 0 2.5 100 0 35 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_pistol Pistol (CL 20) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 87 465 kinetic 0 2.5 100 0 35 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_pistol Pistol (CL 30) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 117 590 kinetic 0 2.5 100 0 35 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_pistol Pistol (CL 40) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 144 695 kinetic 0 2.5 100 0 35 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_pistol Pistol (CL 50) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 202 925 kinetic 0 2.5 100 0 35 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_polearm Polearm (CL 1) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 20 77 kinetic 0 2.5 100 0 5 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl20_pistol Pistol (CL 20) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 87 465 kinetic 0 2.5 100 0 35 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_pistol Pistol (CL 30) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 117 590 kinetic 0 2.5 100 0 35 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_pistol Pistol (CL 40) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 144 695 kinetic 0 2.5 100 0 35 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_pistol Pistol (CL 50) object/weapon/ranged/pistol/pistol_cdef.iff weapon 1 1000 ranged_weapon PISTOL 202 925 kinetic 0 2.5 100 0 35 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_polearm Polearm (CL 1) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 20 77 kinetic 0 2.5 100 0 5 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_polearm Polearm (CL 10) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 33 185 kinetic 0 2.5 100 0 5 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_polearm Polearm (CL 20) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 87 465 kinetic 0 2.5 100 0 5 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_polearm Polearm (CL 30) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 117 590 kinetic 0 2.5 100 0 5 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_polearm Polearm (CL 40) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 144 695 kinetic 0 2.5 100 0 5 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_polearm Polearm (CL 50) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 202 925 kinetic 0 2.5 100 0 5 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_rifle Rifle (CL 1) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 20 77 kinetic 0 2.5 100 0 64 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl20_polearm Polearm (CL 20) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 87 465 kinetic 0 2.5 100 0 5 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_polearm Polearm (CL 30) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 117 590 kinetic 0 2.5 100 0 5 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_polearm Polearm (CL 40) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 144 695 kinetic 0 2.5 100 0 5 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_polearm Polearm (CL 50) object/weapon/melee/polearm/lance_electric_polearm.iff weapon 1 1000 melee_weapon POLEARM_MELEE 202 925 kinetic 0 2.5 100 0 5 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_rifle Rifle (CL 1) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 20 77 kinetic 0 2.5 100 0 64 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_rifle Rifle (CL 10) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 33 185 kinetic 0 2.5 100 0 64 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_rifle Rifle (CL 20) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 87 465 kinetic 0 2.5 100 0 64 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_rifle Rifle (CL 30) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 117 590 kinetic 0 2.5 100 0 64 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_rifle Rifle (CL 40) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 144 695 kinetic 0 2.5 100 0 64 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_rifle Rifle (CL 50) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 202 925 kinetic 0 2.5 100 0 64 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_grenade Grenade (CL 1) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 20 77 kinetic 0 2.5 100 0 32 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl20_rifle Rifle (CL 20) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 87 465 kinetic 0 2.5 100 0 64 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_rifle Rifle (CL 30) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 117 590 kinetic 0 2.5 100 0 64 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_rifle Rifle (CL 40) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 144 695 kinetic 0 2.5 100 0 64 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_rifle Rifle (CL 50) object/weapon/ranged/rifle/rifle_cdef.iff weapon 1 1000 ranged_weapon RIFLE 202 925 kinetic 0 2.5 100 0 64 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_grenade Grenade (CL 1) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 20 77 kinetic 0 2.5 100 0 32 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_grenade Grenade (CL 10) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 33 185 kinetic 0 2.5 100 0 32 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_grenade Grenade (CL 20) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 87 465 kinetic 0 2.5 100 0 32 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_grenade Grenade (CL 30) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 117 590 kinetic 0 2.5 100 0 32 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_grenade Grenade (CL 40) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 144 695 kinetic 0 2.5 100 0 32 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_grenade Grenade (CL 50) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 202 925 kinetic 0 2.5 100 0 32 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_2h 2h sword (CL 1) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 20 77 kinetic 0 2.5 100 0 5 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl20_grenade Grenade (CL 20) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 87 465 kinetic 0 2.5 100 0 32 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_grenade Grenade (CL 30) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 117 590 kinetic 0 2.5 100 0 32 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_grenade Grenade (CL 40) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 144 695 kinetic 0 2.5 100 0 32 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_grenade Grenade (CL 50) object/weapon/ranged/grenade/grenade_fragmentation.iff weapon 1 1000 ranged_weapon THROWN 202 925 kinetic 0 2.5 100 0 32 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_2h 2h sword (CL 1) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 20 77 kinetic 0 2.5 100 0 5 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_2h 2h sword (CL 10) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 33 185 kinetic 0 2.5 100 0 5 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_2h 2h sword (CL 20) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 87 465 kinetic 0 2.5 100 0 5 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_2h 2h sword (CL 30) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 117 590 kinetic 0 2.5 100 0 5 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_2h 2h sword (CL 40) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 144 695 kinetic 0 2.5 100 0 5 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_2h 2h sword (CL 50) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 202 925 kinetic 0 2.5 100 0 5 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl1_unarmed Unarmed (CL 1) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 20 77 kinetic 0 2.5 100 0 5 0 1 0 0 0 0 0 0 0 0 1000 0 0 - +weapon_cl20_2h 2h sword (CL 20) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 87 465 kinetic 0 2.5 100 0 5 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_2h 2h sword (CL 30) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 117 590 kinetic 0 2.5 100 0 5 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_2h 2h sword (CL 40) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 144 695 kinetic 0 2.5 100 0 5 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_2h 2h sword (CL 50) object/weapon/melee/2h_sword/2h_sword_maul.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 202 925 kinetic 0 2.5 100 0 5 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl1_unarmed Unarmed (CL 1) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 20 77 kinetic 0 2.5 100 0 5 0 1 0 100 0 0 0 0 0 0 1000 0 0 - weapon_cl10_unarmed Unarmed (CL 10) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 33 185 kinetic 0 2.5 100 0 5 0 10 0 100 0 0 0 0 0 0 1000 0 0 - -weapon_cl20_unarmed Unarmed (CL 20) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 87 465 kinetic 0 2.5 100 0 5 0 20 0 200 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_unarmed Unarmed (CL 30) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 117 590 kinetic 0 2.5 100 0 5 0 30 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_unarmed Unarmed (CL 40) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 144 695 kinetic 0 2.5 100 0 5 0 40 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_unarmed Unarmed (CL 50) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 202 925 kinetic 0 2.5 100 0 5 0 50 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_1h_ls 1h LS (CL 30) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s13.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 117 590 energy heat 50 2.5 100 0 5 0 30 force_title_jedi_rank_01 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_1h_ls 1h LS (CL 40) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s3.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 144 695 energy heat 100 2.5 100 0 5 0 40 force_title_jedi_rank_01 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_1h_ls 1h LS (CL 50) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s4.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 202 925 energy heat 150 2.5 100 0 5 0 50 force_title_jedi_rank_01 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl60_1h_ls 1h LS (CL 60) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s1.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 400 925 energy heat 200 2.5 100 0 5 0 60 force_title_jedi_rank_01 0 600 0 0 0 0 0 0 1000 0 0 - -weapon_cl70_1h_ls 1h LS (CL 70) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s10.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 600 925 energy heat 250 2.5 100 0 5 0 70 force_title_jedi_rank_01 0 700 0 0 0 0 0 0 1000 0 0 - -weapon_cl80_1h_ls 1h LS (CL 80) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s11.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 800 925 energy heat 300 2.5 100 0 5 0 80 force_title_jedi_rank_01 0 800 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_2h_ls 2h LS (CL 30) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s13.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 117 590 energy heat 50 2.5 100 0 5 0 30 force_title_jedi_rank_01 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_2h_ls 2h LS (CL 40) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s3.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 144 695 energy heat 100 2.5 100 0 5 0 40 force_title_jedi_rank_01 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_2h_ls 2h LS (CL 50) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s4.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 202 925 energy heat 150 2.5 100 0 5 0 50 force_title_jedi_rank_01 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl60_2h_ls 2h LS (CL 60) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s1.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 400 925 energy heat 200 2.5 100 0 5 0 60 force_title_jedi_rank_01 0 600 0 0 0 0 0 0 1000 0 0 - -weapon_cl70_2h_ls 2h LS (CL 70) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s10.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 600 925 energy heat 250 2.5 100 0 5 0 70 force_title_jedi_rank_01 0 700 0 0 0 0 0 0 1000 0 0 - -weapon_cl80_2h_ls 2h LS (CL 80) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s11.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 800 925 energy heat 300 2.5 100 0 5 0 80 force_title_jedi_rank_01 0 800 0 0 0 0 0 0 1000 0 0 - -weapon_cl30_polearm_ls Polearm LS (CL 30) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen4.iff weapon 1 1000 melee_weapon POLEARM_SABER 117 590 energy heat 50 2.5 100 0 5 0 30 force_title_jedi_rank_01 0 300 0 0 0 0 0 0 1000 0 0 - -weapon_cl40_polearm_ls Polearm LS (CL 40) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen5.iff weapon 1 1000 melee_weapon POLEARM_SABER 144 695 energy heat 100 2.5 100 0 5 0 40 force_title_jedi_rank_01 0 400 0 0 0 0 0 0 1000 0 0 - -weapon_cl50_polearm_ls Polearm LS (CL 50) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_s2.iff weapon 1 1000 melee_weapon POLEARM_SABER 202 925 energy heat 150 2.5 100 0 5 0 50 force_title_jedi_rank_01 0 500 0 0 0 0 0 0 1000 0 0 - -weapon_cl60_polearm_ls Polearm LS (CL 60) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen1.iff weapon 1 1000 melee_weapon POLEARM_SABER 400 925 energy heat 200 2.5 100 0 5 0 60 force_title_jedi_rank_01 0 600 0 0 0 0 0 0 1000 0 0 - -weapon_cl70_polearm_ls Polearm LS (CL 70) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen2.iff weapon 1 1000 melee_weapon POLEARM_SABER 600 925 energy heat 250 2.5 100 0 5 0 70 force_title_jedi_rank_01 0 700 0 0 0 0 0 0 1000 0 0 - -weapon_cl80_polearm_ls Polearm LS (CL 80) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen3.iff weapon 1 1000 melee_weapon POLEARM_SABER 800 925 energy heat 300 2.5 100 0 5 0 80 force_title_jedi_rank_01 0 800 0 0 0 0 0 0 1000 0 0 - -weapon_ep3_loot_corellian Corellian Destroyer object/weapon/ranged/heavy/ep3_loot_corellian.iff weapon 1 1000 ranged_weapon HEAVY 165 330 energy 0 2.5 132 0 55 0 30 combat_commando_novice 0 0 0 0 0 0 1 0 1000 0 0 - +weapon_cl20_unarmed Unarmed (CL 20) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 87 465 kinetic 0 2.5 100 0 5 0 20 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_unarmed Unarmed (CL 30) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 117 590 kinetic 0 2.5 100 0 5 0 30 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_unarmed Unarmed (CL 40) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 144 695 kinetic 0 2.5 100 0 5 0 40 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_unarmed Unarmed (CL 50) object/weapon/melee/special/blasterfist.iff weapon 1 1000 melee_weapon UNARMED 202 925 kinetic 0 2.5 100 0 5 0 50 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_1h_ls 1h LS (CL 30) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s13.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 117 590 energy heat 50 2.5 100 0 5 0 30 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_1h_ls 1h LS (CL 40) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s3.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 144 695 energy heat 100 2.5 100 0 5 0 40 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_1h_ls 1h LS (CL 50) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s4.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 202 925 energy heat 150 2.5 100 0 5 0 50 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl60_1h_ls 1h LS (CL 60) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s1.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 400 925 energy heat 200 2.5 100 0 5 0 60 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl70_1h_ls 1h LS (CL 70) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s10.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 600 925 energy heat 250 2.5 100 0 5 0 70 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl80_1h_ls 1h LS (CL 80) object/weapon/melee/sword/crafted_saber/sword_lightsaber_one_handed_s11.iff weapon 1 1000 melee_weapon ONE_HANDED_SABER 800 925 energy heat 300 2.5 100 0 5 0 80 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_2h_ls 2h LS (CL 30) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s13.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 117 590 energy heat 50 2.5 100 0 5 0 30 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_2h_ls 2h LS (CL 40) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s3.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 144 695 energy heat 100 2.5 100 0 5 0 40 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_2h_ls 2h LS (CL 50) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s4.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 202 925 energy heat 150 2.5 100 0 5 0 50 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl60_2h_ls 2h LS (CL 60) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s1.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 400 925 energy heat 200 2.5 100 0 5 0 60 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl70_2h_ls 2h LS (CL 70) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s10.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 600 925 energy heat 250 2.5 100 0 5 0 70 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl80_2h_ls 2h LS (CL 80) object/weapon/melee/2h_sword/crafted_saber/sword_lightsaber_two_handed_s11.iff weapon 1 1000 melee_weapon TWO_HANDED_SABER 800 925 energy heat 300 2.5 100 0 5 0 80 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl30_polearm_ls Polearm LS (CL 30) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen4.iff weapon 1 1000 melee_weapon POLEARM_SABER 117 590 energy heat 50 2.5 100 0 5 0 30 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl40_polearm_ls Polearm LS (CL 40) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen5.iff weapon 1 1000 melee_weapon POLEARM_SABER 144 695 energy heat 100 2.5 100 0 5 0 40 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl50_polearm_ls Polearm LS (CL 50) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_s2.iff weapon 1 1000 melee_weapon POLEARM_SABER 202 925 energy heat 150 2.5 100 0 5 0 50 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl60_polearm_ls Polearm LS (CL 60) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen1.iff weapon 1 1000 melee_weapon POLEARM_SABER 400 925 energy heat 200 2.5 100 0 5 0 60 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl70_polearm_ls Polearm LS (CL 70) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen2.iff weapon 1 1000 melee_weapon POLEARM_SABER 600 925 energy heat 250 2.5 100 0 5 0 70 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_cl80_polearm_ls Polearm LS (CL 80) object/weapon/melee/polearm/crafted_saber/sword_lightsaber_polearm_gen3.iff weapon 1 1000 melee_weapon POLEARM_SABER 800 925 energy heat 300 2.5 100 0 5 0 80 force_title_jedi_rank_01 0 100 0 0 0 0 0 0 1000 0 0 - +weapon_ep3_loot_corellian Corellian Destroyer object/weapon/ranged/heavy/ep3_loot_corellian.iff weapon 1 1000 ranged_weapon HEAVY 165 330 energy 0 2.5 132 0 55 0 30 combat_commando_novice 0 100 0 0 0 0 1 0 1000 0 0 - weapon_tow_cannon_02_01 Lava Cannon object/weapon/ranged/heavy/som_lava_cannon_generic.iff weapon 1 1000 ranged_weapon HEAVY 303 605 energy heat 120 2.5 139 0 36 0 55 combat_commando_master ranged_accuracy=7 5 410 75 6 0 0 0 0 5500 0 0 - weapon_baton_gaderiffi Gaderiff Baton object/weapon/melee/baton/baton_gaderiffi.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 77 154 kinetic 0 2.5 98 0 5 0 14 0 100 0 0 0 0 0 0 100 0 0 - weapon_sword_urnsoris_soulleecher Urnsor'is Soulleecher object/weapon/melee/sword/sword_massassi_generic.iff weapon 1 1000 melee_weapon ONE_HANDED_MELEE 275 550 kinetic 0 2.5 95 0 5 0 50 0 290 0 0 0 0 1 0 5000 0 0 - @@ -292,9 +293,9 @@ weapon_ep3_stalker_pistol Kashyyyk Stalker Pistol object/weapon/ranged/pistol/ep weapon_pistol_kyd21 KYD21 Pistol object/weapon/ranged/pistol/ep3/pistol_kyd21.iff weapon 1 1000 ranged_weapon PISTOL 297 594 kinetic 0 2.5 100 0 5 0 54 combat_pistol_master 0 240 0 0 0 0 1 0 1000 0 0 - weapon_tow_pistol_02_01 Mustafarian Modified Disruptor Pistol object/weapon/ranged/pistol/som_disruptor_pistol_generic.iff weapon 1 1000 ranged_weapon PISTOL 303 605 energy 0 2.5 107 0 35 0 55 combat_pistol_master ranged_accuracy=7 5 240 0 0 0 1 0 0 6000 0 0 - weapon_ep3_loot_quicktrigger Quicktrigger Countermand object/weapon/ranged/pistol/ep3_loot_quicktrigger.iff weapon 1 1000 ranged_weapon PISTOL 220 440 energy 0 2.5 90 0 25 0 40 combat_smuggler_underworld_03 ranged_accuracy=8,pistol_speed=13 0 190 0 0 0 0 1 0 4000 0 0 - -weapon_pistol_republic_blaster_exceptional Republic Blaster (Exceptional) object/weapon/ranged/pistol/pistol_republic_blaster.iff weapon 1 1000 ranged_weapon PISTOL 297 594 energy acid 48 2.5 84 0 5 0 54 combat_pistol_master 0 2400 0 0 0 0 1 0 1000 0 0 - -weapon_ep3_loot_rhiss Rhiss Mark-20 object/weapon/ranged/pistol/ep3_loot_rhiss.iff weapon 1 1000 ranged_weapon PISTOL 165 330 energy 0 2.5 99 0 25 0 30 combat_pistol_novice 0 0 0 0 0 0 1 0 3000 0 0 - -weapon_pistol_trando_suppressor Trandoshan Suppressor Pistol object/weapon/ranged/pistol/ep3/pistol_trando_suppressor.iff weapon 1 1000 ranged_weapon PISTOL 297 594 energy electricity 120 2.5 75 0 30 0 54 combat_pistol_master 0 0 0 0 0 0 1 0 5400 0 0 - +weapon_pistol_republic_blaster_exceptional Republic Blaster (Exceptional) object/weapon/ranged/pistol/pistol_republic_blaster.iff weapon 1 1000 ranged_weapon PISTOL 297 594 energy acid 48 2.5 84 0 5 0 54 combat_pistol_master 0 240 0 0 0 0 1 0 1000 0 0 - +weapon_ep3_loot_rhiss Rhiss Mark-20 object/weapon/ranged/pistol/ep3_loot_rhiss.iff weapon 1 1000 ranged_weapon PISTOL 165 330 energy 0 2.5 99 0 25 0 30 combat_pistol_novice 0 100 0 0 0 0 1 0 3000 0 0 - +weapon_pistol_trando_suppressor Trandoshan Suppressor Pistol object/weapon/ranged/pistol/ep3/pistol_trando_suppressor.iff weapon 1 1000 ranged_weapon PISTOL 297 594 energy electricity 120 2.5 75 0 30 0 54 combat_pistol_master 0 100 0 0 0 0 1 0 5400 0 0 - weapon_pistol_urg8 UR-G8 Pistol object/weapon/ranged/pistol/ep3/pistol_wookiee.iff weapon 1 1000 ranged_weapon PISTOL 297 594 energy 0 2.5 75 0 5 0 54 0 270 0 0 0 1 1 0 5400 0 0 - weapon_polearm_metal_staff Metal Staff object/weapon/melee/polearm/lance_staff_metal.iff weapon 1 1000 melee_weapon POLEARM_MELEE 33 66 kinetic 0 2.5 94 0 5 0 6 0 250 0 0 0 0 1 0 600 0 0 - weapon_ep3_loot_covert_retaliation Covert Retaliation object/weapon/ranged/rifle/ep3_loot_retaliation.iff weapon 1 1000 ranged_weapon RIFLE 297 594 energy 0 2.5 101 0 60 0 54 combat_bountyhunter_master ranged_accuracy=8,pistol_speed=13 0 250 0 0 0 0 1 0 1000 0 0 - @@ -302,7 +303,7 @@ weapon_tow_rifle_03_02 Coynite Disruptor Rifle object/weapon/ranged/rifle/som_ri weapon_ep3_loot_darksting Darksting Assassin object/weapon/ranged/rifle/ep3_loot_darksting.iff weapon 1 1000 ranged_weapon RIFLE 297 594 energy 0 2.5 80 0 25 0 54 combat_marksman_master rifle_accuracy=15 0 250 0 0 0 0 1 0 1000 0 0 - weapon_rifle_e11 E-11 Rifle object/weapon/ranged/rifle/rifle_e11_generic.iff weapon 1 1000 ranged_weapon RIFLE 121 242 energy 0 2.5 106 0 45 0 22 0 100 0 0 0 0 0 0 2200 0 0 - weapon_rifle_lithitanium E-11 Rifle object/weapon/ranged/rifle/rifle_tusken.iff weapon 1 1000 ranged_weapon RIFLE 220 440 kinetic 0 2.5 101 0 65 0 40 0 140 0 0 0 0 0 0 4000 0 0 - -weapon_ep3_loot_fallann Fallann Hyper-Rifle object/weapon/ranged/rifle/ep3_loot_retaliation.iff weapon 1 1000 ranged_weapon RIFLE 275 550 kinetic 0 2.5 95 0 65 0 50 0 50 0 0 0 1 1 0 1000 0 0 - +weapon_ep3_loot_fallann Fallann Hyper-Rifle object/weapon/ranged/rifle/ep3_loot_retaliation.iff weapon 1 1000 ranged_weapon RIFLE 275 550 kinetic 0 2.5 95 0 65 0 50 0 100 0 0 0 1 1 0 1000 0 0 - weapon_rifle_trando_hunting Trandoshan Hunting Rifle object/weapon/ranged/rifle/ep3/rifle_trando_hunter.iff weapon 1 1000 ranged_weapon RIFLE 297 594 energy 0 2.5 95 0 65 0 54 0 270 0 0 0 0 1 0 5400 0 0 - weapon_2h_sword_battleaxe_gamorrean Gamorrean Battleaxe object/weapon/melee/2h_sword/2h_sword_battleaxe_quest.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 33 66 kinetic 0 2.5 115 0 5 0 6 0 140 0 0 0 0 1 0 1000 0 0 - weapon_polearm_kashyyyk_bladestick Kashyyyk Bladestick object/weapon/melee/polearm/lance_kashyyk.iff weapon 1 1000 melee_weapon TWO_HANDED_MELEE 275 550 kinetic 0 2.5 85 0 5 0 50 0 330 0 0 0 0 1 0 1000 0 0 - diff --git a/serverdata/npc/npc_2.sdb b/serverdata/npc/npc_2.sdb index 113b5ba9c..d019199aa 100644 --- a/serverdata/npc/npc_2.sdb +++ b/serverdata/npc/npc_2.sdb @@ -885,8 +885,8 @@ humanoid_crider_trant Crider Trant crider_trant humanoid - dressed_crider_trant. humanoid_crimelord a crimelord crimelord humanoid - dressed_criminal_organized_human_female_01.iff;dressed_criminal_organized_human_male_01.iff;dressed_criminal_organized_twilek_female_01.iff;dressed_criminal_organized_twilek_male_01.iff Tatooine jabba hutt FALSE 1 1 0 - 2 1.8 group_ranged_carbine_kinetic_high humanoid_carbineer 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - humanoid_criminal a criminal criminal humanoid - dressed_criminal_thug_aqualish_female_01.iff;dressed_criminal_thug_aqualish_female_02.iff;dressed_criminal_thug_aqualish_male_01.iff;dressed_criminal_thug_aqualish_male_02.iff;dressed_criminal_thug_bothan_female_01.iff;dressed_criminal_thug_bothan_male_01.iff;dressed_criminal_thug_human_female_01.iff;dressed_criminal_thug_human_female_02.iff;dressed_criminal_thug_human_male_01.iff;dressed_criminal_thug_human_male_02.iff;dressed_criminal_thug_rodian_female_01.iff;dressed_criminal_thug_rodian_male_01.iff;dressed_criminal_thug_trandoshan_female_01.iff;dressed_criminal_thug_trandoshan_male_01.iff;dressed_criminal_thug_zabrak_female_01.iff;dressed_criminal_thug_zabrak_male_01.iff;dressed_crook_zabrak_female_01.iff;dressed_crook_zabrak_male_01.iff;dressed_desperado_bith_female_01.iff;dressed_desperado_bith_male_01.iff;dressed_goon_twk_female_01.iff;dressed_goon_twk_male_01.iff;dressed_hoodlum_zabrak_female_01.iff;dressed_hoodlum_zabrak_male_01.iff;dressed_hooligan_rodian_female_01.iff;dressed_hooligan_rodian_male_01.iff;dressed_mugger.iff;dressed_robber_human_female_01.iff;dressed_robber_human_male_01.iff;dressed_robber_twk_female_01.iff;dressed_robber_twk_male_01.iff;dressed_ruffian_zabrak_female_01.iff;dressed_villain_trandoshan_female_01.iff;dressed_villain_trandoshan_male_01.iff Global thug thug FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_pistoleer 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - humanoid_cybernetic_specialist_corellia Aboo Aramflahad (Cybernetic Specialist) - humanoid - ep3/cyborg_engineer_corellia.iff Corellia townsperson townsperson FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - -humanoid_cybernetic_specialist_naboo Aboo Aramflahad (Cybernetic Specialist) - humanoid - ep3/cyborg_engineer_naboo.iff Naboo townsperson townsperson FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - -humanoid_cybernetic_specialist_tatooine Aboo Aramflahad (Cybernetic Specialist) - humanoid - ep3/cyborg_engineer_tatooine.iff Tatooine townsperson townsperson FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - +humanoid_cybernetic_specialist_naboo Mindt F'abul (Cybernetic Specialist) - humanoid - ep3/cyborg_engineer_naboo.iff Naboo townsperson townsperson FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - +humanoid_cybernetic_specialist_tatooine Doctor Nssktkslis (Cybernetic Doctor) - humanoid - ep3/cyborg_engineer_tatooine.iff Tatooine townsperson townsperson FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - humanoid_daclif_gallamby Daclif Gallamby (the Diktat) daclif_gallamby humanoid - dressed_daclif_gallamby.iff Corellia townsperson - FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - humanoid_daiv_dekven Daiv Dekven - humanoid Dantooine Pirate Outpost Herald dressed_noble_human_male_02.iff Dantooine townsperson townsperson FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - humanoid_daktar_bloodmoon Daktar Bloodmoon daktar_bloodmoon humanoid - dressed_fs_village_enemy_daktar.iff Dathomir sith_shadow sith_shadow FALSE 1 1 0 - 2 1.8 melee_unarmed_default humanoid_brawler 6 6 FALSE - 30 junk_npc 5 schematic_common 0 - FALSE 0 none - none 0 - 0 - 0 - FALSE - 0.0 - diff --git a/serverdata/player/movement.sdb b/serverdata/player/movement.sdb new file mode 100644 index 000000000..bb8441227 --- /dev/null +++ b/serverdata/player/movement.sdb @@ -0,0 +1,80 @@ +movement_id type strength affects_onfoot affects_vehicle affects_mount comments +TEXT TEXT FLOAT BOOLEAN BOOLEAN BOOLEAN TEXT +armorHinderanceMove permasnare 0 TRUE FALSE FALSE Movement penalty for wearing uncertified armor +avoidIncapacitation snare 80 TRUE TRUE TRUE +avoidIncapacitation_1 snare 80 TRUE TRUE TRUE +avoidIncapacitation_2 snare 80 TRUE TRUE TRUE +avoidIncapacitation_3 snare 80 TRUE TRUE TRUE +avoidIncapacitation_4 snare 80 TRUE TRUE TRUE +avoidIncapacitation_5 snare 80 TRUE TRUE TRUE +burstRun boost 75 TRUE FALSE FALSE Burst run ability +caltropSnare snare 50 TRUE FALSE TRUE caltrop trap snare +concussionShot root 0 TRUE TRUE TRUE +concussionShot_1 root 0 TRUE TRUE TRUE +crippleAttack snare 25 TRUE FALSE FALSE +crippleAttack_1 snare 45 TRUE FALSE FALSE +cripplingShot snare 25 TRUE FALSE FALSE +cripplingShot_1 snare 45 TRUE FALSE FALSE +cryobanSnare snare 80 TRUE FALSE FALSE A snare applied to targets within the radius of a cryoban grenade. +cyberneticLegs permaboost 40 TRUE FALSE FALSE granted by cybernetic legs +cyborgBurstRun boost 90 TRUE FALSE FALSE Cybernetic Burst run ability +drink_accarragm boost 27 TRUE FALSE FALSE +drink_rancoraid boost 5 TRUE FALSE FALSE +electrolyteDrain snare 20 TRUE FALSE FALSE +electrolyteDrain_1 snare 40 TRUE FALSE FALSE +enfeeble root 0 TRUE FALSE FALSE +forceRun_1 boost 100 TRUE FALSE FALSE +forceRun_2 boost 150 TRUE FALSE FALSE +forceSuppression root 0 TRUE TRUE TRUE +forceSuppression_1 root 0 TRUE TRUE TRUE +forceThrow snare 50 TRUE FALSE TRUE caltrop trap snare +forceWave snare 25 TRUE FALSE FALSE +forceWave_1 snare 45 TRUE FALSE FALSE +forceWeaken snare 15 TRUE FALSE FALSE +forceWeaken_1 snare 25 TRUE FALSE FALSE +invis_forceCloak snare 50 TRUE FALSE FALSE stealth sneak +invis_urbanStealth snare 50 TRUE FALSE FALSE stealth sneak +invis_wildernessStealth snare 50 TRUE FALSE FALSE stealth sneak +kneecapShot snare 15 TRUE FALSE FALSE +kneecapShot_1 snare 25 TRUE FALSE FALSE +paralyze root 0 TRUE FALSE FALSE +paralyze_1 root 0 TRUE FALSE FALSE +petPinAttack root 0 TRUE FALSE FALSE +petPinAttack_1 root 0 TRUE FALSE FALSE +petRunSpeed_1 permaboost 25 TRUE FALSE FALSE +petRunSpeed_2 permaboost 50 TRUE FALSE FALSE +petRunSpeed_3 permaboost 75 TRUE FALSE FALSE +petSnareAttack snare 25 TRUE FALSE FALSE +petSnareAttack_1 snare 45 TRUE FALSE FALSE +restrainingShot snare 15 TRUE FALSE FALSE +restrainingShot_1 snare 25 TRUE FALSE FALSE +startled snare 30 TRUE TRUE TRUE +stasis root 0 TRUE TRUE TRUE +stop root 0 TRUE TRUE TRUE +stoppingShot root 0 TRUE TRUE TRUE +stoppingShot_1 root 0 TRUE TRUE TRUE +stoppingShot_2 root 0 TRUE TRUE TRUE +test_stun stun 0 TRUE FALSE FALSE +testColdSnare1 snare 7 TRUE FALSE FALSE TESTING ONLY - Do not use +testColdSnare2 snare 21 TRUE FALSE FALSE TESTING ONLY - Do not use. +testItemBoost1 permaboost 8 TRUE FALSE FALSE TESTING ONLY - Do not use +testItemBoost2 permaboost 16 TRUE FALSE FALSE TESTING ONLY - Do not use +testItemSnare1 permasnare 4 TRUE FALSE FALSE TESTING ONLY - Do not use +testItemSnare2 permasnare 9 TRUE FALSE FALSE TESTING ONLY - Do not use +testMedBoost1 boost 5 TRUE FALSE FALSE TESTING ONLY - Do not use +testMedBoost2 boost 15 TRUE FALSE FALSE TESTING ONLY - Do not use +testMountBoost boost 300 TRUE FALSE TRUE TESTING ONLY - Do not use +testMountSnare snare 75 TRUE FALSE TRUE TESTING ONLY - Do not use +testRoot1 root 0 TRUE TRUE TRUE TESTING ONLY - Do not use +testRoot2 root 0 TRUE TRUE TRUE TESTING ONLY - Do not use +testRoot3 root 0 TRUE TRUE TRUE TESTING ONLY - Do not use +testSpiceBoost1 boost 10 TRUE FALSE FALSE TESTING ONLY - Do not use +testSpiceBoost2 boost 20 TRUE FALSE FALSE TESTING ONLY - Do not use +testVehicleBoost boost 300 TRUE TRUE FALSE TESTING ONLY - Do not use +testVehicleSnare snare 75 TRUE TRUE FALSE TESTING ONLY - Do not use +testWebSnare1 snare 14 TRUE FALSE FALSE TESTING ONLY - Do not use +testWebSnare2 snare 28 TRUE FALSE FALSE TESTING ONLY - Do not use +towForemanBurstRun boost 30 TRUE FALSE FALSE +tranqDart snare 66 TRUE FALSE FALSE Scout tranquilizer dart +wavering snare 80 TRUE FALSE FALSE +weaponHinderance permasnare 0 TRUE FALSE FALSE Movement penalty for using a ranged weapon \ No newline at end of file diff --git a/serverdata/spawn/common_corellia.sdb b/serverdata/spawn/common_corellia.sdb index 577135e63..289078aa2 100644 --- a/serverdata/spawn/common_corellia.sdb +++ b/serverdata/spawn/common_corellia.sdb @@ -251,7 +251,7 @@ spawn_corellia_248 CORELLIA cor_coronet_hospital AREA 6 -15.1 0.3 10.0 -3 1 a me spawn_corellia_249 CORELLIA cor_coronet_hospital AREA 6 -12.3 0.3 9.7 0 1 a medic humanoid_medic INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - npc_sitting_chair 600 spawn_corellia_250 CORELLIA cor_coronet_hospital AREA 6 -12.4 0.3 -7.7 158 1 a medic humanoid_medic INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - conversation 600 spawn_corellia_251 CORELLIA cor_coronet_hospital AREA 6 -13.1 0.3 -10.2 2 1 a traveller humanoid_traveller INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - npc_sitting_chair 600 -spawn_corellia_252 CORELLIA cor_coronet_hospital AREA 10 26.8 7.3 0.2 0 1 Aboo Aramflahad (Cybernetic Specialist) humanoid_cybernetic_specialist_corellia INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - idle 600 +spawn_corellia_252 CORELLIA cor_coronet_hospital AREA 10 26.8 7.3 0.2 0 1 Aboo Aramflahad (Cybernetic Specialist) humanoid_cybernetic_specialist_corellia INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - idle cybernetics 600 spawn_corellia_253 CORELLIA cor_coronet_hotel AREA 4 7.4 1.0 -6.9 179 1 a businessman humanoid_businessman INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - idle 600 spawn_corellia_254 CORELLIA cor_coronet_hotel AREA 4 7.4 1.0 -8.0 0 1 a Corellia Times investigator humanoid_corellia_times_investigator INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - idle 600 spawn_corellia_255 CORELLIA cor_coronet_hotel AREA 5 24.3 1.3 10.0 -171 1 a bodyguard humanoid_bodyguard INVULNERABLE N 100 100 City Coronet 1 IDLE 0 0 - idle 600 diff --git a/serverdata/spawn/common_naboo.sdb b/serverdata/spawn/common_naboo.sdb index 5e6304667..abffe2e41 100644 --- a/serverdata/spawn/common_naboo.sdb +++ b/serverdata/spawn/common_naboo.sdb @@ -590,7 +590,7 @@ spawn_naboo_587 NABOO nab_theed_hospital AREA 6 -12.9 0.3 -2.6 -179 1 a nomad hu spawn_naboo_588 NABOO nab_theed_hospital AREA 6 -18.3 0.3 -2.6 -151 1 a rancher humanoid_farmer_rancher INVULNERABLE N 100 100 City Theed 1 IDLE 0 0 - npc_sitting_chair 600 spawn_naboo_589 NABOO nab_theed_hospital AREA 6 -25.6 0.3 9.8 180 1 an assassin humanoid_assassin INVULNERABLE N 100 100 City Theed 1 IDLE 0 0 - npc_sitting_chair 600 spawn_naboo_590 NABOO nab_theed_hospital AREA 6 -20.5 0.3 9.8 -178 1 an entertainer humanoid_entertainer INVULNERABLE N 100 100 City Theed 1 IDLE 0 0 - npc_sitting_chair 600 -spawn_naboo_591 NABOO nab_theed_hospital AREA 10 26.8 7.3 0.2 0 1 Aboo Aramflahad (Cybernetic Specialist) humanoid_cybernetic_specialist_naboo INVULNERABLE N 100 100 City Theed 1 LOITER 5 0 - idle 600 +spawn_naboo_591 NABOO nab_theed_hospital AREA 10 26.8 7.3 0.2 0 1 Mindt F'abul (Cybernetic Specialist) humanoid_cybernetic_specialist_naboo INVULNERABLE N 100 100 City Theed 1 IDLE 0 0 - idle cybernetics 600 spawn_naboo_592 NABOO nab_theed_hotel1 AREA 10 -23.5 1.6 -17.2 0 1 an Event Promoter humanoid_event_promoter INVULNERABLE N 100 100 City Theed 1 IDLE 0 0 - idle 600 spawn_naboo_593 NABOO nab_theed_hotel2 AREA 10 -23.5 1.6 -17.2 0 1 an Event Promoter humanoid_event_promoter INVULNERABLE N 100 100 City Theed 1 IDLE 0 0 - idle 600 spawn_naboo_594 NABOO nab_theed_palace PATROL 3 9 12 69.6 92 1 an RSF Palace guard humanoid_rsf_palace_guard ATTACKABLE N 21 30 City Theed 1 PATROL 0 patrol_naboo_3900 column idle 600 diff --git a/serverdata/spawn/common_tatooine.sdb b/serverdata/spawn/common_tatooine.sdb index 0ed5d088e..c548bce24 100644 --- a/serverdata/spawn/common_tatooine.sdb +++ b/serverdata/spawn/common_tatooine.sdb @@ -710,7 +710,7 @@ spawn_tatooine_707 TATOOINE tat_world PATROL 0 3214.1 5.0 -4868.8 77 1 an R3 uni spawn_tatooine_708 TATOOINE tat_world PATROL 0 3497.9 5.0 -5038.1 -21 1 a hermit humanoid_hermit INVULNERABLE N 100 100 City Mos Eisley 1 PATROL 0 patrol_tatooine_6100 column idle 600 spawn_tatooine_709 TATOOINE tat_world PATROL 0 3209.6 5.0 -4518.2 125 1 a highwayman humanoid_highwayman INVULNERABLE N 100 100 City Mos Eisley 1 PATROL 0 patrol_tatooine_6200 column idle 600 spawn_tatooine_710 TATOOINE tat_world PATROL 0 3380.5 5.0 -5018.1 -54 1 a businessman humanoid_businessman INVULNERABLE N 100 100 City Mos Eisley 1 PATROL 0 patrol_tatooine_8400 column idle 600 -spawn_tatooine_711 TATOOINE tat_mosentha_hospital AREA 10 26.8 7.3 0.2 -91 1 Aboo Aramflahad (Cybernetic Specialist) humanoid_cybernetic_specialist_tatooine INVULNERABLE N 100 100 City Mos Entha 1 IDLE 0 0 - idle 600 +spawn_tatooine_711 TATOOINE tat_mosentha_hospital AREA 10 26.8 7.3 0.2 -91 1 Doctor Nssktkslis (Cybernetic Doctor) humanoid_cybernetic_specialist_tatooine INVULNERABLE N 100 100 City Mos Entha 1 IDLE 0 0 - idle cybernetics 600 spawn_tatooine_712 TATOOINE tat_mosentha_hospital AREA 2 18.0 0.3 1.8 -159 1 a commoner humanoid_commoner INVULNERABLE N 100 100 City Mos Entha 1 IDLE 0 0 - conversation 600 spawn_tatooine_713 TATOOINE tat_mosentha_hospital AREA 2 22.0 0.3 -7.2 1 1 a medic humanoid_medic INVULNERABLE N 100 100 City Mos Entha 1 IDLE 0 0 - npc_use_terminal_high 600 spawn_tatooine_714 TATOOINE tat_mosentha_hospital AREA 2 17.2 0.3 -0.1 51 1 a medic humanoid_medic INVULNERABLE N 100 100 City Mos Entha 1 IDLE 0 0 - npc_sitting_chair 600 diff --git a/serverdata/spawn/instance_kashyyyk_myyydril.sdb b/serverdata/spawn/instance_kashyyyk_myyydril.sdb index d97149340..03f413b50 100644 --- a/serverdata/spawn/instance_kashyyyk_myyydril.sdb +++ b/serverdata/spawn/instance_kashyyyk_myyydril.sdb @@ -100,12 +100,12 @@ kashyyyk_myyydril_97 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 33 231.4 -123 kashyyyk_myyydril_98 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 33 230.4 -123.5 -235.9 -41 1 Kivvaaa (Patrol Leader) humanoid_kashyyyk_myyydril_kivvaaa INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 kashyyyk_myyydril_99 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 33 231.0 -123.4 -239.3 -41 1 Tala'oree (Patrol Squad) humanoid_kashyyyk_myyydril_talaoree INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 kashyyyk_myyydril_100 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 228.0 -123.1 -299.5 -57 1 Chasuli (Myyydril Villager) humanoid_kashyyyk_myyydril_chasuli INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 -kashyyyk_myyydril_101 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 208.9 -122.8 -323.0 34 1 Compactor 3000 (Junk Collector) humanoid_kashyyyk_myyydril_compactor INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 +kashyyyk_myyydril_101 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 208.9 -122.8 -323.0 34 1 Compactor 3000 (Junk Collector) humanoid_kashyyyk_myyydril_compactor INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle junk_dealer_wookiee 600 kashyyyk_myyydril_102 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 188.0 -123.3 -356.3 -52 1 Rhirren (Myyydril Guard) humanoid_kashyyyk_myyydril_greeter_guard INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 kashyyyk_myyydril_103 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 178.7 -117.3 -373.5 7 1 Echrhin Isdan (Mystic Shaman) humanoid_kashyyyk_myyydril_isdan INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 kashyyyk_myyydril_104 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 215.8 -123.5 -309.6 52 1 Ivesa (Myyydril Villager) humanoid_kashyyyk_myyydril_ivesa INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 kashyyyk_myyydril_105 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 108.0 -123.0 -308.0 160 1 Kallaarac (Myyydril Chief) humanoid_kashyyyk_myyydril_kallaarac INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 -kashyyyk_myyydril_106 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 134.0 -155.0 -294.0 31 1 Doctor Kinesworthy (Cybernetics Doctor) humanoid_kashyyyk_myyydril_kinesworthy INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 +kashyyyk_myyydril_106 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 134.0 -155.0 -294.0 31 1 Doctor Kinesworthy (Cybernetics Doctor) humanoid_kashyyyk_myyydril_kinesworthy INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle cybernetics 600 kashyyyk_myyydril_107 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 225.3 -110.4 -342.6 -138 1 Kirrir (Cantina Girl) humanoid_kashyyyk_myyydril_kirrir INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 kashyyyk_myyydril_108 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 114.4 -123.5 -319.0 -85 1 Ildisa (Myyydril Mystic) humanoid_kashyyyk_myyydril_mystic INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 kashyyyk_myyydril_109 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 34 224.4 -111.6 -354.0 -69 1 Nawika (Cantina Patron) humanoid_kashyyyk_myyydril_nawika INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 @@ -248,7 +248,7 @@ kashyyyk_myyydril_245 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 54 -295.9 -1 kashyyyk_myyydril_246 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 54 -324.8 -177.7 207.5 0 1 an urnsor'is thrasher creature_kashyyyk_urnsoris_thrasher AGGRESSIVE E 46 55 dungeon Myyydril Cave 1 TURN 0 0 - idle 600 kashyyyk_myyydril_247 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 54 -346.5 -163.8 207.8 0 1 an urnsor'is thrasher creature_kashyyyk_urnsoris_thrasher AGGRESSIVE E 46 55 dungeon Myyydril Cave 1 TURN 0 0 - idle 600 kashyyyk_myyydril_248 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 55 -361.0 -145.0 169.0 12 1 Model 3-NIi droid_myyydril_model_3nli_lorn_servant INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 -kashyyyk_myyydril_249 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 57 -217.7 -92.8 149.2 -87 1 Treun Lorn (Cybernetic Doctor) humanoid_kashyyyk_myyydril_lorn INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle 600 +kashyyyk_myyydril_249 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 57 -217.7 -92.8 149.2 -87 1 Treun Lorn (Cybernetic Doctor) humanoid_kashyyyk_myyydril_lorn INVULNERABLE N 100 100 dungeon Myyydril Cave 1 IDLE 0 0 - idle cybernetics 600 kashyyyk_myyydril_250 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 6 33.7 -22.9 -63.9 0 1 an uwari beetle creature_kashyyyk_beetle_uwari AGGRESSIVE N 46 55 dungeon Myyydril Cave 1 TURN 0 0 - idle 600 kashyyyk_myyydril_251 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 61 -163.8 -66.1 56.3 0 1 a forgotten creation droid_forgotten_creation AGGRESSIVE E 46 55 dungeon Myyydril Cave 1 TURN 0 0 - idle 600 kashyyyk_myyydril_252 KASHYYYK_POB_DUNGEONS kas_pob_myyydril_1 AREA 61 -143.4 -68.1 49.8 0 1 a forgotten creation droid_forgotten_creation AGGRESSIVE E 46 55 dungeon Myyydril Cave 1 TURN 0 0 - idle 600 diff --git a/src/main/java/com/projectswg/holocore/intents/gameplay/combat/CombatIntents.kt b/src/main/java/com/projectswg/holocore/intents/gameplay/combat/CombatIntents.kt index 32609c79d..a05cb733d 100644 --- a/src/main/java/com/projectswg/holocore/intents/gameplay/combat/CombatIntents.kt +++ b/src/main/java/com/projectswg/holocore/intents/gameplay/combat/CombatIntents.kt @@ -26,6 +26,7 @@ ***********************************************************************************/ package com.projectswg.holocore.intents.gameplay.combat +import com.projectswg.common.data.location.Terrain import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject import com.projectswg.holocore.resources.support.objects.swg.tangible.TangibleObject import com.projectswg.holocore.services.gameplay.combat.CombatState @@ -39,6 +40,7 @@ data class CreatureKilledIntent(val killer: CreatureObject, val corpse: Creature data class CreatureRevivedIntent(val creature: CreatureObject) : Intent() data class EnterCombatIntent(val source: TangibleObject, val target: TangibleObject) : Intent() data class ExitCombatIntent(val source: TangibleObject) : Intent() +data class CloneActivatedIntent(val creature: CreatureObject, val diedOnTerrain: Terrain) : Intent() /* * Combat event requests diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/TransferItemCallback.kt b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/TransferItemCallback.kt index 779150796..4fe83c628 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/TransferItemCallback.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/TransferItemCallback.kt @@ -239,7 +239,7 @@ class TransferItemCallback : ICmdCallback { } ContainerResult.SLOT_OCCUPIED -> { - SystemMessageIntent(player, "@container_error_message:container08").broadcast() + SystemMessageIntent(player, "@container_error_message:container04").broadcast() player.sendPacket(PlayMusicMessage(0, "sound/ui_negative.snd", 1, false)) } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdGoto.kt b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdGoto.kt index 46e42cd52..110679d63 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdGoto.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdGoto.kt @@ -28,6 +28,7 @@ package com.projectswg.holocore.resources.support.global.commands.callbacks.admi import com.projectswg.common.data.location.Location import com.projectswg.holocore.intents.support.global.chat.SystemMessageIntent.Companion.broadcastPersonal +import com.projectswg.holocore.resources.support.data.server_info.loader.ServerData import com.projectswg.holocore.resources.support.global.commands.ICmdCallback import com.projectswg.holocore.resources.support.global.player.Player import com.projectswg.holocore.resources.support.objects.swg.SWGObject @@ -38,17 +39,29 @@ import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureSt import com.projectswg.holocore.services.support.global.zone.CharacterLookupService.PlayerLookup import com.projectswg.holocore.services.support.objects.ObjectStorageService.BuildingLookup import me.joshlarson.jlcommon.log.Log +import java.util.* +import kotlin.Comparator +import kotlin.NoSuchElementException class CmdGoto : ICmdCallback { override fun execute(player: Player, target: SWGObject?, args: String) { val teleportee = player.creatureObject ?: return val parts = args.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() - if (parts.isEmpty() || parts[0].trim { it <= ' ' }.isEmpty()) return + if (parts.size < 2 ||parts.isEmpty() || parts[0].trim { it <= ' ' }.isEmpty() || parts[1].trim { it <= ' ' }.isEmpty()) return - val destination = parts[0].trim { it <= ' ' } - val message = if (PlayerLookup.doesCharacterExistByFirstName(destination)) teleportToPlayer(player, teleportee, destination) else teleportToBuilding(player, teleportee, destination, parts) + val type = parts[0].trim { it <= ' ' } + val destination = parts[1].trim { it <= ' ' } - if (message != null) broadcastPersonal(player, message) + var message = "" + when (type) { + "player" -> message = (teleportToPlayer(player, teleportee, destination)) ?: return + "building" -> message = teleportToBuilding(player, teleportee, destination, parts) ?: return + "spawn" -> message = teleportToSpawnId(player, teleportee, destination) ?: return + "patrol" -> message = teleportToPatrolId(player, teleportee, destination) ?: return + else -> broadcastPersonal(player, "Invalid goto command") + } + + broadcastPersonal(player, message) } private fun teleportToPlayer(player: Player, teleportee: CreatureObject, playerName: String): String? { @@ -80,6 +93,42 @@ class CmdGoto : ICmdCallback { return teleportToGoto(teleportee, building, cell) } + + private fun teleportToSpawnId(player: Player, teleportee: CreatureObject, spawnId: String): String? { + val spawnInfo = try { + ServerData.npcStaticSpawns.spawns.first { it.id == spawnId } + } catch (e: NoSuchElementException) { + broadcastPersonal(player, "Spawn ID '$spawnId' did not return a spawn.") + return null + } + val newLocation = Location.builder().setPosition(spawnInfo.x, spawnInfo.y, spawnInfo.z).setTerrain(spawnInfo.terrain).build() + if (spawnInfo.buildingId.isEmpty() || spawnInfo.buildingId.endsWith("_world")) { + teleportee.moveToLocation(newLocation) + return "Succesfully teleported " + teleportee.objectName + " to patrol " + spawnId + } + val newParent = BuildingLookup.getBuildingByTag(spawnInfo.buildingId)?.getCellByNumber(spawnInfo.cellId) + teleportee.moveToContainer(newParent, newLocation) + return "Succesfully teleported " + teleportee.objectName + " to patrol " + spawnId + } + + private fun teleportToPatrolId(player: Player, teleportee: CreatureObject, patrolId: String): String? { + val groupIdFromPatrolId = patrolId.dropLast(2) + "00" + val patrolWaypoint = try { + Objects.requireNonNull(ServerData.npcPatrolRoutes[groupIdFromPatrolId], "Invalid patrol group ID: $groupIdFromPatrolId").first { it.patrolId == patrolId } + } catch (e: NoSuchElementException) { + broadcastPersonal(player, "Spawn ID '$patrolId' did not return a spawn.") + return null + } + val newLocation = Location.builder().setPosition(patrolWaypoint.x, patrolWaypoint.y, patrolWaypoint.z).setTerrain(patrolWaypoint.terrain).build() + if (patrolWaypoint.buildingId.isEmpty() || patrolWaypoint.buildingId.endsWith("_world")) { + teleportee.moveToLocation(newLocation) + return "Succesfully teleported " + teleportee.objectName + " to patrol " + patrolId + } + val newParent = BuildingLookup.getBuildingByTag(patrolWaypoint.buildingId)?.getCellByNumber(patrolWaypoint.cellId) + teleportee.moveToContainer(newParent, newLocation) + return "Succesfully teleported " + teleportee.objectName + " to patrol " + patrolId + } + private fun teleportToGoto(obj: SWGObject, building: BuildingObject, cellNumber: Int): String { val cell = building.getCellByNumber(cellNumber) if (cell == null) { diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdKill.kt b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdKill.kt index 3ad359c81..2635c361f 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdKill.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/admin/CmdKill.kt @@ -26,7 +26,7 @@ ***********************************************************************************/ package com.projectswg.holocore.resources.support.global.commands.callbacks.admin -import com.projectswg.holocore.intents.gameplay.combat.RequestCreatureDeathIntent +import com.projectswg.holocore.intents.gameplay.combat.KillCreatureIntent import com.projectswg.holocore.intents.support.global.chat.SystemMessageIntent import com.projectswg.holocore.resources.support.global.commands.ICmdCallback import com.projectswg.holocore.resources.support.global.player.Player @@ -41,7 +41,7 @@ class CmdKill : ICmdCallback { } if (player.creatureObject != target) { - RequestCreatureDeathIntent(player.creatureObject, target).broadcast() + KillCreatureIntent(player.creatureObject, target).broadcast() } else { SystemMessageIntent.broadcastPersonal(player, "You cannot kill yourself!") } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/zone/sui/SuiMessageBox.kt b/src/main/java/com/projectswg/holocore/resources/support/global/zone/sui/SuiMessageBox.kt index 4c26ee4e8..7054d9183 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/zone/sui/SuiMessageBox.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/global/zone/sui/SuiMessageBox.kt @@ -95,6 +95,10 @@ class SuiMessageBox : SuiWindow() { } } + init { + super.suiScript = "Script.messageBox" + } + private fun setShowRevertButton(shown: Boolean) { val value = shown.toString() setProperty("btnRevert", "Enabled", value) diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java index aeec98856..7763fe427 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java @@ -344,6 +344,16 @@ public abstract class SWGObject extends BaselineObject implements Comparable requiredSlots = this.getArrangement().get(arrangementId - 4); + + for (String slot : requiredSlots) { + SWGObject slottedObject = container.getSlottedObject(slot); + if (slottedObject != null && slottedObject.getTemplate().startsWith("object/tangible/wearables/cybernetic")) { + Log.w("Unable to add object to container! Slot %s is occupied with cybernetic", slot); + return ContainerResult.SLOT_OCCUPIED; + } + } } return ContainerResult.SUCCESS; } diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/GameplayManager.kt b/src/main/java/com/projectswg/holocore/services/gameplay/GameplayManager.kt index dda30b442..d5dd0e4f9 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/GameplayManager.kt +++ b/src/main/java/com/projectswg/holocore/services/gameplay/GameplayManager.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -28,6 +28,7 @@ package com.projectswg.holocore.services.gameplay import com.projectswg.holocore.services.gameplay.commodities.BazaarService import com.projectswg.holocore.services.gameplay.combat.CombatManager +import com.projectswg.holocore.services.gameplay.combat.DeathCyberneticService import com.projectswg.holocore.services.gameplay.conversation.ConversationService import com.projectswg.holocore.services.gameplay.crafting.CraftingManager import com.projectswg.holocore.services.gameplay.entertainment.EntertainmentManager @@ -42,5 +43,5 @@ import com.projectswg.holocore.services.gameplay.world.WorldManager import me.joshlarson.jlcommon.control.Manager import me.joshlarson.jlcommon.control.ManagerStructure -@ManagerStructure(children = [BazaarService::class, CombatManager::class, ConversationService::class, CraftingManager::class, DestroyMissionService::class, EntertainmentManager::class, FactionManager::class, JediManager::class, JunkDealerService::class, PlayerManager::class, StructuresManager::class, TradeService::class, WorldManager::class]) +@ManagerStructure(children = [BazaarService::class, CombatManager::class, ConversationService::class, CraftingManager::class, DeathCyberneticService::class, DestroyMissionService::class, EntertainmentManager::class, FactionManager::class, JediManager::class, JunkDealerService::class, PlayerManager::class, StructuresManager::class, TradeService::class, WorldManager::class]) class GameplayManager : Manager() diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/combat/DeathCyberneticService.kt b/src/main/java/com/projectswg/holocore/services/gameplay/combat/DeathCyberneticService.kt new file mode 100644 index 000000000..e7bdc7bd9 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/services/gameplay/combat/DeathCyberneticService.kt @@ -0,0 +1,88 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// 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.combat + +import com.projectswg.common.data.location.Terrain +import com.projectswg.holocore.intents.gameplay.combat.CloneActivatedIntent +import com.projectswg.holocore.resources.support.data.server_info.StandardLog +import com.projectswg.holocore.resources.support.objects.ObjectCreator +import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject +import com.projectswg.holocore.resources.support.random.Die +import com.projectswg.holocore.resources.support.random.RandomDie +import me.joshlarson.jlcommon.control.IntentHandler +import me.joshlarson.jlcommon.control.Service + +class DeathCyberneticService(private val deathCyberneticDie: Die = RandomDie()) : Service() { + + @IntentHandler + private fun handleCloneActivatedIntent(intent: CloneActivatedIntent) { + val creature = intent.creature + val diedOnTerrain = intent.diedOnTerrain + + if (isSpace(diedOnTerrain)) return + if (isEasyPlanet(diedOnTerrain)) return + if (isADeathCyberneticAlreadyInstalled(creature)) return + if (deathCyberneticDie.roll(1..100) < 5) installDeathCybernetic(creature) + } + + private fun installDeathCybernetic(creature: CreatureObject) { + val iffTemplate = selectDeathCyberneticLimb() + + val cybernetic = ObjectCreator.createObjectFromTemplate(iffTemplate) + cybernetic.moveToContainer(creature) + + StandardLog.onPlayerEvent(this, creature, "has been given a cybernetic limb (%s) upon death", iffTemplate) + } + + private fun selectDeathCyberneticLimb(): String { + return if (deathCyberneticDie.roll(1..100) < 25) { + "object/tangible/wearables/cybernetic/s01/cybernetic_s01_legs.iff" + } else { + if (deathCyberneticDie.roll(1..100) < 50) { + "object/tangible/wearables/cybernetic/s01/shared_cybernetic_s01_arm_r.iff" + } else { + "object/tangible/wearables/cybernetic/s01/shared_cybernetic_s01_arm_l.iff" + } + } + } + + private fun isADeathCyberneticAlreadyInstalled(creature: CreatureObject): Boolean { + val equippedItems = creature.slottedObjects + + return equippedItems.map { it.template }.any { it.startsWith("object/tangible/wearables/cybernetic/s01") } + } + + private fun isSpace(diedOnTerrain: Terrain): Boolean { + return diedOnTerrain.name.lowercase().startsWith("space_") + } + + private fun isEasyPlanet(terrain: Terrain): Boolean { + val easyPlanets = setOf(Terrain.RORI, Terrain.NABOO, Terrain.TATOOINE, Terrain.CORELLIA, Terrain.TALUS) + + return terrain in easyPlanets + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/combat/buffs/BuffService.kt b/src/main/java/com/projectswg/holocore/services/gameplay/combat/buffs/BuffService.kt index 1a44f4782..1cf48059b 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/combat/buffs/BuffService.kt +++ b/src/main/java/com/projectswg/holocore/services/gameplay/combat/buffs/BuffService.kt @@ -97,7 +97,7 @@ class BuffService : Service() { } private fun removeExpiredBuffs(creatureObject: CreatureObject) { - val crcsForExpiredBuffs = creatureObject.buffs.filter { isBuffExpired(creatureObject, it.value) }.map { it.key } + val crcsForExpiredBuffs = creatureObject.buffs.map { it.key }.filter { isBuffExpired(creatureObject, it) } crcsForExpiredBuffs.forEach { removeBuff(creatureObject, it) } } @@ -112,7 +112,12 @@ class BuffService : Service() { return ProjectSWG.galacticTime.toInt() } - private fun isBuffExpired(creature: CreatureObject, buff: Buff): Boolean { + private fun isBuffExpired(creature: CreatureObject, buffCrc: CRC): Boolean { + val buffData = buffs.getBuff(buffCrc) ?: return true + val buff = creature.buffs[buffCrc] ?: return true + + if (isBuffInfinite(buffData)) return false + return calculatePlayTime(creature) >= buff.endTime } @@ -196,8 +201,8 @@ class BuffService : Service() { private fun scheduleBuffExpirationCheck(receiver: CreatureObject, buffData: BuffInfo) { timerCheckThread.execute(1000L) { - val buff = receiver.buffs[buffData.crc] ?: return@execute - if (isBuffExpired(receiver, buff)) { + receiver.buffs[buffData.crc] ?: return@execute + if (isBuffExpired(receiver, buffData.crc)) { removeBuff(receiver, buffData.crc) } else { scheduleBuffExpirationCheck(receiver, buffData) diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/combat/cloning/CloningService.kt b/src/main/java/com/projectswg/holocore/services/gameplay/combat/cloning/CloningService.kt index 3336bb453..55fd21bd6 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/combat/cloning/CloningService.kt +++ b/src/main/java/com/projectswg/holocore/services/gameplay/combat/cloning/CloningService.kt @@ -35,6 +35,7 @@ import com.projectswg.common.data.location.Location import com.projectswg.common.data.sui.SuiEvent import com.projectswg.common.network.packets.swg.zone.PlayClientEffectObjectMessage import com.projectswg.common.network.packets.swg.zone.PlayMusicMessage +import com.projectswg.holocore.intents.gameplay.combat.CloneActivatedIntent import com.projectswg.holocore.intents.gameplay.combat.CreatureKilledIntent import com.projectswg.holocore.intents.gameplay.gcw.UpdateFactionStatusIntent import com.projectswg.holocore.intents.support.global.chat.SystemMessageIntent @@ -147,6 +148,8 @@ class CloningService : Service() { synchronized(reviveTimers) { reviveTimers.put(corpse, executor.execute(TimeUnit.MINUTES.toMillis(CLONE_TIMER)) { expireCloneTimer(corpse, availableFacilities, cloningWindow) }) } + + StandardLog.onPlayerEvent(this, corpse, "has %d minutes to clone", CLONE_TIMER) } private fun showSuiWindow(corpse: CreatureObject) { @@ -171,6 +174,7 @@ class CloningService : Service() { title = "@base_player:revive_title" prompt = java.lang.String.join("\n", preDesignated, cashBalance, help) buttons = SuiButtons.OK + addListItem("@base_player:revive_closest") addCallback("handleFacilityChoice") { event: SuiEvent, parameters: Map -> val selectionIndex = SuiListBox.getSelectedRow(parameters) if (event != SuiEvent.OK_PRESSED || selectionIndex >= availableFacilities.size || selectionIndex < 0) { @@ -210,7 +214,9 @@ class CloningService : Service() { } StandardLog.onPlayerEvent(this, corpse, "cloned to %s @ %s", selectedFacility, selectedFacility.location) + val diedOnTerrain = corpse.terrain teleport(corpse, cellObject, getCloneLocation(facilityData, selectedFacility)) + CloneActivatedIntent(corpse, diedOnTerrain).broadcast() return CloneResult.SUCCESS } diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandAttack.kt b/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandAttack.kt index e2dd7621c..773c95f03 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandAttack.kt +++ b/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandAttack.kt @@ -457,6 +457,8 @@ internal class CombatCommandAttack(private val toHitDie: Die, private val knockd accMod += source.getSkillModValue(accuracySkillMod) } + accMod += source.getSkillModValue("private_accuracy_bonus") + return accMod } diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandHeal.kt b/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandHeal.kt index 3e9a8db22..e1fc25fc8 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandHeal.kt +++ b/src/main/java/com/projectswg/holocore/services/gameplay/combat/command/CombatCommandHeal.kt @@ -128,7 +128,7 @@ internal enum class CombatCommandHeal : CombatCommandHitType { return 0 } - if (healed.health == healed.maxHealth) { + if (healed.health == healed.maxHealth - healed.healthWounds) { return 0 } diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/combat/loot/GrantLootService.java b/src/main/java/com/projectswg/holocore/services/gameplay/combat/loot/GrantLootService.java index 2905c3abe..8f4f7caf2 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/combat/loot/GrantLootService.java +++ b/src/main/java/com/projectswg/holocore/services/gameplay/combat/loot/GrantLootService.java @@ -270,7 +270,7 @@ public final class GrantLootService extends Service { new SystemMessageIntent(player, "@container_error_message:container03").broadcast(); player.sendPacket(new PlayMusicMessage(0, "sound/ui_danger_message.snd", 1, false)); break; - case NO_PERMISSION, SLOT_OCCUPIED: + case NO_PERMISSION: new SystemMessageIntent(player, "@container_error_message:container08").broadcast(); player.sendPacket(new PlayMusicMessage(0, "sound/ui_negative.snd", 1, false)); break; @@ -278,6 +278,10 @@ public final class GrantLootService extends Service { new SystemMessageIntent(player, "@container_error_message:container06").broadcast(); player.sendPacket(new PlayMusicMessage(0, "sound/ui_negative.snd", 1, false)); break; + case SLOT_OCCUPIED: + new SystemMessageIntent(player, "@container_error_message:container04").broadcast(); + player.sendPacket(new PlayMusicMessage(0, "sound/ui_negative.snd", 1, false)); + break; } } diff --git a/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatInstantMessageService.java b/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatInstantMessageService.java index 9df5604f8..58b4f290a 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatInstantMessageService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatInstantMessageService.java @@ -27,7 +27,6 @@ package com.projectswg.holocore.services.support.global.chat; import com.projectswg.common.data.encodables.chat.ChatResult; -import com.projectswg.common.network.packets.PacketType; import com.projectswg.common.network.packets.SWGPacket; import com.projectswg.common.network.packets.swg.zone.chat.ChatInstantMessageToCharacter; import com.projectswg.common.network.packets.swg.zone.chat.ChatInstantMessageToClient; @@ -40,7 +39,6 @@ import me.joshlarson.jlcommon.control.IntentHandler; import me.joshlarson.jlcommon.control.Service; import java.util.Locale; -import java.util.Objects; public class ChatInstantMessageService extends Service { @@ -51,10 +49,8 @@ public class ChatInstantMessageService extends Service { @IntentHandler private void handleInboundPacketIntent(InboundPacketIntent gpi) { SWGPacket packet = gpi.getPacket(); - if (Objects.requireNonNull(packet.getPacketType()) == PacketType.CHAT_INSTANT_MESSAGE_TO_CHARACTER) { - if (packet instanceof ChatInstantMessageToCharacter) - handleInstantMessage(gpi.getPlayer(), (ChatInstantMessageToCharacter) packet); - } + if (packet instanceof ChatInstantMessageToCharacter) + handleInstantMessage(gpi.getPlayer(), (ChatInstantMessageToCharacter) packet); } private void handleInstantMessage(Player sender, ChatInstantMessageToCharacter request) { diff --git a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.kt b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.kt index 5d5c25c04..ea5cbccfb 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.kt +++ b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.kt @@ -64,7 +64,7 @@ import java.util.concurrent.ConcurrentHashMap import java.util.function.Consumer import java.util.stream.Collectors -class CommandQueueService @JvmOverloads constructor(private val delayBetweenCheckingCommandQueue: Long = 100, toHitDie: Die = RandomDie(), knockdownDie: Die = RandomDie(), woundDie: Die = RandomDie()) : Service() { +class CommandQueueService @JvmOverloads constructor(private val delayBetweenCheckingCommandQueue: Long = 100, toHitDie: Die = RandomDie(), knockdownDie: Die = RandomDie(), woundDie: Die = RandomDie(), private val skipWarmup: Boolean = false) : Service() { private val executor = ScheduledThreadPool(4, "command-queue-%d") private val combatQueueMap: MutableMap = ConcurrentHashMap() private val combatCommandHandler: CombatCommandHandler = CombatCommandHandler(toHitDie, knockdownDie, woundDie) @@ -187,7 +187,7 @@ class CommandQueueService @JvmOverloads constructor(private val delayBetweenChec val warmupTime = rootCommand.warmupTime - if (warmupTime > 0) { + if (warmupTime > 0 && !skipWarmup) { val warmupTimer = CommandTimer(command.source.objectId) warmupTimer.addFlag(CommandTimer.CommandTimerFlag.WARMUP) warmupTimer.commandNameCrc = rootCommand.crc diff --git a/src/main/java/com/projectswg/holocore/services/support/global/zone/LoginService.java b/src/main/java/com/projectswg/holocore/services/support/global/zone/LoginService.java index f428d28e5..ccec2b1a8 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/zone/LoginService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/zone/LoginService.java @@ -63,11 +63,7 @@ import me.joshlarson.jlcommon.control.IntentHandler; import me.joshlarson.jlcommon.control.Service; import java.net.SocketAddress; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; public class LoginService extends Service { @@ -77,12 +73,14 @@ public class LoginService extends Service { private final Map> players; private final PswgUserDatabase userDatabase; - + private final Collection galaxies; + public LoginService() { - this(PswgDatabase.INSTANCE.getUsers()); + this(Collections.singletonList(ProjectSWG.INSTANCE.getGalaxy()), PswgDatabase.INSTANCE.getUsers()); } - public LoginService(PswgUserDatabase pswgUserDatabase) { + public LoginService(Collection galaxy, PswgUserDatabase pswgUserDatabase) { + this.galaxies = galaxy; userDatabase = pswgUserDatabase; this.players = Collections.synchronizedMap(new HashMap<>()); } @@ -160,7 +158,7 @@ public class LoginService extends Service { } else if (isPasswordValid(user, loginRequest.getPassword())) { StandardLog.onPlayerEvent(this, player, "logged in from %s", loginRequest.getSocketAddress()); onSuccessfulLogin(user, player); - player.sendPacket(new HoloLoginResponsePacket(true, "", getGalaxies(), getCharacters(user.getUsername()))); + player.sendPacket(new HoloLoginResponsePacket(true, "", galaxies, getCharacters(user.getUsername()))); } else { StandardLog.onPlayerEvent(this, player, "failed to login [incorrect password] from %s", loginRequest.getSocketAddress()); onInvalidUserPass(player); @@ -263,7 +261,7 @@ public class LoginService extends Service { LoginEnumCluster cluster = new LoginEnumCluster(); LoginClusterStatus clusterStatus = new LoginClusterStatus(); List characters = getCharacters(player.getAccountId()); - for (Galaxy g : getGalaxies()) { + for (Galaxy g : galaxies) { cluster.addGalaxy(g); clusterStatus.addGalaxy(g); } @@ -279,13 +277,7 @@ public class LoginService extends Service { private boolean isPasswordValid(UserMetadata user, String password) { return userDatabase.authenticate(user, password); } - - private List getGalaxies() { - List galaxies = new ArrayList<>(); - galaxies.add(ProjectSWG.INSTANCE.getGalaxy()); - return galaxies; - } - + private List getCharacters(String accountId) { List characters = new ArrayList<>(); List creatures = this.players.get(accountId); diff --git a/src/test/java/com/projectswg/holocore/headless/CharacterSelectionScreen.kt b/src/test/java/com/projectswg/holocore/headless/CharacterSelectionScreen.kt index d8386a65f..42df95322 100644 --- a/src/test/java/com/projectswg/holocore/headless/CharacterSelectionScreen.kt +++ b/src/test/java/com/projectswg/holocore/headless/CharacterSelectionScreen.kt @@ -29,6 +29,7 @@ package com.projectswg.holocore.headless import com.projectswg.common.network.packets.swg.login.ClientIdMsg import com.projectswg.common.network.packets.swg.login.ClientPermissionsMessage import com.projectswg.common.network.packets.swg.login.creation.* +import com.projectswg.common.network.packets.swg.zone.CmdSceneReady import com.projectswg.common.network.packets.swg.zone.insertion.SelectCharacter import com.projectswg.holocore.test.resources.GenericPlayer import java.lang.RuntimeException @@ -73,7 +74,9 @@ class CharacterSelectionScreen internal constructor(val player: GenericPlayer) { fun selectCharacter(characterId: Long): ZonedInCharacter { sendPacket(player, SelectCharacter(characterId)) sendPacket(player, ClientIdMsg()) - player.waitForNextPacket(ClientPermissionsMessage::class.java, 50, TimeUnit.MILLISECONDS) ?: throw IllegalStateException("Failed to receive client permissions message in time") + player.waitForNextPacket(ClientPermissionsMessage::class.java) ?: throw IllegalStateException("Failed to receive client permissions message in time") + sendPacket(player, CmdSceneReady()) + player.waitForNextPacket(CmdSceneReady::class.java) ?: throw IllegalStateException("Expected CmdSceneReady from server but did not receive it in time") return ZonedInCharacter(player) } diff --git a/src/test/java/com/projectswg/holocore/headless/SuiWindow.kt b/src/test/java/com/projectswg/holocore/headless/SuiWindow.kt index 0a11d3d0c..c2fa3b1b1 100644 --- a/src/test/java/com/projectswg/holocore/headless/SuiWindow.kt +++ b/src/test/java/com/projectswg/holocore/headless/SuiWindow.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -31,11 +31,16 @@ import com.projectswg.holocore.test.resources.GenericPlayer class SuiWindow(private val player: GenericPlayer, private val suiWindowId: Int) { + private val suiEventNotification = SuiEventNotification() + + fun select(index: Int) { + suiEventNotification.addSubscribedToProperty(index.toString()) + } + /** * Invokes the "Ok" button on the SUI window. */ fun clickOk() { - val suiEventNotification = SuiEventNotification() suiEventNotification.windowId = suiWindowId sendPacket(player, suiEventNotification) } diff --git a/src/test/java/com/projectswg/holocore/headless/cloning.kt b/src/test/java/com/projectswg/holocore/headless/cloning.kt new file mode 100644 index 000000000..34afdac5d --- /dev/null +++ b/src/test/java/com/projectswg/holocore/headless/cloning.kt @@ -0,0 +1,40 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// 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.headless + +import com.projectswg.common.network.packets.swg.zone.server_ui.SuiCreatePageMessage +import com.projectswg.holocore.resources.support.global.zone.sui.SuiListBox +import java.util.concurrent.TimeUnit + +fun ZonedInCharacter.waitForCloneActivation(): SuiWindow { + val packet = player.waitForNextPacket(SuiCreatePageMessage::class.java, 1, TimeUnit.SECONDS) ?: throw IllegalStateException("No known packet received") + val listBox = packet.window as SuiListBox + if (listBox.list.isEmpty()) { + throw IllegalStateException("No items in the list box") + } + return SuiWindow(player, packet.window.id) +} diff --git a/src/test/java/com/projectswg/holocore/headless/combat.kt b/src/test/java/com/projectswg/holocore/headless/combat.kt index 893f504a1..10d2347cc 100644 --- a/src/test/java/com/projectswg/holocore/headless/combat.kt +++ b/src/test/java/com/projectswg/holocore/headless/combat.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -106,3 +106,11 @@ enum class TargetState { DEAD, ALIVE } + +fun ZonedInCharacter.deathblow(target: CreatureObject) { + sendCommand("deathBlow", target) +} + +fun ZonedInCharacter.duel(target: CreatureObject) { + sendCommand("duel", target) +} diff --git a/src/test/java/com/projectswg/holocore/headless/ignorelist.kt b/src/test/java/com/projectswg/holocore/headless/ignorelist.kt new file mode 100644 index 000000000..47a36e43c --- /dev/null +++ b/src/test/java/com/projectswg/holocore/headless/ignorelist.kt @@ -0,0 +1,38 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// 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.headless + +import java.util.concurrent.TimeUnit + +/** + * Adds a player to the ignore list. + * @param characterName the player to ignore + */ +fun ZonedInCharacter.addIgnore(characterName: String) { + sendCommand("addIgnore", null, characterName) + player.waitForNextObjectDelta(player.playerObject.objectId, 9, 8, 1, TimeUnit.SECONDS) ?: throw IllegalStateException("Packet not received") +} \ No newline at end of file diff --git a/src/test/java/com/projectswg/holocore/headless/movement.kt b/src/test/java/com/projectswg/holocore/headless/movement.kt new file mode 100644 index 000000000..c456b5b86 --- /dev/null +++ b/src/test/java/com/projectswg/holocore/headless/movement.kt @@ -0,0 +1,33 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// 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.headless + +import com.projectswg.common.network.packets.swg.zone.object_controller.DataTransform + +fun ZonedInCharacter.waitForObjectMove() { + player.waitForNextPacket(DataTransform::class.java) ?: throw IllegalStateException("Did not receive DataTransform packet in time") +} diff --git a/src/test/java/com/projectswg/holocore/headless/tells.kt b/src/test/java/com/projectswg/holocore/headless/tells.kt new file mode 100644 index 000000000..0f6ffaebd --- /dev/null +++ b/src/test/java/com/projectswg/holocore/headless/tells.kt @@ -0,0 +1,59 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// 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.headless + +import com.projectswg.common.data.encodables.chat.ChatResult +import com.projectswg.common.network.packets.swg.zone.chat.ChatInstantMessageToCharacter +import com.projectswg.common.network.packets.swg.zone.chat.ChatInstantMessageToClient +import com.projectswg.common.network.packets.swg.zone.chat.ChatOnSendInstantMessage +import kotlin.random.Random + +/** + * Sends a tell to another player. + * @param characterName the player to send the tell to + * @param message the message to send + * @return the result of sending the tell + */ +fun ZonedInCharacter.sendTell(characterName: String, message: String): ChatResult { + val sequence = Random.nextInt() + sendPacket(player, ChatInstantMessageToCharacter("Testcase", characterName, message, sequence)) + val chatOnSendInstantMessage = player.waitForNextPacket(ChatOnSendInstantMessage::class.java) ?: throw IllegalStateException("No tell receipt received") + if (chatOnSendInstantMessage.sequence != sequence) throw IllegalStateException("Invalid sequence. Expected $sequence, got ${chatOnSendInstantMessage.sequence}") + return ChatResult.fromInteger(chatOnSendInstantMessage.result) +} + +/** + * Waits for a tell to be received. This method will block until a tell is received. + * @return the tell that was received + * @throws IllegalStateException if no tell is received + */ +fun ZonedInCharacter.waitForTell(): ReceivedTell { + val chatInstantMessageToClient = player.waitForNextPacket(ChatInstantMessageToClient::class.java) ?: throw IllegalStateException("No tell received") + return ReceivedTell(chatInstantMessageToClient.character, chatInstantMessageToClient.message) +} + +data class ReceivedTell(val sender: String, val message: String) diff --git a/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt b/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt index d302c4e2e..e569a41ab 100644 --- a/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt +++ b/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt @@ -1,3 +1,29 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ package com.projectswg.holocore.resources.support.global.zone.creation import com.projectswg.holocore.headless.HeadlessSWGClient @@ -6,26 +32,22 @@ import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureOb import com.projectswg.holocore.test.runners.AcceptanceTest import org.junit.jupiter.api.Assertions.assertAll import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class CharacterCreationTest : AcceptanceTest() { - @BeforeEach - fun setUpUser() { - addUser("username", "password") - } - @Test fun `new characters receive a Slitherhorn`() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") assertTrue(inventoryContainsSlitherhorn(character.player.creatureObject)) } @Test fun `new characters become Novice in all basic professions`() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val skills = character.player.creatureObject.skills assertAll( @@ -40,7 +62,8 @@ class CharacterCreationTest : AcceptanceTest() { @Test fun `new characters receive their species skill`() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") assertTrue(character.player.creatureObject.skills.contains("species_human")) } diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/combat/CloningTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/combat/CloningTest.kt new file mode 100644 index 000000000..1db4b7333 --- /dev/null +++ b/src/test/java/com/projectswg/holocore/services/gameplay/combat/CloningTest.kt @@ -0,0 +1,64 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is an emulation project for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create one or more emulators which will provide servers for * + * players to continue playing a game similar to the one they used to play. * + * * + * 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.combat + +import com.projectswg.holocore.headless.* +import com.projectswg.holocore.resources.support.global.player.AccessLevel +import com.projectswg.holocore.services.gameplay.combat.cloning.CloningService +import com.projectswg.holocore.services.gameplay.combat.duel.DuelService +import com.projectswg.holocore.services.support.objects.ObjectStorageService +import com.projectswg.holocore.test.runners.AcceptanceTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow + +class CloningTest : AcceptanceTest() { + + @BeforeEach + fun setupExtraServices() { + registerService(CloningService()) + registerService(DuelService()) + registerService(ObjectStorageService()) + waitForIntents() // ObjectStorageService floods the server with intents during initialization, causing LoginService to not respond to login requests before these intents are processed + } + + @Test + fun `possible to clone after being deathblown`() { + val user = generateUser(AccessLevel.DEV) + val character1 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "charone") + val character2 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "chartwo") + character1.duel(character2.player.creatureObject) + character2.duel(character1.player.creatureObject) + character1.adminKill(character2.player.creatureObject) + character1.deathblow(character2.player.creatureObject) + + val suiWindow = character2.waitForCloneActivation() + suiWindow.select(0) // The facility we clone at doesn't matter. We just need to make sure that cloning is possible. + suiWindow.clickOk() + + assertDoesNotThrow { character2.waitForObjectMove() } + } +} \ No newline at end of file diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/combat/HealthWoundTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/combat/HealthWoundTest.kt index eade26480..317026496 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/combat/HealthWoundTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/combat/HealthWoundTest.kt @@ -29,19 +29,14 @@ package com.projectswg.holocore.services.gameplay.combat import com.projectswg.holocore.headless.* import com.projectswg.holocore.test.runners.AcceptanceTest import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class HealthWoundTest : AcceptanceTest() { - @BeforeEach - fun setUpUser() { - addUser("username", "password") - } - @Test fun `weapons with Wound Chance apply health wounds`() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") character.player.creatureObject.equippedWeapon.woundChance = 100F val npc = spawnNPC("creature_bantha", character.player.creatureObject.location, combatLevelRange = 80..80) @@ -52,7 +47,8 @@ class HealthWoundTest : AcceptanceTest() { @Test fun `only weapons with Wound Chance apply health wounds`() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") character.player.creatureObject.equippedWeapon.woundChance = 0F val npc = spawnNPC("creature_bantha", character.player.creatureObject.location, combatLevelRange = 80..80) @@ -63,7 +59,8 @@ class HealthWoundTest : AcceptanceTest() { @Test fun `health wounds are subtracted from current health`() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val npc = spawnNPC("creature_bantha", character.player.creatureObject.location, combatLevelRange = 80..80) npc.healthWounds = npc.health - 1 // The NPC should effectively have 1 health left this way diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/combat/loot/LootTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/combat/loot/LootTest.kt index f60c2dbb4..5b0a0b57e 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/combat/loot/LootTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/combat/loot/LootTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -37,8 +37,8 @@ class LootTest : AcceptanceTest() { @Test fun itemsAreGenerated() { - addUser("player", "pass") - val zonedInCharacter = createZonedInCharacter("player", "pass", "tester") + val user = generateUser() + val zonedInCharacter = createZonedInCharacter(user.username, user.password, "tester") val npc = spawnNPC("creature_kreetle_swarmling", zonedInCharacter.player.creatureObject.location) npc.health = 1 zonedInCharacter.attack(npc) diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt index d34c02bc5..8cc4f8244 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -37,8 +37,8 @@ class TipCreditsTest : AcceptanceTest() { @Test fun negativeAmount() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") val tipAmount = -50 assertThrows(TipException::class.java) { @@ -48,8 +48,8 @@ class TipCreditsTest : AcceptanceTest() { @Test fun notEnoughMoneyForSurcharge() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") val tipAmount = zonedInCharacter1.player.creatureObject.bankBalance // Sending all bank balance should never be possible, because of the 5% surcharge assertThrows(TipException::class.java) { @@ -59,7 +59,7 @@ class TipCreditsTest : AcceptanceTest() { @Test fun npc() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") + val zonedInCharacter1 = createZonedInCharacter("Charone") val womprat = spawnNPC("creature_womprat", zonedInCharacter1.player.creatureObject.location) assertThrows(TipException::class.java) { @@ -69,7 +69,7 @@ class TipCreditsTest : AcceptanceTest() { @Test fun self() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") + val zonedInCharacter1 = createZonedInCharacter("Charone") assertThrows(TipException::class.java) { zonedInCharacter1.tip(zonedInCharacter1.player.creatureObject, 1) @@ -78,8 +78,8 @@ class TipCreditsTest : AcceptanceTest() { @Test fun sufficientCash() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") val char1Before = CreditsSnapshot(zonedInCharacter1) val char2Before = CreditsSnapshot(zonedInCharacter2) val tipAmount = 1 @@ -96,8 +96,8 @@ class TipCreditsTest : AcceptanceTest() { @Test fun sufficientBank() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") val char1Before = CreditsSnapshot(zonedInCharacter1) val char2Before = CreditsSnapshot(zonedInCharacter2) val tipAmount = 100 @@ -117,8 +117,8 @@ class TipCreditsTest : AcceptanceTest() { @Test fun tooFarAway() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") zonedInCharacter2.adminTeleport( planet = zonedInCharacter1.player.creatureObject.terrain, x = zonedInCharacter1.player.creatureObject.x + 20, @@ -133,8 +133,8 @@ class TipCreditsTest : AcceptanceTest() { @Test fun differentPlanet() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") zonedInCharacter2.adminTeleport( // Same coordinates, but different planet planet = Terrain.DANTOOINE, x = zonedInCharacter1.player.creatureObject.x, @@ -149,8 +149,8 @@ class TipCreditsTest : AcceptanceTest() { @Test fun insufficientBank() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") val char1Before = CreditsSnapshot(zonedInCharacter1) val tipAmount = char1Before.bank * 2 @@ -159,10 +159,9 @@ class TipCreditsTest : AcceptanceTest() { } } - private fun createZonedInCharacter(username: String, characterName: String): ZonedInCharacter { - val password = "password" - addUser(username, password, accessLevel = AccessLevel.DEV) - return HeadlessSWGClient.createZonedInCharacter(username, password, characterName) + private fun createZonedInCharacter(characterName: String): ZonedInCharacter { + val user = generateUser(accessLevel = AccessLevel.DEV) + return HeadlessSWGClient.createZonedInCharacter(user.username, user.password, characterName) } } diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/badge/ExplorationBadgeTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/badge/ExplorationBadgeTest.kt index f8dbfde7f..efac8abc7 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/badge/ExplorationBadgeTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/badge/ExplorationBadgeTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -38,8 +38,8 @@ import org.junit.jupiter.api.Test class ExplorationBadgeTest : AcceptanceTest() { @Test fun enteringAreaGrantsBadge() { - addUser("Test", "Test", AccessLevel.DEV) - val character = HeadlessSWGClient.createZonedInCharacter("Test", "Test", "char") + val user = generateUser(accessLevel = AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "char") character.adminTeleport(planet = Terrain.MUSTAFAR, x = 0, y = 0, z = 0) diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/AdminCommandAccessTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/AdminCommandAccessTest.kt index aaaf0cc9a..55eb13fd1 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/AdminCommandAccessTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/AdminCommandAccessTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -39,16 +39,16 @@ class AdminCommandAccessTest : AcceptanceTest() { @Test fun adminsCanUseAdminCommands() { - addUser("admin", "password", accessLevel = AccessLevel.DEV) - val character = HeadlessSWGClient.createZonedInCharacter("admin", "password", "adminchar") + val user = generateUser(accessLevel = AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") assertDoesNotThrow { character.adminGrantSkill("outdoors_scout_master") } } @Test fun onlyAdminsCanUseAdminCommands() { - addUser("player", "password", accessLevel = AccessLevel.PLAYER) - val character = HeadlessSWGClient.createZonedInCharacter("player", "password", "playerchar") + val user = generateUser(accessLevel = AccessLevel.PLAYER) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "playerchar") assertThrows { character.adminGrantSkill("outdoors_scout_master") diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt index 9772bf45b..d335c1dbe 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -32,19 +32,14 @@ import com.projectswg.holocore.headless.surrenderSkill import com.projectswg.holocore.resources.support.global.player.AccessLevel import com.projectswg.holocore.test.runners.AcceptanceTest import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class SkillTreeTest : AcceptanceTest() { - @BeforeEach - fun setUp() { - addUser("username", "password", accessLevel = AccessLevel.DEV) - } - @Test fun surrenderSkill() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") character.surrenderSkill("outdoors_scout_novice") // Every character has this skill by default @@ -53,7 +48,8 @@ class SkillTreeTest : AcceptanceTest() { @Test fun grantPrerequisiteSkills() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser(accessLevel = AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") character.adminGrantSkill("outdoors_scout_master") @@ -62,7 +58,8 @@ class SkillTreeTest : AcceptanceTest() { @Test fun socialProfessionsDoNotIncreaseCombatLevel() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser(accessLevel = AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val combatLevel = character.player.creatureObject.level character.adminGrantSkill("social_entertainer_master") @@ -72,7 +69,8 @@ class SkillTreeTest : AcceptanceTest() { @Test fun combatProfessionsIncreaseCombatLevel() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser(accessLevel = AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val combatLevel = character.player.creatureObject.level character.adminGrantSkill("combat_marksman_master") diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TrappingXPTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TrappingXPTest.kt index 59ff57bc3..018aa4454 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TrappingXPTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TrappingXPTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -31,19 +31,14 @@ import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureOb import com.projectswg.holocore.test.runners.AcceptanceTest import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class TrappingXPTest : AcceptanceTest() { - @BeforeEach - fun setUpUser() { - addUser("username", "password") - } - @Test fun scoutsGetTrappingXPFromKillingCreatures() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val npc = spawnNPC("creature_bantha", character.player.creatureObject.location) killTarget(character, npc) @@ -53,7 +48,8 @@ class TrappingXPTest : AcceptanceTest() { @Test fun onlyScoutsGetTrappingXPFromKillingCreatures() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") character.surrenderSkill("outdoors_scout_novice") val npc = spawnNPC("creature_bantha", character.player.creatureObject.location) @@ -64,7 +60,8 @@ class TrappingXPTest : AcceptanceTest() { @Test fun scoutsGetNoTrappingXPFromKillingNonCreatures() { - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val npc = spawnNPC("humanoid_tusken_commoner", character.player.creatureObject.location) killTarget(character, npc) diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt index c173aadd0..481e4bcab 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -35,8 +35,8 @@ class GroupTest : AcceptanceTest() { @Test fun formGroup() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") zonedInCharacter1.invitePlayerToGroup(zonedInCharacter2) zonedInCharacter2.acceptCurrentGroupInvitation() @@ -46,8 +46,8 @@ class GroupTest : AcceptanceTest() { @Test fun makeLeader() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") zonedInCharacter1.invitePlayerToGroup(zonedInCharacter2) zonedInCharacter2.acceptCurrentGroupInvitation() @@ -61,8 +61,8 @@ class GroupTest : AcceptanceTest() { @Test fun makeLeaderOnlyWorksForCurrentLeader() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") zonedInCharacter1.invitePlayerToGroup(zonedInCharacter2) zonedInCharacter2.acceptCurrentGroupInvitation() @@ -76,9 +76,9 @@ class GroupTest : AcceptanceTest() { @Test fun memberLeavesGroup() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") - val zonedInCharacter3 = createZonedInCharacter("Playerthree", "Charthree") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") + val zonedInCharacter3 = createZonedInCharacter("Charthree") zonedInCharacter1.invitePlayerToGroup(zonedInCharacter2) zonedInCharacter2.acceptCurrentGroupInvitation() @@ -96,9 +96,9 @@ class GroupTest : AcceptanceTest() { @Test fun leaderKicksMember() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") - val zonedInCharacter3 = createZonedInCharacter("Playerthree", "Charthree") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") + val zonedInCharacter3 = createZonedInCharacter("Charthree") zonedInCharacter1.invitePlayerToGroup(zonedInCharacter2) zonedInCharacter2.acceptCurrentGroupInvitation() @@ -116,9 +116,9 @@ class GroupTest : AcceptanceTest() { @Test fun leaderLeavesGroup() { - val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val zonedInCharacter2 = createZonedInCharacter("Playertwo", "Chartwo") - val zonedInCharacter3 = createZonedInCharacter("Playerthree", "Charthree") + val zonedInCharacter1 = createZonedInCharacter("Charone") + val zonedInCharacter2 = createZonedInCharacter("Chartwo") + val zonedInCharacter3 = createZonedInCharacter("Charthree") zonedInCharacter1.invitePlayerToGroup(zonedInCharacter2) zonedInCharacter2.acceptCurrentGroupInvitation() @@ -134,10 +134,9 @@ class GroupTest : AcceptanceTest() { ) } - private fun createZonedInCharacter(username: String, characterName: String): ZonedInCharacter { - val password = "password" - addUser(username, password) - return HeadlessSWGClient.createZonedInCharacter(username, password, characterName) + private fun createZonedInCharacter(characterName: String): ZonedInCharacter { + val user = generateUser() + return HeadlessSWGClient.createZonedInCharacter(user.username, user.password, characterName) } } \ No newline at end of file diff --git a/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt b/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt index 92615043e..faa252c9a 100644 --- a/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt +++ b/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -37,9 +37,9 @@ class CharacterManagementTest : AcceptanceTest() { @Test fun deleteCharacter() { - addUser("username", "password") - val headlessSWGClient = HeadlessSWGClient("username") - val characterSelectionScreen = headlessSWGClient.login("password") + val user = generateUser() + val headlessSWGClient = HeadlessSWGClient(user.username) + val characterSelectionScreen = headlessSWGClient.login(user.password) val characterId = characterSelectionScreen.createCharacter("firstcharacter") characterSelectionScreen.deleteCharacter(characterId) @@ -49,9 +49,9 @@ class CharacterManagementTest : AcceptanceTest() { @Test fun characterCreationRateLimit() { - addUser("username", "password") - val headlessSWGClient = HeadlessSWGClient("username") - val characterSelectionScreen = headlessSWGClient.login("password") + val user = generateUser() + val headlessSWGClient = HeadlessSWGClient(user.username) + val characterSelectionScreen = headlessSWGClient.login(user.password) characterSelectionScreen.createCharacter("firstcharacter") characterSelectionScreen.createCharacter("secondcharacter") diff --git a/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt b/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt index 079792efa..bab1db8b9 100644 --- a/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt +++ b/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt @@ -1,11 +1,10 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// Project SWG /// www.projectswg.com * * * - * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * ProjectSWG is an emulation project 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. * + * Our goal is to create one or more emulators which will provide servers for * + * players to continue playing a game similar to the one they used to play. * * * * This file is part of Holocore. * * * @@ -39,8 +38,8 @@ class KillAdminCommandTest : AcceptanceTest() { @Test fun killNpc() { - addUser("username", "password", AccessLevel.DEV) - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser(AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val npc = spawnNPC("creature_bantha", character.player.creatureObject.location, NpcStaticSpawnLoader.SpawnerFlag.ATTACKABLE) character.adminKill(npc) @@ -50,8 +49,8 @@ class KillAdminCommandTest : AcceptanceTest() { @Test fun killInvulnerableNpc() { - addUser("username", "password", AccessLevel.DEV) - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser(AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") val npc = spawnNPC("creature_bantha", character.player.creatureObject.location, NpcStaticSpawnLoader.SpawnerFlag.INVULNERABLE) character.adminKill(npc) @@ -64,12 +63,23 @@ class KillAdminCommandTest : AcceptanceTest() { @Test fun killSelf() { - addUser("username", "password", AccessLevel.DEV) - val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") + val user = generateUser(AccessLevel.DEV) + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "adminchar") character.adminKill(character.player.creatureObject) assertNotEquals(Posture.DEAD, character.player.creatureObject) } + @Test + fun killPlayer() { + val user = generateUser(AccessLevel.DEV) + val character1 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "charone") + val character2 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "chartwo") + + character1.adminKill(character2.player.creatureObject) + + assertEquals(Posture.DEAD, character2.player.creatureObject.posture) + } + } diff --git a/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt b/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt index 1a1a80f9c..e983683be 100644 --- a/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt +++ b/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -39,44 +39,44 @@ class LoginTest : AcceptanceTest() { @Test fun validCredentials() { - addUser("username", "password") - val headlessSWGClient = HeadlessSWGClient("username") + val user = generateUser() + val headlessSWGClient = HeadlessSWGClient(user.username) - val characterSelectionScreen = headlessSWGClient.login("password") + val characterSelectionScreen = headlessSWGClient.login(user.password) assertNotNull(characterSelectionScreen) } @Test fun validCredentialsButBanned() { - addUser("username", "password", banned = true) - val headlessSWGClient = HeadlessSWGClient("username") + val user = generateUser(banned = true) + val headlessSWGClient = HeadlessSWGClient(user.username) - assertThrows { headlessSWGClient.login("password") } + assertThrows { headlessSWGClient.login(user.password) } } @Test fun wrongUsername() { - addUser("username", "password") + val user = generateUser() val headlessSWGClient = HeadlessSWGClient("wrongusername") - assertThrows { headlessSWGClient.login("password") } + assertThrows { headlessSWGClient.login(user.password) } } @Test fun wrongPassword() { - addUser("username", "password") - val headlessSWGClient = HeadlessSWGClient("username") + val user = generateUser() + val headlessSWGClient = HeadlessSWGClient(user.username) assertThrows { headlessSWGClient.login("wrongpassword") } } @Test fun wrongVersion() { - addUser("username", "password") - val headlessSWGClient = HeadlessSWGClient("username", "20030404-14:00") + val user = generateUser() + val headlessSWGClient = HeadlessSWGClient(user.username, "20030404-14:00") - assertThrows { headlessSWGClient.login("password") } + assertThrows { headlessSWGClient.login(user.password) } } diff --git a/src/test/java/com/projectswg/holocore/services/support/global/chat/TellTest.kt b/src/test/java/com/projectswg/holocore/services/support/global/chat/TellTest.kt new file mode 100644 index 000000000..8b4692664 --- /dev/null +++ b/src/test/java/com/projectswg/holocore/services/support/global/chat/TellTest.kt @@ -0,0 +1,102 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// 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.support.global.chat + +import com.projectswg.common.data.encodables.chat.ChatResult +import com.projectswg.holocore.headless.HeadlessSWGClient +import com.projectswg.holocore.headless.addIgnore +import com.projectswg.holocore.headless.sendTell +import com.projectswg.holocore.headless.waitForTell +import com.projectswg.holocore.test.runners.AcceptanceTest +import org.junit.jupiter.api.Assertions.assertAll +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class TellTest : AcceptanceTest() { + + @Test + fun `tell is received by player`() { + val user = generateUser() + val character1 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "Charone") + val character2 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "Chartwo") + + val chatResult = character1.sendTell("Chartwo", "Hello") + assertEquals(ChatResult.SUCCESS, chatResult) + + val tell = character2.waitForTell() + assertAll( + { assertEquals("Charone", tell.sender) }, + { assertEquals("Hello", tell.message) }, + ) + } + + @Test + fun `receiving character name is case insensitive`() { + val user = generateUser() + val character1 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "Charone") + HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "Chartwo") + + val chatResult = character1.sendTell("CHARTWO", "Hello") + + assertEquals(ChatResult.SUCCESS, chatResult) + } + + @Test + fun `tells can only be sent to online players`() { + val user = generateUser() + val character1 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "Charone") + val swgClient = HeadlessSWGClient(user.username) + val characterSelectionScreen = swgClient.login(user.password) + characterSelectionScreen.createCharacter("Chartwo") // Create character but don't zone in + + val chatResult = character1.sendTell("Chartwo", "Hello") + + assertEquals(ChatResult.TARGET_AVATAR_DOESNT_EXIST, chatResult) + } + + @Test + fun `drop tells to non-existent characters`() { + val user = generateUser() + val character = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "Charone") + + val chatResult = character.sendTell("chartwo", "Hello") + + assertEquals(ChatResult.TARGET_AVATAR_DOESNT_EXIST, chatResult) + } + + @Test + fun `drop tells from ignored characters`() { + val user = generateUser() + val character1 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "charone") + val character2 = HeadlessSWGClient.createZonedInCharacter(user.username, user.password, "chartwo") + character2.addIgnore("charone") + + val chatResult = character1.sendTell("chartwo", "Hello") + + assertEquals(ChatResult.IGNORED, chatResult) + } +} \ No newline at end of file diff --git a/src/test/java/com/projectswg/holocore/test/resources/GenericPlayer.java b/src/test/java/com/projectswg/holocore/test/resources/GenericPlayer.java index 5e91bc2a0..dd1217af5 100644 --- a/src/test/java/com/projectswg/holocore/test/resources/GenericPlayer.java +++ b/src/test/java/com/projectswg/holocore/test/resources/GenericPlayer.java @@ -1,11 +1,10 @@ /*********************************************************************************** * Copyright (c) 2024 /// Project SWG /// www.projectswg.com * * * - * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * ProjectSWG is an emulation project 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. * + * Our goal is to create one or more emulators which will provide servers for * + * players to continue playing a game similar to the one they used to play. * * * * This file is part of Holocore. * * * @@ -30,6 +29,8 @@ package com.projectswg.holocore.test.resources; import com.projectswg.common.data.CRC; import com.projectswg.common.data.encodables.tangible.Posture; import com.projectswg.common.data.location.Location; +import com.projectswg.common.network.NetBuffer; +import com.projectswg.common.network.NetworkProtocol; import com.projectswg.common.network.packets.SWGPacket; import com.projectswg.common.network.packets.swg.zone.*; import com.projectswg.common.network.packets.swg.zone.baselines.Baseline; @@ -82,6 +83,7 @@ public class GenericPlayer extends Player { public void sendPacket(SWGPacket packet) { packetLock.lock(); try { + encodeAndDecode(packet); this.packets.add(packet); packetLockCondition.signalAll(); } finally { @@ -89,7 +91,21 @@ public class GenericPlayer extends Player { } handlePacket(packet); } - + + private static void encodeAndDecode(SWGPacket packet) { + try { + // This doesn't actually test the encoding and decoding of the packet, but it does test that the packet can be encoded and decoded without throwing an exception + NetBuffer data = NetworkProtocol.encode(packet); + NetworkProtocol.decode(data); + int remaining = data.remaining(); + if (remaining > 0) { + throw new RuntimeException("Encoded packet buffer had more data that wasn't read during decoding. Bytes remaining: " + remaining); + } + } catch (Throwable t) { + throw new RuntimeException("Failed to encode and decode packet", t); + } + } + @Override public void sendPacket(SWGPacket packet1, SWGPacket packet2) { sendPacket(packet1); diff --git a/src/test/java/com/projectswg/holocore/test/runners/AcceptanceTest.kt b/src/test/java/com/projectswg/holocore/test/runners/AcceptanceTest.kt index 0fe4e2ed8..b80cdaf51 100644 --- a/src/test/java/com/projectswg/holocore/test/runners/AcceptanceTest.kt +++ b/src/test/java/com/projectswg/holocore/test/runners/AcceptanceTest.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2024 /// 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. * @@ -26,6 +26,7 @@ ***********************************************************************************/ package com.projectswg.holocore.test.runners +import com.projectswg.common.data.encodables.galaxy.Galaxy import com.projectswg.common.data.location.Location import com.projectswg.holocore.headless.MemoryUserDatabase import com.projectswg.holocore.resources.support.data.server_info.loader.ServerData @@ -46,6 +47,8 @@ import com.projectswg.holocore.services.gameplay.player.character.TippingService import com.projectswg.holocore.services.gameplay.player.experience.ExperiencePointService import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService import com.projectswg.holocore.services.gameplay.player.group.GroupService +import com.projectswg.holocore.services.support.global.chat.ChatFriendService +import com.projectswg.holocore.services.support.global.chat.ChatInstantMessageService import com.projectswg.holocore.services.support.global.chat.ChatMailService import com.projectswg.holocore.services.support.global.chat.ChatSystemService import com.projectswg.holocore.services.support.global.commands.CommandExecutionService @@ -57,11 +60,14 @@ import com.projectswg.holocore.services.support.global.zone.creation.CharacterCr import com.projectswg.holocore.services.support.global.zone.sui.SuiService import com.projectswg.holocore.services.support.objects.SimulatedObjectStorage import com.projectswg.holocore.services.support.objects.awareness.AwarenessService +import com.projectswg.holocore.services.support.objects.awareness.ClientAwarenessService import com.projectswg.holocore.services.support.objects.items.ContainerService import com.projectswg.holocore.services.support.objects.radials.RadialService import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.BeforeEach +import java.time.ZoneOffset +import java.util.* /** * Acceptance test runner that sets up all the services required for an acceptance test. @@ -78,12 +84,17 @@ abstract class AcceptanceTest : TestRunnerSynchronousIntents() { @BeforeEach fun setUpServices() { + val galaxy = Galaxy() + galaxy.setZoneOffset(ZoneOffset.UTC) + val galaxies = setOf(galaxy) + + registerService(ClientAwarenessService()) registerService(CharacterLookupService()) registerService(SimulatedObjectStorage()) registerService(AwarenessService()) - registerService(LoginService(memoryUserDatabase)) + registerService(LoginService(galaxies, memoryUserDatabase)) registerService(ZoneService()) - registerService(CommandQueueService(5, DeterministicDie(0), DeterministicDie(0), DeterministicDie(0))) + registerService(CommandQueueService(5, DeterministicDie(0), DeterministicDie(0), DeterministicDie(0), skipWarmup = true)) registerService(CommandExecutionService()) registerService(CharacterCreationService()) registerService(ExperiencePointService()) @@ -92,6 +103,8 @@ abstract class AcceptanceTest : TestRunnerSynchronousIntents() { registerService(SkillService()) registerService(ChatSystemService()) registerService(ChatMailService()) + registerService(ChatInstantMessageService()) + registerService(ChatFriendService()) registerService(SuiService()) registerService(RadialService()) registerService(TippingService()) @@ -115,8 +128,14 @@ abstract class AcceptanceTest : TestRunnerSynchronousIntents() { } } - fun addUser(username: String, password: String, accessLevel: AccessLevel = AccessLevel.PLAYER, banned: Boolean = false) { + /** + * Generates a user with a random username and password. + */ + fun generateUser(accessLevel: AccessLevel = AccessLevel.PLAYER, banned: Boolean = false): UserCredentials { + val username = UUID.randomUUID().toString().substringBefore("-") // UUIDs are a bit long for usernames + val password = UUID.randomUUID().toString() memoryUserDatabase.addUser(username, password, accessLevel, banned) + return UserCredentials(username, password) } /** diff --git a/src/test/java/com/projectswg/holocore/test/runners/UserCredentials.kt b/src/test/java/com/projectswg/holocore/test/runners/UserCredentials.kt new file mode 100644 index 000000000..d8f753462 --- /dev/null +++ b/src/test/java/com/projectswg/holocore/test/runners/UserCredentials.kt @@ -0,0 +1,29 @@ +/*********************************************************************************** + * Copyright (c) 2024 /// 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.test.runners + +data class UserCredentials(val username: String, val password: String)