mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-10 11:03:51 +00:00
Novel open replacement for AzerothCore-style
mail_loot_template SQL + the in-game mail subset of the
inventory + currency systems. The 34th open format added
to the editor.
Defines templated mail messages with currency + item
attachments. Triggered by quest reward delivery (overflow
when bag is full), auction house bid wins / sales,
achievement reward attachments, GM correspondence, holiday
event mailings (Brewfest samples, Hallow's End candy), and
returned-mail-on-rejection.
Cross-references with previously-added formats:
WMAL.entry.senderNpcId -> WCRT.entry.creatureId
WMAL.entry.attachments.itemId -> WIT.entry.itemId
Format:
• magic "WMAL", version 1, little-endian
• per template: templateId / senderNpcId / subject / body /
senderName / moneyCopperAttached / categoryId / cod /
returnable / expiryDays / attachments[] (each: itemId +
quantity)
Enums:
• Category (8): QuestReward / Auction / GmCorrespondence /
AchievementReward / EventMailing / Raffle /
ScriptDelivery / ReturnedMail
API: WoweeMailLoader::save / load / exists / findById.
Three preset emitters showcase typical mail templates:
• makeStarter — 3 templates (quest overflow / auction won /
GM gift) covering the 3 most common
categories
• makeHoliday — 4 holiday samples that cross-reference the
WTKN seasonal token IDs (200=Tricky Treats,
201=Brewfest, 202=Coin of Ancestry,
203=Stranger's Gift) so the demo content
stack ships a full holiday onboarding
experience
• makeAuction — 5-template auction-house family (outbid /
won / sold / expired / cancelled) — runtime
fills in actual bid amounts / sold items
at send time
CLI added (5 flags, 635 documented total now):
--gen-mail / --gen-mail-holiday / --gen-mail-auction
--info-wmal / --validate-wmal
Validator catches: templateId=0 + duplicates, empty subject,
neither senderNpcId nor senderName set (no displayable
sender), unknown category, expiryDays=0 (mail expires
immediately), cod=1 with no money attached (free COD),
empty mail in categories where the runtime doesn't fill in
content (skips Auction / GmCorrespondence / ReturnedMail
where empty templates are intentional).
Two bugs caught + fixed during smoke-test on the auction
preset:
• print formatting glued the `0` from senderNpcId after
the senderName when no NPC was set (rendered as
"Postmaster0" instead of "Postmaster") — fixed with an
explicit if/else split
• validator's "no money + no items" warning was too
aggressive for the Auction category, where templates
are intentionally informational and the runtime fills
in the real values — added Auction + ReturnedMail to
the skip list
206 lines
5.3 KiB
C++
206 lines
5.3 KiB
C++
#include "cli_dispatch.hpp"
|
|
|
|
#include "cli_gen_audio.hpp"
|
|
#include "cli_zone_packs.hpp"
|
|
#include "cli_audits.hpp"
|
|
#include "cli_readmes.hpp"
|
|
#include "cli_zone_inventory.hpp"
|
|
#include "cli_project_inventory.hpp"
|
|
#include "cli_gen_texture.hpp"
|
|
#include "cli_gen_mesh.hpp"
|
|
#include "cli_mesh_io.hpp"
|
|
#include "cli_mesh_edit.hpp"
|
|
#include "cli_wom_info.hpp"
|
|
#include "cli_format_validate.hpp"
|
|
#include "cli_convert.hpp"
|
|
#include "cli_format_info.hpp"
|
|
#include "cli_pack.hpp"
|
|
#include "cli_content_info.hpp"
|
|
#include "cli_zone_info.hpp"
|
|
#include "cli_data_tree.hpp"
|
|
#include "cli_diff.hpp"
|
|
#include "cli_spawn_audit.hpp"
|
|
#include "cli_items.hpp"
|
|
#include "cli_extract_info.hpp"
|
|
#include "cli_export.hpp"
|
|
#include "cli_bake.hpp"
|
|
#include "cli_migrate.hpp"
|
|
#include "cli_validate_interop.hpp"
|
|
#include "cli_glb_inspect.hpp"
|
|
#include "cli_wom_io.hpp"
|
|
#include "cli_world_io.hpp"
|
|
#include "cli_info_tree.hpp"
|
|
#include "cli_info_bytes.hpp"
|
|
#include "cli_info_extents.hpp"
|
|
#include "cli_info_water.hpp"
|
|
#include "cli_info_density.hpp"
|
|
#include "cli_info_audio.hpp"
|
|
#include "cli_world_info.hpp"
|
|
#include "cli_world_map.hpp"
|
|
#include "cli_sound_catalog.hpp"
|
|
#include "cli_spawns_catalog.hpp"
|
|
#include "cli_items_catalog.hpp"
|
|
#include "cli_loot_catalog.hpp"
|
|
#include "cli_creatures_catalog.hpp"
|
|
#include "cli_quests_catalog.hpp"
|
|
#include "cli_objects_catalog.hpp"
|
|
#include "cli_factions_catalog.hpp"
|
|
#include "cli_locks_catalog.hpp"
|
|
#include "cli_skills_catalog.hpp"
|
|
#include "cli_spells_catalog.hpp"
|
|
#include "cli_achievements_catalog.hpp"
|
|
#include "cli_trainers_catalog.hpp"
|
|
#include "cli_gossip_catalog.hpp"
|
|
#include "cli_taxi_catalog.hpp"
|
|
#include "cli_talents_catalog.hpp"
|
|
#include "cli_maps_catalog.hpp"
|
|
#include "cli_chars_catalog.hpp"
|
|
#include "cli_tokens_catalog.hpp"
|
|
#include "cli_triggers_catalog.hpp"
|
|
#include "cli_titles_catalog.hpp"
|
|
#include "cli_events_catalog.hpp"
|
|
#include "cli_mounts_catalog.hpp"
|
|
#include "cli_battlegrounds_catalog.hpp"
|
|
#include "cli_mail_catalog.hpp"
|
|
#include "cli_quest_objective.hpp"
|
|
#include "cli_quest_reward.hpp"
|
|
#include "cli_clone.hpp"
|
|
#include "cli_remove.hpp"
|
|
#include "cli_add.hpp"
|
|
#include "cli_random.hpp"
|
|
#include "cli_items_export.hpp"
|
|
#include "cli_items_mutate.hpp"
|
|
#include "cli_zone_create.hpp"
|
|
#include "cli_tiles.hpp"
|
|
#include "cli_zone_mgmt.hpp"
|
|
#include "cli_strip.hpp"
|
|
#include "cli_repair.hpp"
|
|
#include "cli_makefile.hpp"
|
|
#include "cli_zone_list.hpp"
|
|
#include "cli_tilemap.hpp"
|
|
#include "cli_deps.hpp"
|
|
#include "cli_for_each.hpp"
|
|
#include "cli_check.hpp"
|
|
#include "cli_introspect.hpp"
|
|
#include "cli_texture_helpers.hpp"
|
|
#include "cli_mesh_info.hpp"
|
|
#include "cli_zone_data.hpp"
|
|
#include "cli_project_actions.hpp"
|
|
#include "cli_zone_export.hpp"
|
|
|
|
namespace wowee {
|
|
namespace editor {
|
|
namespace cli {
|
|
|
|
namespace {
|
|
|
|
// Each handler family takes (int& i, int argc, char** argv,
|
|
// int& outRc) and returns true if it claimed the flag. The
|
|
// table is walked in order until one returns true. Order
|
|
// rarely matters — flags are exact-string-matched, so two
|
|
// families can't both claim the same flag — but families with
|
|
// shorter/cheaper checks still come first by convention.
|
|
using DispatchFn = bool (*)(int&, int, char**, int&);
|
|
|
|
constexpr DispatchFn kDispatchTable[] = {
|
|
handleGenAudio,
|
|
handleZonePacks,
|
|
handleAudits,
|
|
handleReadmes,
|
|
handleZoneInventory,
|
|
handleProjectInventory,
|
|
handleGenTexture,
|
|
handleGenMesh,
|
|
handleMeshIO,
|
|
handleMeshEdit,
|
|
handleWomInfo,
|
|
handleFormatValidate,
|
|
handleConvert,
|
|
handleFormatInfo,
|
|
handlePack,
|
|
handleContentInfo,
|
|
handleZoneInfo,
|
|
handleDataTree,
|
|
handleDiff,
|
|
handleSpawnAudit,
|
|
handleItems,
|
|
handleExtractInfo,
|
|
handleExport,
|
|
handleBake,
|
|
handleMigrate,
|
|
handleValidateInterop,
|
|
handleGlbInspect,
|
|
handleWomIo,
|
|
handleWorldIo,
|
|
handleInfoTree,
|
|
handleInfoBytes,
|
|
handleInfoExtents,
|
|
handleInfoWater,
|
|
handleInfoDensity,
|
|
handleInfoAudio,
|
|
handleWorldInfo,
|
|
handleWorldMap,
|
|
handleSoundCatalog,
|
|
handleSpawnsCatalog,
|
|
handleItemsCatalog,
|
|
handleLootCatalog,
|
|
handleCreaturesCatalog,
|
|
handleQuestsCatalog,
|
|
handleObjectsCatalog,
|
|
handleFactionsCatalog,
|
|
handleLocksCatalog,
|
|
handleSkillsCatalog,
|
|
handleSpellsCatalog,
|
|
handleAchievementsCatalog,
|
|
handleTrainersCatalog,
|
|
handleGossipCatalog,
|
|
handleTaxiCatalog,
|
|
handleTalentsCatalog,
|
|
handleMapsCatalog,
|
|
handleCharsCatalog,
|
|
handleTokensCatalog,
|
|
handleTriggersCatalog,
|
|
handleTitlesCatalog,
|
|
handleEventsCatalog,
|
|
handleMountsCatalog,
|
|
handleBattlegroundsCatalog,
|
|
handleMailCatalog,
|
|
handleQuestObjective,
|
|
handleQuestReward,
|
|
handleClone,
|
|
handleRemove,
|
|
handleAdd,
|
|
handleRandom,
|
|
handleItemsExport,
|
|
handleItemsMutate,
|
|
handleZoneCreate,
|
|
handleTiles,
|
|
handleZoneMgmt,
|
|
handleStrip,
|
|
handleRepair,
|
|
handleMakefile,
|
|
handleZoneList,
|
|
handleTilemap,
|
|
handleDeps,
|
|
handleForEach,
|
|
handleCheck,
|
|
handleIntrospect,
|
|
handleTextureHelpers,
|
|
handleMeshInfo,
|
|
handleZoneData,
|
|
handleProjectActions,
|
|
handleZoneExport,
|
|
};
|
|
|
|
} // namespace
|
|
|
|
bool tryDispatchAll(int& i, int argc, char** argv, int& outRc) {
|
|
for (DispatchFn fn : kDispatchTable) {
|
|
if (fn(i, argc, argv, outRc)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
} // namespace cli
|
|
} // namespace editor
|
|
} // namespace wowee
|