Houmgaor
77e7969579
feat(campaign): implement Event Tent campaign system
Adds the full campaign/event-tent feature:
Packet layer:
- MsgMhfApplyCampaign: Unk0/Unk1/Unk2 → CampaignID/Code (null-terminated 16-byte string)
- MsgMhfAcquireItem: Unk0/Length/Unk1 → RewardIDs []uint32
- MsgMhfEnumerateItem: remove Unk0/Unk1 (RE'd: zeroed + always-2, ignored)
- MsgMhfStateCampaign: Unk1 → NullPadding (RE'd: always zero)
- MsgMhfTransferItem: Unk0/Unk1/Unk2 → QuestID/ItemType/Quantity (RE'd)
Handler layer (handlers_campaign.go):
- handleMsgMhfEnumerateCampaign: reads campaigns, categories, links from DB;
prefix moved into pascal string slot 3 of each event entry (RE confirmed
3-section response format — removes spurious intermediate section)
- handleMsgMhfStateCampaign: returns stamp count and redeemable flag
- handleMsgMhfApplyCampaign: validates and records code redemption
- handleMsgMhfEnumerateItem: lists rewards gated by stamp count
- handleMsgMhfAcquireItem: marks rewards as claimed
- handleMsgMhfTransferItem: records campaign quest completion (item_type=9)
Quest gating (handlers_quest.go):
- makeEventQuest: for QuestTypeSpecialTool, check campaign stamp count and
deadline before allowing the quest (WriteBool true/false)
Database:
- 0010_campaign.sql: 8-table schema (campaigns, categories, links, rewards,
claimed, state, codes, quest)
- CampaignDemo.sql: community-researched live game campaign data
2026-03-20 11:22:25 +01:00
..
2026-03-17 19:03:43 +01:00
2026-03-17 19:21:55 +01:00
2026-03-19 10:57:09 +01:00
2026-03-20 11:22:25 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 19:28:30 +01:00
2026-03-19 19:28:30 +01:00
2026-03-19 10:57:09 +01:00
2026-03-17 19:21:55 +01:00
2026-03-19 10:57:09 +01:00
2026-03-18 12:09:44 +01:00
2026-03-18 12:09:44 +01:00
2026-03-19 10:57:09 +01:00
2026-03-18 23:19:25 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 14:35:38 +01:00
2026-03-20 11:22:25 +01:00
2026-03-19 14:35:38 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-17 19:03:43 +01:00
2026-03-20 11:22:25 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 14:35:38 +01:00
2026-03-19 10:57:09 +01:00
2026-03-17 19:11:59 +01:00
2026-03-19 14:35:38 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-19 10:57:09 +01:00
2026-03-17 19:03:43 +01:00
2026-03-19 18:20:00 +01:00
2026-03-19 18:20:00 +01:00
2026-03-19 18:20:00 +01:00
2026-03-19 23:59:34 +01:00
2026-03-19 23:59:34 +01:00
2026-03-20 00:07:34 +01:00
2026-03-20 00:07:34 +01:00
2026-03-18 12:14:31 +01:00
2026-03-18 10:48:52 +01:00
2026-03-19 19:28:30 +01:00
2026-03-18 12:09:44 +01:00
2026-03-16 00:07:46 +01:00
2026-03-19 19:28:30 +01:00
2026-03-19 19:28:30 +01:00
2026-03-18 11:35:31 +01:00
2026-03-18 11:35:31 +01:00
2026-03-19 23:59:34 +01:00
2026-03-20 00:07:34 +01:00