library SyncAttackArmorData initializer SyncAttackArmorDataInit
// Reference:
// https://www.hiveworkshop.com/threads/target-of-current-camera-desync.316384/
function ConvertAttackStringToInteger takes string inputStr returns integer
local string currentChar = ""
local boolean isSecondHyphen = false
local integer i = 1
local integer len = StringLength(inputStr)
local integer minAttack = 0
local integer maxAttack = 0
local integer bonus = 0
local integer maxIndex = 0
// Loop through the characters in the input string
loop
exitwhen i > len
set currentChar = SubStringBJ(inputStr, i, i)
if currentChar == "-" and isSecondHyphen == false then
set isSecondHyphen = true
set minAttack = S2I(SubStringBJ(inputStr, 1, i - 1))
set maxIndex = i + 1
elseif currentChar == "+" then
set maxAttack = S2I(SubStringBJ(inputStr, maxIndex, i - 1))
set bonus = S2I(SubStringBJ(inputStr, i + 1, len))
return minAttack + maxAttack + (bonus * 2)
elseif currentChar == "-" and isSecondHyphen then
set maxAttack = S2I(SubStringBJ(inputStr, maxIndex, i - 1))
set bonus = S2I(SubStringBJ(inputStr, i + 1, len))
set bonus = bonus * -1
return minAttack + maxAttack + (bonus * 2)
endif
set i = i + 1
if i >= len then
// No bonus
set maxAttack = S2I(SubStringBJ(inputStr, maxIndex, len))
return minAttack + maxAttack
endif
endloop
return 0
endfunction
function ConvertArmorStringToReal takes string inputStr returns real
local string currentChar = ""
local integer i = 1
local integer len = StringLength(inputStr)
local integer armor = 0
local integer bonus = 0
local real armorBonus = 0.0
// Loop through the characters in the input string
loop
exitwhen i > len
set currentChar = SubStringBJ(inputStr, i, i)
if currentChar == "-" then
set armor = S2I(SubStringBJ(inputStr, 1, i - 1))
set armorBonus = S2R(SubStringBJ(inputStr, i + 1, len))
// Check for int or real bonus armor
if armorBonus == 0.0 then
// Bonus is an integer
set bonus = S2I(SubStringBJ(inputStr, i + 1, len))
return I2R(armor - bonus)
else
// Bonus is a real
return I2R(armor) - armorBonus
endif
elseif currentChar == "+" then
set armor = S2I(SubStringBJ(inputStr, 1, i - 1))
set armorBonus = S2R(SubStringBJ(inputStr, i + 1, len))
// Check for int or real bonus armor
if armorBonus == 0.0 then
// Bonus is an integer
set bonus = S2I(SubStringBJ(inputStr, i + 1, len))
return I2R(armor + bonus)
else
// Bonus is a real
return I2R(armor) + armorBonus
endif
endif
set i = i + 1
if i >= len then
// No bonus
set armor = S2I(SubStringBJ(inputStr, 1, len))
return I2R(armor)
endif
endloop
return 0.0
endfunction
function SyncAttackDataRead takes nothing returns nothing
local string strData = ""
local integer id = GetConvertedPlayerId(GetTriggerPlayer())
if BlzGetTriggerSyncPrefix() == "SATK" then
set strData = BlzGetTriggerSyncData()
set udg_SAAD_Attack_String[id] = strData
set udg_SAAD_Attack[id] = ConvertAttackStringToInteger(strData)
set udg_SAAD_PN = id
call TriggerExecute(udg_SAAD_Attack_Trigger)
endif
endfunction
function SyncArmorDataRead takes nothing returns nothing
local string strData = ""
local integer id = GetConvertedPlayerId(GetTriggerPlayer())
if BlzGetTriggerSyncPrefix() == "SARM" then
set strData = BlzGetTriggerSyncData()
set udg_SAAD_Armor_String[id] = strData
set udg_SAAD_Armor[id] = ConvertArmorStringToReal(strData)
set udg_SAAD_PN = id
call TriggerExecute(udg_SAAD_Armor_Trigger)
endif
endfunction
function SyncAttackDataSend takes nothing returns nothing
call BlzSendSyncData("SATK", BlzFrameGetText(BlzGetFrameByName("InfoPanelIconValue", 0)))
endfunction
function SyncArmorDataSend takes nothing returns nothing
call BlzSendSyncData("SARM", BlzFrameGetText(BlzGetFrameByName("InfoPanelIconValue", 2)))
endfunction
function SyncAttackArmorDataInit takes nothing returns nothing
local integer playerIndex = 0
local trigger trig1 = CreateTrigger()
local trigger trig2 = CreateTrigger()
call TriggerAddAction(trig1, function SyncAttackDataRead)
call TriggerAddAction(trig2, function SyncArmorDataRead)
loop
call BlzTriggerRegisterPlayerSyncEvent(trig1, Player(playerIndex), "SATK", false)
call BlzTriggerRegisterPlayerSyncEvent(trig2, Player(playerIndex), "SARM", false)
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYER_SLOTS
endloop
endfunction
endlibrary