Skip to main content

Hunting Tasks: Bounty, Weekly and Shop

These Hunting Tasks methods require protocol 15.20 or newer and a server that supports the feature. The public Lua names retain TaskBoard for compatibility. They are separate from the older Game.huntingTask* methods and their TASK_HUNTING_DATA event.

Game.taskBoardAction(action, firstValue, secondValue)
Game.openTaskBoardBounty()
Game.openTaskBoardWeekly()
Game.setTaskBoardBountyDifficulty(difficulty)
Game.rerollTaskBoardBounties()
Game.claimTaskBoardDailyReroll()
Game.selectTaskBoardBounty(taskIndex)
Game.claimTaskBoardBountyReward()
Game.upgradeTaskBoardTalisman(pathIndex)
Game.deliverTaskBoardWeekly(taskIndex)
Game.setTaskBoardWeeklyDifficulty(difficulty)
Game.openTaskBoardShop()
Game.buyTaskBoardOffer(offerIndex)
Game.unlockTaskBoardPreferenceSlot()
Game.clearTaskBoardPreferred(slot)
Game.clearTaskBoardUnwanted(slot)
Game.assignTaskBoardPreferred(slot, raceId)
Game.assignTaskBoardUnwanted(slot, raceId)

Return values and server data​

Each method returns true when the request is accepted by ZeroBot's packet sender, or nil when the protocol is unsupported, a required snapshot is missing, a state/resource check fails, or the sender rejects the request. true is not confirmation that the server completed the action or granted a reward. Invalid argument counts, types, or numeric protocol ranges raise a Lua error rather than returning nil.

Before a stateful action, open its corresponding window and wait for Game.Events.TASK_BOARD_DATA. ZeroBot caches the latest complete server snapshot separately for Bounty, Weekly and Shop, and clears those snapshots on disconnect. Register the callback before opening the window; wait for updated data after an action instead of repeatedly sending requests against an old snapshot.

local function onHuntingTasksData(data)
if not data.complete then
return
end

if data.windowType == Enums.TaskBoardWindow.BOUNTY then
for _, task in ipairs(data.bounty.tasks) do
-- task.index is the zero-based server index, not the Lua array position.
print("bounty", task.index, task.raceId, task.currentKills)
end
elseif data.windowType == Enums.TaskBoardWindow.WEEKLY then
for _, task in ipairs(data.weekly.deliveryTasks) do
print("delivery", task.index, task.itemId, task.availableItems)
end
elseif data.windowType == Enums.TaskBoardWindow.SHOP then
print("offer count", data.shop.offerCount)
end
end

Game.registerEvent(Game.Events.TASK_BOARD_DATA, onHuntingTasksData)
local requested = Game.openTaskBoardBounty()
if not requested then
print("Hunting Tasks request was not accepted")
end

-- When the listener is no longer needed:
-- Game.unregisterEvent(Game.Events.TASK_BOARD_DATA, onHuntingTasksData)

Action reference​

All indexes and difficulty values below are integers. Use explicit task.index fields for Bounty selection and Weekly delivery. talismanLines and preferenceSlots are Lua arrays starting at 1; subtract 1 from an array position when passing a path or preference-slot index.

MethodRequired server data and validation
Game.openTaskBoardBounty()Requests the Bounty window; no cached snapshot required.
Game.openTaskBoardWeekly()Requests the Weekly window; no cached snapshot required.
Game.openTaskBoardShop()Requests the Shop window; no cached snapshot required.
Game.setTaskBoardBountyDifficulty(difficulty)Complete Bounty snapshot; difficulty 0 through 3.
Game.rerollTaskBoardBounties()Bounty state SELECTION; rerollTasks is nonzero or rerollMode is DAILY_CLAIMABLE.
Game.claimTaskBoardDailyReroll()Bounty rerollMode is DAILY_CLAIMABLE.
Game.selectTaskBoardBounty(taskIndex)Bounty state SELECTION; listed task with matching index and claimRewardType equal to SELECT_TASK.
Game.claimTaskBoardBountyReward()Bounty state COMPLETED; exactly one task with claimRewardType equal to REWARD_CLICKED.
Game.upgradeTaskBoardTalisman(pathIndex)Path 0 through 3 exists; upgradeAvailable is true and the cached Bounty Points balance covers upgradeCost.
Game.deliverTaskBoardWeekly(taskIndex)Listed Weekly delivery task with matching index; delivered is 0 and availableItems covers requiredItems.
Game.setTaskBoardWeeklyDifficulty(difficulty)Weekly weeklyProgressFinished is nonzero; difficulty 0 through 3, not above unlockedDifficulty.
Game.buyTaskBoardOffer(offerIndex)Complete Shop snapshot; zero-based index below offerCount and at most 255. Offer details and purchase success are not exposed by this API.
Game.unlockTaskBoardPreferenceSlot()Complete Bounty snapshot; at least one inactive preference slot and sufficient cached Bounty Points. No argument: the server chooses the first inactive slot. The local cost check is min(zeroBasedSlotIndex * 300, 1200).
Game.clearTaskBoardPreferred(slot)Existing active preference slot with nonzero preferredRaceId; at least 10 cached Bounty Points.
Game.clearTaskBoardUnwanted(slot)Existing active preference slot with nonzero unwantedRaceId; at least 10 cached Bounty Points.
Game.assignTaskBoardPreferred(slot, raceId)Existing active preference slot; integer raceId from 1 through 65535. Server eligibility checks still apply.
Game.assignTaskBoardUnwanted(slot, raceId)Existing active preference slot; integer raceId from 1 through 65535. Server eligibility checks still apply.

Generic action method​

Game.taskBoardAction(action, firstValue, secondValue) dispatches the same native actions as the named methods. Omit values not required by the action. The native API validates the resulting argument count.

Enums.TaskBoardAction memberValueAdditional arguments
BOUNTY0none
WEEKLY1none
BOUNTY_DIFFICULTY2difficulty
BOUNTY_REROLL3none
CLAIM_DAILY_REROLL4none
BOUNTY_SELECT5taskIndex
BOUNTY_CLAIM_REWARD6none
TALISMAN_UPGRADE7pathIndex
WEEKLY_DELIVERY8taskIndex
WEEKLY_DIFFICULTY9difficulty
SHOP10none
SHOP_BUY11offerIndex
UNLOCK_PREFERENCE_SLOT120 (reserved value, not a slot selector)
CLEAR_PREFERRED13slot
CLEAR_UNWANTED14slot
ASSIGN_PREFERRED15slot, raceId
ASSIGN_UNWANTED16slot, raceId

The action must be an integer from 0 through 16. First values are integers from 0 through 255; assignment race IDs are integers from 0 through 65535, with 0 rejected by the stateful validation. Prefer named methods, especially for unlocking a preference slot:

-- Equivalent requests; both require a complete Bounty snapshot.
Game.unlockTaskBoardPreferenceSlot()
-- Alternative, not a second request to send immediately:
-- Game.taskBoardAction(Enums.TaskBoardAction.UNLOCK_PREFERENCE_SLOT, 0)

Event payload​

Game.Events.TASK_BOARD_DATA has value 22. The callback receives one table with windowType, boolean complete, and the window-specific bounty, weekly, or shop table. Do not treat an incomplete payload as actionable data.

EnumMembers and values
Enums.TaskBoardWindowBOUNTY = 0, WEEKLY = 1, SHOP = 2
Enums.TaskBoardBountyStateNONE = 0, SELECTION = 1, ACTIVE = 2, COMPLETED = 3
Enums.TaskBoardBountyClaimRewardTypeSELECT_TASK = 0, REWARD_NO_CLICK = 1, REWARD_CLICKED = 2
Enums.TaskBoardBountyRerollModeDAILY_CLAIMABLE = 0, TIMER_RUNNING = 1, LIMIT_REACHED = 2

Bounty​

FieldContents
stateA value from Enums.TaskBoardBountyState.
tasksArray of {index, raceId, requiredKills, rewardExperience, rewardBountyPoints, currentKills, claimRewardType, taskGrade}.
rerollTasksServer-reported reroll count.
dailyRerollsCompatibility alias for rerollTasks, not a separate balance.
rerollModeA value from Enums.TaskBoardBountyRerollMode.
selectedDifficultyCurrent Bounty difficulty.
talismanLinesFour entries with numeric multiplier1, multiplier2, boolean upgradeAvailable, and numeric upgradeCost.
preferenceSlotsEntries with boolean active, numeric preferredRaceId, and numeric unwantedRaceId.

Weekly​

FieldsContents
anyCreatureRequiredAmount, anyCreatureCurrentAmountOverall creature-kill requirement and progress.
killTasksArray of {raceId, requiredKills, currentKills}.
deliveryTasksArray of {index, itemId, unknown1, unknown2, requiredItems, availableItems, delivered}. The meanings of unknown1 and unknown2 are not confirmed.
difficultyMultiplier, unlockedDifficultyServer-reported difficulty multiplier and unlocked difficulty.
weeklyProgressFinishedNumeric completion indicator. Test against 0; Lua treats numeric 0 as truthy.
completedKillTasks, completedDeliveryTasksServer-reported completed-task counts.
killExperienceReward, itemDeliveryExperienceRewardExperience rewards.
nextResetTimestampNumeric reset value from the server; its time unit is not confirmed here.
thirdWeeklySlotUnlockedBoolean third-slot indicator.
huntingPointsReward, soulSealsRewardWeekly rewards.

Shop​

shop.offerCount is the only exposed Shop field. Individual offer names, items, prices, availability, and purchase-result data are not exposed by the current parser. Do not infer them from an offer index.

Validation scope​

This reference is based on the distributed Lua core and native implementation, including the later state/resource and no-argument unlock fixes. The server remains authoritative. Documentation and static API checks do not replace testing these actions in a supported, connected client.