warscript 0.0.1-dev.3bc4ba4 → 0.0.1-dev.3dad3ec

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.
Files changed (52) hide show
  1. package/core/types/frame.lua +25 -12
  2. package/core/types/player.lua +4 -1
  3. package/core/types/playerCamera.d.ts +2 -0
  4. package/core/types/playerCamera.lua +76 -2
  5. package/core/types/timer.d.ts +2 -1
  6. package/core/types/timer.lua +7 -2
  7. package/decl/native.d.ts +4 -2
  8. package/engine/behavior.d.ts +2 -0
  9. package/engine/behavior.lua +53 -27
  10. package/engine/behaviour/ability/apply-buff.lua +1 -1
  11. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  12. package/engine/behaviour/ability/emulate-impact.lua +2 -1
  13. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  14. package/engine/behaviour/ability/restore-mana.lua +6 -6
  15. package/engine/behaviour/ability.lua +7 -16
  16. package/engine/behaviour/unit/stun-immunity.d.ts +5 -3
  17. package/engine/behaviour/unit/stun-immunity.lua +43 -27
  18. package/engine/behaviour/unit.d.ts +12 -1
  19. package/engine/behaviour/unit.lua +56 -7
  20. package/engine/buff.d.ts +2 -1
  21. package/engine/buff.lua +9 -3
  22. package/engine/internal/ability.lua +8 -2
  23. package/engine/internal/item/ability.lua +51 -1
  24. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  25. package/engine/internal/misc/get-terrain-z.lua +11 -0
  26. package/engine/internal/unit/ability.d.ts +30 -0
  27. package/engine/internal/unit/ability.lua +48 -0
  28. package/engine/internal/unit/order.d.ts +20 -0
  29. package/engine/internal/unit/order.lua +136 -0
  30. package/engine/internal/unit-missile-launch.lua +8 -1
  31. package/engine/internal/unit.d.ts +3 -3
  32. package/engine/internal/unit.lua +70 -57
  33. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  34. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  35. package/engine/object-data/entry/ability-type.lua +1 -3
  36. package/engine/object-data/entry/unit-type.d.ts +11 -2
  37. package/engine/object-data/entry/unit-type.lua +59 -1
  38. package/engine/object-field/unit.d.ts +11 -0
  39. package/engine/object-field/unit.lua +34 -0
  40. package/engine/standard/fields/unit.d.ts +4 -0
  41. package/engine/standard/fields/unit.lua +7 -0
  42. package/engine/text-tag.d.ts +26 -3
  43. package/engine/text-tag.lua +215 -11
  44. package/engine/unit.d.ts +1 -0
  45. package/engine/unit.lua +1 -0
  46. package/package.json +2 -2
  47. package/utility/functions.d.ts +7 -0
  48. package/utility/functions.lua +12 -0
  49. package/utility/lua-sets.d.ts +1 -0
  50. package/utility/lua-sets.lua +4 -0
  51. package/core/types/order.d.ts +0 -26
  52. package/core/types/order.lua +0 -65
@@ -49,7 +49,7 @@ function UnitBehavior.prototype.onDestroy(self)
49
49
  end
50
50
  return Behavior.prototype.onDestroy(self)
51
51
  end
52
- function UnitBehavior.prototype.registerInRangeUnitEvent(self, event, range, listener)
52
+ function UnitBehavior.prototype.registerInRangeUnitEvent(self, event, extractUnit, range, listener)
53
53
  local rangeByBehavior = getOrPut(rangeByBehaviorByEvent, event, mutableLuaMap)
54
54
  rangeByBehavior[self] = range
55
55
  local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
@@ -57,14 +57,17 @@ function UnitBehavior.prototype.registerInRangeUnitEvent(self, event, range, lis
57
57
  getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
58
58
  local behaviors = behaviorsByEvent[event]
59
59
  if behaviors == nil then
60
- event:addListener(function(unit, ...)
60
+ event:addListener(function(...)
61
61
  local behaviors = behaviorsByEvent[event]
62
62
  if behaviors ~= nil then
63
- for behavior in pairs(behaviors) do
64
- local range = rangeByBehavior[behavior]
65
- if range ~= nil and unit:getCollisionDistanceTo(behavior.unit) <= range then
66
- local ____self_6 = behavior
67
- ____self_6[listenerByBehavior[behavior]](____self_6, unit, ...)
63
+ local unit = extractUnit(...)
64
+ if unit ~= nil then
65
+ for behavior in pairs(behaviors) do
66
+ local range = rangeByBehavior[behavior]
67
+ if range ~= nil and unit:getCollisionDistanceTo(behavior.unit) <= range then
68
+ local ____self_6 = behavior
69
+ ____self_6[listenerByBehavior[behavior]](____self_6, ...)
70
+ end
68
71
  end
69
72
  end
70
73
  end
@@ -104,10 +107,28 @@ function UnitBehavior.prototype.onAbilityChannelingStart(self, ability)
104
107
  end
105
108
  function UnitBehavior.prototype.onAbilityImpact(self, ability)
106
109
  end
110
+ function UnitBehavior.prototype.onAbilityWidgetTargetImpact(self, ability, target)
111
+ end
112
+ function UnitBehavior.prototype.onAbilityUnitTargetImpact(self, ability, target)
113
+ end
114
+ function UnitBehavior.prototype.onAbilityItemTargetImpact(self, ability, target)
115
+ end
116
+ function UnitBehavior.prototype.onAbilityDestructibleTargetImpact(self, ability, target)
117
+ end
118
+ function UnitBehavior.prototype.onAbilityPointTargetImpact(self, ability, x, y)
119
+ end
120
+ function UnitBehavior.prototype.onAbilityNoTargetImpact(self, ability)
121
+ end
107
122
  function UnitBehavior.prototype.onAbilityChannelingFinish(self, ability)
108
123
  end
109
124
  function UnitBehavior.prototype.onAbilityStop(self, ability)
110
125
  end
126
+ function UnitBehavior.prototype.onTargetingAbilityChannelingStart(self, ability, source)
127
+ end
128
+ function UnitBehavior.prototype.onTargetingAbilityImpact(self, ability, source)
129
+ end
130
+ function UnitBehavior.prototype.onBuffGained(self, buff)
131
+ end
111
132
  function UnitBehavior.prototype.onItemDropped(self, item)
112
133
  end
113
134
  function UnitBehavior.prototype.onItemPickedUp(self, item)
@@ -175,9 +196,37 @@ __TS__SetDescriptor(
175
196
  Unit.abilityChannelingStartEvent:addListener(function(source, ability)
176
197
  ____exports.UnitBehavior:forAll(source, "onAbilityChannelingStart", ability)
177
198
  end)
199
+ Unit.abilityUnitTargetChannelingStartEvent:addListener(function(source, ability, target)
200
+ ____exports.UnitBehavior:forAll(target, "onTargetingAbilityChannelingStart", ability, source)
201
+ end)
178
202
  Unit.abilityImpactEvent:addListener(function(source, ability)
179
203
  ____exports.UnitBehavior:forAll(source, "onAbilityImpact", ability)
180
204
  end)
205
+ Unit.abilityWidgetTargetImpactEvent:addListener(function(source, ability, target)
206
+ ____exports.UnitBehavior:forAll(source, "onAbilityWidgetTargetImpact", ability, target)
207
+ end)
208
+ Unit.abilityUnitTargetImpactEvent:addListener(function(source, ability, target)
209
+ ____exports.UnitBehavior:forAll(source, "onAbilityUnitTargetImpact", ability, target)
210
+ ____exports.UnitBehavior:forAll(target, "onTargetingAbilityImpact", ability, source)
211
+ end)
212
+ Unit.abilityItemTargetImpactEvent:addListener(function(source, ability, target)
213
+ ____exports.UnitBehavior:forAll(source, "onAbilityItemTargetImpact", ability, target)
214
+ end)
215
+ Unit.abilityDestructibleTargetImpactEvent:addListener(function(source, ability, target)
216
+ ____exports.UnitBehavior:forAll(source, "onAbilityDestructibleTargetImpact", ability, target)
217
+ end)
218
+ Unit.abilityPointTargetImpactEvent:addListener(function(source, ability, x, y)
219
+ ____exports.UnitBehavior:forAll(
220
+ source,
221
+ "onAbilityPointTargetImpact",
222
+ ability,
223
+ x,
224
+ y
225
+ )
226
+ end)
227
+ Unit.abilityNoTargetImpactEvent:addListener(function(source, ability)
228
+ ____exports.UnitBehavior:forAll(source, "onAbilityNoTargetImpact", ability)
229
+ end)
181
230
  Unit.abilityChannelingFinishEvent:addListener(function(source, ability)
182
231
  ____exports.UnitBehavior:forAll(source, "onAbilityChannelingFinish", ability)
183
232
  end)
package/engine/buff.d.ts CHANGED
@@ -278,6 +278,7 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
278
278
  onDeath(source: Unit | undefined): void;
279
279
  onDamageDealt(target: Unit, event: DamageEvent): void;
280
280
  onDamageReceived(source: Unit | undefined, event: DamageEvent): void;
281
- static readonly destroyEvent: Event<[Buff<object>]>;
281
+ static readonly createdEvent: Event<[Buff<object>]>;
282
+ static readonly beingDestroyedEvent: Event<[Buff<object>]>;
282
283
  }
283
284
  export {};
package/engine/buff.lua CHANGED
@@ -304,7 +304,8 @@ buffHealingIntervalTimerCallback = function(buff)
304
304
  source:healTarget(buff[101], healingPerInterval)
305
305
  end
306
306
  end
307
- local buffDestroyEvent = __TS__New(Event)
307
+ local buffCreatedEvent = __TS__New(Event)
308
+ local buffBeingDestroyedEvent = __TS__New(Event)
308
309
  ____exports.Buff = __TS__Class()
309
310
  local Buff = ____exports.Buff
310
311
  Buff.name = "Buff"
@@ -506,6 +507,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
506
507
  end
507
508
  self:onCreate()
508
509
  self[100] = 1
510
+ Event.invoke(buffCreatedEvent, self)
509
511
  end
510
512
  function Buff.prototype.getUnitBonus(self, bonusType)
511
513
  local ____opt_38 = self._bonusIdByBonusType
@@ -619,7 +621,7 @@ function Buff.prototype.onDestroy(self)
619
621
  removeUnitBonus(unit, bonusType, bonusId)
620
622
  end
621
623
  end
622
- Event.invoke(buffDestroyEvent, self)
624
+ Event.invoke(buffBeingDestroyedEvent, self)
623
625
  self[100] = 3
624
626
  return UnitBehavior.prototype.onDestroy(self)
625
627
  end
@@ -1288,7 +1290,8 @@ __TS__SetDescriptor(
1288
1290
  },
1289
1291
  true
1290
1292
  )
1291
- Buff.destroyEvent = buffDestroyEvent;
1293
+ Buff.createdEvent = buffCreatedEvent
1294
+ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1292
1295
  (function(self)
1293
1296
  local function destroyBuffIfNeeded(buff)
1294
1297
  if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
@@ -1342,5 +1345,8 @@ Buff.destroyEvent = buffDestroyEvent;
1342
1345
  ____exports.checkBuffs(target)
1343
1346
  end
1344
1347
  )
1348
+ buffCreatedEvent:addListener(function(buff)
1349
+ UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1350
+ end)
1345
1351
  end)(Buff)
1346
1352
  return ____exports
@@ -404,11 +404,17 @@ function UnitAbility.prototype.decrementHideCounter(self)
404
404
  unitHideAbility(self.u, self.typeId, false)
405
405
  end
406
406
  function UnitAbility.prototype.incrementDisableCounter(self)
407
- unitDisableAbility(self.u, self.typeId, true, false)
407
+ local unit = self.u
408
+ local typeId = self.typeId
409
+ unitHideAbility(unit, typeId, true)
410
+ unitDisableAbility(unit, typeId, true, false)
408
411
  self.d = (self.d or 0) + 1
409
412
  end
410
413
  function UnitAbility.prototype.decrementDisableCounter(self)
411
- unitDisableAbility(self.u, self.typeId, false, false)
414
+ local unit = self.u
415
+ local typeId = self.typeId
416
+ unitDisableAbility(unit, typeId, false, false)
417
+ unitHideAbility(unit, typeId, true)
412
418
  self.d = (self.d or 0) - 1
413
419
  end
414
420
  function UnitAbility.prototype.interruptCast(self)
@@ -20,6 +20,7 @@ local ____add_2Ditem_2Dto_2Dslot = require("engine.internal.unit.add-item-to-slo
20
20
  local unitAddItemToSlot = ____add_2Ditem_2Dto_2Dslot.unitAddItemToSlot
21
21
  local isItemOwned = IsItemOwned
22
22
  local isItemPowerup = IsItemPowerup
23
+ local getItemAbility = BlzGetItemAbility
23
24
  local getItemX = GetItemX
24
25
  local getItemY = GetItemY
25
26
  local setAbilityRealLevelField = BlzSetAbilityRealLevelField
@@ -31,6 +32,8 @@ local unitAddItem = UnitAddItem
31
32
  local unitRemoveItem = UnitRemoveItem
32
33
  local unitUseItem = UnitUseItem
33
34
  local unitResetCooldown = UnitResetCooldown
35
+ local unitInventorySize = UnitInventorySize
36
+ local unitItemInSlot = UnitItemInSlot
34
37
  local COOLDOWN_STARTER_ABILITY_TYPE_ID = compiletime(function()
35
38
  if not currentMap then
36
39
  return 0
@@ -65,7 +68,7 @@ ____exports.itemAbilityDummy = assert(CreateUnit(
65
68
  270
66
69
  ))
67
70
  local cooldownStarterItem = UnitAddItemById(____exports.itemAbilityDummy, COOLDOWN_STARTER_ITEM_TYPE_ID)
68
- local cooldownStarterAbility = BlzGetItemAbility(cooldownStarterItem, COOLDOWN_STARTER_ABILITY_TYPE_ID)
71
+ local cooldownStarterAbility = getItemAbility(cooldownStarterItem, COOLDOWN_STARTER_ABILITY_TYPE_ID)
69
72
  ShowUnit(____exports.itemAbilityDummy, false)
70
73
  local function startItemCooldownInternal(handle, cooldown)
71
74
  local cooldownGroup = getItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP)
@@ -153,4 +156,51 @@ ____exports.doAbilityActionForceDummy = function(handle, owner, action, ...)
153
156
  end
154
157
  return result
155
158
  end
159
+ local depth = 0
160
+ local itemBySlot = {}
161
+ ---
162
+ -- @internal For use by internal systems only.
163
+ ____exports.doUnitAbilityAction = function(unit, abilityTypeId, action, ...)
164
+ local ____depth_0 = depth
165
+ depth = ____depth_0 + 1
166
+ local offset = 6 * ____depth_0
167
+ for slot = 0, unitInventorySize(unit) - 1 do
168
+ local item = unitItemInSlot(unit, slot)
169
+ if getItemAbility(item, abilityTypeId) ~= nil then
170
+ local isAlreadyIgnoredInEvents = ignoreEventsItems[item] ~= nil
171
+ if not isAlreadyIgnoredInEvents then
172
+ ignoreEventsItems[item] = true
173
+ end
174
+ unitRemoveItem(unit, item)
175
+ if not isAlreadyIgnoredInEvents then
176
+ ignoreEventsItems[item] = nil
177
+ end
178
+ itemBySlot[offset + slot] = item
179
+ end
180
+ end
181
+ local result = action(unit, ...)
182
+ for slot = 0, unitInventorySize(unit) - 1 do
183
+ local item = itemBySlot[offset + slot]
184
+ if item ~= nil then
185
+ local isAlreadyIgnoredInEvents = ignoreEventsItems[item] ~= nil
186
+ if not isAlreadyIgnoredInEvents then
187
+ ignoreEventsItems[item] = true
188
+ end
189
+ local isPowerup = isItemPowerup(item)
190
+ if isPowerup then
191
+ setItemBooleanField(item, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, false)
192
+ end
193
+ unitAddItemToSlot(unit, item, slot)
194
+ if isPowerup then
195
+ setItemBooleanField(item, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
196
+ end
197
+ if not isAlreadyIgnoredInEvents then
198
+ ignoreEventsItems[item] = nil
199
+ end
200
+ itemBySlot[offset + slot] = nil
201
+ end
202
+ end
203
+ depth = depth - 1
204
+ return result
205
+ end
156
206
  return ____exports
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,11 @@
1
+ local ____exports = {}
2
+ local getLocationZ = GetLocationZ
3
+ local moveLocation = MoveLocation
4
+ local location = Location(0, 0)
5
+ ---
6
+ -- @internal For use by internal systems only.
7
+ ____exports.getTerrainZ = function(x, y)
8
+ moveLocation(location, x, y)
9
+ return getLocationZ(location)
10
+ end
11
+ return ____exports
@@ -136,6 +136,36 @@ declare module "../unit" {
136
136
  const abilityImpactEvent: DispatchingEvent<[Unit, Ability]>;
137
137
  }
138
138
  }
139
+ declare module "../unit" {
140
+ namespace Unit {
141
+ const abilityWidgetTargetImpactEvent: DispatchingEvent<[Unit, Ability, Widget]>;
142
+ }
143
+ }
144
+ declare module "../unit" {
145
+ namespace Unit {
146
+ const abilityUnitTargetImpactEvent: DispatchingEvent<[Unit, Ability, Unit]>;
147
+ }
148
+ }
149
+ declare module "../unit" {
150
+ namespace Unit {
151
+ const abilityItemTargetImpactEvent: DispatchingEvent<[Unit, Ability, Item]>;
152
+ }
153
+ }
154
+ declare module "../unit" {
155
+ namespace Unit {
156
+ const abilityDestructibleTargetImpactEvent: DispatchingEvent<[Unit, Ability, Destructable]>;
157
+ }
158
+ }
159
+ declare module "../unit" {
160
+ namespace Unit {
161
+ const abilityPointTargetImpactEvent: DispatchingEvent<[Unit, Ability, number, number]>;
162
+ }
163
+ }
164
+ declare module "../unit" {
165
+ namespace Unit {
166
+ const abilityNoTargetImpactEvent: DispatchingEvent<[Unit, Ability]>;
167
+ }
168
+ }
139
169
  declare module "../unit" {
140
170
  namespace Unit {
141
171
  const abilityChannelingFinishEvent: DispatchingEvent<[Unit, Ability]>;
@@ -359,6 +359,54 @@ rawset(
359
359
  extractAbilityTypeId
360
360
  )
361
361
  )
362
+ rawset(
363
+ Unit,
364
+ "abilityWidgetTargetImpactEvent",
365
+ createDispatchingEvent(
366
+ createWidgetTargetEvent(internalAbilityImpactEvent),
367
+ extractAbilityTypeId
368
+ )
369
+ )
370
+ rawset(
371
+ Unit,
372
+ "abilityUnitTargetImpactEvent",
373
+ createDispatchingEvent(
374
+ createUnitTargetEvent(internalAbilityImpactEvent),
375
+ extractAbilityTypeId
376
+ )
377
+ )
378
+ rawset(
379
+ Unit,
380
+ "abilityItemTargetImpactEvent",
381
+ createDispatchingEvent(
382
+ createItemTargetEvent(internalAbilityImpactEvent),
383
+ extractAbilityTypeId
384
+ )
385
+ )
386
+ rawset(
387
+ Unit,
388
+ "abilityDestructibleTargetImpactEvent",
389
+ createDispatchingEvent(
390
+ createDestructibleTargetEvent(internalAbilityImpactEvent),
391
+ extractAbilityTypeId
392
+ )
393
+ )
394
+ rawset(
395
+ Unit,
396
+ "abilityPointTargetImpactEvent",
397
+ createDispatchingEvent(
398
+ createPointTargetEvent(internalAbilityImpactEvent),
399
+ extractAbilityTypeId
400
+ )
401
+ )
402
+ rawset(
403
+ Unit,
404
+ "abilityNoTargetImpactEvent",
405
+ createDispatchingEvent(
406
+ createNoTargetEvent(internalAbilityImpactEvent),
407
+ extractAbilityTypeId
408
+ )
409
+ )
362
410
  rawset(
363
411
  Unit,
364
412
  "abilityChannelingFinishEvent",
@@ -0,0 +1,20 @@
1
+ /** @noSelfInFile */
2
+ import { Widget } from "../../../core/types/widget";
3
+ export declare const enum OrderType {
4
+ IMMEDIATE = 0,
5
+ POINT = 1,
6
+ TARGET = 2
7
+ }
8
+ declare module "../unit" {
9
+ interface Unit {
10
+ readonly currentOrderType: OrderType;
11
+ readonly currentOrderId: number;
12
+ readonly currentOrderStartTime: number;
13
+ readonly currentOrderStartX: number;
14
+ readonly currentOrderStartY: number;
15
+ readonly currentOrderTargetX: number;
16
+ readonly currentOrderTargetY: number;
17
+ readonly currentOrderTarget?: Widget;
18
+ issueOrder(...order: [orderType: OrderType.IMMEDIATE, orderId: number] | [orderType: OrderType.POINT, orderId: number, x: number, y: number] | [orderType: OrderType.TARGET, orderId: number, target: Widget]): boolean;
19
+ }
20
+ }
@@ -0,0 +1,136 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
3
+ local ____exports = {}
4
+ local ____attributes = require("attributes")
5
+ local attribute = ____attributes.attribute
6
+ local ____unit = require("engine.internal.unit")
7
+ local Unit = ____unit.Unit
8
+ local ____game = require("core.game")
9
+ local elapsedTime = ____game.elapsedTime
10
+ local getUnitCurrentOrder = GetUnitCurrentOrder
11
+ local issueImmediateOrderById = IssueImmediateOrderById
12
+ local issuePointOrderById = IssuePointOrderById
13
+ local issueTargetOrderById = IssueTargetOrderById
14
+ local unitLastOrderTypeAttribute = attribute()
15
+ local unitLastOrderIdAttribute = attribute()
16
+ local unitLastOrderStartTimeAttribute = attribute()
17
+ local unitLastOrderStartXAttribute = attribute()
18
+ local unitLastOrderStartYAttribute = attribute()
19
+ local unitLastOrderTargetXAttribute = attribute()
20
+ local unitLastOrderTargetYAttribute = attribute()
21
+ local unitLastOrderTargetAttribute = attribute()
22
+ Unit.onImmediateOrder:addListener(
23
+ 4,
24
+ function(unit, orderId)
25
+ unit[unitLastOrderTypeAttribute] = 0
26
+ unit[unitLastOrderIdAttribute] = orderId
27
+ unit[unitLastOrderStartTimeAttribute] = elapsedTime()
28
+ unit[unitLastOrderStartXAttribute] = unit.x
29
+ unit[unitLastOrderStartYAttribute] = unit.y
30
+ unit[unitLastOrderTargetXAttribute] = nil
31
+ unit[unitLastOrderTargetYAttribute] = nil
32
+ unit[unitLastOrderTargetAttribute] = nil
33
+ end
34
+ )
35
+ Unit.onPointOrder:addListener(
36
+ 4,
37
+ function(unit, orderId, x, y)
38
+ unit[unitLastOrderTypeAttribute] = 1
39
+ unit[unitLastOrderIdAttribute] = orderId
40
+ unit[unitLastOrderStartTimeAttribute] = elapsedTime()
41
+ unit[unitLastOrderStartXAttribute] = unit.x
42
+ unit[unitLastOrderStartYAttribute] = unit.y
43
+ unit[unitLastOrderTargetXAttribute] = x
44
+ unit[unitLastOrderTargetYAttribute] = y
45
+ unit[unitLastOrderTargetAttribute] = nil
46
+ end
47
+ )
48
+ Unit.onTargetOrder:addListener(
49
+ 4,
50
+ function(unit, orderId, target)
51
+ unit[unitLastOrderTypeAttribute] = 2
52
+ unit[unitLastOrderIdAttribute] = orderId
53
+ unit[unitLastOrderStartTimeAttribute] = elapsedTime()
54
+ unit[unitLastOrderStartXAttribute] = unit.x
55
+ unit[unitLastOrderStartYAttribute] = unit.y
56
+ unit[unitLastOrderTargetXAttribute] = target.x
57
+ unit[unitLastOrderTargetYAttribute] = target.y
58
+ unit[unitLastOrderTargetAttribute] = target
59
+ end
60
+ )
61
+ local function toUndefinedIfCurrentOrderDoesNotMatchLast(unit, value)
62
+ local currentOrderId = getUnitCurrentOrder(unit.handle)
63
+ local lastOrderId = unit[unitLastOrderIdAttribute]
64
+ local ____temp_0
65
+ if currentOrderId == lastOrderId or currentOrderId == orderId("patrolAI") and lastOrderId == orderId("patrol") then
66
+ ____temp_0 = value
67
+ else
68
+ ____temp_0 = nil
69
+ end
70
+ return ____temp_0
71
+ end
72
+ __TS__ObjectDefineProperty(
73
+ Unit.prototype,
74
+ "currentOrderType",
75
+ {get = function(self)
76
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderTypeAttribute]) or 0
77
+ end}
78
+ )
79
+ __TS__ObjectDefineProperty(
80
+ Unit.prototype,
81
+ "currentOrderId",
82
+ {get = function(self)
83
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderIdAttribute]) or 0
84
+ end}
85
+ )
86
+ __TS__ObjectDefineProperty(
87
+ Unit.prototype,
88
+ "currentOrderStartTime",
89
+ {get = function(self)
90
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderStartTimeAttribute]) or 0
91
+ end}
92
+ )
93
+ __TS__ObjectDefineProperty(
94
+ Unit.prototype,
95
+ "currentOrderStartX",
96
+ {get = function(self)
97
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderStartXAttribute]) or 0
98
+ end}
99
+ )
100
+ __TS__ObjectDefineProperty(
101
+ Unit.prototype,
102
+ "currentOrderStartY",
103
+ {get = function(self)
104
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderStartYAttribute]) or 0
105
+ end}
106
+ )
107
+ __TS__ObjectDefineProperty(
108
+ Unit.prototype,
109
+ "currentOrderTargetX",
110
+ {get = function(self)
111
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderTargetXAttribute]) or 0
112
+ end}
113
+ )
114
+ __TS__ObjectDefineProperty(
115
+ Unit.prototype,
116
+ "currentOrderTargetY",
117
+ {get = function(self)
118
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderTargetYAttribute]) or 0
119
+ end}
120
+ )
121
+ __TS__ObjectDefineProperty(
122
+ Unit.prototype,
123
+ "currentOrderTarget",
124
+ {get = function(self)
125
+ return toUndefinedIfCurrentOrderDoesNotMatchLast(self, self[unitLastOrderTargetAttribute])
126
+ end}
127
+ )
128
+ local issueOrderByType = {
129
+ [0] = issueImmediateOrderById,
130
+ [1] = issuePointOrderById,
131
+ [2] = function(unitHandle, orderId, widget) return issueTargetOrderById(unitHandle, orderId, widget.handle) end
132
+ }
133
+ Unit.prototype.issueOrder = function(self, orderType, orderId, xOrTarget, y)
134
+ return issueOrderByType[orderType](self.handle, orderId, xOrTarget, y)
135
+ end
136
+ return ____exports
@@ -9,6 +9,8 @@ local ____timer = require("core.types.timer")
9
9
  local Timer = ____timer.Timer
10
10
  local ____lua_2Dsets = require("utility.lua-sets")
11
11
  local luaSetOf = ____lua_2Dsets.luaSetOf
12
+ local ____math = require("math")
13
+ local min = ____math.min
12
14
  local autoAttackFinishEvent = __TS__New(Event)
13
15
  rawset(Unit, "autoAttackFinishEvent", autoAttackFinishEvent)
14
16
  local eventTimerByUnit = {}
@@ -45,7 +47,12 @@ local function timerCallback(source, target)
45
47
  end
46
48
  Unit.autoAttackStartEvent:addListener(function(source, target)
47
49
  local attackPoint = (source:chooseWeapon(target) or source.firstWeapon).impactDelay
48
- local timer = Timer:simple(attackPoint, timerCallback, source, target)
50
+ local timer = Timer:simple(
51
+ attackPoint + min(0.001, attackPoint / 2),
52
+ timerCallback,
53
+ source,
54
+ target
55
+ )
49
56
  eventTimerByUnit[source] = timer
50
57
  end)
51
58
  return ____exports
@@ -160,8 +160,7 @@ export declare class Unit extends Handle<junit> {
160
160
  isInRangeOf(unit: Unit, range: number): boolean;
161
161
  isAllyOf(unit: Unit): boolean;
162
162
  isEnemyOf(unit: Unit): boolean;
163
- playAnimation(animation: string, rarity?: jraritycontrol): void;
164
- playAnimation(animation: number): void;
163
+ playAnimation(...parameters: [animation: number] | [animation: string, rarity?: jraritycontrol]): void;
165
164
  resetAnimation(): void;
166
165
  queueAnimation(animation: string): void;
167
166
  get weapons(): [UnitWeapon, UnitWeapon];
@@ -267,7 +266,7 @@ export declare class Unit extends Handle<junit> {
267
266
  dropItemTarget(item: Item, target: Widget): boolean;
268
267
  dropItemSlot(item: Item, slot: number): boolean;
269
268
  itemInSlot(slot: number): Item | null;
270
- addAbility(abilityId: number): UnitAbility | null;
269
+ addAbility(abilityId: number): UnitAbility | undefined;
271
270
  makeAbilityPermanent(abilityId: number, permanent: true): boolean;
272
271
  setAbilityLevel(abilityId: number, level: number): number;
273
272
  getAbilityLevel(abilityId: number): number;
@@ -278,6 +277,7 @@ export declare class Unit extends Handle<junit> {
278
277
  getAbilityRemainingCooldown(abilityId: number): number;
279
278
  startAbilityCooldown(abilityId: number, cooldown: number): void;
280
279
  endAbilityCooldown(abilityId: number): void;
280
+ interruptMovement(): void;
281
281
  interruptAttack(): void;
282
282
  interruptCast(abilityId: number): void;
283
283
  getDistanceTo(target: Unit | Vec2): number;