487 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			487 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
Icons = {}
 | 
						|
Icons[PlayerStates.Poison] = { tooltip = tr('You are poisoned'), path = '/images/game/states/poisoned', id = 'condition_poisoned' }
 | 
						|
Icons[PlayerStates.Burn] = { tooltip = tr('You are burning'), path = '/images/game/states/burning', id = 'condition_burning' }
 | 
						|
Icons[PlayerStates.Energy] = { tooltip = tr('You are electrified'), path = '/images/game/states/electrified', id = 'condition_electrified' }
 | 
						|
Icons[PlayerStates.Drunk] = { tooltip = tr('You are drunk'), path = '/images/game/states/drunk', id = 'condition_drunk' }
 | 
						|
Icons[PlayerStates.ManaShield] = { tooltip = tr('You are protected by a magic shield'), path = '/images/game/states/magic_shield', id = 'condition_magic_shield' }
 | 
						|
Icons[PlayerStates.Paralyze] = { tooltip = tr('You are paralysed'), path = '/images/game/states/slowed', id = 'condition_slowed' }
 | 
						|
Icons[PlayerStates.Haste] = { tooltip = tr('You are hasted'), path = '/images/game/states/haste', id = 'condition_haste' }
 | 
						|
Icons[PlayerStates.Swords] = { tooltip = tr('You may not logout during a fight'), path = '/images/game/states/logout_block', id = 'condition_logout_block' }
 | 
						|
Icons[PlayerStates.Drowning] = { tooltip = tr('You are drowning'), path = '/images/game/states/drowning', id = 'condition_drowning' }
 | 
						|
Icons[PlayerStates.Freezing] = { tooltip = tr('You are freezing'), path = '/images/game/states/freezing', id = 'condition_freezing' }
 | 
						|
Icons[PlayerStates.Dazzled] = { tooltip = tr('You are dazzled'), path = '/images/game/states/dazzled', id = 'condition_dazzled' }
 | 
						|
Icons[PlayerStates.Cursed] = { tooltip = tr('You are cursed'), path = '/images/game/states/cursed', id = 'condition_cursed' }
 | 
						|
Icons[PlayerStates.PartyBuff] = { tooltip = tr('You are strengthened'), path = '/images/game/states/strengthened', id = 'condition_strengthened' }
 | 
						|
Icons[PlayerStates.PzBlock] = { tooltip = tr('You may not logout or enter a protection zone'), path = '/images/game/states/protection_zone_block', id = 'condition_protection_zone_block' }
 | 
						|
Icons[PlayerStates.Pz] = { tooltip = tr('You are within a protection zone'), path = '/images/game/states/protection_zone', id = 'condition_protection_zone' }
 | 
						|
Icons[PlayerStates.Bleeding] = { tooltip = tr('You are bleeding'), path = '/images/game/states/bleeding', id = 'condition_bleeding' }
 | 
						|
Icons[PlayerStates.Hungry] = { tooltip = tr('You are hungry'), path = '/images/game/states/hungry', id = 'condition_hungry' }
 | 
						|
 | 
						|
InventorySlotStyles = {
 | 
						|
  [InventorySlotHead] = "HeadSlot",
 | 
						|
  [InventorySlotNeck] = "NeckSlot",
 | 
						|
  [InventorySlotBack] = "BackSlot",
 | 
						|
  [InventorySlotBody] = "BodySlot",
 | 
						|
  [InventorySlotRight] = "RightSlot",
 | 
						|
  [InventorySlotLeft] = "LeftSlot",
 | 
						|
  [InventorySlotLeg] = "LegSlot",
 | 
						|
  [InventorySlotFeet] = "FeetSlot",
 | 
						|
  [InventorySlotFinger] = "FingerSlot",
 | 
						|
  [InventorySlotAmmo] = "AmmoSlot"
 | 
						|
}
 | 
						|
 | 
						|
inventoryWindow = nil
 | 
						|
inventoryPanel = nil
 | 
						|
inventoryButton = nil
 | 
						|
purseButton = nil
 | 
						|
 | 
						|
combatControlsWindow = nil
 | 
						|
fightOffensiveBox = nil
 | 
						|
fightBalancedBox = nil
 | 
						|
fightDefensiveBox = nil
 | 
						|
chaseModeButton = nil
 | 
						|
safeFightButton = nil
 | 
						|
mountButton = nil
 | 
						|
fightModeRadioGroup = nil
 | 
						|
buttonPvp = nil
 | 
						|
 | 
						|
soulLabel = nil
 | 
						|
capLabel = nil
 | 
						|
conditionPanel = nil
 | 
						|
 | 
						|
function init()
 | 
						|
  connect(LocalPlayer, {
 | 
						|
    onInventoryChange = onInventoryChange,
 | 
						|
    onBlessingsChange = onBlessingsChange
 | 
						|
  })
 | 
						|
  connect(g_game, { onGameStart = refresh })
 | 
						|
 | 
						|
  g_keyboard.bindKeyDown('Ctrl+I', toggle)
 | 
						|
 | 
						|
 | 
						|
  inventoryWindow = g_ui.loadUI('inventory', modules.game_interface.getRightPanel())
 | 
						|
  inventoryWindow:disableResize()
 | 
						|
  inventoryPanel = inventoryWindow:getChildById('contentsPanel'):getChildById('inventoryPanel')
 | 
						|
  if not inventoryWindow.forceOpen then
 | 
						|
    inventoryButton = modules.client_topmenu.addRightGameToggleButton('inventoryButton', tr('Inventory') .. ' (Ctrl+I)', '/images/topbuttons/inventory', toggle)
 | 
						|
    inventoryButton:setOn(true)
 | 
						|
  end
 | 
						|
  
 | 
						|
  purseButton = inventoryWindow:recursiveGetChildById('purseButton')
 | 
						|
  purseButton.onClick = function()
 | 
						|
    local purse = g_game.getLocalPlayer():getInventoryItem(InventorySlotPurse)
 | 
						|
    if purse then
 | 
						|
      g_game.use(purse)
 | 
						|
    end
 | 
						|
  end
 | 
						|
  
 | 
						|
  -- controls
 | 
						|
  fightOffensiveBox = inventoryWindow:recursiveGetChildById('fightOffensiveBox')
 | 
						|
  fightBalancedBox = inventoryWindow:recursiveGetChildById('fightBalancedBox')
 | 
						|
  fightDefensiveBox = inventoryWindow:recursiveGetChildById('fightDefensiveBox')
 | 
						|
 | 
						|
  chaseModeButton = inventoryWindow:recursiveGetChildById('chaseModeBox')
 | 
						|
  safeFightButton = inventoryWindow:recursiveGetChildById('safeFightBox')
 | 
						|
  buttonPvp = inventoryWindow:recursiveGetChildById('buttonPvp')
 | 
						|
 | 
						|
  mountButton = inventoryWindow:recursiveGetChildById('mountButton')
 | 
						|
  mountButton.onClick = onMountButtonClick
 | 
						|
 | 
						|
  whiteDoveBox = inventoryWindow:recursiveGetChildById('whiteDoveBox')
 | 
						|
  whiteHandBox = inventoryWindow:recursiveGetChildById('whiteHandBox')
 | 
						|
  yellowHandBox = inventoryWindow:recursiveGetChildById('yellowHandBox')
 | 
						|
  redFistBox = inventoryWindow:recursiveGetChildById('redFistBox')
 | 
						|
 | 
						|
  fightModeRadioGroup = UIRadioGroup.create()
 | 
						|
  fightModeRadioGroup:addWidget(fightOffensiveBox)
 | 
						|
  fightModeRadioGroup:addWidget(fightBalancedBox)
 | 
						|
  fightModeRadioGroup:addWidget(fightDefensiveBox)
 | 
						|
 | 
						|
  connect(fightModeRadioGroup, { onSelectionChange = onSetFightMode })
 | 
						|
  connect(chaseModeButton, { onCheckChange = onSetChaseMode })
 | 
						|
  connect(safeFightButton, { onCheckChange = onSetSafeFight })
 | 
						|
  if buttonPvp then
 | 
						|
    connect(buttonPvp, { onClick = onSetSafeFight2 })  
 | 
						|
  end
 | 
						|
  connect(g_game, {
 | 
						|
    onGameStart = online,
 | 
						|
    onGameEnd = offline,
 | 
						|
    onFightModeChange = update,
 | 
						|
    onChaseModeChange = update,
 | 
						|
    onSafeFightChange = update,
 | 
						|
    onPVPModeChange   = update,
 | 
						|
    onWalk = check,
 | 
						|
    onAutoWalk = check
 | 
						|
  })
 | 
						|
 | 
						|
  connect(LocalPlayer, { onOutfitChange = onOutfitChange })
 | 
						|
 | 
						|
  if g_game.isOnline() then
 | 
						|
    online()
 | 
						|
  end
 | 
						|
-- controls end
 | 
						|
 | 
						|
-- status
 | 
						|
  soulLabel = inventoryWindow:recursiveGetChildById('soulLabel')
 | 
						|
  capLabel = inventoryWindow:recursiveGetChildById('capLabel')
 | 
						|
  conditionPanel = inventoryWindow:recursiveGetChildById('conditionPanel')
 | 
						|
 | 
						|
 | 
						|
  connect(LocalPlayer, { onStatesChange = onStatesChange,
 | 
						|
                         onSoulChange = onSoulChange,
 | 
						|
                         onFreeCapacityChange = onFreeCapacityChange })
 | 
						|
-- status end
 | 
						|
  
 | 
						|
  refresh()
 | 
						|
  inventoryWindow:setup()
 | 
						|
end
 | 
						|
 | 
						|
function terminate()
 | 
						|
  disconnect(LocalPlayer, {
 | 
						|
    onInventoryChange = onInventoryChange,
 | 
						|
    onBlessingsChange = onBlessingsChange
 | 
						|
  })
 | 
						|
  disconnect(g_game, { onGameStart = refresh })
 | 
						|
 | 
						|
  g_keyboard.unbindKeyDown('Ctrl+I')
 | 
						|
 | 
						|
  -- controls
 | 
						|
  if g_game.isOnline() then
 | 
						|
    offline()
 | 
						|
  end
 | 
						|
 | 
						|
  fightModeRadioGroup:destroy()
 | 
						|
  
 | 
						|
  disconnect(g_game, {
 | 
						|
    onGameStart = online,
 | 
						|
    onGameEnd = offline,
 | 
						|
    onFightModeChange = update,
 | 
						|
    onChaseModeChange = update,
 | 
						|
    onSafeFightChange = update,
 | 
						|
    onPVPModeChange   = update,
 | 
						|
    onWalk = check,
 | 
						|
    onAutoWalk = check
 | 
						|
  })
 | 
						|
 | 
						|
  disconnect(LocalPlayer, { onOutfitChange = onOutfitChange })
 | 
						|
  -- controls end
 | 
						|
  -- status
 | 
						|
  disconnect(LocalPlayer, { onStatesChange = onStatesChange,
 | 
						|
                         onSoulChange = onSoulChange,
 | 
						|
                         onFreeCapacityChange = onFreeCapacityChange })
 | 
						|
  -- status end
 | 
						|
 | 
						|
  inventoryWindow:destroy()
 | 
						|
  if inventoryButton then
 | 
						|
    inventoryButton:destroy()
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function toggleAdventurerStyle(hasBlessing)
 | 
						|
  for slot = InventorySlotFirst, InventorySlotLast do
 | 
						|
    local itemWidget = inventoryPanel:getChildById('slot' .. slot)
 | 
						|
    if itemWidget then
 | 
						|
      itemWidget:setOn(hasBlessing)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function refresh()
 | 
						|
  local player = g_game.getLocalPlayer()
 | 
						|
  for i = InventorySlotFirst, InventorySlotPurse do
 | 
						|
    if g_game.isOnline() then
 | 
						|
      onInventoryChange(player, i, player:getInventoryItem(i))
 | 
						|
    else
 | 
						|
      onInventoryChange(player, i, nil)
 | 
						|
    end
 | 
						|
    toggleAdventurerStyle(player and Bit.hasBit(player:getBlessings(), Blessings.Adventurer) or false)
 | 
						|
  end
 | 
						|
  if player then
 | 
						|
    onSoulChange(player, player:getSoul())
 | 
						|
    onFreeCapacityChange(player, player:getFreeCapacity())
 | 
						|
    onStatesChange(player, player:getStates(), 0)
 | 
						|
  end
 | 
						|
 | 
						|
  purseButton:setVisible(g_game.getFeature(GamePurseSlot))
 | 
						|
end
 | 
						|
 | 
						|
function toggle()
 | 
						|
  if not inventoryButton then
 | 
						|
    return
 | 
						|
  end
 | 
						|
  if inventoryButton:isOn() then
 | 
						|
    inventoryWindow:close()
 | 
						|
    inventoryButton:setOn(false)
 | 
						|
  else
 | 
						|
    inventoryWindow:open()
 | 
						|
    inventoryButton:setOn(true)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function onMiniWindowClose()
 | 
						|
  if not inventoryButton then
 | 
						|
    return
 | 
						|
  end
 | 
						|
  inventoryButton:setOn(false)
 | 
						|
end
 | 
						|
 | 
						|
-- hooked events
 | 
						|
function onInventoryChange(player, slot, item, oldItem)
 | 
						|
  if slot > InventorySlotPurse then return end
 | 
						|
 | 
						|
  if slot == InventorySlotPurse then
 | 
						|
    if g_game.getFeature(GamePurseSlot) then
 | 
						|
      --purseButton:setEnabled(item and true or false)
 | 
						|
    end
 | 
						|
    return
 | 
						|
  end
 | 
						|
 | 
						|
  local itemWidget = inventoryPanel:getChildById('slot' .. slot)
 | 
						|
  if item then
 | 
						|
    itemWidget:setStyle('InventoryItem')
 | 
						|
    itemWidget:setItem(item)
 | 
						|
  else
 | 
						|
    itemWidget:setStyle(InventorySlotStyles[slot])
 | 
						|
    itemWidget:setItem(nil)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function onBlessingsChange(player, blessings, oldBlessings)
 | 
						|
  local hasAdventurerBlessing = Bit.hasBit(blessings, Blessings.Adventurer)
 | 
						|
  if hasAdventurerBlessing ~= Bit.hasBit(oldBlessings, Blessings.Adventurer) then
 | 
						|
    toggleAdventurerStyle(hasAdventurerBlessing)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
-- controls
 | 
						|
function update()
 | 
						|
  local fightMode = g_game.getFightMode()
 | 
						|
  if fightMode == FightOffensive then
 | 
						|
    fightModeRadioGroup:selectWidget(fightOffensiveBox)
 | 
						|
  elseif fightMode == FightBalanced then
 | 
						|
    fightModeRadioGroup:selectWidget(fightBalancedBox)
 | 
						|
  else
 | 
						|
    fightModeRadioGroup:selectWidget(fightDefensiveBox)
 | 
						|
  end
 | 
						|
 | 
						|
  local chaseMode = g_game.getChaseMode()
 | 
						|
  chaseModeButton:setChecked(chaseMode == ChaseOpponent)
 | 
						|
 | 
						|
  local safeFight = g_game.isSafeFight()
 | 
						|
  safeFightButton:setChecked(not safeFight)
 | 
						|
  if buttonPvp then
 | 
						|
    if safeFight then
 | 
						|
      buttonPvp:setOn(false)
 | 
						|
    else
 | 
						|
      buttonPvp:setOn(true)  
 | 
						|
    end
 | 
						|
  end
 | 
						|
  
 | 
						|
  if g_game.getFeature(GamePVPMode) then
 | 
						|
    local pvpMode = g_game.getPVPMode()
 | 
						|
    local pvpWidget = getPVPBoxByMode(pvpMode)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function check()
 | 
						|
  if modules.client_options.getOption('autoChaseOverride') then
 | 
						|
    if g_game.isAttacking() and g_game.getChaseMode() == ChaseOpponent then
 | 
						|
      g_game.setChaseMode(DontChase)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function online()
 | 
						|
  local player = g_game.getLocalPlayer()
 | 
						|
  if player then
 | 
						|
    local char = g_game.getCharacterName()
 | 
						|
 | 
						|
    local lastCombatControls = g_settings.getNode('LastCombatControls')
 | 
						|
 | 
						|
    if not table.empty(lastCombatControls) then
 | 
						|
      if lastCombatControls[char] then
 | 
						|
        g_game.setFightMode(lastCombatControls[char].fightMode)
 | 
						|
        g_game.setChaseMode(lastCombatControls[char].chaseMode)
 | 
						|
        g_game.setSafeFight(lastCombatControls[char].safeFight)
 | 
						|
        if lastCombatControls[char].pvpMode then
 | 
						|
          g_game.setPVPMode(lastCombatControls[char].pvpMode)
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    if g_game.getFeature(GamePlayerMounts) then
 | 
						|
      mountButton:setVisible(true)
 | 
						|
      mountButton:setChecked(player:isMounted())
 | 
						|
    else
 | 
						|
      mountButton:setVisible(false)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  update()
 | 
						|
end
 | 
						|
 | 
						|
function offline()
 | 
						|
  local lastCombatControls = g_settings.getNode('LastCombatControls')
 | 
						|
  if not lastCombatControls then
 | 
						|
    lastCombatControls = {}
 | 
						|
  end
 | 
						|
 | 
						|
  conditionPanel:destroyChildren()
 | 
						|
 | 
						|
  local player = g_game.getLocalPlayer()
 | 
						|
  if player then
 | 
						|
    local char = g_game.getCharacterName()
 | 
						|
    lastCombatControls[char] = {
 | 
						|
      fightMode = g_game.getFightMode(),
 | 
						|
      chaseMode = g_game.getChaseMode(),
 | 
						|
      safeFight = g_game.isSafeFight()
 | 
						|
    }
 | 
						|
 | 
						|
    if g_game.getFeature(GamePVPMode) then
 | 
						|
      lastCombatControls[char].pvpMode = g_game.getPVPMode()
 | 
						|
    end
 | 
						|
 | 
						|
    -- save last combat control settings
 | 
						|
    g_settings.setNode('LastCombatControls', lastCombatControls)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function onSetFightMode(self, selectedFightButton)
 | 
						|
  if selectedFightButton == nil then return end
 | 
						|
  local buttonId = selectedFightButton:getId()
 | 
						|
  local fightMode
 | 
						|
  if buttonId == 'fightOffensiveBox' then
 | 
						|
    fightMode = FightOffensive
 | 
						|
  elseif buttonId == 'fightBalancedBox' then
 | 
						|
    fightMode = FightBalanced
 | 
						|
  else
 | 
						|
    fightMode = FightDefensive
 | 
						|
  end
 | 
						|
  g_game.setFightMode(fightMode)
 | 
						|
end
 | 
						|
 | 
						|
function onSetChaseMode(self, checked)
 | 
						|
  local chaseMode
 | 
						|
  if checked then
 | 
						|
    chaseMode = ChaseOpponent
 | 
						|
  else
 | 
						|
    chaseMode = DontChase
 | 
						|
  end
 | 
						|
  g_game.setChaseMode(chaseMode)
 | 
						|
end
 | 
						|
 | 
						|
function onSetSafeFight(self, checked)
 | 
						|
  g_game.setSafeFight(not checked)
 | 
						|
  if buttonPvp then
 | 
						|
    if not checked then
 | 
						|
      buttonPvp:setOn(false)
 | 
						|
    else
 | 
						|
      buttonPvp:setOn(true)  
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function onSetSafeFight2(self)
 | 
						|
  onSetSafeFight(self, not safeFightButton:isChecked())
 | 
						|
end
 | 
						|
 | 
						|
function onSetPVPMode(self, selectedPVPButton)
 | 
						|
  if selectedPVPButton == nil then
 | 
						|
    return
 | 
						|
  end
 | 
						|
 | 
						|
  local buttonId = selectedPVPButton:getId()
 | 
						|
  local pvpMode = PVPWhiteDove
 | 
						|
  if buttonId == 'whiteDoveBox' then
 | 
						|
    pvpMode = PVPWhiteDove
 | 
						|
  elseif buttonId == 'whiteHandBox' then
 | 
						|
    pvpMode = PVPWhiteHand
 | 
						|
  elseif buttonId == 'yellowHandBox' then
 | 
						|
    pvpMode = PVPYellowHand
 | 
						|
  elseif buttonId == 'redFistBox' then
 | 
						|
    pvpMode = PVPRedFist
 | 
						|
  end
 | 
						|
 | 
						|
  g_game.setPVPMode(pvpMode)
 | 
						|
end
 | 
						|
 | 
						|
function onMountButtonClick(self, mousePos)
 | 
						|
  local player = g_game.getLocalPlayer()
 | 
						|
  if player then
 | 
						|
    player:toggleMount()
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function onOutfitChange(localPlayer, outfit, oldOutfit)
 | 
						|
  if outfit.mount == oldOutfit.mount then
 | 
						|
    return
 | 
						|
  end
 | 
						|
 | 
						|
  mountButton:setChecked(outfit.mount ~= nil and outfit.mount > 0)
 | 
						|
end
 | 
						|
 | 
						|
function getPVPBoxByMode(mode)
 | 
						|
  local widget = nil
 | 
						|
  if mode == PVPWhiteDove then
 | 
						|
    widget = whiteDoveBox
 | 
						|
  elseif mode == PVPWhiteHand then
 | 
						|
    widget = whiteHandBox
 | 
						|
  elseif mode == PVPYellowHand then
 | 
						|
    widget = yellowHandBox
 | 
						|
  elseif mode == PVPRedFist then
 | 
						|
    widget = redFistBox
 | 
						|
  end
 | 
						|
  return widget
 | 
						|
end
 | 
						|
 | 
						|
-- status
 | 
						|
function toggleIcon(bitChanged)
 | 
						|
  local icon = conditionPanel:getChildById(Icons[bitChanged].id)
 | 
						|
  if icon then
 | 
						|
    icon:destroy()
 | 
						|
  else
 | 
						|
    icon = loadIcon(bitChanged)
 | 
						|
    icon:setParent(conditionPanel)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function loadIcon(bitChanged)
 | 
						|
  local icon = g_ui.createWidget('ConditionWidget', conditionPanel)
 | 
						|
  icon:setId(Icons[bitChanged].id)
 | 
						|
  icon:setImageSource(Icons[bitChanged].path)
 | 
						|
  icon:setTooltip(Icons[bitChanged].tooltip)
 | 
						|
  return icon
 | 
						|
end
 | 
						|
 | 
						|
function onSoulChange(localPlayer, soul)
 | 
						|
  if not soul then return end
 | 
						|
  soulLabel:setText(tr('Soul') .. ':\n' .. soul)
 | 
						|
end
 | 
						|
 | 
						|
function onFreeCapacityChange(player, freeCapacity)
 | 
						|
  if not freeCapacity then return end
 | 
						|
  if freeCapacity > 99 then
 | 
						|
    freeCapacity = math.floor(freeCapacity * 10) / 10
 | 
						|
  end
 | 
						|
  if freeCapacity > 999 then
 | 
						|
    freeCapacity = math.floor(freeCapacity)
 | 
						|
  end
 | 
						|
  if freeCapacity > 99999 then
 | 
						|
    freeCapacity = math.min(9999, math.floor(freeCapacity/1000)) .. "k"
 | 
						|
  end
 | 
						|
  capLabel:setText(tr('Cap') .. ':\n' .. freeCapacity)
 | 
						|
end
 | 
						|
 | 
						|
function onStatesChange(localPlayer, now, old)
 | 
						|
  if now == old then return end
 | 
						|
  local bitsChanged = bit32.bxor(now, old)
 | 
						|
  for i = 1, 32 do
 | 
						|
    local pow = math.pow(2, i-1)
 | 
						|
    if pow > bitsChanged then break end
 | 
						|
    local bitChanged = bit32.band(bitsChanged, pow)
 | 
						|
    if bitChanged ~= 0 then
 | 
						|
      toggleIcon(bitChanged)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end |