Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library libUnit requires libUnitData, libUser, libUserColor, libBuff, libList {
- struct Unit extends Widget {
- unit self;
- integer rawcode;
- UnitData objectData;
- UserColor color;
- //Buff list for buff system
- List _buffs;
- //Initialized values that can be changed
- integer _red;
- integer _green;
- integer _blue;
- integer _alpha;
- real _scale;
- real _blendTime;
- //Flags to prevent stuff to unit
- boolean _invulnerable;
- boolean _spellImmune;
- //Unit properties stuff
- real _moveSpeedPercent;
- real _moveSpeed;
- real _damage;
- real _damagePercent;
- real _attackSpeed;
- real _lifeRegen;
- real _lifeRegenPercent;
- real _manaRegen;
- real _manaRegenPercent;
- real _physicalResistance;
- real _magicResistance;
- real _magicPower;
- real _physicalPower;
- real _agility;
- real _agilityPercent;
- real _strength;
- real _strengthPercent;
- real _intelligence;
- real _intelligencePercent;
- real _attackMiss;
- real _attackEvasion;
- //Constants
- static location zloc = Location(0, 0);
- static constant int AGILITY = 'AG+a';
- static constant int INTELLIGENCE = 'IN+a';
- static constant int STRENGTH = 'ST+a';
- static constant int ATTACK_SPEED = 'AT+a';
- static constant int ARMOR = 'AR+a';
- static constant int DAMAGE = 'DA+a';
- static constant int MAX_LIFE = 'Lif+';
- static constant int MAX_MANA = 'Man+';
- static int pow2 [];
- static constant real STR_REGEN_MOD = 0.05;
- static constant real INT_REGEN_MOD = 0.05;
- static constant real AGI_ARMOR_MOD = 0.3;
- static constant real AGI_ATTACKSPEED_MOD = 0.02;
- static constant integer EVASION_RAWCODE = 'Evas'
- /* Gets
- */
- static method get (unit whichUnit) -> Unit {
- return Unit(GetUnitUserData(whichUnit));
- }
- static method getTriggerer () -> Unit {
- return Unit.get(GetTriggerUnit());
- }
- static method getKiller () -> Unit {
- return Unit.get(GetKillingUnit());
- }
- static method getFiltered () -> Unit {
- return Unit.get(GetFilterUnit());
- }
- static method getEnumed () -> Unit {
- return Unit.get(GetEnumUnit());
- }
- static method getSpellTarget () -> Unit {
- return Unit.get(GetSpellTargetUnit());
- }
- static method getAttacker () -> Unit {
- return Unit.get(GetAttacker());
- }
- /*
- API
- */
- method operator owner= (User user) {
- SetUnitOwner(self, user.self, false);
- }
- method operator owner () -> User {
- return User.get(GetOwningPlayer(self)); // TODO: User.get (if swap players .)
- }
- // colors
- method operator color= (UserColor color) {
- _color = color;
- SetUnitColor(self, color.self);
- }
- method operator color () -> UserColor {
- return _color;
- }
- method operator red () -> integer {
- return _red;
- }
- method operator green () -> integer {
- return _green;
- }
- method operator blue () -> integer {
- return _blue;
- }
- method operator alpha () -> integer {
- return _alpha;
- }
- //internal use only .
- method recolor () {
- SetUnitVertexColor(self, _red, _blue, _green, _alph);
- }
- method operator red= (integer newRed) {
- _red = newRed;
- recolor();
- }
- method operator green= (integer newGreen) {
- _green = newGreen;
- recolor();
- }
- method operator blue= (integer newBlue) {
- _blue = newBlue;
- recolor();
- }
- method operator alpha= (integer newAlpha) {
- _alpha = newAlpha;
- recolor();
- }
- // scaling stuff
- method operator scale () -> real {
- return _scale;
- }
- method operator scale= (real newScale) {
- _scale = scale;
- SetUnitScale(self, _scale, _scale, _scale);
- }
- // animation ?
- method operator blendTime= (real newBlendTime) {
- _blendTime = newBlendTime;
- SetUnitBlendTime(self, newBlendTime);
- }
- method operator blendTime () -> real {
- return _blendTime;
- }
- method operator animation= (string newAnim) {
- SetUnitAnimation(self, newAnim);
- }
- method operator animationIndex= (integer newAnimIndex) {
- SetUnitAnimationByIndex(self, newAnimIndex);
- }
- method operator animationSpeed= (real newAnimSpeed) {
- _animSpeed = newAnimSpeed;
- SetUnitTimeScale(self, _animSpeed);
- }
- method operator animationSpeed () -> real {
- return _animSpeed;
- }
- method queueAnimation (string whichAnim) {
- QueueUnitAnimation(self, whichAnim);
- }
- method addAnimationTag (string whichAnimTag) {
- AddUnitAnimationProperties(self, whichAnimTag, true);
- }
- method removeAnimationTag (string whichAnimTag) {
- AddUnitAnimationProperties(self, whichAnimTag, false);
- }
- /* Types
- */
- method operator isHero () -> boolean {
- return IsUnitType(self, UNIT_TYPE_HERO);
- }
- method operator isDead () -> boolean {
- return IsUnitType(self, UNIT_TYPE_DEAD); // TODO: change to based on (INDEX SYSTEM)
- }
- method operator isAlive () -> boolean {
- return !IsUnitType(self, UNIT_TYPE_DEAD); // TODO: change to based on (INDEX SYSTEM)
- }
- method operator isMechanical () -> boolean {
- return IsUnitType(self, UNIT_TYPE_MECHANICAL;
- }
- method operator isOrganic () -> boolean {
- return !IsUnitType(self, UNIT_TYPE_MECHANICAL);
- }
- method operator isEnemy (Unit whichUnit) -> boolean {
- return IsUnitEnemy(self, whichUnit.owner.self);
- }
- method operator isAlly (Unit whichUnit) -> boolean {
- return IsUnitAlly(self, whichUnit.owner.self);
- }
- /* Immunity
- */
- method operator invulnerable () -> boolean {
- return _invulnerable;
- }
- method operator invulnerable= (boolean flag) {
- _invulnerable = flag;
- }
- method operator spellImmune () -> boolean {
- return _invulnerable || _spellImmune;
- }
- method operator spellImmune= (boolean flag) {
- _spellImmune = flag;
- }
- /* Abilities
- */
- method addAbility (integer abilityRawcode) {
- UnitAddAbility(self, abilityRawcode);
- }
- method removeAbility (integer abilityRawcode) {
- UnitRemoveAbility(self, abilityRawcode);
- }
- method getAbilityLevel (integer abilityRawcode) -> integer {
- return GetUnitAbilityLevel(self, abilityRawcode);
- }
- method setAbilityLevel (integer abilityRawcode, integer newLevel) {
- SetUnitAbilityLevel(self, abilityRawcode, newLevel);
- }
- method hasAbility (integer abilityRawcode) -> boolean {
- return GetUnitAbilityLevel(self, abilityRawcode) != 0;
- }
- /* Remove
- */
- method kill () {
- KillUnit(self);
- }
- method remove () {
- RemoveUnit(self);
- }
- /* Control
- */
- method operator show= (boolean flag) {
- ShowUnit(self, flag);
- }
- // TODO: Unit Status Events (DISABLE / STUN / ENSNARED / DISARMED / SILENCED)
- // Damage & Heal
- // TODO: healTarget / damageTarget (damageSound ?)
- method healTarget (Unit target, real healAmount) {
- HealEvent.do.evaluate(this, target, healAmount);
- }
- method damageTarget (Unit target, real damageAmount, integer damageType) {
- DamageEvent.doDamage.evaluate(this ,target, damageAmount, damageType);
- }
- // Name
- method operator name () {
- return GetUnitName(self);
- }
- // Position
- //X & Y Operators inherited from "Widget" struct
- method operator height () {
- return GetUnitFlyHeight(self);
- }
- method operator z () {
- MoveLocation(zloc, x, y);
- return GetLocationZ(zloc) + height;
- }
- //
- method operator x= (real newX) {
- SetUnitX(self, newX);
- }
- method operator y= (real newY) {
- SetUnitY(self, newY);
- }
- method operator height= (real newHeight) {
- SetUnitFlyHeight(self, newHeight, 0);
- }
- method operator z= (real newZ) {
- MoveLocation(zloc, x, y);
- height = newZ - GetLocationZ(zloc);
- }
- method operator facing () {
- return GetUnitFacing(self) * bj_DEGTORAD;
- }
- method operator facing= (real newFacing) {
- SetUnitFacing(self, newFacing * bj_RADTODEG);
- }
- //
- method isInRangeXY (real posX, real posY, real maxRadius) {
- return IsUnitInRangeXY(self, posX, posY, maxRadius);
- }
- // TODO: Update ObjectData system
- method isInRange (Unit whichUnit, real maxRadius) { // have to calculate manually (doesn't take TARGET collision into account normally)
- return SquareRoot((whichUnit.x-x)*(whichUnit.x-x) + (whichUnit.y-y)*(whichUnit.y-y)) <= maxRadius + objectData.collisionSize + whichUnit.objectData.collisionSize
- }
- /* Unit Properties
- */
- // TODO: Unit Properties (&Percent)
- method operator moveSpeedFull () {
- return _moveSpeed * (1. + _moveSpeedPercent);
- }
- method operator moveSpeed () {
- return _moveSpeed;
- }
- method operator moveSpeed= (real newMoveSpeed) {
- _moveSpeed = newMoveSpeed;
- SetUnitMoveSpeed(self, _moveSpeed * (1. + _moveSpeedPercent));
- }
- method operator life () {
- return GetUnitState(self, UNIT_STATE_LIFE);
- }
- method operator mana () {
- return GetUnitState(self, UNIT_STATE_MANA);
- }
- method operator life= (real newLife) {
- SetUnitState(self, UNIT_STATE_LIFE, newLife);
- }
- method operator mana= (real newMana) {
- SetUnitState(self, UNIT_STATE_MANA, newMana);
- }
- //! textmacro UnitSetMaxState takes member, state
- method operator $member$= (real newAmount) {
- real r = GetUnitState(self, UNIT_STATE_$state$);
- integer comp = 100;
- integer i = 4;
- integer abil = $state$;
- if (newAmount > r)
- newAmount = R2I(newAmount - r);
- else {
- newAmount = R2I(RAbsBJ(r - newAmount));
- abil = abil + 2;
- }
- while (i >= 2) {
- if (newAmount >= comp)
- while (newAmount > comp) {
- addAbility(abil);
- setAbilityLevel(abil, i);
- removeAbility(abil);
- newAmount -= comp;
- }
- comp /= 10;
- i -= 1;
- }
- }
- method operator $member$ () -> real {
- return GetUnitState(self, UNIT_STATE_$state$);
- }
- //! endtextmacro
- //! runtextmacro UnitSetMaxState("maxLife", "MAX_LIFE")
- //! runtextmacro UnitSetMaxState("maxMana", "MAX_MANA")
- //! textmacro UnitSetPercentageProperty takes member
- method operator $member$= (real newAmount) {
- _$member$ = R2I(newAmount);
- }
- method operator $member$ () -> real {
- return _$member$;
- }
- //! endtextmacro
- //! textmacro UnitSetBinary takes member, MEMBER, mod
- method operator $member$= (real newAmount) {
- real r = _$member$;
- integer i = 1;
- integer e;
- integer a;
- _$member$ = R2I(newAmount);
- newAmount = R2I(_$member$ - $mod$);
- while (i <= 1) {
- if (newAmount >= 0 && r >= 0) {
- e = $MEMBER$;
- r = newAmount;
- } elseif (newAmount <= 0 && r <= 0) {
- e = $MEMBER$ + 512;
- r = -newAmount;
- } elseif (newAmount <= 0 && r >= 0) {
- e = $MEMBER$ + 512;
- r = 0;
- i = 0;
- }
- a = 8;
- while (a >= 0) {
- if (r >= pow2[a]) {
- addAbility(e+a);
- r -= pow2[a];
- } else
- removeAbility(e+a);
- a -= 1;
- }
- i += 1;
- }
- }
- method operator $member$ () -> real {
- return _$member$;
- }
- method operator $member$Full () -> real {
- return _$member$ * (1. + _$member$Percent);
- }
- //! endtextmacro
- //! runtextmacro UnitSetBinary ("armor" , "ARMOR" , "_objectData.armor" )
- //! runtextmacro UnitSetBinary ("damage" , "DAMAGE" , "_objectData.getDamge()")
- //! runtextmacro UnitSetBinary ("attackSpeed" , "ATTACK_SPEED", "0" )
- //! runtextmacro UnitSetBinary ("agility" , "AGILITY" , "GetHeroAgi(u, false)" )
- //! runtextmacro UnitSetBinary ("strength" , "STRENGTH" , "GetHeroStr(u, false)" )
- //! runtextmacro UnitSetBinary ("intelligence", "INTELLIGENCE", "GetHeroInt(u, false)" )
- //! textmacro UnitSetPeriodic takes member ,todo
- static group $member$Group = CreateGroup();
- method operator $member$= (real newAmount) {
- _$member$ = newAmount;
- if (newAmount != 0)
- GroupAddUnit($member$Group, self);
- else
- GroupRemoveUnit($member$Group, self);
- }
- method operator $member$ () -> real {
- return _$member$;
- }
- method operator $member$Full () -> real {
- return (_$member$ + strengthFull * STRENGTH_REGEN_MOD) * (1. + _$member$Percent);
- }
- static method $member$Update () {
- Unit this = getEnumed();
- todo;
- }
- //! endtextmacro
- //! runtextmacro UnitSetPeriodic("lifeRegen", "life += (lifeRegenFull - strengthFull * STR_REGEN_MOD)")
- //! runtextmacro UnitSetPeriodic("manaRegen", "mana += (manaRegenFull - intelligenceFull * INT_REGEN_MOD)")
- static method Periodic () {
- ForGroup(lifeRegenGroup, function thistype.lifeRegenUpdate)
- ForGroup(manaRegenGroup, function thistype.manaRegenUpdate)
- }
- //! textmacro UnitSetProperty takes member
- method operator $member$= (real newAmount) {
- _$member$ = newAmount;
- }
- method operator $member$ () {
- return _$member$;
- }
- method operator $member$Full () {
- return _$member$ * (1 + _$member$Percent);
- }
- //! endtextmacro
- //! runtextmacro UnitSetProperty("attackEvasion")
- //! runtextmacro UnitSetProperty("attackMiss")
- /* Orders
- */
- method issueOrder (string whichOrder) -> boolean {
- return IssueImmediateOrder(self, order);
- }
- method issueOrderById (integer whichOrder) -> boolean {
- return IssueImmediateOrderById(self, whichOrder);
- }
- method issuePointOrder (string whichOrder, real posX, real posY) {
- return IssuePointOrder(self, whichOrder, posX, posY);
- }
- method issuePointOrderById (integer whichOrder, real posX, real posY) {
- return IssuePointOrderById(self, whichOrder, posX, posY);
- }
- method issueTargetOrder (string whichOrder, Widget target) {
- return IssueTargetOrder(self, whichOrder, target.self_widget);
- }
- method issueTargetOrderById (integer whichOrder, Widget target) {
- return IssueTargetOrderById(self, whichOrder, target.self_widget);
- }
- method issueBuildOrder (integer whichOrder, real posX, real posY) {
- IssueBuildOrderById(self, whichOrder, posX, posY);
- }
- // TODO: Update buff functions when buff system is complete ...
- /*
- boolean hasBuff (BuffType buffType) {return HaveSavedInteger(Buff.table, int(this), int(buffType));}
- Buff getBuff (BuffType buffType) {return Buff(LoadInteger(Buff.table, int(this), int(buffType)));}
- Buff applyBuff (Unit target, real dur, BuffType buffType) {return Buff.apply.evaluate(buffType, this, target, dur);}
- Buff stunUnit (Unit target, real dur) {return Buff.apply.evaluate(BUFF_STUN, this, target, dur);}
- */
- static method create (User whichUser, integer unitid, real posX, real posY, real facingAngle) {
- return Unit.get(CreateUnit(whichUser.self, unitid, posX, posY, facingAngle * bj_RADTODEG);
- }
- //Allocates a new "Unit" struct, userdata as struct id
- static method register (unit whichUnit) -> Unit {
- Unit this = Unit.get(whichUnit);
- self = whichUnit;
- self_widget = whichUnit;
- _objectData = UnitData[rawcode];
- _color = owner.color;
- buffs = List.create();
- //Fly height trick
- addAbility ('Amrf');
- removeAbility('Amrf');
- //Load Defaults
- _alpha = 0;
- _red = objectData.vertexRed;
- _blue = objectData.vertexBlue;
- _green = objectData.vertexGreen;
- _scale = objectData.scale;
- _blendTime = objectData.blendTime;
- //Initialize Unit Properties
- _moveSpeed = GetUnitMoveSpeed(u);
- _agility = 0;
- _strength = 0;
- _intelligence = 0;
- _armor = 0;
- _attackSpeed = 0;
- _damage = 0;
- _manaRegen = 0;
- _lifeRegen = 0;
- _attackMiss = 0;
- _attackEvasion = 0;
- return this;
- }
- // TODO: Update onDeath when Buff System updated
- static method onDeath () {
- Unit this = getTriggerer();
- Link l = buffs.first;
- while (integer(l) != 0) {
- Buff(l.data).remove.evaluate();
- l.destroy();
- l = buffs.first;
- }
- buffs.destroy();
- }
- static trigger attackTrigger;
- private static method onAttack () {
- Unit attacker = getAttacker()
- Unit target = getTriggerer();
- Timer t
- real r;
- if (GetRandomInt(1, 100) < attacker.attackMiss || GetRandomInt(1, 100) < target.attackEvasion) {
- t = Timer.create();
- t.data = integer(target);
- r = GetHeroAgi(attacker.u, true) * AGI_MOD + attacker.attackSpeed;
- r = attacker.objectData.damagePoint * ( 100. / ( 100. + r ) );
- t.start(r, false, function () {
- Timer t = Timer.getExpired();
- Unit target = Unit(t.data);
- target.addAbility(EVASION_RAWCODE);
- t.start(0., false, function () {
- Timer t = Timer.getExpired();
- Unit target = Unit(t.data);
- target.removeAbility(.EVASION_RAWCODE);
- t.destroy();
- });
- });
- }
- }
- static unit preloader
- static method PreloadBinary (integer i) {
- integer done = i + 512 + 8;
- integer exit;
- while (true) {
- exit = i + 8;
- while (i != exit) {
- UnitAddAbility(preloader, i);
- i += 1;
- }
- if (i == done)
- break;
- i += (512-8);
- }
- }
- static method onInit () {
- trigger t = CreateTrigger()
- int i = 1
- TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
- TriggerAddAction( t, function Unit.onDeath )
- enterTrigger = CreateTrigger()
- TriggerRegisterEnterRegion(enterTrigger, WORLD_REGION, Condition(function Unit.enterConds))
- enterDummyTrigger = CreateTrigger()
- TriggerRegisterEnterRegion(enterDummyTrigger, WORLD_REGION, Condition(function Unit.enterDummyConds))
- attackTrigger = CreateTrigger()
- TriggerAddAction(attackTrigger, function Unit.onAttack)
- TimerStart(CreateTimer(), 1, true, function Unit.Periodic)
- pow2[0] = 1;
- while (i <= 30) //overflow if higher
- {
- pow2[i] = pow2[i-1] * 2;
- i++;
- }
- preloader = CreateUnit(Player(14), 'hfoo', 0, 0, 0)
- PreloadBinary(AGILITY)
- PreloadBinary(INTELLIGENCE)
- PreloadBinary(STRENGTH)
- PreloadBinary(ATTACK_SPEED)
- PreloadBinary(DAMAGE)
- PreloadBinary(ARMOR)
- UnitAddAbility(preloader, MAX_LIFE)
- UnitAddAbility(preloader, MAX_LIFE+2)
- UnitAddAbility(preloader, MAX_MANA)
- UnitAddAbility(preloader, MAX_MANA+2)
- UnitAddAbility(preloader, 'Evas')
- KillUnit(preloader)
- RemoveUnit(preloader)
- preloader = null
- }
- }
- }
Add Comment
Please, Sign In to add comment