uesp-eso-build-wrapper 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/THIRD_PARTY_NOTICES +39 -0
- package/dist/lib/eso-engine/calculator.d.ts +39 -0
- package/dist/lib/eso-engine/calculator.d.ts.map +1 -0
- package/dist/lib/eso-engine/calculator.js +189 -0
- package/dist/lib/eso-engine/calculator.js.map +1 -0
- package/dist/lib/eso-engine/env-setup.d.ts +25 -0
- package/dist/lib/eso-engine/env-setup.d.ts.map +1 -0
- package/dist/lib/eso-engine/env-setup.js +238 -0
- package/dist/lib/eso-engine/env-setup.js.map +1 -0
- package/dist/lib/eso-engine/index.d.ts +58 -0
- package/dist/lib/eso-engine/index.d.ts.map +1 -0
- package/dist/lib/eso-engine/index.js +119 -0
- package/dist/lib/eso-engine/index.js.map +1 -0
- package/dist/lib/eso-engine/loader.d.ts +25 -0
- package/dist/lib/eso-engine/loader.d.ts.map +1 -0
- package/dist/lib/eso-engine/loader.js +189 -0
- package/dist/lib/eso-engine/loader.js.map +1 -0
- package/dist/lib/eso-engine/types.d.ts +136 -0
- package/dist/lib/eso-engine/types.d.ts.map +1 -0
- package/dist/lib/eso-engine/types.js +21 -0
- package/dist/lib/eso-engine/types.js.map +1 -0
- package/package.json +55 -0
- package/vendor/uesp-data/uesp-init-data.json +8294 -0
- package/vendor/uesp-esochardata/LICENSE +21 -0
- package/vendor/uesp-esochardata/resources/esoEditBuild.js +15221 -0
- package/vendor/uesp-esochardata/resources/esobuilddata.js +3575 -0
|
@@ -0,0 +1,3575 @@
|
|
|
1
|
+
window.ecdLastTooltip = null;
|
|
2
|
+
|
|
3
|
+
window.lastEsoBookSearchText = "";
|
|
4
|
+
window.lastEsoBookSearchPos = -1;
|
|
5
|
+
window.lastEsoBookSearchElement = null;
|
|
6
|
+
|
|
7
|
+
window.g_EsoBuildLastInputValues = {};
|
|
8
|
+
window.g_EsoCurrentTooltipSlot = "";
|
|
9
|
+
|
|
10
|
+
// Default stats needed for tooltip updates
|
|
11
|
+
g_EsoBuildLastInputValues.HealingDone = 0;
|
|
12
|
+
g_EsoBuildLastInputValues.SpellResist = 0;
|
|
13
|
+
g_EsoBuildLastInputValues.PhysicalResist = 0;
|
|
14
|
+
g_EsoBuildLastInputValues.Health = 0;
|
|
15
|
+
g_EsoBuildLastInputValues.DamageShield = 0;
|
|
16
|
+
g_EsoBuildLastInputValues.DamageDone = 0;
|
|
17
|
+
g_EsoBuildLastInputValues.MagicDamageDone = 0;
|
|
18
|
+
g_EsoBuildLastInputValues.PhysicalDamageDone = 0;
|
|
19
|
+
g_EsoBuildLastInputValues.ShockDamageDone = 0;
|
|
20
|
+
g_EsoBuildLastInputValues.FlameDamageDone = 0;
|
|
21
|
+
g_EsoBuildLastInputValues.FrostDamageDone = 0;
|
|
22
|
+
g_EsoBuildLastInputValues.PoisonDamageDone = 0;
|
|
23
|
+
g_EsoBuildLastInputValues.DiseaseDamageDone = 0;
|
|
24
|
+
g_EsoBuildLastInputValues.SingleTargetDamageDone = 0;
|
|
25
|
+
g_EsoBuildLastInputValues.DotDamageDone = 0;
|
|
26
|
+
g_EsoBuildLastInputValues.AOEDamageDone = 0;
|
|
27
|
+
g_EsoBuildLastInputValues.DirectDamageDone = 0;
|
|
28
|
+
g_EsoBuildLastInputValues.BleedDamage = 0;
|
|
29
|
+
g_EsoBuildLastInputValues.PetDamageDone = 0;
|
|
30
|
+
g_EsoBuildLastInputValues.CoralRiptide = 0;
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
// TODO: This is unused with the new tooltip system?
|
|
34
|
+
window.ESO_SETPROCDAMAGE_DATA =
|
|
35
|
+
{
|
|
36
|
+
"adept rider" : {
|
|
37
|
+
//(5 items) While mounted you gain Major Evasion, reducing damage from area attacks by 25%.
|
|
38
|
+
//Dismounting spawns a dust cloud at your position for 12 seconds that deals 16-1436 Physical
|
|
39
|
+
//Damage every 1 second to enemies who stand inside it. You and group members inside the dust
|
|
40
|
+
//cloud gain Major Evasion. Dust cloud can be created once every 12 seconds.
|
|
41
|
+
isAoE : true,
|
|
42
|
+
isDoT : true,
|
|
43
|
+
index : 4,
|
|
44
|
+
items : 5,
|
|
45
|
+
},
|
|
46
|
+
"aegis caller": {
|
|
47
|
+
//(5 items) When you deal critical melee damage, summon a Lesser Aegis for 11 seconds. After 2.5 seconds,
|
|
48
|
+
//the Lesser Aegis spins its blades, dealing 86-3730 Bleed Damage every 1 second. This effect can occur once every 12 seconds.
|
|
49
|
+
isAoE: true,
|
|
50
|
+
isDoT: true,
|
|
51
|
+
isBleed: true,
|
|
52
|
+
index: 4,
|
|
53
|
+
items: 5,
|
|
54
|
+
},
|
|
55
|
+
"affliction" : {
|
|
56
|
+
// (5 items) When you deal damage, you have a 50% chance to deal 42-1830 Disease damage to the target.
|
|
57
|
+
// This damage immediately applies the Diseased status effect, applying Minor Defile to the target,
|
|
58
|
+
// reducing their Healing Received and Health Recovery by 15% for 4 seconds.
|
|
59
|
+
isAoE : false,
|
|
60
|
+
isDoT : false,
|
|
61
|
+
index : 4,
|
|
62
|
+
items : 5,
|
|
63
|
+
},
|
|
64
|
+
"arms of relequen" : {
|
|
65
|
+
// (5 items) Your Light and Heavy attacks apply a stack of harmful winds to your target for 5 seconds.
|
|
66
|
+
// Harmful winds deal 4-200 Physical Damage per stack every 1 second. 20 stacks max.
|
|
67
|
+
isAoE : false,
|
|
68
|
+
isDoT : true,
|
|
69
|
+
index : 4,
|
|
70
|
+
items : 5,
|
|
71
|
+
},
|
|
72
|
+
"ashen grip" : {
|
|
73
|
+
// (5 items) When you deal melee damage, you breathe fire to all enemies in front of you for 124-5350 Flame damage.
|
|
74
|
+
// This effect can occur once every 4 seconds.
|
|
75
|
+
isAoE : true,
|
|
76
|
+
isDoT : false,
|
|
77
|
+
index : 4,
|
|
78
|
+
items : 5,
|
|
79
|
+
},
|
|
80
|
+
"auroran's thunder" : {
|
|
81
|
+
// (5 items) Dealing direct damage with a single target attack summons a cone of lightning from your chest for 3 seconds,
|
|
82
|
+
// dealing 26-1147 Shock Damage every 0.5 seconds to enemies in the cone. This effect can occur every 6 seconds.
|
|
83
|
+
isAoE : true,
|
|
84
|
+
isDoT : true,
|
|
85
|
+
index : 4,
|
|
86
|
+
items : 5,
|
|
87
|
+
},
|
|
88
|
+
"azureblight reaper" : {
|
|
89
|
+
// (5 items) When you deal damage with a damage over time effect, you apply a stack of Blight Seed to your target for 5 seconds.
|
|
90
|
+
// At 20 stacks, the Blight Seeds explode, dealing 258-11100 Disease Damage to the target and nearby enemies.
|
|
91
|
+
isAoE : true,
|
|
92
|
+
isDoT : false,
|
|
93
|
+
index : 4,
|
|
94
|
+
items : 5,
|
|
95
|
+
},
|
|
96
|
+
"bahraha's curse" : {
|
|
97
|
+
// (5 items) When you deal damage, you have a 25% chance to create desecrated ground for 5 seconds, which reduces the Movement Speed of
|
|
98
|
+
// enemies within by 70%, damages them for 20-860 Magic damage every 1 second, and heals you for 100% of the damage done.
|
|
99
|
+
isAoE : true,
|
|
100
|
+
isDoT : true,
|
|
101
|
+
index : 5,
|
|
102
|
+
items : 5,
|
|
103
|
+
},
|
|
104
|
+
"caluurion's legacy" : {
|
|
105
|
+
// (5 items) When you deal direct Critical Damage with a single target Magicka ability, you launch a Fire, Ice, Shock, or Disease ball at
|
|
106
|
+
// your target that deals 300-12900 damage and applies a status effect. This effect can occur once every 10 seconds.
|
|
107
|
+
isAoE : false,
|
|
108
|
+
isDoT : false,
|
|
109
|
+
damageTypes: ["Flame", "Frost", "Shock", "Disease"],
|
|
110
|
+
index : 4,
|
|
111
|
+
items : 5,
|
|
112
|
+
},
|
|
113
|
+
"chaotic whirlwind" : {
|
|
114
|
+
// (2 items) When you cast Whirlwind, you envelop yourself in a destructive flurry of blades for 6 seconds that pulse outward,
|
|
115
|
+
// striking up to 3 random enemies around you every 1 second for 62-2675 Physical Damage. This effect can occur once every 10 seconds.
|
|
116
|
+
isAoE : true,
|
|
117
|
+
isDoT : true,
|
|
118
|
+
index : 1,
|
|
119
|
+
items : 2,
|
|
120
|
+
},
|
|
121
|
+
"coldharbour's favorite" : {
|
|
122
|
+
// (5 items) When you damage an enemy, summon Cadwell's noble mount, Honor, who after 2 seconds, explodes, damaging enemies around him for 280-12190 Magic Damage over 4 seconds.
|
|
123
|
+
isAoE : true,
|
|
124
|
+
isDoT : true,
|
|
125
|
+
index : 5,
|
|
126
|
+
items : 5,
|
|
127
|
+
},
|
|
128
|
+
"curse of doylemish" : {
|
|
129
|
+
// (5 items) When using a fully-charged melee Heavy Attack on a taunted monster or any enemy who is stunned, feared, or immobilized, you
|
|
130
|
+
// will deal 290-12507 Physical Damage. This effect can occur once every 4 seconds.
|
|
131
|
+
isAoE : false,
|
|
132
|
+
isDoT : false,
|
|
133
|
+
index : 5,
|
|
134
|
+
items : 5,
|
|
135
|
+
},
|
|
136
|
+
"defending warrior" : {
|
|
137
|
+
// (5 items) When you block an attack, you deal 93-4000 Magic Damage to all enemies within 10 meters of you and heal for 100% of the damage done. This effect can occur once every 10 seconds.
|
|
138
|
+
isAoE : true,
|
|
139
|
+
isDoT : false,
|
|
140
|
+
index : 4,
|
|
141
|
+
items : 5,
|
|
142
|
+
},
|
|
143
|
+
"defiler" : {
|
|
144
|
+
// (5 items) When you deal Critical Damage, you have an 8% chance to summon a Hunger that spews poison to all enemies in front of it,
|
|
145
|
+
// dealing 139-6000 Poison Damage and stunning any enemy hit for 5 seconds. This effect can occur once every 5 seconds.
|
|
146
|
+
isAoE : true,
|
|
147
|
+
isDoT : false,
|
|
148
|
+
isPet : true,
|
|
149
|
+
index : 4,
|
|
150
|
+
items : 5,
|
|
151
|
+
},
|
|
152
|
+
"destructive mage" : {
|
|
153
|
+
// (5 items) When you deal damage with a fully-charged Heavy Attack, you place a bomb on the enemy for 10 seconds. When they are hit with a
|
|
154
|
+
// fully-charged Heavy Attack the bomb detonates, dealing 152-6575 Magic Damage all enemies within 8 meters. This effect can occur once every 4 seconds.
|
|
155
|
+
isAoE : true,
|
|
156
|
+
isDoT : false,
|
|
157
|
+
index : 4,
|
|
158
|
+
items : 5,
|
|
159
|
+
},
|
|
160
|
+
"domihaus" : {
|
|
161
|
+
// (2 items) When you deal damage, you create either a ring of fire or ring of molten earth around you for 10 seconds, which deals 30-1300 Flame damage or 30-1300 Physical damage
|
|
162
|
+
// every 1 second. Standing within the ring grants you 6-300 Spell Damage or 6-300 Weapon Damage. This effect can occur once every 15 seconds
|
|
163
|
+
isAoE : true,
|
|
164
|
+
isDoT : true,
|
|
165
|
+
damageTypes: ["Flame", "Physical"],
|
|
166
|
+
index : 2,
|
|
167
|
+
items : 2,
|
|
168
|
+
},
|
|
169
|
+
"embershield" : {
|
|
170
|
+
// (5 items) When you deal damage with a fully-charged Heavy Attack, you increase your Physical and Spell Resistance by 76-3300 and deal 20-860 Flame damage
|
|
171
|
+
// to all enemies within 5 meters of you every 1 second for 6 seconds.
|
|
172
|
+
isAoE : true,
|
|
173
|
+
isDoT : true,
|
|
174
|
+
index : 4,
|
|
175
|
+
items : 5,
|
|
176
|
+
},
|
|
177
|
+
"eternal hunt" : {
|
|
178
|
+
// (5 items) When you use Roll Dodge, you leave behind a rune that detonates when enemies come close, dealing 170-7335 Poison damage and immobilizing them for 1.5 seconds.
|
|
179
|
+
isAoE : true,
|
|
180
|
+
isDoT : false,
|
|
181
|
+
index : 4,
|
|
182
|
+
items : 5,
|
|
183
|
+
},
|
|
184
|
+
"flame blossom" : {
|
|
185
|
+
// (5 items) When you deal damage, you have a 10% chance to summon a line of flame that moves forward after 1 second, dealing 186-8000 Flame Damage to
|
|
186
|
+
// any enemy in its path. This effect can occur once every 10 seconds.
|
|
187
|
+
isAoE : true,
|
|
188
|
+
isDoT : false,
|
|
189
|
+
index : 4,
|
|
190
|
+
items : 5,
|
|
191
|
+
},
|
|
192
|
+
"frozen watcher" : {
|
|
193
|
+
// (5 items) Summon a blizzard around you while blocking, inflicting 23-1000 Frost Damage every 1 second to enemies within your blizzard.
|
|
194
|
+
// Your blizzard has a 15% chance of inflicting Chilled on enemies damaged.
|
|
195
|
+
isAoE : true,
|
|
196
|
+
isDoT : true,
|
|
197
|
+
index : 4,
|
|
198
|
+
items : 5,
|
|
199
|
+
},
|
|
200
|
+
"galerion's revenge" : {
|
|
201
|
+
// (5 items) When you deal damage with a Light or Heavy Attack, you put a Mark of Revenge on the enemy for 15 seconds.
|
|
202
|
+
// After stacking 5 Marks of Revenge on an enemy they detonate for 223-9630 Magic Damage.
|
|
203
|
+
isAoE : true,
|
|
204
|
+
isDoT : false,
|
|
205
|
+
index : 4,
|
|
206
|
+
items : 5,
|
|
207
|
+
},
|
|
208
|
+
"grothdarr" : {
|
|
209
|
+
// (2 items) When you deal damage, you have a 10% chance to create lava pools that swirl around you, dealing 41-1800 Flame damage to
|
|
210
|
+
// all enemies within 8 meters of you every 1 second for 5 seconds. This effect can occur once every 10 seconds.
|
|
211
|
+
isAoE : true,
|
|
212
|
+
isDoT : true,
|
|
213
|
+
index : 2,
|
|
214
|
+
items : 2,
|
|
215
|
+
},
|
|
216
|
+
"hand of mephala" : {
|
|
217
|
+
// (5 items) When you take damage, you have a 10% chance to cast a web around you for 5 seconds, reducing the Movement Speed of enemies within by 50%.
|
|
218
|
+
// After 5 seconds the webs burst into venom, dealing 60-2580 Poison Damage and applying Minor Fracture to any enemy hit for 5 seconds, reducing their Physical Resistance by 1320.
|
|
219
|
+
isAoE : true,
|
|
220
|
+
isDoT : false,
|
|
221
|
+
index : 4,
|
|
222
|
+
items : 5,
|
|
223
|
+
},
|
|
224
|
+
"hide of morihaus" : {
|
|
225
|
+
// (5 items) When you Roll Dodge through an enemy, you deal 42-1840 Physical Damage and knock them down for 3 seconds.
|
|
226
|
+
isAoE : false,
|
|
227
|
+
isDoT : false,
|
|
228
|
+
index : 4,
|
|
229
|
+
items : 5,
|
|
230
|
+
},
|
|
231
|
+
"iceheart" : {
|
|
232
|
+
// (2 items) When you deal Critical Damage, you have a 20% chance to gain a damage shield that absorbs 116-5000 damage for 6 seconds. While the damage shield holds, you deal 11-500 Frost damage
|
|
233
|
+
// to all enemies within 5 meters of you every 1 second. This effect can occur once every 6 seconds.
|
|
234
|
+
isAoE : true,
|
|
235
|
+
isDoT : true,
|
|
236
|
+
index : 2,
|
|
237
|
+
items : 2,
|
|
238
|
+
},
|
|
239
|
+
"icy conjuror" : {
|
|
240
|
+
// (5 items) Applying a minor debuff to your enemy summons a non-reflectable Ice Wraith that will charge into your enemy, dealing 440-18920 Frost Damage
|
|
241
|
+
// over 8 seconds. This effect can occur every 12 seconds.
|
|
242
|
+
isAoE : false,
|
|
243
|
+
isDoT : true,
|
|
244
|
+
index : 4,
|
|
245
|
+
items : 5,
|
|
246
|
+
},
|
|
247
|
+
"ilambris" : {
|
|
248
|
+
// (2 items) When you deal Flame or Shock Damage, you have a 33% chance to summon a meteor shower of that damage type that deals 46-2015 Damage to
|
|
249
|
+
// all enemies within 4 meters every 1 second for 5 seconds. This effect can occur once every 8 seconds.
|
|
250
|
+
isAoE : true,
|
|
251
|
+
isDoT : true,
|
|
252
|
+
damageTypes : [ "Flame", "Shock" ],
|
|
253
|
+
index : 2,
|
|
254
|
+
items : 2,
|
|
255
|
+
},
|
|
256
|
+
"infernal guardian" : {
|
|
257
|
+
// (2 items) When you apply a damage shield to yourself or an ally, you have a 50% chance to lob 3 mortars over 2 seconds at the furthest enemy from you
|
|
258
|
+
// that each deal 103-4430 Flame damage to all enemies within 5 meters of the blast area. This effect can occur once every 6 seconds.
|
|
259
|
+
isAoE : true,
|
|
260
|
+
isDoT : true,
|
|
261
|
+
index : 2,
|
|
262
|
+
items : 2,
|
|
263
|
+
},
|
|
264
|
+
"kjalnar's nightmare" : {
|
|
265
|
+
// (2 items) Dealing damage with a Light Attack puts a Bone stack on your enemy for 5 seconds. You can only apply 1 stack every 1 second.
|
|
266
|
+
// At 5 stacks, an undodgeable skeletal hand attacks your enemy after 1 second, knocking them into the air and stunning them for 3 seconds,
|
|
267
|
+
// or dealing 337-14500 Magic damage if they cannot be stunned. An enemy that has reached 5 stacks cannot gain Bone stacks for 3 seconds.
|
|
268
|
+
isAoE : false,
|
|
269
|
+
isDoT : false,
|
|
270
|
+
index : 2,
|
|
271
|
+
items : 2,
|
|
272
|
+
},
|
|
273
|
+
"kra'gh" : {
|
|
274
|
+
// (2 items) When you deal damage, you have a 10% chance to spawn dreugh limbs that create shockwaves in front of you dealing 31-1345 Physical damage
|
|
275
|
+
// every 0.4 seconds for 1.2 seconds. This effect can occur once every 3 seconds.
|
|
276
|
+
isAoE : true,
|
|
277
|
+
isDoT : true,
|
|
278
|
+
index : 2,
|
|
279
|
+
items : 2,
|
|
280
|
+
},
|
|
281
|
+
"leeching plate" : {
|
|
282
|
+
// (5 items) When you take damage, you have a 20% chance to summon a cloud of leeching poison under the assailant. The cloud deals 27-1200 Poison damage
|
|
283
|
+
// every 1 second for 5 seconds and heals you for 100% of the damage caused. A cloud can be created once every 5 seconds.
|
|
284
|
+
isAoE : true,
|
|
285
|
+
isDoT : true,
|
|
286
|
+
index : 4,
|
|
287
|
+
items : 5,
|
|
288
|
+
},
|
|
289
|
+
"maarselok" : {
|
|
290
|
+
//(2 items) When you bash an enemy, you spew a cone of corruption, dealing 9000 Disease Damage to enemies over 4 seconds. This damage is increased by 5%
|
|
291
|
+
// for each negative effect the enemies have, up to 150% additional damage. This effect can occur once every 7 seconds.
|
|
292
|
+
isAoE : true,
|
|
293
|
+
isDoT : true,
|
|
294
|
+
index : 2,
|
|
295
|
+
items : 2,
|
|
296
|
+
},
|
|
297
|
+
"mad tinkerer" : {
|
|
298
|
+
// (5 items) When you deal damage, you have a 10% chance to summon a Verminous Fabricant that charges the nearest enemy, dealing 232-9999 Shock Damage to all
|
|
299
|
+
// enemies in its path, knocking them into the air, and stunning them for 2 seconds. This effect can occur once every 10 seconds.
|
|
300
|
+
isAoE : true,
|
|
301
|
+
isDoT : false,
|
|
302
|
+
isPet : true,
|
|
303
|
+
index : 4,
|
|
304
|
+
items : 5,
|
|
305
|
+
},
|
|
306
|
+
"maw of the infernal" : {
|
|
307
|
+
// (2 items) When you deal damage with a Light or Heavy Attack, you have a 33% chance to summon a fire breathing Daedroth for 15 seconds.
|
|
308
|
+
// The Daedroth's attacks deal 89-3865 Flame damage, and alternate between Fiery Breath, Fiery Jaws, and Jagged Claw, which alternate once every 2 seconds.
|
|
309
|
+
isAoE : false,
|
|
310
|
+
isDoT : false,
|
|
311
|
+
isPet : true,
|
|
312
|
+
index : 2,
|
|
313
|
+
items : 2,
|
|
314
|
+
},
|
|
315
|
+
"merciless charge" : {
|
|
316
|
+
// (2 items) Dealing damage with Critical Charge causes enemies to bleed for 228-10032 Physical Damage over 5 seconds.
|
|
317
|
+
isAoE : false,
|
|
318
|
+
isDoT : true,
|
|
319
|
+
index : 1,
|
|
320
|
+
items : 2,
|
|
321
|
+
},
|
|
322
|
+
"morkuldin" : {
|
|
323
|
+
// (5 items) When you deal damage with a Light or Heavy Attack, you summon an animated weapon to attack your enemies for 15 seconds.
|
|
324
|
+
// The animated weapon's basic attacks deal 95-4108 Physical damage. This effect can occur once every 15 seconds.
|
|
325
|
+
isAoE : false,
|
|
326
|
+
isDoT : true,
|
|
327
|
+
isPet : true,
|
|
328
|
+
index : 4,
|
|
329
|
+
items : 5,
|
|
330
|
+
},
|
|
331
|
+
"nerien'eth" : {
|
|
332
|
+
// (2 items) When you deal direct damage, you have a 15% chance to summon a Lich crystal that explodes after 2 seconds, dealing 218-9393 Magic damage
|
|
333
|
+
// to all enemies within 4 meters. This effect can occur once every 3 seconds.
|
|
334
|
+
isAoE : true,
|
|
335
|
+
isDoT : false,
|
|
336
|
+
index : 2,
|
|
337
|
+
items : 2,
|
|
338
|
+
},
|
|
339
|
+
"night terror" : {
|
|
340
|
+
// (5 items) When you take melee damage, you deal 46-2000 Poison Damage to the attacker. This effect can occur once every 1 second.
|
|
341
|
+
isAoE : false,
|
|
342
|
+
isDoT : false,
|
|
343
|
+
index : 4,
|
|
344
|
+
items : 5,
|
|
345
|
+
},
|
|
346
|
+
"overwhelming surge" : {
|
|
347
|
+
// (5 items) When you deal damage with a Class ability, you have a 33% chance to surround yourself with a torrent that deals 24-1040 Shock Damage
|
|
348
|
+
// to enemies within 8 meters of you every 1 second for 6 seconds. 15% of the damage you deal this way is restored to you as Magicka. This effect can occur every 6 seconds.
|
|
349
|
+
isAoE : false,
|
|
350
|
+
isDoT : true,
|
|
351
|
+
index : 4,
|
|
352
|
+
items : 5,
|
|
353
|
+
},
|
|
354
|
+
"perfected arms of relequen": {
|
|
355
|
+
// (5 items) Your Light and Heavy attacks apply a stack of harmful winds to your target for 5 seconds. Harmful winds deal 4-200 Physical Damage every 1 second. 20 stacks max.
|
|
356
|
+
isAoE : false,
|
|
357
|
+
isDoT : true,
|
|
358
|
+
index : 5,
|
|
359
|
+
items : 5,
|
|
360
|
+
},
|
|
361
|
+
"perfected chaotic whirlwind": {
|
|
362
|
+
// (2 items) When you cast Whirlwind, you envelop yourself in a destructive flurry of blades for 6 seconds that pulse outward, striking up to 3
|
|
363
|
+
// random enemies around you every 1 second for 62-2675 Physical Damage. This effect can occur once every 10 seconds.
|
|
364
|
+
isAoE : false,
|
|
365
|
+
isDoT : true,
|
|
366
|
+
index : 2,
|
|
367
|
+
items : 2,
|
|
368
|
+
},
|
|
369
|
+
"perfected merciless charge" : {
|
|
370
|
+
// (2 items) Dealing damage with Critical Charge causes enemies to bleed for 228-10032 Physical Damage over 5 seconds.
|
|
371
|
+
isAoE : false,
|
|
372
|
+
isDoT : true,
|
|
373
|
+
index : 2,
|
|
374
|
+
items : 2,
|
|
375
|
+
},
|
|
376
|
+
"perfected piercing spray" : {
|
|
377
|
+
// (2 items) Dealing damage with Critical Charge causes enemies to bleed for 228-10032 Physical Damage over 5 seconds.
|
|
378
|
+
isAoE : false,
|
|
379
|
+
isDoT : true,
|
|
380
|
+
index : 2,
|
|
381
|
+
items : 2,
|
|
382
|
+
},
|
|
383
|
+
"perfected wild impulse" : {
|
|
384
|
+
// (2 items) Reduce the cost of Impulse by 10%. Impulse places lingering elemental damage on your targets, dealing 92-3965 Flame,
|
|
385
|
+
// 92-3965 Shock, and 92-3965 Frost Damage over 8 seconds.
|
|
386
|
+
isAoE : true,
|
|
387
|
+
isDoT : true,
|
|
388
|
+
index : 2,
|
|
389
|
+
items : 2,
|
|
390
|
+
},
|
|
391
|
+
"phoenix" : {
|
|
392
|
+
// (5 items) When you drop below 25% Health, gain a damage shield that absorbs 581-25000 damage for 6 seconds and deals 186-8000 Flame damage
|
|
393
|
+
// to nearby enemies. This effect can occur once every 1 minute
|
|
394
|
+
isAoE : true,
|
|
395
|
+
isDoT : false,
|
|
396
|
+
index : 4,
|
|
397
|
+
items : 5,
|
|
398
|
+
},
|
|
399
|
+
"pillar of nirn" : {
|
|
400
|
+
// (5 items)When you deal damage, you have a 10% chance to create a fissure underneath the enemy after 1 second, dealing 46-2000 Physical Damage to all
|
|
401
|
+
// enemies within 2.5 meters and causing them to bleed for an additional 230-10000 Physical Damage over 10 seconds. This effect can occur once every 10 seconds.
|
|
402
|
+
isAoE : [true, false],
|
|
403
|
+
isDoT : [false, true],
|
|
404
|
+
isBleed: [false, true],
|
|
405
|
+
index : 4,
|
|
406
|
+
items : 5,
|
|
407
|
+
},
|
|
408
|
+
"plague slinger" : {
|
|
409
|
+
// (5 items) When you take damage, summon a Skeever corpse which will launch five poison balls over 5 seconds that deal 120-5160 Poison Damage each at the nearest enemy.
|
|
410
|
+
isAoE : false,
|
|
411
|
+
isDoT : true,
|
|
412
|
+
index : 4,
|
|
413
|
+
items : 5,
|
|
414
|
+
},
|
|
415
|
+
"poisonous serpent" : {
|
|
416
|
+
// (5 items) When you deal damage with a Light or Heavy Attack against an enemy who has a Poison Damage ability on them, you have a 50% chance to deal an
|
|
417
|
+
// additional 79-3400 Poison Damage. This effect can occur once every 1 second.
|
|
418
|
+
isAoE : false,
|
|
419
|
+
isDoT : false,
|
|
420
|
+
index : 4,
|
|
421
|
+
items : 5,
|
|
422
|
+
},
|
|
423
|
+
"roar of alkosh" : {
|
|
424
|
+
// (5 items) When you activate a synergy, you send a shockwave from your position that deals 40-1720 Physical damage and an additional 280-12040 Physical damage
|
|
425
|
+
// over 10 seconds. Reduces the Physical and Spell Resistance of any enemy hit by 70-3010 for 10 seconds.
|
|
426
|
+
isAoE : [true, true],
|
|
427
|
+
isDoT : [false, true],
|
|
428
|
+
index : 4,
|
|
429
|
+
items : 5,
|
|
430
|
+
},
|
|
431
|
+
"savage werewolf" : {
|
|
432
|
+
// (5 items) Your Light and Heavy Attacks rend flesh, causing your enemy to bleed for 23-1000 Physical Damage every 1 second for 4 seconds.
|
|
433
|
+
isAoE : false,
|
|
434
|
+
isDoT : true,
|
|
435
|
+
isBleed: true,
|
|
436
|
+
index : 4,
|
|
437
|
+
items : 5,
|
|
438
|
+
},
|
|
439
|
+
"scavenging demise" : {
|
|
440
|
+
// (5 items) When you deal Critical Poison Damage to an enemy, summon the Scavenging Maw which attacks your enemy after 2 seconds. The Scavenging Maw deals 162-7000 Poison Damage
|
|
441
|
+
// and inflicts Minor Vulnerability for 15 seconds, increasing their damage taken by 8%. This effect can occur every 10 seconds.
|
|
442
|
+
isAoE : false,
|
|
443
|
+
isDoT : false,
|
|
444
|
+
isPet : true, //TODO: Confirm?
|
|
445
|
+
index : 4,
|
|
446
|
+
items : 5,
|
|
447
|
+
},
|
|
448
|
+
"selene" : {
|
|
449
|
+
// (2 items) When you deal melee damage, you have a 15% chance to call on a primal spirit that mauls the closest enemy in front of you after 1.3 seconds for
|
|
450
|
+
// 310-13364 Physical damage. This effect can occur once every 4 seconds.
|
|
451
|
+
isAoE : false,
|
|
452
|
+
isDoT : false,
|
|
453
|
+
isPet : true,
|
|
454
|
+
singleTarget : true,
|
|
455
|
+
index : 2,
|
|
456
|
+
items : 2,
|
|
457
|
+
},
|
|
458
|
+
"sellistrix" : {
|
|
459
|
+
// (2 items) When you deal damage you create an earthquake under the enemy that erupts after 1.5 seconds, dealing 158-6836 Physical damage to all enemies within
|
|
460
|
+
// 4 meters and stunning them for 3 seconds. This effect can occur once every 6 seconds.
|
|
461
|
+
isAoE : true,
|
|
462
|
+
isDoT : false,
|
|
463
|
+
index : 2,
|
|
464
|
+
items : 2,
|
|
465
|
+
},
|
|
466
|
+
"shadow of the red mountain" : {
|
|
467
|
+
// (5 items) When you deal damage with a weapon, you have a 10% chance to spawn a volcano that erupts after 1 second, launching liquid hot lava at the closest
|
|
468
|
+
// enemy dealing 195-8400 Flame damage. This effect can occur once every 2 seconds.
|
|
469
|
+
isAoE : false,
|
|
470
|
+
isDoT : false,
|
|
471
|
+
index : 4,
|
|
472
|
+
items : 5,
|
|
473
|
+
},
|
|
474
|
+
"shadowrend" : {
|
|
475
|
+
// (2 items) When you take damage, you have a 15% chance to summon a shadowy Clannfear for 15 seconds. The Clannfear's attacks deal 18-800 Magic damage and
|
|
476
|
+
// reduce their target's damage done by 5% for 2 seconds.
|
|
477
|
+
isAoE : false,
|
|
478
|
+
isDoT : false, //TODO: Confirm?
|
|
479
|
+
singleTarget : false, //TODO: Test?
|
|
480
|
+
isPet: true,
|
|
481
|
+
index : 2,
|
|
482
|
+
items : 2,
|
|
483
|
+
},
|
|
484
|
+
"sheer venom" : {
|
|
485
|
+
// (5 items) When you deal damage with an Execute ability you infect the enemy, dealing 224-9660 Poison damage over 6 seconds. This effect can occur once every 6 seconds.
|
|
486
|
+
isAoE : false,
|
|
487
|
+
isDoT : true,
|
|
488
|
+
index : 4,
|
|
489
|
+
items : 5,
|
|
490
|
+
},
|
|
491
|
+
"song of lamae" : {
|
|
492
|
+
// (5 items) When you take damage while you are under 30% Health, you deal 90-3870 Magic damage to the attacker and heal for 90-3870 Health.
|
|
493
|
+
// This effect can occur once every 30 seconds.
|
|
494
|
+
isAoE : false,
|
|
495
|
+
isDoT : false,
|
|
496
|
+
index : 4,
|
|
497
|
+
items : 5,
|
|
498
|
+
},
|
|
499
|
+
"spawn of mephala" : {
|
|
500
|
+
// (2 items) When you deal damage with a fully-charged Heavy Attack, you create a web for 10 seconds that deals 31-1340 Poison damage every 1 second to
|
|
501
|
+
// all enemies within 4 meters and reduces their Movement Speed by 50%. This effect can occur once every 10 seconds.
|
|
502
|
+
isAoE : true,
|
|
503
|
+
isDoT : true,
|
|
504
|
+
index : 2,
|
|
505
|
+
items : 2,
|
|
506
|
+
|
|
507
|
+
},
|
|
508
|
+
"storm knight's plate" : {
|
|
509
|
+
// (5 items) When you take non-Physical Damage, you have a 10% chance to deal 101-4373 Shock damage to all enemies within 5 meters of you every 2 seconds
|
|
510
|
+
// for 6 seconds. This effect can occur once every 6 seconds.
|
|
511
|
+
isAoE : true,
|
|
512
|
+
isDoT : true,
|
|
513
|
+
index : 4,
|
|
514
|
+
items : 5,
|
|
515
|
+
},
|
|
516
|
+
"storm master" : {
|
|
517
|
+
// (5 items) When you deal Critical Damage with a fully-charged Heavy Attack or Overload, your Light Attacks will also deal 37-1605 Shock Damage for 20 seconds.
|
|
518
|
+
isAoE : false,
|
|
519
|
+
isDoT : false,
|
|
520
|
+
index : 4,
|
|
521
|
+
items : 5,
|
|
522
|
+
},
|
|
523
|
+
"stormfist" : {
|
|
524
|
+
// (2 items) When you deal damage, you have a 10% chance to create a thunderfist to crush the enemy, dealing 38-1650 Shock damage every 1 second for 3 seconds to all
|
|
525
|
+
// enemies within 4 meters and a final 196-8470 Physical damage when the fist closes. This effect can occur once every 8 seconds.
|
|
526
|
+
isAoE : true,
|
|
527
|
+
isDoT : [true, false],
|
|
528
|
+
isPet: true,
|
|
529
|
+
index : 2,
|
|
530
|
+
items : 2,
|
|
531
|
+
},
|
|
532
|
+
"sunderflame" : {
|
|
533
|
+
// (5 items) When you deal damage with a fully-charged Heavy Attack, you deal an additional 93-4000 Flame Damage and apply Minor Breach and Minor Fracture to the enemy,
|
|
534
|
+
// reducing their Spell and Physical Resistance by 1320 for 8 seconds.
|
|
535
|
+
isAoE : false,
|
|
536
|
+
isDoT : false,
|
|
537
|
+
index : 4,
|
|
538
|
+
items : 5,
|
|
539
|
+
},
|
|
540
|
+
"syvarra's scales" : {
|
|
541
|
+
// (5 items) When you deal damage, you have a 5% chance to cause a burst of lamia poison that deals 22-967 Poison damage in a 5 meter radius
|
|
542
|
+
// and an additional 132-5802 Poison damage over 6 seconds to all enemies hit. This effect can occur once every 6.5 seconds.
|
|
543
|
+
isAoE : [true, true],
|
|
544
|
+
isDoT : [false, true],
|
|
545
|
+
index : 5,
|
|
546
|
+
items : 5,
|
|
547
|
+
},
|
|
548
|
+
"the ice furnace" : {
|
|
549
|
+
// (5 items) When you deal Frost Damage, you deal an additional 74-1644 Flame Damage to all enemies within 8 meters around the initial target.
|
|
550
|
+
// This effect can occur once every 1 second.
|
|
551
|
+
isAoE : true,
|
|
552
|
+
isDoT : false,
|
|
553
|
+
index : 4,
|
|
554
|
+
items : 5,
|
|
555
|
+
},
|
|
556
|
+
"Thews of the Harbinger" : {
|
|
557
|
+
// (5 items) When you block an attack, you deal damage to your attacker equal to 6% of your Max Health. Current value: 524 Physical Damage
|
|
558
|
+
isAoE : false,
|
|
559
|
+
isDoT : false,
|
|
560
|
+
index : 4,
|
|
561
|
+
items : 5,
|
|
562
|
+
},
|
|
563
|
+
"thunderbug's carapace" : {
|
|
564
|
+
// (5 items) When you take Physical Damage, you have a 50% chance to deal 120-5160 Shock Damage in a 5 meter radius around you. This effect can occur once every 3 seconds.
|
|
565
|
+
isAoE : true,
|
|
566
|
+
isDoT : false,
|
|
567
|
+
index : 4,
|
|
568
|
+
items : 5,
|
|
569
|
+
},
|
|
570
|
+
"thurvokun" : {
|
|
571
|
+
// (2 items)When you take damage from a nearby enemy, you summon a growing pool of desecrated bile for 8 seconds. Enemies in the bile take 2-100 Disease damage every 1 second and are
|
|
572
|
+
// afflicted with Minor Maim and Minor Defile for 4 seconds, reducing their damage done by 15% and healing received and Health Recovery by 15%. This effect can occur every 16 seconds.
|
|
573
|
+
isAoE : true,
|
|
574
|
+
isDoT : true,
|
|
575
|
+
index : 2,
|
|
576
|
+
items : 2,
|
|
577
|
+
},
|
|
578
|
+
"tremorscale" : {
|
|
579
|
+
// (2 items) When you taunt an enemy, you cause a duneripper to burst from the ground beneath them after 1 second, dealing 139-6000 Physical damage to all enemies within 4 meters
|
|
580
|
+
// and reducing their Physical Resistance by 55-2395 for 8 seconds. This effect can occur once every 8 seconds.
|
|
581
|
+
isAoE : true,
|
|
582
|
+
isDoT : false,
|
|
583
|
+
index : 2,
|
|
584
|
+
items : 2,
|
|
585
|
+
},
|
|
586
|
+
"trinimac's valor" : {
|
|
587
|
+
// (5 items) When you cast a damage shield ability, you call down a fragment of Trinimac that heals you and your allies for 93-4000 Health and damages enemies for 93-4000 Magic damage
|
|
588
|
+
// in a 5 meter radius. This effect can occur once every 5 seconds.
|
|
589
|
+
isAoE : true,
|
|
590
|
+
isDoT : false,
|
|
591
|
+
index : 4,
|
|
592
|
+
items : 5,
|
|
593
|
+
},
|
|
594
|
+
"twin sisters" : {
|
|
595
|
+
// (5 items) When you block an attack, you have a 20% chance to cause all enemies within 5 meters of you to bleed for 330-14400 Physical damage over 10 seconds.
|
|
596
|
+
// awThis effect can occur once every 10 seconds.
|
|
597
|
+
isAoE : true,
|
|
598
|
+
isDoT : true,
|
|
599
|
+
index : 4,
|
|
600
|
+
items : 5,
|
|
601
|
+
},
|
|
602
|
+
"unfathomable darkness" : {
|
|
603
|
+
// (5 items) When you deal damage, you have a 10% chance to call a murder of crows around you for 12 seconds. Every 3 seconds a crow will be sent to peck the closest enemy
|
|
604
|
+
// within 12 meters of you, dealing 93-4000 Physical Damage. This effect can occur once every 15 seconds.
|
|
605
|
+
isAoE : false,
|
|
606
|
+
isDoT : false,
|
|
607
|
+
index : 4,
|
|
608
|
+
items : 5,
|
|
609
|
+
},
|
|
610
|
+
"valkyn skoria" : {
|
|
611
|
+
// (2 items) When you deal damage with a damage over time effect, you have a 8% chance to summon a meteor that deals 209-9000 Flame damage to the target and 82-3535 Flame damage
|
|
612
|
+
// to all other enemies within 5 meters. This effect can occur once every 5 seconds.
|
|
613
|
+
isAoE : [false, true],
|
|
614
|
+
isDoT : false,
|
|
615
|
+
index : 2,
|
|
616
|
+
items : 2,
|
|
617
|
+
},
|
|
618
|
+
"velidreth" : {
|
|
619
|
+
// (2 items) When you deal damage, you have a 20% chance to spawn 3 disease spores in front of you after 1 second that deal 250-10752 Disease damage to
|
|
620
|
+
// the first enemy they hit. This effect can occur once every 8 seconds.
|
|
621
|
+
isAoE : false,
|
|
622
|
+
isDoT : false,
|
|
623
|
+
index : 2,
|
|
624
|
+
items : 2,
|
|
625
|
+
},
|
|
626
|
+
"venomous smite" : {
|
|
627
|
+
// (5 items) Dealing Critical Damage inflicts Hunter's Venom on your enemy for 10 seconds, dealing 52-2241 Poison Damage to your target and nearby enemies
|
|
628
|
+
// every 1 second. This effect can occur once every 15 seconds.
|
|
629
|
+
isAoE : true,
|
|
630
|
+
isDoT : true,
|
|
631
|
+
index : 4,
|
|
632
|
+
items : 5,
|
|
633
|
+
},
|
|
634
|
+
"vicecanon of venom" : {
|
|
635
|
+
// (5 items) When you deal Critical Damage to an enemy from Sneak, you inject a leeching poison that deals 320-13760 Poison Damage over 15 seconds to
|
|
636
|
+
// them and heals you for 100% of the damage done.
|
|
637
|
+
isAoE : false,
|
|
638
|
+
isDoT : true,
|
|
639
|
+
index : 4,
|
|
640
|
+
items : 5,
|
|
641
|
+
},
|
|
642
|
+
"vicious death" : {
|
|
643
|
+
// (5 items) When you kill a Player, they violently explode for 367-15815 Flame damage to all other enemies in a 4 meter radius.
|
|
644
|
+
isAoE : true,
|
|
645
|
+
isDoT : false,
|
|
646
|
+
index : 4,
|
|
647
|
+
items : 5,
|
|
648
|
+
},
|
|
649
|
+
"viper's sting" : {
|
|
650
|
+
// (5 items) When you deal damage with a melee attack, you deal an additional 145-6400 Poison Damage over 4 seconds. This effect can occur once every 4 seconds.
|
|
651
|
+
isAoE : false,
|
|
652
|
+
isDoT : true,
|
|
653
|
+
index : 4,
|
|
654
|
+
items : 5,
|
|
655
|
+
},
|
|
656
|
+
"way of fire" : {
|
|
657
|
+
// (5 items) When you deal damage with a weapon, you have a 20% chance to deal an additional 93-4000 Flame damage. This effect can occur once every 2 seconds.
|
|
658
|
+
isAoE : false,
|
|
659
|
+
isDoT : false,
|
|
660
|
+
index : 4,
|
|
661
|
+
items : 5,
|
|
662
|
+
},
|
|
663
|
+
"widowmaker" : {
|
|
664
|
+
// (5 items) When your alchemical poison fires, you drop a poisonous spore in front of you that bursts after 1 second, dealing 180-7740 Poison Damage to all enemies within 5 meters.
|
|
665
|
+
isAoE : true,
|
|
666
|
+
isDoT : false,
|
|
667
|
+
index : 4,
|
|
668
|
+
items : 5,
|
|
669
|
+
},
|
|
670
|
+
"wild impulse" : {
|
|
671
|
+
// (2 items) Reduce the cost of Impulse by 10%. Impulse places lingering elemental damage on your targets, dealing 92-3965 Flame, 92-3965 Shock, and 92-3965 Frost Damage over 8 seconds.
|
|
672
|
+
isAoE : true,
|
|
673
|
+
isDoT : true,
|
|
674
|
+
index : 1,
|
|
675
|
+
items : 2,
|
|
676
|
+
},
|
|
677
|
+
"winterborn" : {
|
|
678
|
+
// (5 items) When you deal Frost Damage, you have an 8% chance to summon an ice pillar that deals 140-6020 Frost damage to all enemies in a 3 meter radius. The ice pillar persists
|
|
679
|
+
// for 2 seconds and reduces the Movement Speed of all enemies within the radius by 60%.
|
|
680
|
+
isAoE : true,
|
|
681
|
+
isDoT : false,
|
|
682
|
+
index : 4,
|
|
683
|
+
items : 5,
|
|
684
|
+
},
|
|
685
|
+
"zaan" : {
|
|
686
|
+
// (2 items)When you damage a nearby enemy with a Light or Heavy Attack, you have a 33% chance to create a beam of fire that will connect you to your enemy. The beam deals 46-2010
|
|
687
|
+
// Flame damage every 1 second to your enemy for 6 seconds. Every second, this damage increases by 100%. The beam is broken if the enemy moves 8 meters away from you. This effect can occur every 18 seconds.
|
|
688
|
+
isAoE : false,
|
|
689
|
+
isDoT : true,
|
|
690
|
+
index : 2,
|
|
691
|
+
items : 2,
|
|
692
|
+
},
|
|
693
|
+
|
|
694
|
+
"blooddrinker" : {
|
|
695
|
+
ignoreAll: true,
|
|
696
|
+
},
|
|
697
|
+
"call of the undertaker" : {
|
|
698
|
+
ignoreAll: true,
|
|
699
|
+
},
|
|
700
|
+
"crushing wall" : {
|
|
701
|
+
// (2 items) Your Light and Heavy Attacks deal an additional 31-1353 damage to enemies in your Wall of Elements.
|
|
702
|
+
ignoreAll: true,
|
|
703
|
+
},
|
|
704
|
+
"deadly strike" : {
|
|
705
|
+
ignoreAll: true,
|
|
706
|
+
},
|
|
707
|
+
"dragon's appetite" : {
|
|
708
|
+
ignoreAll: true,
|
|
709
|
+
},
|
|
710
|
+
"draugrkin's grip" : {
|
|
711
|
+
ignoreAll: true,
|
|
712
|
+
},
|
|
713
|
+
"infallible mage" : {
|
|
714
|
+
// (5 items) Your Heavy Attacks deal an additional 21-903 damage. Enemies you damage with fully-charged Heavy Attacks are afflicted with
|
|
715
|
+
// Minor Vulnerability for 10 seconds, increasing their damage taken by 8%.
|
|
716
|
+
ignoreAll: true,
|
|
717
|
+
},
|
|
718
|
+
"jolting arms" : {
|
|
719
|
+
// (5 items) When you block an attack, you have a 50% chance to charge your arms, causing your next Bash ability to deal an additional 141-6086 and increase
|
|
720
|
+
// your Physical and Spell Resistance by 107-4620 for 6 seconds.
|
|
721
|
+
ignoreAll: true,
|
|
722
|
+
},
|
|
723
|
+
"knight slayer" : {
|
|
724
|
+
ignoreAll: true,
|
|
725
|
+
},
|
|
726
|
+
"queen's elegance" : {
|
|
727
|
+
ignoreAll: true,
|
|
728
|
+
},
|
|
729
|
+
"noble duelist's silks" : {
|
|
730
|
+
// (5 items) When you dodge an attack, your Light and Heavy Attacks deal an additional 28-1225 damage for 8 seconds.
|
|
731
|
+
ignoreAll: true,
|
|
732
|
+
},
|
|
733
|
+
"perfected crushing wall" : {
|
|
734
|
+
// (2 items) Your Light and Heavy Attacks deal an additional 31-1353 damage to enemies in your Wall of Elements.
|
|
735
|
+
ignoreAll: true,
|
|
736
|
+
},
|
|
737
|
+
"perfected roaring opportunist" : {
|
|
738
|
+
// (5 items) Using a Fully-Charged Heavy Attack grants you and up to 11 group members within 28 meters Major Slayer, increasing your damage done to Dungeon, Trial, and
|
|
739
|
+
// Arena Monsters by 15% for 1 second for every 8000 damage dealt. Roaring Opportunist can only affect a target every 22 seconds.
|
|
740
|
+
ignoreAll: true,
|
|
741
|
+
},
|
|
742
|
+
"perfected stinging slashes" : {
|
|
743
|
+
ignoreAll: true,
|
|
744
|
+
},
|
|
745
|
+
"perfected thunderous volley" : {
|
|
746
|
+
ignoreAll: true,
|
|
747
|
+
},
|
|
748
|
+
"perfected titanic cleave" : {
|
|
749
|
+
ignoreAll: true,
|
|
750
|
+
},
|
|
751
|
+
"roaring opportunist" : {
|
|
752
|
+
// (5 items) Using a Fully-Charged Heavy Attack grants you and up to 11 group members within 28 meters Major Slayer, increasing your damage done to Dungeon, Trial, and
|
|
753
|
+
// Arena Monsters by 15% for 1 second for every 8000 damage dealt. Roaring Opportunist can only affect a target every 22 seconds.
|
|
754
|
+
ignoreAll: true,
|
|
755
|
+
},
|
|
756
|
+
"sload's semblance" : {
|
|
757
|
+
ignoreAll: true,
|
|
758
|
+
},
|
|
759
|
+
"stinging slashes" : {
|
|
760
|
+
ignoreAll: true,
|
|
761
|
+
},
|
|
762
|
+
"thunderous volley" : {
|
|
763
|
+
ignoreAll: true,
|
|
764
|
+
},
|
|
765
|
+
"titanic cleave" : {
|
|
766
|
+
ignoreAll: true,
|
|
767
|
+
},
|
|
768
|
+
"undaunted infiltrator" : {
|
|
769
|
+
// (5 items) When you use an ability that costs Magicka, your Light Attacks deal an additional 18-774 damage and Heavy Attacks deal an additional 27-1161 damage for 10 seconds.
|
|
770
|
+
ignoreAll: true,
|
|
771
|
+
},
|
|
772
|
+
"undaunted unweaver" : {
|
|
773
|
+
// (5 items) When you use an ability that costs Stamina, your Light Attacks deal an additional 18-774 damage and Heavy Attacks deal an additional 27-1161 damage for 10 seconds.
|
|
774
|
+
ignoreAll: true,
|
|
775
|
+
},
|
|
776
|
+
"varen's legacy" : {
|
|
777
|
+
// (5 items) When you block an attack, you have a 10% chance to cause your next direct damage area of effect attack to deal an additional 300-3450 damage. This bonus does not work with channeled effects.
|
|
778
|
+
ignoreAll: true,
|
|
779
|
+
},
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
window.EsoBuildLog = function()
|
|
784
|
+
{
|
|
785
|
+
if (console == null) return;
|
|
786
|
+
if (console.log == null) return;
|
|
787
|
+
|
|
788
|
+
console.log.apply(console, arguments);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
window.onTooltipHoverShow = function()
|
|
793
|
+
{
|
|
794
|
+
ecdLastTooltip = $(this).find('.ecdTooltip');
|
|
795
|
+
|
|
796
|
+
if (ecdLastTooltip)
|
|
797
|
+
{
|
|
798
|
+
ecdLastTooltip.css('display', 'inline-block');
|
|
799
|
+
adjustSkillTooltipPosition(ecdLastTooltip, $(this));
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
window.adjustSkillTooltipPosition = function(tooltip, parent)
|
|
805
|
+
{
|
|
806
|
+
if (tooltip == null || tooltip[0] == null) return;
|
|
807
|
+
|
|
808
|
+
var windowWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
|
|
809
|
+
var windowHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
|
|
810
|
+
var toolTipWidth = tooltip.width();
|
|
811
|
+
var toolTipHeight = tooltip.height();
|
|
812
|
+
var elementHeight = parent.height();
|
|
813
|
+
var elementWidth = parent.width();
|
|
814
|
+
var NARROW_WINDOW_WIDTH = 800;
|
|
815
|
+
|
|
816
|
+
var top = parent.offset().top - 50;
|
|
817
|
+
var left = parent.offset().left + parent.outerWidth() + 3;
|
|
818
|
+
|
|
819
|
+
if (windowWidth < NARROW_WINDOW_WIDTH)
|
|
820
|
+
{
|
|
821
|
+
top = parent.offset().top - 25 - toolTipHeight;
|
|
822
|
+
left = parent.offset().left - toolTipWidth/2 + elementWidth/2;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
tooltip.offset({ top: top, left: left });
|
|
826
|
+
|
|
827
|
+
var viewportTooltip = tooltip[0].getBoundingClientRect();
|
|
828
|
+
|
|
829
|
+
if (viewportTooltip.bottom > windowHeight)
|
|
830
|
+
{
|
|
831
|
+
var deltaHeight = viewportTooltip.bottom - windowHeight + 10;
|
|
832
|
+
top = top - deltaHeight
|
|
833
|
+
}
|
|
834
|
+
else if (viewportTooltip.top < 0)
|
|
835
|
+
{
|
|
836
|
+
var deltaHeight = viewportTooltip.top - 10;
|
|
837
|
+
|
|
838
|
+
if (windowWidth < NARROW_WINDOW_WIDTH) deltaHeight = -toolTipHeight - elementHeight - 30;
|
|
839
|
+
|
|
840
|
+
top = top - deltaHeight
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
if (viewportTooltip.right > windowWidth)
|
|
844
|
+
{
|
|
845
|
+
if (windowWidth < NARROW_WINDOW_WIDTH)
|
|
846
|
+
left = left + windowWidth - viewportTooltip.right - 10;
|
|
847
|
+
else
|
|
848
|
+
left = left - toolTipWidth - parent.width() - 28;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
tooltip.offset({ top: top, left: left });
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
window.onTooltipHoverHide = function()
|
|
856
|
+
{
|
|
857
|
+
if (ecdLastTooltip) ecdLastTooltip.hide();
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
window.onTooltipMouseMove = function(e)
|
|
862
|
+
{
|
|
863
|
+
if (ecdLastTooltip == null) return;
|
|
864
|
+
|
|
865
|
+
var mousex = e.pageX + 20;
|
|
866
|
+
var mousey = e.pageY + 20
|
|
867
|
+
|
|
868
|
+
var tipWidth = ecdLastTooltip.width();
|
|
869
|
+
var tipHeight = ecdLastTooltip.height();
|
|
870
|
+
|
|
871
|
+
var tipVisX = $(window).width() - (mousex + tipWidth);
|
|
872
|
+
var tipVisY = $(window).height() - (mousey + tipHeight);
|
|
873
|
+
|
|
874
|
+
if ( tipVisX < 20 ) {
|
|
875
|
+
mousex = e.pageX - tipWidth - 20;
|
|
876
|
+
} if ( tipVisY < 20 ) {
|
|
877
|
+
mousey = e.pageY - tipHeight - 20;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
ecdLastTooltip.css({ top: mousey, left: mousex });
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
window.EsoSkillTree_LastOpenTree = null;
|
|
885
|
+
window.EsoSkillTree_LastOpenTreeName = null;
|
|
886
|
+
window.EsoSkillTree_LastSkillContentName = null;
|
|
887
|
+
window.EsoSkillTree_LastSkillContent = null;
|
|
888
|
+
|
|
889
|
+
window.EsoAchTree_LastOpenTree = null;
|
|
890
|
+
window.EsoAchTree_LastOpenTreeName = null;
|
|
891
|
+
window.EsoAchTree_LastContentName = null;
|
|
892
|
+
window.EsoAchTree_LastContent = null;
|
|
893
|
+
|
|
894
|
+
|
|
895
|
+
window.OnEsoSkillTreeName1Click = function(e)
|
|
896
|
+
{
|
|
897
|
+
EsoSkillTree_LastOpenTreeName = $('.ecdSkillTreeName1.ecdSkillTreeNameHighlight').first();
|
|
898
|
+
EsoSkillTree_LastOpenTree = EsoSkillTree_LastOpenTreeName.next(".ecdSkillTreeContent1");
|
|
899
|
+
|
|
900
|
+
if (EsoSkillTree_LastOpenTree.is($(this).next(".ecdSkillTreeContent1"))) return;
|
|
901
|
+
EsoSkillTree_LastOpenTree.slideUp();
|
|
902
|
+
EsoSkillTree_LastOpenTreeName.removeClass('ecdSkillTreeNameHighlight');
|
|
903
|
+
|
|
904
|
+
EsoSkillTree_LastSkillContentName = $('.ecdSkillTreeNameHighlight2').first();
|
|
905
|
+
EsoSkillTree_LastSkillContent = $('.ecdSkillData:visible').first();
|
|
906
|
+
EsoSkillTree_LastSkillContentName.removeClass('ecdSkillTreeNameHighlight2');
|
|
907
|
+
EsoSkillTree_LastSkillContent.hide();
|
|
908
|
+
|
|
909
|
+
EsoSkillTree_LastOpenTreeName = $(this);
|
|
910
|
+
EsoSkillTree_LastOpenTree = EsoSkillTree_LastOpenTreeName.next(".ecdSkillTreeContent1");
|
|
911
|
+
|
|
912
|
+
EsoSkillTree_LastOpenTreeName.addClass('ecdSkillTreeNameHighlight');
|
|
913
|
+
EsoSkillTree_LastOpenTree.slideDown();
|
|
914
|
+
|
|
915
|
+
SelectEsoSkillTreeContents(EsoSkillTree_LastOpenTree.children(".ecdSkillTreeName2").first());
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
window.OnEsoSkillTreeName2Click = function(e)
|
|
920
|
+
{
|
|
921
|
+
SelectEsoSkillTreeContents($(this));
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
|
|
925
|
+
window.SelectEsoSkillTreeContents = function(object)
|
|
926
|
+
{
|
|
927
|
+
EsoSkillTree_LastSkillContentName = $('.ecdSkillTreeNameHighlight2').first();
|
|
928
|
+
EsoSkillTree_LastSkillContent = $('.ecdSkillData:visible').first();
|
|
929
|
+
|
|
930
|
+
EsoSkillTree_LastSkillContentName.removeClass('ecdSkillTreeNameHighlight2');
|
|
931
|
+
EsoSkillTree_LastSkillContent.hide();
|
|
932
|
+
|
|
933
|
+
EsoSkillTree_LastSkillContentName = object;
|
|
934
|
+
object.addClass('ecdSkillTreeNameHighlight2');
|
|
935
|
+
|
|
936
|
+
var objText = object.contents().filter(function(){ return this.nodeType == 3;})[0].nodeValue;
|
|
937
|
+
var idName = 'ecdSkill_' + objText.replace(/ /g, "").replace(/'/g, "");
|
|
938
|
+
|
|
939
|
+
EsoSkillTree_LastSkillContent = $('#'+idName);
|
|
940
|
+
EsoSkillTree_LastSkillContent.show();
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
|
|
944
|
+
window.OnEsoAchievementTreeName1Click = function(e)
|
|
945
|
+
{
|
|
946
|
+
EsoAchTree_LastOpenTreeName = $('.ecdAchTreeName1.ecdAchTreeNameHighlight').first();
|
|
947
|
+
EsoAchTree_LastOpenTree = EsoAchTree_LastOpenTreeName.next(".ecdAchTreeContent1");
|
|
948
|
+
|
|
949
|
+
if (EsoAchTree_LastOpenTree.is($(this).next(".ecdAchTreeContent1"))) return;
|
|
950
|
+
|
|
951
|
+
EsoAchTree_LastOpenTree.slideUp();
|
|
952
|
+
EsoAchTree_LastOpenTreeName.removeClass('ecdAchTreeNameHighlight');
|
|
953
|
+
|
|
954
|
+
EsoAchTree_LastContentName = $('.ecdAchTreeNameHighlight2').first();
|
|
955
|
+
$('.ecdAchTreeNameHighlight2').removeClass("ecdAchTreeNameHighlight2");
|
|
956
|
+
//EsoAchTree_LastContentName.removeClass('ecdAchTreeNameHighlight2');
|
|
957
|
+
|
|
958
|
+
EsoAchTree_LastContent = $('.ecdAchData:visible').first();
|
|
959
|
+
EsoAchTree_LastContent.hide();
|
|
960
|
+
|
|
961
|
+
EsoAchTree_LastOpenTreeName = $(this);
|
|
962
|
+
EsoAchTree_LastOpenTree = EsoAchTree_LastOpenTreeName.next(".ecdAchTreeContent1");
|
|
963
|
+
|
|
964
|
+
EsoAchTree_LastOpenTreeName.addClass('ecdAchTreeNameHighlight');
|
|
965
|
+
EsoAchTree_LastOpenTree.slideDown();
|
|
966
|
+
|
|
967
|
+
SelectEsoAchievementTreeContents(EsoAchTree_LastOpenTree.children(".ecdAchTreeName2").first());
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
window.OnEsoAchievementTreeName2Click = function(e)
|
|
972
|
+
{
|
|
973
|
+
SelectEsoAchievementTreeContents($(this));
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
|
|
977
|
+
window.SelectEsoAchievementTreeContents = function(object)
|
|
978
|
+
{
|
|
979
|
+
EsoAchTree_LastContentName = $('.ecdAchTreeNameHighlight2').first();
|
|
980
|
+
EsoAchTree_LastContent = $('.ecdAchData:visible').first();
|
|
981
|
+
|
|
982
|
+
//EsoAchTree_LastContentName.removeClass('ecdAchTreeNameHighlight2');
|
|
983
|
+
$('.ecdAchTreeNameHighlight2').removeClass("ecdAchTreeNameHighlight2");
|
|
984
|
+
EsoAchTree_LastContent.hide();
|
|
985
|
+
|
|
986
|
+
EsoAchTree_LastContentName = object;
|
|
987
|
+
object.addClass('ecdAchTreeNameHighlight2');
|
|
988
|
+
|
|
989
|
+
var catName = EsoAchTree_LastOpenTreeName.attr("achcategory");
|
|
990
|
+
var subCatName = EsoAchTree_LastContentName.attr("achsubcategory");
|
|
991
|
+
|
|
992
|
+
var idName = "ecdAch_" + catName + "_" + subCatName;
|
|
993
|
+
if (subCatName == null || subCatName == "") idName = "ecdAch_" + catName;
|
|
994
|
+
|
|
995
|
+
idName = idName.replace(/ /g, "").replace(/'/g, "");
|
|
996
|
+
|
|
997
|
+
EsoAchTree_LastContent = $('#'+idName);
|
|
998
|
+
EsoAchTree_LastContent.show();
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
|
|
1002
|
+
window.OnEsoRightTitleClick = function(name, self)
|
|
1003
|
+
{
|
|
1004
|
+
$('.ecdRightTitleButtonEnabled').addClass("ecdRightTitleButtonDisabled").removeClass("ecdRightTitleButtonEnabled");
|
|
1005
|
+
$('.ecdTopLevelIcon').removeClass('selected');
|
|
1006
|
+
|
|
1007
|
+
$(self).children(".ecdTopLevelIcon").addClass('selected');
|
|
1008
|
+
|
|
1009
|
+
var idName = "#ecd" + name;
|
|
1010
|
+
var idButtonName = "#ecd" + name + "Button";
|
|
1011
|
+
$(idButtonName).removeClass("ecdRightTitleButtonDisabled").addClass("ecdRightTitleButtonEnabled");
|
|
1012
|
+
|
|
1013
|
+
$(".ecdRightDataArea").hide();
|
|
1014
|
+
|
|
1015
|
+
var newContent = $(idName);
|
|
1016
|
+
|
|
1017
|
+
CheckEsoContentForAsyncLoad(newContent, name);
|
|
1018
|
+
newContent.show();
|
|
1019
|
+
|
|
1020
|
+
UpdateEsoInventoryShownSpace();
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
|
|
1024
|
+
window.CheckEsoContentForAsyncLoad = function(element, contentId)
|
|
1025
|
+
{
|
|
1026
|
+
var asyncLoadElement = $(element).children(".ecdAsyncLoad");
|
|
1027
|
+
|
|
1028
|
+
if (asyncLoadElement.length < 1) return false;
|
|
1029
|
+
|
|
1030
|
+
/* Load inventory JSON data if required */
|
|
1031
|
+
if ($.isEmptyObject(ecdAllInventory) && (contentId == "Inventory" || contentId == "Bank" || contentId == "Craft" || contentId == "AccountInv"))
|
|
1032
|
+
{
|
|
1033
|
+
var queryParams = {}
|
|
1034
|
+
|
|
1035
|
+
queryParams['content'] = "AllInventoryJS";
|
|
1036
|
+
queryParams['id'] = ecdCharacterId;
|
|
1037
|
+
|
|
1038
|
+
$.ajax("//esochars.uesp.net/loadCharDataContents.php", {
|
|
1039
|
+
data: queryParams,
|
|
1040
|
+
}).
|
|
1041
|
+
done(function(data, status, xhr) { OnEsoCharDataJsonRequest(data, "AllInventoryJS", status, xhr); }).
|
|
1042
|
+
fail(function(xhr, status, errorMsg) { OnEsoCharDataJsonError(xhr, "AllInventoryJS", status, errorMsg); });
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
var queryParams = {}
|
|
1046
|
+
|
|
1047
|
+
queryParams['content'] = contentId;
|
|
1048
|
+
queryParams['id'] = ecdCharacterId;
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
|
|
1052
|
+
$.ajax("//esochars.uesp.net/loadCharDataContents.php", {
|
|
1053
|
+
data: queryParams,
|
|
1054
|
+
}).
|
|
1055
|
+
done(function(data, status, xhr) { OnEsoCharDataContentRequest(data, contentId, asyncLoadElement, status, xhr); }).
|
|
1056
|
+
fail(function(xhr, status, errorMsg) { OnEsoCharDataContentError(xhr, contentId, asyncLoadElement, status, errorMsg); });
|
|
1057
|
+
|
|
1058
|
+
return true;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
window.OnEsoCharDataContentRequest = function(data, contentId, element, status, xhr)
|
|
1063
|
+
{
|
|
1064
|
+
var parent = $(element).parent();
|
|
1065
|
+
|
|
1066
|
+
$(element).replaceWith(data);
|
|
1067
|
+
AddEsoCharDataAsyncHandlers(parent);
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
|
|
1071
|
+
window.OnEsoCharDataContentError = function(xhr, contentId, element, status, errorMsg)
|
|
1072
|
+
{
|
|
1073
|
+
EsoBuildLog("Error requesting char data content '" + contentId + "'!", errorMsg);
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
window.OnEsoCharDataJsonRequest = function(data, contentId, status, xhr)
|
|
1078
|
+
{
|
|
1079
|
+
if (contentId == "AllInventoryJS") ecdAllInventory = data;
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
|
|
1083
|
+
window.OnEsoCharDataJsonError = function(xhr, contentId, status, errorMsg)
|
|
1084
|
+
{
|
|
1085
|
+
EsoBuildLog("Error requesting char data JSON '" + contentId + "'!", errorMsg);
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
|
|
1089
|
+
window.OnItemFilter = function(name)
|
|
1090
|
+
{
|
|
1091
|
+
$('.ecdItemFilterContainer').removeClass("selected");
|
|
1092
|
+
|
|
1093
|
+
var idName = ".ecdItemFilter" + name;
|
|
1094
|
+
$(idName).addClass("selected");
|
|
1095
|
+
|
|
1096
|
+
var displayName = name.toUpperCase();
|
|
1097
|
+
|
|
1098
|
+
if (displayName == "ARMOR")
|
|
1099
|
+
displayName = "APPAREL";
|
|
1100
|
+
else if (displayName == "MATERIAL")
|
|
1101
|
+
displayName = "MATERIALS";
|
|
1102
|
+
else if (displayName == "MISC")
|
|
1103
|
+
displayName = "MISC";
|
|
1104
|
+
|
|
1105
|
+
$(".ecdItemFilterTextLabel").text(displayName);
|
|
1106
|
+
|
|
1107
|
+
g_EsoCharLastItemFilter = null;
|
|
1108
|
+
|
|
1109
|
+
DoItemFilter();
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
|
|
1113
|
+
window.ItemFilter_All = function(item)
|
|
1114
|
+
{
|
|
1115
|
+
return true;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
|
|
1119
|
+
window.ItemFilter_Armor = function(item)
|
|
1120
|
+
{
|
|
1121
|
+
return item.type == 2 || (item.type == 1 && item.weaponType == 14);
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
window.ItemFilter_Weapon = function(item)
|
|
1126
|
+
{
|
|
1127
|
+
return item.type == 1 && item.weaponType != 14;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
window.ItemFilter_Consumable = function(item)
|
|
1132
|
+
{
|
|
1133
|
+
return item.consumable != 0 && (
|
|
1134
|
+
item.type == 7 || item.type == 4 || item.type == 9 || item.type == 12 || item.type == 29 || item.type == 55 ||
|
|
1135
|
+
item.type == 57 || item.type == 30 || item.type == 18 || item.type == 5 || item.type == 47 || item.type == 6 ||
|
|
1136
|
+
item.type == 18 || item.type == 8 || item.type == 54 || item.type == 58);
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
window.ItemFilter_Material = function(item)
|
|
1141
|
+
{
|
|
1142
|
+
return item.type == 10 || item.type == 44 || item.type == 53 || item.type == 45 || item.type == 33 || item.type == 31 ||
|
|
1143
|
+
item.type == 39 || item.type == 37 || item.type == 35 || item.type == 38 || item.type == 40 || item.type == 52 ||
|
|
1144
|
+
item.type == 36 || item.type == 51 || item.type == 17 || item.type == 42 || item.type == 46 || item.type == 41 ||
|
|
1145
|
+
item.type == 17 || item.type == 43;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
|
|
1149
|
+
window.ItemFilter_Misc = function(item)
|
|
1150
|
+
{
|
|
1151
|
+
return item.type == 56 || item.type == 48 || item.type == 19 || item.type == 9 || item.type == 29 || item.type == 55 ||
|
|
1152
|
+
item.type == 57 || item.type == 30 || item.type == 18 || item.type == 5 || item.type == 47 || item.type == 6 ||
|
|
1153
|
+
item.type == 26 || item.type == 21 || item.type == 20;
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
window.ItemFilter_Quest = function(item)
|
|
1158
|
+
{
|
|
1159
|
+
//TODO
|
|
1160
|
+
return false;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
window.ItemFilter_Junk = function(item)
|
|
1165
|
+
{
|
|
1166
|
+
return item.junk != 0;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
window.ITEM_FILTER_FUNCTIONS = {
|
|
1171
|
+
"ALL" : ItemFilter_All,
|
|
1172
|
+
"WEAPON" : ItemFilter_Weapon,
|
|
1173
|
+
"ARMOR" : ItemFilter_Armor,
|
|
1174
|
+
"CONSUMABLE" : ItemFilter_Consumable,
|
|
1175
|
+
"MATERIAL" : ItemFilter_Material,
|
|
1176
|
+
"MISC" : ItemFilter_Misc,
|
|
1177
|
+
"QUEST" : ItemFilter_Quest,
|
|
1178
|
+
"JUNK" : ItemFilter_Junk,
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
window.MatchFilterString = function(filterText, item)
|
|
1183
|
+
{
|
|
1184
|
+
if (filterText == "") return true;
|
|
1185
|
+
|
|
1186
|
+
if (item.nameLC.indexOf(filterText) != -1) return true;
|
|
1187
|
+
if (item.setNameLC.indexOf(filterText) != -1) return true;
|
|
1188
|
+
|
|
1189
|
+
return false;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
|
|
1193
|
+
window.g_EsoCharLastItemFilter = null;
|
|
1194
|
+
window.ESO_ITEMFILTER_UPDATEMS = 400;
|
|
1195
|
+
window.g_EsoItemFilterIsUpdating = false;
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
window.DoItemFilter = function()
|
|
1199
|
+
{
|
|
1200
|
+
var filterName = $(".ecdItemFilterContainer.selected").attr('itemfilter').toUpperCase();
|
|
1201
|
+
var filterText = $(".ecdItemFilterTextInput:visible").val().toLowerCase();
|
|
1202
|
+
var filterFunc = ITEM_FILTER_FUNCTIONS[filterName];
|
|
1203
|
+
|
|
1204
|
+
g_EsoItemFilterIsUpdating = false;
|
|
1205
|
+
if (filterFunc == null) filterFunc = ItemFilter_All;
|
|
1206
|
+
|
|
1207
|
+
if (filterText == g_EsoCharLastItemFilter) return;
|
|
1208
|
+
g_EsoCharLastItemFilter = filterText;
|
|
1209
|
+
|
|
1210
|
+
$(".ecdScrollContent tr").each(function() {
|
|
1211
|
+
var localId = $(this).attr('localid');
|
|
1212
|
+
var item = ecdAllInventory[localId];
|
|
1213
|
+
|
|
1214
|
+
if (item == null)
|
|
1215
|
+
{
|
|
1216
|
+
$(this).show();
|
|
1217
|
+
return;
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
if (!filterFunc(item)) {
|
|
1221
|
+
$(this).hide();
|
|
1222
|
+
return;
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
if (!MatchFilterString(filterText, item))
|
|
1226
|
+
{
|
|
1227
|
+
$(this).hide();
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
$(this).show();
|
|
1232
|
+
});
|
|
1233
|
+
|
|
1234
|
+
UpdateEsoInventoryShownSpace();
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
window.ESO_ITEMFILTER_UPDATE_MINTIME = 0.4;
|
|
1239
|
+
window.g_EsoCharUpdateItemFilterFlag = false;
|
|
1240
|
+
window.g_EsoCharUpdateItemLastRequest = 0;
|
|
1241
|
+
|
|
1242
|
+
|
|
1243
|
+
window.UpdateItemFilter = function()
|
|
1244
|
+
{
|
|
1245
|
+
g_EsoCharUpdateItemFilterFlag = true;
|
|
1246
|
+
g_EsoCharUpdateItemLastRequest = (new Date().getTime())/1000;
|
|
1247
|
+
|
|
1248
|
+
setTimeout(CheckEsoCharUpdateItemFilter, ESO_ITEMFILTER_UPDATE_MINTIME*501);
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
|
|
1252
|
+
window.CheckEsoCharUpdateItemFilter = function()
|
|
1253
|
+
{
|
|
1254
|
+
if (!g_EsoCharUpdateItemFilterFlag) return;
|
|
1255
|
+
|
|
1256
|
+
var currentTime = (new Date().getTime())/1000;
|
|
1257
|
+
|
|
1258
|
+
if (currentTime - g_EsoCharUpdateItemLastRequest > ESO_ITEMFILTER_UPDATE_MINTIME)
|
|
1259
|
+
{
|
|
1260
|
+
g_EsoCharUpdateItemFilterFlag = false;
|
|
1261
|
+
DoItemFilter();
|
|
1262
|
+
}
|
|
1263
|
+
else
|
|
1264
|
+
{
|
|
1265
|
+
setTimeout(CheckEsoCharUpdateItemFilter, ESO_ITEMFILTER_UPDATE_MINTIME*501);
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
window.copyToClipboard = function(self)
|
|
1271
|
+
{
|
|
1272
|
+
var textToCopy = $(self).text();
|
|
1273
|
+
copyTextToClipboard(textToCopy);
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
window.OnBuildTableAnchorClick = function(e)
|
|
1278
|
+
{
|
|
1279
|
+
e.stopPropagation();
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
window.OnBuildTableRowClick = function(e)
|
|
1284
|
+
{
|
|
1285
|
+
// Do nothing if on the first column (checkbox)
|
|
1286
|
+
if ($(this).index() == 0) return;
|
|
1287
|
+
|
|
1288
|
+
var anchor = $(this).parent().find(".ecdBuildLink");
|
|
1289
|
+
if (anchor.length == 0) return;
|
|
1290
|
+
|
|
1291
|
+
window.location.href = anchor.attr("href");
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
|
|
1295
|
+
window.copyTextToClipboard = function(textToCopy)
|
|
1296
|
+
{
|
|
1297
|
+
$("body")
|
|
1298
|
+
.append($('<input type="text" name="fname" class="textToCopyInput" style="opacity: 0; position: absolute;" />' )
|
|
1299
|
+
.val(textToCopy))
|
|
1300
|
+
.find(".textToCopyInput")
|
|
1301
|
+
.select();
|
|
1302
|
+
|
|
1303
|
+
try
|
|
1304
|
+
{
|
|
1305
|
+
var successful = document.execCommand('copy');
|
|
1306
|
+
var msg = successful ? 'successful' : 'unsuccessful';
|
|
1307
|
+
}
|
|
1308
|
+
catch (err)
|
|
1309
|
+
{
|
|
1310
|
+
window.prompt("To copy the text to clipboard: Ctrl+C, Enter", textToCopy);
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
$(".textToCopyInput").remove();
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
|
|
1317
|
+
window.UpdateBuildStatData = function(barIndex)
|
|
1318
|
+
{
|
|
1319
|
+
var prefix = "Computed:Bar" + barIndex + ":";
|
|
1320
|
+
|
|
1321
|
+
if (barIndex == null || barIndex == "") prefix = "Computed:";
|
|
1322
|
+
|
|
1323
|
+
if (window.g_EsoBuildLastInputValues == null) return;
|
|
1324
|
+
if (window.g_EsoBuildStatData == null) return;
|
|
1325
|
+
|
|
1326
|
+
for (var stat in g_EsoBuildStatData)
|
|
1327
|
+
{
|
|
1328
|
+
var value = g_EsoBuildStatData[stat];
|
|
1329
|
+
|
|
1330
|
+
if (!stat.startsWith(prefix)) continue;
|
|
1331
|
+
|
|
1332
|
+
stat = stat.substring(prefix.length);
|
|
1333
|
+
g_EsoBuildLastInputValues[stat] = +value;
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
g_EsoBuildLastInputValues.HealingDone /= 100;
|
|
1337
|
+
g_EsoBuildLastInputValues.DamageShield /= 100;
|
|
1338
|
+
g_EsoBuildLastInputValues.DamageDone /= 100;
|
|
1339
|
+
g_EsoBuildLastInputValues.MagicDamageDone /= 100;
|
|
1340
|
+
g_EsoBuildLastInputValues.PhysicalDamageDone /= 100;
|
|
1341
|
+
g_EsoBuildLastInputValues.ShockDamageDone /= 100;
|
|
1342
|
+
g_EsoBuildLastInputValues.FlameDamageDone /= 100;
|
|
1343
|
+
g_EsoBuildLastInputValues.FrostDamageDone /= 100;
|
|
1344
|
+
g_EsoBuildLastInputValues.PoisonDamageDone /= 100;
|
|
1345
|
+
g_EsoBuildLastInputValues.DiseaseDamageDone /= 100;
|
|
1346
|
+
g_EsoBuildLastInputValues.SingleTargetDamageDone /= 100;
|
|
1347
|
+
g_EsoBuildLastInputValues.DotDamageDone /= 100;
|
|
1348
|
+
g_EsoBuildLastInputValues.AOEDamageDone /= 100;
|
|
1349
|
+
g_EsoBuildLastInputValues.DirectDamageDone /= 100;
|
|
1350
|
+
g_EsoBuildLastInputValues.BleedDamage /= 100;
|
|
1351
|
+
g_EsoBuildLastInputValues.PetDamageDone /= 100;
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
window.ActivateBuildActionBar = function(barIndex)
|
|
1356
|
+
{
|
|
1357
|
+
if (barIndex < 1 || barIndex > 4) return;
|
|
1358
|
+
|
|
1359
|
+
var activeBar = $(".ecdActionBar" + barIndex);
|
|
1360
|
+
var weaponBarIndex = activeBar.attr("activeweaponbar");
|
|
1361
|
+
|
|
1362
|
+
$("#ecdActionBar .ecdActiveAbilityBar").removeClass("ecdActiveAbilityBar");
|
|
1363
|
+
activeBar.addClass("ecdActiveAbilityBar");
|
|
1364
|
+
|
|
1365
|
+
if (weaponBarIndex >= 1 && weaponBarIndex <= 2)
|
|
1366
|
+
{
|
|
1367
|
+
$("#ecdEquipSlots .ecdActiveAbilityBar").removeClass("ecdActiveAbilityBar");
|
|
1368
|
+
$("#ecdWeaponBar" + weaponBarIndex).addClass("ecdActiveAbilityBar");
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
$(".ecdStatBar").hide();
|
|
1372
|
+
$(".ecdStatBar1").hide();
|
|
1373
|
+
$(".ecdStatBar2").hide();
|
|
1374
|
+
$(".ecdStatBar3").hide();
|
|
1375
|
+
$(".ecdStatBar4").hide();
|
|
1376
|
+
|
|
1377
|
+
$(".ecdStatBar" + barIndex).show();
|
|
1378
|
+
|
|
1379
|
+
UpdateBuildStatData(barIndex);
|
|
1380
|
+
|
|
1381
|
+
if (barIndex >= 1 && barIndex <= 2)
|
|
1382
|
+
{
|
|
1383
|
+
$("#ecdEquipSlots .ecdActiveAbilityBar").removeClass("ecdActiveAbilityBar");
|
|
1384
|
+
$("#ecdWeaponBar" + barIndex).addClass("ecdActiveAbilityBar");
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
|
|
1390
|
+
window.OnBuildWeaponBar1Click = function(e)
|
|
1391
|
+
{
|
|
1392
|
+
ActivateBuildActionBar(1);
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
|
|
1396
|
+
window.OnBuildWeaponBar2Click = function(e)
|
|
1397
|
+
{
|
|
1398
|
+
ActivateBuildActionBar(2);
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
|
|
1402
|
+
window.OnBuildActionBar1Click = function(e)
|
|
1403
|
+
{
|
|
1404
|
+
ActivateBuildActionBar(1);
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
|
|
1408
|
+
window.OnBuildActionBar2Click = function(e)
|
|
1409
|
+
{
|
|
1410
|
+
ActivateBuildActionBar(2);
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
|
|
1414
|
+
window.OnBuildActionBar3Click = function(e)
|
|
1415
|
+
{
|
|
1416
|
+
ActivateBuildActionBar(3);
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
|
|
1420
|
+
window.OnBuildActionBar4Click = function(e)
|
|
1421
|
+
{
|
|
1422
|
+
ActivateBuildActionBar(4);
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
window.ecdItemOwnerWindow = null;
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
window.CreateItemOwnerWindow = function()
|
|
1430
|
+
{
|
|
1431
|
+
if (ecdItemOwnerWindow != null) return;
|
|
1432
|
+
|
|
1433
|
+
ecdItemOwnerWindow = $("<div/>")
|
|
1434
|
+
.addClass("ecdItemOwnerWindow")
|
|
1435
|
+
.attr('id', 'ecdItemOwnerWindow')
|
|
1436
|
+
.hide()
|
|
1437
|
+
.appendTo("body");
|
|
1438
|
+
|
|
1439
|
+
ecdItemOwnerWindow.html("<div class='ecdItemOwnerTitle'>Characters With Item</div><hr><div id='ecdItemOwnerData' class='ecdItemOwnerData'></div>");
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
window.CreateItemOwnerHtml = function(itemData)
|
|
1444
|
+
{
|
|
1445
|
+
var output = "";
|
|
1446
|
+
var summaryData = {};
|
|
1447
|
+
|
|
1448
|
+
for (var i = 0; i < itemData.characterIds.length; ++i)
|
|
1449
|
+
{
|
|
1450
|
+
var qnt = itemData.characterQnts[i];
|
|
1451
|
+
var charId = itemData.characterIds[i];
|
|
1452
|
+
|
|
1453
|
+
if (summaryData[charId] == null)
|
|
1454
|
+
summaryData[charId] = qnt;
|
|
1455
|
+
else
|
|
1456
|
+
summaryData[charId] += qnt;
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
for (var charId in summaryData)
|
|
1460
|
+
{
|
|
1461
|
+
var qnt = summaryData[charId];
|
|
1462
|
+
|
|
1463
|
+
var name = ecdCharacterNames[charId];
|
|
1464
|
+
if (name == null) name = "" + charId;
|
|
1465
|
+
|
|
1466
|
+
output += "<div class='ecdItemDataQnt'>" + qnt + "</div>";
|
|
1467
|
+
output += "<div class='ecdItemDataName'>" + name + "</div>";
|
|
1468
|
+
output += "<br/>\n";
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
return output;
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
window.ShowItemOwnerWindow = function(element, itemData)
|
|
1476
|
+
{
|
|
1477
|
+
CreateItemOwnerWindow();
|
|
1478
|
+
|
|
1479
|
+
ecdItemOwnerWindow.find('#ecdItemOwnerData').html(CreateItemOwnerHtml(itemData));
|
|
1480
|
+
ecdItemOwnerWindow.show();
|
|
1481
|
+
|
|
1482
|
+
var top = element.offset().top + 30;
|
|
1483
|
+
var left = element.offset().left + 350;
|
|
1484
|
+
|
|
1485
|
+
ecdItemOwnerWindow.offset({ top: top, left: left });
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
window.OnItemRowClick = function(e)
|
|
1490
|
+
{
|
|
1491
|
+
|
|
1492
|
+
var localId = $(this).attr("localid");
|
|
1493
|
+
if (localId == null) return;
|
|
1494
|
+
|
|
1495
|
+
var itemData = ecdAllInventory[localId];
|
|
1496
|
+
if (itemData == null) return;
|
|
1497
|
+
|
|
1498
|
+
ShowItemOwnerWindow($(this), itemData);
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
|
|
1502
|
+
window.OnItemRowLeave = function(e)
|
|
1503
|
+
{
|
|
1504
|
+
if (ecdItemOwnerWindow) ecdItemOwnerWindow.hide();
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
window.DoesEsoItemLinkHaveEvent = function()
|
|
1509
|
+
{
|
|
1510
|
+
if (ShowEsoItemLinkPopup != null) return true;
|
|
1511
|
+
|
|
1512
|
+
//var events = $._data($(".eso_item_link").get(0), 'events');
|
|
1513
|
+
//if (events['mouseover'] != null || events['mouseout'] != null) return true;
|
|
1514
|
+
|
|
1515
|
+
return false;
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
|
|
1519
|
+
window.OnSlideAchievementComplete = function()
|
|
1520
|
+
{
|
|
1521
|
+
SlideAchievementIntoView($(this).parent());
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
|
|
1525
|
+
window.SlideAchievementIntoView = function(element, instant)
|
|
1526
|
+
{
|
|
1527
|
+
var offsetTop = element.position().top;
|
|
1528
|
+
var parent = element.parent(".ecdAchData");
|
|
1529
|
+
var nextTop = offsetTop + element.height() + 25;
|
|
1530
|
+
var bottomScroll = parent.scrollTop() + parent.height();
|
|
1531
|
+
var delay = 400;
|
|
1532
|
+
|
|
1533
|
+
if (instant) delay = 0;
|
|
1534
|
+
|
|
1535
|
+
if (offsetTop < 0)
|
|
1536
|
+
{
|
|
1537
|
+
parent.animate({
|
|
1538
|
+
scrollTop: offsetTop + parent.scrollTop(),
|
|
1539
|
+
}, delay);
|
|
1540
|
+
}
|
|
1541
|
+
else if (nextTop > parent.height())
|
|
1542
|
+
{
|
|
1543
|
+
parent.animate({
|
|
1544
|
+
scrollTop: nextTop - parent.height() + parent.scrollTop(),
|
|
1545
|
+
}, delay);
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
window.OnAchievementClick = function()
|
|
1551
|
+
{
|
|
1552
|
+
var dataBlock = $(this).children(".ecdAchDataBlock");
|
|
1553
|
+
dataBlock.slideToggle(400, OnSlideAchievementComplete);
|
|
1554
|
+
|
|
1555
|
+
if (dataBlock.length == 0) SlideAchievementIntoView($(this));
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
|
|
1559
|
+
window.lastAchSearchText = "";
|
|
1560
|
+
window.lastAchSearchPos = -1;
|
|
1561
|
+
window.lastAchSearchElement = null;
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
window.OnFindEsoCharAchievement = function(element)
|
|
1565
|
+
{
|
|
1566
|
+
var text = $("#ecdFindAchInput").val().trim().toLowerCase();
|
|
1567
|
+
if (text == "") return;
|
|
1568
|
+
|
|
1569
|
+
if (text != lastAchSearchText)
|
|
1570
|
+
{
|
|
1571
|
+
lastAchSearchText = text;
|
|
1572
|
+
lastAchSearchPos = -1;
|
|
1573
|
+
lastAchSearchElement = null;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
FindEsoCharNextAchievement();
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
window.FindEsoCharNextAchievement = function()
|
|
1581
|
+
{
|
|
1582
|
+
var isFound = false;
|
|
1583
|
+
|
|
1584
|
+
$(".ecdAchSearchHighlight").removeClass("ecdAchSearchHighlight");
|
|
1585
|
+
|
|
1586
|
+
$(".ecdAchName, .ecdAchDesc, .ecdAchReward, .ecdAchCriteria, .ecdAchListItem img").each(function(index) {
|
|
1587
|
+
if (index <= lastAchSearchPos) return true;
|
|
1588
|
+
var $this = $(this);
|
|
1589
|
+
var text = $this.text().toLowerCase();
|
|
1590
|
+
var title = $this.attr("title");
|
|
1591
|
+
if (title == null) title = "";
|
|
1592
|
+
title = title.toLowerCase();
|
|
1593
|
+
|
|
1594
|
+
lastAchSearchPos = index;
|
|
1595
|
+
|
|
1596
|
+
if (text.indexOf(lastAchSearchText) >= 0 || title.indexOf(lastAchSearchText) >= 0)
|
|
1597
|
+
{
|
|
1598
|
+
var achievement = $this.closest(".ecdAchievement1");
|
|
1599
|
+
if (lastAchSearchElement != null && achievement.is(lastAchSearchElement)) return true;
|
|
1600
|
+
|
|
1601
|
+
lastAchSearchElement = achievement;
|
|
1602
|
+
SelectFoundAchievement($this);
|
|
1603
|
+
isFound = true;
|
|
1604
|
+
return false
|
|
1605
|
+
}
|
|
1606
|
+
});
|
|
1607
|
+
|
|
1608
|
+
if (!isFound)
|
|
1609
|
+
{
|
|
1610
|
+
lastAchSearchText = "";
|
|
1611
|
+
lastAchSearchPos = -1;
|
|
1612
|
+
lastAchSearchElement = null;
|
|
1613
|
+
$(".ecdFindAchTextBox button").text("Done!");
|
|
1614
|
+
}
|
|
1615
|
+
else
|
|
1616
|
+
{
|
|
1617
|
+
$(".ecdFindAchTextBox button").text("Find Next");
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
|
|
1622
|
+
window.SelectFoundAchievement = function(element)
|
|
1623
|
+
{
|
|
1624
|
+
var achievement = $(element).closest(".ecdAchievement1");
|
|
1625
|
+
var parent = $(element).closest(".ecdAchData");
|
|
1626
|
+
var parentId = parent.attr("id");
|
|
1627
|
+
var catData = parentId.split("_");
|
|
1628
|
+
var catName = catData[1];
|
|
1629
|
+
var subCatName = catData[2];
|
|
1630
|
+
var currentCat = $(".ecdAchTreeNameHighlight").attr("achcategory");
|
|
1631
|
+
var currentSubCat = $(".ecdAchTreeNameHighlight2").attr("achsubcategory");
|
|
1632
|
+
|
|
1633
|
+
if (currentCat != catName)
|
|
1634
|
+
{
|
|
1635
|
+
$(".ecdAchTreeContent1:visible").slideUp();
|
|
1636
|
+
$(".ecdAchTreeNameHighlight").removeClass("ecdAchTreeNameHighlight");
|
|
1637
|
+
|
|
1638
|
+
EsoAchTree_LastOpenTreeName = $(".ecdAchTreeName1[achcategory='" + catName + "']");
|
|
1639
|
+
EsoAchTree_LastOpenTreeName.addClass("ecdAchTreeNameHighlight");
|
|
1640
|
+
|
|
1641
|
+
EsoAchTree_LastOpenTree = EsoAchTree_LastOpenTreeName.next(".ecdAchTreeContent1");
|
|
1642
|
+
EsoAchTree_LastOpenTree.slideDown();
|
|
1643
|
+
|
|
1644
|
+
currentSubCat = "";
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
if (currentSubCat != subCatName)
|
|
1648
|
+
{
|
|
1649
|
+
$(".ecdAchTreeNameHighlight2").removeClass("ecdAchTreeNameHighlight2");
|
|
1650
|
+
|
|
1651
|
+
EsoAchTree_LastOpenTreeName = $(".ecdAchTreeNameHighlight");
|
|
1652
|
+
EsoAchTree_LastOpenTree = EsoAchTree_LastOpenTreeName.next(".ecdAchTreeContent1");
|
|
1653
|
+
|
|
1654
|
+
EsoAchTree_LastContentName = $(".ecdAchTreeName2[achsubcategory='" + subCatName + "']");
|
|
1655
|
+
EsoAchTree_LastContentName.addClass('ecdAchTreeNameHighlight2');
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
$(".ecdAchData:visible").hide();
|
|
1659
|
+
EsoAchTree_LastContent = parent;
|
|
1660
|
+
parent.show();
|
|
1661
|
+
|
|
1662
|
+
achievement.addClass("ecdAchSearchHighlight");
|
|
1663
|
+
var dataBlock = achievement.children(".ecdAchDataBlock");
|
|
1664
|
+
if (dataBlock.length > 0) dataBlock.slideDown(0, OnSlideAchievementComplete);
|
|
1665
|
+
|
|
1666
|
+
SlideAchievementIntoView(achievement, true);
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
|
|
1670
|
+
window.lastRecipeSearchText = "";
|
|
1671
|
+
window.lastRecipeSearchPos = -1;
|
|
1672
|
+
window.lastRecipeSearchElement = null;
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
window.OnEsoCharDataSearchRecipe = function(event)
|
|
1676
|
+
{
|
|
1677
|
+
var searchText = $("#ecdSkillRecipesSearchInput").val().trim().toLowerCase();
|
|
1678
|
+
if (searchText == "") return;
|
|
1679
|
+
|
|
1680
|
+
if (searchText != lastRecipeSearchText)
|
|
1681
|
+
{
|
|
1682
|
+
lastRecipeSearchText = searchText;
|
|
1683
|
+
lastRecipeSearchPos = -1;
|
|
1684
|
+
lastRecipeSearchElement = null;
|
|
1685
|
+
}
|
|
1686
|
+
|
|
1687
|
+
FindEsoCharNextRecipe();
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+
window.FindEsoCharNextRecipe = function()
|
|
1693
|
+
{
|
|
1694
|
+
var isFound = false;
|
|
1695
|
+
|
|
1696
|
+
$(".ecdRecipeSearchHighlight").removeClass("ecdRecipeSearchHighlight");
|
|
1697
|
+
|
|
1698
|
+
$(".ecdRecipeItem").each(function(index) {
|
|
1699
|
+
|
|
1700
|
+
if (index <= lastRecipeSearchPos) return true;
|
|
1701
|
+
|
|
1702
|
+
var $this = $(this);
|
|
1703
|
+
var text = $this.text().toLowerCase();
|
|
1704
|
+
|
|
1705
|
+
lastRecipeSearchPos = index;
|
|
1706
|
+
|
|
1707
|
+
if (text.indexOf(lastRecipeSearchText) >= 0)
|
|
1708
|
+
{
|
|
1709
|
+
if (lastRecipeSearchElement != null && $this.is(lastRecipeSearchElement)) return true;
|
|
1710
|
+
|
|
1711
|
+
lastRecipeSearchElement = $this;
|
|
1712
|
+
SelectFoundEsoCharRecipe($this);
|
|
1713
|
+
isFound = true;
|
|
1714
|
+
return false
|
|
1715
|
+
}
|
|
1716
|
+
});
|
|
1717
|
+
|
|
1718
|
+
if (!isFound)
|
|
1719
|
+
{
|
|
1720
|
+
lastRecipeSearchText = "";
|
|
1721
|
+
lastRecipeSearchPos = -1;
|
|
1722
|
+
lastRecipeSearchElement = null;
|
|
1723
|
+
$("#ecdSkillRecipesSearchBlock button").text("Done!");
|
|
1724
|
+
}
|
|
1725
|
+
else
|
|
1726
|
+
{
|
|
1727
|
+
$("#ecdSkillRecipesSearchBlock button").text("Next...");
|
|
1728
|
+
}
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
window.SelectFoundEsoCharRecipe = function(element, instant)
|
|
1733
|
+
{
|
|
1734
|
+
element.addClass("ecdRecipeSearchHighlight");
|
|
1735
|
+
|
|
1736
|
+
var offsetTop = element.position().top;
|
|
1737
|
+
var parentList = element.parent(".ecdRecipeList");
|
|
1738
|
+
var parent = parentList.parent("#ecdSkill_Recipes");
|
|
1739
|
+
var nextTop = offsetTop + element.height() + 25;
|
|
1740
|
+
var bottomScroll = parent.scrollTop() + parent.height();
|
|
1741
|
+
var delay = 400;
|
|
1742
|
+
|
|
1743
|
+
if (!parentList.is(":visible"))
|
|
1744
|
+
{
|
|
1745
|
+
SetRecipeTitleArrow(parentList.prev(".ecdRecipeTitle"), true);
|
|
1746
|
+
parentList.show(0, function() { SelectFoundEsoCharRecipe(element, instant); });
|
|
1747
|
+
return;
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
if (instant) delay = 0;
|
|
1751
|
+
|
|
1752
|
+
if (offsetTop < 0)
|
|
1753
|
+
{
|
|
1754
|
+
parent.animate({
|
|
1755
|
+
scrollTop: offsetTop + parent.scrollTop(),
|
|
1756
|
+
}, delay);
|
|
1757
|
+
}
|
|
1758
|
+
else if (nextTop > parent.height())
|
|
1759
|
+
{
|
|
1760
|
+
parent.animate({
|
|
1761
|
+
scrollTop: nextTop - parent.height() + parent.scrollTop(),
|
|
1762
|
+
}, delay);
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1766
|
+
|
|
1767
|
+
window.OnEsoRecipeScroll = function(event)
|
|
1768
|
+
{
|
|
1769
|
+
$("#ecdSkillRecipesSearchBlock").css('top', $("#ecdSkill_Recipes").scrollTop());
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
window.UpdateEsoInventoryShownSpace = function()
|
|
1774
|
+
{
|
|
1775
|
+
$(".ecdInvShowSpaceLabel").text("");
|
|
1776
|
+
|
|
1777
|
+
setTimeout(UpdateEsoInventoryShownSpace_Async, 100);
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
|
|
1781
|
+
window.UpdateEsoInventoryShownSpace_Async = function()
|
|
1782
|
+
{
|
|
1783
|
+
var shownItems = $(".ecdItemTable tr.eso_item_link:visible");
|
|
1784
|
+
var numItems = 0;
|
|
1785
|
+
var totalItems = 0;
|
|
1786
|
+
|
|
1787
|
+
numItems = shownItems.length;
|
|
1788
|
+
//$(".ecdInvShowSpaceLabel").text("" + numItems + " shown");
|
|
1789
|
+
//return;
|
|
1790
|
+
|
|
1791
|
+
shownItems.each(function() {
|
|
1792
|
+
var itemIndex = parseInt($(this).attr("localid"));
|
|
1793
|
+
var itemData = ecdAllInventory[itemIndex];
|
|
1794
|
+
if (itemData == null) return true;
|
|
1795
|
+
|
|
1796
|
+
if (itemData.qnt == null)
|
|
1797
|
+
totalItems += 1;
|
|
1798
|
+
else
|
|
1799
|
+
totalItems += parseInt(itemData.qnt);
|
|
1800
|
+
|
|
1801
|
+
return true;
|
|
1802
|
+
});
|
|
1803
|
+
|
|
1804
|
+
if (numItems == totalItems)
|
|
1805
|
+
$(".ecdInvShowSpaceLabel").text("" + numItems + " shown");
|
|
1806
|
+
else
|
|
1807
|
+
$(".ecdInvShowSpaceLabel").text("" + numItems + " shown (" + totalItems + " total)");
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
window.OnRecipeTitleClick = function(e)
|
|
1812
|
+
{
|
|
1813
|
+
var recipeList = $(this).next(".ecdRecipeList");
|
|
1814
|
+
|
|
1815
|
+
SetRecipeTitleArrow(this, !recipeList.is(":visible"));
|
|
1816
|
+
|
|
1817
|
+
recipeList.slideToggle();
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
window.SetRecipeTitleArrow = function(element, visible)
|
|
1822
|
+
{
|
|
1823
|
+
var recipeArrow = $(element).children(".ecdRecipeTitleArrow");
|
|
1824
|
+
|
|
1825
|
+
if (visible)
|
|
1826
|
+
recipeArrow.html("▲");
|
|
1827
|
+
else
|
|
1828
|
+
recipeArrow.html("▼");
|
|
1829
|
+
|
|
1830
|
+
}
|
|
1831
|
+
|
|
1832
|
+
|
|
1833
|
+
window.OnQuestZoneTitleClick = function(e)
|
|
1834
|
+
{
|
|
1835
|
+
var lastOpenQuestZone = $(".ecdQuestZoneTitle.ecdQuestSelected").first();
|
|
1836
|
+
if (lastOpenQuestZone.is($(this))) return;
|
|
1837
|
+
|
|
1838
|
+
lastOpenQuestZone.removeClass("ecdQuestSelected");
|
|
1839
|
+
lastOpenQuestZone.next(".ecdQuestZoneList").slideUp();
|
|
1840
|
+
|
|
1841
|
+
$(this).addClass("ecdQuestSelected");
|
|
1842
|
+
var questList = $(this).next(".ecdQuestZoneList");
|
|
1843
|
+
|
|
1844
|
+
questList.slideDown();
|
|
1845
|
+
|
|
1846
|
+
$(".ecdQuestName.ecdQuestSelected").removeClass("ecdQuestSelected");
|
|
1847
|
+
|
|
1848
|
+
var firstQuest = questList.children(".ecdQuestName").first();
|
|
1849
|
+
firstQuest.addClass('ecdQuestSelected');
|
|
1850
|
+
|
|
1851
|
+
var journalIndex = firstQuest.attr("journalindex");
|
|
1852
|
+
|
|
1853
|
+
if (journalIndex != null )
|
|
1854
|
+
{
|
|
1855
|
+
$(".ecdQuestDetail:visible").hide(0);
|
|
1856
|
+
$("#ecdQuestJournal" + journalIndex).show(0);
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
|
|
1861
|
+
window.OnQuestZoneTitle1Click = function(e)
|
|
1862
|
+
{
|
|
1863
|
+
var questList = $(this).next(".ecdQuestZoneList1");
|
|
1864
|
+
questList.slideToggle();
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1867
|
+
|
|
1868
|
+
window.OnQuestNameClick = function(e)
|
|
1869
|
+
{
|
|
1870
|
+
var lastOpenQuest = $(".ecdQuestName.ecdQuestSelected").first();
|
|
1871
|
+
if (lastOpenQuest.is($(this))) return;
|
|
1872
|
+
|
|
1873
|
+
lastOpenQuest.removeClass("ecdQuestSelected");
|
|
1874
|
+
|
|
1875
|
+
$(this).addClass("ecdQuestSelected");
|
|
1876
|
+
|
|
1877
|
+
var journalIndex = $(this).attr("journalindex");
|
|
1878
|
+
|
|
1879
|
+
if (journalIndex != null)
|
|
1880
|
+
{
|
|
1881
|
+
$(".ecdQuestDetail:visible").hide(0);
|
|
1882
|
+
$("#ecdQuestJournal" + journalIndex).show(0);
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
|
|
1886
|
+
|
|
1887
|
+
window.UpdateFirstQuestDetails = function()
|
|
1888
|
+
{
|
|
1889
|
+
var firstQuest = $(".ecdQuestZoneTitle.ecdQuestSelected").next(".ecdQuestZoneList").children(".ecdQuestName").first()[0];
|
|
1890
|
+
|
|
1891
|
+
if (firstQuest) OnQuestNameClick.call(firstQuest, null);
|
|
1892
|
+
}
|
|
1893
|
+
|
|
1894
|
+
|
|
1895
|
+
window.lastEsoAllQuestSearchText = "";
|
|
1896
|
+
window.lastEsoAllQuestSearchPos = -1;
|
|
1897
|
+
window.lastEsoAllQuestSearchElement = null;
|
|
1898
|
+
|
|
1899
|
+
|
|
1900
|
+
window.OnEsoCharDataSearchAllQuests = function()
|
|
1901
|
+
{
|
|
1902
|
+
var text = $("#ecdQuestAllSearchText").val().trim().toLowerCase();
|
|
1903
|
+
if (text == "") return;
|
|
1904
|
+
|
|
1905
|
+
if (text != lastEsoAllQuestSearchText)
|
|
1906
|
+
{
|
|
1907
|
+
lastEsoAllQuestSearchText = text;
|
|
1908
|
+
lastEsoAllQuestSearchPos = -1;
|
|
1909
|
+
lastEsoAllQuestSearchElement = null;
|
|
1910
|
+
}
|
|
1911
|
+
|
|
1912
|
+
FindEsoCharNextAllQuest();
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
|
|
1916
|
+
window.FindEsoCharNextAllQuest = function()
|
|
1917
|
+
{
|
|
1918
|
+
var isFound = false;
|
|
1919
|
+
|
|
1920
|
+
$(".ecdQuestSearchHighlight").removeClass("ecdQuestSearchHighlight");
|
|
1921
|
+
|
|
1922
|
+
$("#ecdQuestJournalAll .ecdQuestName1").each(function(index) {
|
|
1923
|
+
if (index <= lastEsoAllQuestSearchPos) return true;
|
|
1924
|
+
var $this = $(this);
|
|
1925
|
+
var text = $this.text().toLowerCase();
|
|
1926
|
+
|
|
1927
|
+
lastEsoAllQuestSearchPos = index;
|
|
1928
|
+
|
|
1929
|
+
if (text.indexOf(lastEsoAllQuestSearchText) >= 0)
|
|
1930
|
+
{
|
|
1931
|
+
if (lastEsoAllQuestSearchElement != null && $this.is(lastEsoAllQuestSearchElement)) return true;
|
|
1932
|
+
|
|
1933
|
+
lastEsoAllQuestSearchElement = $this;
|
|
1934
|
+
SelectFoundEsoAllQuest($this);
|
|
1935
|
+
isFound = true;
|
|
1936
|
+
return false
|
|
1937
|
+
}
|
|
1938
|
+
});
|
|
1939
|
+
|
|
1940
|
+
if (!isFound)
|
|
1941
|
+
{
|
|
1942
|
+
lastEsoAllQuestSearchText = "";
|
|
1943
|
+
lastEsoAllQuestSearchPos = -1;
|
|
1944
|
+
lastEsoAllQuestSearchElement = null;
|
|
1945
|
+
$("#ecdQuestAllSearchForm button").text("Done!");
|
|
1946
|
+
}
|
|
1947
|
+
else
|
|
1948
|
+
{
|
|
1949
|
+
$("#ecdQuestAllSearchForm button").text("Find Next");
|
|
1950
|
+
}
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
|
|
1954
|
+
window.SelectFoundEsoAllQuest = function(quest)
|
|
1955
|
+
{
|
|
1956
|
+
var questList = $(quest).parent(".ecdQuestZoneList1");
|
|
1957
|
+
|
|
1958
|
+
if (!questList.is(":visible")) questList.show(0);
|
|
1959
|
+
|
|
1960
|
+
quest.addClass("ecdQuestSearchHighlight");
|
|
1961
|
+
|
|
1962
|
+
SlideEsoQuestIntoView(quest, true);
|
|
1963
|
+
}
|
|
1964
|
+
|
|
1965
|
+
|
|
1966
|
+
window.SlideEsoQuestIntoView = function(element, instant)
|
|
1967
|
+
{
|
|
1968
|
+
var offsetTop = element.position().top - 200;
|
|
1969
|
+
var parent = element.parents(".ecdQuestDetail");
|
|
1970
|
+
var nextTop = offsetTop + element.height() + 225;
|
|
1971
|
+
var bottomScroll = parent.scrollTop() + parent.height();
|
|
1972
|
+
var delay = 400;
|
|
1973
|
+
|
|
1974
|
+
if (instant) delay = 0;
|
|
1975
|
+
|
|
1976
|
+
if (offsetTop < 0)
|
|
1977
|
+
{
|
|
1978
|
+
parent.animate({
|
|
1979
|
+
scrollTop: offsetTop + parent.scrollTop(),
|
|
1980
|
+
}, delay);
|
|
1981
|
+
}
|
|
1982
|
+
else if (nextTop > parent.height())
|
|
1983
|
+
{
|
|
1984
|
+
parent.animate({
|
|
1985
|
+
scrollTop: nextTop - parent.height() + parent.scrollTop(),
|
|
1986
|
+
}, delay);
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
|
|
1991
|
+
window.OnEsoBookCollectionClick = function(e)
|
|
1992
|
+
{
|
|
1993
|
+
var categoryIndex = $(this).attr("categoryindex");
|
|
1994
|
+
var collectionIndex = $(this).attr("collectionindex");
|
|
1995
|
+
|
|
1996
|
+
$(".ecdBookList:visible").hide(0);
|
|
1997
|
+
$("#ecdBookList_"+categoryIndex+"_"+collectionIndex).show(0);
|
|
1998
|
+
|
|
1999
|
+
$(".ecdBookCollectionSelected").removeClass("ecdBookCollectionSelected");
|
|
2000
|
+
$(this).addClass("ecdBookCollectionSelected");
|
|
2001
|
+
}
|
|
2002
|
+
|
|
2003
|
+
|
|
2004
|
+
window.OnEsoBookCategoryClick = function(e)
|
|
2005
|
+
{
|
|
2006
|
+
var currentCategory = $(".ecdBookCategorySelected").first();
|
|
2007
|
+
if ($(this).is(currentCategory)) return;
|
|
2008
|
+
|
|
2009
|
+
currentCategory.removeClass("ecdBookCategorySelected");
|
|
2010
|
+
$(".ecdBookCollectionList:visible").slideUp();
|
|
2011
|
+
|
|
2012
|
+
$(this).addClass('ecdBookCategorySelected');
|
|
2013
|
+
|
|
2014
|
+
var nextList = $(this).next(".ecdBookCollectionList");
|
|
2015
|
+
var firstBook = nextList.children(".ecdBookCollection").first();
|
|
2016
|
+
|
|
2017
|
+
nextList.slideDown();
|
|
2018
|
+
|
|
2019
|
+
var categoryIndex = firstBook.attr("categoryindex");
|
|
2020
|
+
var collectionIndex = firstBook.attr("collectionindex");
|
|
2021
|
+
|
|
2022
|
+
$(".ecdBookList:visible").hide(0);
|
|
2023
|
+
$("#ecdBookList_"+categoryIndex+"_"+collectionIndex).show(0);
|
|
2024
|
+
|
|
2025
|
+
$(".ecdBookCollectionSelected").removeClass("ecdBookCollectionSelected");
|
|
2026
|
+
firstBook.addClass("ecdBookCollectionSelected");
|
|
2027
|
+
}
|
|
2028
|
+
|
|
2029
|
+
|
|
2030
|
+
window.OnEsoCharDataSearchBooks = function()
|
|
2031
|
+
{
|
|
2032
|
+
var text = $("#ecdBookSearchText").val().trim().toLowerCase();
|
|
2033
|
+
if (text == "") return;
|
|
2034
|
+
|
|
2035
|
+
if (text != lastEsoBookSearchText)
|
|
2036
|
+
{
|
|
2037
|
+
lastEsoBookSearchText = text;
|
|
2038
|
+
lastEsoBookSearchPos = -1;
|
|
2039
|
+
lastEsoBookSearchElement = null;
|
|
2040
|
+
}
|
|
2041
|
+
|
|
2042
|
+
FindEsoCharNextBook();
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
|
|
2046
|
+
window.FindEsoCharNextBook = function()
|
|
2047
|
+
{
|
|
2048
|
+
var isFound = false;
|
|
2049
|
+
|
|
2050
|
+
$(".ecdBookSearchHighlight").removeClass("ecdBookSearchHighlight");
|
|
2051
|
+
|
|
2052
|
+
$(".ecdBookLine").each(function(index) {
|
|
2053
|
+
if (index <= lastEsoBookSearchPos) return true;
|
|
2054
|
+
var $this = $(this);
|
|
2055
|
+
var text = $this.text().toLowerCase();
|
|
2056
|
+
|
|
2057
|
+
lastEsoBookSearchPos = index;
|
|
2058
|
+
|
|
2059
|
+
if (text.indexOf(lastEsoBookSearchText) >= 0)
|
|
2060
|
+
{
|
|
2061
|
+
if (lastEsoBookSearchElement != null && $this.is(lastEsoBookSearchElement)) return true;
|
|
2062
|
+
|
|
2063
|
+
lastEsoBookSearchElement = $this;
|
|
2064
|
+
SelectFoundEsoBook($this);
|
|
2065
|
+
isFound = true;
|
|
2066
|
+
return false
|
|
2067
|
+
}
|
|
2068
|
+
});
|
|
2069
|
+
|
|
2070
|
+
if (!isFound)
|
|
2071
|
+
{
|
|
2072
|
+
lastEsoBookSearchText = "";
|
|
2073
|
+
lastEsoBookSearchPos = -1;
|
|
2074
|
+
lastEsoBookSearchElement = null;
|
|
2075
|
+
$("#ecdBookSearchForm button").text("Done!");
|
|
2076
|
+
}
|
|
2077
|
+
else
|
|
2078
|
+
{
|
|
2079
|
+
$("#ecdBookSearchForm button").text("Find Next");
|
|
2080
|
+
}
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
|
|
2084
|
+
window.SelectFoundEsoBook = function(book)
|
|
2085
|
+
{
|
|
2086
|
+
var bookList = $(book).parent(".ecdBookList");
|
|
2087
|
+
|
|
2088
|
+
if (!bookList.is(":visible"))
|
|
2089
|
+
{
|
|
2090
|
+
$(".ecdBookList:visible").hide(0);
|
|
2091
|
+
bookList.show(0);
|
|
2092
|
+
|
|
2093
|
+
var categoryIndex = bookList.attr("categoryindex");
|
|
2094
|
+
var collectionIndex = bookList.attr("collectionindex");
|
|
2095
|
+
|
|
2096
|
+
$(".ecdBookCollectionSelected").removeClass("ecdBookCollectionSelected");
|
|
2097
|
+
|
|
2098
|
+
var collection = $(".ecdBookCollection[categoryindex='" + categoryIndex + "'][collectionindex='" + collectionIndex + "']");
|
|
2099
|
+
var collectionList = collection.parent(".ecdBookCollectionList");
|
|
2100
|
+
collection.addClass("ecdBookCollectionSelected");
|
|
2101
|
+
|
|
2102
|
+
if (!collectionList.is(":visible"))
|
|
2103
|
+
{
|
|
2104
|
+
var currentCategory = $(".ecdBookCategorySelected").first();
|
|
2105
|
+
var newCategory = collectionList.prev(".ecdBookCategory");
|
|
2106
|
+
|
|
2107
|
+
currentCategory.removeClass("ecdBookCategorySelected");
|
|
2108
|
+
newCategory.addClass("ecdBookCategorySelected");
|
|
2109
|
+
|
|
2110
|
+
$(".ecdBookCollectionList:visible").hide(0);
|
|
2111
|
+
collectionList.show(0);
|
|
2112
|
+
}
|
|
2113
|
+
|
|
2114
|
+
SlideEsoBookCollectionIntoView(collection, true);
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
book.addClass("ecdBookSearchHighlight");
|
|
2118
|
+
|
|
2119
|
+
SlideEsoBookIntoView(book, true);
|
|
2120
|
+
}
|
|
2121
|
+
|
|
2122
|
+
|
|
2123
|
+
window.SlideEsoBookIntoView = function(element, instant)
|
|
2124
|
+
{
|
|
2125
|
+
var offsetTop = element.position().top - 200;
|
|
2126
|
+
var parent = element.parent(".ecdBookList");
|
|
2127
|
+
var nextTop = offsetTop + element.height() + 225;
|
|
2128
|
+
var bottomScroll = parent.scrollTop() + parent.height();
|
|
2129
|
+
var delay = 400;
|
|
2130
|
+
|
|
2131
|
+
if (instant) delay = 0;
|
|
2132
|
+
|
|
2133
|
+
if (offsetTop < 0)
|
|
2134
|
+
{
|
|
2135
|
+
parent.animate({
|
|
2136
|
+
scrollTop: offsetTop + parent.scrollTop(),
|
|
2137
|
+
}, delay);
|
|
2138
|
+
}
|
|
2139
|
+
else if (nextTop > parent.height())
|
|
2140
|
+
{
|
|
2141
|
+
parent.animate({
|
|
2142
|
+
scrollTop: nextTop - parent.height() + parent.scrollTop(),
|
|
2143
|
+
}, delay);
|
|
2144
|
+
}
|
|
2145
|
+
}
|
|
2146
|
+
|
|
2147
|
+
|
|
2148
|
+
window.SlideEsoBookCollectionIntoView = function(element, instant)
|
|
2149
|
+
{
|
|
2150
|
+
var offsetTop = element.position().top - 200;
|
|
2151
|
+
var parent = element.parents(".ecdBookTree");
|
|
2152
|
+
var nextTop = offsetTop + element.height() + 225;
|
|
2153
|
+
var bottomScroll = parent.scrollTop() + parent.height();
|
|
2154
|
+
var delay = 400;
|
|
2155
|
+
|
|
2156
|
+
if (instant) delay = 0;
|
|
2157
|
+
|
|
2158
|
+
if (offsetTop < 0)
|
|
2159
|
+
{
|
|
2160
|
+
parent.animate({
|
|
2161
|
+
scrollTop: offsetTop + parent.scrollTop(),
|
|
2162
|
+
}, delay);
|
|
2163
|
+
}
|
|
2164
|
+
else if (nextTop > parent.height())
|
|
2165
|
+
{
|
|
2166
|
+
parent.animate({
|
|
2167
|
+
scrollTop: nextTop - parent.height() + parent.scrollTop(),
|
|
2168
|
+
}, delay);
|
|
2169
|
+
}
|
|
2170
|
+
}
|
|
2171
|
+
|
|
2172
|
+
|
|
2173
|
+
window.g_EsoLastBookId = null;
|
|
2174
|
+
|
|
2175
|
+
|
|
2176
|
+
window.OnEsoBookClick = function(e)
|
|
2177
|
+
{
|
|
2178
|
+
var queryParams = {}
|
|
2179
|
+
var bookId = $(this).attr("bookid");
|
|
2180
|
+
|
|
2181
|
+
queryParams['table'] = 'book';
|
|
2182
|
+
queryParams['id'] = bookId;
|
|
2183
|
+
|
|
2184
|
+
g_EsoLastBookId = bookId;
|
|
2185
|
+
|
|
2186
|
+
$.ajax("//esolog.uesp.net/exportJson.php", {
|
|
2187
|
+
data: queryParams,
|
|
2188
|
+
}).
|
|
2189
|
+
done(function(data, status, xhr) { OnEsoBookDataRequest(data, status, xhr); }).
|
|
2190
|
+
fail(function(xhr, status, errorMsg) { OnEsoBookDataError(xhr, status, errorMsg); });
|
|
2191
|
+
|
|
2192
|
+
return true;
|
|
2193
|
+
}
|
|
2194
|
+
|
|
2195
|
+
|
|
2196
|
+
window.OnEsoBookDataRequest = function(data, status, xhr)
|
|
2197
|
+
{
|
|
2198
|
+
ShowEsoBook(data.book[0]);
|
|
2199
|
+
}
|
|
2200
|
+
|
|
2201
|
+
|
|
2202
|
+
window.OnEsoBookDataError = function(xhr, status, errorMsg)
|
|
2203
|
+
{
|
|
2204
|
+
EsoBuildLog("Error requesting book data!", errorMsg);
|
|
2205
|
+
}
|
|
2206
|
+
|
|
2207
|
+
|
|
2208
|
+
window.ShowEsoBook = function(book)
|
|
2209
|
+
{
|
|
2210
|
+
var bookRoot = $("#ecdBookRoot");
|
|
2211
|
+
var bookContents = $("#ecdBookContents");
|
|
2212
|
+
var output = "";
|
|
2213
|
+
|
|
2214
|
+
bookRoot.show(0);
|
|
2215
|
+
|
|
2216
|
+
$(document).on("click.OnEsoBookClickDocument", OnEsoBookClickDocument);
|
|
2217
|
+
|
|
2218
|
+
if (book == null)
|
|
2219
|
+
{
|
|
2220
|
+
output += "<div class='ecdBookTitle'>Unknown Book</div>";
|
|
2221
|
+
output += "<div class='ecdBookBody'>Failed to load data for book ID #" + g_EsoLastBookId + "!</div>";
|
|
2222
|
+
}
|
|
2223
|
+
else
|
|
2224
|
+
{
|
|
2225
|
+
output += "<div class='ecdBookTitle'>" + book.title + "</div>";
|
|
2226
|
+
output += "<div class='ecdBookBody'>" + book.body + "</div>";
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2229
|
+
bookContents.html(output);
|
|
2230
|
+
}
|
|
2231
|
+
|
|
2232
|
+
|
|
2233
|
+
window.OnEsoBookCloseClick = function()
|
|
2234
|
+
{
|
|
2235
|
+
var bookRoot = $("#ecdBookRoot");
|
|
2236
|
+
bookRoot.hide(0);
|
|
2237
|
+
}
|
|
2238
|
+
|
|
2239
|
+
|
|
2240
|
+
window.OnEsoBookClickDocument = function()
|
|
2241
|
+
{
|
|
2242
|
+
var bookRoot = $("#ecdBookRoot");
|
|
2243
|
+
bookRoot.hide(0);
|
|
2244
|
+
$(document).off("click.OnEsoBookClickDocument");
|
|
2245
|
+
}
|
|
2246
|
+
|
|
2247
|
+
|
|
2248
|
+
window.OnEsoCategoryCollectibleClick = function()
|
|
2249
|
+
{
|
|
2250
|
+
var lastCategory = $(".ecdCollectibleCategorySelected").first();
|
|
2251
|
+
if ($(this).is(lastCategory)) return;
|
|
2252
|
+
|
|
2253
|
+
lastCategory.removeClass('ecdCollectibleCategorySelected');
|
|
2254
|
+
$(this).addClass('ecdCollectibleCategorySelected');
|
|
2255
|
+
|
|
2256
|
+
$(".ecdCollectibleSubcategories:visible").slideUp();
|
|
2257
|
+
|
|
2258
|
+
var subCategoryList = $(this).next(".ecdCollectibleSubcategories");
|
|
2259
|
+
if (subCategoryList.text() != "") subCategoryList.slideDown();
|
|
2260
|
+
|
|
2261
|
+
$(".ecdCollectibleBlock:visible").hide(0);
|
|
2262
|
+
|
|
2263
|
+
var categoryIndex = $(this).attr('categoryindex');
|
|
2264
|
+
var subCategoryIndex = 0;
|
|
2265
|
+
var collectibleBlock = $("#ecdCollectible_" + categoryIndex + "_" + subCategoryIndex);
|
|
2266
|
+
|
|
2267
|
+
if (collectibleBlock.length > 0)
|
|
2268
|
+
{
|
|
2269
|
+
collectibleBlock.show(0);
|
|
2270
|
+
return;
|
|
2271
|
+
}
|
|
2272
|
+
|
|
2273
|
+
var firstSubcategory = $(this).next(".ecdCollectibleSubcategories").children(".ecdCollectibleSubcategory").first();
|
|
2274
|
+
|
|
2275
|
+
$(".ecdCollectibleSubcategorySelected").removeClass('ecdCollectibleSubcategorySelected');
|
|
2276
|
+
firstSubcategory.addClass('ecdCollectibleSubcategorySelected');
|
|
2277
|
+
|
|
2278
|
+
categoryIndex = firstSubcategory.attr('categoryindex');
|
|
2279
|
+
subCategoryIndex = firstSubcategory.attr('subcategoryindex');
|
|
2280
|
+
|
|
2281
|
+
$("#ecdCollectible_" + categoryIndex + "_" + subCategoryIndex).show(0);
|
|
2282
|
+
}
|
|
2283
|
+
|
|
2284
|
+
|
|
2285
|
+
window.OnEsoSubcategoryCollectibleClick = function()
|
|
2286
|
+
{
|
|
2287
|
+
var lastSubcategory = $(".ecdCollectibleSubcategorySelected").first();
|
|
2288
|
+
if ($(this).is(lastSubcategory)) return;
|
|
2289
|
+
|
|
2290
|
+
lastSubcategory.removeClass('ecdCollectibleSubcategorySelected');
|
|
2291
|
+
|
|
2292
|
+
$(this).addClass('ecdCollectibleSubcategorySelected');
|
|
2293
|
+
|
|
2294
|
+
$(".ecdCollectibleBlock:visible").hide(0);
|
|
2295
|
+
|
|
2296
|
+
var categoryIndex = $(this).attr('categoryindex');
|
|
2297
|
+
var subCategoryIndex = $(this).attr('subcategoryindex');
|
|
2298
|
+
|
|
2299
|
+
$("#ecdCollectible_" + categoryIndex + "_" + subCategoryIndex).show(0);
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
|
|
2303
|
+
window.OnEsoCollectionsMenuItemClick = function()
|
|
2304
|
+
{
|
|
2305
|
+
var collectible = $(this).attr("collectid");
|
|
2306
|
+
var title = $(this).attr("title");
|
|
2307
|
+
|
|
2308
|
+
$(".ecdCollectMenuItemSelected").removeClass("ecdCollectMenuItemSelected");
|
|
2309
|
+
$(this).addClass("ecdCollectMenuItemSelected");
|
|
2310
|
+
|
|
2311
|
+
$("#ecdCollectMenuTitle").text(title.toUpperCase());
|
|
2312
|
+
|
|
2313
|
+
$(".ecdCollectContents:visible").hide(0);
|
|
2314
|
+
$("#ecdCollectContents_"+collectible).show(0);
|
|
2315
|
+
}
|
|
2316
|
+
|
|
2317
|
+
|
|
2318
|
+
window.OnEsoCategoryOutfitClick = function()
|
|
2319
|
+
{
|
|
2320
|
+
var lastCategory = $(".ecdOutfitCategorySelected").first();
|
|
2321
|
+
if ($(this).is(lastCategory)) return;
|
|
2322
|
+
|
|
2323
|
+
lastCategory.removeClass('ecdOutfitCategorySelected');
|
|
2324
|
+
$(this).addClass('ecdOutfitCategorySelected');
|
|
2325
|
+
|
|
2326
|
+
$(".ecdOutfitSubcategories:visible").slideUp();
|
|
2327
|
+
|
|
2328
|
+
var subCategoryList = $(this).next(".ecdOutfitSubcategories");
|
|
2329
|
+
if (subCategoryList.text() != "") subCategoryList.slideDown();
|
|
2330
|
+
|
|
2331
|
+
$(".ecdOutfitBlock:visible").hide(0);
|
|
2332
|
+
|
|
2333
|
+
var firstSubcategory = $(this).next(".ecdOutfitSubcategories").children(".ecdOutfitSubcategory").first();
|
|
2334
|
+
|
|
2335
|
+
$(".ecdOutfitSubcategorySelected").removeClass('ecdOutfitSubcategorySelected');
|
|
2336
|
+
firstSubcategory.addClass('ecdOutfitSubcategorySelected');
|
|
2337
|
+
|
|
2338
|
+
var categoryIndex = firstSubcategory.attr('categoryindex');
|
|
2339
|
+
var subCategoryIndex = firstSubcategory.attr('subcategoryindex');
|
|
2340
|
+
|
|
2341
|
+
$("#ecdOutfit_" + categoryIndex + "_" + subCategoryIndex).show(0);
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2344
|
+
|
|
2345
|
+
window.OnEsoSubcategoryOutfitClick = function()
|
|
2346
|
+
{
|
|
2347
|
+
var lastSubcategory = $(".ecdOutfitSubcategorySelected").first();
|
|
2348
|
+
if ($(this).is(lastSubcategory)) return;
|
|
2349
|
+
|
|
2350
|
+
lastSubcategory.removeClass('ecdOutfitSubcategorySelected');
|
|
2351
|
+
|
|
2352
|
+
$(this).addClass('ecdOutfitSubcategorySelected');
|
|
2353
|
+
|
|
2354
|
+
$(".ecdOutfitBlock:visible").hide(0);
|
|
2355
|
+
|
|
2356
|
+
var categoryIndex = $(this).attr('categoryindex');
|
|
2357
|
+
var subCategoryIndex = $(this).attr('subcategoryindex');
|
|
2358
|
+
|
|
2359
|
+
$("#ecdOutfit_" + categoryIndex + "_" + subCategoryIndex).show(0);
|
|
2360
|
+
}
|
|
2361
|
+
|
|
2362
|
+
|
|
2363
|
+
window.AddEsoCharDataAsyncHandlers = function(parent)
|
|
2364
|
+
{
|
|
2365
|
+
var $parent = $(parent);
|
|
2366
|
+
|
|
2367
|
+
if ($parent.find('.ecdAchTreeName1').length > 0)
|
|
2368
|
+
{
|
|
2369
|
+
$parent.find('.ecdAchTreeName1').click(OnEsoAchievementTreeName1Click);
|
|
2370
|
+
$parent.find('.ecdAchTreeName2').click(OnEsoAchievementTreeName2Click);
|
|
2371
|
+
|
|
2372
|
+
EsoAchTree_LastOpenTreeName = $parent.find('.ecdAchTreeName1:visible').first();
|
|
2373
|
+
EsoAchTree_LastOpenTree = EsoAchTree_LastOpenTreeName.next(".ecdAchTreeContent1");
|
|
2374
|
+
|
|
2375
|
+
EsoAchTree_LastContentName = $parent.find('.ecdAchTreeNameHighlight2').first();
|
|
2376
|
+
EsoAchTree_LastContent = $parent.find('.ecdAchData:visible').first();
|
|
2377
|
+
}
|
|
2378
|
+
|
|
2379
|
+
$parent.find(".ecdSelectAchievement1").click(OnAchievementClick);
|
|
2380
|
+
|
|
2381
|
+
var tables = $parent.find(".tablesorter");
|
|
2382
|
+
|
|
2383
|
+
if (tables.tablesorter)
|
|
2384
|
+
{
|
|
2385
|
+
$parent.find(".tablesorter").tablesorter({
|
|
2386
|
+
sortList: [[2,0]]
|
|
2387
|
+
});
|
|
2388
|
+
}
|
|
2389
|
+
|
|
2390
|
+
$parent.find(".ecdItemFilterTextInput").keyup(function() {
|
|
2391
|
+
UpdateItemFilter();
|
|
2392
|
+
return true;
|
|
2393
|
+
});
|
|
2394
|
+
|
|
2395
|
+
$parent.find(".ecdItemFilterTextInput").blur(function() {
|
|
2396
|
+
$(".ecdItemFilterTextInput").val(this.value);
|
|
2397
|
+
return true;
|
|
2398
|
+
});
|
|
2399
|
+
|
|
2400
|
+
$parent.find('.ecdClickToCopy').click(function() {
|
|
2401
|
+
copyToClipboard(this);
|
|
2402
|
+
});
|
|
2403
|
+
|
|
2404
|
+
$parent.find('.ecdClickToCopyTooltip').click(function() {
|
|
2405
|
+
var text = $(this).attr('tooltip');
|
|
2406
|
+
copyTextToClipboard(text);
|
|
2407
|
+
});
|
|
2408
|
+
|
|
2409
|
+
$parent.find(".ecdScrollContent tr").click(OnItemRowClick);
|
|
2410
|
+
$parent.find(".ecdScrollContent tr").mouseleave(OnItemRowLeave);
|
|
2411
|
+
|
|
2412
|
+
$parent.find(".ecdQuestZoneTitle").click(OnQuestZoneTitleClick);
|
|
2413
|
+
$parent.find(".ecdQuestZoneTitle1").click(OnQuestZoneTitle1Click);
|
|
2414
|
+
$parent.find(".ecdQuestName ").click(OnQuestNameClick);
|
|
2415
|
+
|
|
2416
|
+
$parent.find("#ecdFindAchInput").keyup(function(e) {
|
|
2417
|
+
if (e.keyCode == 13)
|
|
2418
|
+
OnFindEsoCharAchievement();
|
|
2419
|
+
else
|
|
2420
|
+
$(".ecdFindAchTextBox button").text("Find...");
|
|
2421
|
+
});
|
|
2422
|
+
|
|
2423
|
+
$parent.find("#ecdSkillRecipesSearchInput").keyup(function(e) {
|
|
2424
|
+
if (e.keyCode == 13)
|
|
2425
|
+
OnEsoCharDataSearchRecipe();
|
|
2426
|
+
else
|
|
2427
|
+
$("#ecdSkillRecipesSearchBlock button").text("Find...");
|
|
2428
|
+
});
|
|
2429
|
+
|
|
2430
|
+
$parent.find("#ecdQuestAllSearchText").keyup(function(e) {
|
|
2431
|
+
if (e.keyCode == 13)
|
|
2432
|
+
OnEsoCharDataSearchAllQuests();
|
|
2433
|
+
else
|
|
2434
|
+
$("#ecdQuestAllSearchForm button").text("Find...");
|
|
2435
|
+
});
|
|
2436
|
+
|
|
2437
|
+
$parent.find("#ecdBookSearchText").keyup(function(e) {
|
|
2438
|
+
if (e.keyCode == 13)
|
|
2439
|
+
OnEsoCharDataSearchBooks();
|
|
2440
|
+
else
|
|
2441
|
+
$("#ecdBookSearchForm button").text("Find...");
|
|
2442
|
+
});
|
|
2443
|
+
|
|
2444
|
+
$parent.find("#ecdSkill_Recipes").on("scroll", OnEsoRecipeScroll);
|
|
2445
|
+
|
|
2446
|
+
$parent.find(".ecdRecipeTitle").click(OnRecipeTitleClick);
|
|
2447
|
+
|
|
2448
|
+
$parent.find(".ecdBookCollection").click(OnEsoBookCollectionClick);
|
|
2449
|
+
$parent.find(".ecdBookCategory").click(OnEsoBookCategoryClick);
|
|
2450
|
+
$parent.find(".ecdBookLine").click(OnEsoBookClick);
|
|
2451
|
+
$parent.find(".ecdBookClose").click(OnEsoBookCloseClick);
|
|
2452
|
+
|
|
2453
|
+
$parent.find(".ecdCollectibleCategory").click(OnEsoCategoryCollectibleClick);
|
|
2454
|
+
$parent.find(".ecdCollectibleSubcategory").click(OnEsoSubcategoryCollectibleClick);
|
|
2455
|
+
$parent.find(".ecdCollectMenuItem").click(OnEsoCollectionsMenuItemClick);
|
|
2456
|
+
|
|
2457
|
+
$parent.find(".ecdOutfitCategory").click(OnEsoCategoryOutfitClick);
|
|
2458
|
+
$parent.find(".ecdOutfitSubcategory").click(OnEsoSubcategoryOutfitClick);
|
|
2459
|
+
|
|
2460
|
+
$parent.find(".ecdBookCategory").first().trigger("click");
|
|
2461
|
+
$parent.find(".ecdCollectibleCategory").first().trigger("click");
|
|
2462
|
+
$parent.find(".ecdQuestZoneTitle").first().trigger("click");
|
|
2463
|
+
|
|
2464
|
+
if (!DoesEsoItemLinkHaveEvent() || !$parent.is($(document))) $parent.find('.eso_item_link').hover(OnEsoItemLinkEnter, OnEsoItemLinkLeave);
|
|
2465
|
+
}
|
|
2466
|
+
|
|
2467
|
+
|
|
2468
|
+
window.FormatEsoTimeLeft = function(timeLeft)
|
|
2469
|
+
{
|
|
2470
|
+
var days = Math.floor(timeLeft / 3600 / 24);
|
|
2471
|
+
var hours = Math.floor(timeLeft / 3600) % 24;
|
|
2472
|
+
var minutes = Math.floor(timeLeft / 60) % 60;
|
|
2473
|
+
var seconds = timeLeft % 60;
|
|
2474
|
+
var timeFmt = "";
|
|
2475
|
+
|
|
2476
|
+
if (days > 1)
|
|
2477
|
+
timeFmt = '' + days.toString() + ' days '+ hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0')
|
|
2478
|
+
else if (days > 0)
|
|
2479
|
+
timeFmt = '' + days.toString() + ' day '+ hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0')
|
|
2480
|
+
else
|
|
2481
|
+
timeFmt = '' + hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0')
|
|
2482
|
+
|
|
2483
|
+
return timeFmt;
|
|
2484
|
+
}
|
|
2485
|
+
|
|
2486
|
+
|
|
2487
|
+
window.UpdateEsoCharDataHirelingTime = function(index, element)
|
|
2488
|
+
{
|
|
2489
|
+
var nowTime = Math.floor(Date.now() / 1000);
|
|
2490
|
+
var baseTime = $(this).attr("timestamp");
|
|
2491
|
+
var skillLevel = $(this).attr("skill");
|
|
2492
|
+
|
|
2493
|
+
if (baseTime == null || skillLevel == null || baseTime <= 0 || skillLevel <= 0) return;
|
|
2494
|
+
|
|
2495
|
+
baseTime = +baseTime;
|
|
2496
|
+
skillLevel = +skillLevel;
|
|
2497
|
+
|
|
2498
|
+
var newTime = ((skillLevel >= 3) ? 12 : 24) * 3600 + baseTime;
|
|
2499
|
+
|
|
2500
|
+
if (newTime > nowTime)
|
|
2501
|
+
$(this).text(FormatEsoTimeLeft(newTime - nowTime));
|
|
2502
|
+
else
|
|
2503
|
+
$(this).text("Ready!");
|
|
2504
|
+
}
|
|
2505
|
+
|
|
2506
|
+
|
|
2507
|
+
window.UpdateEsoCharDataRidingTime = function(index, element)
|
|
2508
|
+
{
|
|
2509
|
+
var nowTime = Math.floor(Date.now() / 1000);
|
|
2510
|
+
var baseTime = $(this).attr("timestamp");
|
|
2511
|
+
|
|
2512
|
+
if (baseTime == null || baseTime <= 0) return;
|
|
2513
|
+
|
|
2514
|
+
baseTime = +baseTime;
|
|
2515
|
+
|
|
2516
|
+
if (baseTime > nowTime)
|
|
2517
|
+
$(this).text(FormatEsoTimeLeft(baseTime - nowTime));
|
|
2518
|
+
else
|
|
2519
|
+
$(this).text("Ready!");
|
|
2520
|
+
}
|
|
2521
|
+
|
|
2522
|
+
|
|
2523
|
+
window.UpdateEsoCharDataRawTime = function(index, element)
|
|
2524
|
+
{
|
|
2525
|
+
var nowTime = Math.floor(Date.now() / 1000);
|
|
2526
|
+
var baseTime = $(this).attr("rawtime");
|
|
2527
|
+
|
|
2528
|
+
if (baseTime == null || baseTime <= 0) return;
|
|
2529
|
+
|
|
2530
|
+
baseTime = +baseTime;
|
|
2531
|
+
|
|
2532
|
+
if (baseTime > nowTime)
|
|
2533
|
+
$(this).text(FormatEsoTimeLeft(baseTime - nowTime));
|
|
2534
|
+
else
|
|
2535
|
+
$(this).text("Ready!");
|
|
2536
|
+
}
|
|
2537
|
+
|
|
2538
|
+
|
|
2539
|
+
window.OnEsoCharDataTimeUpdate = function()
|
|
2540
|
+
{
|
|
2541
|
+
$(".ecdHirelingTime").each(UpdateEsoCharDataHirelingTime);
|
|
2542
|
+
$(".ecdRidingTime").each(UpdateEsoCharDataRidingTime);
|
|
2543
|
+
|
|
2544
|
+
$(".ecdUpdateTime").each(UpdateEsoCharDataRawTime);
|
|
2545
|
+
}
|
|
2546
|
+
|
|
2547
|
+
|
|
2548
|
+
window.OnCharMenuHoverIn = function()
|
|
2549
|
+
{
|
|
2550
|
+
$("#ecdCharacterMenu").slideDown();
|
|
2551
|
+
$("#ecdCharMenuArrow").html("▲");
|
|
2552
|
+
}
|
|
2553
|
+
|
|
2554
|
+
|
|
2555
|
+
window.OnCharMenuHoverOut = function()
|
|
2556
|
+
{
|
|
2557
|
+
$("#ecdCharacterMenu").slideUp();
|
|
2558
|
+
$("#ecdCharMenuArrow").html("▼");
|
|
2559
|
+
}
|
|
2560
|
+
|
|
2561
|
+
|
|
2562
|
+
window.OnChangeCharScreenshot = function()
|
|
2563
|
+
{
|
|
2564
|
+
var selectedImage = $("#ecdScreenshotList").val();
|
|
2565
|
+
|
|
2566
|
+
if (selectedImage == "" || selectedImage == "blank")
|
|
2567
|
+
{
|
|
2568
|
+
$("#ecdRoot").css("background-image", "none");
|
|
2569
|
+
return;
|
|
2570
|
+
}
|
|
2571
|
+
|
|
2572
|
+
selectedImage = "url(//esochar.uesp.net/screenshots/" + selectedImage + ")";
|
|
2573
|
+
$("#ecdRoot").css("background-image", selectedImage);
|
|
2574
|
+
}
|
|
2575
|
+
|
|
2576
|
+
|
|
2577
|
+
window.OnToggleCharBackgroundImage = function()
|
|
2578
|
+
{
|
|
2579
|
+
$("#ecdTitleBar").toggle();
|
|
2580
|
+
$("#ecdRightData").toggle();
|
|
2581
|
+
$("#ecdEquipSlots").toggle();
|
|
2582
|
+
$("#ecdStatsandBuffs").toggle();
|
|
2583
|
+
$("#ecdActionBar").toggle();
|
|
2584
|
+
$("#ecdRawLink").toggle();
|
|
2585
|
+
$("#ecdCreateDate").toggle();
|
|
2586
|
+
}
|
|
2587
|
+
|
|
2588
|
+
|
|
2589
|
+
window.OnClickEsoScreenshotCaptionButton = function()
|
|
2590
|
+
{
|
|
2591
|
+
var queryParams = {}
|
|
2592
|
+
var charId = $(this).attr("charid");
|
|
2593
|
+
var buildType = $(this).attr("buildtype");
|
|
2594
|
+
var screenshotId = $(this).attr("screenshotid");
|
|
2595
|
+
var caption = $(this).prev(".ecdScreenshotCaption").val();
|
|
2596
|
+
var statusElement = $(this).siblings(".ecdScreenshotStatus");
|
|
2597
|
+
|
|
2598
|
+
statusElement.html("");
|
|
2599
|
+
|
|
2600
|
+
if (charId == null || buildType == null || screenshotId == null) return false;
|
|
2601
|
+
|
|
2602
|
+
if (buildType == "char")
|
|
2603
|
+
queryParams['charid'] = charId;
|
|
2604
|
+
else
|
|
2605
|
+
queryParams['buildid'] = charId;
|
|
2606
|
+
|
|
2607
|
+
queryParams['screenshotid'] = screenshotId;
|
|
2608
|
+
queryParams['caption'] = caption;
|
|
2609
|
+
queryParams['action'] = "editcaption";
|
|
2610
|
+
|
|
2611
|
+
$.ajax("//esochars.uesp.net/manageScreenshots.php", {
|
|
2612
|
+
data: queryParams,
|
|
2613
|
+
xhrFields: { withCredentials: true },
|
|
2614
|
+
}).
|
|
2615
|
+
done(function(data, status, xhr) { OnEsoCharEditScreenshotCaptionSaved(data, screenshotId, statusElement, status, xhr); }).
|
|
2616
|
+
fail(function(xhr, status, errorMsg) { OnEsoCharEditScreenshotCaptionError(xhr, screenshotId, statusElement, status, errorMsg); });
|
|
2617
|
+
|
|
2618
|
+
return true;
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
|
|
2622
|
+
window.OnEsoCharEditScreenshotCaptionSaved = function(data, screenshotId, statusElement, status, xhr)
|
|
2623
|
+
{
|
|
2624
|
+
if (data.result > 0)
|
|
2625
|
+
{
|
|
2626
|
+
statusElement.html("Caption saved for screenshot " + screenshotId + "!");
|
|
2627
|
+
}
|
|
2628
|
+
else
|
|
2629
|
+
{
|
|
2630
|
+
var errorMsg = "";
|
|
2631
|
+
if (data.errorMsg) errorMsg = data.errorMsg.join("<br/>");
|
|
2632
|
+
statusElement.html("Error saving caption for screenshot " + screenshotId + "!</br>" + errorMsg);
|
|
2633
|
+
}
|
|
2634
|
+
}
|
|
2635
|
+
|
|
2636
|
+
|
|
2637
|
+
window.OnEsoCharEditScreenshotCaptionError = function(xhr, screenshotId, statusElement, status, errorMsg)
|
|
2638
|
+
{
|
|
2639
|
+
$("#ecdScreenshotStatus").html("Error saving caption for screenshot " + screenshotId +"!<br/>" + errorMsg)
|
|
2640
|
+
}
|
|
2641
|
+
|
|
2642
|
+
|
|
2643
|
+
window.OnClickEsoScreenshotDeleteButton = function()
|
|
2644
|
+
{
|
|
2645
|
+
var queryParams = {}
|
|
2646
|
+
var charId = $(this).attr("charid");
|
|
2647
|
+
var buildType = $(this).attr("buildtype");
|
|
2648
|
+
var screenshotId = $(this).attr("screenshotid");
|
|
2649
|
+
var caption = $(this).prev(".ecdScreenshotCaption").val();
|
|
2650
|
+
var statusElement = $(this).parentsUntil("tr").find(".ecdScreenshotStatus");
|
|
2651
|
+
|
|
2652
|
+
$("#ecdScreenshotStatus").html("");
|
|
2653
|
+
if (charId == null || buildType == null || screenshotId == null) return false;
|
|
2654
|
+
|
|
2655
|
+
if (buildType == "char")
|
|
2656
|
+
queryParams['charid'] = charId;
|
|
2657
|
+
else
|
|
2658
|
+
queryParams['buildid'] = charId;
|
|
2659
|
+
|
|
2660
|
+
queryParams['screenshotid'] = screenshotId;
|
|
2661
|
+
queryParams['action'] = "delete";
|
|
2662
|
+
|
|
2663
|
+
$.ajax("//esochars.uesp.net/manageScreenshots.php", {
|
|
2664
|
+
data: queryParams,
|
|
2665
|
+
xhrFields: { withCredentials: true },
|
|
2666
|
+
}).
|
|
2667
|
+
done(function(data, status, xhr) { OnEsoCharEditScreenshotDeleted(data, screenshotId, statusElement, status, xhr); }).
|
|
2668
|
+
fail(function(xhr, status, errorMsg) { OnEsoCharEditScreenshotDeleteError(xhr, screenshotId, statusElement, status, errorMsg); });
|
|
2669
|
+
|
|
2670
|
+
return true;
|
|
2671
|
+
}
|
|
2672
|
+
|
|
2673
|
+
|
|
2674
|
+
window.OnEsoCharEditScreenshotDeleted = function(data, screenshotId, statusElement, status, xhr)
|
|
2675
|
+
{
|
|
2676
|
+
if (data.result > 0)
|
|
2677
|
+
{
|
|
2678
|
+
$("#ecdScreenshotStatus").html("Screenshot " + screenshotId + " deleted!");
|
|
2679
|
+
$(".ecdScreenshotsTable tr[screenshotid='" + screenshotId + "']").replaceWith("");
|
|
2680
|
+
}
|
|
2681
|
+
else
|
|
2682
|
+
{
|
|
2683
|
+
var errorMsg = "";
|
|
2684
|
+
if (data.errorMsg) errorMsg = data.errorMsg.join("<br/>");
|
|
2685
|
+
statusElement.html("Error deleting screenshot " + screenshotId + "!</br>" + errorMsg);
|
|
2686
|
+
}
|
|
2687
|
+
}
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
window.OnEsoCharEditScreenshotDeleteError = function(xhr, screenshotId, statusElement, status, errorMsg)
|
|
2691
|
+
{
|
|
2692
|
+
statusElement.html("Error deleting screenshot " + screenshotId + "!<br/>" + errorMsg)
|
|
2693
|
+
}
|
|
2694
|
+
|
|
2695
|
+
|
|
2696
|
+
window.UpdateEsoTooltipEnchantDamage = function (match, divData, enchantValue, damageType)
|
|
2697
|
+
{
|
|
2698
|
+
var enchantFactor = 1;
|
|
2699
|
+
var damageMod;
|
|
2700
|
+
var checkDamageType = damageType;
|
|
2701
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
2702
|
+
|
|
2703
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
2704
|
+
|
|
2705
|
+
damageMod = g_EsoBuildLastInputValues[checkDamageType + "DamageDone"];
|
|
2706
|
+
|
|
2707
|
+
if (checkDamageType != "" && damageMod != null && damageMod !== 0)
|
|
2708
|
+
{
|
|
2709
|
+
//itemData.rawOutput["Tooltip: Enchantment " + checkDamageType + "DamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2710
|
+
enchantFactor += +damageMod;
|
|
2711
|
+
}
|
|
2712
|
+
|
|
2713
|
+
damageMod = g_EsoBuildLastInputValues.DamageDone;
|
|
2714
|
+
|
|
2715
|
+
if (damageMod != null && damageMod !== 0)
|
|
2716
|
+
{
|
|
2717
|
+
//itemData.rawOutput["Tooltip: Enchantment DamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2718
|
+
enchantFactor += +damageMod;
|
|
2719
|
+
}
|
|
2720
|
+
|
|
2721
|
+
damageMod = g_EsoBuildLastInputValues.SingleTargetDamageDone;
|
|
2722
|
+
|
|
2723
|
+
if (damageMod != null && damageMod !== 0)
|
|
2724
|
+
{
|
|
2725
|
+
//itemData.rawOutput["Tooltip: Enchantment SingleTargetDamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2726
|
+
enchantFactor += +damageMod;
|
|
2727
|
+
}
|
|
2728
|
+
|
|
2729
|
+
damageMod = g_EsoBuildLastInputValues.DirectDamageDone;
|
|
2730
|
+
|
|
2731
|
+
if (damageMod != null && damageMod !== 0)
|
|
2732
|
+
{
|
|
2733
|
+
//itemData.rawOutput["Tooltip: Enchantment DirectDamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2734
|
+
enchantFactor += +damageMod;
|
|
2735
|
+
}
|
|
2736
|
+
|
|
2737
|
+
if (itemData && (itemData.weaponType == 1 || itemData.weaponType == 2 || itemData.weaponType == 3 || itemData.weaponType == 11))
|
|
2738
|
+
{
|
|
2739
|
+
//enchantFactor *= 0.5; //Handled by tooltip display
|
|
2740
|
+
//itemData.rawOutput["Tooltip: Enchantment 1H Weapon"] = "50%";
|
|
2741
|
+
}
|
|
2742
|
+
|
|
2743
|
+
if (enchantFactor != 1)
|
|
2744
|
+
{
|
|
2745
|
+
enchantValue = Math.floor(enchantValue * enchantFactor);
|
|
2746
|
+
}
|
|
2747
|
+
|
|
2748
|
+
return "Deals <div" + divData + ">" + enchantValue + "</div> " + damageType + " Damage";
|
|
2749
|
+
}
|
|
2750
|
+
|
|
2751
|
+
|
|
2752
|
+
window.UpdateEsoTooltipEnchantHealing = function (match, divData, enchantValue)
|
|
2753
|
+
{
|
|
2754
|
+
var enchantFactor = 1;
|
|
2755
|
+
var healingMod;
|
|
2756
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
2757
|
+
|
|
2758
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
2759
|
+
|
|
2760
|
+
healingMod = g_EsoBuildLastInputValues["HealingDone"];
|
|
2761
|
+
|
|
2762
|
+
if (healingMod != null && healingMod !== 0)
|
|
2763
|
+
{
|
|
2764
|
+
//itemData.rawOutput["Tooltip: Enchantment HealingDone"] = (healingMod * 100).toFixed(1) + "%";
|
|
2765
|
+
enchantFactor += +healingMod;
|
|
2766
|
+
}
|
|
2767
|
+
|
|
2768
|
+
if (itemData && (itemData.weaponType == 1 || itemData.weaponType == 2 || itemData.weaponType == 3 || itemData.weaponType == 11))
|
|
2769
|
+
{
|
|
2770
|
+
//enchantFactor *= 0.5; //Handled by tooltip display
|
|
2771
|
+
//itemData.rawOutput["Tooltip: Enchantment 1H Weapon"] = "50%";
|
|
2772
|
+
}
|
|
2773
|
+
|
|
2774
|
+
if (enchantFactor != 1)
|
|
2775
|
+
{
|
|
2776
|
+
enchantValue = Math.floor(enchantValue * enchantFactor);
|
|
2777
|
+
}
|
|
2778
|
+
|
|
2779
|
+
return "restores <div" + divData + ">" + enchantValue + "</div> Health";
|
|
2780
|
+
}
|
|
2781
|
+
|
|
2782
|
+
|
|
2783
|
+
window.UpdateEsoTooltipEnchantDamageShield = function (match, divData, enchantValue)
|
|
2784
|
+
{
|
|
2785
|
+
var enchantFactor = 1;
|
|
2786
|
+
var shieldMod;
|
|
2787
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
2788
|
+
|
|
2789
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
2790
|
+
|
|
2791
|
+
shieldMod = g_EsoBuildLastInputValues["DamageShield"];
|
|
2792
|
+
|
|
2793
|
+
if (shieldMod != null && shieldMod !== 0)
|
|
2794
|
+
{
|
|
2795
|
+
//itemData.rawOutput["Tooltip: Enchantment DamageShield"] = (shieldMod*100).toFixed(1) + "%";
|
|
2796
|
+
enchantFactor += +shieldMod;
|
|
2797
|
+
}
|
|
2798
|
+
|
|
2799
|
+
if (itemData && (itemData.weaponType == 1 || itemData.weaponType == 2 || itemData.weaponType == 3 || itemData.weaponType == 11))
|
|
2800
|
+
{
|
|
2801
|
+
//enchantFactor *= 0.5; //Handled by tooltip display
|
|
2802
|
+
//itemData.rawOutput["Tooltip: Enchantment 1H Weapon"] = "50%";
|
|
2803
|
+
}
|
|
2804
|
+
|
|
2805
|
+
if (enchantFactor != 1)
|
|
2806
|
+
{
|
|
2807
|
+
enchantValue = Math.floor(enchantValue * enchantFactor);
|
|
2808
|
+
}
|
|
2809
|
+
|
|
2810
|
+
return "Grants a <div" + divData + ">" + enchantValue + "</div> point Damage shield";
|
|
2811
|
+
}
|
|
2812
|
+
|
|
2813
|
+
|
|
2814
|
+
window.UpdateEsoTooltipEnchantOther = function (match, header, enchantValue, footer)
|
|
2815
|
+
{
|
|
2816
|
+
var enchantFactor = 1;
|
|
2817
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
2818
|
+
|
|
2819
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
2820
|
+
|
|
2821
|
+
if (itemData && (itemData.weaponType == 1 || itemData.weaponType == 2 || itemData.weaponType == 3 || itemData.weaponType == 11))
|
|
2822
|
+
{
|
|
2823
|
+
//enchantFactor *= 0.5; //Handled by tooltip display
|
|
2824
|
+
//itemData.rawOutput["Tooltip: Enchantment 1H Weapon"] = "50%";
|
|
2825
|
+
}
|
|
2826
|
+
|
|
2827
|
+
if (enchantFactor != 1)
|
|
2828
|
+
{
|
|
2829
|
+
enchantValue = Math.floor(enchantValue * enchantFactor);
|
|
2830
|
+
}
|
|
2831
|
+
|
|
2832
|
+
return header + enchantValue + footer;
|
|
2833
|
+
}
|
|
2834
|
+
|
|
2835
|
+
|
|
2836
|
+
window.UpdateEsoBuildTooltipEnchant = function (enchantBlock, tooltip, parent, slotId)
|
|
2837
|
+
{
|
|
2838
|
+
var enchantHtml = "";
|
|
2839
|
+
|
|
2840
|
+
if (tooltip)
|
|
2841
|
+
{
|
|
2842
|
+
enchantHtml = enchantBlock.html();
|
|
2843
|
+
g_EsoCurrentTooltipSlot = $(parent).parent().attr("slotid");
|
|
2844
|
+
}
|
|
2845
|
+
else if (slotId)
|
|
2846
|
+
{
|
|
2847
|
+
g_EsoCurrentTooltipSlot = slotId;
|
|
2848
|
+
|
|
2849
|
+
var enchant = g_EsoBuildEnchantData[g_EsoCurrentTooltipSlot];
|
|
2850
|
+
var item = g_EsoBuildItemData[g_EsoCurrentTooltipSlot];
|
|
2851
|
+
|
|
2852
|
+
if (item != null) enchantHtml = item.enchantDesc;
|
|
2853
|
+
if (enchant != null && enchant.enchantDesc) enchantHtml = enchant.enchantDesc;
|
|
2854
|
+
|
|
2855
|
+
if (enchantHtml == "") return;
|
|
2856
|
+
enchantHtml = RemoveEsoDescriptionFormats(enchantHtml);
|
|
2857
|
+
}
|
|
2858
|
+
else
|
|
2859
|
+
{
|
|
2860
|
+
return;
|
|
2861
|
+
}
|
|
2862
|
+
|
|
2863
|
+
var newEnchantHtml = enchantHtml;
|
|
2864
|
+
|
|
2865
|
+
newEnchantHtml = newEnchantHtml.replace(/Deals (?:\<div([^>]*)\>|)([0-9]+)(?:\<\/div\>|) ([A-Za-z]+) Damage/gi, UpdateEsoTooltipEnchantDamage);
|
|
2866
|
+
newEnchantHtml = newEnchantHtml.replace(/restores (?:\<div([^>]*)\>|)([0-9]+)(?:\<\/div\>|) Health/gi, UpdateEsoTooltipEnchantHealing);
|
|
2867
|
+
newEnchantHtml = newEnchantHtml.replace(/Grants a (?:\<div([^>]*)\>|)([0-9]+)(?:\<\/div\>|) point Damage shield/gi, UpdateEsoTooltipEnchantDamageShield);
|
|
2868
|
+
|
|
2869
|
+
newEnchantHtml = newEnchantHtml.replace(/(restores (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) Stamina)/gi, UpdateEsoTooltipEnchantOther);
|
|
2870
|
+
newEnchantHtml = newEnchantHtml.replace(/(restores (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) Magicka)/gi, UpdateEsoTooltipEnchantOther);
|
|
2871
|
+
newEnchantHtml = newEnchantHtml.replace(/(Spell Resistance by (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) for)/gi, UpdateEsoTooltipEnchantOther);
|
|
2872
|
+
newEnchantHtml = newEnchantHtml.replace(/(Spell Damage by (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) for)/gi, UpdateEsoTooltipEnchantOther);
|
|
2873
|
+
|
|
2874
|
+
if (tooltip && newEnchantHtml != enchantHtml) enchantBlock.html(newEnchantHtml);
|
|
2875
|
+
}
|
|
2876
|
+
|
|
2877
|
+
|
|
2878
|
+
window.UpdateEsoSetDamageDataReplace = function (match, prefixWord, div1, damageValue, div2, damageType, extraSpace, setDamageData, matchCount)
|
|
2879
|
+
{
|
|
2880
|
+
var damageFactor = 1;
|
|
2881
|
+
var damageMod;
|
|
2882
|
+
var checkDamageType = damageType;
|
|
2883
|
+
var isAoE = false;
|
|
2884
|
+
var isSingleTarget = false;
|
|
2885
|
+
var isDoT = false;
|
|
2886
|
+
var isBleed = false;
|
|
2887
|
+
var isPet = false;
|
|
2888
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
2889
|
+
|
|
2890
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
2891
|
+
|
|
2892
|
+
if (prefixWord == "absorbs") return match;
|
|
2893
|
+
if (damageType == "Spell") return match;
|
|
2894
|
+
if (damageType == "Weapon") return match;
|
|
2895
|
+
|
|
2896
|
+
if (setDamageData != null)
|
|
2897
|
+
{
|
|
2898
|
+
if (setDamageData.ignoreAll) return match;
|
|
2899
|
+
|
|
2900
|
+
if (typeof setDamageData.isAoE == 'boolean')
|
|
2901
|
+
isAoE = setDamageData.isAoE;
|
|
2902
|
+
else if (setDamageData.isAoE && setDamageData.isAoE[matchCount - 1] != null)
|
|
2903
|
+
isAoE = setDamageData.isAoE[matchCount - 1];
|
|
2904
|
+
|
|
2905
|
+
if (typeof setDamageData.isDoT == 'boolean')
|
|
2906
|
+
isDoT = setDamageData.isDoT;
|
|
2907
|
+
else if (setDamageData.isDoT && setDamageData.isDoT[matchCount - 1] != null)
|
|
2908
|
+
isDoT = setDamageData.isDoT[matchCount - 1];
|
|
2909
|
+
|
|
2910
|
+
if (typeof setDamageData.isBleed == 'boolean')
|
|
2911
|
+
isBleed = setDamageData.isBleed;
|
|
2912
|
+
else if (setDamageData.isBleed && setDamageData.isBleed[matchCount - 1] != null)
|
|
2913
|
+
isBleed = setDamageData.isBleed[matchCount - 1];
|
|
2914
|
+
|
|
2915
|
+
if (setDamageData.isSingleTarget == null)
|
|
2916
|
+
isSingleTarget = !isAoE;
|
|
2917
|
+
else if (typeof setDamageData.isSingleTarget == 'boolean')
|
|
2918
|
+
isSingleTarget = setDamageData.isSingleTarget;
|
|
2919
|
+
else if (setDamageData.isSingleTarget && setDamageData.isSingleTarget[matchCount - 1] != null)
|
|
2920
|
+
isSingleTarget = setDamageData.isSingleTarget[matchCount - 1];
|
|
2921
|
+
|
|
2922
|
+
if (typeof setDamageData.isPet == 'boolean')
|
|
2923
|
+
isPet = setDamageData.isPet;
|
|
2924
|
+
else if (setDamageData.isPet && setDamageData.isPet[matchCount - 1] != null)
|
|
2925
|
+
isPet = setDamageData.isPet[matchCount - 1];
|
|
2926
|
+
|
|
2927
|
+
if (setDamageData.damageTypes != null) {
|
|
2928
|
+
var maxDamageType = setDamageData.damageTypes[0];
|
|
2929
|
+
var maxDamageValue = -1;
|
|
2930
|
+
|
|
2931
|
+
for (var i = 0; i < setDamageData.damageTypes.length; ++i) {
|
|
2932
|
+
var tmpDamageType = setDamageData.damageTypes[i];
|
|
2933
|
+
var tmpDamageValue = g_EsoBuildLastInputValues[tmpDamageType + "DamageDone"];
|
|
2934
|
+
if (tmpDamageValue == null || tmpDamageValue == 0 || isNaN(tmpDamageValue)) continue;
|
|
2935
|
+
if (tmpDamageValue > maxDamageValue) {
|
|
2936
|
+
maxDamageValue = tmpDamageValue;
|
|
2937
|
+
maxDamageType = tmpDamageType;
|
|
2938
|
+
}
|
|
2939
|
+
}
|
|
2940
|
+
checkDamageType = maxDamageType;
|
|
2941
|
+
}
|
|
2942
|
+
|
|
2943
|
+
if (setDamageData.damageType != null) checkDamageType = setDamageData.damageType;
|
|
2944
|
+
}
|
|
2945
|
+
|
|
2946
|
+
//EsoBuildLog("UpdateEsoSetDamageData", match, isAoE, isDoT, damageValue, damageType);
|
|
2947
|
+
|
|
2948
|
+
if (checkDamageType)
|
|
2949
|
+
{
|
|
2950
|
+
itemData.rawOutput["Tooltip: Set Using DamageType"] = checkDamageType;
|
|
2951
|
+
}
|
|
2952
|
+
|
|
2953
|
+
damageMod = g_EsoBuildLastInputValues[checkDamageType + "DamageDone"];
|
|
2954
|
+
|
|
2955
|
+
if (checkDamageType != "" && damageMod != null && damageMod !== 0)
|
|
2956
|
+
{
|
|
2957
|
+
itemData.rawOutput["Tooltip: Set " + checkDamageType + "DamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2958
|
+
damageFactor += +damageMod;
|
|
2959
|
+
}
|
|
2960
|
+
|
|
2961
|
+
damageMod = g_EsoBuildLastInputValues.DamageDone;
|
|
2962
|
+
|
|
2963
|
+
if (damageMod != null && damageMod !== 0)
|
|
2964
|
+
{
|
|
2965
|
+
itemData.rawOutput["Tooltip: Set DamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2966
|
+
damageFactor += +damageMod;
|
|
2967
|
+
}
|
|
2968
|
+
|
|
2969
|
+
if (isAoE)
|
|
2970
|
+
{
|
|
2971
|
+
damageMod = g_EsoBuildLastInputValues.AOEDamageDone;
|
|
2972
|
+
|
|
2973
|
+
if (damageMod != null && damageMod !== 0)
|
|
2974
|
+
{
|
|
2975
|
+
itemData.rawOutput["Tooltip: Set AOEDamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2976
|
+
damageFactor += +damageMod;
|
|
2977
|
+
}
|
|
2978
|
+
}
|
|
2979
|
+
else if (isSingleTarget)
|
|
2980
|
+
{
|
|
2981
|
+
damageMod = g_EsoBuildLastInputValues.SingleTargetDamageDone;
|
|
2982
|
+
|
|
2983
|
+
if (damageMod != null && damageMod !== 0)
|
|
2984
|
+
{
|
|
2985
|
+
itemData.rawOutput["Tooltip: Set SingleTargetDamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2986
|
+
damageFactor += +damageMod;
|
|
2987
|
+
}
|
|
2988
|
+
}
|
|
2989
|
+
|
|
2990
|
+
if (isDoT)
|
|
2991
|
+
{
|
|
2992
|
+
damageMod = g_EsoBuildLastInputValues.DotDamageDone;
|
|
2993
|
+
|
|
2994
|
+
if (damageMod != null && damageMod !== 0)
|
|
2995
|
+
{
|
|
2996
|
+
itemData.rawOutput["Tooltip: Set DotDamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
2997
|
+
damageFactor += +damageMod;
|
|
2998
|
+
}
|
|
2999
|
+
}
|
|
3000
|
+
else
|
|
3001
|
+
{
|
|
3002
|
+
// TODO: Confirm
|
|
3003
|
+
damageMod = g_EsoBuildLastInputValues.DirectDamageDone;
|
|
3004
|
+
|
|
3005
|
+
if (damageMod != null && damageMod !== 0)
|
|
3006
|
+
{
|
|
3007
|
+
itemData.rawOutput["Tooltip: Set DirectDamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
3008
|
+
damageFactor += +damageMod;
|
|
3009
|
+
}
|
|
3010
|
+
}
|
|
3011
|
+
|
|
3012
|
+
if (isBleed)
|
|
3013
|
+
{
|
|
3014
|
+
damageMod = g_EsoBuildLastInputValues.BleedDamage;
|
|
3015
|
+
|
|
3016
|
+
if (damageMod != null && damageMod !== 0)
|
|
3017
|
+
{
|
|
3018
|
+
itemData.rawOutput["Tooltip: Set BleedDamage"] = (damageMod * 100).toFixed(1) + "%";
|
|
3019
|
+
damageFactor += +damageMod;
|
|
3020
|
+
}
|
|
3021
|
+
}
|
|
3022
|
+
|
|
3023
|
+
damageMod = g_EsoBuildLastInputValues.PetDamageDone;
|
|
3024
|
+
|
|
3025
|
+
if (isPet && damageMod != null && damageMod !== 0)
|
|
3026
|
+
{
|
|
3027
|
+
itemData.rawOutput["Tooltip: Pet DamageDone"] = (damageMod * 100).toFixed(1) + "%";
|
|
3028
|
+
damageFactor += +damageMod;
|
|
3029
|
+
}
|
|
3030
|
+
|
|
3031
|
+
if (damageFactor != 0)
|
|
3032
|
+
{
|
|
3033
|
+
damageValue = Math.floor(damageValue * damageFactor);
|
|
3034
|
+
}
|
|
3035
|
+
|
|
3036
|
+
return " " + prefixWord + " " + div1 + damageValue + div2 + " " + damageType + extraSpace + "Damage";
|
|
3037
|
+
}
|
|
3038
|
+
|
|
3039
|
+
|
|
3040
|
+
|
|
3041
|
+
window.UpdateEsoSetDamageShieldReplace = function (match, div1, damageShieldValue, div2)
|
|
3042
|
+
{
|
|
3043
|
+
// damage shield that absorbs 140-12040 damage
|
|
3044
|
+
// damage shield every 2 seconds that absorbs 27-2399 damage
|
|
3045
|
+
|
|
3046
|
+
var shieldFactor = 1;
|
|
3047
|
+
var shieldMod;
|
|
3048
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
3049
|
+
|
|
3050
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
3051
|
+
|
|
3052
|
+
shieldMod = g_EsoBuildLastInputValues["DamageShield"];
|
|
3053
|
+
|
|
3054
|
+
if (shieldMod != null && shieldMod !== 0)
|
|
3055
|
+
{
|
|
3056
|
+
itemData.rawOutput["Tooltip: Set DamageShield"] = (shieldMod * 100).toFixed(1) + "%";
|
|
3057
|
+
shieldFactor += +shieldMod;
|
|
3058
|
+
}
|
|
3059
|
+
|
|
3060
|
+
if (shieldFactor != 0)
|
|
3061
|
+
{
|
|
3062
|
+
damageShieldValue = Math.floor(damageShieldValue * shieldFactor);
|
|
3063
|
+
}
|
|
3064
|
+
|
|
3065
|
+
return " absorbs " + div1 + damageShieldValue + div2 + " damage";
|
|
3066
|
+
}
|
|
3067
|
+
|
|
3068
|
+
|
|
3069
|
+
window.UpdateEsoSetHealReplace = function (match, prefixWord, div1, healValue, div2, suffixWord)
|
|
3070
|
+
{
|
|
3071
|
+
// heal for 23-2000 Health
|
|
3072
|
+
// collecting the essence heals you 50-4300 Health
|
|
3073
|
+
// ? When you take damage, you have a 6% chance to create a beam that steals
|
|
3074
|
+
// 63-5805 Health over 4 seconds from the attacker
|
|
3075
|
+
|
|
3076
|
+
var healFactor = 1;
|
|
3077
|
+
var healMod;
|
|
3078
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
3079
|
+
|
|
3080
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
3081
|
+
|
|
3082
|
+
if (prefixWord != "for" && prefixWord != "you" && prefixWord != "steals") return match;
|
|
3083
|
+
|
|
3084
|
+
healMod = g_EsoBuildLastInputValues["HealingDone"];
|
|
3085
|
+
|
|
3086
|
+
if (healMod != null && healMod !== 0)
|
|
3087
|
+
{
|
|
3088
|
+
itemData.rawOutput["Tooltip: Set HealingDone"] = (healMod * 100).toFixed(1) + "%";
|
|
3089
|
+
healFactor += +healMod;
|
|
3090
|
+
}
|
|
3091
|
+
|
|
3092
|
+
if (healFactor != 0)
|
|
3093
|
+
{
|
|
3094
|
+
healValue = Math.floor(healValue * healFactor);
|
|
3095
|
+
}
|
|
3096
|
+
|
|
3097
|
+
return " " + prefixWord + " " + div1 + healValue + div2 + suffixWord;
|
|
3098
|
+
}
|
|
3099
|
+
|
|
3100
|
+
|
|
3101
|
+
|
|
3102
|
+
window.UpdateEsoBuildSetDamageData = function (setDesc, setDamageData)
|
|
3103
|
+
{
|
|
3104
|
+
var newDesc = setDesc;
|
|
3105
|
+
var matchCount = 0;
|
|
3106
|
+
|
|
3107
|
+
// EsoBuildLog("UpdateEsoBuildSetDamageData", setDesc, setDamageData);
|
|
3108
|
+
|
|
3109
|
+
newDesc = newDesc.replace(/([A-Za-z,\:]+) ((?:\<div[^>]*\>)|)([0-9]+)((?:\<\/div\>)|) ((?:[a-zA-Z]+)|)( |)damage/gi, function(match, prefixWord, div1, damageValue, div2, damageType, extraSpace) {
|
|
3110
|
+
++matchCount;
|
|
3111
|
+
return UpdateEsoSetDamageDataReplace(match, prefixWord, div1, damageValue, div2, damageType, extraSpace, setDamageData, matchCount);
|
|
3112
|
+
});
|
|
3113
|
+
|
|
3114
|
+
return newDesc;
|
|
3115
|
+
}
|
|
3116
|
+
|
|
3117
|
+
|
|
3118
|
+
window.UpdateEsoBuildSetDamageShield = function (setDesc)
|
|
3119
|
+
{
|
|
3120
|
+
var newDesc = setDesc;
|
|
3121
|
+
var matchCount = 0;
|
|
3122
|
+
|
|
3123
|
+
// EsoBuildLog("UpdateEsoBuildSetDamageShieldData", setDesc);
|
|
3124
|
+
|
|
3125
|
+
newDesc = newDesc.replace(/ absorbs ((?:\<div[^>]*\>)|)([0-9]+)((?:\<\/div\>)|) damage/gi, function(match, div1, damageValue, div2) {
|
|
3126
|
+
++matchCount;
|
|
3127
|
+
return UpdateEsoSetDamageShieldReplace(match, div1, damageValue, div2, matchCount);
|
|
3128
|
+
});
|
|
3129
|
+
|
|
3130
|
+
return newDesc;
|
|
3131
|
+
}
|
|
3132
|
+
|
|
3133
|
+
|
|
3134
|
+
window.UpdateEsoBuildSetHealing = function (setDesc)
|
|
3135
|
+
{
|
|
3136
|
+
var newDesc = setDesc;
|
|
3137
|
+
var matchCount = 0;
|
|
3138
|
+
|
|
3139
|
+
// EsoBuildLog("UpdateEsoBuildSetHealing", setDesc);
|
|
3140
|
+
|
|
3141
|
+
newDesc = newDesc.replace(/ (for|you|steals) ((?:\<div[^>]*\>)|)([0-9]+)((?:\<\/div\>)|)( Health|\.)/gi, function(match, prefixWord, div1, healValue, div2, suffixWord) {
|
|
3142
|
+
++matchCount;
|
|
3143
|
+
return UpdateEsoSetHealReplace(match, prefixWord, div1, healValue, div2, suffixWord, matchCount);
|
|
3144
|
+
});
|
|
3145
|
+
|
|
3146
|
+
return newDesc;
|
|
3147
|
+
}
|
|
3148
|
+
|
|
3149
|
+
|
|
3150
|
+
window.UpdateEsoBuildSetOther = function (setDesc)
|
|
3151
|
+
{
|
|
3152
|
+
var newDesc = setDesc;
|
|
3153
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
3154
|
+
|
|
3155
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
3156
|
+
|
|
3157
|
+
// Markyn Ring of Majesty
|
|
3158
|
+
// Gain 100 Weapon and Spell Damage and 1157 Armor for every set you are wearing at least 3 or more pieces of.Current bonus: 0 Weapon and Spell Damage and 0 Armor.
|
|
3159
|
+
newDesc = newDesc.replace(/(Current bonus: (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) Weapon and Spell Damage and (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) Armor\.)/i, function(match, p1, weaponDamage, p2, armor, p3)
|
|
3160
|
+
{
|
|
3161
|
+
var matchResult = newDesc.match(/Gain (?:\<div[^>]*\>|)([0-9]+)(?:\<\/div\>|) Weapon and Spell Damage and (?:\<div[^>]*\>|)([0-9]+)(?:\<\/div\>|) Armor /);
|
|
3162
|
+
if (!matchResult) return p1 + weaponDamage + p2 + armor + p3;
|
|
3163
|
+
if (!g_EsoBuildLastInputValues) return p1 + value + p2;
|
|
3164
|
+
|
|
3165
|
+
var damageAmt = parseInt(matchResult[1]);
|
|
3166
|
+
var armorAmt = parseInt(matchResult[2]);
|
|
3167
|
+
|
|
3168
|
+
if (g_EsoBuildLastInputValues.ThreeSetCount > 0)
|
|
3169
|
+
{
|
|
3170
|
+
weaponDamage = damageAmt * g_EsoBuildLastInputValues.ThreeSetCount;
|
|
3171
|
+
armor = armorAmt * g_EsoBuildLastInputValues.ThreeSetCount;
|
|
3172
|
+
}
|
|
3173
|
+
|
|
3174
|
+
return p1 + weaponDamage + p2 + armor + p3;
|
|
3175
|
+
});
|
|
3176
|
+
|
|
3177
|
+
// Bahsei's Mania
|
|
3178
|
+
// Increases your damage done to non-player enemies by up to 12% based on your missing Magicka. Current value: 0%
|
|
3179
|
+
newDesc = newDesc.replace(/(Current value: (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|)%)/i, function(match, p1, value, p2)
|
|
3180
|
+
{
|
|
3181
|
+
var matchResult = newDesc.match(/by up to (?:\<div[^>]*\>|)([0-9%]+)(?:\<\/div\>|)(?:%|) based on your missing magicka/i);
|
|
3182
|
+
if (!matchResult || !matchResult[1]) return p1 + value + p2;
|
|
3183
|
+
if (!g_EsoBuildLastInputValues ||!g_EsoBuildLastInputValues.Set) return p1 + value + p2;
|
|
3184
|
+
|
|
3185
|
+
if (g_EsoBuildLastInputValues.Set.BahseiMania == null || g_EsoBuildLastInputValues.Set.BahseiMania == 0) return p1 + value + p2;
|
|
3186
|
+
|
|
3187
|
+
//var maxValue = parseFloat(matchResult[1]);
|
|
3188
|
+
//if (isNaN(maxValue) || maxValue == 0) return p1 + value + p2;
|
|
3189
|
+
|
|
3190
|
+
var newValue = g_EsoBuildLastInputValues.Set.BahseiMania * 100;
|
|
3191
|
+
|
|
3192
|
+
return p1 + newValue + p2;
|
|
3193
|
+
});
|
|
3194
|
+
|
|
3195
|
+
// Coral Riptide
|
|
3196
|
+
newDesc = newDesc.replace(/(Current bonus: (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) Weapon and Spell Damage)/i, function(match, p1, value, p2)
|
|
3197
|
+
{
|
|
3198
|
+
var matchResult = newDesc.match(/Increase your Weapon and Spell Damage by up to (?:\<div[^>]*\>|)([0-9]+)(?:\<\/div\>|) based on your missing Stamina,/i);
|
|
3199
|
+
if (!matchResult || !matchResult[1]) return p1 + value + p2;
|
|
3200
|
+
if (!g_EsoBuildLastInputValues ||!g_EsoBuildLastInputValues.Set) return p1 + value + p2;
|
|
3201
|
+
|
|
3202
|
+
if (g_EsoBuildLastInputValues.Set.CoralRiptide == null || g_EsoBuildLastInputValues.Set.CoralRiptide == 0) return p1 + value + p2;
|
|
3203
|
+
|
|
3204
|
+
var newValue = g_EsoBuildLastInputValues.Set.CoralRiptide;
|
|
3205
|
+
|
|
3206
|
+
return p1 + newValue + p2;
|
|
3207
|
+
});
|
|
3208
|
+
|
|
3209
|
+
// Mora's Whispers
|
|
3210
|
+
// Current Bonus: 0 Critical Chance 0% Inspiration, Alliance Rank, and Alliance skill 0% monster kill experience.
|
|
3211
|
+
newDesc = newDesc.replace(/(Current bonus:.*?(?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) Critical Chance.*?(?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|)% Inspiration, Alliance Rank, and Alliance skill.*?(?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|)% monster kill experience)/i, function(match, p1, critValue, p2, inspValue, p3, killValue, p4)
|
|
3212
|
+
{
|
|
3213
|
+
if (!g_EsoBuildLastInputValues || !g_EsoBuildLastInputValues.Set) return p1 + critValue + p2 + inspValue + p3 + killValue + p4;
|
|
3214
|
+
if (g_EsoBuildLastInputValues.Set.MorasWhispers == null || g_EsoBuildLastInputValues.Set.MorasWhispers == 0) return p1 + critValue + p2 + inspValue + p3 + killValue + p4;
|
|
3215
|
+
|
|
3216
|
+
var maxCrit = 1528;
|
|
3217
|
+
var maxInsp = 10;
|
|
3218
|
+
var maxKill = 15;
|
|
3219
|
+
|
|
3220
|
+
var matchResult = newDesc.match(/Gain up to (?:\<div[^>]*\>|)([0-9]+)(?:\<\/div\>|) Critical Chance and (?:\<div[^>]*\>|)([0-9%]+)(?:\<\/div\>|)% increased Inspiration, Alliance Rank, Alliance skill, and (?:\<div[^>]*\>|)([0-9%]+)(?:\<\/div\>|)% monster kill experience/i);
|
|
3221
|
+
|
|
3222
|
+
if (matchResult)
|
|
3223
|
+
{
|
|
3224
|
+
maxCrit = parseFloat(matchResult[1]);
|
|
3225
|
+
maxInsp = parseFloat(matchResult[2]);
|
|
3226
|
+
maxKill = parseFloat(matchResult[3]);
|
|
3227
|
+
}
|
|
3228
|
+
|
|
3229
|
+
var newCritValue = Math.round(g_EsoBuildLastInputValues.Set.MorasWhispers);
|
|
3230
|
+
var newInspValue = Math.round(g_EsoBuildLastInputValues.Set.MorasWhispers / maxCrit * maxInsp);
|
|
3231
|
+
var newKillValue = Math.round(g_EsoBuildLastInputValues.Set.MorasWhispers / maxCrit * maxKill);
|
|
3232
|
+
|
|
3233
|
+
return p1 + newCritValue + p2 + newInspValue + p3 + newKillValue + p4;
|
|
3234
|
+
});
|
|
3235
|
+
|
|
3236
|
+
// Pearlescent Ward
|
|
3237
|
+
// (5 items) Grants you and up to 11 other group members Pearlescent Ward. This bonus persists through death. Pearlescent Ward increases Weapon and Spell Damage by up to 180 based on the number of group members that are alive.
|
|
3238
|
+
// Current 180 Weapon and Spell Damage. Pearlescent Ward increases damage reduction from non-player enemies out of 66% based on the number of group members that are dead. Current 0% damage reduction.
|
|
3239
|
+
newDesc = newDesc.replace(/(Current (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|) Weapon and Spell Damage.*?Current (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|)% damage reduction)/i, function(match, p1, damageValue, p2, reductValue, p3)
|
|
3240
|
+
{
|
|
3241
|
+
if (!g_EsoBuildLastInputValues || !g_EsoBuildLastInputValues.Set) return p1 + damageValue + p2 + reductValue + p3;
|
|
3242
|
+
if (g_EsoBuildLastInputValues.Set.PearlescentWard == null || g_EsoBuildLastInputValues.Set.PearlescentWard == 0) return p1 + damageValue + p2 + reductValue + p3;
|
|
3243
|
+
|
|
3244
|
+
var maxDamage = 180;
|
|
3245
|
+
var maxReduct = 66;
|
|
3246
|
+
|
|
3247
|
+
var matchResult = newDesc.match(/Pearlescent Ward increases Weapon and Spell Damage by up to (?:\<div[^>]*\>|)([0-9]+)(?:\<\/div\>|) based on the number/i);
|
|
3248
|
+
if (!matchResult) return p1 + damageValue + p2 + reductValue + p3;
|
|
3249
|
+
|
|
3250
|
+
maxDamage = parseFloat(matchResult[1]);
|
|
3251
|
+
|
|
3252
|
+
var matchResult = newDesc.match(/Pearlescent Ward increases damage reduction from non-player enemies out of (?:\<div[^>]*\>|)([0-9]+)(?:\<\/div\>|%|) based on the number/i);
|
|
3253
|
+
if (matchResult) maxReduct = parseFloat(matchResult[1]);
|
|
3254
|
+
|
|
3255
|
+
var newDamageValue = Math.round(g_EsoBuildLastInputValues.Set.PearlescentWard / 12 * maxDamage);
|
|
3256
|
+
var newReductValue = Math.round(g_EsoBuildLastInputValues.Set.PearlescentWard / 12 * maxReduct);
|
|
3257
|
+
|
|
3258
|
+
return p1 + newDamageValue + p2 + newReductValue + p3;
|
|
3259
|
+
});
|
|
3260
|
+
|
|
3261
|
+
// Mark of the Pariah
|
|
3262
|
+
// Increases your Physical and Spell Resistance by up to 10206 based on your missing Health. Current value: 2373
|
|
3263
|
+
newDesc = newDesc.replace(/(based on your missing Health.*\s*Current value: (?:\<div[^>]*\>|))([0-9]+)((?:\<\/div\>|))/i, function(match, p1, currentValue, p2)
|
|
3264
|
+
{
|
|
3265
|
+
if (!g_EsoBuildLastInputValues || !g_EsoBuildLastInputValues.Set) return p1 + currentValue + p2;
|
|
3266
|
+
if (g_EsoBuildLastInputValues.Set.MarkPariah == null || g_EsoBuildLastInputValues.Set.MarkPariah == 0) return p1 + currentValue + p2;
|
|
3267
|
+
|
|
3268
|
+
var newValue = Math.round(g_EsoBuildLastInputValues.Set.MarkPariah);
|
|
3269
|
+
return p1 + newValue + p2;
|
|
3270
|
+
});
|
|
3271
|
+
|
|
3272
|
+
return newDesc;
|
|
3273
|
+
}
|
|
3274
|
+
|
|
3275
|
+
|
|
3276
|
+
window.UpdateEsoBuildSetTooltips = function(setDesc, setName)
|
|
3277
|
+
{
|
|
3278
|
+
if (window.g_SetSkillsData == null || window.GetEsoSkillDescription2 == null) return setDesc;
|
|
3279
|
+
|
|
3280
|
+
// Unsure why needed this and if its important or just cosmetic (need to refix at the end)
|
|
3281
|
+
var newDesc = setDesc.replace(".</div>", "</div>.");
|
|
3282
|
+
|
|
3283
|
+
if (setName == null)
|
|
3284
|
+
{
|
|
3285
|
+
var matches = newDesc.match("PART OF THE (.*) SET")
|
|
3286
|
+
if (!matches || !matches[1]) return newDesc;
|
|
3287
|
+
setName = matches[1];
|
|
3288
|
+
}
|
|
3289
|
+
|
|
3290
|
+
setName = setName.toLowerCase().replace("perfected ", "");
|
|
3291
|
+
|
|
3292
|
+
var setSkillsData = g_SetSkillsData[setName];
|
|
3293
|
+
if (setSkillsData == null) return newDesc;
|
|
3294
|
+
|
|
3295
|
+
setSkillsData.setDesc = setDesc;
|
|
3296
|
+
|
|
3297
|
+
var skillData = g_SkillsData[setSkillsData.abilityId];
|
|
3298
|
+
var newTooltip = GetEsoSkillDescription2(setSkillsData.abilityId, null, true);
|
|
3299
|
+
|
|
3300
|
+
var rawDesc = setSkillsData.rawDescription;
|
|
3301
|
+
rawDesc = rawDesc.replaceAll(/<<([0-9]+)\)>>/g, '<<$1>>'); // Fix strange <<1)>> in some tooltips
|
|
3302
|
+
rawDesc = rawDesc.replaceAll(" ", " ").replaceAll(" ", " ");
|
|
3303
|
+
setDesc = setDesc.replaceAll(" ", " ").replaceAll(" ", " ");
|
|
3304
|
+
newTooltip = newTooltip.replaceAll(" ", " ").replaceAll(" ", " ");
|
|
3305
|
+
|
|
3306
|
+
//rawDesc = rawDesc.replaceAll("|cffffff", "").replaceAll("|r", "");
|
|
3307
|
+
//setDesc = setDesc.replaceAll("|cffffff", "").replaceAll("|r", "");
|
|
3308
|
+
|
|
3309
|
+
var textDesc = $('<div>').html(setDesc).text();
|
|
3310
|
+
var valueMatch = "[A-Za-z0-9\-%\.\"\'#=\<\>;: ]*?";
|
|
3311
|
+
valueMatch = "[^(]*";
|
|
3312
|
+
|
|
3313
|
+
// Replace constant tooltips with their values from the original setDesc
|
|
3314
|
+
for (var i in setSkillsData.tooltips)
|
|
3315
|
+
{
|
|
3316
|
+
var tooltip = setSkillsData.tooltips[i];
|
|
3317
|
+
if (tooltip.coefType != -75) continue;
|
|
3318
|
+
|
|
3319
|
+
var matchDesc = rawDesc.replaceAll(".", '[.]');
|
|
3320
|
+
matchDesc = matchDesc.replaceAll("<<" + i + ">>", "(" + valueMatch + ")");
|
|
3321
|
+
matchDesc = matchDesc.replaceAll(/<<[0-9%]+>>/g, valueMatch);
|
|
3322
|
+
matchDesc = matchDesc.replaceAll(/[0-9%]+/g, valueMatch);
|
|
3323
|
+
matchDesc = matchDesc.replaceAll("\n", '');
|
|
3324
|
+
|
|
3325
|
+
matchDesc = matchDesc.replaceAll("|cffffff", ".*?");
|
|
3326
|
+
matchDesc = matchDesc.replaceAll("|r", ".*?");
|
|
3327
|
+
matchDesc = matchDesc.replaceAll(".*?" + valueMatch + ".*?", valueMatch);
|
|
3328
|
+
|
|
3329
|
+
var matchRegExp = new RegExp(matchDesc, 'i');
|
|
3330
|
+
|
|
3331
|
+
var replaceDesc = rawDesc.replaceAll(".", '[.]');
|
|
3332
|
+
replaceDesc = replaceDesc.replaceAll("<<" + i + ">>", ")(" + valueMatch + ")(");
|
|
3333
|
+
replaceDesc = "(" + replaceDesc.replaceAll(/<<[0-9%]+>>/g, valueMatch) + ")";
|
|
3334
|
+
replaceDesc = replaceDesc.replaceAll(/[0-9%]+/g, valueMatch);
|
|
3335
|
+
replaceDesc = replaceDesc.replaceAll("\n", "<br />");
|
|
3336
|
+
|
|
3337
|
+
replaceDesc = replaceDesc.replaceAll("|cffffff", ".*?");
|
|
3338
|
+
replaceDesc = replaceDesc.replaceAll("|r", ".*?");
|
|
3339
|
+
replaceDesc = replaceDesc.replaceAll(".*?" + valueMatch + ".*?", valueMatch);
|
|
3340
|
+
|
|
3341
|
+
var matches = textDesc.match(matchRegExp);
|
|
3342
|
+
var tooltipMatches = newTooltip.match(matchRegExp);
|
|
3343
|
+
|
|
3344
|
+
if (matches && matches[1])
|
|
3345
|
+
{
|
|
3346
|
+
var itemData = (window.g_EsoBuildItemData ? g_EsoBuildItemData[g_EsoCurrentTooltipSlot] : {} ) || {};
|
|
3347
|
+
|
|
3348
|
+
if (itemData.rawOutput == null) itemData.rawOutput = {};
|
|
3349
|
+
itemData.rawOutput["Tooltip: Set Scaling Skill ID"] = setSkillsData.abilityId;
|
|
3350
|
+
|
|
3351
|
+
var constValue = matches[1];
|
|
3352
|
+
|
|
3353
|
+
newTooltip = newTooltip.replaceAll(new RegExp(replaceDesc, "g"), function(match, p1, p2, p3, p4, p5, p6, p7, p8, p9) {
|
|
3354
|
+
var fmtValue = constValue.replace(/([0-9]+(?:[.][0-9]+|))/, "<div style=\"color:#ffffff;display:inline;\">$1</div>");
|
|
3355
|
+
var result = p1 + fmtValue + p3;
|
|
3356
|
+
if (p4) result += fmtValue + p5;
|
|
3357
|
+
if (p6) result += fmtValue + p7;
|
|
3358
|
+
if (p8) result += fmtValue + p9;
|
|
3359
|
+
return result;
|
|
3360
|
+
});
|
|
3361
|
+
|
|
3362
|
+
if (skillData && skillData.rawTooltipOutput && skillData.rawTooltipOutput[i])
|
|
3363
|
+
{
|
|
3364
|
+
skillData.rawTooltipOutput[i].origValue = skillData.rawTooltipOutput[i].baseValue;
|
|
3365
|
+
skillData.rawTooltipOutput[i].baseValue = constValue;
|
|
3366
|
+
skillData.rawTooltipOutput[i].finalValue = constValue;
|
|
3367
|
+
}
|
|
3368
|
+
|
|
3369
|
+
if (skillData && skillData.tooltips && skillData.tooltips[i])
|
|
3370
|
+
{
|
|
3371
|
+
skillData.tooltips[i].finalValue = constValue;
|
|
3372
|
+
}
|
|
3373
|
+
|
|
3374
|
+
tooltip.value = constValue;
|
|
3375
|
+
}
|
|
3376
|
+
}
|
|
3377
|
+
|
|
3378
|
+
var matchDesc = rawDesc.replaceAll(".", '[.]');
|
|
3379
|
+
matchDesc = matchDesc.replaceAll(/<<[0-9%]+>>/g, valueMatch);
|
|
3380
|
+
matchDesc = matchDesc.replaceAll(/[0-9%]+/g, valueMatch);
|
|
3381
|
+
matchDesc = matchDesc.replaceAll("\n", "<br>");
|
|
3382
|
+
|
|
3383
|
+
matchDesc = matchDesc.replaceAll("|cffffff", ".*?");
|
|
3384
|
+
matchDesc = matchDesc.replaceAll("|r", ".*?");
|
|
3385
|
+
matchDesc = matchDesc.replaceAll(".*?" + valueMatch + ".*?", valueMatch);
|
|
3386
|
+
|
|
3387
|
+
var matchRegExp = new RegExp(matchDesc, 'i');
|
|
3388
|
+
|
|
3389
|
+
//Fix parsing of disabled last set
|
|
3390
|
+
newDesc = newDesc.replace(/<\/div>.$/, ".</div>");
|
|
3391
|
+
|
|
3392
|
+
newDesc = newDesc.replaceAll(' ', ' ').replaceAll(' ', ' ').replaceAll(' ', ' ');
|
|
3393
|
+
newDesc = newDesc.replace(matchRegExp, newTooltip);
|
|
3394
|
+
|
|
3395
|
+
return newDesc;
|
|
3396
|
+
}
|
|
3397
|
+
|
|
3398
|
+
|
|
3399
|
+
window.UpdateEsoBuildSetAllData = function (setDesc, setDamageData, setName)
|
|
3400
|
+
{
|
|
3401
|
+
var newDesc = setDesc;
|
|
3402
|
+
if (newDesc == "") return newDesc;
|
|
3403
|
+
|
|
3404
|
+
newDesc = UpdateEsoBuildSetDamageData(newDesc, setDamageData);
|
|
3405
|
+
newDesc = UpdateEsoBuildSetDamageShield(newDesc);
|
|
3406
|
+
newDesc = UpdateEsoBuildSetHealing(newDesc);
|
|
3407
|
+
|
|
3408
|
+
newDesc = UpdateEsoBuildSetTooltips(newDesc, setName);
|
|
3409
|
+
|
|
3410
|
+
newDesc = UpdateEsoBuildSetOther(newDesc);
|
|
3411
|
+
|
|
3412
|
+
//EsoBuildLog("UpdateEsoBuildSetAllData", newDesc, setDesc, setDamageData);
|
|
3413
|
+
|
|
3414
|
+
return newDesc;
|
|
3415
|
+
}
|
|
3416
|
+
|
|
3417
|
+
|
|
3418
|
+
window.UpdateEsoBuildSetAllFullText = function (setText)
|
|
3419
|
+
{
|
|
3420
|
+
var matchResult;
|
|
3421
|
+
var setName = "";
|
|
3422
|
+
var setDamageData = null;
|
|
3423
|
+
|
|
3424
|
+
matchResult = setText.match(/PART OF THE ([A-Za-z0-9_\'\- ]+) SET/i);
|
|
3425
|
+
if (matchResult && matchResult[1]) setName = matchResult[1].toLowerCase();
|
|
3426
|
+
|
|
3427
|
+
//EsoBuildLog("UpdateEsoBuildSetAllFullText", matchResult, setName, ESO_SETPROCDAMAGE_DATA[setName], setText);
|
|
3428
|
+
|
|
3429
|
+
setDamageData = ESO_SETPROCDAMAGE_DATA[setName];
|
|
3430
|
+
return UpdateEsoBuildSetAllData(setText, setDamageData);
|
|
3431
|
+
}
|
|
3432
|
+
|
|
3433
|
+
|
|
3434
|
+
window.UpdateEsoBuildSetAll = function (setName, setDesc)
|
|
3435
|
+
{
|
|
3436
|
+
var matchResult;
|
|
3437
|
+
var setDamageData = null;
|
|
3438
|
+
|
|
3439
|
+
setDamageData = ESO_SETPROCDAMAGE_DATA[setName.toLowerCase()];
|
|
3440
|
+
return UpdateEsoBuildSetAllData(setDesc, setDamageData);
|
|
3441
|
+
}
|
|
3442
|
+
|
|
3443
|
+
|
|
3444
|
+
window.UpdateEsoBuildTooltipSet = function (setBlock, tooltip, parent, slotId)
|
|
3445
|
+
{
|
|
3446
|
+
var setHtml = "";
|
|
3447
|
+
var newSetHtml;
|
|
3448
|
+
|
|
3449
|
+
if (tooltip)
|
|
3450
|
+
{
|
|
3451
|
+
setHtml = setBlock.html();
|
|
3452
|
+
g_EsoCurrentTooltipSlot = $(parent).parent().attr("slotid");
|
|
3453
|
+
}
|
|
3454
|
+
else if (slotId)
|
|
3455
|
+
{
|
|
3456
|
+
g_EsoCurrentTooltipSlot = slotId;
|
|
3457
|
+
|
|
3458
|
+
var item = g_EsoBuildItemData[g_EsoCurrentTooltipSlot];
|
|
3459
|
+
if (item == null || item.setName == "") return;
|
|
3460
|
+
|
|
3461
|
+
setHtml = "PART OF THE " + item.setName + " SET\n" + item.setBonusDesc1 + "\n" + item.setBonusDesc2 + "\n" + item.setBonusDesc3 + "\n" + item.setBonusDesc4 + "\n" + item.setBonusDesc5 + "\n";
|
|
3462
|
+
setHtml = RemoveEsoDescriptionFormats(setHtml);
|
|
3463
|
+
}
|
|
3464
|
+
else
|
|
3465
|
+
{
|
|
3466
|
+
return;
|
|
3467
|
+
}
|
|
3468
|
+
|
|
3469
|
+
newSetHtml = UpdateEsoBuildSetAllFullText(setHtml);
|
|
3470
|
+
|
|
3471
|
+
if (tooltip && newSetHtml != setHtml) setBlock.html(newSetHtml);
|
|
3472
|
+
}
|
|
3473
|
+
|
|
3474
|
+
|
|
3475
|
+
window.UpdateEsoBuildTooltip = function (tooltip, parent, slotId)
|
|
3476
|
+
{
|
|
3477
|
+
var enchantBlock = null;
|
|
3478
|
+
var setBlock = null;
|
|
3479
|
+
|
|
3480
|
+
if (tooltip)
|
|
3481
|
+
{
|
|
3482
|
+
enchantBlock = $(tooltip).find("#esoil_itemenchantblock");
|
|
3483
|
+
setBlock = $(tooltip).find("#esoil_itemsetblock");
|
|
3484
|
+
}
|
|
3485
|
+
|
|
3486
|
+
UpdateEsoBuildTooltipEnchant(enchantBlock, tooltip, parent, slotId);
|
|
3487
|
+
UpdateEsoBuildTooltipSet(setBlock, tooltip, parent, slotId);
|
|
3488
|
+
}
|
|
3489
|
+
|
|
3490
|
+
|
|
3491
|
+
window.OnEsoTooltipUpdate = function (event, tooltip, parent)
|
|
3492
|
+
{
|
|
3493
|
+
// EsoBuildLog("OnEsoTooltipUpdate", tooltip, parent);
|
|
3494
|
+
UpdateEsoBuildTooltip(tooltip, parent, null);
|
|
3495
|
+
}
|
|
3496
|
+
|
|
3497
|
+
|
|
3498
|
+
window.EsoBuildLoadEmbed = function(buildId, elementId)
|
|
3499
|
+
{
|
|
3500
|
+
var queryParams = {};
|
|
3501
|
+
|
|
3502
|
+
queryParams.id = buildId;
|
|
3503
|
+
|
|
3504
|
+
$.ajax("//esochars.uesp.net/embedBuildData.php", {
|
|
3505
|
+
data: queryParams,
|
|
3506
|
+
}).
|
|
3507
|
+
done(function(data, status, xhr) { OnEsoBuildDataEmbedRequest(elementId, data, status, xhr); }).
|
|
3508
|
+
fail(function(xhr, status, errorMsg) { OnEsoBuildDataEmbedError(errorMsg, status, xhr); });
|
|
3509
|
+
}
|
|
3510
|
+
|
|
3511
|
+
|
|
3512
|
+
window.OnEsoBuildDataEmbedRequest = function(elementId, data, status, xhr)
|
|
3513
|
+
{
|
|
3514
|
+
$("#" + elementId).html(data);
|
|
3515
|
+
|
|
3516
|
+
$('.eso_item_link').hover(OnEsoItemLinkEnter, OnEsoItemLinkLeave);
|
|
3517
|
+
|
|
3518
|
+
onEsoBuildDataDocReady();
|
|
3519
|
+
esovcpOnDocReady();
|
|
3520
|
+
}
|
|
3521
|
+
|
|
3522
|
+
|
|
3523
|
+
window.OnEsoBuildDataEmbedError = function(errorMsg, status, xhr)
|
|
3524
|
+
{
|
|
3525
|
+
}
|
|
3526
|
+
|
|
3527
|
+
|
|
3528
|
+
window.onEsoBuildDataDocReady = function()
|
|
3529
|
+
{
|
|
3530
|
+
$(".ecdTooltipTrigger").hover(onTooltipHoverShow, onTooltipHoverHide, onTooltipMouseMove);
|
|
3531
|
+
$(".ecdTooltip").hover(onTooltipHoverHide, onTooltipHoverHide, onTooltipHoverHide);
|
|
3532
|
+
|
|
3533
|
+
$('.ecdSkillTreeName1').click(OnEsoSkillTreeName1Click);
|
|
3534
|
+
$('.ecdSkillTreeName2').click(OnEsoSkillTreeName2Click);
|
|
3535
|
+
|
|
3536
|
+
EsoSkillTree_LastOpenTreeName = $('.ecdSkillTreeName1:visible').first();
|
|
3537
|
+
EsoSkillTree_LastOpenTree = EsoSkillTree_LastOpenTreeName.next(".ecdSkillTreeContent1");
|
|
3538
|
+
|
|
3539
|
+
EsoSkillTree_LastSkillContentName = $('.ecdSkillTreeNameHighlight2').first();
|
|
3540
|
+
EsoSkillTree_LastSkillContent = $('.ecdSkillData:visible').first();
|
|
3541
|
+
|
|
3542
|
+
$("#ecdBuildTable a").click(OnBuildTableAnchorClick);
|
|
3543
|
+
$(".ecdBuildRowHover td").not(".ecdBuildTableButtons").click(OnBuildTableRowClick);
|
|
3544
|
+
|
|
3545
|
+
$("#ecdWeaponBar1").click(OnBuildWeaponBar1Click);
|
|
3546
|
+
$("#ecdWeaponBar2").click(OnBuildWeaponBar2Click);
|
|
3547
|
+
|
|
3548
|
+
$(".ecdActionBar1").click(OnBuildActionBar1Click);
|
|
3549
|
+
$(".ecdActionBar2").click(OnBuildActionBar2Click);
|
|
3550
|
+
$(".ecdActionBar3").click(OnBuildActionBar3Click);
|
|
3551
|
+
$(".ecdActionBar4").click(OnBuildActionBar4Click);
|
|
3552
|
+
|
|
3553
|
+
$("#ecdCharacterMenuRoot").click(OnCharMenuHoverIn);
|
|
3554
|
+
$("#ecdCharacterMenuRoot").hover(null, OnCharMenuHoverOut);
|
|
3555
|
+
$("#ecdBackgroundFocus").click(OnToggleCharBackgroundImage);
|
|
3556
|
+
|
|
3557
|
+
$(".ecdScreenshotCaptionButton").click(OnClickEsoScreenshotCaptionButton);
|
|
3558
|
+
$(".ecdScreenshotDeleteButton").click(OnClickEsoScreenshotDeleteButton);
|
|
3559
|
+
|
|
3560
|
+
$(document).on("esoTooltipUpdate", OnEsoTooltipUpdate);
|
|
3561
|
+
|
|
3562
|
+
g_EsoCharDataTimeUpdateId = setInterval(OnEsoCharDataTimeUpdate, 1000);
|
|
3563
|
+
|
|
3564
|
+
AddEsoCharDataAsyncHandlers(document);
|
|
3565
|
+
|
|
3566
|
+
UpdateEsoInventoryShownSpace();
|
|
3567
|
+
UpdateFirstQuestDetails();
|
|
3568
|
+
UpdateBuildStatData();
|
|
3569
|
+
|
|
3570
|
+
}
|
|
3571
|
+
|
|
3572
|
+
|
|
3573
|
+
$(document).ready(onEsoBuildDataDocReady);
|
|
3574
|
+
|
|
3575
|
+
|