- Joined
- Jul 22, 2015
- Messages
- 3,485
Why don't you create a unit on Map Init, add the ability, and then remove the unit?The one without has a spike lag when you acquire the ability for the first time.
(3 ratings)
Power Aura Code Type: GUI Spell Type: Hero Target Type: Passive Area of Effect: 1000/1100/1200/1300 Number of Levels: 4 Mana Cost: 0 Cooldown: 0 In-game Description: The hero leads his allies to bring them to victory. Each allied unit nearby will give +1 damage to every allied unit with this buff. How the spell works: Each allied unit within 1000/1100/1200/1300 will give all allies with this aura to have +1 damage. Example: When there are 10 nearby heroes, you and your allies will have +10 damage. |
Why don't you create a unit on Map Init, add the ability, and then remove the unit?The one without has a spike lag when you acquire the ability for the first time.
I just checked the triggers through Trigger Viewer,
it seems that the GUI one lack configurability as most part of it depends on OE editing and limited to 100 units affected,
assuming +1 per unit affected with default 100 levels (or more with shift-click) of dummy damage ability,
you should mention these limitation as to not confusing GUI users that find the ability didn't give correct bonus under certain conditions.
the other one that uses CSS is much more better and has possibility of more customization,
(like different bonus value per level, not just restricted to aura AOE increase like the GUI one),
I would like to suggest to drop the current GUI one (or at least make it the secondary version) while updating the CSS version to support different bonus per level learned and make the CSS as mandatory requirement.
and how about add the support for Tome of Retraining case?
Works for WEXit avoids the 198 import CSS have as that needs JNGP's Macro, which as far as 1.28 concerns, is messed up.
WEX supports Macro?Works for WEX![]()
on second thought, why you choose to implement individual bonus to each unit affected?
how about this method:
you can use a hidden modified dummy Trueshot Aura to give static bonus per level,
then you adjust the level of the dummy ability based on number of units in area with the buff.
the only downside though is the delay on updating the bonus since it use aura to give bonus.
and you can enum the correct units directly by adding the condition "Matching Unit has buff" to the SubGroup enumeration instead of using if- check on SubUnit.
on second thought, why you choose to implement individual bonus to each unit affected?
how about this method:
you can use a hidden modified dummy Trueshot Aura to give static bonus per level,
then you adjust the level of the dummy ability based on number of units in area with the buff.
the only downside though is the delay on updating the bonus since it use aura to give bonus.
and you can enum the correct units directly by adding the condition "Matching Unit has buff" to the SubGroup enumeration instead of using if- check on SubUnit.
Hi! I am still learning code...please I have some questions. If it's too hard I understand, this particular code looks rather meticulous and grindy.. but I have no idea what I'm talking about...
I am looking to make this ability have a lower max affected unit cap (10-12 nearby units).
I want certain auras to only affect certain unit types:
ie. a footmen captain gives +1 armor to other nearby footmen (not riflemen or others) - up to 12 footmen total!
ie. a dryads captain gives +125 sight range to other nearby dryads (not footmen or others) - up to 5 dryads total!
I apprecieate babystep explanations for my stuuupid brain. Thanks! Good work!
Very late for me, but I recall Last Revolt [Techtree Contest #14] had something similar to your need.I'm using Reforged. I will take a look at chopinski's Bonus system. Thanks!
I think that sort of reworking the entire spell to adjust to this configuration. New Bonus will help a lot for this though.Ah ha, found it!
I can contribute my idea:
level 1 - plus 1 Agility
level 2 - plus 1 Strength
level 3 - plus 1 Intelligence
level 4 - plus 1 damage
library CSS_FixThisDaffaYouFool
//************************************************************************************************************
//* *
//* CUSTOM STAT SYSTEM (CSS) *
//* *
//* Author: Doomlord *
//* Version: 1.5i *
//* *
//* Credits: *
//* + Earth-Fury: BonusMod binary algoritm; implementation macro. *
//* + Crigges: A great amount of help and support. *
//* + Geries: Help me with the item hashtable values cleanup. *
//* + rulerofiron99: Item Socketing method referenced from [GUI]Right Click Item Recipe v1.05. *
//* + Vexorian: CSS_SimError [url]http://www.wc3c.net/showthread.php?t=101260[/url] *
//* + Magtheridon96: [Snippet]BoundInt [url]http://www.hiveworkshop.com/forums/2294066-post804.html[/url] *
//* + WaterKnight: Help with the stack for custom Event Response. *
//* + PurgeandFire: Pinpoint a possible desync bug with the system. *
//* + Nestharus: Mentioning the possible negative life bug in his Bonus lib. *
//* *
//************************************************************************************************************
//**************************************************************************************
//* INTRODUCTION: *
//* *
//* An alternative to BonusMod for those who prefer a vanilla JASS approach. *
//* *
//* Just follow the API and you are pretty much done. *
//**************************************************************************************
//********************************************************************************************************
//* REQUIREMENTS: *
//* *
//* JNGP [url]http://www.hiveworkshop.com/forums/tools-560/jassnewgenpack-5d-227445[/url] (Recommended) *
//* OR: *
//* Your superhuman capability to transfer 198 abilities to your map. (Not Recommended) *
//********************************************************************************************************
//************************************************************************************************************************************************
//* INSTALLATION INSTRUCTION: *
//* *
//* Step 1: Copy the custom code for bonus handling to your map header. *
//* Step 2: Use JNGP to implement the system's abilities through macro. Instruction is included in the Implementation Macro trigger. *
//* Step 3: Copy the whole CSS folder to your map. Don't forget to turn on "Automatically create unknown variables while pasting trigger data". *
//* Step 4: Except for this trigger, delete every other useless elements. *
//* Step 5: Use this BonusMod alternative however you want. *
//* *
//************************************************************************************************************************************************
//**************************************************************************************
//* Bonus Types Identifier: *
//* *
//* Armor Bonus: 0 *
//* Attack Speed Bonus: 1 *
//* Damage Bonus: 2 *
//* Agility Bonus: 3 *
//* Intelligence Bonus: 4 *
//* Strength Bonus: 5 *
//* Life Regen Bonus: 6 *
//* Mana Regen Bonus: 7 *
//* Life Bonus: 8 *
//* Mana Bonus: 9 *
//* Sight Range Bonus: 10 *
//**************************************************************************************
//********************************************************************************
//* Generic Bonus APIs *
//* *
//* CSS_GetBonus takes unit u, integer bonusType returns integer *
//* CSS_AddBonus takes unit u, integer amount, integer bonusType returns nothing *
//* CSS_ClearBonus takes unit u, integer bonusType *
//********************************************************************************
// SimError by Vexorian at wc3c.net
// Sim Error (modified)
function CSS_SimError takes string s returns nothing
local string msg = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|cffffcc00" + s + "|r"
local player ForPlayer = GetTriggerPlayer()
local sound error = CreateSoundFromLabel("InterfaceError", false, false, false, 10, 10)
if GetLocalPlayer() == ForPlayer then
call ClearTextMessages()
call DisplayTimedTextToPlayer(ForPlayer, 0.52, 0.96, 2.00, msg)
call StartSound(error)
endif
set ForPlayer = null
endfunction
function CSS_SimNotification takes string s returns nothing
local string msg = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|cff32cd32" + s + "|r"
local player ForPlayer = GetTriggerPlayer()
local sound notify = CreateSoundFromLabel("ItemReward", false, false, false, 10, 10)
if GetLocalPlayer() == ForPlayer then
call ClearTextMessages()
call DisplayTimedTextToPlayer(ForPlayer, 0.52, 0.96, 2.00, msg)
call StartSound (notify)
endif
set ForPlayer = null
endfunction
// Bound Int by Magtheridon96 at hiveworkshop.com
// BoundInt
function BoundInt takes integer i, integer min, integer max returns integer
return IMaxBJ(IMinBJ(i, max), min)
endfunction
// Bonus Handling Code
function CSS_AddBonus takes unit u, integer amount, integer bonusType returns nothing
local integer max = udg_CSS_Power[17]
local integer min = -udg_CSS_Power[17]
local integer i = 16
local integer j = LoadInteger (udg_CSS_Hashtable, GetHandleId(u), bonusType)
if amount > max - 1 or amount < min then
call CSS_SimError ("Value too high or too low")
return
endif
if amount + j >= max or amount + j <= min then
call CSS_SimError ("Current value at maximum or minimum")
endif
set amount = amount + j
call BoundInt (amount, min, max - 1)
if bonusType < 0 or bonusType > 10 then
call CSS_SimError ("CSS Error: Invalid bonus type (" + I2S(bonusType) + ")")
return
elseif bonusType == 8 or bonusType == 9 then
if bonusType == 8 and amount*1. + GetUnitState(u, UNIT_STATE_MAX_LIFE) <= 0 then
call CSS_SimError ("Unit's current max life is lower than the negative bonus amount. Unable to subtract.")
return
elseif bonusType == 9 and amount*1. + GetUnitState(u, UNIT_STATE_MAX_MANA) <= 0 then
call CSS_SimError ("Unit's current max mana is lower than the negative bonus amount. Unable to subtract.")
return
endif
call SaveInteger(udg_CSS_Hashtable, GetHandleId(u), bonusType, amount)
if amount < 0 then
set amount = max + amount
else
call UnitRemoveAbility(u, udg_CSS_Abilities[(bonusType + 1)*18 - 1])
endif
loop
if amount >= udg_CSS_Power[i] then
call UnitAddAbility(u, udg_CSS_Abilities[bonusType*18 + i])
call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[bonusType*18 + i])
set amount = amount - udg_CSS_Power[i]
else
call UnitRemoveAbility(u, udg_CSS_Abilities[bonusType*18 + i])
endif
set i = i - 1
exitwhen i < 0
endloop
if LoadInteger(udg_CSS_Hashtable, GetHandleId(u), bonusType) < 0 then
call UnitAddAbility(u, udg_CSS_Abilities[(bonusType + 1)*18 - 1])
call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[(bonusType + 1)*18 - 1])
endif
else
call SaveInteger(udg_CSS_Hashtable, GetHandleId(u), bonusType, amount)
if amount < 0 then
set amount = max + amount
call UnitAddAbility(u, udg_CSS_Abilities[(bonusType + 1)*18 - 1])
call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[(bonusType + 1)*18 - 1])
else
call UnitRemoveAbility(u, udg_CSS_Abilities[(bonusType+1)*18 - 1])
endif
loop
if amount >= udg_CSS_Power[i] then
call UnitAddAbility(u, udg_CSS_Abilities[bonusType*18 + i])
call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[bonusType*18 + i])
set amount = amount - udg_CSS_Power[i]
else
call UnitRemoveAbility(u, udg_CSS_Abilities[bonusType*18 + i])
endif
set i = i - 1
exitwhen i < 0
endloop
endif
endfunction
// Clear bonus
function CSS_ClearBonus takes unit u, integer bonusType returns nothing
if bonusType > 10 or bonusType < 0 or GetUnitTypeId (u) == 0 or IsUnitType (u, UNIT_TYPE_DEAD) then
return
endif
call CSS_AddBonus (u, -LoadInteger (udg_CSS_Hashtable, GetHandleId (u), bonusType), bonusType)
endfunction
// Get current bonus
function CSS_GetBonus takes unit u, integer bonusType returns integer
if bonusType > 10 or bonusType < 0 or GetUnitTypeId (u) == 0 or IsUnitType (u, UNIT_TYPE_DEAD) then
return 0
endif
return LoadInteger (udg_CSS_Hashtable, GetHandleId (u), bonusType)
endfunction
// For preloading abilities
function CSS_Preload takes nothing returns nothing
local integer i = 0
local unit u = CreateUnit(Player(15), 'hfoo', 0, 0, 0.00)
loop
exitwhen i > 197
call UnitAddAbility(u, udg_CSS_Abilities[i])
set i = i + 1
endloop
call RemoveUnit(u)
set u = null
endfunction
//===========================================================================
function InitTrig_CSS_Standalone_Bonus takes nothing returns nothing
local integer i = 0
local integer a = 1
set udg_CSS_Abilities[0] = 'ZxA0'
set udg_CSS_Abilities[1] = 'ZxA1'
set udg_CSS_Abilities[2] = 'ZxA2'
set udg_CSS_Abilities[3] = 'ZxA3'
set udg_CSS_Abilities[4] = 'ZxA4'
set udg_CSS_Abilities[5] = 'ZxA5'
set udg_CSS_Abilities[6] = 'ZxA6'
set udg_CSS_Abilities[7] = 'ZxA7'
set udg_CSS_Abilities[8] = 'ZxA8'
set udg_CSS_Abilities[9] = 'ZxA9'
set udg_CSS_Abilities[10] = 'ZxAa'
set udg_CSS_Abilities[11] = 'ZxAb'
set udg_CSS_Abilities[12] = 'ZxAc'
set udg_CSS_Abilities[13] = 'ZxAd'
set udg_CSS_Abilities[14] = 'ZxAe'
set udg_CSS_Abilities[15] = 'ZxAf'
set udg_CSS_Abilities[16] = 'ZxAg'
set udg_CSS_Abilities[17] = 'ZxAh'
set udg_CSS_Abilities[18] = 'ZxI0'
set udg_CSS_Abilities[19] = 'ZxI1'
set udg_CSS_Abilities[20] = 'ZxI2'
set udg_CSS_Abilities[21] = 'ZxI3'
set udg_CSS_Abilities[22] = 'ZxI4'
set udg_CSS_Abilities[23] = 'ZxI5'
set udg_CSS_Abilities[24] = 'ZxI6'
set udg_CSS_Abilities[25] = 'ZxI7'
set udg_CSS_Abilities[26] = 'ZxI8'
set udg_CSS_Abilities[27] = 'ZxI9'
set udg_CSS_Abilities[28] = 'ZxIa'
set udg_CSS_Abilities[29] = 'ZxIb'
set udg_CSS_Abilities[30] = 'ZxIc'
set udg_CSS_Abilities[31] = 'ZxId'
set udg_CSS_Abilities[32] = 'ZxIe'
set udg_CSS_Abilities[33] = 'ZxIf'
set udg_CSS_Abilities[34] = 'ZxIg'
set udg_CSS_Abilities[35] = 'ZxIh'
set udg_CSS_Abilities[36] = 'ZxB0'
set udg_CSS_Abilities[37] = 'ZxB1'
set udg_CSS_Abilities[38] = 'ZxB2'
set udg_CSS_Abilities[39] = 'ZxB3'
set udg_CSS_Abilities[40] = 'ZxB4'
set udg_CSS_Abilities[41] = 'ZxB5'
set udg_CSS_Abilities[42] = 'ZxB6'
set udg_CSS_Abilities[43] = 'ZxB7'
set udg_CSS_Abilities[44] = 'ZxB8'
set udg_CSS_Abilities[45] = 'ZxB9'
set udg_CSS_Abilities[46] = 'ZxBa'
set udg_CSS_Abilities[47] = 'ZxBb'
set udg_CSS_Abilities[48] = 'ZxBc'
set udg_CSS_Abilities[49] = 'ZxBd'
set udg_CSS_Abilities[50] = 'ZxBe'
set udg_CSS_Abilities[51] = 'ZxBf'
set udg_CSS_Abilities[52] = 'ZxBg'
set udg_CSS_Abilities[53] = 'ZxBh'
set udg_CSS_Abilities[54] = 'ZxG0'
set udg_CSS_Abilities[55] = 'ZxG1'
set udg_CSS_Abilities[56] = 'ZxG2'
set udg_CSS_Abilities[57] = 'ZxG3'
set udg_CSS_Abilities[58] = 'ZxG4'
set udg_CSS_Abilities[59] = 'ZxG5'
set udg_CSS_Abilities[60] = 'ZxG6'
set udg_CSS_Abilities[61] = 'ZxG7'
set udg_CSS_Abilities[62] = 'ZxG8'
set udg_CSS_Abilities[63] = 'ZxG9'
set udg_CSS_Abilities[64] = 'ZxGa'
set udg_CSS_Abilities[65] = 'ZxGb'
set udg_CSS_Abilities[66] = 'ZxGc'
set udg_CSS_Abilities[67] = 'ZxGd'
set udg_CSS_Abilities[68] = 'ZxGe'
set udg_CSS_Abilities[69] = 'ZxGf'
set udg_CSS_Abilities[70] = 'ZxGg'
set udg_CSS_Abilities[71] = 'ZxGh'
set udg_CSS_Abilities[72] = 'ZxH0'
set udg_CSS_Abilities[73] = 'ZxH1'
set udg_CSS_Abilities[74] = 'ZxH2'
set udg_CSS_Abilities[75] = 'ZxH3'
set udg_CSS_Abilities[76] = 'ZxH4'
set udg_CSS_Abilities[77] = 'ZxH5'
set udg_CSS_Abilities[78] = 'ZxH6'
set udg_CSS_Abilities[79] = 'ZxH7'
set udg_CSS_Abilities[80] = 'ZxH8'
set udg_CSS_Abilities[81] = 'ZxH9'
set udg_CSS_Abilities[82] = 'ZxHa'
set udg_CSS_Abilities[83] = 'ZxHb'
set udg_CSS_Abilities[84] = 'ZxHc'
set udg_CSS_Abilities[85] = 'ZxHd'
set udg_CSS_Abilities[86] = 'ZxHe'
set udg_CSS_Abilities[87] = 'ZxHf'
set udg_CSS_Abilities[88] = 'ZxHg'
set udg_CSS_Abilities[89] = 'ZxHh'
set udg_CSS_Abilities[90] = 'ZxF0'
set udg_CSS_Abilities[91] = 'ZxF1'
set udg_CSS_Abilities[92] = 'ZxF2'
set udg_CSS_Abilities[93] = 'ZxF3'
set udg_CSS_Abilities[94] = 'ZxF4'
set udg_CSS_Abilities[95] = 'ZxF5'
set udg_CSS_Abilities[96] = 'ZxF6'
set udg_CSS_Abilities[97] = 'ZxF7'
set udg_CSS_Abilities[98] = 'ZxF8'
set udg_CSS_Abilities[99] = 'ZxF9'
set udg_CSS_Abilities[100] = 'ZxFa'
set udg_CSS_Abilities[101] = 'ZxFb'
set udg_CSS_Abilities[102] = 'ZxFc'
set udg_CSS_Abilities[103] = 'ZxFd'
set udg_CSS_Abilities[104] = 'ZxFe'
set udg_CSS_Abilities[105] = 'ZxFf'
set udg_CSS_Abilities[106] = 'ZxFg'
set udg_CSS_Abilities[107] = 'ZxFh'
set udg_CSS_Abilities[108] = 'ZxJ0'
set udg_CSS_Abilities[109] = 'ZxJ1'
set udg_CSS_Abilities[110] = 'ZxJ2'
set udg_CSS_Abilities[111] = 'ZxJ3'
set udg_CSS_Abilities[112] = 'ZxJ4'
set udg_CSS_Abilities[113] = 'ZxJ5'
set udg_CSS_Abilities[114] = 'ZxJ6'
set udg_CSS_Abilities[115] = 'ZxJ7'
set udg_CSS_Abilities[116] = 'ZxJ8'
set udg_CSS_Abilities[117] = 'ZxJ9'
set udg_CSS_Abilities[118] = 'ZxJa'
set udg_CSS_Abilities[119] = 'ZxJb'
set udg_CSS_Abilities[120] = 'ZxJc'
set udg_CSS_Abilities[121] = 'ZxJd'
set udg_CSS_Abilities[122] = 'ZxJe'
set udg_CSS_Abilities[123] = 'ZxJf'
set udg_CSS_Abilities[124] = 'ZxJg'
set udg_CSS_Abilities[125] = 'ZxJh'
set udg_CSS_Abilities[126] = 'ZxK0'
set udg_CSS_Abilities[127] = 'ZxK1'
set udg_CSS_Abilities[128] = 'ZxK2'
set udg_CSS_Abilities[129] = 'ZxK3'
set udg_CSS_Abilities[130] = 'ZxK4'
set udg_CSS_Abilities[131] = 'ZxK5'
set udg_CSS_Abilities[132] = 'ZxK6'
set udg_CSS_Abilities[133] = 'ZxK7'
set udg_CSS_Abilities[134] = 'ZxK8'
set udg_CSS_Abilities[135] = 'ZxK9'
set udg_CSS_Abilities[136] = 'ZxKa'
set udg_CSS_Abilities[137] = 'ZxKb'
set udg_CSS_Abilities[138] = 'ZxKc'
set udg_CSS_Abilities[139] = 'ZxKd'
set udg_CSS_Abilities[140] = 'ZxKe'
set udg_CSS_Abilities[141] = 'ZxKf'
set udg_CSS_Abilities[142] = 'ZxKg'
set udg_CSS_Abilities[143] = 'ZxKh'
set udg_CSS_Abilities[144] = 'ZxE0'
set udg_CSS_Abilities[145] = 'ZxE1'
set udg_CSS_Abilities[146] = 'ZxE2'
set udg_CSS_Abilities[147] = 'ZxE3'
set udg_CSS_Abilities[148] = 'ZxE4'
set udg_CSS_Abilities[149] = 'ZxE5'
set udg_CSS_Abilities[150] = 'ZxE6'
set udg_CSS_Abilities[151] = 'ZxE7'
set udg_CSS_Abilities[152] = 'ZxE8'
set udg_CSS_Abilities[153] = 'ZxE9'
set udg_CSS_Abilities[154] = 'ZxEa'
set udg_CSS_Abilities[155] = 'ZxEb'
set udg_CSS_Abilities[156] = 'ZxEc'
set udg_CSS_Abilities[157] = 'ZxEd'
set udg_CSS_Abilities[158] = 'ZxEe'
set udg_CSS_Abilities[159] = 'ZxEf'
set udg_CSS_Abilities[160] = 'ZxEg'
set udg_CSS_Abilities[161] = 'ZxEh'
set udg_CSS_Abilities[162] = 'ZxD0'
set udg_CSS_Abilities[163] = 'ZxD1'
set udg_CSS_Abilities[164] = 'ZxD2'
set udg_CSS_Abilities[165] = 'ZxD3'
set udg_CSS_Abilities[166] = 'ZxD4'
set udg_CSS_Abilities[167] = 'ZxD5'
set udg_CSS_Abilities[168] = 'ZxD6'
set udg_CSS_Abilities[169] = 'ZxD7'
set udg_CSS_Abilities[170] = 'ZxD8'
set udg_CSS_Abilities[171] = 'ZxD9'
set udg_CSS_Abilities[172] = 'ZxDa'
set udg_CSS_Abilities[173] = 'ZxDb'
set udg_CSS_Abilities[174] = 'ZxDc'
set udg_CSS_Abilities[175] = 'ZxDd'
set udg_CSS_Abilities[176] = 'ZxDe'
set udg_CSS_Abilities[177] = 'ZxDf'
set udg_CSS_Abilities[178] = 'ZxDg'
set udg_CSS_Abilities[179] = 'ZxDh'
set udg_CSS_Abilities[180] = 'ZxC0'
set udg_CSS_Abilities[181] = 'ZxC1'
set udg_CSS_Abilities[182] = 'ZxC2'
set udg_CSS_Abilities[183] = 'ZxC3'
set udg_CSS_Abilities[184] = 'ZxC4'
set udg_CSS_Abilities[185] = 'ZxC5'
set udg_CSS_Abilities[186] = 'ZxC6'
set udg_CSS_Abilities[187] = 'ZxC7'
set udg_CSS_Abilities[188] = 'ZxC8'
set udg_CSS_Abilities[189] = 'ZxC9'
set udg_CSS_Abilities[190] = 'ZxCa'
set udg_CSS_Abilities[191] = 'ZxCb'
set udg_CSS_Abilities[192] = 'ZxCc'
set udg_CSS_Abilities[193] = 'ZxCd'
set udg_CSS_Abilities[194] = 'ZxCe'
set udg_CSS_Abilities[195] = 'ZxCf'
set udg_CSS_Abilities[196] = 'ZxCg'
set udg_CSS_Abilities[197] = 'ZxCh'
loop
exitwhen i > 30
set udg_CSS_Power[i] = a
set a = a*2
set i = i + 1
endloop
set udg_CSS_Hashtable = InitHashtable()
if udg_CSS_PreloadBoolean then
call CSS_Preload()
endif
endfunction
endlibrary
Thanks for the help, though I didn't update that portion of the code from the 2018 iteration of the spell. It's pretty low priority at the momentThat function and a few others are in the maps' Custom Script section (click the map name in the trigger editor). Daffa should have known better than to do that in 2021, frankly. This should be updated. Put all the code in the CS and the CSS trigger into one library and overwrite the CSS trigger with it:
JASS:library CSS_FixThisDaffaYouFool //************************************************************************************************************ //* * //* CUSTOM STAT SYSTEM (CSS) * //* * //* Author: Doomlord * //* Version: 1.5i * //* * //* Credits: * //* + Earth-Fury: BonusMod binary algoritm; implementation macro. * //* + Crigges: A great amount of help and support. * //* + Geries: Help me with the item hashtable values cleanup. * //* + rulerofiron99: Item Socketing method referenced from [GUI]Right Click Item Recipe v1.05. * //* + Vexorian: CSS_SimError [url]http://www.wc3c.net/showthread.php?t=101260[/url] * //* + Magtheridon96: [Snippet]BoundInt [url]http://www.hiveworkshop.com/forums/2294066-post804.html[/url] * //* + WaterKnight: Help with the stack for custom Event Response. * //* + PurgeandFire: Pinpoint a possible desync bug with the system. * //* + Nestharus: Mentioning the possible negative life bug in his Bonus lib. * //* * //************************************************************************************************************ //************************************************************************************** //* INTRODUCTION: * //* * //* An alternative to BonusMod for those who prefer a vanilla JASS approach. * //* * //* Just follow the API and you are pretty much done. * //************************************************************************************** //******************************************************************************************************** //* REQUIREMENTS: * //* * //* JNGP [url]http://www.hiveworkshop.com/forums/tools-560/jassnewgenpack-5d-227445[/url] (Recommended) * //* OR: * //* Your superhuman capability to transfer 198 abilities to your map. (Not Recommended) * //******************************************************************************************************** //************************************************************************************************************************************************ //* INSTALLATION INSTRUCTION: * //* * //* Step 1: Copy the custom code for bonus handling to your map header. * //* Step 2: Use JNGP to implement the system's abilities through macro. Instruction is included in the Implementation Macro trigger. * //* Step 3: Copy the whole CSS folder to your map. Don't forget to turn on "Automatically create unknown variables while pasting trigger data". * //* Step 4: Except for this trigger, delete every other useless elements. * //* Step 5: Use this BonusMod alternative however you want. * //* * //************************************************************************************************************************************************ //************************************************************************************** //* Bonus Types Identifier: * //* * //* Armor Bonus: 0 * //* Attack Speed Bonus: 1 * //* Damage Bonus: 2 * //* Agility Bonus: 3 * //* Intelligence Bonus: 4 * //* Strength Bonus: 5 * //* Life Regen Bonus: 6 * //* Mana Regen Bonus: 7 * //* Life Bonus: 8 * //* Mana Bonus: 9 * //* Sight Range Bonus: 10 * //************************************************************************************** //******************************************************************************** //* Generic Bonus APIs * //* * //* CSS_GetBonus takes unit u, integer bonusType returns integer * //* CSS_AddBonus takes unit u, integer amount, integer bonusType returns nothing * //* CSS_ClearBonus takes unit u, integer bonusType * //******************************************************************************** // SimError by Vexorian at wc3c.net // Sim Error (modified) function CSS_SimError takes string s returns nothing local string msg = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|cffffcc00" + s + "|r" local player ForPlayer = GetTriggerPlayer() local sound error = CreateSoundFromLabel("InterfaceError", false, false, false, 10, 10) if GetLocalPlayer() == ForPlayer then call ClearTextMessages() call DisplayTimedTextToPlayer(ForPlayer, 0.52, 0.96, 2.00, msg) call StartSound(error) endif set ForPlayer = null endfunction function CSS_SimNotification takes string s returns nothing local string msg = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|cff32cd32" + s + "|r" local player ForPlayer = GetTriggerPlayer() local sound notify = CreateSoundFromLabel("ItemReward", false, false, false, 10, 10) if GetLocalPlayer() == ForPlayer then call ClearTextMessages() call DisplayTimedTextToPlayer(ForPlayer, 0.52, 0.96, 2.00, msg) call StartSound (notify) endif set ForPlayer = null endfunction // Bound Int by Magtheridon96 at hiveworkshop.com // BoundInt function BoundInt takes integer i, integer min, integer max returns integer return IMaxBJ(IMinBJ(i, max), min) endfunction // Bonus Handling Code function CSS_AddBonus takes unit u, integer amount, integer bonusType returns nothing local integer max = udg_CSS_Power[17] local integer min = -udg_CSS_Power[17] local integer i = 16 local integer j = LoadInteger (udg_CSS_Hashtable, GetHandleId(u), bonusType) if amount > max - 1 or amount < min then call CSS_SimError ("Value too high or too low") return endif if amount + j >= max or amount + j <= min then call CSS_SimError ("Current value at maximum or minimum") endif set amount = amount + j call BoundInt (amount, min, max - 1) if bonusType < 0 or bonusType > 10 then call CSS_SimError ("CSS Error: Invalid bonus type (" + I2S(bonusType) + ")") return elseif bonusType == 8 or bonusType == 9 then if bonusType == 8 and amount*1. + GetUnitState(u, UNIT_STATE_MAX_LIFE) <= 0 then call CSS_SimError ("Unit's current max life is lower than the negative bonus amount. Unable to subtract.") return elseif bonusType == 9 and amount*1. + GetUnitState(u, UNIT_STATE_MAX_MANA) <= 0 then call CSS_SimError ("Unit's current max mana is lower than the negative bonus amount. Unable to subtract.") return endif call SaveInteger(udg_CSS_Hashtable, GetHandleId(u), bonusType, amount) if amount < 0 then set amount = max + amount else call UnitRemoveAbility(u, udg_CSS_Abilities[(bonusType + 1)*18 - 1]) endif loop if amount >= udg_CSS_Power[i] then call UnitAddAbility(u, udg_CSS_Abilities[bonusType*18 + i]) call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[bonusType*18 + i]) set amount = amount - udg_CSS_Power[i] else call UnitRemoveAbility(u, udg_CSS_Abilities[bonusType*18 + i]) endif set i = i - 1 exitwhen i < 0 endloop if LoadInteger(udg_CSS_Hashtable, GetHandleId(u), bonusType) < 0 then call UnitAddAbility(u, udg_CSS_Abilities[(bonusType + 1)*18 - 1]) call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[(bonusType + 1)*18 - 1]) endif else call SaveInteger(udg_CSS_Hashtable, GetHandleId(u), bonusType, amount) if amount < 0 then set amount = max + amount call UnitAddAbility(u, udg_CSS_Abilities[(bonusType + 1)*18 - 1]) call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[(bonusType + 1)*18 - 1]) else call UnitRemoveAbility(u, udg_CSS_Abilities[(bonusType+1)*18 - 1]) endif loop if amount >= udg_CSS_Power[i] then call UnitAddAbility(u, udg_CSS_Abilities[bonusType*18 + i]) call UnitMakeAbilityPermanent(u, true, udg_CSS_Abilities[bonusType*18 + i]) set amount = amount - udg_CSS_Power[i] else call UnitRemoveAbility(u, udg_CSS_Abilities[bonusType*18 + i]) endif set i = i - 1 exitwhen i < 0 endloop endif endfunction // Clear bonus function CSS_ClearBonus takes unit u, integer bonusType returns nothing if bonusType > 10 or bonusType < 0 or GetUnitTypeId (u) == 0 or IsUnitType (u, UNIT_TYPE_DEAD) then return endif call CSS_AddBonus (u, -LoadInteger (udg_CSS_Hashtable, GetHandleId (u), bonusType), bonusType) endfunction // Get current bonus function CSS_GetBonus takes unit u, integer bonusType returns integer if bonusType > 10 or bonusType < 0 or GetUnitTypeId (u) == 0 or IsUnitType (u, UNIT_TYPE_DEAD) then return 0 endif return LoadInteger (udg_CSS_Hashtable, GetHandleId (u), bonusType) endfunction // For preloading abilities function CSS_Preload takes nothing returns nothing local integer i = 0 local unit u = CreateUnit(Player(15), 'hfoo', 0, 0, 0.00) loop exitwhen i > 197 call UnitAddAbility(u, udg_CSS_Abilities[i]) set i = i + 1 endloop call RemoveUnit(u) set u = null endfunction //=========================================================================== function InitTrig_CSS_Standalone_Bonus takes nothing returns nothing local integer i = 0 local integer a = 1 set udg_CSS_Abilities[0] = 'ZxA0' set udg_CSS_Abilities[1] = 'ZxA1' set udg_CSS_Abilities[2] = 'ZxA2' set udg_CSS_Abilities[3] = 'ZxA3' set udg_CSS_Abilities[4] = 'ZxA4' set udg_CSS_Abilities[5] = 'ZxA5' set udg_CSS_Abilities[6] = 'ZxA6' set udg_CSS_Abilities[7] = 'ZxA7' set udg_CSS_Abilities[8] = 'ZxA8' set udg_CSS_Abilities[9] = 'ZxA9' set udg_CSS_Abilities[10] = 'ZxAa' set udg_CSS_Abilities[11] = 'ZxAb' set udg_CSS_Abilities[12] = 'ZxAc' set udg_CSS_Abilities[13] = 'ZxAd' set udg_CSS_Abilities[14] = 'ZxAe' set udg_CSS_Abilities[15] = 'ZxAf' set udg_CSS_Abilities[16] = 'ZxAg' set udg_CSS_Abilities[17] = 'ZxAh' set udg_CSS_Abilities[18] = 'ZxI0' set udg_CSS_Abilities[19] = 'ZxI1' set udg_CSS_Abilities[20] = 'ZxI2' set udg_CSS_Abilities[21] = 'ZxI3' set udg_CSS_Abilities[22] = 'ZxI4' set udg_CSS_Abilities[23] = 'ZxI5' set udg_CSS_Abilities[24] = 'ZxI6' set udg_CSS_Abilities[25] = 'ZxI7' set udg_CSS_Abilities[26] = 'ZxI8' set udg_CSS_Abilities[27] = 'ZxI9' set udg_CSS_Abilities[28] = 'ZxIa' set udg_CSS_Abilities[29] = 'ZxIb' set udg_CSS_Abilities[30] = 'ZxIc' set udg_CSS_Abilities[31] = 'ZxId' set udg_CSS_Abilities[32] = 'ZxIe' set udg_CSS_Abilities[33] = 'ZxIf' set udg_CSS_Abilities[34] = 'ZxIg' set udg_CSS_Abilities[35] = 'ZxIh' set udg_CSS_Abilities[36] = 'ZxB0' set udg_CSS_Abilities[37] = 'ZxB1' set udg_CSS_Abilities[38] = 'ZxB2' set udg_CSS_Abilities[39] = 'ZxB3' set udg_CSS_Abilities[40] = 'ZxB4' set udg_CSS_Abilities[41] = 'ZxB5' set udg_CSS_Abilities[42] = 'ZxB6' set udg_CSS_Abilities[43] = 'ZxB7' set udg_CSS_Abilities[44] = 'ZxB8' set udg_CSS_Abilities[45] = 'ZxB9' set udg_CSS_Abilities[46] = 'ZxBa' set udg_CSS_Abilities[47] = 'ZxBb' set udg_CSS_Abilities[48] = 'ZxBc' set udg_CSS_Abilities[49] = 'ZxBd' set udg_CSS_Abilities[50] = 'ZxBe' set udg_CSS_Abilities[51] = 'ZxBf' set udg_CSS_Abilities[52] = 'ZxBg' set udg_CSS_Abilities[53] = 'ZxBh' set udg_CSS_Abilities[54] = 'ZxG0' set udg_CSS_Abilities[55] = 'ZxG1' set udg_CSS_Abilities[56] = 'ZxG2' set udg_CSS_Abilities[57] = 'ZxG3' set udg_CSS_Abilities[58] = 'ZxG4' set udg_CSS_Abilities[59] = 'ZxG5' set udg_CSS_Abilities[60] = 'ZxG6' set udg_CSS_Abilities[61] = 'ZxG7' set udg_CSS_Abilities[62] = 'ZxG8' set udg_CSS_Abilities[63] = 'ZxG9' set udg_CSS_Abilities[64] = 'ZxGa' set udg_CSS_Abilities[65] = 'ZxGb' set udg_CSS_Abilities[66] = 'ZxGc' set udg_CSS_Abilities[67] = 'ZxGd' set udg_CSS_Abilities[68] = 'ZxGe' set udg_CSS_Abilities[69] = 'ZxGf' set udg_CSS_Abilities[70] = 'ZxGg' set udg_CSS_Abilities[71] = 'ZxGh' set udg_CSS_Abilities[72] = 'ZxH0' set udg_CSS_Abilities[73] = 'ZxH1' set udg_CSS_Abilities[74] = 'ZxH2' set udg_CSS_Abilities[75] = 'ZxH3' set udg_CSS_Abilities[76] = 'ZxH4' set udg_CSS_Abilities[77] = 'ZxH5' set udg_CSS_Abilities[78] = 'ZxH6' set udg_CSS_Abilities[79] = 'ZxH7' set udg_CSS_Abilities[80] = 'ZxH8' set udg_CSS_Abilities[81] = 'ZxH9' set udg_CSS_Abilities[82] = 'ZxHa' set udg_CSS_Abilities[83] = 'ZxHb' set udg_CSS_Abilities[84] = 'ZxHc' set udg_CSS_Abilities[85] = 'ZxHd' set udg_CSS_Abilities[86] = 'ZxHe' set udg_CSS_Abilities[87] = 'ZxHf' set udg_CSS_Abilities[88] = 'ZxHg' set udg_CSS_Abilities[89] = 'ZxHh' set udg_CSS_Abilities[90] = 'ZxF0' set udg_CSS_Abilities[91] = 'ZxF1' set udg_CSS_Abilities[92] = 'ZxF2' set udg_CSS_Abilities[93] = 'ZxF3' set udg_CSS_Abilities[94] = 'ZxF4' set udg_CSS_Abilities[95] = 'ZxF5' set udg_CSS_Abilities[96] = 'ZxF6' set udg_CSS_Abilities[97] = 'ZxF7' set udg_CSS_Abilities[98] = 'ZxF8' set udg_CSS_Abilities[99] = 'ZxF9' set udg_CSS_Abilities[100] = 'ZxFa' set udg_CSS_Abilities[101] = 'ZxFb' set udg_CSS_Abilities[102] = 'ZxFc' set udg_CSS_Abilities[103] = 'ZxFd' set udg_CSS_Abilities[104] = 'ZxFe' set udg_CSS_Abilities[105] = 'ZxFf' set udg_CSS_Abilities[106] = 'ZxFg' set udg_CSS_Abilities[107] = 'ZxFh' set udg_CSS_Abilities[108] = 'ZxJ0' set udg_CSS_Abilities[109] = 'ZxJ1' set udg_CSS_Abilities[110] = 'ZxJ2' set udg_CSS_Abilities[111] = 'ZxJ3' set udg_CSS_Abilities[112] = 'ZxJ4' set udg_CSS_Abilities[113] = 'ZxJ5' set udg_CSS_Abilities[114] = 'ZxJ6' set udg_CSS_Abilities[115] = 'ZxJ7' set udg_CSS_Abilities[116] = 'ZxJ8' set udg_CSS_Abilities[117] = 'ZxJ9' set udg_CSS_Abilities[118] = 'ZxJa' set udg_CSS_Abilities[119] = 'ZxJb' set udg_CSS_Abilities[120] = 'ZxJc' set udg_CSS_Abilities[121] = 'ZxJd' set udg_CSS_Abilities[122] = 'ZxJe' set udg_CSS_Abilities[123] = 'ZxJf' set udg_CSS_Abilities[124] = 'ZxJg' set udg_CSS_Abilities[125] = 'ZxJh' set udg_CSS_Abilities[126] = 'ZxK0' set udg_CSS_Abilities[127] = 'ZxK1' set udg_CSS_Abilities[128] = 'ZxK2' set udg_CSS_Abilities[129] = 'ZxK3' set udg_CSS_Abilities[130] = 'ZxK4' set udg_CSS_Abilities[131] = 'ZxK5' set udg_CSS_Abilities[132] = 'ZxK6' set udg_CSS_Abilities[133] = 'ZxK7' set udg_CSS_Abilities[134] = 'ZxK8' set udg_CSS_Abilities[135] = 'ZxK9' set udg_CSS_Abilities[136] = 'ZxKa' set udg_CSS_Abilities[137] = 'ZxKb' set udg_CSS_Abilities[138] = 'ZxKc' set udg_CSS_Abilities[139] = 'ZxKd' set udg_CSS_Abilities[140] = 'ZxKe' set udg_CSS_Abilities[141] = 'ZxKf' set udg_CSS_Abilities[142] = 'ZxKg' set udg_CSS_Abilities[143] = 'ZxKh' set udg_CSS_Abilities[144] = 'ZxE0' set udg_CSS_Abilities[145] = 'ZxE1' set udg_CSS_Abilities[146] = 'ZxE2' set udg_CSS_Abilities[147] = 'ZxE3' set udg_CSS_Abilities[148] = 'ZxE4' set udg_CSS_Abilities[149] = 'ZxE5' set udg_CSS_Abilities[150] = 'ZxE6' set udg_CSS_Abilities[151] = 'ZxE7' set udg_CSS_Abilities[152] = 'ZxE8' set udg_CSS_Abilities[153] = 'ZxE9' set udg_CSS_Abilities[154] = 'ZxEa' set udg_CSS_Abilities[155] = 'ZxEb' set udg_CSS_Abilities[156] = 'ZxEc' set udg_CSS_Abilities[157] = 'ZxEd' set udg_CSS_Abilities[158] = 'ZxEe' set udg_CSS_Abilities[159] = 'ZxEf' set udg_CSS_Abilities[160] = 'ZxEg' set udg_CSS_Abilities[161] = 'ZxEh' set udg_CSS_Abilities[162] = 'ZxD0' set udg_CSS_Abilities[163] = 'ZxD1' set udg_CSS_Abilities[164] = 'ZxD2' set udg_CSS_Abilities[165] = 'ZxD3' set udg_CSS_Abilities[166] = 'ZxD4' set udg_CSS_Abilities[167] = 'ZxD5' set udg_CSS_Abilities[168] = 'ZxD6' set udg_CSS_Abilities[169] = 'ZxD7' set udg_CSS_Abilities[170] = 'ZxD8' set udg_CSS_Abilities[171] = 'ZxD9' set udg_CSS_Abilities[172] = 'ZxDa' set udg_CSS_Abilities[173] = 'ZxDb' set udg_CSS_Abilities[174] = 'ZxDc' set udg_CSS_Abilities[175] = 'ZxDd' set udg_CSS_Abilities[176] = 'ZxDe' set udg_CSS_Abilities[177] = 'ZxDf' set udg_CSS_Abilities[178] = 'ZxDg' set udg_CSS_Abilities[179] = 'ZxDh' set udg_CSS_Abilities[180] = 'ZxC0' set udg_CSS_Abilities[181] = 'ZxC1' set udg_CSS_Abilities[182] = 'ZxC2' set udg_CSS_Abilities[183] = 'ZxC3' set udg_CSS_Abilities[184] = 'ZxC4' set udg_CSS_Abilities[185] = 'ZxC5' set udg_CSS_Abilities[186] = 'ZxC6' set udg_CSS_Abilities[187] = 'ZxC7' set udg_CSS_Abilities[188] = 'ZxC8' set udg_CSS_Abilities[189] = 'ZxC9' set udg_CSS_Abilities[190] = 'ZxCa' set udg_CSS_Abilities[191] = 'ZxCb' set udg_CSS_Abilities[192] = 'ZxCc' set udg_CSS_Abilities[193] = 'ZxCd' set udg_CSS_Abilities[194] = 'ZxCe' set udg_CSS_Abilities[195] = 'ZxCf' set udg_CSS_Abilities[196] = 'ZxCg' set udg_CSS_Abilities[197] = 'ZxCh' loop exitwhen i > 30 set udg_CSS_Power[i] = a set a = a*2 set i = i + 1 endloop set udg_CSS_Hashtable = InitHashtable() if udg_CSS_PreloadBoolean then call CSS_Preload() endif endfunction endlibrary