PDA

View Full Version : Plugin::RandomWeapons()


trevius
02-21-2010, 11:50 AM
Here is a long but interesting plugin. It will randomly select a weapon for the primary slot and a weapon or shield for the secondary slot. Other than the first 2 fields, the rest are all optional.

This plugin requires the RandomRange() plugin from this link:
http://www.eqemulator.org/forums/showthread.php?t=30421

This plugin also requires at least SVN Source Code Revision 1259 or later!

Here are the steps to add this plugin to your server:

1. Open notepad, or whatever text editor you prefer.

2. Copy and paste the following code into Notepad:

#Usage: plugin::RandomWeapons(MinModelNum, MaxModelNum, MyChance, MinShieldNum, MaxShieldNum, NoDualWield?, IgnoreClass? );
#Example: plugin::RandomWeapons(1, 11169, 50, 200, 230, 0, 0);
#MinModelNum - Minimum Model Number to use for selecting Primary/Offhand Weapons
#MaxModelNum - Maximum Model Number to use for selecting Primary/Offhand Weapons
#MyChance - The percent chance that the NPC will wield any weapons (1 - 100)
#MinShieldNum - Minimum Model Number to use for selecting Shields
#MaxShieldNum - Maximum Model Number to use for selecting Shields
#NoDualWield? - 1 = NPCs won't dual wield or use shield, 0 = They have a chance to dual wield / shield
#IgnoreClass? - 1 = Weapon selection will choose any random model number within the range given, 0 = Smart weapon selection based on NPC class

sub RandomWeapons {

my $npc = plugin::val('$npc');
my $MinModelNum = $_[0];
my $MaxModelNum = $_[1];
my $MyChance = $_[2];
my $MinShieldNum = $_[3];
my $MaxShieldNum = $_[4];
my $NoDualWield = $_[5];
my $IgnoreClass = $_[6];


%WeaponModels = (
#BEGIN Classic Weapon Models
1 => "1HS",
2 => "2HS",
3 => "1HS",
4 => "BOW",
5 => "1HP",
6 => "CASTER",
7 => "1HB",
8 => "2HB",
9 => "1HS",
10 => "OTHER", #Arrow
11 => "1HS", #SOE Fanfair Reward
12 => "STAFF", #SOE Fanfair Reward
13 => "STAFF", #SOE Fanfair Reward
14 => "1HB",
15 => "BARD",
16 => "1HP",
17 => "1HP",
18 => "1HB",
19 => "1HB",
20 => "1HP",
21 => "BARD",
22 => "1HS",
23 => "2HS",
24 => "2HB",
25 => "2HS",
26 => "1HS",
27 => "CASTER",
28 => "CASTER",
29 => "STAFF",
30 => "2HP",
31 => "1HB",
32 => "OTHER", #Broom
33 => "1HB",
34 => "1HS",
35 => "1HB",
36 => "OTHER", #Torch
37 => "1HB",
38 => "OTHER", #Fishing Pole
39 => "2HS",
40 => "1HS",
41 => "1HS",
42 => "1HS",
43 => "1HB",
44 => "1HS",
45 => "STAFF",
46 => "CASTER",
47 => "CASTER",
48 => "OTHER", #Lantern
49 => "1HB",
50 => "1HP",
51 => "1HB",
52 => "OTHER", #Shovel
53 => "2HS",
54 => "OTHER", #Cigar
55 => "OTHER", #Pipe
56 => "OTHER", #Mug
57 => "1HS",
58 => "1HS",
59 => "1HB",
60 => "1HS",
61 => "1HS",
62 => "1HS", #SoulFire
63 => "OTHER", #Small Bag
64 => "OTHER", #Large Bag
65 => "OTHER", #Scroll
66 => "TRADESKILL", #Forge
67 => "CASTER", #Voodoo Doll
68 => "H2H",
69 => "TRADESKILL", #Oven
70 => "TRADESKILL", #Brew Barrel
71 => "H2H",
72 => "CASTER",
73 => "TRADESKILL", #Kiln
74 => "TRADESKILL", #Pottery Wheel
75 => "STAFF",
76 => "2HS", #Luclin Weapn Model
78 => "OTHER", #Fire
79 => "2HP",
80 => "2HS",
81 => "1HS",
82 => "1HS",
83 => "2HS",
84 => "2HS",
85 => "1HS",
86 => "2HS",
87 => "1HS",
#END Classic Weapon Models
#BEGIN Kunark Weapon Models
88 => "2HS",
89 => "1HS",
90 => "1HS",
91 => "H2H",
92 => "2HP",
93 => "2HS",
94 => "H2H",
95 => "2HS",
96 => "CASTER", #Added for special quest later
97 => "1HS", #GM Sword
98 => "H2H",
99 => "1HS",
100 => "1HS",
101 => "2HB",
102 => "1HB",
103 => "2HP",
104 => "1HS",
105 => "1HS",
106 => "2HS",
107 => "1HS",
108 => "1HS",
109 => "1HS",
110 => "2HS",
111 => "2HB",
112 => "1HB",
113 => "1HS",
115 => "1HB",
117 => "2HB",
118 => "1HP",
119 => "1HP",
120 => "1HS",
121 => "1HS",
122 => "STAFF",
123 => "STAFF",
124 => "2HB",
125 => "STAFF",
126 => "STAFF",
127 => "STAFF",
128 => "TRADESKILL", #Loom
129 => "STAFF",
130 => "1HB",
131 => "1HS",
132 => "2HP",
133 => "CASTER",
134 => "CASTER",
135 => "H2H",
136 => "H2H",
137 => "BARD",
138 => "BARD",
139 => "1HP",
#BEGIN Epic 1.0s
140 => "1HP",
141 => "1HS",
142 => "1HS",
145 => "2HS",
146 => "2HS",
148 => "1HS",
149 => "1HS",
150 => "1HS",
151 => "CASTER",
153 => "STAFF",
154 => "2HP",
155 => "CASTER",
156 => "1HB",
157 => "CASTER",
160 => "2HS",
#END Epic 1.0s
#END Kunark Weapon Models
#BEGIN Velious Weapon Models
161 => "1HS",
162 => "1HS",
163 => "1HS",
164 => "1HS",
165 => "1HS",
166 => "2HS",
167 => "1HP",
168 => "1HS",
169 => "2HB",
170 => "1HS",
171 => "1HS",
172 => "2HP",
173 => "2HS",
174 => "1HS",
175 => "1HS",
176 => "2HS",
177 => "1HB",
178 => "2HB",
179 => "1HB",
180 => "1HB",
181 => "1HS",
182 => "1HS",
183 => "1HS",
184 => "1HS",
185 => "1HB",
186 => "STAFF",
187 => "2HP",
188 => "1HS",
189 => "1HB",
190 => "2HS",
191 => "1HS",
192 => "1HS",
193 => "1HB",
194 => "1HP",
195 => "1HP",
196 => "1HS",
197 => "2HP",
198 => "BOW",
199 => "BOW",
200 => "SHIELD",
201 => "SHIELD",
202 => "SHIELD",
203 => "SHIELD",
204 => "SHIELD",
205 => "SHIELD",
206 => "SHIELD",
207 => "SHIELD",
208 => "SHIELD",
209 => "SHIELD",
210 => "SHIELD",
211 => "SHIELD",
212 => "SHIELD",
213 => "SHIELD",
214 => "SHIELD",
215 => "SHIELD",
216 => "SHIELD",
217 => "SHIELD",
218 => "SHIELD",
219 => "SHIELD",
220 => "SHIELD",
221 => "SHIELD",
222 => "SHIELD",
223 => "SHIELD",
224 => "SHIELD",
225 => "SHIELD",
226 => "SHIELD",
227 => "SHIELD",
228 => "SHIELD",
250 => "OTHER", #Lollipop
300 => "2HS",
301 => "1HS",
308 => "STAFF",
#END Velious Weapon Models
#BEGIN Luclin Weapon Models
10000 => "1HS",
10001 => "2HB",
10002 => "1HS",
10003 => "1HB",
10004 => "2HS",
10005 => "1HS",
10006 => "1HP",
10007 => "1HB",
10008 => "1HB",
10009 => "1HP",
10010 => "1HS",
10011 => "2HS",
10012 => "1HB",
10013 => "2HB",
10014 => "1HS",
10015 => "H2H", #EPIC
10016 => "1HP",
10017 => "1HS",
10018 => "1HS",
10019 => "1HS",
10020 => "1HB",
10021 => "1HB",
10022 => "1HS",
10023 => "1HS",
10024 => "1HS",
10025 => "2HS",
10026 => "1HS",
10027 => "1HS",
10028 => "2HP",
10029 => "H2H", #EPIC
10100 => "2HP",
10101 => "2HP",
10103 => "1HP",
10104 => "1HP",
10105 => "1HP",
10106 => "2HP",
10107 => "1HP",
10108 => "2HP",
10109 => "1HP",
10200 => "STAFF",
10201 => "STAFF",
10202 => "STAFF",
10203 => "STAFF",
10300 => "BOW",
10301 => "BARD",
#END Luclin Weapon Models
#BEGIN PoP Weapon Models
#BEGIN PoP Gods Weapons
10400 => "1HB",
10401 => "2HS",
10402 => "2HP",
10403 => "STAFF",
10404 => "1HS",
10405 => "2HS",
10406 => "STAFF",
10407 => "STAFF",
10408 => "2HB",
10409 => "1HB",
10410 => "STAFF",
#END PoP Gods Weapons
10411 => "1HS",
10412 => "BOW",
10413 => "2HS",
10501 => "1HB",
10502 => "CASTER",
10503 => "CASTER",
10504 => "CASTER",
10505 => "STAFF",
10506 => "STAFF",
10507 => "STAFF",
10508 => "2HP",
10509 => "H2H",
10510 => "H2H",
10511 => "H2H",
10512 => "H2H",
10513 => "1HS",
10514 => "1HP",
10515 => "1HS",
10516 => "H2H",
10517 => "1HB",
10518 => "1HB",
10519 => "1HB",
10520 => "STAFF",
10521 => "STAFF",
10522 => "1HB",
10523 => "STAFF",
10524 => "1HB",
10525 => "CASTER",
10526 => "1HP",
10527 => "1HP",
10528 => "1HP",
10545 => "1HS",
10600 => "BARD",
10601 => "BARD",
10602 => "BARD",
10603 => "BARD",
10604 => "1HB",
10605 => "1HB",
10606 => "1HB",
10607 => "1HB",
10608 => "1HB",
10609 => "1HB",
10610 => "1HP",
10611 => "OTHER", #Snowball
10612 => "2HP",
10613 => "2HP",
10614 => "BOW",
10615 => "2HS",
10616 => "1HS",
10617 => "1HS",
10618 => "1HP",
10619 => "1HS",
10620 => "1HS",
10621 => "1HP",
10622 => "2HS",
10623 => "1HS",
10624 => "1HP",
10625 => "2HS",
10626 => "1HS",
10627 => "1HP",
10628 => "2HS",
10629 => "1HS",
10630 => "1HP",
10631 => "2HS",
10632 => "1HS",
10633 => "1HP",
10634 => "2HB",
10635 => "1HB",
10636 => "2HB",
10637 => "1HB",
10638 => "2HB",
10639 => "2HB",
10640 => "2HS",
10641 => "BOW",
10642 => "CASTER",
10643 => "STAFF",
10644 => "2HP",
10645 => "CASTER",
10646 => "CASTER",
10647 => "1HB",
10648 => "1HS",
10649 => "1HS",
10650 => "1HP",
10651 => "2HS",
10652 => "1HS",
10653 => "1HP",
10654 => "2HS",
10655 => "1HS",
10656 => "1HP",
10657 => "2HS",
10658 => "1HS",
10659 => "1HP",
10660 => "2HS",
10661 => "1HS",
10662 => "1HS",
10663 => "CASTER",
#END PoP Weapon Models
#BEGIN LoY Weapon Models
10664 => "SHIELD",
10665 => "SHIELD",
10666 => "SHIELD",
10667 => "SHIELD",
10668 => "SHIELD",
10669 => "SHIELD",
10670 => "SHIELD",
10671 => "SHIELD",
10672 => "1HB",
10673 => "1HS",
10674 => "1HS",
10675 => "2HB",
10676 => "2HS",
10677 => "STAFF",
10678 => "1HS",
10679 => "1HP",
10680 => "1HP",
10681 => "1HB",
10682 => "1HS",
10683 => "STAFF",
10685 => "2HS",
10686 => "1HS",
10687 => "1HP",
10688 => "1HB",
10689 => "1HP",
10690 => "1HP",
10691 => "SHIELD",
10692 => "1HP",
10693 => "1HP",
10694 => "1HS",
10695 => "CASTER",
10696 => "1HS",
10697 => "CASTER",
#END LoY Weapon Models
#BEGIN LDoN Weapon Models
10700 => "1HS",
10701 => "1HP",
10702 => "1HS",
10703 => "1HB",
10704 => "1HS",
10705 => "1HS",
10706 => "1HB",
10707 => "1HB",
10708 => "1HS",
10709 => "1HP",
10710 => "1HS",
10711 => "1HP",
10712 => "1HP",
#END LDoN Weapon Models
#BEGIN GoD Weapon Models
10713 => "1HB",
10714 => "TRADESKILL", #Augment Pool
10715 => "1HS",
10716 => "1HB",
10717 => "BOW",
10718 => "1HB",
10719 => "1HS",
10720 => "2HS",
10722 => "1HP",
10723 => "STAFF",
10724 => "OTHER", #Small Rock
10725 => "OTHER", #Chinese Star
10726 => "1HS",
10727 => "2HS", #Epic 1.5
10728 => "1HS",
10729 => "SHIELD",
10730 => "SHIELD",
10731 => "1HB",
10732 => "1HP",
10733 => "CASTER",
#BEGIN Epic 2.0s
10735 => "1HS",
10736 => "1HB",
10737 => "2HS",
10738 => "SHIELD",
10739 => "STAFF",
10740 => "STAFF",
10741 => "STAFF",
10742 => "H2H",
10743 => "STAFF",
10744 => "2HS",
10745 => "1HS",
10746 => "1HP",
10747 => "2HS",
10748 => "1HB",
10749 => "1HS",
10750 => "STAFF",
#END Epic 2.0s
#BEGIN Epic 1.5s
10751 => "1HS",
10752 => "1HB",
10753 => "2HS",
10754 => "SHIELD",
10755 => "STAFF",
10756 => "STAFF",
10757 => "STAFF",
10758 => "H2H",
10759 => "STAFF",
10760 => "2HS",
10761 => "1HS",
10762 => "1HP",
10763 => "2HS",
10764 => "1HB",
10765 => "1HS",
10766 => "STAFF",
#END Epic 1.5s
#BEGIN OOW+ Weapon Models
10767 => "CASTER",
10768 => "1HB",
10769 => "1HP",
10770 => "1HS",
10771 => "1HS",
10772 => "SHIELD",
10773 => "2HS",
10774 => "STAFF",
10775 => "SHIELD",
10776 => "2HS",
10777 => "1HB",
10778 => "1HS",
10779 => "1HS",
10780 => "1HS",
10781 => "SHIELD",
10782 => "2HP",
10783 => "H2H",
10784 => "1HS",
10785 => "1HS",
10786 => "2HS",
10787 => "1HS",
10788 => "CASTER",
10789 => "BOW",
10790 => "SHIELD",
10791 => "1HS",
10792 => "2HS",
10793 => "1HP",
10794 => "STAFF",
10795 => "1HB",
10796 => "2HB",
10797 => "2HS",
10798 => "1HP",
10799 => "1HP",
10806 => "CASTER",
10807 => "CASTER",
10808 => "CASTER",
10810 => "2HS",
10811 => "1HS",
10812 => "2HS",
10813 => "1HP",
10814 => "1HP",
10815 => "1HP",
10816 => "1HP",
10817 => "1HB",
10818 => "2HB",
10819 => "CASTER",
10820 => "STAFF",
10821 => "1HS",
10822 => "CASTER",
10823 => "STAFF",
10824 => "1HP",
10825 => "1HS",
10826 => "SHIELD",
10827 => "SHIELD",
10828 => "STAFF",
10829 => "1HB",
10830 => "2HB",
10831 => "1HP",
10832 => "SHIELD",
10833 => "SHIELD",
10834 => "1HS",
10835 => "2HS",
10836 => "CASTER",
10837 => "CASTER",
10838 => "1HB",
10839 => "2HB",
10840 => "1HS",
10841 => "2HS",
10842 => "H2H",
#END TITANIUM Weapon Models
#BEGIN SoF Weapon Models
10843 => "OTHER", #Broom
10844 => "1HP",
10845 => "2HB",
10846 => "1HB",
10847 => "2HB",
10848 => "1HS",
10849 => "SHIELD",
10850 => "SHIELD",
10851 => "OTHER", #Shovel
10852 => "STAFF",
10853 => "STAFF",
10854 => "CASTER",
10855 => "1HS",
10856 => "2HS",
10857 => "SHIELD",
10858 => "SHIELD",
10859 => "1HB",
10860 => "1HS",
10861 => "OTHER", #Beer Mug
10862 => "STAFF",
10866 => "1HP",
10867 => "1HS",
10868 => "1HP",
10869 => "2HS",
10870 => "1HP",
10871 => "2HS",
10872 => "1HS",
10873 => "2HS",
10874 => "1HS",
10875 => "2HS",
10876 => "1HS",
10877 => "2HS",
10878 => "1HS",
10879 => "2HS",
10880 => "1HS",
10881 => "2HS",
10882 => "1HP",
10883 => "1HS",
10884 => "2HS",
10885 => "1HS",
10886 => "2HS",
10887 => "1HS",
10888 => "2HS",
10889 => "1HS",
10890 => "2HS",
10891 => "1HS",
10892 => "2HS",
10893 => "1HS",
10894 => "2HS",
10895 => "1HS",
10896 => "2HS",
10897 => "1HS",
10898 => "2HS",
10899 => "1HS",
10900 => "2HS",
10901 => "1HS",
10902 => "2HS",
10903 => "1HP",
10904 => "1HS",
10905 => "2HS",
10906 => "1HS",
10907 => "2HS",
10908 => "1HS",
10909 => "2HS",
10910 => "1HP",
10911 => "1HP",
10912 => "1HP",
10913 => "1HP",
10914 => "1HP",
10915 => "1HP",
10916 => "1HP",
10917 => "1HP",
10918 => "1HP",
10919 => "1HP",
10920 => "1HS",
10921 => "2HS",
10922 => "1HS",
10923 => "2HS",
10924 => "1HB",
10925 => "2HB",
10926 => "1HB",
10927 => "2HB",
10928 => "1HB",
10929 => "2HB",
10930 => "1HB",
10931 => "2HB",
10932 => "1HB",
10933 => "2HB",
10934 => "1HB",
10935 => "2HB",
10936 => "1HB",
10937 => "2HB",
10938 => "STAFF",
10939 => "CASTER",
10940 => "STAFF",
10941 => "STAFF",
10942 => "STAFF",
10943 => "1HB",
10944 => "STAFF",
10945 => "1HB",
10946 => "1HB",
10947 => "2HB",
10948 => "1HB",
10949 => "2HB",
10950 => "2HP",
10951 => "2HP",
10952 => "2HP",
10953 => "2HP",
10954 => "2HP",
10955 => "2HP",
10956 => "2HP",
10957 => "2HP",
10958 => "1HP",
10959 => "STAFF",
10960 => "SHIELD",
10961 => "SHIELD",
10962 => "SHIELD",
10963 => "SHIELD",
10964 => "SHIELD",
10965 => "SHIELD",
10966 => "SHIELD",
10967 => "SHIELD",
10968 => "SHIELD",
10969 => "SHIELD",
10970 => "SHIELD",
10971 => "SHIELD",
10972 => "SHIELD",
10973 => "SHIELD",
10974 => "SHIELD",
10975 => "SHIELD",
10976 => "SHIELD",
10977 => "SHIELD",
10978 => "SHIELD",
10979 => "SHIELD",
10980 => "SHIELD",
10981 => "SHIELD",
10982 => "SHIELD",
10983 => "SHIELD",
10984 => "SHIELD",
10985 => "SHIELD",
10986 => "SHIELD",
10987 => "SHIELD",
10988 => "SHIELD",
10989 => "SHIELD",
10990 => "SHIELD",
10991 => "SHIELD",
10992 => "SHIELD",
10993 => "SHIELD",
10994 => "SHIELD",
10995 => "SHIELD",
10996 => "SHIELD",
10997 => "BOW",
10998 => "BOW",
10999 => "1HB",
11001 => "SHIELD",
11002 => "SHIELD",
11003 => "SHIELD",
11013 => "SHIELD",
11017 => "SHIELD",
11018 => "SHIELD",
11019 => "SHIELD",
11020 => "SHIELD",
11031 => "OTHER", #Torch
11032 => "STAFF",
11033 => "OTHER", #Hoe
11034 => "OTHER", #Rake
11035 => "OTHER", #Pitch Fork
11036 => "OTHER", #Bucket full of Dirt
11037 => "OTHER", #Bucket full of Apples
11038 => "OTHER", #Bucket full of Rocks
11039 => "OTHER", #Bucket full of Gems
11040 => "OTHER", #Bucket full of Ash?
11041 => "1HP",
11042 => "1HS",
11043 => "2HS",
11044 => "1HB",
11045 => "2HB",
11046 => "1HS",
11047 => "2HS",
11048 => "SHIELD",
11049 => "SHIELD",
11050 => "H2H",
11051 => "H2H",
11052 => "1HB",
11053 => "1HS",
11054 => "OTHER", #Box
11055 => "OTHER", #Rock
11056 => "OTHER", #Bush
11057 => "OTHER", #Rock
11058 => "OTHER", #3 Bones
11059 => "OTHER", #3 Large Books
11060 => "OTHER", #Green Leaf
11061 => "OTHER", #Mushroom
11062 => "OTHER", #Box
11063 => "OTHER", #Box
11064 => "OTHER", #Rock
11065 => "OTHER", #Rock
11066 => "OTHER", #Bush
11067 => "OTHER", #Bush
11068 => "OTHER", #Rock
11069 => "OTHER", #Red Apple
11070 => "OTHER", #Green Apple
11071 => "OTHER", #Pumpkin
11072 => "OTHER", #3 Bones
11073 => "OTHER", #3 Large Books
11074 => "OTHER", #White Branch
11075 => "OTHER", #Palm Tree Leaf
11076 => "OTHER", #Bamboo
11077 => "OTHER", #Brown Branch
11078 => "OTHER", #Dead Branch
11079 => "OTHER", #Brown Leaf
11080 => "OTHER", #Red Maple Leaf
11081 => "OTHER", #Yellow Mushroom
11082 => "OTHER", #Green Mushroom
11083 => "OTHER", #Brown Mushroom
11084 => "OTHER", #Green Branch
11085 => "SHIELD",
11086 => "SHIELD",
11087 => "CASTER",
11088 => "1HS",
11089 => "1HS",
11090 => "1HS",
11091 => "1HP",
11092 => "2HP",
11093 => "1HP",
11094 => "1HS",
11095 => "1HP",
11096 => "OTHER", #Rolling Pin
11097 => "STAFF",
11098 => "CASTER",
11099 => "H2H",
11100 => "2HS",
11101 => "1HP",
11102 => "SHIELD",
11103 => "SHIELD",
11104 => "STAFF",
11105 => "1HS",
11106 => "1HB",
11107 => "2HB",
11108 => "1HS",
11109 => "2HS",
11110 => "SHIELD",
11111 => "SHIELD",
11112 => "1HP",
11113 => "1HS",
11114 => "1HP",
11115 => "1HS",
11116 => "1HS",
11117 => "STAFF",
11118 => "OTHER", #Fish
11119 => "2HP",
11120 => "H2H",
11121 => "OTHER", #Gold Coin
11122 => "OTHER", #Silver Coin
11123 => "OTHER", #Crystal
11124 => "OTHER", #Crystal
11129 => "1HS",
11130 => "2HB",
11131 => "1HP",
11132 => "2HS",
11133 => "2HB",
11139 => "H2H",
11140 => "SHIELD",
11144 => "SHIELD",
11154 => "OTHER", #Large Crystal
11155 => "OTHER", #Large Crystal
11156 => "OTHER", #Large Crystal
11157 => "OTHER", #Large Crystal
11158 => "OTHER", #Large Crystal
11159 => "OTHER", #Large Crystal
11160 => "OTHER", #Large Crystal
11161 => "OTHER", #Large Crystal
11162 => "OTHER", #Small Crystal
11163 => "OTHER", #Small Crystal
11164 => "OTHER", #Small Crystal
11165 => "OTHER", #Small Crystal
11166 => "OTHER", #Small Crystal
11167 => "OTHER", #Small Crystal
11168 => "OTHER", #Small Crystal
11169 => "OTHER" #Small Crystal
#END SoF Weapon Models
);

%ClassPrimaryTypes = (
1 => [ "1HS", "2HS", "1HB", "2HB", "1HP", "2HP" ], #Warrior
2 => [ "1HB", "2HB", "STAFF", "CASTER" ], #Cleric
3 => [ "1HS", "2HS", "1HB", "2HB", "1HP", "2HP" ], #Paladin
4 => [ "1HS", "2HS", "1HB", "2HB", "1HP", "2HP" ], #Ranger
5 => [ "1HS", "2HS", "1HB", "2HB", "1HP", "2HP" ], #Shadow Knight
6 => [ "1HS", "1HB", "2HB", "STAFF", "CASTER" ], #Druid
7 => [ "1HB", "2HB", "H2H", "STAFF" ], #Monk
8 => [ "1HS", "1HB", "1HP", "BARD" ], #Bard
9 => [ "1HS", "1HB", "1HP" ], #Rogue
10 => [ "1HB", "2HB", "1HP", "STAFF", "CASTER" ], #Shaman
11 => [ "1HB", "2HB", "1HP", "STAFF", "CASTER" ], #Necromancer
12 => [ "1HB", "2HB", "1HP", "STAFF", "CASTER" ], #Wizard
13 => [ "1HB", "2HB", "1HP", "STAFF", "CASTER" ], #Mage
14 => [ "1HB", "2HB", "1HP", "STAFF", "CASTER" ], #Enchanter
15 => [ "1HB", "2HB", "1HP", "H2H", "STAFF" ], #Beastlord
16 => [ "2HS", "2HB", "2HP" ] #Berserker
);

%ClassSecondaryTypes = (
1 => [ "1HS", "1HB", "1HP", "SHIELD" ], #Warrior
2 => [ "CASTER", "SHIELD" ], #Cleric
3 => [ "SHIELD" ], #Paladin
4 => [ "1HS", "1HB", "1HP" ], #Ranger
5 => [ "SHIELD" ], #Shadow Knight
6 => [ "CASTER", "SHIELD" ], #Druid
7 => [ "1HB", "2HB", "H2H", "STAFF" ], #Monk
8 => [ "1HS", "1HB", "1HP" ], #Bard
9 => [ "1HS", "1HB", "1HP" ], #Rogue
10 => [ "CASTER", "SHIELD" ], #Shaman
11 => [ "CASTER", "SHIELD" ], #Necromancer
12 => [ "CASTER", "SHIELD" ], #Wizard
13 => [ "CASTER", "SHIELD" ], #Mage
14 => [ "CASTER", "SHIELD" ], #Enchanter
15 => [ "1HB", "1HP", "H2H" ], #Beastlord
16 => [ "NONE" ] #Berserker
);

%AttackTypes = (
"1HS" => 1,
"2HS" => 3,
"1HB" => 0,
"2HB" => 2,
"1HP" => 36,
"2HP" => 36,
"ARCHERY" => 7,
"THROWING" => 51,
"H2H" => 28,
"CASTER" => 28,
"SHIELD" => 28,
"BARD" => 28
);

my $RandChance = plugin::RandomRange(1, 100);

if($RandChance <= $MyChance || $MyChance == 0) {
if(!$IgnoreClass) {
my $NPCClass = $npc->GetClass();
my $PrimMax = $#{$ClassPrimaryTypes{$NPCClass}};
my $PrimTypeNum = plugin::RandomRange(0, $PrimMax + 1);
my $PrimType = $ClassPrimaryTypes{$NPCClass}[$PrimTypeNum];
my $SecMax = $#{$ClassSecondaryTypes{$NPCClass}};
my $SecTypeNum = plugin::RandomRange(0, $SecMax + 1);
my $SecType = $ClassSecondaryTypes{$NPCClass}[$SecTypeNum];
my @AvailPrims = (); #clear out the array of Available Primary Weapon Models
my @AvailSecs = (); #clear out the array of Available Secondary Weapon Models

foreach $k (keys (%WeaponModels)) {
if($k >= $MinModelNum && $k <= $MaxModelNum) {
if($WeaponModels{$k} eq $PrimType){
push(@AvailPrims, $k);
}
}
if($ClassSecondaryTypes{$NPCClass}[$SecType] eq "SHIELD" && $MinShieldNum && $MaxShieldNum) {
if($k >= $MinShieldNum && $k <= $MaxShieldNum) {
if($WeaponModels{$k} eq $SecType){
push(@AvailSecs, $k);
}
}
}
else {
if($k >= $MinModelNum && $k <= $MaxModelNum) {
if($WeaponModels{$k} eq $SecType){
push(@AvailSecs, $k);
}
}
}
}
my $TotalAvailPrims = @AvailPrims;
my $TotalAvailSecs = @AvailSecs;



if($TotalAvailPrims) {
my $PrimSelect = plugin::RandomRange(0, $TotalAvailPrims);
quest::wearchange(7, $AvailPrims[$PrimSelect]);
my $PrimSkill = $AttackTypes{$PrimType};
$npc->SetPrimSkill($PrimSkill);

my $chance = quest::ChooseRandom(1,2);
if(!$NoDualWield == 1 && $chance == 2 && $PrimType ne "2HS" && $PrimType ne "2HB" && $PrimType ne "2HP" && $PrimType ne "STAFF" && $PrimType ne "BARD" && $NPCClass != 16) {
my $SecSelect = plugin::RandomRange(0, $TotalAvailSecs);
quest::wearchange(8, $AvailSecs[$SecSelect]);
my $SecSkill = $AttackTypes{$SecType};
$npc->SetSecSkill($SecSkill);
}
}
}
else {
if ($MinModelNum && $MaxModelNum) {
my $PrimSelect = plugin::RandomRange($MinModelNum, $MaxModelNum);
quest::wearchange(7, $PrimSelect);
if(!$NoDualWield) {
my $chance2 = quest::ChooseRandom(1,2,3);
if ($chance2 == 1) { # if True, then choose a secondary weapon to use
my $SecSelect = plugin::RandomRange($MinModelNum, $MaxModelNum);
quest::wearchange(8, $SecSelect);
}
elsif ($chance2 == 2 && $MinShieldNum && $MaxShieldNum) { # if True, then choose a shield to use
my $SecSelect = plugin::RandomRange($MinShieldNum, $MaxShieldNum);
quest::wearchange(8, $SecSelect);
}
}
}
}
}

}

#Usage: plugin::SetWeapons(PrimaryModel, SecondaryModel, EnableRemoving? );
#Example: plugin::SetWeapons(11, 200);

sub SetWeapons {

my $npc = plugin::val('$npc');
my $PrimaryModel = $_[0];
my $SecondaryModel = $_[1];
my $EnableRemoving = $_[2];

%WeaponModels = (
#BEGIN Classic Weapon Models
1 => "1HS",
2 => "2HS",
3 => "1HS",
4 => "BOW",
5 => "1HP",
6 => "CASTER",
7 => "1HB",
8 => "2HB",
9 => "1HS",
10 => "OTHER", #Arrow
11 => "1HS", #SOE Fanfair Reward
12 => "STAFF", #SOE Fanfair Reward
13 => "STAFF", #SOE Fanfair Reward
14 => "1HB",
15 => "BARD",
16 => "1HP",
17 => "1HP",
18 => "1HB",
19 => "1HB",
20 => "1HP",
21 => "BARD",
22 => "1HS",
23 => "2HS",
24 => "2HB",
25 => "2HS",
26 => "1HS",
27 => "CASTER",
28 => "CASTER",
29 => "STAFF",
30 => "2HP",
31 => "1HB",
32 => "OTHER", #Broom
33 => "1HB",
34 => "1HS",
35 => "1HB",
36 => "OTHER", #Torch
37 => "1HB",
38 => "OTHER", #Fishing Pole
39 => "2HS",
40 => "1HS",
41 => "1HS",
42 => "1HS",
43 => "1HB",
44 => "1HS",
45 => "STAFF",
46 => "CASTER",
47 => "CASTER",
48 => "OTHER", #Lantern
49 => "1HB",
50 => "1HP",
51 => "1HB",
52 => "OTHER", #Shovel
53 => "2HS",
54 => "OTHER", #Cigar
55 => "OTHER", #Pipe
56 => "OTHER", #Mug
57 => "1HS",
58 => "1HS",
59 => "1HB",
60 => "1HS",
61 => "1HS",
62 => "1HS", #SoulFire
63 => "OTHER", #Small Bag
64 => "OTHER", #Large Bag
65 => "OTHER", #Scroll
66 => "TRADESKILL", #Forge
67 => "CASTER", #Voodoo Doll
68 => "H2H",
69 => "TRADESKILL", #Oven
70 => "TRADESKILL", #Brew Barrel
71 => "H2H",
72 => "CASTER",
73 => "TRADESKILL", #Kiln
74 => "TRADESKILL", #Pottery Wheel
75 => "STAFF",
76 => "2HS", #Luclin Weapn Model
78 => "OTHER", #Fire
79 => "2HP",
80 => "2HS",
81 => "1HS",
82 => "1HS",
83 => "2HS",
84 => "2HS",
85 => "1HS",
86 => "2HS",
87 => "1HS",
#END Classic Weapon Models
#BEGIN Kunark Weapon Models
88 => "2HS",
89 => "1HS",
90 => "1HS",
91 => "H2H",
92 => "2HP",
93 => "2HS",
94 => "H2H",
95 => "2HS",
96 => "CASTER", #Added for special quest later
97 => "1HS", #GM Sword
98 => "H2H",
99 => "1HS",
100 => "1HS",
101 => "2HB",
102 => "1HB",
103 => "2HP",
104 => "1HS",
105 => "1HS",
106 => "2HS",
107 => "1HS",
108 => "1HS",
109 => "1HS",
110 => "2HS",
111 => "2HB",
112 => "1HB",
113 => "1HS",
115 => "1HB",
117 => "2HB",
118 => "1HP",
119 => "1HP",
120 => "1HS",
121 => "1HS",
122 => "STAFF",
123 => "STAFF",
124 => "2HB",
125 => "STAFF",
126 => "STAFF",
127 => "STAFF",
128 => "TRADESKILL", #Loom
129 => "STAFF",
130 => "1HB",
131 => "1HS",
132 => "2HP",
133 => "CASTER",
134 => "CASTER",
135 => "H2H",
136 => "H2H",
137 => "BARD",
138 => "BARD",
139 => "1HP",
#BEGIN Epic 1.0s
140 => "1HP",
141 => "1HS",
142 => "1HS",
145 => "2HS",
146 => "2HS",
148 => "1HS",
149 => "1HS",
150 => "1HS",
151 => "CASTER",
153 => "STAFF",
154 => "2HP",
155 => "CASTER",
156 => "1HB",
157 => "CASTER",
160 => "2HS",
#END Epic 1.0s
#END Kunark Weapon Models
#BEGIN Velious Weapon Models
161 => "1HS",
162 => "1HS",
163 => "1HS",
164 => "1HS",
165 => "1HS",
166 => "2HS",
167 => "1HP",
168 => "1HS",
169 => "2HB",
170 => "1HS",
171 => "1HS",
172 => "2HP",
173 => "2HS",
174 => "1HS",
175 => "1HS",
176 => "2HS",
177 => "1HB",
178 => "2HB",
179 => "1HB",
180 => "1HB",
181 => "1HS",
182 => "1HS",
183 => "1HS",
184 => "1HS",
185 => "1HB",
186 => "STAFF",
187 => "2HP",
188 => "1HS",
189 => "1HB",
190 => "2HS",
191 => "1HS",
192 => "1HS",
193 => "1HB",
194 => "1HP",
195 => "1HP",
196 => "1HS",
197 => "2HP",
198 => "BOW",
199 => "BOW",
200 => "SHIELD",
201 => "SHIELD",
202 => "SHIELD",
203 => "SHIELD",
204 => "SHIELD",
205 => "SHIELD",
206 => "SHIELD",
207 => "SHIELD",
208 => "SHIELD",
209 => "SHIELD",
210 => "SHIELD",
211 => "SHIELD",
212 => "SHIELD",
213 => "SHIELD",
214 => "SHIELD",
215 => "SHIELD",
216 => "SHIELD",
217 => "SHIELD",
218 => "SHIELD",
219 => "SHIELD",
220 => "SHIELD",
221 => "SHIELD",
222 => "SHIELD",
223 => "SHIELD",
224 => "SHIELD",
225 => "SHIELD",
226 => "SHIELD",
227 => "SHIELD",
228 => "SHIELD",
250 => "OTHER", #Lollipop
300 => "2HS",
301 => "1HS",
308 => "STAFF",
#END Velious Weapon Models
#BEGIN Luclin Weapon Models
10000 => "1HS",
10001 => "2HB",
10002 => "1HS",
10003 => "1HB",
10004 => "2HS",
10005 => "1HS",
10006 => "1HP",
10007 => "1HB",
10008 => "1HB",
10009 => "1HP",
10010 => "1HS",
10011 => "2HS",
10012 => "1HB",
10013 => "2HB",
10014 => "1HS",
10015 => "H2H", #EPIC
10016 => "1HP",
10017 => "1HS",
10018 => "1HS",
10019 => "1HS",
10020 => "1HB",
10021 => "1HB",
10022 => "1HS",
10023 => "1HS",
10024 => "1HS",
10025 => "2HS",
10026 => "1HS",
10027 => "1HS",
10028 => "2HP",
10029 => "H2H", #EPIC
10100 => "2HP",
10101 => "2HP",
10103 => "1HP",
10104 => "1HP",
10105 => "1HP",
10106 => "2HP",
10107 => "1HP",
10108 => "2HP",
10109 => "1HP",
10200 => "STAFF",
10201 => "STAFF",
10202 => "STAFF",
10203 => "STAFF",
10300 => "BOW",
10301 => "BARD",
#END Luclin Weapon Models
#BEGIN PoP Weapon Models
#BEGIN PoP Gods Weapons
10400 => "1HB",
10401 => "2HS",
10402 => "2HP",
10403 => "STAFF",
10404 => "1HS",
10405 => "2HS",
10406 => "STAFF",
10407 => "STAFF",
10408 => "2HB",
10409 => "1HB",
10410 => "STAFF",
#END PoP Gods Weapons
10411 => "1HS",
10412 => "BOW",
10413 => "2HS",
10501 => "1HB",
10502 => "CASTER",
10503 => "CASTER",
10504 => "CASTER",
10505 => "STAFF",
10506 => "STAFF",
10507 => "STAFF",
10508 => "2HP",
10509 => "H2H",
10510 => "H2H",
10511 => "H2H",
10512 => "H2H",
10513 => "1HS",
10514 => "1HP",
10515 => "1HS",
10516 => "H2H",
10517 => "1HB",
10518 => "1HB",
10519 => "1HB",
10520 => "STAFF",
10521 => "STAFF",
10522 => "1HB",
10523 => "STAFF",
10524 => "1HB",
10525 => "CASTER",
10526 => "1HP",
10527 => "1HP",
10528 => "1HP",
10545 => "1HS",
10600 => "BARD",
10601 => "BARD",
10602 => "BARD",
10603 => "BARD",
10604 => "1HB",
10605 => "1HB",
10606 => "1HB",
10607 => "1HB",
10608 => "1HB",
10609 => "1HB",
10610 => "1HP",
10611 => "OTHER", #Snowball
10612 => "2HP",
10613 => "2HP",
10614 => "BOW",
10615 => "2HS",
10616 => "1HS",
10617 => "1HS",
10618 => "1HP",
10619 => "1HS",
10620 => "1HS",
10621 => "1HP",
10622 => "2HS",
10623 => "1HS",
10624 => "1HP",
10625 => "2HS",
10626 => "1HS",
10627 => "1HP",
10628 => "2HS",
10629 => "1HS",
10630 => "1HP",
10631 => "2HS",
10632 => "1HS",
10633 => "1HP",
10634 => "2HB",
10635 => "1HB",
10636 => "2HB",
10637 => "1HB",
10638 => "2HB",
10639 => "2HB",
10640 => "2HS",
10641 => "BOW",
10642 => "CASTER",
10643 => "STAFF",
10644 => "2HP",
10645 => "CASTER",
10646 => "CASTER",
10647 => "1HB",
10648 => "1HS",
10649 => "1HS",
10650 => "1HP",
10651 => "2HS",
10652 => "1HS",
10653 => "1HP",
10654 => "2HS",
10655 => "1HS",
10656 => "1HP",
10657 => "2HS",
10658 => "1HS",
10659 => "1HP",
10660 => "2HS",
10661 => "1HS",
10662 => "1HS",
10663 => "CASTER",
#END PoP Weapon Models
#BEGIN LoY Weapon Models
10664 => "SHIELD",
10665 => "SHIELD",
10666 => "SHIELD",
10667 => "SHIELD",
10668 => "SHIELD",
10669 => "SHIELD",
10670 => "SHIELD",
10671 => "SHIELD",
10672 => "1HB",
10673 => "1HS",
10674 => "1HS",
10675 => "2HB",
10676 => "2HS",
10677 => "STAFF",
10678 => "1HS",
10679 => "1HP",
10680 => "1HP",
10681 => "1HB",
10682 => "1HS",
10683 => "STAFF",
10685 => "2HS",
10686 => "1HS",
10687 => "1HP",
10688 => "1HB",
10689 => "1HP",
10690 => "1HP",
10691 => "SHIELD",
10692 => "1HP",
10693 => "1HP",
10694 => "1HS",
10695 => "CASTER",
10696 => "1HS",
10697 => "CASTER",
#END LoY Weapon Models
#BEGIN LDoN Weapon Models
10700 => "1HS",
10701 => "1HP",
10702 => "1HS",
10703 => "1HB",
10704 => "1HS",
10705 => "1HS",
10706 => "1HB",
10707 => "1HB",
10708 => "1HS",
10709 => "1HP",
10710 => "1HS",
10711 => "1HP",
10712 => "1HP",
#END LDoN Weapon Models
#BEGIN GoD Weapon Models
10713 => "1HB",
10714 => "TRADESKILL", #Augment Pool
10715 => "1HS",
10716 => "1HB",
10717 => "BOW",
10718 => "1HB",
10719 => "1HS",
10720 => "2HS",
10722 => "1HP",
10723 => "STAFF",
10724 => "OTHER", #Small Rock
10725 => "OTHER", #Chinese Star
10726 => "1HS",
10727 => "2HS", #Epic 1.5
10728 => "1HS",
10729 => "SHIELD",
10730 => "SHIELD",
10731 => "1HB",
10732 => "1HP",
10733 => "CASTER",
#BEGIN Epic 2.0s
10735 => "1HS",
10736 => "1HB",
10737 => "2HS",
10738 => "SHIELD",
10739 => "STAFF",
10740 => "STAFF",
10741 => "STAFF",
10742 => "H2H",
10743 => "STAFF",
10744 => "2HS",
10745 => "1HS",
10746 => "1HP",
10747 => "2HS",
10748 => "1HB",
10749 => "1HS",
10750 => "STAFF",
#END Epic 2.0s
#BEGIN Epic 1.5s
10751 => "1HS",
10752 => "1HB",
10753 => "2HS",
10754 => "SHIELD",
10755 => "STAFF",
10756 => "STAFF",
10757 => "STAFF",
10758 => "H2H",
10759 => "STAFF",
10760 => "2HS",
10761 => "1HS",
10762 => "1HP",
10763 => "2HS",
10764 => "1HB",
10765 => "1HS",
10766 => "STAFF",
#END Epic 1.5s
#BEGIN OOW+ Weapon Models
10767 => "CASTER",
10768 => "1HB",
10769 => "1HP",
10770 => "1HS",
10771 => "1HS",
10772 => "SHIELD",
10773 => "2HS",
10774 => "STAFF",
10775 => "SHIELD",
10776 => "2HS",
10777 => "1HB",
10778 => "1HS",
10779 => "1HS",
10780 => "1HS",
10781 => "SHIELD",
10782 => "2HP",
10783 => "H2H",
10784 => "1HS",
10785 => "1HS",
10786 => "2HS",
10787 => "1HS",
10788 => "CASTER",
10789 => "BOW",
10790 => "SHIELD",
10791 => "1HS",
10792 => "2HS",
10793 => "1HP",
10794 => "STAFF",
10795 => "1HB",
10796 => "2HB",
10797 => "2HS",
10798 => "1HP",
10799 => "1HP",
10806 => "CASTER",
10807 => "CASTER",
10808 => "CASTER",
10810 => "2HS",
10811 => "1HS",
10812 => "2HS",
10813 => "1HP",
10814 => "1HP",
10815 => "1HP",
10816 => "1HP",
10817 => "1HB",
10818 => "2HB",
10819 => "CASTER",
10820 => "STAFF",
10821 => "1HS",
10822 => "CASTER",
10823 => "STAFF",
10824 => "1HP",
10825 => "1HS",
10826 => "SHIELD",
10827 => "SHIELD",
10828 => "STAFF",
10829 => "1HB",
10830 => "2HB",
10831 => "1HP",
10832 => "SHIELD",
10833 => "SHIELD",
10834 => "1HS",
10835 => "2HS",
10836 => "CASTER",
10837 => "CASTER",
10838 => "1HB",
10839 => "2HB",
10840 => "1HS",
10841 => "2HS",
10842 => "H2H",
#END TITANIUM Weapon Models
#BEGIN SoF Weapon Models
10843 => "OTHER", #Broom
10844 => "1HP",
10845 => "2HB",
10846 => "1HB",
10847 => "2HB",
10848 => "1HS",
10849 => "SHIELD",
10850 => "SHIELD",
10851 => "OTHER", #Shovel
10852 => "STAFF",
10853 => "STAFF",
10854 => "CASTER",
10855 => "1HS",
10856 => "2HS",
10857 => "SHIELD",
10858 => "SHIELD",
10859 => "1HB",
10860 => "1HS",
10861 => "OTHER", #Beer Mug
10862 => "STAFF",
10866 => "1HP",
10867 => "1HS",
10868 => "1HP",
10869 => "2HS",
10870 => "1HP",
10871 => "2HS",
10872 => "1HS",
10873 => "2HS",
10874 => "1HS",
10875 => "2HS",
10876 => "1HS",
10877 => "2HS",
10878 => "1HS",
10879 => "2HS",
10880 => "1HS",
10881 => "2HS",
10882 => "1HP",
10883 => "1HS",
10884 => "2HS",
10885 => "1HS",
10886 => "2HS",
10887 => "1HS",
10888 => "2HS",
10889 => "1HS",
10890 => "2HS",
10891 => "1HS",
10892 => "2HS",
10893 => "1HS",
10894 => "2HS",
10895 => "1HS",
10896 => "2HS",
10897 => "1HS",
10898 => "2HS",
10899 => "1HS",
10900 => "2HS",
10901 => "1HS",
10902 => "2HS",
10903 => "1HP",
10904 => "1HS",
10905 => "2HS",
10906 => "1HS",
10907 => "2HS",
10908 => "1HS",
10909 => "2HS",
10910 => "1HP",
10911 => "1HP",
10912 => "1HP",
10913 => "1HP",
10914 => "1HP",
10915 => "1HP",
10916 => "1HP",
10917 => "1HP",
10918 => "1HP",
10919 => "1HP",
10920 => "1HS",
10921 => "2HS",
10922 => "1HS",
10923 => "2HS",
10924 => "1HB",
10925 => "2HB",
10926 => "1HB",
10927 => "2HB",
10928 => "1HB",
10929 => "2HB",
10930 => "1HB",
10931 => "2HB",
10932 => "1HB",
10933 => "2HB",
10934 => "1HB",
10935 => "2HB",
10936 => "1HB",
10937 => "2HB",
10938 => "STAFF",
10939 => "CASTER",
10940 => "STAFF",
10941 => "STAFF",
10942 => "STAFF",
10943 => "1HB",
10944 => "STAFF",
10945 => "1HB",
10946 => "1HB",
10947 => "2HB",
10948 => "1HB",
10949 => "2HB",
10950 => "2HP",
10951 => "2HP",
10952 => "2HP",
10953 => "2HP",
10954 => "2HP",
10955 => "2HP",
10956 => "2HP",
10957 => "2HP",
10958 => "1HP",
10959 => "STAFF",
10960 => "SHIELD",
10961 => "SHIELD",
10962 => "SHIELD",
10963 => "SHIELD",
10964 => "SHIELD",
10965 => "SHIELD",
10966 => "SHIELD",
10967 => "SHIELD",
10968 => "SHIELD",
10969 => "SHIELD",
10970 => "SHIELD",
10971 => "SHIELD",
10972 => "SHIELD",
10973 => "SHIELD",
10974 => "SHIELD",
10975 => "SHIELD",
10976 => "SHIELD",
10977 => "SHIELD",
10978 => "SHIELD",
10979 => "SHIELD",
10980 => "SHIELD",
10981 => "SHIELD",
10982 => "SHIELD",
10983 => "SHIELD",
10984 => "SHIELD",
10985 => "SHIELD",
10986 => "SHIELD",
10987 => "SHIELD",
10988 => "SHIELD",
10989 => "SHIELD",
10990 => "SHIELD",
10991 => "SHIELD",
10992 => "SHIELD",
10993 => "SHIELD",
10994 => "SHIELD",
10995 => "SHIELD",
10996 => "SHIELD",
10997 => "BOW",
10998 => "BOW",
10999 => "1HB",
11001 => "SHIELD",
11002 => "SHIELD",
11003 => "SHIELD",
11013 => "SHIELD",
11017 => "SHIELD",
11018 => "SHIELD",
11019 => "SHIELD",
11020 => "SHIELD",
11031 => "OTHER", #Torch
11032 => "STAFF",
11033 => "OTHER", #Hoe
11034 => "OTHER", #Rake
11035 => "OTHER", #Pitch Fork
11036 => "OTHER", #Bucket full of Dirt
11037 => "OTHER", #Bucket full of Apples
11038 => "OTHER", #Bucket full of Rocks
11039 => "OTHER", #Bucket full of Gems
11040 => "OTHER", #Bucket full of Ash?
11041 => "1HP",
11042 => "1HS",
11043 => "2HS",
11044 => "1HB",
11045 => "2HB",
11046 => "1HS",
11047 => "2HS",
11048 => "SHIELD",
11049 => "SHIELD",
11050 => "H2H",
11051 => "H2H",
11052 => "1HB",
11053 => "1HS",
11054 => "OTHER", #Box
11055 => "OTHER", #Rock
11056 => "OTHER", #Bush
11057 => "OTHER", #Rock
11058 => "OTHER", #3 Bones
11059 => "OTHER", #3 Large Books
11060 => "OTHER", #Green Leaf
11061 => "OTHER", #Mushroom
11062 => "OTHER", #Box
11063 => "OTHER", #Box
11064 => "OTHER", #Rock
11065 => "OTHER", #Rock
11066 => "OTHER", #Bush
11067 => "OTHER", #Bush
11068 => "OTHER", #Rock
11069 => "OTHER", #Red Apple
11070 => "OTHER", #Green Apple
11071 => "OTHER", #Pumpkin
11072 => "OTHER", #3 Bones
11073 => "OTHER", #3 Large Books
11074 => "OTHER", #White Branch
11075 => "OTHER", #Palm Tree Leaf
11076 => "OTHER", #Bamboo
11077 => "OTHER", #Brown Branch
11078 => "OTHER", #Dead Branch
11079 => "OTHER", #Brown Leaf
11080 => "OTHER", #Red Maple Leaf
11081 => "OTHER", #Yellow Mushroom
11082 => "OTHER", #Green Mushroom
11083 => "OTHER", #Brown Mushroom
11084 => "OTHER", #Green Branch
11085 => "SHIELD",
11086 => "SHIELD",
11087 => "CASTER",
11088 => "1HS",
11089 => "1HS",
11090 => "1HS",
11091 => "1HP",
11092 => "2HP",
11093 => "1HP",
11094 => "1HS",
11095 => "1HP",
11096 => "OTHER", #Rolling Pin
11097 => "STAFF",
11098 => "CASTER",
11099 => "H2H",
11100 => "2HS",
11101 => "1HP",
11102 => "SHIELD",
11103 => "SHIELD",
11104 => "STAFF",
11105 => "1HS",
11106 => "1HB",
11107 => "2HB",
11108 => "1HS",
11109 => "2HS",
11110 => "SHIELD",
11111 => "SHIELD",
11112 => "1HP",
11113 => "1HS",
11114 => "1HP",
11115 => "1HS",
11116 => "1HS",
11117 => "STAFF",
11118 => "OTHER", #Fish
11119 => "2HP",
11120 => "H2H",
11121 => "OTHER", #Gold Coin
11122 => "OTHER", #Silver Coin
11123 => "OTHER", #Crystal
11124 => "OTHER", #Crystal
11129 => "1HS",
11130 => "2HB",
11131 => "1HP",
11132 => "2HS",
11133 => "2HB",
11139 => "H2H",
11140 => "SHIELD",
11144 => "SHIELD",
11154 => "OTHER", #Large Crystal
11155 => "OTHER", #Large Crystal
11156 => "OTHER", #Large Crystal
11157 => "OTHER", #Large Crystal
11158 => "OTHER", #Large Crystal
11159 => "OTHER", #Large Crystal
11160 => "OTHER", #Large Crystal
11161 => "OTHER", #Large Crystal
11162 => "OTHER", #Small Crystal
11163 => "OTHER", #Small Crystal
11164 => "OTHER", #Small Crystal
11165 => "OTHER", #Small Crystal
11166 => "OTHER", #Small Crystal
11167 => "OTHER", #Small Crystal
11168 => "OTHER", #Small Crystal
11169 => "OTHER" #Small Crystal
#END SoF Weapon Models
);

%AttackTypes = (
"1HS" => 1,
"2HS" => 3,
"1HB" => 0,
"2HB" => 2,
"1HP" => 36,
"2HP" => 36,
"STAFF" => 2,
"ARCHERY" => 7,
"BOW" => 7,
"THROWING" => 51,
"H2H" => 28,
"CASTER" => 28,
"SHIELD" => 28,
"BARD" => 28,
"OTHER" => 28
);

if($EnableRemoving) {
quest::wearchange(7, $PrimaryModel);
quest::wearchange(8, $SecondaryModel);

if ($PrimaryModel) {
my $PrimSkill = $AttackTypes{$WeaponModels{$PrimaryModel}};
$npc->SetPrimSkill($PrimSkill);
}
else {
$npc->SetPrimSkill(28);
}

if($SecondaryModel) {
my $SecSkill = $AttackTypes{$WeaponModels{$SecondaryModel}};
$npc->SetSecSkill($SecSkill);
}
else {
$npc->SetSecSkill(28);
}
}
else {
if ($PrimaryModel) {
quest::wearchange(7, $PrimaryModel);
my $PrimSkill = $AttackTypes{$WeaponModels{$PrimaryModel}};
$npc->SetPrimSkill($PrimSkill);
}
if ($SecondaryModel) {
quest::wearchange(8, $SecondaryModel);
my $SecSkill = $AttackTypes{$WeaponModels{$SecondaryModel}};
$npc->SetSecSkill($SecSkill);
}
}

}

return 1; #Added because all other plugins have this, but it may not actually be required.

3. Save that file to your server /plugins/ folder and name it "weapon_tools.pl".

4. Do a #questreload and the new plugin should be ready for use

Here is an example script:
sub EVENT_SPAWN {

quest::settimer("WeaponChange", 5);

}

sub EVENT_TIMER {

if($timer eq "WeaponChange") {
quest::stoptimer("WeaponChange");
#Any random weapon and shield available through SoF
plugin::RandomWeapons(1, 11169, 50, 200, 230);
}

}

Note that in the example, I didn't set NoDualWield? and IgnoreClass?, because I wanted to show that they are just optional.

The hash of weapon types for every weapon model is something I have been wanting to do for a while. I finally wrote a simple script using saylinks that did most of the work for me while I just looked and clicked the type of weapon I saw. I am sure there are other good uses to having this weapon model type hash. I may adjust this script again, but for now I figured it was good enough to at least post.

ChaosSlayerZ
02-21-2010, 01:22 PM
question: so basically this is just displaying random model on npc.
But I presume that model to skill animation still not implemented, so npc will still PUNCHING?

Taurinus
02-21-2010, 05:36 PM
Thanks for posting this, works quite well.

Just a heads up though: Your example script passes parameters in the wrong sequence to RandomWeapons(). Using the usage notes I was able to correct the order and confirm that it works as intended.

trevius
02-21-2010, 07:17 PM
Thanks Taurinus, I got it corrected.

And Chaos, that is correct. At some point, I hope we do have the option to change the hit messages for both primary and secondary hands. If we ever get that functioning, we can add that feature to this plugin and really finish it off :)

Akkadius
02-22-2010, 01:49 AM
Once again, very nice Trevius, I can do a ton with this. Infact, I use random range for this kind of stuff already. I knew you were working on this but I didn't know exactly how you intended to implement the organization, but very good.

trevius
02-22-2010, 10:17 AM
Ok, now the plugin is pretty-much completed. Not only does it set their weapon model randomly, but it also sets their attack animation and attack messages to match the type of model it is! I edited the code in the original post with the updates. Note that in order to use the latest feature of being able to have matching animations/messages, you must be running Rev1259 or later.

If anyone finds incorrect labels for weapons in the hash, please reply here and I will update the hash with the correction(s). I just found a 2HB that was set to 1HP, so I am sure there are some that are still wrong. But, at least 95+% of the list should be very accurate to match the model with it's type.

ChaosSlayerZ
02-22-2010, 11:58 AM
ah cool!
but what about just using this for specific models only?
Like I do not actually want to make mob use randomized weapons, but I want say all orcs to use specific weapon models which i will set in Animation field in npctypes table?

same applies to enchanter pets

Akkadius
02-22-2010, 02:31 PM
The thing about the new fields you opened up for the attack types... When I started compiling I had ran into this

1>Compiling...
1>attack.cpp
1>.\attack.cpp(1659) : error C2440: '=' : cannot convert from 'int8' to 'SkillType'
1> Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
1>.\attack.cpp(1662) : error C2440: '=' : cannot convert from 'int8' to 'SkillType'
1> Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)

Taurinus
02-22-2010, 04:27 PM
Great work, Trevius.

I had actually started implementing the exact same thing, but was going about it a different way. I was going to export a new perl function that allowed setting the damage type on a per-mob basis.

About the compiler error, just feed it what it wants so it stops moaning:

SkillType skillinuse = HAND_TO_HAND;
if (Hand == 13) {
skillinuse = static_cast<SkillType> ( GetPrimSkill() );
}
if (Hand == 14) {
skillinuse = static_cast<SkillType>( GetSecSkill() );
}

Akkadius
02-22-2010, 04:28 PM
Yeah I was just about to post the same thing.

Akkadius
02-22-2010, 05:09 PM
Another thing I've found with this is that the NPC in this case (Script-made pet/mercenary) does not alternate piercing animations, not a huge downfall but just throwing that out there for Trevius's strive for perfection 8 D

trevius
02-22-2010, 07:40 PM
ChaosSlayer,

If you want to set certain NPCs to use certain weapon models and certain attack messages and animations, you can now just set them in the 2 new fields I added to the npc_types table. By default, the new fields are set to 28, which is hand to hand (punching), but you can change those to other skill IDs to use as long as you have a weapon model set for the npc already.

If you want to set the attack message/animations via quests after the NPC is already spawned, you can do it using the new quest objects I added in. I am probably going to make a plugin just for setting a specific weapon model that will automatically set the animation and message to match it.

Taurinus/Akkadius,

Thanks for the heads-up on the compile error. It worked fine for me in Linux, and I didn't bother trying it in Windows. At least it shouldn't be too hard to correct it.

For the piercing animations, I assume you mean there is no difference between the 1 handed and the 2 handed versions of piercing? That is because there is no actual 2 handed piercing skill, they both use the same skill. So, unless I make up a non-existent skill for 2 handed piercing, I can't easily make 2 handed piercing animations show properly. Or, is there some other alternate 1 handed piercing animations you are referring to? As far as the animations go, it should be working the same as using an item with that same skill type, other than for the 2 handed pierce ones.

Either way, at least the majority of the work is done to get this new feature working. Any adjustments can be added later if needed. I may check with KLS and see what she thinks about adding in a skill type of 100 (skill types only go to 76 currently on Live I believe) or something to use for 2 handed piercing.

For reference, here are the new quest objects I added last night:

$npc->GetPrimSkill() - Gets the NPCs primary weapon skill type as it is currently set
$npc->GetSecSkill() - Gets the NPCs secondary weapon skill type as it is currently set
$npc->SetPrimSkill(skill_type) - Sets the NPCs Primary slot skill to use for Animations and Hit Messages
$npc->SetSecSkill(skill_type) - Sets the NPCs Secondary slot skill to use for Animations and Hit Messages

When you get or set them, just know that it always uses the numeric value for the skill ID (not the skill name). Note that the changes these commands make are only temporary and do not update what is set in the database for the NPC.

Here is a list of the numeric values for the skills you can set with these commands:

0 1H Blunt
1 1H Slashing
2 2H Blunt
3 2H Slashing
7 Archery
28 Hand To Hand
36 Piercing
51 Throwing

ChaosSlayerZ
02-22-2010, 09:32 PM
AWESOME! I have been waiting for something like this for years =)
Thank you much Trev! =)

trevius
02-22-2010, 09:47 PM
Haha yeah, we have discussed it a few times in threads and I finally figured it was time to look into seeing how hard it would be to code it. It was actually much easier than I thought, lol. If I had known that, I would have done it long ago :P

The only other related idea to this that was discussed was the ability to make custom hit messages as well. For example, a snake might "bite" you instead of hit, slash, crush, etc. Unfortunately, doing that would take more work, as it would mean overriding the normal damage packets and instead sending an actual message to the client(s). Maybe some day, but I am pretty happy with what we have so far.

trevius
02-22-2010, 10:39 PM
Ok, I added another plugin to the original post in this thread (edited in the code). The new plugin works similar to the quest::wearchange() command, accept this plugin will set the wearchange weapon model(s) and also set the appropriate attack animation and message type as well.

Here is the usage for the new plugin:
#Usage: plugin::SetWeapons(PrimaryModel, SecondaryModel, EnableRemoving? );
#Example: plugin::SetWeapons(11, 200);

The EnableRemoving? argument is a bool for if you want 0s in primary or secondary to remove the weapon model from that slot. Otherwise, 0s will just prevent any changes for that slot. So, here are a few examples with explainations:

plugin::SetWeapons(11); # Will set the primary weapon model to 11 but not change what the second weapon model is currently.

plugin::SetWeapons(11, 200); # Will set the primary to 11 and secondary to 200.

plugin::SetWeapons(0, 200); # Will set the secondary to model 200 without changing whatever model might be set in the primary.

plugin::SetWeapons(0, 200, 1); # Will remove the weapon model from the primary and set the secondary to model 200

plugin::SetWeapons(11, 0, 1); # Will set the primary model to 11 and remove any secondary model.

Note that I have not yet tested the new SetWeapons plugin yet, but I am pretty sure it will work as described. I will test it when I get home and edit this post if it has any issues.

nenelan
02-22-2010, 11:48 PM
16 => [ "2HS", "2HB" ] #Berserker

I gave them "2HP" in there as well. Biased as that is what I used for years on mine on live. =P

trevius
02-23-2010, 12:15 AM
Thanks, I added 2HP into the primary types for Berserkers. I haven't really played one, so I wasn't sure if they could use it or not, lol.

Also, I haven't played a bard much, so I was curious if you guys know how bards normally wield their instruments. Do they normally have them in primary or in secondary slot, or either? Currently, I have it setting them in the primary slot and then leaving the secondary slot empty. Does anyone know which hand normally does the different music playing animations? I am thinking it might be the secondary hand that instruments look properly in for the animations. These plugins won't actually effect the music playing animations anyway, but I am just trying to see if I should put the bard instruments in their offhand, instead of setting them in primary and making them punch with them, lol. Seems like it would make more sense to either put a weapon in primary and the instrument in secondary, or to have nothing in primary and the instrument in secondary. I should be able to script it to handle that fairly easily, but looking for some feedback from someone with more bard experience than I :P

I could also add shields as offhand options for Rogues, and maybe Rangers, but I figured 99% of the time, people wouldn't want them to use shields anyway.

ChaosSlayerZ
02-23-2010, 01:28 AM
in the old days of EQ bards always must had instrument equipped in Primary hand, and drums were 2-handed.

Years later SOE changed it so all instrument can be 1 handed in off hand, with appearance of weapon-instruments specially during PoP era.
In other words, today bard can hold anything anywhere.

nenelan
02-23-2010, 07:09 AM
Oh god I hated early era bards. Your DPS was crap with just that weapon in the offhand! :( I remember using sub-par instrument modifiers just because there were a very, very rare few that fit in offhand.

Rangers, rogues, and even monks and bards can use some shields in current state of affairs on EQ, however, it makes no practical sense for them to. The only time I've ever known my ranger friend to use a shield is if A) the tank is being useless or B) he is updating his eqplayers ranking (AC battles).

While it would be nice to have it as variety, would it be possible to weight it so that a shield popped in those classes' offhand ~ 15% of the time or something suitably small? I just have a hard time picturing any self respecting rogue use a shield. Would be a mockery at the safe house! :-P

Checking the weapon list. Can add 2hb for beastlords, as they were added to most of the monk ones.
Shamans can have 2hp removed, there is VERY few that are shaman usable, I can think of only one off the top of my head.
Rangers can use 2hp as well. Most of the current 2hps are War/SK/Ber/Pal/Rng. Not sure how viable/often they use two handers, but they can.
Druids: Traditionally the only slashers they used were scimitars (and that one war claw), however, there is no way of limiting that through the plugin. Afterall, how is the script to know if the blade is curved?

trevius
02-23-2010, 07:56 AM
Thanks. I got 2HB and Staff added for Beastlord, and removed 1HS, since they don't have the skill. I also removed 2HP from Shaman, as that was one I was only guessing at. I added 2HP to Rangers too.

I don't think I will put shields on Rogues or Ranger. Even though they can use it, it would be extremely rare and conditional. If someone thinks their Rogues need shields, they can use the SetWeapons plugin or set it in the database themselves manually :P Same goes for any other odd cases. The purpose of the random weapon selector is to have the best result for the most cases possible.

I left 1HS on druids, since they actually do get the 1HS skill. The main thing that made me even add it in the first place is that the Druid 1.0 is a 1HS lol. It would be possible to expand the weapon hash even further and make it into a hash of arrays. I may even do that at some point lol. Then, we could set extra fields like if the item has a particle effect, or if it is an epic weapon model, or era it is from, or just about anything to describe them. That would be pretty awesome, since you would then be able to set exactly what type of weapons you wanted them to have based on whatever conditions are set in the arrays. Since there are 800+ entries in the hash, it would probably take quite a while to go through and add extra fields for each one of them, though. I made comments in the hash to split up the models for certain expansions at least as well as I could from memory. It wouldn't be too hard to add 1 or 2 fields to the hash just based on the comments I made for each weapon range. For example, the Paladin 1.5 could have the follow items added to it's array: [ "2HS", "EPIC", "1.5", "Paladin", "PoP" ]. Then, we could do searches for those fields that would let us choose more specific details for picking item models.

ChaosSlayerZ
02-23-2010, 12:23 PM
you taking this list way too seriously =)
We are equipping npcs, not players.
i don't think anyone using this script will go "OMG WTF! That Orc Shaman is using a model from 2 handed spear and it was SK only!!!"

In the old days all of the available 2hp were shaman usable, but later 2hp added were rarely so, simply cause it was pointless for a caster/priest to use a 2h weapon since it was always more beneficial to use 1h + shield for more stats and of course added AC.
Other funny thing is that Barbarian Shaman can use old era Axes =) yes the do not have the skill but they can use them =) It was a lore thing =)

Rangers/Rogues/Bards would probably only use shields till 17, when they get dual wield.
BUT - you guys still remember that npcs on Emu DO NOT get dual wield until 45? (still waiting for that one to be fixed =P)