1+ package ResonatingMaul
2+ import Assets
3+ import ItemObjEditing
4+ import ChannelAbilityPreset
5+
6+ import ItemTooltipGenerator
7+ import ItemAbilityPreset
8+ import ItemAlias
9+ import DalaranMerchant
10+ import SobiMask
11+ import Mindstaff
12+ import BlacksmithHammer
13+
14+ import StormHammer
15+ import ThunderClap
16+ import ItemCombine
17+ import LinkedList
18+ import ClosureEvents
19+ import DummyCaster
20+ import OrderIds
21+
22+
23+ public class ResonatingMaul
24+ static constant CLASSIFICATION = "Permanent"
25+ static constant ICON = "ReplaceableTextures\\CommandButtons\\BTNResonatingMaul.blp"
26+ static constant NAME = "Resonating Maul"
27+ static constant PASSIVE_DESC_1 = "The weaver's \"{0}\" mimics any \"{1}\" being in the area of its effect".format(StormHammer.NAME, ThunderClap.NAME)
28+ static constant PASSIVE_DESC_2 = "Any \"{0}\" mimics the weaver's \"{1}\" being in the area of its effect.".format(StormHammer.NAME, ThunderClap.NAME)
29+ static constant int GOLD_COST = Mindstaff.GOLD_COST * 2 + SobiMask.GOLD_COST + BlacksmithHammer.GOLD_COST + ResonatingMaulRecipe.GOLD_COST
30+ static constant int STR = BlacksmithHammer.STRENGTH
31+ static constant real MANA_REG = SobiMask.MANA_REG_RATE
32+ static constant int MANA = Mindstaff.MANA * 2 + 50
33+
34+ static constant ID = compiletime(ITEM_ID_GEN.next())
35+ static constant ALIAS_ID = compiletime(ITEM_ID_GEN.next())
36+
37+ private static constant DUMMY_ABIL_ID = compiletime(ABIL_ID_GEN.next())
38+
39+ protected static let tooltipGenerator = new ItemTooltipGenerator(NAME, "", GOLD_COST, "")
40+ ..addPassiveEffect(PASSIVE_DESC_1)
41+ ..addPassiveEffect(PASSIVE_DESC_2)
42+
43+ @compiletime protected static function build()
44+ let attrDef = buildAttributeBonus(NAME, ICON, STR, 0, 0, tooltipGenerator)
45+ let manaRegDef = buildManaRegenerationBonus(NAME, ICON, MANA_REG, tooltipGenerator)
46+ let manaDef = buildManaBonus(NAME, ICON, MANA, tooltipGenerator)
47+ ItemAlias.build(ID, ALIAS_ID)(ItemDefinition def, boolean isAlias) ->
48+ def..setLevel(1)
49+ ..setLevelUnclassified(1)
50+ ..setLumberCost(0)
51+ ..setHitPoints(999999)
52+ ..setNumberofCharges(0)
53+ ..setStockMaximum(1)
54+ ..setStockReplenishInterval(1)
55+ ..setStockStartDelay(1)
56+ ..setCanBeDropped(true)
57+ ..setPerishable(false)
58+ ..setActivelyUsed(false)
59+ ..setCanBeSoldByMerchants(true)
60+ ..setCanBeSoldToMerchants(true)
61+ ..setGoldCost(GOLD_COST)
62+ ..setClassification(CLASSIFICATION)
63+ ..setInterfaceIcon(ICON)
64+ tooltipGenerator.applyToDef(def)
65+ if not isAlias
66+ def.setAbilities(commaList(
67+ attrDef.getNewId(), manaRegDef.getNewId(), manaDef.getNewId()))
68+ new AbilityDefinitionMountainKingThunderClap(DUMMY_ABIL_ID)
69+ ..setLevels(ThunderClap.LEVELS)
70+ ..presetAOEDamage((int lvl) -> ThunderClap.DAMAGE[lvl - 1])
71+ ..presetAttackSpeedReduction((int lvl) -> ThunderClap.ATTACK_SPEED_REDUCTION)
72+ ..presetMovementSpeedReduction((int lvl) -> ThunderClap.MOVEMENT_SPEED_REDUCTION)
73+ ..presetAreaofEffect((int lvl) -> ThunderClap.AOE)
74+ ..presetBuffs((int lvl) -> ThunderClap.BUFF_ID.toRawCode())
75+ ..presetDurationHero((int lvl) -> ThunderClap.DURATION)
76+ ..presetDurationNormal((int lvl) -> ThunderClap.DURATION)
77+ ..presetTargetsAllowed((int lvl) -> ThunderClap.TARGETS_ALLOWED)
78+ ..setArtCaster("")
79+ ..setArtEffect(ThunderClap.FX_EFFECT)
80+ ..setDummyAbility()
81+
82+ protected static function onInit()
83+ new ItemCombine(ID, asList<int>(Mindstaff.ID, Mindstaff.ID, SobiMask.ID, BlacksmithHammer.ID, ResonatingMaulRecipe.ID))
84+
85+ EventListener.onCast(ThunderClap.ID) (unit caster) ->
86+ let casterPos = caster.getPos()
87+ let aoeSq = ThunderClap.AOE.squared()
88+ let p = caster.getOwner()
89+ let lvl = caster.getAbilityLevel(ThunderClap.ID)
90+ for hammer in StormHammer
91+ let hammerPos = hammer.getPos()
92+ if hammer.getPos().distanceToSq(casterPos) <= aoeSq
93+ if caster.hasItemById(ID) or hammer.getCaster().hasItemById(ID)
94+ new DummyCaster
95+ ..origin(hammerPos)
96+ ..owner(p)
97+ ..castImmediate(DUMMY_ABIL_ID, lvl, OrderIds.thunderclap)
98+
99+
100+
101+ public class ResonatingMaulRecipe
102+ static constant CLASSIFICATION = "Permanent"
103+ static constant NAME = "{0} Recipe".format(ResonatingMaul.NAME)
104+ static constant ICON = Icons.bTNSnazzyScrollGreen
105+ static constant int SHOP_X = 2
106+ static constant int SHOP_Y = 1
107+ static constant int GOLD_COST = 600
108+ static constant int ID = compiletime(ITEM_ID_GEN.next())
109+ static constant int ALIAS_ID = compiletime(ITEM_ID_GEN.next())
110+
111+ protected static let tooltipGenerator = ResonatingMaul.tooltipGenerator.copy()
112+ ..setName(NAME)
113+ ..addRecipeRequirement(Mindstaff.NAME, Mindstaff.GOLD_COST)
114+ ..addRecipeRequirement(Mindstaff.NAME, Mindstaff.GOLD_COST)
115+ ..addRecipeRequirement(SobiMask.NAME, SobiMask.GOLD_COST)
116+ ..addRecipeRequirement(BlacksmithHammer.NAME, BlacksmithHammer.GOLD_COST)
117+ ..addRecipeRequirement("Recipe", GOLD_COST)
118+ ..setComment("")
119+
120+ @compiletime protected static function build()
121+ ItemAlias.build(ID, ALIAS_ID) (ItemDefinition def, boolean isAlias) ->
122+ def..setLevel(1)
123+ ..setLevelUnclassified(1)
124+ ..setLumberCost(0)
125+ ..setHitPoints(999999)
126+ ..setNumberofCharges(0)
127+ ..setStockMaximum(1)
128+ ..setStockReplenishInterval(1)
129+ ..setStockStartDelay(1)
130+ ..setCanBeDropped(true)
131+ ..setPerishable(false)
132+ ..setActivelyUsed(false)
133+ ..setCanBeSoldByMerchants(true)
134+ ..setCanBeSoldToMerchants(true)
135+ ..setAbilities("")
136+ ..setGoldCost(GOLD_COST)
137+ ..setButtonPositionX(SHOP_X)
138+ ..setButtonPositionY(SHOP_Y)
139+ ..setClassification(CLASSIFICATION)
140+ ..setInterfaceIcon(isAlias ? ResonatingMaul.ICON : ICON)
141+ tooltipGenerator..setName(NAME)
142+ ..applyToDef(def, true)
143+ if isAlias
144+ dalaranMerchant.addItemSold(def.getNewId())
145+
146+
147+ init
148+ ResonatingMaul.onInit()
0 commit comments