warscript 0.0.1-dev.e1acea3 → 0.0.1-dev.e27e5b1

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 (281) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/config.d.ts +5 -0
  4. package/config.lua +10 -0
  5. package/core/types/effect.d.ts +2 -3
  6. package/core/types/effect.lua +95 -48
  7. package/core/types/frame.d.ts +1 -0
  8. package/core/types/frame.lua +136 -58
  9. package/core/types/handle.lua +6 -9
  10. package/core/types/item.d.ts +1 -0
  11. package/core/types/item.lua +1 -0
  12. package/core/types/player.d.ts +18 -1
  13. package/core/types/player.lua +76 -26
  14. package/core/types/playerCamera.d.ts +2 -0
  15. package/core/types/playerCamera.lua +123 -5
  16. package/core/types/playerColor.lua +4 -3
  17. package/core/types/sound.d.ts +18 -25
  18. package/core/types/sound.lua +113 -33
  19. package/core/types/tileCell.d.ts +11 -1
  20. package/core/types/tileCell.lua +97 -0
  21. package/core/types/timer.d.ts +9 -8
  22. package/core/types/timer.lua +45 -23
  23. package/core/types/unit.d.ts +4 -0
  24. package/core/types/unit.lua +4 -0
  25. package/core/util.d.ts +1 -1
  26. package/core/util.lua +12 -1
  27. package/decl/native.d.ts +1718 -964
  28. package/destroyable.d.ts +1 -0
  29. package/destroyable.lua +9 -0
  30. package/engine/behavior.d.ts +14 -1
  31. package/engine/behavior.lua +230 -70
  32. package/engine/behaviour/ability/always-enabled.d.ts +7 -0
  33. package/engine/behaviour/ability/always-enabled.lua +31 -0
  34. package/engine/behaviour/ability/apply-buff.d.ts +5 -0
  35. package/engine/behaviour/ability/apply-buff.lua +36 -4
  36. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  37. package/engine/behaviour/ability/damage.d.ts +12 -3
  38. package/engine/behaviour/ability/damage.lua +33 -39
  39. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  40. package/engine/behaviour/ability/emulate-impact.lua +21 -6
  41. package/engine/behaviour/ability/on-command-impact.lua +7 -0
  42. package/engine/behaviour/ability/remove-buffs.d.ts +13 -1
  43. package/engine/behaviour/ability/remove-buffs.lua +29 -2
  44. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  45. package/engine/behaviour/ability/restore-mana.lua +6 -6
  46. package/engine/behaviour/ability.d.ts +23 -6
  47. package/engine/behaviour/ability.lua +115 -22
  48. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  49. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  50. package/engine/behaviour/unit.d.ts +41 -2
  51. package/engine/behaviour/unit.lua +270 -6
  52. package/engine/buff.d.ts +113 -53
  53. package/engine/buff.lua +544 -288
  54. package/engine/internal/ability.d.ts +22 -2
  55. package/engine/internal/ability.lua +151 -27
  56. package/engine/internal/item/ability.lua +162 -4
  57. package/engine/internal/item/fields.d.ts +12 -0
  58. package/engine/internal/item/fields.lua +33 -0
  59. package/engine/internal/item+owner.d.ts +1 -0
  60. package/engine/internal/item+owner.lua +19 -6
  61. package/engine/internal/item.d.ts +30 -18
  62. package/engine/internal/item.lua +292 -102
  63. package/engine/internal/mechanics/ability-duration.lua +1 -1
  64. package/engine/internal/mechanics/cast-ability.lua +6 -3
  65. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  66. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  67. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  68. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  69. package/engine/internal/misc/frame-coordinates.lua +21 -0
  70. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  71. package/engine/internal/misc/get-terrain-z.lua +11 -0
  72. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  73. package/engine/internal/misc/player-local-handle.lua +5 -0
  74. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  75. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  76. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  77. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  78. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  79. package/engine/internal/object-data/evasion-probability.lua +16 -0
  80. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  81. package/engine/internal/object-data/health-bonus.lua +16 -0
  82. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  83. package/engine/internal/object-data/mana-bonus.lua +16 -0
  84. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  85. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  86. package/engine/internal/unit/ability.d.ts +35 -0
  87. package/engine/internal/unit/ability.lua +113 -12
  88. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  89. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  90. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  91. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  92. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  93. package/engine/internal/unit/allowed-targets.lua +9 -1
  94. package/engine/internal/unit/appearance.d.ts +15 -0
  95. package/engine/internal/unit/appearance.lua +85 -0
  96. package/engine/internal/unit/attributes.d.ts +17 -0
  97. package/engine/internal/unit/attributes.lua +46 -0
  98. package/engine/internal/unit/bag.d.ts +18 -0
  99. package/engine/internal/unit/bag.lua +63 -0
  100. package/engine/internal/unit/bonus.d.ts +8 -0
  101. package/engine/internal/unit/bonus.lua +50 -3
  102. package/engine/internal/unit/buff.d.ts +2 -2
  103. package/engine/internal/unit/buff.lua +32 -17
  104. package/engine/internal/unit/equipment.d.ts +36 -0
  105. package/engine/internal/unit/equipment.lua +169 -0
  106. package/engine/internal/unit/fly-height.d.ts +7 -0
  107. package/engine/internal/unit/fly-height.lua +20 -0
  108. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  109. package/engine/internal/unit/ignore-events-items.lua +5 -0
  110. package/engine/internal/unit/interrupts.d.ts +12 -0
  111. package/engine/internal/unit/interrupts.lua +28 -0
  112. package/engine/internal/unit/{item.d.ts → inventory.d.ts} +3 -3
  113. package/engine/internal/unit/inventory.lua +77 -0
  114. package/engine/internal/unit/main-selected.lua +12 -27
  115. package/engine/internal/unit/order.d.ts +20 -0
  116. package/engine/internal/unit/order.lua +136 -0
  117. package/engine/internal/unit/pseudo-passive-abilities.d.ts +2 -0
  118. package/engine/internal/unit/pseudo-passive-abilities.lua +11 -0
  119. package/engine/internal/unit/range-event.d.ts +12 -0
  120. package/engine/internal/unit/range-event.lua +90 -0
  121. package/engine/internal/unit/scale.d.ts +7 -0
  122. package/engine/internal/unit/scale.lua +20 -0
  123. package/engine/internal/unit+ability.lua +10 -1
  124. package/engine/internal/unit+bonus.lua +3 -3
  125. package/engine/internal/unit+damage.d.ts +2 -11
  126. package/engine/internal/unit+damage.lua +10 -14
  127. package/engine/internal/unit+spellSteal.lua +1 -2
  128. package/engine/internal/unit-missile-launch.lua +52 -14
  129. package/engine/internal/unit.d.ts +45 -26
  130. package/engine/internal/unit.lua +443 -274
  131. package/engine/internal/utility.lua +12 -0
  132. package/engine/lightning.d.ts +12 -5
  133. package/engine/lightning.lua +48 -14
  134. package/engine/local-client.d.ts +21 -0
  135. package/engine/local-client.lua +150 -7
  136. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  137. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  138. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  139. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  140. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  141. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  142. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  143. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  144. package/engine/object-data/auxiliary/equipment-slot.d.ts +12 -0
  145. package/engine/object-data/auxiliary/equipment-slot.lua +2 -0
  146. package/engine/object-data/auxiliary/equipment-type.d.ts +13 -0
  147. package/engine/object-data/auxiliary/equipment-type.lua +2 -0
  148. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  149. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  150. package/engine/object-data/auxiliary/item-tag.d.ts +12 -0
  151. package/engine/object-data/auxiliary/item-tag.lua +2 -0
  152. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  153. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  154. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  155. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  156. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  157. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  158. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  159. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  160. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  161. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  162. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  163. package/engine/object-data/entry/ability-type/blank-configurable.d.ts +3 -0
  164. package/engine/object-data/entry/ability-type/blank-configurable.lua +42 -1
  165. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  166. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  167. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  168. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  169. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  170. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  171. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  172. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  173. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  174. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  175. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  176. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  177. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  178. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  179. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  180. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  181. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  182. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  183. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  184. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  185. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  186. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  187. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  188. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  189. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  190. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  191. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  192. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  193. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  194. package/engine/object-data/entry/ability-type/web.lua +52 -0
  195. package/engine/object-data/entry/ability-type.d.ts +21 -17
  196. package/engine/object-data/entry/ability-type.lua +177 -40
  197. package/engine/object-data/entry/buff-type/applicable.lua +122 -137
  198. package/engine/object-data/entry/buff-type.d.ts +6 -12
  199. package/engine/object-data/entry/buff-type.lua +13 -29
  200. package/engine/object-data/entry/destructible-type.d.ts +28 -2
  201. package/engine/object-data/entry/destructible-type.lua +155 -0
  202. package/engine/object-data/entry/item-type.d.ts +3 -1
  203. package/engine/object-data/entry/item-type.lua +15 -2
  204. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  205. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  206. package/engine/object-data/entry/sound-preset.lua +140 -0
  207. package/engine/object-data/entry/unit-type.d.ts +25 -5
  208. package/engine/object-data/entry/unit-type.lua +258 -93
  209. package/engine/object-data/entry/upgrade.d.ts +1 -1
  210. package/engine/object-data/entry/upgrade.lua +4 -4
  211. package/engine/object-data/entry.d.ts +16 -14
  212. package/engine/object-data/entry.lua +60 -32
  213. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  214. package/engine/object-field/ability.d.ts +12 -6
  215. package/engine/object-field/ability.lua +10 -6
  216. package/engine/object-field/item.d.ts +22 -0
  217. package/engine/object-field/item.lua +118 -0
  218. package/engine/object-field/unit.d.ts +72 -3
  219. package/engine/object-field/unit.lua +268 -7
  220. package/engine/object-field.d.ts +26 -7
  221. package/engine/object-field.lua +362 -117
  222. package/engine/random.d.ts +10 -0
  223. package/engine/random.lua +21 -0
  224. package/engine/standard/entries/buff-type.d.ts +3 -0
  225. package/engine/standard/entries/buff-type.lua +3 -0
  226. package/engine/standard/entries/sound-preset.d.ts +10 -0
  227. package/engine/standard/entries/sound-preset.lua +10 -0
  228. package/engine/standard/fields/ability.d.ts +4 -2
  229. package/engine/standard/fields/ability.lua +4 -2
  230. package/engine/standard/fields/item.d.ts +4 -0
  231. package/engine/standard/fields/item.lua +6 -0
  232. package/engine/standard/fields/unit.d.ts +12 -0
  233. package/engine/standard/fields/unit.lua +20 -0
  234. package/engine/synchronization.d.ts +11 -0
  235. package/engine/synchronization.lua +77 -0
  236. package/engine/text-tag.d.ts +36 -2
  237. package/engine/text-tag.lua +250 -10
  238. package/engine/unit.d.ts +11 -1
  239. package/engine/unit.lua +11 -1
  240. package/event.d.ts +1 -1
  241. package/lualib_bundle.lua +1 -1
  242. package/math.d.ts +2 -0
  243. package/math.lua +14 -0
  244. package/net/socket.lua +1 -1
  245. package/network.lua +25 -1
  246. package/objutil/buff.lua +11 -10
  247. package/objutil/object.lua +1 -1
  248. package/objutil/unit.lua +8 -0
  249. package/operation.d.ts +8 -1
  250. package/operation.lua +38 -18
  251. package/package.json +5 -5
  252. package/patch-lua.lua +15 -0
  253. package/patch-lualib.lua +1 -1
  254. package/utility/arrays.d.ts +2 -0
  255. package/utility/arrays.lua +11 -0
  256. package/utility/callback-array.d.ts +17 -0
  257. package/utility/callback-array.lua +61 -0
  258. package/utility/functions.d.ts +8 -0
  259. package/utility/functions.lua +13 -0
  260. package/utility/linked-map.d.ts +35 -0
  261. package/utility/linked-map.lua +107 -0
  262. package/utility/linked-set.d.ts +5 -1
  263. package/utility/linked-set.lua +49 -1
  264. package/utility/lua-maps.d.ts +15 -2
  265. package/utility/lua-maps.lua +53 -2
  266. package/utility/lua-sets.d.ts +2 -0
  267. package/utility/lua-sets.lua +7 -0
  268. package/utility/random.d.ts +102 -0
  269. package/utility/random.lua +273 -0
  270. package/utility/records.lua +20 -1
  271. package/utility/reflection.lua +11 -7
  272. package/utility/types.d.ts +3 -0
  273. package/utility/unordered-map.d.ts +27 -0
  274. package/utility/unordered-map.lua +99 -0
  275. package/core/types/order.d.ts +0 -25
  276. package/core/types/order.lua +0 -55
  277. package/engine/internal/unit/item.lua +0 -84
  278. /package/engine/internal/{object-data/armor-increase.d.ts → misc/ability-disable-counter.d.ts} +0 -0
  279. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  280. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  281. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
package/attributes.d.ts CHANGED
@@ -1,12 +1,18 @@
1
1
  /** @noSelfInFile */
2
+ declare const marker: {};
2
3
  export type Attribute<T> = {
3
4
  readonly __attribute: unique symbol;
4
5
  readonly __type: T;
6
+ readonly __marker: typeof marker;
5
7
  } & symbol;
8
+ export declare const attribute: <T>() => Attribute<T>;
9
+ export declare const isAttribute: (value: unknown) => value is Attribute<unknown>;
6
10
  export declare namespace Attribute {
7
11
  const create: <T>() => Attribute<T>;
8
12
  }
9
13
  export declare class AttributesHolder {
10
14
  readonly get: (<T>(attribute: Attribute<T>) => T | undefined) & LuaExtension<"TableGetMethod">;
11
15
  readonly set: (<T>(attribute: Attribute<T>, value: T | undefined) => void) & LuaExtension<"TableSetMethod">;
16
+ getOrPut<T>(attribute: Attribute<T>, defaultValue: () => T): T;
12
17
  }
18
+ export {};
package/attributes.lua CHANGED
@@ -1,11 +1,18 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local ____exports = {}
4
+ local marker = {}
5
+ ____exports.attribute = function()
6
+ return {__marker = marker}
7
+ end
8
+ ____exports.isAttribute = function(value)
9
+ return type(value) == "table" and rawget(value, "__marker") == marker
10
+ end
4
11
  ____exports.Attribute = {}
5
12
  local Attribute = ____exports.Attribute
6
13
  do
7
14
  Attribute.create = function()
8
- return {}
15
+ return {__marker = marker}
9
16
  end
10
17
  end
11
18
  ____exports.AttributesHolder = __TS__Class()
@@ -13,4 +20,13 @@ local AttributesHolder = ____exports.AttributesHolder
13
20
  AttributesHolder.name = "AttributesHolder"
14
21
  function AttributesHolder.prototype.____constructor(self)
15
22
  end
23
+ function AttributesHolder.prototype.getOrPut(self, attribute, defaultValue)
24
+ local value = self[attribute]
25
+ if value ~= nil then
26
+ return value
27
+ end
28
+ value = defaultValue()
29
+ self[attribute] = value
30
+ return value
31
+ end
16
32
  return ____exports
package/config.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /** @noSelfInFile */
2
+ export declare class WarscriptConfig {
3
+ private constructor();
4
+ static AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH: boolean;
5
+ }
package/config.lua ADDED
@@ -0,0 +1,10 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local ____exports = {}
4
+ ____exports.WarscriptConfig = __TS__Class()
5
+ local WarscriptConfig = ____exports.WarscriptConfig
6
+ WarscriptConfig.name = "WarscriptConfig"
7
+ function WarscriptConfig.prototype.____constructor(self)
8
+ end
9
+ WarscriptConfig.AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH = true
10
+ return ____exports
@@ -8,6 +8,7 @@ declare const enum EffectPropertyKey {
8
8
  ROLL = 102
9
9
  }
10
10
  export type EffectParameters = {
11
+ readonly delay?: number;
11
12
  readonly scale?: number;
12
13
  readonly color?: PlayerColor;
13
14
  readonly pitch?: number;
@@ -29,12 +30,10 @@ export declare class Effect extends Handle<jeffect> {
29
30
  set pitch(pitch: number);
30
31
  get roll(): number;
31
32
  set roll(roll: number);
32
- static create<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), model: string, pos: Vec2): T;
33
- static createTarget<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), model: string, target: Widget, attachPoint: string): T;
33
+ static create<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), modelPath: string, xOrWidget: number | Widget, yOrAttachmentPoint?: number | string, parameters?: EffectParameters): T;
34
34
  static flash(modelPath: string, ...args: [
35
35
  ...pointOrWidget: [x: number, y: number] | [widget: Widget, attachmentPoint?: string],
36
36
  ...parametersOrDuration: [parametersOrDuration?: EffectParameters | number] | [duration?: number, parameters?: EffectParameters]
37
37
  ]): void;
38
- static flashTarget(model: string, target: Widget, attachPoint: string, duration?: number): void;
39
38
  }
40
39
  export {};
@@ -1,10 +1,10 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
- local __TS__InstanceOf = ____lualib.__TS__InstanceOf
5
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
+ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
6
6
  local ____exports = {}
7
- local dummyPlayer
7
+ local dummyPlayer, addSpecialEffectInternal, flash
8
8
  local ____handle = require("core.types.handle")
9
9
  local Handle = ____handle.Handle
10
10
  local ____playerColor = require("core.types.playerColor")
@@ -119,10 +119,18 @@ local function setSpecialEffectColor(effect, color)
119
119
  dummyPlayer.color = dummyColor
120
120
  end
121
121
  local setters = {scale = setSpecialEffectScale, color = setSpecialEffectColor, pitch = setSpecialEffectPitchDegrees, roll = setSpecialEffectRollDegrees}
122
+ local setterProperties = {"scale", "color", "pitch", "roll"}
122
123
  dummyPlayer = Player.neutralExtra
123
124
  local temporaryEffects = {}
124
125
  local temporaryEffectsDurations = {}
125
126
  local temporaryEffectsCount = 0
127
+ local delayedEffectsModelPath = {}
128
+ local delayedEffectsXOrWidget = {}
129
+ local delayedEffectsYOrAttachmentPoint = {}
130
+ local delayedEffectsDuration = {}
131
+ local delayedEffectsParameters = {}
132
+ local delayedEffectsDelay = {}
133
+ local delayedEffectsCount = 0
126
134
  local period = 1 / 32
127
135
  Timer.onPeriod[period]:addListener(function()
128
136
  local i = 1
@@ -131,12 +139,36 @@ Timer.onPeriod[period]:addListener(function()
131
139
  if duration <= 0 then
132
140
  destroyEffect(temporaryEffects[i])
133
141
  temporaryEffects[i] = temporaryEffects[temporaryEffectsCount]
142
+ temporaryEffectsDurations[i] = temporaryEffectsDurations[temporaryEffectsCount]
134
143
  temporaryEffectsCount = temporaryEffectsCount - 1
135
144
  else
136
145
  temporaryEffectsDurations[i] = duration - period
137
146
  i = i + 1
138
147
  end
139
148
  end
149
+ i = 1
150
+ while i <= delayedEffectsCount do
151
+ local delay = delayedEffectsDelay[i]
152
+ if delay <= 0 then
153
+ flash(
154
+ delayedEffectsModelPath[i],
155
+ delayedEffectsXOrWidget[i],
156
+ delayedEffectsYOrAttachmentPoint[i],
157
+ delayedEffectsDuration[i],
158
+ delayedEffectsParameters[i]
159
+ )
160
+ delayedEffectsModelPath[i] = delayedEffectsModelPath[delayedEffectsCount]
161
+ delayedEffectsXOrWidget[i] = delayedEffectsXOrWidget[delayedEffectsCount]
162
+ delayedEffectsYOrAttachmentPoint[i] = delayedEffectsYOrAttachmentPoint[delayedEffectsCount]
163
+ delayedEffectsDuration[i] = delayedEffectsDuration[delayedEffectsCount]
164
+ delayedEffectsParameters[i] = delayedEffectsParameters[delayedEffectsCount]
165
+ delayedEffectsDelay[i] = delayedEffectsDelay[delayedEffectsCount]
166
+ delayedEffectsCount = delayedEffectsCount - 1
167
+ else
168
+ delayedEffectsDelay[i] = delay - period
169
+ i = i + 1
170
+ end
171
+ end
140
172
  end)
141
173
  ____exports.Effect = __TS__Class()
142
174
  local Effect = ____exports.Effect
@@ -146,66 +178,44 @@ function Effect.prototype.onDestroy(self)
146
178
  destroyEffect(self.handle)
147
179
  return Handle.prototype.onDestroy(self)
148
180
  end
149
- function Effect.create(self, model, pos)
150
- return self:of(addSpecialEffect(model, pos.x, pos.y))
151
- end
152
- function Effect.createTarget(self, model, target, attachPoint)
153
- return self:of(addSpecialEffectTarget(model, target.handle, attachPoint))
181
+ function Effect.create(self, modelPath, xOrWidget, yOrAttachmentPoint, parameters)
182
+ local effect = self:of(addSpecialEffectInternal(modelPath, xOrWidget, yOrAttachmentPoint, parameters))
183
+ if parameters ~= nil then
184
+ effect[100] = parameters.color
185
+ effect[101] = parameters.pitch
186
+ effect[102] = parameters.roll
187
+ end
188
+ return effect
154
189
  end
155
190
  function Effect.flash(self, modelPath, xOrWidget, yOrOrAttachmentPoint, parametersOrDuration, parameters)
156
191
  if type(parametersOrDuration) ~= "number" then
157
192
  parameters = parametersOrDuration
158
193
  parametersOrDuration = nil
159
194
  end
160
- local coordinatesProvided = type(xOrWidget) == "number"
161
- local isPositional = coordinatesProvided or (parameters and parameters.detached) == true
162
- local x = not isPositional and 0 or (coordinatesProvided and xOrWidget or xOrWidget.x)
163
- local y = not isPositional and 0 or (coordinatesProvided and yOrOrAttachmentPoint or xOrWidget.y)
164
- local effect = isPositional and addSpecialEffect(modelPath, x, y) or addSpecialEffectTarget(modelPath, xOrWidget.handle, yOrOrAttachmentPoint or "origin")
165
- if isPositional and not coordinatesProvided and (parameters and parameters.scale) == nil and __TS__InstanceOf(xOrWidget, Unit) then
166
- setSpecialEffectScale(effect, xOrWidget.scale)
167
- end
168
- if parameters ~= nil then
169
- for key, value in ____pairs(parameters) do
170
- if key ~= "zOffset" and key ~= "detached" and key ~= "scaleZOffset" then
171
- setters[key](effect, value)
172
- end
173
- end
174
- if isPositional and parameters.zOffset ~= nil then
175
- moveLocation(location, x, y)
176
- local z = __TS__InstanceOf(xOrWidget, Unit) and getLocationZ(location) + xOrWidget.flyHeight or getLocationZ(location)
177
- BlzSetSpecialEffectZ(
178
- effect,
179
- z + parameters.zOffset * (parameters.scaleZOffset and getSpecialEffectScale(effect) or 1)
180
- )
181
- end
182
- end
183
- if parametersOrDuration ~= nil and parametersOrDuration > 0 then
184
- temporaryEffectsCount = temporaryEffectsCount + 1
185
- temporaryEffects[temporaryEffectsCount] = effect
186
- temporaryEffectsDurations[temporaryEffectsCount] = parametersOrDuration
195
+ if parameters and (parameters.delay or 0) > 0 then
196
+ delayedEffectsCount = delayedEffectsCount + 1
197
+ delayedEffectsModelPath[delayedEffectsCount] = modelPath
198
+ delayedEffectsXOrWidget[delayedEffectsCount] = xOrWidget
199
+ delayedEffectsYOrAttachmentPoint[delayedEffectsCount] = yOrOrAttachmentPoint
200
+ delayedEffectsDuration[delayedEffectsCount] = parametersOrDuration
201
+ delayedEffectsParameters[delayedEffectsCount] = parameters
202
+ delayedEffectsDelay[delayedEffectsCount] = parameters.delay
187
203
  return
188
204
  end
189
- destroyEffect(effect)
190
- end
191
- function Effect.flashTarget(self, model, target, attachPoint, duration)
192
- local effect = addSpecialEffectTarget(model, target.handle, attachPoint)
193
- if effect ~= nil then
194
- if duration and duration > 0 then
195
- temporaryEffectsCount = temporaryEffectsCount + 1
196
- temporaryEffects[temporaryEffectsCount] = effect
197
- temporaryEffectsDurations[temporaryEffectsCount] = duration
198
- else
199
- destroyEffect(effect)
200
- end
201
- end
205
+ flash(
206
+ modelPath,
207
+ xOrWidget,
208
+ yOrOrAttachmentPoint,
209
+ parametersOrDuration,
210
+ parameters
211
+ )
202
212
  end
203
213
  __TS__SetDescriptor(
204
214
  Effect.prototype,
205
215
  "color",
206
216
  {
207
217
  get = function(self)
208
- return self[100] or PlayerColor.black
218
+ return self[100] or PlayerColor.red
209
219
  end,
210
220
  set = function(self, color)
211
221
  setSpecialEffectColor(self.handle, color)
@@ -255,4 +265,41 @@ __TS__SetDescriptor(
255
265
  },
256
266
  true
257
267
  )
268
+ addSpecialEffectInternal = function(modelPath, xOrWidget, yOrAttachmentPoint, parameters)
269
+ local coordinatesProvided = type(xOrWidget) == "number"
270
+ local isPositional = coordinatesProvided or (parameters and parameters.detached) == true
271
+ local x = not isPositional and 0 or (coordinatesProvided and xOrWidget or xOrWidget.x)
272
+ local y = not isPositional and 0 or (coordinatesProvided and yOrAttachmentPoint or xOrWidget.y)
273
+ local effect = isPositional and addSpecialEffect(modelPath, x, y) or addSpecialEffectTarget(modelPath, xOrWidget.handle, yOrAttachmentPoint or "origin")
274
+ if parameters ~= nil then
275
+ if isPositional and parameters.scale == nil and __TS__InstanceOf(xOrWidget, Unit) then
276
+ setSpecialEffectScale(effect, xOrWidget.scale)
277
+ end
278
+ for ____, property in ipairs(setterProperties) do
279
+ local value = parameters[property]
280
+ if value ~= nil then
281
+ setters[property](effect, value)
282
+ end
283
+ end
284
+ if isPositional and parameters.zOffset ~= nil then
285
+ moveLocation(location, x, y)
286
+ local z = __TS__InstanceOf(xOrWidget, Unit) and getLocationZ(location) + xOrWidget.flyHeight or getLocationZ(location)
287
+ setSpecialEffectZ(
288
+ effect,
289
+ z + parameters.zOffset * (parameters.scaleZOffset and getSpecialEffectScale(effect) or 1)
290
+ )
291
+ end
292
+ end
293
+ return effect
294
+ end
295
+ flash = function(modelPath, xOrWidget, yOrAttachmentPoint, duration, parameters)
296
+ local effect = addSpecialEffectInternal(modelPath, xOrWidget, yOrAttachmentPoint, parameters)
297
+ if duration ~= nil and duration > 0 then
298
+ temporaryEffectsCount = temporaryEffectsCount + 1
299
+ temporaryEffects[temporaryEffectsCount] = effect
300
+ temporaryEffectsDurations[temporaryEffectsCount] = duration
301
+ return
302
+ end
303
+ destroyEffect(effect)
304
+ end
258
305
  return ____exports
@@ -80,6 +80,7 @@ export declare class Frame extends Handle<jframehandle> {
80
80
  get onMouseLeave(): FrameEvent;
81
81
  get onMouseUp(): FrameEvent;
82
82
  get onMouseWheel(): FrameEvent<[number]>;
83
+ private trackMouseLocally;
83
84
  get mouseEnterLocalEvent(): Event;
84
85
  get mouseLeaveLocalEvent(): Event;
85
86
  get popupMenuItemChangeEvent(): FrameEvent<[
@@ -15,13 +15,32 @@ local Event = ____event.Event
15
15
  local TriggerEvent = ____event.TriggerEvent
16
16
  local ____timer = require("core.types.timer")
17
17
  local Timer = ____timer.Timer
18
+ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates")
19
+ local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
20
+ local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
21
+ local getFrameMinXMaxX = ____frame_2Dcoordinates.getFrameMinXMaxX
22
+ local ____playerCamera = require("core.types.playerCamera")
23
+ local frameCoordinatesToWorld = ____playerCamera.frameCoordinatesToWorld
24
+ local worldCoordinatesToFrame = ____playerCamera.worldCoordinatesToFrame
25
+ local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
26
+ local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
27
+ local ____lua_2Dsets = require("utility.lua-sets")
28
+ local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
29
+ local ____socket = require("net.socket")
30
+ local Socket = ____socket.Socket
31
+ local ____lua_2Dmaps = require("utility.lua-maps")
32
+ local getOrPut = ____lua_2Dmaps.getOrPut
33
+ local luaMapInvert = ____lua_2Dmaps.luaMapInvert
34
+ local luaMapOf = ____lua_2Dmaps.luaMapOf
35
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
18
36
  local frameClick = BlzFrameClick
19
37
  local frameGetEnable = BlzFrameGetEnable
20
38
  local frameIsVisible = BlzFrameIsVisible
21
39
  local frameSetEnable = BlzFrameSetEnable
22
40
  local frameSetScale = BlzFrameSetScale
23
- local getCameraTargetPositionX = GetCameraTargetPositionX
24
- local getCameraTargetPositionY = GetCameraTargetPositionY
41
+ local getHandleId = GetHandleId
42
+ local getOriginFrame = BlzGetOriginFrame
43
+ local location = Location
25
44
  local ____rawget = _G.rawget
26
45
  local rawset = _G.rawset
27
46
  local invoke = Event.invoke
@@ -123,6 +142,79 @@ do
123
142
  FramePoint.BOTTOM_RIGHT = FRAMEPOINT_BOTTOMRIGHT
124
143
  end
125
144
  local tooltipByFrame = setmetatable({}, {__mode = "k"})
145
+ local isMouseInsideLocallyByFrame = mutableLuaMap()
146
+ local mouseEnterLocalEventByFrame = mutableLuaMap()
147
+ local mouseLeaveLocalEventByFrame = mutableLuaMap()
148
+ local isLocalMouseTrackingStarted = false
149
+ --- Reused across ticks to avoid per-tick allocations: only the first `leftFrameCount` /
150
+ -- `enteredFrameCount` entries are meaningful, stale entries beyond them are never read and are
151
+ -- kept collectable by the weak values mode.
152
+ local leftFrames = setmetatable({}, {__mode = "v"})
153
+ local enteredFrames = setmetatable({}, {__mode = "v"})
154
+ --- All frames share a single poll which invokes every mouse leave event before any mouse enter
155
+ -- event within the same tick. With a poll per event, the invocation order would depend on the
156
+ -- event creation order instead, breaking listeners relying on the natural "leave the old frame,
157
+ -- then enter the new frame" order.
158
+ local function startLocalMouseTracking()
159
+ if isLocalMouseTrackingStarted then
160
+ return
161
+ end
162
+ isLocalMouseTrackingStarted = true
163
+ Timer.onPeriod[1 / 64]:addListener(function()
164
+ local leftFrameCount = 0
165
+ local enteredFrameCount = 0
166
+ for frame, wasMouseInside in pairs(isMouseInsideLocallyByFrame) do
167
+ local tooltip = tooltipByFrame[frame]
168
+ local isMouseInside = tooltip ~= nil and tooltip.visible
169
+ if isMouseInside ~= wasMouseInside then
170
+ isMouseInsideLocallyByFrame[frame] = isMouseInside
171
+ if isMouseInside then
172
+ enteredFrames[enteredFrameCount + 1] = frame
173
+ enteredFrameCount = enteredFrameCount + 1
174
+ else
175
+ leftFrames[leftFrameCount + 1] = frame
176
+ leftFrameCount = leftFrameCount + 1
177
+ end
178
+ end
179
+ end
180
+ for i = 1, leftFrameCount do
181
+ local event = mouseLeaveLocalEventByFrame[leftFrames[i]]
182
+ if event ~= nil then
183
+ Event.invoke(event)
184
+ end
185
+ end
186
+ for i = 1, enteredFrameCount do
187
+ local event = mouseEnterLocalEventByFrame[enteredFrames[i]]
188
+ if event ~= nil then
189
+ Event.invoke(event)
190
+ end
191
+ end
192
+ end)
193
+ end
194
+ local keyByAsyncInitOriginFrameType = luaMapOf(ORIGIN_FRAME_PORTRAIT_HP_TEXT, "hp", ORIGIN_FRAME_PORTRAIT_MANA_TEXT, "mana")
195
+ local asyncInitOriginFrameTypeByKey = luaMapInvert(keyByAsyncInitOriginFrameType)
196
+ local seenAsyncInitOriginFrameTypes = mutableLuaSet()
197
+ local seenAsyncInitOriginFrameTypesSocket = __TS__New(Socket)
198
+ local seenPlayersByAsyncInitOriginFrameType = mutableLuaMap()
199
+ seenAsyncInitOriginFrameTypesSocket.onMessage:addListener(function(player, key)
200
+ local asyncInitOriginFrameType = asyncInitOriginFrameTypeByKey[key]
201
+ if asyncInitOriginFrameType ~= nil then
202
+ getOrPut(seenPlayersByAsyncInitOriginFrameType, asyncInitOriginFrameType, mutableLuaSet)[player] = true
203
+ end
204
+ end)
205
+ local function haveAllPlayersSeenAsyncInitOriginFrameType(frame)
206
+ local players = seenPlayersByAsyncInitOriginFrameType[frame]
207
+ if players == nil then
208
+ return false
209
+ end
210
+ for ____, player in ipairs(Player.all) do
211
+ if player.isUser and player.isPlaying and not (players[player] ~= nil) then
212
+ return false
213
+ end
214
+ end
215
+ keyByAsyncInitOriginFrameType[frame] = nil
216
+ return true
217
+ end
126
218
  ____exports.Frame = __TS__Class()
127
219
  local Frame = ____exports.Frame
128
220
  Frame.name = "Frame"
@@ -155,6 +247,18 @@ function Frame.prototype.getEvent(self, eventType, c)
155
247
  end
156
248
  return self.events[eventId]
157
249
  end
250
+ function Frame.prototype.trackMouseLocally(self)
251
+ if not (tooltipByFrame[self] ~= nil) then
252
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
253
+ local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
254
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
255
+ self:setTooltip(tooltip)
256
+ end
257
+ if not (isMouseInsideLocallyByFrame[self] ~= nil) then
258
+ isMouseInsideLocallyByFrame[self] = false
259
+ startLocalMouseTracking()
260
+ end
261
+ end
158
262
  function Frame.prototype.hide(self)
159
263
  self.hideCounter = self.hideCounter + 1
160
264
  if self.hideCounter > 0 then
@@ -301,7 +405,17 @@ function Frame.byOrigin(self, frameType, index)
301
405
  if index == nil then
302
406
  index = 0
303
407
  end
304
- return self:of(BlzGetOriginFrame(frameType, index))
408
+ local frame = getOriginFrame(frameType, index)
409
+ local asyncInitOriginFrameTypeKey = keyByAsyncInitOriginFrameType[frameType]
410
+ if index == 0 and asyncInitOriginFrameTypeKey ~= nil and not haveAllPlayersSeenAsyncInitOriginFrameType(frameType) then
411
+ if getHandleId(frame) == 0 or seenAsyncInitOriginFrameTypes[frameType] ~= nil then
412
+ location(0, 0)
413
+ else
414
+ seenAsyncInitOriginFrameTypes[frameType] = true
415
+ seenAsyncInitOriginFrameTypesSocket:send(asyncInitOriginFrameTypeKey)
416
+ end
417
+ end
418
+ return self:of(frame)
305
419
  end
306
420
  Frame.GAME_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_GAME_UI)
307
421
  Frame.CONSOLE_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_SIMPLE_UI_PARENT)
@@ -344,27 +458,21 @@ __TS__ObjectDefineProperty(
344
458
  Frame,
345
459
  "minX",
346
460
  {get = function(self)
347
- local w = BlzGetLocalClientWidth()
348
- local h = BlzGetLocalClientHeight()
349
- local width4by3 = (w - h / 600 * 800) / 2
350
- local pxtodpi = 0.6 / h
351
- return -width4by3 * pxtodpi
461
+ local minX = getFrameMinXMaxX()
462
+ return minX
352
463
  end}
353
464
  )
354
465
  __TS__ObjectDefineProperty(
355
466
  Frame,
356
467
  "maxX",
357
468
  {get = function(self)
358
- local w = BlzGetLocalClientWidth()
359
- local h = BlzGetLocalClientHeight()
360
- local width4by3 = (w - h / 600 * 800) / 2
361
- local pxtodpi = 0.6 / h
362
- return (-width4by3 + w) * pxtodpi
469
+ local ____, maxX = getFrameMinXMaxX()
470
+ return maxX
363
471
  end}
364
472
  )
365
473
  Frame.centerX = 0.4
366
- Frame.minY = 0
367
- Frame.maxY = 0.6
474
+ Frame.minY = FRAME_MIN_Y
475
+ Frame.maxY = FRAME_MAX_Y
368
476
  Frame.centerY = 0.3
369
477
  __TS__SetDescriptor(
370
478
  Frame.prototype,
@@ -626,24 +734,8 @@ __TS__SetDescriptor(
626
734
  "mouseEnterLocalEvent",
627
735
  {get = function(self)
628
736
  local event = __TS__New(Event)
629
- if not (tooltipByFrame[self] ~= nil) then
630
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
631
- local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
632
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
633
- self:setTooltip(tooltip)
634
- end
635
- local isMouseInside = false
636
- Timer.onPeriod[1 / 64]:addListener(function()
637
- local tooltip = tooltipByFrame[self]
638
- if tooltip and tooltip.visible then
639
- if not isMouseInside then
640
- isMouseInside = true
641
- Event.invoke(event)
642
- end
643
- else
644
- isMouseInside = false
645
- end
646
- end)
737
+ self:trackMouseLocally()
738
+ mouseEnterLocalEventByFrame[self] = event
647
739
  rawset(self, "mouseEnterLocalEvent", event)
648
740
  return event
649
741
  end},
@@ -654,24 +746,8 @@ __TS__SetDescriptor(
654
746
  "mouseLeaveLocalEvent",
655
747
  {get = function(self)
656
748
  local event = __TS__New(Event)
657
- if not (tooltipByFrame[self] ~= nil) then
658
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
659
- local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
660
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
661
- self:setTooltip(tooltip)
662
- end
663
- local isMouseInside = false
664
- Timer.onPeriod[1 / 64]:addListener(function()
665
- local tooltip = tooltipByFrame[self]
666
- if tooltip and tooltip.visible then
667
- isMouseInside = true
668
- else
669
- if isMouseInside then
670
- isMouseInside = false
671
- Event.invoke(event)
672
- end
673
- end
674
- end)
749
+ self:trackMouseLocally()
750
+ mouseLeaveLocalEventByFrame[self] = event
675
751
  rawset(self, "mouseLeaveLocalEvent", event)
676
752
  return event
677
753
  end},
@@ -938,16 +1014,19 @@ __TS__ObjectDefineProperty(
938
1014
  local event = __TS__New(Event)
939
1015
  local syncX = 0
940
1016
  local syncY = 0
941
- local syncCamX = getCameraTargetPositionX()
942
- local syncCamY = getCameraTargetPositionY()
1017
+ local syncFrameX = 0
1018
+ local syncFrameY = 0
943
1019
  local lastX = syncX
944
1020
  local lastY = syncY
945
1021
  self.onMouseMove:addListener(function(player, x, y)
946
1022
  if player.isLocal then
947
1023
  syncX = x
948
1024
  syncY = y
949
- syncCamX = getCameraTargetPositionX()
950
- syncCamY = getCameraTargetPositionY()
1025
+ syncFrameX, syncFrameY = worldCoordinatesToFrame(
1026
+ x,
1027
+ y,
1028
+ getTerrainZ(x, y)
1029
+ )
951
1030
  lastX = x
952
1031
  lastY = y
953
1032
  invoke(event, x, y)
@@ -957,9 +1036,8 @@ __TS__ObjectDefineProperty(
957
1036
  if syncX == 0 and syncY == 0 then
958
1037
  return
959
1038
  end
960
- local x = syncX + (getCameraTargetPositionX() - syncCamX)
961
- local y = syncY + (getCameraTargetPositionY() - syncCamY)
962
- if x ~= lastX or y ~= lastY then
1039
+ local x, y, ____, isDefinite = frameCoordinatesToWorld(syncFrameX, syncFrameY)
1040
+ if isDefinite and (x ~= lastX or y ~= lastY) then
963
1041
  lastX = x
964
1042
  lastY = y
965
1043
  invoke(event, x, y)
@@ -15,6 +15,8 @@ local ____exception = require("exception")
15
15
  local IllegalStateException = ____exception.IllegalStateException
16
16
  local ____attributes = require("attributes")
17
17
  local AttributesHolder = ____attributes.AttributesHolder
18
+ local ____preconditions = require("utility.preconditions")
19
+ local checkNotNull = ____preconditions.checkNotNull
18
20
  local getHandleId = GetHandleId
19
21
  local onCreateEventByHandleConstructor = {}
20
22
  local onDestroyEventByHandleConstructor = {}
@@ -66,17 +68,12 @@ function Handle.prototype.onDestroy(self, ...)
66
68
  return nil
67
69
  end
68
70
  function Handle.prototype.destroy(self, ...)
71
+ if self[0] == 2 or self[0] == 3 then
72
+ return nil
73
+ end
69
74
  local clazz = self.constructor
70
75
  local id = getHandleId(self.handle)
71
- if not clazz.memoized[id] then
72
- error(
73
- __TS__New(
74
- IllegalStateException,
75
- "Double-destroy run for handle " .. tostring(id)
76
- ),
77
- 0
78
- )
79
- end
76
+ checkNotNull(clazz.memoized[id])
80
77
  self[0] = 2
81
78
  if self.onDestroyEvent then
82
79
  Event.invoke(self.onDestroyEvent)
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
2
  import { Item } from "../../engine/internal/item";
3
3
  import "../../engine/internal/item+owner";
4
+ import "../../engine/internal/item/fields";
4
5
  export { Item };
@@ -2,5 +2,6 @@ local ____exports = {}
2
2
  local ____item = require("engine.internal.item")
3
3
  local Item = ____item.Item
4
4
  require("engine.internal.item+owner")
5
+ require("engine.internal.item.fields")
5
6
  ____exports.Item = Item
6
7
  return ____exports