- Joined
- Jul 17, 2011
- Messages
- 1,863
i had some trouble indenting my code until i read jpag so far i followed all the
conventions but i always miss something so could any 1 point bad
indentation in this code? ill + rep if u help
conventions but i always miss something so could any 1 point bad
indentation in this code? ill + rep if u help
JASS:
library GetUnitArmorType requires Ln /* v6
******************************************************************************************************************************************************************************************************************
*
* An armor detection system which returns a unit's armor amount, damage reduction (%), and the unit's armor type
* the origina system made by Daelin does not get the armor type and uses a slower logorithm. With this system you can get
* all of the mentioned by calling 3 different functions.
*
******************************************************************************************************************************************************************************************************************
* Credits:
* -------------------
* BLINKBOY: NaturalLogarithm
*
* DAELIN : ORIGINAL armor utils
*
* RISING_DUSK: Modified Armor Utils
*
******************************************************************************************************************************************************************************************************************
*
* Requires:
* ---------------
* NaturalLogarithm - [url]http://www.hiveworkshop.com[/url] / forums / jass - resources - 412 / snippet - natural - logarithm - 108059 /
*
*
******************************************************************************************************************************************************************************************************************
*
*
* SETTINGS
*
*/
globals
private constant real ARMORDAMAGE = 1000 // amount of damage used to get armor
private constant real ARM = 0.06 // armor reduction multiplyer
public constant real ARMOR_INVULNERABLE = 999999999
private constant attacktype DMG2 = ATTACK_TYPE_PIERCE //attack used to get the armor amount
private constant attacktype DMG1 = ATTACK_TYPE_CHAOS //attack used to get the armor type
private constant real ACCURACY_FACTOR = 0.997
private constant integer GUA_HP_BONUS = 'rofl' //hp bonus ability copy it or make your own
endglobals
/*
*******************************************************************************************************************************************************************************************************************
* Functions:
*
* function GetUnitArmorValue takes unit u returns real
* - returns the amount of your unit's armor with up to 3 decimal figures
*
* function GetUnitArmorReduction takes unit u returns real
* - returns the % damage reduction your unit has to verify this check the damage reduction text in the armor tooltip, this system does not round the values so it the armor tooltip says 16% the system might have 0.157% *
*
* function GetUnitArmorType takes unit u returns integer
* - returns the type (an integer value) of armor your unit has. Refer to example trigger b for more info.
*
*******************************************************************************************************************************************************************************************************************
*/
function GetUnitArmorValue takes unit u returns real
local real life = GetWidgetLife(u)
local real life2 = life
local real calc = 0.
if u != null and life >= 0.405 then
if GetUnitState(u, UNIT_STATE_MAX_LIFE) <= ARMORDAMAGE then
call UnitAddAbility(u, GUA_HP_BONUS)
endif
if life <= ARMORDAMAGE - (ARMORDAMAGE * 0.20) then
call SetWidgetLife(u, ARMORDAMAGE + (ARMORDAMAGE * 0.50) )
endif
endif
set life2 = GetWidgetLife(u)
call UnitDamageTarget(u, u, ARMORDAMAGE, false, false, DMG1, DAMAGE_TYPE_NORMAL, null)
set calc = (ARMORDAMAGE - life2 + GetWidgetLife(u)) / ARMORDAMAGE
call UnitRemoveAbility(u, GUA_HP_BONUS)
call SetWidgetLife(u, life)
if calc >= 1. then
return ARMOR_INVULNERABLE
elseif calc < 0. then
return - 1 * logarithm(calc + 1.) / -0.061875
else
return calc / (ARM * (1. - calc))
endif
return 0.
endfunction
function GetUnitArmorReduction takes unit u returns real
local real armorAmount = GetUnitArmorValue(u)
if armorAmount > 0 then
return ((armorAmount) * ARM) / (1 + ARM * (armorAmount))
endif
return 1 - 2 + Pow(0.94, -armorAmount)
endfunction
function GetUnitArmorType takes unit u returns integer
local integer loopz = 0
local integer loopz1 = 0
local real reduc = 1
local real array expected
local real life = GetWidgetLife(u)
local real lifeMAX = life
local real reduction = GetUnitArmorReduction(u)
local real damage
local real accurasy = ACCURACY_FACTOR
local real dmgForThisTrigger
local real accuracy
local real accuracy2
/*
*higher armor values require higher accuracy due to the decrease in damage, lower armor especially armor which
*amplifies damage requires less accuracy
*/
if reduction > .90 then
set accurasy = 0.999
set dmgForThisTrigger = ((ARMORDAMAGE / 100) - ((ARMORDAMAGE / 100) * reduction) ) * ARMORDAMAGE
set accuracy = dmgForThisTrigger - (dmgForThisTrigger * accurasy)
set accuracy2 = -1 * (accuracy)
endif
if reduction <= -0.10 then
set accurasy = 0.990
set dmgForThisTrigger = ((ARMORDAMAGE / 100) - ((ARMORDAMAGE / 100) * reduction) ) * ARMORDAMAGE
set accuracy = dmgForThisTrigger - (dmgForThisTrigger * accurasy)
set accuracy2 = -1 * (accuracy)
endif
if reduction >= 0 and reduction <= .90 then
set dmgForThisTrigger = ((ARMORDAMAGE / 100) - ((ARMORDAMAGE / 100) * reduction) ) * ARMORDAMAGE
set accuracy = dmgForThisTrigger - (dmgForThisTrigger * ACCURACY_FACTOR)
set accuracy2 = -1 * (accuracy)
endif
if reduction >= 0 then
loop
exitwhen loopz1 > 8
set loopz1 = loopz1 + 1
set expected[loopz1] = (dmgForThisTrigger - (dmgForThisTrigger * reduction)) * reduc
set reduc = reduc - 0.10
endloop
endif
if reduction < 0 then
set loopz1 = 0
set reduc = 1.0
loop
exitwhen loopz1 > 8
set loopz1 = loopz1 + 1
set expected[loopz1] = ((dmgForThisTrigger + (dmgForThisTrigger * (reduction * ( -1.0)))) * reduc)
set reduc = reduc - 0.10
endloop
endif
if u != null and GetWidgetLife(u) >= 0.405 then
if GetUnitState(u, UNIT_STATE_MAX_LIFE) <= dmgForThisTrigger then
call UnitAddAbility(u, GUA_HP_BONUS)
set life = GetWidgetLife(u)
endif
if GetWidgetLife(u) <= dmgForThisTrigger - (dmgForThisTrigger * 0.20) then
call SetWidgetLife(u, dmgForThisTrigger + (dmgForThisTrigger * 0.50) )
endif
endif
set life = GetWidgetLife(u)
call UnitDamageTarget(u, u, dmgForThisTrigger, false, false, DMG2, DAMAGE_TYPE_NORMAL, null) //dont change this damage type to something else the system will bug
set damage = life - GetWidgetLife(u)
call UnitRemoveAbility(u, GUA_HP_BONUS)
call SetWidgetLife(u, lifeMAX)
loop
exitwhen loopz > 8
if damage - expected[loopz] <= accuracy and damage - expected[loopz] >= accuracy2 then
return loopz
endif
set loopz = loopz + 1
endloop
return 0
endfunction
endlibrary
//Code indented using The_Witcher's Script Language Aligner
//Download the newest version and report bugs at [url]www.hiveworkshop.com[/url]