Guest User

Untitled

a guest
Jul 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.03 KB | None | 0 0
  1. library libUnit requires libUnitData, libUser, libUserColor, libBuff, libList {
  2.  
  3. struct Unit extends Widget {
  4.  
  5. unit self;
  6. integer rawcode;
  7. UnitData objectData;
  8. UserColor color;
  9.  
  10. //Buff list for buff system
  11. List _buffs;
  12.  
  13. //Initialized values that can be changed
  14. integer _red;
  15. integer _green;
  16. integer _blue;
  17. integer _alpha;
  18.  
  19. real _scale;
  20. real _blendTime;
  21.  
  22. //Flags to prevent stuff to unit
  23. boolean _invulnerable;
  24. boolean _spellImmune;
  25.  
  26. //Unit properties stuff
  27. real _moveSpeedPercent;
  28. real _moveSpeed;
  29.  
  30. real _damage;
  31. real _damagePercent;
  32.  
  33. real _attackSpeed;
  34.  
  35. real _lifeRegen;
  36. real _lifeRegenPercent;
  37.  
  38. real _manaRegen;
  39. real _manaRegenPercent;
  40.  
  41. real _physicalResistance;
  42. real _magicResistance;
  43.  
  44. real _magicPower;
  45. real _physicalPower;
  46.  
  47. real _agility;
  48. real _agilityPercent;
  49.  
  50. real _strength;
  51. real _strengthPercent;
  52.  
  53. real _intelligence;
  54. real _intelligencePercent;
  55.  
  56. real _attackMiss;
  57. real _attackEvasion;
  58.  
  59. //Constants
  60. static location zloc = Location(0, 0);
  61.  
  62. static constant int AGILITY = 'AG+a';
  63. static constant int INTELLIGENCE = 'IN+a';
  64. static constant int STRENGTH = 'ST+a';
  65. static constant int ATTACK_SPEED = 'AT+a';
  66. static constant int ARMOR = 'AR+a';
  67. static constant int DAMAGE = 'DA+a';
  68. static constant int MAX_LIFE = 'Lif+';
  69. static constant int MAX_MANA = 'Man+';
  70. static int pow2 [];
  71.  
  72. static constant real STR_REGEN_MOD = 0.05;
  73. static constant real INT_REGEN_MOD = 0.05;
  74. static constant real AGI_ARMOR_MOD = 0.3;
  75. static constant real AGI_ATTACKSPEED_MOD = 0.02;
  76. static constant integer EVASION_RAWCODE = 'Evas'
  77.  
  78. /* Gets
  79. */
  80.  
  81. static method get (unit whichUnit) -> Unit {
  82. return Unit(GetUnitUserData(whichUnit));
  83. }
  84.  
  85. static method getTriggerer () -> Unit {
  86. return Unit.get(GetTriggerUnit());
  87. }
  88. static method getKiller () -> Unit {
  89. return Unit.get(GetKillingUnit());
  90. }
  91. static method getFiltered () -> Unit {
  92. return Unit.get(GetFilterUnit());
  93. }
  94. static method getEnumed () -> Unit {
  95. return Unit.get(GetEnumUnit());
  96. }
  97. static method getSpellTarget () -> Unit {
  98. return Unit.get(GetSpellTargetUnit());
  99. }
  100. static method getAttacker () -> Unit {
  101. return Unit.get(GetAttacker());
  102. }
  103.  
  104. /*
  105. API
  106. */
  107.  
  108. method operator owner= (User user) {
  109. SetUnitOwner(self, user.self, false);
  110. }
  111. method operator owner () -> User {
  112. return User.get(GetOwningPlayer(self)); // TODO: User.get (if swap players .)
  113. }
  114.  
  115. // colors
  116.  
  117. method operator color= (UserColor color) {
  118. _color = color;
  119. SetUnitColor(self, color.self);
  120. }
  121. method operator color () -> UserColor {
  122. return _color;
  123. }
  124.  
  125. method operator red () -> integer {
  126. return _red;
  127. }
  128. method operator green () -> integer {
  129. return _green;
  130. }
  131. method operator blue () -> integer {
  132. return _blue;
  133. }
  134. method operator alpha () -> integer {
  135. return _alpha;
  136. }
  137.  
  138. //internal use only .
  139. method recolor () {
  140. SetUnitVertexColor(self, _red, _blue, _green, _alph);
  141. }
  142.  
  143. method operator red= (integer newRed) {
  144. _red = newRed;
  145. recolor();
  146. }
  147. method operator green= (integer newGreen) {
  148. _green = newGreen;
  149. recolor();
  150. }
  151. method operator blue= (integer newBlue) {
  152. _blue = newBlue;
  153. recolor();
  154. }
  155. method operator alpha= (integer newAlpha) {
  156. _alpha = newAlpha;
  157. recolor();
  158. }
  159.  
  160. // scaling stuff
  161.  
  162. method operator scale () -> real {
  163. return _scale;
  164. }
  165. method operator scale= (real newScale) {
  166. _scale = scale;
  167. SetUnitScale(self, _scale, _scale, _scale);
  168. }
  169.  
  170. // animation ?
  171.  
  172. method operator blendTime= (real newBlendTime) {
  173. _blendTime = newBlendTime;
  174. SetUnitBlendTime(self, newBlendTime);
  175. }
  176. method operator blendTime () -> real {
  177. return _blendTime;
  178. }
  179.  
  180. method operator animation= (string newAnim) {
  181. SetUnitAnimation(self, newAnim);
  182. }
  183. method operator animationIndex= (integer newAnimIndex) {
  184. SetUnitAnimationByIndex(self, newAnimIndex);
  185. }
  186. method operator animationSpeed= (real newAnimSpeed) {
  187. _animSpeed = newAnimSpeed;
  188. SetUnitTimeScale(self, _animSpeed);
  189. }
  190. method operator animationSpeed () -> real {
  191. return _animSpeed;
  192. }
  193.  
  194. method queueAnimation (string whichAnim) {
  195. QueueUnitAnimation(self, whichAnim);
  196. }
  197.  
  198. method addAnimationTag (string whichAnimTag) {
  199. AddUnitAnimationProperties(self, whichAnimTag, true);
  200. }
  201. method removeAnimationTag (string whichAnimTag) {
  202. AddUnitAnimationProperties(self, whichAnimTag, false);
  203. }
  204.  
  205. /* Types
  206. */
  207.  
  208. method operator isHero () -> boolean {
  209. return IsUnitType(self, UNIT_TYPE_HERO);
  210. }
  211. method operator isDead () -> boolean {
  212. return IsUnitType(self, UNIT_TYPE_DEAD); // TODO: change to based on (INDEX SYSTEM)
  213. }
  214. method operator isAlive () -> boolean {
  215. return !IsUnitType(self, UNIT_TYPE_DEAD); // TODO: change to based on (INDEX SYSTEM)
  216. }
  217. method operator isMechanical () -> boolean {
  218. return IsUnitType(self, UNIT_TYPE_MECHANICAL;
  219. }
  220. method operator isOrganic () -> boolean {
  221. return !IsUnitType(self, UNIT_TYPE_MECHANICAL);
  222. }
  223. method operator isEnemy (Unit whichUnit) -> boolean {
  224. return IsUnitEnemy(self, whichUnit.owner.self);
  225. }
  226. method operator isAlly (Unit whichUnit) -> boolean {
  227. return IsUnitAlly(self, whichUnit.owner.self);
  228. }
  229.  
  230. /* Immunity
  231. */
  232.  
  233. method operator invulnerable () -> boolean {
  234. return _invulnerable;
  235. }
  236. method operator invulnerable= (boolean flag) {
  237. _invulnerable = flag;
  238. }
  239. method operator spellImmune () -> boolean {
  240. return _invulnerable || _spellImmune;
  241. }
  242. method operator spellImmune= (boolean flag) {
  243. _spellImmune = flag;
  244. }
  245.  
  246. /* Abilities
  247. */
  248.  
  249. method addAbility (integer abilityRawcode) {
  250. UnitAddAbility(self, abilityRawcode);
  251. }
  252. method removeAbility (integer abilityRawcode) {
  253. UnitRemoveAbility(self, abilityRawcode);
  254. }
  255.  
  256. method getAbilityLevel (integer abilityRawcode) -> integer {
  257. return GetUnitAbilityLevel(self, abilityRawcode);
  258. }
  259. method setAbilityLevel (integer abilityRawcode, integer newLevel) {
  260. SetUnitAbilityLevel(self, abilityRawcode, newLevel);
  261. }
  262. method hasAbility (integer abilityRawcode) -> boolean {
  263. return GetUnitAbilityLevel(self, abilityRawcode) != 0;
  264. }
  265.  
  266. /* Remove
  267. */
  268.  
  269. method kill () {
  270. KillUnit(self);
  271. }
  272. method remove () {
  273. RemoveUnit(self);
  274. }
  275.  
  276. /* Control
  277. */
  278.  
  279. method operator show= (boolean flag) {
  280. ShowUnit(self, flag);
  281. }
  282. // TODO: Unit Status Events (DISABLE / STUN / ENSNARED / DISARMED / SILENCED)
  283.  
  284. // Damage & Heal
  285.  
  286. // TODO: healTarget / damageTarget (damageSound ?)
  287. method healTarget (Unit target, real healAmount) {
  288. HealEvent.do.evaluate(this, target, healAmount);
  289. }
  290. method damageTarget (Unit target, real damageAmount, integer damageType) {
  291. DamageEvent.doDamage.evaluate(this ,target, damageAmount, damageType);
  292. }
  293.  
  294. // Name
  295.  
  296. method operator name () {
  297. return GetUnitName(self);
  298. }
  299.  
  300. // Position
  301.  
  302. //X & Y Operators inherited from "Widget" struct
  303. method operator height () {
  304. return GetUnitFlyHeight(self);
  305. }
  306. method operator z () {
  307. MoveLocation(zloc, x, y);
  308. return GetLocationZ(zloc) + height;
  309. }
  310.  
  311. //
  312.  
  313. method operator x= (real newX) {
  314. SetUnitX(self, newX);
  315. }
  316. method operator y= (real newY) {
  317. SetUnitY(self, newY);
  318. }
  319. method operator height= (real newHeight) {
  320. SetUnitFlyHeight(self, newHeight, 0);
  321. }
  322. method operator z= (real newZ) {
  323. MoveLocation(zloc, x, y);
  324. height = newZ - GetLocationZ(zloc);
  325. }
  326.  
  327. method operator facing () {
  328. return GetUnitFacing(self) * bj_DEGTORAD;
  329. }
  330. method operator facing= (real newFacing) {
  331. SetUnitFacing(self, newFacing * bj_RADTODEG);
  332. }
  333.  
  334. //
  335.  
  336. method isInRangeXY (real posX, real posY, real maxRadius) {
  337. return IsUnitInRangeXY(self, posX, posY, maxRadius);
  338. }
  339.  
  340. // TODO: Update ObjectData system
  341. method isInRange (Unit whichUnit, real maxRadius) { // have to calculate manually (doesn't take TARGET collision into account normally)
  342. return SquareRoot((whichUnit.x-x)*(whichUnit.x-x) + (whichUnit.y-y)*(whichUnit.y-y)) <= maxRadius + objectData.collisionSize + whichUnit.objectData.collisionSize
  343. }
  344.  
  345. /* Unit Properties
  346. */
  347.  
  348.  
  349. // TODO: Unit Properties (&Percent)
  350. method operator moveSpeedFull () {
  351. return _moveSpeed * (1. + _moveSpeedPercent);
  352. }
  353. method operator moveSpeed () {
  354. return _moveSpeed;
  355. }
  356. method operator moveSpeed= (real newMoveSpeed) {
  357. _moveSpeed = newMoveSpeed;
  358. SetUnitMoveSpeed(self, _moveSpeed * (1. + _moveSpeedPercent));
  359. }
  360.  
  361. method operator life () {
  362. return GetUnitState(self, UNIT_STATE_LIFE);
  363. }
  364. method operator mana () {
  365. return GetUnitState(self, UNIT_STATE_MANA);
  366. }
  367.  
  368. method operator life= (real newLife) {
  369. SetUnitState(self, UNIT_STATE_LIFE, newLife);
  370. }
  371. method operator mana= (real newMana) {
  372. SetUnitState(self, UNIT_STATE_MANA, newMana);
  373. }
  374.  
  375. //! textmacro UnitSetMaxState takes member, state
  376. method operator $member$= (real newAmount) {
  377. real r = GetUnitState(self, UNIT_STATE_$state$);
  378. integer comp = 100;
  379. integer i = 4;
  380. integer abil = $state$;
  381.  
  382. if (newAmount > r)
  383. newAmount = R2I(newAmount - r);
  384. else {
  385. newAmount = R2I(RAbsBJ(r - newAmount));
  386. abil = abil + 2;
  387. }
  388. while (i >= 2) {
  389. if (newAmount >= comp)
  390. while (newAmount > comp) {
  391. addAbility(abil);
  392. setAbilityLevel(abil, i);
  393. removeAbility(abil);
  394. newAmount -= comp;
  395. }
  396. comp /= 10;
  397. i -= 1;
  398. }
  399. }
  400. method operator $member$ () -> real {
  401. return GetUnitState(self, UNIT_STATE_$state$);
  402. }
  403. //! endtextmacro
  404.  
  405. //! runtextmacro UnitSetMaxState("maxLife", "MAX_LIFE")
  406. //! runtextmacro UnitSetMaxState("maxMana", "MAX_MANA")
  407.  
  408. //! textmacro UnitSetPercentageProperty takes member
  409. method operator $member$= (real newAmount) {
  410. _$member$ = R2I(newAmount);
  411. }
  412. method operator $member$ () -> real {
  413. return _$member$;
  414. }
  415. //! endtextmacro
  416.  
  417. //! textmacro UnitSetBinary takes member, MEMBER, mod
  418. method operator $member$= (real newAmount) {
  419. real r = _$member$;
  420. integer i = 1;
  421. integer e;
  422. integer a;
  423. _$member$ = R2I(newAmount);
  424. newAmount = R2I(_$member$ - $mod$);
  425. while (i <= 1) {
  426. if (newAmount >= 0 && r >= 0) {
  427. e = $MEMBER$;
  428. r = newAmount;
  429. } elseif (newAmount <= 0 && r <= 0) {
  430. e = $MEMBER$ + 512;
  431. r = -newAmount;
  432. } elseif (newAmount <= 0 && r >= 0) {
  433. e = $MEMBER$ + 512;
  434. r = 0;
  435. i = 0;
  436. }
  437. a = 8;
  438. while (a >= 0) {
  439. if (r >= pow2[a]) {
  440. addAbility(e+a);
  441. r -= pow2[a];
  442. } else
  443. removeAbility(e+a);
  444. a -= 1;
  445. }
  446. i += 1;
  447. }
  448. }
  449.  
  450. method operator $member$ () -> real {
  451. return _$member$;
  452. }
  453. method operator $member$Full () -> real {
  454. return _$member$ * (1. + _$member$Percent);
  455. }
  456. //! endtextmacro
  457.  
  458. //! runtextmacro UnitSetBinary ("armor" , "ARMOR" , "_objectData.armor" )
  459. //! runtextmacro UnitSetBinary ("damage" , "DAMAGE" , "_objectData.getDamge()")
  460. //! runtextmacro UnitSetBinary ("attackSpeed" , "ATTACK_SPEED", "0" )
  461. //! runtextmacro UnitSetBinary ("agility" , "AGILITY" , "GetHeroAgi(u, false)" )
  462. //! runtextmacro UnitSetBinary ("strength" , "STRENGTH" , "GetHeroStr(u, false)" )
  463. //! runtextmacro UnitSetBinary ("intelligence", "INTELLIGENCE", "GetHeroInt(u, false)" )
  464.  
  465. //! textmacro UnitSetPeriodic takes member ,todo
  466. static group $member$Group = CreateGroup();
  467.  
  468. method operator $member$= (real newAmount) {
  469. _$member$ = newAmount;
  470. if (newAmount != 0)
  471. GroupAddUnit($member$Group, self);
  472. else
  473. GroupRemoveUnit($member$Group, self);
  474. }
  475. method operator $member$ () -> real {
  476. return _$member$;
  477. }
  478. method operator $member$Full () -> real {
  479. return (_$member$ + strengthFull * STRENGTH_REGEN_MOD) * (1. + _$member$Percent);
  480. }
  481. static method $member$Update () {
  482. Unit this = getEnumed();
  483. todo;
  484. }
  485. //! endtextmacro
  486.  
  487. //! runtextmacro UnitSetPeriodic("lifeRegen", "life += (lifeRegenFull - strengthFull * STR_REGEN_MOD)")
  488. //! runtextmacro UnitSetPeriodic("manaRegen", "mana += (manaRegenFull - intelligenceFull * INT_REGEN_MOD)")
  489.  
  490. static method Periodic () {
  491. ForGroup(lifeRegenGroup, function thistype.lifeRegenUpdate)
  492. ForGroup(manaRegenGroup, function thistype.manaRegenUpdate)
  493. }
  494.  
  495. //! textmacro UnitSetProperty takes member
  496. method operator $member$= (real newAmount) {
  497. _$member$ = newAmount;
  498. }
  499. method operator $member$ () {
  500. return _$member$;
  501. }
  502. method operator $member$Full () {
  503. return _$member$ * (1 + _$member$Percent);
  504. }
  505. //! endtextmacro
  506.  
  507. //! runtextmacro UnitSetProperty("attackEvasion")
  508. //! runtextmacro UnitSetProperty("attackMiss")
  509.  
  510. /* Orders
  511. */
  512.  
  513. method issueOrder (string whichOrder) -> boolean {
  514. return IssueImmediateOrder(self, order);
  515. }
  516. method issueOrderById (integer whichOrder) -> boolean {
  517. return IssueImmediateOrderById(self, whichOrder);
  518. }
  519.  
  520. method issuePointOrder (string whichOrder, real posX, real posY) {
  521. return IssuePointOrder(self, whichOrder, posX, posY);
  522. }
  523. method issuePointOrderById (integer whichOrder, real posX, real posY) {
  524. return IssuePointOrderById(self, whichOrder, posX, posY);
  525. }
  526.  
  527. method issueTargetOrder (string whichOrder, Widget target) {
  528. return IssueTargetOrder(self, whichOrder, target.self_widget);
  529. }
  530. method issueTargetOrderById (integer whichOrder, Widget target) {
  531. return IssueTargetOrderById(self, whichOrder, target.self_widget);
  532. }
  533.  
  534. method issueBuildOrder (integer whichOrder, real posX, real posY) {
  535. IssueBuildOrderById(self, whichOrder, posX, posY);
  536. }
  537.  
  538. // TODO: Update buff functions when buff system is complete ...
  539.  
  540. /*
  541. boolean hasBuff (BuffType buffType) {return HaveSavedInteger(Buff.table, int(this), int(buffType));}
  542. Buff getBuff (BuffType buffType) {return Buff(LoadInteger(Buff.table, int(this), int(buffType)));}
  543. Buff applyBuff (Unit target, real dur, BuffType buffType) {return Buff.apply.evaluate(buffType, this, target, dur);}
  544. Buff stunUnit (Unit target, real dur) {return Buff.apply.evaluate(BUFF_STUN, this, target, dur);}
  545. */
  546.  
  547.  
  548. static method create (User whichUser, integer unitid, real posX, real posY, real facingAngle) {
  549. return Unit.get(CreateUnit(whichUser.self, unitid, posX, posY, facingAngle * bj_RADTODEG);
  550. }
  551.  
  552. //Allocates a new "Unit" struct, userdata as struct id
  553. static method register (unit whichUnit) -> Unit {
  554. Unit this = Unit.get(whichUnit);
  555.  
  556. self = whichUnit;
  557. self_widget = whichUnit;
  558.  
  559. _objectData = UnitData[rawcode];
  560. _color = owner.color;
  561.  
  562. buffs = List.create();
  563.  
  564. //Fly height trick
  565. addAbility ('Amrf');
  566. removeAbility('Amrf');
  567.  
  568. //Load Defaults
  569. _alpha = 0;
  570. _red = objectData.vertexRed;
  571. _blue = objectData.vertexBlue;
  572. _green = objectData.vertexGreen;
  573. _scale = objectData.scale;
  574. _blendTime = objectData.blendTime;
  575.  
  576. //Initialize Unit Properties
  577. _moveSpeed = GetUnitMoveSpeed(u);
  578. _agility = 0;
  579. _strength = 0;
  580. _intelligence = 0;
  581. _armor = 0;
  582. _attackSpeed = 0;
  583. _damage = 0;
  584. _manaRegen = 0;
  585. _lifeRegen = 0;
  586.  
  587. _attackMiss = 0;
  588. _attackEvasion = 0;
  589.  
  590. return this;
  591. }
  592.  
  593. // TODO: Update onDeath when Buff System updated
  594. static method onDeath () {
  595. Unit this = getTriggerer();
  596. Link l = buffs.first;
  597. while (integer(l) != 0) {
  598. Buff(l.data).remove.evaluate();
  599. l.destroy();
  600. l = buffs.first;
  601. }
  602. buffs.destroy();
  603. }
  604.  
  605. static trigger attackTrigger;
  606.  
  607. private static method onAttack () {
  608. Unit attacker = getAttacker()
  609. Unit target = getTriggerer();
  610. Timer t
  611. real r;
  612.  
  613. if (GetRandomInt(1, 100) < attacker.attackMiss || GetRandomInt(1, 100) < target.attackEvasion) {
  614. t = Timer.create();
  615. t.data = integer(target);
  616. r = GetHeroAgi(attacker.u, true) * AGI_MOD + attacker.attackSpeed;
  617. r = attacker.objectData.damagePoint * ( 100. / ( 100. + r ) );
  618. t.start(r, false, function () {
  619. Timer t = Timer.getExpired();
  620. Unit target = Unit(t.data);
  621. target.addAbility(EVASION_RAWCODE);
  622. t.start(0., false, function () {
  623. Timer t = Timer.getExpired();
  624. Unit target = Unit(t.data);
  625. target.removeAbility(.EVASION_RAWCODE);
  626. t.destroy();
  627. });
  628. });
  629. }
  630. }
  631.  
  632. static unit preloader
  633. static method PreloadBinary (integer i) {
  634. integer done = i + 512 + 8;
  635. integer exit;
  636. while (true) {
  637. exit = i + 8;
  638. while (i != exit) {
  639. UnitAddAbility(preloader, i);
  640. i += 1;
  641. }
  642. if (i == done)
  643. break;
  644. i += (512-8);
  645. }
  646.  
  647. }
  648.  
  649. static method onInit () {
  650. trigger t = CreateTrigger()
  651. int i = 1
  652. TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
  653. TriggerAddAction( t, function Unit.onDeath )
  654.  
  655. enterTrigger = CreateTrigger()
  656. TriggerRegisterEnterRegion(enterTrigger, WORLD_REGION, Condition(function Unit.enterConds))
  657.  
  658. enterDummyTrigger = CreateTrigger()
  659. TriggerRegisterEnterRegion(enterDummyTrigger, WORLD_REGION, Condition(function Unit.enterDummyConds))
  660.  
  661. attackTrigger = CreateTrigger()
  662. TriggerAddAction(attackTrigger, function Unit.onAttack)
  663.  
  664. TimerStart(CreateTimer(), 1, true, function Unit.Periodic)
  665.  
  666. pow2[0] = 1;
  667. while (i <= 30) //overflow if higher
  668. {
  669. pow2[i] = pow2[i-1] * 2;
  670. i++;
  671. }
  672. preloader = CreateUnit(Player(14), 'hfoo', 0, 0, 0)
  673. PreloadBinary(AGILITY)
  674. PreloadBinary(INTELLIGENCE)
  675. PreloadBinary(STRENGTH)
  676. PreloadBinary(ATTACK_SPEED)
  677. PreloadBinary(DAMAGE)
  678. PreloadBinary(ARMOR)
  679. UnitAddAbility(preloader, MAX_LIFE)
  680. UnitAddAbility(preloader, MAX_LIFE+2)
  681. UnitAddAbility(preloader, MAX_MANA)
  682. UnitAddAbility(preloader, MAX_MANA+2)
  683. UnitAddAbility(preloader, 'Evas')
  684. KillUnit(preloader)
  685. RemoveUnit(preloader)
  686. preloader = null
  687. }
  688. }
  689. }
Add Comment
Please, Sign In to add comment