From 69b5a1c4a1f1c099d8d1ea0352d75fb3953a1224 Mon Sep 17 00:00:00 2001 From: nico Date: Sat, 31 Oct 2026 13:36:33 +0100 Subject: [PATCH] Extend clientless bots with browser queues, PvP intents and test automation --- doc/clientless/SESSION-RESUME.md | 537 + doc/clientless/browser-and-pvp.md | 139 + doc/clientless/build-recovery-2026-10-30.md | 42 + doc/clientless/capital-portal-audit.md | 92 + .../2026-10-30-testbots/results.json | 670 + .../browser-build-2026-10-31.log | 1080 + .../browser-build-incremental-2026-10-31.log | 4 + .../browser-config-before.json | 9 + .../browser-config-prepared.json | 9 + .../focused-tests-resumed.json | 79 + .../2026-10-31-browser/lifecycle.json | 111 + .../2026-10-31-browser/loader-resumed.log | 1224 + .../2026-10-31-browser/pending-runtime.log | 165 + .../post-recovery-loader.log | 184 + .../post-start-recovery.log | 284 + .../regression/final-summary.json | 754 + .../regression/rerun-results.json | 68 + .../regression/summary.json | 764 + .../regression/test_adventure_area_node.log | 18 + .../regression/test_adventure_area_policy.log | 1 + .../test_adventure_area_segment.log | 1 + .../test_adventure_async_database.log | 1 + .../test_adventure_behavior_policy.log | 1 + .../test_adventure_class_rotation.log | 1 + .../test_adventure_combat_exercise.log | 1 + .../test_adventure_combat_preparation.log | 1 + .../test_adventure_combat_reactions.log | 1 + .../test_adventure_day_persistence.log | 69 + .../test_adventure_destination_level.log | 12 + .../regression/test_adventure_economy.log | 1 + .../test_adventure_economy_catalog.log | 1 + .../regression/test_adventure_encounter.log | 1 + .../test_adventure_equipment_maintenance.log | 1 + .../regression/test_adventure_exploration.log | 1 + .../test_adventure_exploration_catalog.log | 1 + .../test_adventure_generator_equipment.log | 1 + .../test_adventure_generator_ownership.log | 1 + .../test_adventure_generator_policy.log | 1 + .../test_adventure_graph_handover.log | 1 + .../test_adventure_ground_avoidance.log | 1 + .../test_adventure_group_departure.log | 1 + .../test_adventure_group_gather.log | 1 + .../regression/test_adventure_group_plan.log | 1 + .../test_adventure_group_travel.log | 1 + .../regression/test_adventure_groups.log | 1 + .../regression/test_adventure_instance.log | 1 + .../test_adventure_instance_autoresume.log | 1 + .../test_adventure_instance_begin.log | 1 + .../test_adventure_instance_catalog.log | 1 + .../test_adventure_instance_loader.log | 1 + .../test_adventure_instance_persistence.log | 12 + .../test_adventure_instance_variants.log | 1 + .../test_adventure_intent_state.log | 1 + .../test_adventure_interactions.log | 22 + .../regression/test_adventure_leisure.log | 22 + .../test_adventure_leisure_catalog.log | 1 + .../test_adventure_location_import.log | 1 + .../test_adventure_manager_inventory.log | 1 + .../regression/test_adventure_micro_reset.log | 1 + .../regression/test_adventure_native_lfg.log | 1 + .../test_adventure_navigation_rescue.log | 1 + .../test_adventure_northrend_flight.log | 1 + .../regression/test_adventure_poi_binding.log | 1 + .../regression/test_adventure_population.log | 1 + .../test_adventure_profession_catalog.log | 1 + .../test_adventure_profession_profile.log | 1 + .../test_adventure_profession_sightline.log | 1 + .../test_adventure_profession_targets.log | 1 + .../test_adventure_profile_selection.log | 1 + .../regression/test_adventure_pvp.log | 1 + .../test_adventure_recovery_policy.log | 1 + .../test_adventure_repair_catalog.log | 1 + .../regression/test_adventure_rest.log | 1 + .../regression/test_adventure_rest_fire.log | 1 + .../regression/test_adventure_rest_space.log | 1 + .../test_adventure_rest_targets.log | 1 + .../test_adventure_retry_policy.log | 1 + .../regression/test_adventure_rotation.log | 11 + .../regression/test_adventure_social.log | 1 + .../regression/test_adventure_social_fire.log | 1 + .../regression/test_adventure_supplies.log | 1 + .../test_adventure_supply_catalog.log | 1 + .../test_adventure_supply_items.log | 1 + .../test_adventure_talent_templates.log | 1 + .../test_adventure_training_catalog.log | 1 + .../regression/test_adventure_walk.log | 1 + .../test_adventure_world_presence.log | 1 + .../regression/test_browser_admission.log | 1 + .../regression/test_browser_bg_brackets.log | 1 + .../regression/test_browser_match_order.log | 1 + .../regression/test_browser_participants.log | 1 + .../regression/test_capital_portal_seed.log | 1 + .../regression/test_cheat_explore.log | 1 + .../regression/test_city_catalog_parents.log | 1 + .../test_clientless_character_factory.log | 1 + .../regression/test_clientless_companion.log | 1 + .../test_clientless_damage_notifications.log | 1 + ...test_clientless_near_teleport_observer.log | 1 + .../test_clientless_skill_preparation.log | 1 + .../test_clientless_social_notifications.log | 1 + .../regression/test_default_phase.log | 1 + .../regression/test_empty_spell_effect.log | 1 + .../regression/test_flight_area_query.log | 1 + .../regression/test_flight_departure.log | 1 + .../regression/test_flight_handoff.log | 1 + .../regression/test_flight_landing_search.log | 1 + .../regression/test_flight_policy.log | 1 + .../test_flight_terrain_fallback.log | 1 + .../test_follow_spline_velocity.log | 1 + .../regression/test_free_flight.log | 1 + .../regression/test_free_flight_planner.log | 1 + .../regression/test_graph_probe_cache.log | 1 + .../test_ground_exit_continuation.log | 1 + .../regression/test_group_flight_follow.log | 1 + .../regression/test_group_flight_mount.log | 1 + .../test_group_role_composition.log | 1 + .../test_guildless_group_restore.log | 1 + .../regression/test_item_equip_cooldown.log | 1 + .../regression/test_local_spline_segments.log | 1 + .../regression/test_lua_reload.log | 1 + .../regression/test_native_skill_slot.log | 2 + .../regression/test_player_pure_max_skill.log | 1 + .../regression/test_portal_conditions.log | 2 + .../regression/test_portal_transfer.log | 1 + .../regression/test_portal_use.log | 3 + .../regression/test_rescue_executor.log | 1 + .../regression/test_rescue_graph.log | 2 + .../test_route_portal_prerequisites.log | 1 + .../regression/test_safe_logout.log | 1 + .../regression/test_shared_group_route.log | 1 + .../regression/test_taxi_import_disabled.log | 1 + .../regression/test_testbot_client.log | 1 + .../regression/test_transport.log | 1 + .../test_transport_deck_control.log | 1 + .../regression/test_transport_deck_mesh.log | 3 + .../regression/test_transport_deck_return.log | 1 + .../test_transport_grid_loading.log | 1 + .../regression/test_travel_telemetry.log | 1 + .../remaining-last-saved.tsv | 14 + .../restart-recovery-needed.json | 179 + .../resumed-build-state.json | 9 + .../2026-10-31-browser/runtime-summary.log | 6 + .../safe-logout-request.json | 24 + .../startup-and-initial-runtime.log | 15 + .../2026-10-31-browser/validation-status.json | 19 + .../2026-10-31-elunes-blessing/after.json | 17 + .../2026-10-31-elunes-blessing/before.json | 7 + .../runtime-verification.log | 6 + .../2026-10-31-group-test/applied.json | 1130 + .../2026-10-31-group-test/before.json | 19146 ++++++++++++++++ .../2026-10-31-group-test/plan-counts.json | 82 + .../2026-10-31-group-test/startup-check.log | 114 + .../hillsbrad/azurelode-fixtures.json | 1316 ++ .../hillsbrad/console-outcomes.log | 15 + .../checkpoints/hillsbrad/diagnostic-db.json | 8 + .../hillsbrad/final-character-quests.tsv | 12 + .../checkpoints/hillsbrad/item-spells.json | 477 + .../checkpoints/hillsbrad/quest-catalog.json | 16960 ++++++++++++++ .../hillsbrad/results/hillsbrad_00_intro.json | 1 + .../results/hillsbrad_00_intro_retry.json | 1 + .../results/hillsbrad_01_machine.json | 1 + .../results/hillsbrad_02_harvest.json | 1 + .../hillsbrad_02_harvest_prepared.json | 1 + .../results/hillsbrad_03_supplies.json | 1 + .../results/hillsbrad_03_supplies_lock13.json | 1 + .../results/hillsbrad_03_supplies_open.json | 1 + .../results/hillsbrad_03_supplies_retry.json | 1 + .../results/hillsbrad_04_capture.json | 1 + .../results/hillsbrad_07_sludge.json | 1 + .../results/hillsbrad_08_rescue.json | 1 + .../results/hillsbrad_09_coastal.json | 1 + .../results/hillsbrad_10_science.json | 1 + .../results/hillsbrad_11_coastal_stage.json | 1 + .../results/hillsbrad_12_coastal_observe.json | 1 + .../hillsbrad_13_creeper_lifetime.json | 1 + .../hillsbrad_14_coastal_live_accept.json | 1 + .../hillsbrad_15_assessment_retry.json | 1 + .../hillsbrad-quest-test-2026-10-30.md | 84 + .../testbot-validation-2026-10-30.md | 66 + doc/clientless/testbots.md | 182 + doc/clientless/transport-tools.md | 10 +- .../2026_10_30_01_capital_click_portals.sql | 83 + .../game/Battlegrounds/BattlegroundQueue.cpp | 27 +- .../game/Battlegrounds/BattlegroundQueue.h | 2 + src/server/game/DungeonFinding/LFGMgr.cpp | 57 +- src/server/game/DungeonFinding/LFGMgr.h | 1 + src/server/game/DungeonFinding/LFGQueue.cpp | 59 + .../game/Handlers/BattleGroundHandler.cpp | 9 + src/server/game/Server/WorldSession.cpp | 6 + src/server/game/Server/WorldSession.h | 1 + .../game/World/AdventureBehaviorMgr.cpp | 51 +- src/server/game/World/AdventureBehaviorMgr.h | 7 +- src/server/game/World/AdventureCombatPolicy.h | 2 +- .../game/World/AdventureGeneratorPolicy.h | 2 +- src/server/game/World/AdventureGroupMgr.cpp | 340 +- src/server/game/World/AdventureGroupMgr.h | 12 +- src/server/game/World/AdventureGroupPolicy.h | 11 +- .../game/World/AdventureInteractionMgr.cpp | 2 +- .../game/World/AdventureLocationMgr.cpp | 7 + .../game/World/AdventurePopulationMgr.cpp | 2 +- .../World/ClientlessActionExecutorMgr.cpp | 4 +- .../game/World/ClientlessBrowserPolicy.h | 40 + .../game/World/ClientlessBrowserRules.h | 8 + src/server/game/World/ClientlessLuaEngine.cpp | 4 +- .../game/World/ClientlessTestBotMgr.cpp | 534 + src/server/game/World/ClientlessTestBotMgr.h | 14 + .../game/World/ClientlessTransportMgr.cpp | 10 +- .../game/World/ClientlessTravelGraphMgr.cpp | 87 +- .../game/World/ClientlessTravelGraphMgr.h | 3 +- src/server/game/World/World.cpp | 4 + .../testbots/hillsbrad_assessment_retry.lua | 96 + .../clientless/testbots/hillsbrad_capture.lua | 99 + .../clientless/testbots/hillsbrad_coastal.lua | 113 + .../testbots/hillsbrad_coastal_fresh.lua | 122 + .../clientless/testbots/hillsbrad_harvest.lua | 115 + .../clientless/testbots/hillsbrad_helpers.lua | 75 + .../clientless/testbots/hillsbrad_intro.lua | 101 + .../clientless/testbots/hillsbrad_rescue.lua | 91 + .../clientless/testbots/hillsbrad_science.lua | 96 + .../clientless/testbots/hillsbrad_sludge.lua | 92 + .../testbots/hillsbrad_supplies.lua | 106 + .../clientless/testbots/quest_accept.lua | 20 + .../clientless/testbots/quest_combat.lua | 59 + .../scripts/Custom/viano_bot_commands.cpp | 7 +- src/server/worldserver/worldserver.conf.dist | 20 + tests/clientless/test_adventure_area_node.py | 4 +- .../test_adventure_day_persistence.py | 8 +- .../test_adventure_destination_level.py | 8 +- tests/clientless/test_adventure_groups.py | 13 +- .../test_adventure_instance_begin.py | 17 +- .../test_adventure_instance_persistence.py | 5 +- .../clientless/test_adventure_intent_state.py | 27 +- .../clientless/test_adventure_interactions.py | 7 + tests/clientless/test_adventure_leisure.py | 8 +- tests/clientless/test_browser_admission.py | 42 + tests/clientless/test_browser_bg_brackets.py | 43 + tests/clientless/test_browser_match_order.py | 83 + tests/clientless/test_browser_participants.py | 53 + tests/clientless/test_capital_portal_seed.py | 43 + tests/clientless/test_free_flight_planner.py | 2 +- .../clientless/test_group_role_composition.py | 77 + tests/clientless/test_portal_use.py | 37 +- tests/clientless/test_testbot_client.py | 60 + tests/clientless/test_transport.py | 9 +- tools/testbots/client.py | 84 + 245 files changed, 49535 insertions(+), 114 deletions(-) create mode 100644 doc/clientless/browser-and-pvp.md create mode 100644 doc/clientless/build-recovery-2026-10-30.md create mode 100644 doc/clientless/capital-portal-audit.md create mode 100644 doc/clientless/checkpoints/2026-10-30-testbots/results.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/browser-build-2026-10-31.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/browser-build-incremental-2026-10-31.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/browser-config-before.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/browser-config-prepared.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/focused-tests-resumed.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/lifecycle.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/loader-resumed.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/pending-runtime.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/post-recovery-loader.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/post-start-recovery.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/final-summary.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/rerun-results.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/summary.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_policy.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_segment.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_async_database.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_behavior_policy.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_class_rotation.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_exercise.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_preparation.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_reactions.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_encounter.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_equipment_maintenance.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_equipment.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_ownership.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_policy.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_graph_handover.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_ground_avoidance.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_departure.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_gather.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_plan.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_travel.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_groups.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_autoresume.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_begin.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_loader.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_variants.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_intent_state.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_location_import.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_manager_inventory.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_micro_reset.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_native_lfg.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_navigation_rescue.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_northrend_flight.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_poi_binding.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_population.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_profile.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_sightline.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_targets.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profile_selection.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_pvp.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_recovery_policy.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_repair_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_fire.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_space.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_targets.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_retry_policy.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rotation.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social_fire.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supplies.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_items.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_talent_templates.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_training_catalog.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_walk.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_world_presence.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_admission.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_bg_brackets.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_match_order.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_participants.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_capital_portal_seed.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_cheat_explore.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_city_catalog_parents.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_character_factory.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_companion.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_damage_notifications.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_near_teleport_observer.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_skill_preparation.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_social_notifications.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_default_phase.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_empty_spell_effect.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_area_query.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_departure.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_handoff.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_landing_search.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_policy.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_terrain_fallback.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_follow_spline_velocity.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight_planner.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_graph_probe_cache.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_ground_exit_continuation.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_follow.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_mount.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_role_composition.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_guildless_group_restore.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_item_equip_cooldown.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_local_spline_segments.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_lua_reload.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_native_skill_slot.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_player_pure_max_skill.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_conditions.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_transfer.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_use.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_executor.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_graph.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_route_portal_prerequisites.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_safe_logout.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_shared_group_route.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_taxi_import_disabled.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_testbot_client.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_control.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_mesh.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_return.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_grid_loading.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/regression/test_travel_telemetry.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/remaining-last-saved.tsv create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/restart-recovery-needed.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/resumed-build-state.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/runtime-summary.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/safe-logout-request.json create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/startup-and-initial-runtime.log create mode 100644 doc/clientless/checkpoints/2026-10-31-browser/validation-status.json create mode 100644 doc/clientless/checkpoints/2026-10-31-elunes-blessing/after.json create mode 100644 doc/clientless/checkpoints/2026-10-31-elunes-blessing/before.json create mode 100644 doc/clientless/checkpoints/2026-10-31-elunes-blessing/runtime-verification.log create mode 100644 doc/clientless/checkpoints/2026-10-31-group-test/applied.json create mode 100644 doc/clientless/checkpoints/2026-10-31-group-test/before.json create mode 100644 doc/clientless/checkpoints/2026-10-31-group-test/plan-counts.json create mode 100644 doc/clientless/checkpoints/2026-10-31-group-test/startup-check.log create mode 100644 doc/clientless/checkpoints/hillsbrad/azurelode-fixtures.json create mode 100644 doc/clientless/checkpoints/hillsbrad/console-outcomes.log create mode 100644 doc/clientless/checkpoints/hillsbrad/diagnostic-db.json create mode 100644 doc/clientless/checkpoints/hillsbrad/final-character-quests.tsv create mode 100644 doc/clientless/checkpoints/hillsbrad/item-spells.json create mode 100644 doc/clientless/checkpoints/hillsbrad/quest-catalog.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro_retry.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_01_machine.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest_prepared.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_lock13.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_open.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_retry.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_04_capture.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_07_sludge.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_08_rescue.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_09_coastal.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_10_science.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_11_coastal_stage.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_12_coastal_observe.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_13_creeper_lifetime.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_14_coastal_live_accept.json create mode 100644 doc/clientless/checkpoints/hillsbrad/results/hillsbrad_15_assessment_retry.json create mode 100644 doc/clientless/hillsbrad-quest-test-2026-10-30.md create mode 100644 doc/clientless/testbot-validation-2026-10-30.md create mode 100644 doc/clientless/testbots.md create mode 100644 sql/custom/world/2026_10_30_01_capital_click_portals.sql create mode 100644 src/server/game/World/ClientlessBrowserPolicy.h create mode 100644 src/server/game/World/ClientlessBrowserRules.h create mode 100644 src/server/game/World/ClientlessTestBotMgr.cpp create mode 100644 src/server/game/World/ClientlessTestBotMgr.h create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_assessment_retry.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_capture.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal_fresh.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_harvest.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_helpers.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_intro.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_rescue.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_science.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_sludge.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/hillsbrad_supplies.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/quest_accept.lua create mode 100644 src/server/scripts/Custom/clientless/testbots/quest_combat.lua create mode 100644 tests/clientless/test_browser_admission.py create mode 100644 tests/clientless/test_browser_bg_brackets.py create mode 100644 tests/clientless/test_browser_match_order.py create mode 100644 tests/clientless/test_browser_participants.py create mode 100644 tests/clientless/test_capital_portal_seed.py create mode 100644 tests/clientless/test_group_role_composition.py create mode 100644 tests/clientless/test_testbot_client.py create mode 100644 tools/testbots/client.py diff --git a/doc/clientless/SESSION-RESUME.md b/doc/clientless/SESSION-RESUME.md index ca65bf2ac5..8cd70f7d30 100644 --- a/doc/clientless/SESSION-RESUME.md +++ b/doc/clientless/SESSION-RESUME.md @@ -1,3 +1,540 @@ +# Aktueller Gruppentest geplant: 31.10., 14–15 Uhr Vorbereitung, 15–16 Uhr Ziele + +Nutzer verlangt NÄCHSTEN Intent Gruppenbildung, danach gemischt Dungeon/Raid. +Für92geeignete ready-Bots nächsteSlots14/15 persistent geändert,18unter15wie zuvor +vom Test ausgenommen. 74instance/18raid. Sammelorte poi_guard_22(SW,GildedRose) +und poi_guard_179(OrgrimmarInn); native Generate revalidiert Ziele beim Login, +bei Bedarf ersetzt es auch den Treffpunkt durch gültige Location. Arthoran native +plan bestätigt14groupformation inSW/poi_npc_314039,15raid instance_visit_at_3529. +VorherigePläne/Manifest unter checkpoints/2026-10-31-group-test/ gesichert. +Beim Beginn war Worldserver unerwartet offline, keine tmux-Session; vorigen +Server.log gesichert, keine reguläreShutdownmeldung am Ende. Ursache UNGEKLÄRT. +Server neu gestartet, freshready/8085+8087/Prozess19724 geprüft. Loader enabled1, +schema1,known110,50/5/50/5, lädt gestaffelt. Kein Build/kein Commit/keinePushes. +RaidJoin0/BattlegroundJoin0 bleiben0. Battlegroundtest erst später aufUserauftrag. +Keine automatisierte Stundenbeobachtung beauftragt. AlteInfoProzess14646historisch. + +--- + +# Aktuell: installiert, Testserver online, Botbetrieb wieder freigegeben + +Der Nutzer hat das Neustartverbot ausdrücklich aufgehoben. Fertigen Build ohne +weitere Kompilierung installiert (cmake --install EXIT0), vorher kein Worldserver. +Frische tmux-Session vcore-worldserver gestartet; frisches Server.log meldet +(worldserver-daemon) ready..., Prozess14646 blieb aktiv, Ports8085/8087 lauschen. +Loader beim Start0; sieben Restbots43/46/54/73/74/118/147 einzeln eingeloggt, +Flug-/Transportzustände geprüft und mit tele name nach Sturmwind/Orgrimmar geborgen. +Ankunft für ALLE über adventure area bestätigt: Alliance map0/area5148, Horde +map1/area5170, allowed1. Kein alter free-flight-/transport-ride-State. Native +Status direkt nach Bergung: sessions7 combat0 transport0 flight0 loading0. +Danach normalen Betrieb wiederhergestellt: Loader1/TestBot.Enabled1, reload config, +population reload, test resume. Tatsächlich bestätigt enabled1/schema1/busy0, +pools50/5/50/5, known110; gestaffelte BOT_LOADER_LOGIN und Online-Meldungen laufen. +110 ist die Zielpopulation; Vollbesetzung wurde noch nicht abgewartet. + +Build-j10 und120/120Tests zuvor bestanden, diff --check weiterhin sauber. +Live bereits BROWSER_QUEUE guid62 intent instance; kein erfolgreicher echter +Browserbeitritt mit Spieler behauptet. Raid-/BG-Beitritt bleiben0, BotOnlyTests0. +Beobachtet: sechs ignorierte Kanten mit fehlenden Nodes (1752,1822,1823,1865, +1866,1869), langsame Routenplanung bis25.3s; keine neuen Fixes daran vorgenommen. +Keine kritischen Startfehler/kein Crash beobachtet. Keine Commits/Pushes. +Belege in doc/clientless/checkpoints/2026-10-31-browser/: validation-status.json, +restart-recovery-needed.json, post-start-recovery.log, post-recovery-loader.log, +loader-resumed.log, startup-and-initial-runtime.log. Installlog außerhalb Repo: +/home/wow_admin/wow_cata_server/checkpoints/browser-install-2026-10-31.log. +Alle älteren Angaben zu noch verbotenem Neustart/ausstehender Installation sind +historisch. Betriebssystemzeit bleibt ausdrücklich außerhalb des Auftrags. + +--- + +# Aktueller Wiederaufnahmestand: Browser/PvP/Gruppen gebaut und getestet + +Der Nutzer hat die weitere Arbeit freigegeben. Betriebssystemzeit ist ausdrücklich +KEIN Thema/Blocker mehr. Fokus ist das bestehende Feature, keine Questbugfixes und +keine neue Featureausweitung. Autorisierter Branch feature/clientless-player-core; +alle vorherigen Änderungen und Staging erhalten. Keine Commits oder Pushes erfolgt. + +## Ergebnis der letzten Fortsetzung + +- Nach externem Umgebungsneustart war der Worldserver bereits OFFLINE: kein Prozess, + keine vcore-worldserver-tmux-Session, keine Listener8085/8087. Deshalb waren null + CPC-Sessions vorhanden; dieser Agent hat keinen Server/Transport/Bot zwangsbeendet. +- Loader blieb0. TestBot.Enabled wurde für den Build von1 auf0 gesetzt; ursprünglicher + Wert in doc/clientless/checkpoints/2026-10-31-browser/resumed-build-state.json. +- Bestehende NinjaDebug-Konfiguration verwendet, vollständiger Build1053Schritte + mit cmake --build /home/wow_admin/wow_cata_server/build/debug -j10: EXIT0. +- Letzte Korrektur für native Type1-LFR-Berechtigung inkrementell ebenfalls-j10 + gebaut und gelinkt: EXIT0. Kein ausstehender Produktionscode-Compilerfehler. +- Alle120Clientless-Testskripte erfolgreich geprüft. Erster Gesamtlauf114/120; + sechs ältere C++-Adapter ergänzt und die sechs Fälle gezielt erneut ausgeführt: + alle bestanden. Neue Assertions für PvP-Planpersistenz, Browser-Wartephase, + Reise-Latch/Restart und AFK-Schutz. Kein Produktionsfehler wurde durch das + Abschwächen einer Assertion verdeckt. Initiale Fehlerlogs bleiben erhalten. +- Geklärter Cataclysm-Sonderfall: Drachenseele416/417 sind Type1 auf Raidkarte967, + Stufe85,Rollen2/6/17. Native Zulassung für diese Angebote nutzt DungeonFinder, + nicht Legacy-Type2-RaidBrowser. Eigene Bot-Beitrittssperre bleibt kartenbasiert. + Kein globaler DungeonFinder.OptionsMask-Wert wurde geändert. +- git diff --check bestanden. Noch NICHT installiert und kein Worldserver gestartet. + Kein tatsächlicher Live-Browserbeitritt oder visuelle Abnahme behauptet. + +## Aktuelle Betriebsgrenzen / nächste Schritte + +Das ausdrückliche Verbot von Shutdown, Neustart und Installation während weiterer +Routenaufzeichnung bleibt bestehen. Die externe Umgebungsunterbrechung ist KEINE +Freigabe für einen Worldserver-Start. Serverzustand beim nächsten Turn neu prüfen; +keinen zweiten Prozess starten. Aktuell off lassen, keine weitere Zeitkorrektur. + +1. Erst nach Aufhebung des Aufnahmeverbots bei Bedarf bestehendes fertiges Build + installieren. Vorher Prozesszustand prüfen, niemals laufende Binary überschreiben. +2. Für den ersten neuen Start Loader pausiert lassen, TestBot.Enabled bei Bedarf + wieder auf ursprünglichen1 setzen; für pausierte Annahme nach Startup + `clientless test pause` verwenden. Frische ready-Zeile/Prozess/Ports verifizieren. +3. Sieben vor dem externen Neustart verbliebene Bots prüfen: + 43Fizzira,46Selthas,54Falaeriel,73Rixzek,74Nimbin,118Lillina,147Seraenriel. + `restart-recovery-needed.json` enthält frühere native Befunde und letzte + GESPEICHERTE Positionen (keine angeblichen Livekoordinaten). Login-, Bewegungs-, + Taxi-, Flug-, Transport- und Teleportzustand frisch prüfen; falls nötig nach + geltender Bergungsregel in Fraktionshauptstadt zurücksetzen und Ergebnis sichern. +4. Wenn Aufzeichnung beendet und Wiederaufnahme gewünscht, Loader ursprünglich1 + wiederherstellen und tatsächliche Laufzeitaktivierung prüfen (Reload kann busy + ablehnen). Testannahme entsprechend dem gewünschten Testbetrieb wieder freigeben. +5. Erst dann native Dungeonbrowser-Beitritte mit Spieler prüfen. Raid-/BG-Beitritt + bleiben standardmäßig0. Reine Botmatches benötigen ausdrücklich Testausnahme + UND aktivierten Queue/Join-Schalter; native Zugangsvoraussetzungen bleiben bestehen. + +Vor jeder weiteren Kompilierung erneut Loader/Testannahme pausiert und nullCPC +verifizieren. Alle CMake-Builds-j10. Falls später wieder Bots hängen: normale +Fünf-Minuten-Shutdownausnahme nur ohne geltendes Aufnahmeverbot und mit frischer +vollständiger Restbotliste/Status, dann Prozessende prüfen, dann bauen. + +## Dateien / Belege + +Beschreibung: doc/clientless/browser-and-pvp.md. +Belege: doc/clientless/checkpoints/2026-10-31-browser/ +- validation-status.json: Build-/Test-/Installationsgrenzen. +- focused-tests-resumed.json: erste sieben gezielte Tests erfolgreich. +- regression/summary.json: historischer erster114/120-Lauf. +- regression/rerun-results.json und final-summary.json: alle120 erfolgreich. +- browser-build-2026-10-31.log und browser-build-incremental-2026-10-31.log. +- resumed-build-state.json, browser-config-prepared.json, restart-recovery-needed.json. +Originale Buildlogs zusätzlich außerhalbRepo unter wow_cata_server/checkpoints/. +/tmp-Dateien aus der alten Session sind durch den Umgebungsneustart verschwunden; +nur persistente Checkpoint-Dateien für die Wiederaufnahme verwenden. + +Quellcode: ClientlessBrowserPolicy.h/Rules.h; LFGMgr/Queue; BattlegroundQueue/Handler; +WorldSession::HasOpenRealmConnection; AdventureGroupMgr (Rollen/Reservierungen/ +Merge/Browser), AdventureBehaviorMgr (WaitingGroup/PvP/Reisefreigabe), Generator, +Gebiets-/Kampf-/Interaktionsregeln. Native Systeme hängen nicht von AdventureBots ab. +Config in conf.dist UND echter Testkonfiguration vorbereitet: +Dungeon.Queue/Join1/1, Raid1/0, Battleground1/0, AllowBotOnlyTests0. +Aktuell Betriebs-Pause Loader0/TestBot.Enabled0 für den ausstehenden Start behalten. + +Weitere WIP bleibt erhalten: Hauptstadtportale/Transport, eigenständige TestBots, +abgeschlossener Hillsbrad-Test. Nutzer will ausdrücklich KEINE Hillsbrad-Questfixes. +Elune's Blessing ist live verlinkt gewesen (Kante1859,Alliance,both); Nutzer zeichnet +weitere Routen auf, aktuelle DB vor Änderungen erneut lesen. Keine aufgenommenen +Routen durch alte Dumps überschreiben. Staging unverändert lassen. + +Die älteren Einträge unterhalb sind historische Befunde und werden durch diesen +aktuellen Stand ersetzt. Keine erneuten Featurearbeiten anhand alter "NOTRUN"- +Hinweise beginnen; verbleibend sind Freigabe, Installation, Start und Liveprüfung. + +--- + +# ACTIVE continuation Oct31: review completed further, restart STILL FORBIDDEN + +User explicitly says continue remaining browser/PvP work, but continues route +recording; do NOT shutdown/restart/install. Worldserver498839 stillready8085/8087, +console /tmp/vcore-2026-10-31-start.log. Safe logout remains7sessions(2combat, +6flight); loader0/testadmissionpaused. NO build and NO C++fixture execution yet. +Do not evade resourcepolicy via tests/syntax-onlycompile. Onceallowed andzeroCPC, +run -j10 build/fixtures; ifstillstuck requireuserrecordingfinished before5min +shutdownexception+freshcomplete recoverylist. Existing elapsedrequest01:21:40. + +Further source fixes in this continuation: +- Pending role/capacity reservations; excludeacceptingcandidate's ownreservation. +- Merge checksactualsourceleaderstillforming; cannotstealfromdepartedgroup when + member'sownplanstillforming. Priorityforvalidgroupcompletion, surplusrolescan + movesmaller; same-sizednormalmoves deterministic. Rollbackrestoresbotleadership + and2membersourceRaid/modes. Profession compatibilitypreserved; druidsbearrole. +- Browser responses nowrunbeforeSupply/Combat inAdventurecontroller, throttled1s; + nativeLFGMgr::IsRoleCheckPending query prevents duplicate role broadcasts. +- Sessionquery HasOpenRealmConnection (WorldSession.h/.cpp) for generic CPC Human + gate: FindConnectedPlayer merelyregistry. ClosedRealm/loggingoutdoesnotqualify; + changinginstancesocketduringlegittransferdoesnotblock. Nativehuman-onlygroups + unchanged; participatinglivehumanchosenleader onlywhenCPCmemberspresent. +- Matchrecursionprunesfullallbotprefix BEFOREcachedcompatibility, sohumanlastin + queuecanreplacefifthbot (or25thraidmember), notconsumedasa6th/26thcandidate. +- DirectBGgrouprecruitmentchecksactualDBbrackets andRandomBGmin45/WSmin10; + incominginvitationsarehonored, ownuncreatedformationcancelledbeforequeueing; + expiredmanagedinvitationsdeclinedwithoutinterruptingcombat. +- Newconfigkeys appended to REAL testconf aswellasdist(defaults1/1,1/0,1/0,override0), + no reload/currentbinaryactivation. Snapshot browser-config-before/prepared.json + underdoc/clientless/checkpoints/2026-10-31-browser. Existingloader0retained. + +Newbehaviorfixtures (NOTRUN): browser_participants(closed-butregisteredhuman), +browser_match_order(actualnativeFindNewGroupsrecursion/stalecache/25raid), +browser_bg_brackets(nativecustombracketboundaries). Extendedgroup_role_composition +forpendingroles/invalidtarget/surplusroles/bear. Existinggroups/instance_begin +adaptersupdated. All120PythonfilesASTparse;gitdiffcheckPASS;config7valueschecked +indist+realconfig. validation-status.json explicitly recordsNOCPP/NOgameplay. +No commit/push, noquestfix, nofurtiveflightcancel/teleport. PreserveallpriorWIP. +Detailed doc/clientless/browser-and-pvp.md. Nextstep remainscompile+actualtests, +notanotherfeatureexpansion. Usermaystillrecordadditionalroutes; do notinferrelease. + +# Oct31 follow-up: Elune's Blessing route linked live + +User finished Azuremyst-side recording and asked inspect/link. Both native stops +accepted on Reload (10stops total): ship_elunes_blessing_ruttheran map1/10points, +ship_elunes_blessing_azuremyst map530/16points, Entry181646 spawn9,period238656, +standelunes_blessing_center, localendpointgap~0.65yd. Native transport link +created edge1859 cost100,bidirectional1,enabled1. BothnodesexplicitAlliance mask1. +Native clientlessadventurereload refreshed area/access/location/graph caches, +no restart. Evidence doc/clientless/checkpoints/2026-10-31-elunes-blessing/. +Azuremystgroundedge1858 links exodar_gate_second to shipnode. Ruttheran shipnode +has NO recordedgroundedge yet; do not invent an untested ground path. Actualbot +ride not tested (safeLogout/buildpause stillinforce). Existing browserWIPbelow. + +# ACTIVE Oct31: native browsers / PvP / role-based group consolidation + +User authorized implementation of discussed browser/PvP/group changes; NO restart +while user records Elune's Blessing ship route. User explicitly requested startup: +existing installed worldserver started PID498839 in vcore-worldserver, console +/tmp/vcore-2026-10-31-start.log, fresh Server.log ready Oct31 01:14:30,8085/8087. +No new build installed. NativeStartup normal. EarlierHillsbrad completed untouched. + +New WIP source: ClientlessBrowser{Policy,Rules}.h generic CPC gates (noAdventure +imports inLFG/BG); nativeLFG match+finalproposal+teleport gating, autoCPCanswer, +humanleader; BGselection+matching+portgates. Independent QueueEnabled/JoinEnabled +settings inconf.dist; Dungeon1/1 Raid1/0 BG1/0 botOnlyTests0. AdventureGroupMgr +roles, Complete, Merge(probabilityriseswithtime), QueueBrowser nativehandlers, +rolechecks/BGports; Behavior WaitingGroup, travelLatch wholegroup, PvP intent, +profilegeneration/pvpweights/areaeligibility/worldpresence/combatweight. +Detailed scope doc/clientless/browser-and-pvp.md. NO questfixes undertaken. +Existingportal/transport/TestBotWIP preserved. No commit/push requested. + +Build preparations: Loaderprevious1 stored /tmp/vcore-browser-2026-10-31-state.json; +request01:21:40 local, Testadmissionpaused, configLoader0 thenreloadconfig and +populationreload accepted enabled0/schema1/busy0. Safe logout all requested. +Laterstatus7sessions (2combat,6flight), no transport. Diagnostics and last-saved +positions in doc/clientless/checkpoints/2026-10-31-browser; pending-runtime.log. +These saved DB positions are NOT claimed as live coordinates. Requery before +any future shutdown/recovery snapshot. MUST requery live before +ANY compilation (includingC++ test fixtures). Do not shutdown duringrecording. +Ifremaining at5min, document/deferbuild,keepserverrunning; noforce/detach/teleport. +Tests currently onlyPythonASTsyntax andgitdiffcheck; noC++tests/buildrun yet. +Newtests browser_admission/group_role_composition; adaptedgroups/instance_begin +fixtures. Run these plus relevantexistingLFG/BG/policytests afterzerobots, then +cmake --build /home/wow_admin/wow_cata_server/build/debug -j10 (existingNinjaDebug). +Buildresourcepolicy remainsfullyinforce. On stuckbots, waitforuserrecordingdone +before5minshutdownexception+snapshot; nevercompilewithremainingsessions. +Source needsfullcompile/review beforeclaimingdone. Follow-upreview fixedC++GUID +comparison(use<,notunsupported>), LFGproposaliterationerasure, 50slotpacketbound, +wholepartylatchafteracceptedtravel, protectedqueuedpartiesandfinalhumancheck. +NativeDBCconfirmedRaidFinder416/417 map967 are TypeID1,roles2/6/17,min/max85; +useactualMapIsRaidforqueuecaps/gates (notTypeID2). Raidpartialpremadecap25. +Additionalproductionfunctiontests group_role_composition, independentadmission +kernel ClientlessBrowserRules. Tests onlyASTparsed(noC++executionyet). +Potentialnextcheck: existingextractiontestfixtures afternewBegin/rolehelpers. + Do not install overrunningbinary. +Loader/testadmission remainpaused while recording, restoreprevious1 afterdeploy. + +# COMPLETED Hillsbrad live quest test, 2026-10-30 + +Authoritative report: doc/clientless/hillsbrad-quest-test-2026-10-30.md. +Evidence: doc/clientless/checkpoints/hillsbrad/results/*.json, +final-character-quests.tsv (eleven native rewardedquests), diagnostic-db.json. +GUID150Morvath offline/retained, noAdventureprofile. No active/queuedTestBot jobs. +Native console confirmed safe logout pending0 sessions0 before restoring loader. +COMPLETED28571,28096,28111,28114,28115,28138,28144,28146,28156,28168,28199. +Main28192blocked:case07walkfailed;15freshunmountedaccept+60s+gossip+rewardfailed, +28197properlydenied. Do NOT fakecompletion/unlocklaterstory. Mainlateruntested. +Coastal28146 freshacceptcase14 PASSED12feedings+reward225s. Relogcases09/12fail; +stationarycase13 proves companionvanishes~500msinallowedarea295. Liveacceptworks. +Noquestgameplayfixes/SQLchanges. TestcontrollerAPIs built/installed-j10; native +ActiveMoverACK limitedTestcontroller. PythonexternaladaptertestPASS,diffcheckPASS. +Latestserver490158 /tmp/vcore-hillsbrad-live-start.log remainsrunning8085/8087. +ConfigrestoredLoader1/TestBotTimeout300; reloadconfig+populationreloadaccepted +(enabled1busy1 atrestore). Final runtime status confirmed enabled1/schema1/busy0/known110/error empty; +all four pools have successful online bots, continued staggered admission. +Originalrecovery97/101/118 completed earlier; /tmp/vcore-hillsbrad-recovery retained. +No commits/pushes requested/performed. Existing portal/transport WIP preserved. +Earlier ACTIVE notes below are historical and superseded by this completion. + +# LATEST live progress (supersedes earlier active-run notes) + +Completed native quests now10:28571,28096,28111,28114,28115,28144,28138,28168, +28156(Dumasswalk34s),28199(6nativeghoullootsamples). All results in liveTestBotroot. +Current hillsbrad_14_coastal_live_accept running: liveabandon/reaccept28146 atSarus, +companionpersists,physicalwalkmine->coast,3actualmurlocfeedingcredits already. +Prior coastalrelogtests09/12failed: companion47662 visibleatlogin then disappears +within500ms whileactorstationaryallowedarea295/quest3;case13 proves no walking +required for disappearance. Liveaccept companionpersists so distinguish relogbug +fromregularquest. No gameplayfix attempted. Await12feeds+reward(ifallpass). +Queued15assessment_retry: nativeabandon/reaccept28192 unmounted atWarden,inspect +emptygossip,wait60sforcinematic,attemptnormalreward,verify28197properlylocked. +Prior07walkassessment failed. Local28192SourceSpellID0/noNPCscript/noSAI/noATlink; +expectedcinematic(CataWowproguide);nativeDBC89148/89154havecompletioneffects, +NEVERmanuallycastthose (wouldfakeprogress). Needfinalblockerreport/evidencecopy, +restoreloader1/timeout300/runtime enabled checked. Source fixtures/docmodified, +no gameplayquestSQL/scriptschanged. RequestfileorderUNSPECIFIED(fsiteration), +submitdependentcasesonlyafterpredecessorcomplete! No otherbuildrequired now. + +# LIVE UPDATE Hillsbrad (latest, supersedes stale progress below) + +Server490158, fresh ready /tmp/vcore-hillsbrad-live-start.log; ports8085/8087. +-j10 mover build/install passed; latest TestBot native ActiveMover ACK loaded. +Loader0, TestBot enabled1 Timeout1800; restore values from +/tmp/vcore-hillsbrad-state.json after task (loader1, timeout300). +GUID150Morvath undeadwarrior20, retained native testchar. Weapon49778 skill55. +Rewarded28571,28096,28111,28114,28115,28144 (all native interactions). +Currently active capture run hillsbrad_04_capture, queued hillsbrad_07_sludge. +Supplies run hillsbrad_03_supplies_retry PASSED:6chests, native Opening22810 +(lock13), real loot, negative/positive28168 prerequisite check. Active28168. +Capture fixture in sourcehillsbrad_capture.lua, coastal fixture prepared but +NOT queued yet. 28146 active; test physical follower movement, no teleportcredit. +Native human capture already produced first credit. After capture run may end +atKeyton; coastal needs login in area288/295 to get companion. Sludge run queued +will turnin28168/accept28192 and walkassessment; no event source found inC++/SAI. +Need test remaining escort28156 and coastal28146, then continue accessible chain +or document real prerequisite blocker. No questgameplaySQL/script modified. +Native APIs added inventory spellmetadata/ground itemcasts/codedgossip/area trigger, +request_cast GOtargets, skill(value,max), ActiveMover; doc updated. +Do NOT replay oldmachine fixture described below; already done. + +# ACTIVE Oct30: live Horde Hillsbrad quest-chain test (user requested) + +User asked actual linked quests in Hillsbrad, referenceWowhead28089. Browsed +link(cachemiss),Cataquestlist,Warchiefvariants andWelcome scene sources. MainHorde +story withunlockedsidequests intended,notlegacydeprecatedorindependentPvZ. +LocalDB twoaliases:28089 Cromush(onlysummonedNPCentries44640/45631/46125),28571 +commandboards(GO207324spawn203440Undercity;207325Silvermoon). Both->28096. +Catalogallqfields/addonlinks doc/clientless/checkpoints/hillsbrad/quest-catalog.json +(includesdeprecatedoldquests;filtermodernID>=28089). Itemspells parsed native15595 +Item/Item-sparse.db2 into item-spells.json (WDB2header48+6*(hi-lo+1)indexblock). + +AddedneededTestBotAPI inClientlessTestBotMgr.cpp: nearest_creature/object, npc_hello, +menu(id/optionsid/text/action),spellclick,exit_vehicle,request_cast,inventory, +remove_item,bag equip/clear slots19..22,skill exact(value,max). Snapshotvehicle +entry/guid;targetstatemax_health/entry/level. Nativehandlersstillnormalnocredits. +Firstskillimplementationcalledoffline-onlyfactoryhelper=>alwaysfalse online; +FIXED directSetSkill withDBClinecheck andvalue/max args(current source compiled). +LuaHillsbradconversationinitialloopreopenedHello beforeeveryanswer=>resettofirst; +FIXED onlyopen initialstage/preserve subsequentnativeMenu. These areharnessbugs, +NOTquestbugs. No gameplayquestDBorquestscriptmodified. + +TestHordeactor GUID150Morvath,race5Undead,Warrior20,account17;retainedtestregistry +Root /home/wow_admin/wow_cata_server/server/debug/testbots. Four54443bagsprovisioned, +HP8000/rage1000. Nativeweapon49778twohandsword(class2subclass8),actualweaponSkill55; +train55=100/100beforecombat (sourceintro currentlytrains43only;amendLua asneeded). +NoAdventureprofile. Firstjob hillsbrad_00_intro failedonlyskillprep. Retry via +login150(bagsalreadyprovisioned) COMPLETED28571nativeboard->Darthalia,nativepositive +andnegativePrevQuesttests passed,28096accepted andspellclickedhorse47445,seen +Dumassmenu1101. ThenharnessHello-looperrorblocked1102 andtimedout;charoffline, +28096stillincomplete/nofakecredits,28571rewardpersisted. Do NOT recreateMorvath. +Sourceexample src/.../testbots/hillsbrad_intro.lua corrected, freshcasecreatesname; +prepared /tmp/vcore-hillsbrad-machine-resume.lua useslogin150/skips28571alreadydone +andbags,retries28096scene(withfixedloop),thenreward28096/accept28111/deliver to +Keyton47554 andcheck/unlock28138+28144. NEXT submitthisLua afterstartupchecks. + +CURRENT startupjuststarted in tmuxvcore-worldserver,console +/tmp/vcore-hillsbrad-scene-start.log. Needfreshready/process/8085+8087 verification. +Priorserver487774cleanlystopped,CPC0/loader0/admissionpaused confirmedbefore +-j10 build /tmp/vcore-hillsbrad-skill-build.log PASS,installlogsameprefixPASS. +SourceAPI firstbuild /tmp/vcore-hillsbrad-api-build.log alsopassed. No otherbuild +pending. Newstartupresets safeAll/admissionflags; ensuretestintakeresumed. +Loader0throughzoneTest,Timeout1800(original300). Restore aftertestingusing +/tmp/vcore-hillsbrad-state.json (originalLoader1,Timeout300,request19:29:49). +ActualruntimeLoaderpausefirstreloadDENIEDbusy!Config0butnewloginscontinueduntil +shutdown;nextstartupenabled0verified. ForfuturemustRETRYpopulationreloaduntil +reported enabled0,notjustsendonce. AllnewloginswerecaughtbysafeAllandloggedout. + +5minshutdownexceptionusedproperly after~6min:3remaining97Talzul101Korutam118Lillina +positions/flightstatuses /tmp/vcore-hillsbrad-recovery. Poststartupfeetcheck97+101 +recoveredOrg,118validgroundleftalone.Alloffline,3temporaryspecificprofilesremoved +hashverified(manifestretainedonlyevidence). No resetotheractors/humans. Shortlocal +MariaDBconnecttimeoutduringprofileprep;retrySELECT1passed,servicealive(noDBservice +changes). Currentroot3tempsnoexistingfilesexpected. PriorWIPuncommittedpreserved. + +Caseplan: Machine vehicle/gossip 47444actions1101/1102;47443 1103..1105;47442 +1106..1108. Menusautoopen/firstHello only. Underhill actuallyCaptainKeyton47554, +coords(-902.906,231.024,9.70241)spawn323979. Darthalia2215(-572.135,428.285,80.3627) +spawn324463. Harvest/PastPrime giver47432(-594.835,429.852,79.3003),turninSarus47551 +(-905.543,232.002,9.48916). Harvest28114 needs60CreeperEgg63029 clickedNPC47203 +nativeOnSpellClickscript,attachedtobears47204(vehicle1251);gatherBEFOREkilling8 +bears28115. Nativequestnotpumpkins! Supplies28144 needs6item63082 fromGO206783 +chestloot35722,100%questrequired,loot_slot0. HumanInfestation28138 needs8captured +2269/2270/2503 at<=35%HPviaitem63079spell88797 (nativeitemuse), nofakehealthdamage. +CaptureminingNPCsstartparalyzedspell87969;breakthenhurt/stop/UseItem naturally. +Coastal28146 fromSarus47551,feedcompanion47662 12murloc2374/2375onlyownerkills, +zone288/295 required;don'tTPfarfromcompanion wheneating. DeepMine28156 fromDumass +47681(-794.269,68.8038,9.11288),nativePlayerScriptacceptstartsfollow;escortwalkto +Keyton,within12yd triggersGroupEventHappens. Mainnext28168 fromKeyton/Darthalia +after28144 rewarded,turnin47781(-500.719,90.8021,56.3984). Continueallreachable +branches,logactualblockersratherthanforceQuestComplete. Useraskedtest,notquestfix. + +# COMPLETED Oct30: independent Lua-driven TestBots implemented and live tested + +User postponed Azuremyst recording and requested independently scriptable real +TestBots: initialization,task cheats,normalplayer actions,automated ingress/results. +Implemented ClientlessTestBotMgr.{h,cpp},worldUpdate+GMcommands,ownLua5.4states/ +coroutines/resourceguards,optionalconfig,asyncnativecharacterfactory+testregistry, +actorownership,andatomicJSONjobresults. No Adventureprofiles/rotation/controllers. +Factory polling moved from AdventurePopulationMgr into generic World loop; +executionorder otherwise unchanged. Nativeplayerquest/loot/gossip/item/attack +handlers; normalcasts,MMAPMovePoint(noAdventurecatalog),teleport/level/stats/gear. + +Commands clientless test pause/resume/run/submit(base64)/status/result/cancel. +Oneactivejob/multibotLua; mailboxrequests,archivedjobs,interruptedrestartstates. +PythonSOAPadapter tools/testbots/client.py +realHTTPfixturetest. SOAPremains0; +no newnetworkservice/auth/productionchanges. Doc doc/clientless/testbots.md. +ConfigClientless.TestBot.Enabled1,Root +/home/wow_admin/wow_cata_server/server/debug/testbots,TimeoutSeconds300restored. +Defaultsourceconfigdisabled0. Ingestionresumed. Characterregistry/requests/ +results liveunderRoot. Examples quest_accept.lua/quest_combat.lua under +src/server/scripts/Custom/clientless/testbots. Account17free2slots remaining; +Testrion148/Testaria149retainedintestregistryandoffline,NOTinAdventuregenerated +bot table. No humans or Adventureactors used inTestjobs. Character/queststates +retained forinspection/reuse; onlytest-ownedactors loggedout onfinish. + +LIVEproof: nativefreshFullQuest149 acceptedWarrior28766,killed6realWorgswith +normalPlayerautoattacks,receivednativecredits,completedandclaimedreward. No fake +credits/damage/QuestComplete. Firstfixture28757wasMageonlyandproperlyrejected; +correctedfixture28766passed. Firstcombatcase2kills thenmovingtargettimeout; +Lua-follow variantcompleted, thenfresh149fullsinglejobpassed. Normallevel/stats/ +gear/inventory/learn+BattleShout/MMAPmovement passed. Level1NorthrendTPprovedno +Adventurearea/flightpolicy. Reaccept/abandon/classes,pause/resume,timeout,cancel, +Luaerrors/instructionlimit/memoryguard/foreignguid/isolation/syntax/Base64command +allchecked. StalerunningJSONafterstartup->interrupted verifiedfixture. Remote +SOAPauthnotliveverified(listenervalidationfixtureonly),someboundAPIs(loot/useitem/ +gossip/GO)notseparategameplaytested; reportexplicitlystateslimits. + +Build7 /tmp/vcore-testbot-build7.log PASS-j10,install2PASS.115clientlesstestsPASS, +Pythonadapterfixture rerunPASS,gitdiffcheckclean. AllbuildspreflightCPC0/loader0; +no5minexceptionneededthis task. Currentserver484034 tmuxvcore-worldserver, +console/tmp/vcore-testbot-final-start.log, freshready11sec/process/ports8085+8087 +verified. Testactors148149offline,quest28766rewardrowsconfirmedboth. Finalsource +compiled/installed. NormalAdventureloader1 RESTOREDnow,logoutresume/configreload/ +populationreload performed; pools50/5/50/5 progressivelyloggingin,known110. +ExpensiveexistingAdventureRouteplanningstillcausesmulti-secondticks;NOTfixedby +TestBotwork. Do NOTmistakeTestprofiles forAdventureorauto-reconcileTeststats. + +Validationdoc doc/clientless/testbot-validation-2026-10-30.md; stableJSONevidence +doc/clientless/checkpoints/2026-10-30-testbots/results.json; rawserverfilesunder +Rootresults. No newcommit/push requested; earlierportal/transportWIPpreserved. +Beforefuturebuilds pauseTestBotjobadmission/cancelactiverunsaswellaspausing +Adventureloaderandsafelogoutall; follow5minexception+snapshotifneeded. Resume +jobadmissionafterverification. Lua/sourceeditsdonotneedrestart; APIcppchangesdo. +Userawaitingcompletionreport; implementationdone,nootherworkpendinginthistask. + +# CURRENT Oct30: recorder sample-gap repair installed; verify startup + +User clarified ONLY Azuremyst failed; Ruttheran saved unchanged. Native logs +17:41:12 show fixed3D8yd gap rejection, not evidence of jumping. Removed fixed +per-sample8yd guard in manual GM Sample; native dock/frame checks, noflight/taxi, +coordinate bounds, total60yd,512points and monotonicboarding remain. No DB route +or node changes. Existing height/source5ydguard unchanged. Regression exercises +12ydnativeboardingheightsnap,20ydcoalescedsampleacceptance,61ydpathrejection and +existingpassenger/crossmap safety. test_transport.py PASS; build-j10/installPASS, +gitdiffcheckclean. Beforebuildloader0/nativepending0sessions0 verified. +Server471677 cleanly stopped before install. Newserver476850 with fresh console +/tmp/vcore-recorder-gap-start.log (stdbuflinebuffered),ready/process/ports +verification PASSED: freshready11sec,liveprocess,8085/8087listening. +Loader stays0foruserrecording;noCPCsessions. Original1 in +/tmp/vcore-elunes-recording-loader.json. No newcommit/push. +User must reconnect and record ONLYAzuremyst from sharednode, spawn9, finishing +at existing elunes_blessing_center. Ruttheran mustnotberecordedagain. +Pendinglinkafterbothstops validated, factionAlliance/areacatalog applies. +Previouscompletedcheckpointsbelowhistorical. + +# CURRENT Oct30: five-minute build exception applied; recorder5yd LIVE + +User amended rule: after5minutes safe logout may cleanly shutdown server despite +remaining bots, record list/status beforehand, check afterstartup and capital +reset ifnecessary. AGENTS.md updated (local ignored policy file). Do not build +with live server/bots; verify shutdown first. All builds-j10 still. +Recovery list/outcomes doc/clientless/build-recovery-2026-10-30.md and +/tmp/vcore-recorder-5yd-recovery/.8remained after~85min wait; documented shutdown, +build-j10/install/transportregression PASS. Current server471677 tmux +vcore-worldserver,console/tmp/vcore-recorder-5yd-start.log, freshready/process/ +ports8085/8087 verified.5yd recorder change installed. +All8loggedin andfeetstatuschecked;6floating reset natively to faction capitals, +Noranda ongoingcombat reset toStormwind too;Lillina validground noreset. +All8safeoffline confirmedDB,temporary8specificprofiles removed(hashverified), +generatedprofiles untouched. Native safeLogoutstatus final pending0/sessions0 confirmed. +LOADER REMAINS0 intentionally whileuserrecords routes, native safe-all/safe +requests stillinforce. Original1 /tmp/vcore-elunes-recording-loader.json. +Afterrecordingfinish resume/logoutmode andrestore originalLoader1,reloadconfig/ +populationreload. No newcommit/push requested. PriorportalWIP preservedbelow. +Oldcheckpointrestrictionsagainsttimeoutshutdown below supersededbynewuserrule. + +# PENDING Oct30: transport recorder start radius 5 yards + +User explicitly requested increasing allowed recorder distance to node to5yd. +Implemented in ClientlessTransportMgr.cpp nodeDistance guard and diagnostic; +doc/clientless/transport-tools.md updated. No unrelated2yd runtime arrival +threshold changed. git diff --check passed. NOT BUILT/INSTALLED; live still2yd. +Loader remains0 from recording-lag pause. Native safe logout latest8pending/ +8sessions,2combat/7flight. Build resource policy forbids build until CPC0; no +new recovery exception exists. Do not interrupt user recording/restart without +coordination. Current server459746/tmuxvcore-worldserver unchanged. +When zero safe sessions: build-j10 using existing CMake, then cleanstop/install/ +restart only once recording safe; fresh ready/process/8085+8087 verification. +Keep loader paused while user recording; original1 saved in +/tmp/vcore-elunes-recording-loader.json. Portal WIP below preserved. + +# ACTIVE Oct30: Elune's Blessing recording, bots paused for severe lag + +User recording Ruttheran<->Azuremyst on transport spawn9 entry181646, native +service verified stops530/1, 60sec each. No restart/build in this task. +Existing nodes ship_elunes_blessing_ruttheran (1/8343.44/1161.52/4.51575) +and ship_elunes_blessing_azuremyst (530/-4264.42/-11332/5.49679). +Recorder refused because user used nonexistent ship_elunes_blessing and later +omitted start. Correct .clientless transport record start ship_elunes_blessing_ruttheran 9. +No recorder implementation fault established. Ship spawn verified live. +Massive lag:110bots, latest33sec window21sec actionCPU, expensive routing; memory +swap2.55GB. To free server for recording paused loader0 and requested native safe +logoutall. Original1 saved /tmp/vcore-elunes-recording-loader.json. Do NOTrestore +bots during user's recording or force-remove remaining sessions. Follow safe +logout progress; no broader recovery exception. Server459746 tmux unchanged, +console /tmp/vcore-capital-portal-restart.log. Update final pending status below. +After user finishes recording, resume native safe-all and restore loader original +setting with reload config/population reload. Portal WIP below preserved. + +# COMPLETED Oct30: capital portal audit and native click support + +Authorized branch feature/clientless-player-core. Earlier changes committed +FIRST as requested:649915e575. New portal code/SQL/tests/docs remain uncommitted; +no further commit or push requested. No push performed. + +Read doc/clientless/capital-portal-audit.md for scope/results. Installed native +GOOBER/script-chain support; migration2026_10_30_01 applied idempotently, existing +operator routes preserved. Native17/17 portal clicks proved across capitals, +Dalaran and Shattrath. Three Horde first clicks were premature after staging; +retests passed. Purple return151243 needed scoped template194012 playerCast fix; +passed after SQL-only restart. Shattrath83 passed, only exact obsolete diagnostic +disable lifted. Missing native Exodar->Darnassus/Shattrath->Org spawns not invented. +Vashjir remains forbidden; Maelstrom quest transit disabled. + +Once-off user-approved14bot recovery completed, native pending0/sessions0 before +-j10 build. Build/install passed.114/114 clientless tests passed, final portal/ +seed tests rerun passed, git diff --check clean. No further recovery exception. +Latest server459746 in tmuxvcore-worldserver. Fresh ready line verified in +/tmp/vcore-capital-portal-restart.log and live process/ports8085/8087 verified. +Loader original1 RESTORED; safe-all mode resumed, config/population reloaded. +All four pools correct50/5/50/5, known110, error empty. Bots logging in gradually; +last snapshot12 generated online (3perpool), manager12. No need to wait for all +110 to finish asynchronous loading. Testactors35/36 original positions restored +and native safe logout confirmed; exact temporary profiles and19game_tele +fixtures REMOVED. Both subsequently loaded original generated profiles in logs. +Probe evidence /tmp/vcore-capital-portals-state/probe-*.json; original testprofile +manifest retained for evidence only, do not recreate or remove other profiles. + +Individual native portal transfers verified, full long-distance AdventureBot +route/gameplay acceptance remains with user. Expensive existing flight planning +can still produce multi-second world ticks; no performance changes in this task. +All future builds still require loaderpause/native safe logout zero, use-j10. + # COMPLETED Oct30: safe builds, city inheritance, native POI map/height fix Authorized branch feature/clientless-player-core, expected uncommitted work diff --git a/doc/clientless/browser-and-pvp.md b/doc/clientless/browser-and-pvp.md new file mode 100644 index 0000000000..3018a816dc --- /dev/null +++ b/doc/clientless/browser-and-pvp.md @@ -0,0 +1,139 @@ +# AdventureBot-Gruppen, Browser und PvP + +Stand: Implementierung gebaut (-j10), alle120Clientless-Tests erfolgreich; noch nicht installiert/live abgenommen. +Dungeon-, Raid- und PvP-Intents verwenden die bestehenden Tagespläne. `pvp` ist +neu und wird bei der Profilerzeugung als gewichtete Aktivitätspräferenz angeboten. +Bestehende Profile können `activity_affinity.pvp` ausdrücklich setzen; sonst gilt +im Planer ein kleiner, durch Aggression gewichteter Standardwert. + +## Abreise und Rollen + +Dungeon-/Raidbesuche starten selbstständig erst mit vollständiger geeigneter +Gruppe. Dungeonrollen:1Tank,1Heiler,3DD. Raidrollen richten sich nach der +bestehenden Zielkapazität: bis10Mitglieder2/2/6,20Mitglieder2/4/14, +25Mitglieder2/6/17. Die bereits vorhandenen Kapazitätsgrenzen der Locations +bleiben maßgeblich. Profile legen Botrollen fest, Spielerrollen werden aus +vorhandenen Gruppenrollen beziehungsweise ihrer Spezialisierung ermittelt. + +Die erste tatsächliche Abreise gibt die gesamte Botgruppe für den laufenden +Intent frei. Spätere Austritte und Rollenlücken stoppen diese Reise nicht und +lösen keinen Browserwechsel aus. Gespeicherte laufende Instanzbesuche werden +weiterhin wiederaufgenommen. Spielergeführte Gruppen folgen ihrem Spieler; +Bots melden diese Gruppen nicht eigenmächtig an. + +Unvollständige Botgruppen und einzelne Bots warten am aktuellen Ort und melden +sich bei zulässigem Browser an. Native Prüfungen für Level, Erweiterung, +Gegenstandsstufe, Zugänge, Sperren, Rollen und Accountrechte bleiben erhalten. +Die lokalen Cataclysm-DBC-Daten enthalten die Drachenseele-Flügel416/417 als +Stufe85-Angebote mit2Tanks,6Heilern und17DDs. Ihr TypeID ist1 (Dungeon), die Karte +ist jedoch ein Raid. Die Botregeln unterscheiden deshalb anhand der tatsächlichen +Karte; sie behandeln diese Angebote nicht versehentlich als Fünfer-Dungeons. +Die native Anmeldung dieser Type1-Flügel nutzt die vorhandene Dungeonfinder- +Berechtigung, nicht den separaten Legacy-Raidbrowser-Schalter. Der Bot-Schalter +für Raidbeitritt bleibt trotzdem anhand der tatsächlichen Raidkarte wirksam. +`DungeonFinder.OptionsMask` wurde nicht verändert. +Die Browserwahl verwendet zugängliche Angebote, nicht zwangsläufig das vorher +im Tagesplan ausgewählte Reiseziel. Rolle und Angebot werden nativ bestätigt; +Vermittlung und Teleport bleiben Aufgaben des vorhandenen Cores. + +## Schalter + +| Konfiguration | Standard | +|---|---:| +|Clientless.Browser.Dungeon.QueueEnabled|1| +|Clientless.Browser.Dungeon.JoinEnabled|1| +|Clientless.Browser.Raid.QueueEnabled|1| +|Clientless.Browser.Raid.JoinEnabled|0| +|Clientless.Browser.Battleground.QueueEnabled|1| +|Clientless.Browser.Battleground.JoinEnabled|0| +|Clientless.Browser.AllowBotOnlyTests|0| + +`QueueEnabled` erlaubt das Anmelden. `JoinEnabled` erlaubt es, Bots tatsächlich +in eine vermittelte Besetzung aufzunehmen. Bei abgeschaltetem Beitritt bleiben +sie in der Suche, werden aber nicht in Angebote für Spieler eingerechnet und +reservieren keine Plätze in startenden Partien. + +Im Normalbetrieb braucht jede vermittelte Besetzung mindestens einen echten, +verbundenen Spieler. Ein nach Verbindungsabbruch noch vorhandener Registereintrag +reicht nicht: Die Realm-Verbindung muss offen sein. Die zweite Verbindung darf +beim regulären Instanztransfer wechseln. Eine beliebige Person in einer anderen Warteschlange zählt +nicht. Prüfung erfolgt vor dem Angebot und vor dem Beitritt erneut. LFG-Gruppen +mit Bots erhalten einen echten Spieler als Anführer. Reine Botbesetzungen sind +nur mit `AllowBotOnlyTests=1` möglich; zusätzlich müssen Queue und Join für den +jeweiligen Browser aktiviert sein. Diese Testausnahme ersetzt weder Mindestgrößen +noch native Zugangsvoraussetzungen. Vorhandene Low-Population-Regeln des Servers +bleiben davon getrennt. Gruppen ohne Clientless-Teilnehmer behalten ihren Ablauf. + +Die Regeln sind generische CPC-Admission-Regeln. DungeonFinding und Battlegrounds +hängen dafür nicht vom AdventureBot-System ab. Die Adventure-KI wählt lediglich +Anmeldungen und Rollen. Keine zusätzlichen externen Dienste oder Netzwerkschnittstellen. + +## PvP + +Ein PvP-Block mit Hauptstadtslocation bedeutet direkte Schlachtfeldsuche. +Welt-PvP-Ziele kommen aus zulässigen Gebietslocations von TolBarad/TolBarad-Halbinsel, +Höllenfeuerhalbinsel, Zangarmarschen, Nagrand und den Wäldern von Terokkar. +Gebietskatalog, Fraktion, tatsächliches Mindestlevel und Fluganforderungen gelten +auch hier. Für Welt-PvP genügt eine geeignete Gruppe ab zwei Mitgliedern; fehlen +Mitglieder, geht der Bot stattdessen in die Schlachtfeldsuche. Diese läuft über +die nativen normalen Schlachtfelder, nicht über Arena oder gewertetes PvP. +UnterStufe45 wird Kriegshymnenschlucht angefragt, danach ein zufälliges Schlachtfeld; +unterStufe10 erfolgt keine Anmeldung und kein neu generierter PvP-Block. +Bei Schlachtfeld-Gruppensuche werden die nativen Levelbereiche der gewünschten +Schlachtfeldvorlage verglichen, einschließlich der Mindeststufe für Zufallssuche. Die nativen Prüfungen entscheiden endgültig. + +Derzeit geht es um Anmeldung und Beitritt. Spezifische Quest-, Flaggenträger-, +Basen- und Bossmechaniken sind damit nicht implementiert. Welt-PvP benutzt zunächst +vorhandene Erkundungsaktionen und die bisherigen persönlichkeitsabhängigen +PvP-Angriffsregeln. Schlachtfeld-/Raidbeitritt ist daher standardmäßig gesperrt. + +## Gruppen zusammenführen + +Während der Gruppenbildung steigt die Wechselbereitschaft mit der verstrichenen +Zeit. Größere passende Botgruppen werden bevorzugt. Auch Mitglieder kleinerer +unvollständiger Botgruppen können wechseln, insbesondere um einen offenen +Rollenplatz zu besetzen. Offene Einladungen reservieren bereits Rollenplätze; +die eigene Reservierung verhindert nicht die Annahme. Überzählige Rollen aus +falsch besetzten Gruppen dürfen auch in kleinere passende Gruppen wechseln, +und das Vervollständigen einer zulässigen Gruppe hat Vorrang. Bereits abgereiste +Anführer schützen auch Mitglieder, deren persönlicher Plan noch Gruppenbildung +anzeigt. Ziel und Voraussetzungen der aufnehmenden Gruppe gelten. +Die native Einladung/Annahme erfolgt im Worldthread; bei Ablehnung wird die +ursprüngliche Gruppe soweit möglich wiederhergestellt.120Sekunden Wechselpause +und eine eindeutige Rangfolge gleich großer Gruppen verhindern Pendeln. +Spielergeführte Gruppen, volle passende Gruppen, laufende Reisen und bereits +laufende Browsergruppen werden nicht automatisch umverteilt. Die feste +Sammelfrist am Stundenende wird nicht verlängert. + +## Validierung und Betrieb + +Vor jedem Build Loader/Testannahme pausieren und sicheren Logout abwarten. +Während der laufenden Schiffsaufzeichnung darf bei verbleibenden Bots auch nach +fünfMinuten kein Shutdown erzwungen werden: Build dann zurückstellen. Installation +und Neustart erst nach Freigabe für die Aufzeichnung. Zugehörige Tests: +`test_browser_admission.py`, `test_group_role_composition.py`, +`test_adventure_instance_begin.py`, `test_adventure_groups.py`, +`test_browser_participants.py`, `test_browser_match_order.py`, +`test_browser_bg_brackets.py`. Rollenabfragen werden außerhalb der Versorgungs- +und Kampfaktionen beantwortet, nur solange die native Abfrage noch offen ist. +Alle120Clientless-Testskripte wurden ausgeführt und bestanden. Sechs ältere +Adapter benötigten die neuen Zustandsfelder/Schnittstellen; zusätzliche Assertions +prüfen PvP-Persistenz, Browser-Wartephasen, Wiederaufnahme begonnener Reisen und +AFK-Schutz während der Suche. Der vollständige CMake-Build und der abschließende +inkrementelle Build liefen mit-j10 erfolgreich durch. Beide Config-Dateien wurden +auf die vereinbarten Browserwerte geprüft. Details und Logs: +`doc/clientless/checkpoints/2026-10-31-browser/validation-status.json` und +`regression/final-summary.json`. Der vorherige114/120-Lauf samt Fehlerlogs ist +als Diagnose erhalten; die behobenen Fälle wurden gezielt erneut ausgeführt. + +Der Testserver war nach dem externen Umgebungsneustart bereits offline. Es wurden +keine Bots für den Build zwangsausgeloggt, keine laufenden Transporte unterbrochen +und kein Server durch diesen Arbeitslauf gestoppt. Loader und TestBot-Ausführung +bleiben pausiert (Config0/0); ursprünglicher TestBot-Wert1 ist in +`resumed-build-state.json` gespeichert. Installation/Start erst nach Freigabe. +Vor dem nächsten zulässigen Start die sieben zuletzt verbliebenen Bots anhand +`restart-recovery-needed.json` für Zustandsprüfungen vorsehen. + +Diese Tests prüfen Regeln und echte extrahierte Produktionsfunktionen mit +Adaptern. Ein tatsächlicher Browser-Beitritt mit echten Spielern und die visuelle +Abnahme stehen aus. Es wurde weder installiert noch ein Worldserver gestartet. diff --git a/doc/clientless/build-recovery-2026-10-30.md b/doc/clientless/build-recovery-2026-10-30.md new file mode 100644 index 0000000000..a62eb06738 --- /dev/null +++ b/doc/clientless/build-recovery-2026-10-30.md @@ -0,0 +1,42 @@ +# Build-Bergung am 30.10.2026 + +Loader seit etwa15:44 pausiert, sicherer Logout seit derselben Phase angefordert. +Snapshot nach17:09; Fünf-Minuten-Frist damit deutlich überschritten. +Regulärer Server-Shutdown vor dem Build; keine Einzel-Logouts erzwungen. + +| GUID | Bot | Fraktion | Karte | Position X/Y/Z | Flugstatus vor Shutdown | +|---:|---|---|---:|---|---| +| 43 | Fizzira | Allianz | 530 | -267.066 / 3215.06 / 66.1018 | Failed | +| 46 | Selthas | Horde | 571 | 3975.16 / 6846.42 / 204.755 | Failed | +| 53 | Noranda | Allianz | 530 | -3103 / 2595 / 62.9246 | Arrived | +| 84 | Brynli | Allianz | 530 | 3471.56 / 5253.22 / 150.785 | Failed | +| 91 | Norara | Horde | 0 | 1805 / 327 / 94.8042 | Failed | +| 101 | Korutam | Horde | 1 | 1655.55 / -4313.52 / 78.9182 | Failed | +| 104 | Lillini | Allianz | 0 | -8893.24 / 691.307 / 127.343 | Failed | +| 118 | Lillina | Allianz | 1 | 5391.2 / -3378.67 / 1649.72 | Failed | + +Sieben Failed-Flugzustände, Noranda mit Arrived. Letzter Sammelstatus: +8Sessions,1Kampf,7Flug,0Transport,0Ladevorgänge. Kein Bot mit gespeichertem +Transportpassagier oder Taxipfad. Details/Positionen sind unter +`/tmp/vcore-recorder-5yd-recovery/` gesichert. + +## Nachprüfung + +Build mit `-j10`, Installation und Transport-Regressionstest bestanden. +Neustart PID471677; frische Ready-Meldung, Prozess und Ports8085/8087 geprüft. + +Alle8Bots nach Login geprüft, einschließlich tatsächlicher Fuß-/Bodenhöhe. +Fizzira, Selthas, Brynli, Norara, Korutam und Lillini schwebten nach Neustart +weiter über dem Boden, obwohl das Flugkennzeichen teilweise verschwunden war. +Native Teleports nach Sturmwind bzw.Orgrimmar bestätigt. Noranda stand auf +festem Boden, blieb aber im Kampf und blockierte weiter den sicheren Logout; +ebenfalls nativ nach Sturmwind zurückgesetzt. Lillina stand auf gültigem Boden +und konnte ohne Bergung sicher ausloggen. + +Endstand: alle8offline, keine gespeicherten Transportbindungen oder Taxipfade. +Sieben Hauptstadtpositionen in `final.tsv` bestätigt. Temporäre reine +Prüfprofile entfernt; ursprüngliche generierte Profile unverändert erhalten. +Loader bleibt0 wegen laufender Routenaufzeichnung; Originalwert1 liegt unter +`/tmp/vcore-elunes-recording-loader.json`. Sicherer Logout bleibt angefordert, +bis die Aufzeichnung beendet ist. Recorder-Startentfernung5Yards jetzt live. +Kein neuer Commit oder Push. diff --git a/doc/clientless/capital-portal-audit.md b/doc/clientless/capital-portal-audit.md new file mode 100644 index 0000000000..70675959ac --- /dev/null +++ b/doc/clientless/capital-portal-audit.md @@ -0,0 +1,92 @@ +# Hauptstadt-Portale: Untersuchung vom 30.10.2026 + +Vorherige abgeschlossene Änderungen lokal als `649915e575` committed, kein Push. + +## Direkt ergänzte Verbindungen im laufenden Graphen + +Über den vorhandenen nativen Import erfolgreich registriert: + +| Ort | Spawn | Verbindung | +|---|---:|---| +| Eisenschmiede |217855|Verwüstete Lande| +| Darnassus |219119|Verwüstete Lande| +| Exodar |151163|Verwüstete Lande| +| Darnassus |219120|Exodar| +| Unterstadt |203251|Verwüstete Lande| +| Donnerfels |214456|Verwüstete Lande| +| Silbermond |151162|Verwüstete Lande| +| Dalaran |56568|Orgrimmar| +| Dalaran |61217|Sturmwind| +| Dalaran |57634|Höhlen der Zeit| +| Dalaran |60709|Purpursalon| +| Dalaran |151243|Violette Zitadelle| + +Sturmwind und Orgrimmar besitzen bereits ihre Cata-Portale und Verbindungen zu den +Verwüsteten Landen. Doppelte vorhandene Spawnpositionen werden getrennt geprüft; +keine vorhandenen Koordinaten oder manuell deaktivierten Kanten überschrieben. +Vashj'ir bleibt durch den Gebietskatalog gesperrt. + +## Installierte Unterstützung nativer Klickportale + +Die Translokationskugeln Silbermond12608/Unterstadt203457 sind GOOBER(type10), +keine SPELLCASTER(type22). Native Spellskripte35376→25649 bzw35727→35730 +lassen den Besucher den eigentlichen Teleport auf sich selbst wirken. Shattraths +Portal zur Insel Quel'Danas47196 hat eine entsprechende Skriptkette44876→44870. +Dalarans Wintergrasp-Portal61496 nutzt einen festen nativen Skript-Teleport. + +Der Resolver akzeptiert deshalb zusätzlich harmlose Goober ohne Quest, Event, +Gossip, Schloss, Verbrauch oder gekoppelte Falle. Aufgelöst werden ausschließlich +feste native DB-Ziele, einzelne Besucher-Selbstcasts oder einzelne feste native +Teleportaktionen; keine beliebigen Skripte oder geratenen Zielpositionen. +Zyklen, mehrere Aktionen, andere Zielrollen und zu lange Verzögerungen bleiben +abgewiesen. Tatsächliche Benutzung weiterhin über normalen GameObject-Click, +native Bedingungen, Sichtbarkeit, Phase, Reichweite und Teleport-ACK. +Voraussetzungen aller aufgelösten Zauber werden vor der Routenplanung geprüft. + +Neue reproduzierbare Migration: +`sql/custom/world/2026_10_30_01_capital_click_portals.sql` (angewendet und auf Idempotenz geprüft). +Sie erhält vorhandene Positionen, Kosten, Sperren und manuelle Fraktionsmasken. +Maelstrom-Questportale erhalten sichtbare Nodes, aber keine aktive gewöhnliche +Transitkante. Nicht gespawnte Exodar→Darnassus- und Shattrath→Orgrimmar-Templates +werden nicht als künstliche Portale erzeugt. + +Shattraths Sturmwind-Kante1752 wurde nach erfolgreichem nativen Klicktest von +ihrer überholten LOS-Testsperre befreit. Die Migration trifft ausschließlich die +Kante mit genau diesem alten Diagnosekommentar. Sonstige Sperren bleiben erhalten. +Das Rückportal Purpursalon→Violette Zitadelle benötigte ebenfalls den öffentlichen +Player-Cast-Modus; ausschließlich Template194012/Spell61420 wurde korrigiert. + +Zusätzlich ergänzt: Dalarans Brunnen-Portal (AreaTrigger5273), dessen Position +aus den lokalen Cataclysm-DBC und dessen Ziel aus der nativen DB stammen. + +## Prüfung + +Build mit `-j10` erfolgreich; nach sauberem Herunterfahren installiert. Beide +Neustarts erreichten frisch `(worldserver-daemon) ready...`; Prozess und Ports +8085/8087 geprüft. Alle114 Clientless-Tests bestanden. Resolver-/Executor-/ACK- +Tests und SQL-Fixtures nach den letzten SQL-Anpassungen erneut bestanden. +`git diff --check` sauber. Die SQL-Fixtures prüfen unter anderem native direkte +und Skriptziele, Fraktionsmasken, Spawn-Entry-Zuordnung, Quest-Sperren, Idempotenz, +den gezielten Player-Cast-Fix und Erhalt manueller Positionen/Kosten/Sperren. + +Alle17 untersuchten Portalspawns wurden mit normalen, passend gelevelten Bots +über den nativen GameObject-Klick erfolgreich benutzt: +217855,203251,219119,151163,214456,151162,219120,12608,203457,56568,61217, +57634,60709,151243,61496,83,47196. +Prüfung erfolgte durch Vergleich des tatsächlich gespeicherten Karten-/XYZ-Ziels +mit dem nativen Portalziel. Adminteleports dienten nur dem Aufstellen an der +Quelle. Drei erste Horde-Versuche schlugen bei zu frühem Klick nach dem +Aufstellen fehl; Wiederholungen nach Abschluss des Transfers waren erfolgreich. +Das Purpursalon-Rückportal bestand nach dem gezielten Player-Cast-Fix. +Nachweise unter `/tmp/vcore-capital-portals-state/probe-*.json`. +Dies bestätigt einzelne native Portalbenutzungen, keine vollständige Langzeit- +Abnahme sämtlicher AdventureBot-Reisen durch die neuen Kanten. + +Die14 zuvor blockierten Bots wurden mit expliziter einmaliger Nutzerfreigabe +geborgen und anschließend nativ sicher ausgeloggt. Vor dem Build waren +pending=0/sessions=0 bestätigt. Daraus folgt keine weitere Ausnahme von der +Build-Regel. Temporäre Testprofile und19Teleportmarken wurden entfernt, ursprüngliche +Positionen wiederhergestellt und beide Testbots sicher ausgeloggt. Loaderwert1 +ist wiederhergestellt; alle vier Zielpools50/5/50/5 werden schrittweise geladen. +Letzte Statusprüfung: known110,12online (3jePool), kein Loaderfehler; beide +Testbots verwenden wieder ihre ursprünglichen generierten Profile. diff --git a/doc/clientless/checkpoints/2026-10-30-testbots/results.json b/doc/clientless/checkpoints/2026-10-30-testbots/results.json new file mode 100644 index 0000000000..c162b34056 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-30-testbots/results.json @@ -0,0 +1,670 @@ +[ + { + "schema": 1, + "run_id": "await_deadline", + "state": "failed", + "started_unix_ms": 1793382399289, + "elapsed_ms": 213, + "checks": 0, + "failures": 0, + "error": "[string \"...\"]:5: expected await timeout", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "boot_interrupted", + "state": "interrupted", + "started_unix_ms": 1793382365548, + "elapsed_ms": 0, + "checks": 0, + "failures": 0, + "error": "worldserver restarted during test", + "bots": [], + "events": [ + { + "previous_result": "{\"run_id\":\"boot_interrupted\",\"state\":\"running\",\"bots\":[]}" + } + ] + }, + { + "schema": 1, + "run_id": "cancel_case", + "state": "cancelled", + "started_unix_ms": 1793382403290, + "elapsed_ms": 25, + "checks": 0, + "failures": 0, + "error": "cancelled by operator", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "cli_ingress", + "state": "passed", + "started_unix_ms": 1793382404290, + "elapsed_ms": 0, + "checks": 1, + "failures": 0, + "error": "", + "bots": [], + "events": [ + { + "check": "base64 ingress", + "passed": true + } + ] + }, + { + "schema": 1, + "run_id": "deadline_enforced", + "state": "timed_out", + "started_unix_ms": 1793383186683, + "elapsed_ms": 1000, + "checks": 0, + "failures": 0, + "error": "configured run deadline exceeded", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "false_assertion", + "state": "failed", + "started_unix_ms": 1793382394281, + "elapsed_ms": 0, + "checks": 1, + "failures": 1, + "error": "", + "bots": [], + "events": [ + { + "check": "expected failure", + "passed": false + } + ] + }, + { + "schema": 1, + "run_id": "foreign_character", + "state": "failed", + "started_unix_ms": 1793382396286, + "elapsed_ms": 0, + "checks": 0, + "failures": 0, + "error": "[string \"...\"]:10: not a registered test character; create it with testbot.create first", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "instruction_limit", + "state": "failed", + "started_unix_ms": 1793382397286, + "elapsed_ms": 1, + "checks": 0, + "failures": 0, + "error": "Lua instruction budget exceeded; yield with testbot.wait/await", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "lua_smoke", + "state": "passed", + "started_unix_ms": 1793382393281, + "elapsed_ms": 0, + "checks": 1, + "failures": 0, + "error": "", + "bots": [], + "events": [ + { + "check": "bridge", + "passed": true + }, + { + "label": "snapshot", + "value": { + "number": 42, + "text": "hello", + "flag": true + } + } + ] + }, + { + "schema": 1, + "run_id": "memory_limit", + "state": "failed", + "started_unix_ms": 1793382398286, + "elapsed_ms": 0, + "checks": 0, + "failures": 0, + "error": "not enough memory", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "native_fresh_fullquest", + "state": "passed", + "started_unix_ms": 1793383140559, + "elapsed_ms": 30614, + "checks": 3, + "failures": 0, + "error": "", + "bots": [ + 149 + ], + "events": [ + { + "check": "native primary stat preparation", + "passed": true + }, + { + "label": "encounter_1", + "value": { + "spawn": 279820, + "count": 1 + } + }, + { + "label": "encounter_2", + "value": { + "spawn": 279823, + "count": 2 + } + }, + { + "label": "encounter_3", + "value": { + "spawn": 279825, + "count": 3 + } + }, + { + "label": "target_timeout", + "value": { + "alive": true, + "health": 42, + "x": -8917.34765625, + "y": -285.6582336425781, + "z": 77.41757202148438, + "distance": 9.950993537902832 + } + }, + { + "label": "encounter_4", + "value": { + "spawn": 279827, + "count": 3 + } + }, + { + "label": "encounter_5", + "value": { + "spawn": 279828, + "count": 4 + } + }, + { + "label": "encounter_6", + "value": { + "spawn": 279829, + "count": 5 + } + }, + { + "label": "encounter_7", + "value": { + "spawn": 279878, + "count": 6 + } + }, + { + "check": "quest completed through native kill credits", + "passed": true + }, + { + "check": "quest rewarded by native handler", + "passed": true + }, + { + "label": "final", + "value": { + "power": 997, + "agility": 26, + "level": 10, + "y": -138, + "z": 80.9000015258789, + "alive": 1, + "strength": 1000000, + "transport": 0, + "map": 0, + "combat": 0, + "guid": 149, + "spirit": 24, + "moving": 0, + "x": -8912, + "max_power": 1000, + "health": 100000, + "intellect": 21, + "max_health": 100000, + "stamina": 31 + } + } + ] + }, + { + "schema": 1, + "run_id": "native_full_quest", + "state": "failed", + "started_unix_ms": 1793382935570, + "elapsed_ms": 18652, + "checks": 1, + "failures": 0, + "error": "[string \"...\"]:5: native melee kill", + "bots": [ + 148 + ], + "events": [ + { + "check": "native primary stat preparation", + "passed": true + }, + { + "label": "kill_1", + "value": { + "count": 1, + "spawn": 279754 + } + }, + { + "label": "kill_2", + "value": { + "count": 2, + "spawn": 279761 + } + } + ] + }, + { + "schema": 1, + "run_id": "native_full_quest_follow", + "state": "passed", + "started_unix_ms": 1793383029984, + "elapsed_ms": 21135, + "checks": 3, + "failures": 0, + "error": "", + "bots": [ + 148 + ], + "events": [ + { + "check": "native primary stat preparation", + "passed": true + }, + { + "label": "encounter_1", + "value": { + "spawn": 279778, + "count": 3 + } + }, + { + "label": "encounter_2", + "value": { + "spawn": 279812, + "count": 4 + } + }, + { + "label": "encounter_3", + "value": { + "spawn": 279817, + "count": 5 + } + }, + { + "label": "encounter_4", + "value": { + "spawn": 279819, + "count": 6 + } + }, + { + "check": "quest completed through native kill credits", + "passed": true + }, + { + "check": "quest rewarded by native handler", + "passed": true + }, + { + "label": "final", + "value": { + "map": 0, + "max_power": 1000, + "agility": 36, + "max_health": 100000, + "health": 100000, + "transport": 0, + "stamina": 31, + "alive": 1, + "moving": 0, + "z": 80.9000015258789, + "level": 10, + "y": -138, + "combat": 0, + "x": -8912, + "power": 997, + "strength": 1000010, + "guid": 148, + "spirit": 24, + "intellect": 21 + } + } + ] + }, + { + "schema": 1, + "run_id": "native_quest_accept", + "state": "failed", + "started_unix_ms": 1793382405290, + "elapsed_ms": 11286, + "checks": 0, + "failures": 0, + "error": "[string \"...\"]:5: quest accepted", + "bots": [ + 148 + ], + "events": [ + { + "label": "initial", + "value": { + "max_health": 5000, + "z": 80.9000015258789, + "level": 1, + "power": 0, + "transport": 0, + "alive": 1, + "y": -138, + "guid": 148, + "max_power": 1000, + "x": -8912, + "combat": 0, + "health": 5000, + "map": 0, + "moving": 0 + } + } + ] + }, + { + "schema": 1, + "run_id": "native_quest_replay", + "state": "passed", + "started_unix_ms": 1793382526677, + "elapsed_ms": 274, + "checks": 3, + "failures": 0, + "error": "", + "bots": [ + 148 + ], + "events": [ + { + "check": "native abandon", + "passed": true + }, + { + "check": "mage-only quest rejected for warrior", + "passed": true + }, + { + "check": "native warrior quest accepted again", + "passed": true + } + ] + }, + { + "schema": 1, + "run_id": "native_quest_warrior", + "state": "passed", + "started_unix_ms": 1793382479623, + "elapsed_ms": 294, + "checks": 1, + "failures": 0, + "error": "", + "bots": [ + 148 + ], + "events": [ + { + "label": "initial", + "value": { + "power": 0, + "max_power": 1000, + "x": -8912, + "map": 0, + "alive": 1, + "moving": 0, + "max_health": 5000, + "y": -138, + "guid": 148, + "combat": 0, + "transport": 0, + "z": 80.9000015258789, + "health": 5000, + "level": 1 + } + }, + { + "check": "native quest acceptance: INCOMPLETE", + "passed": true + }, + { + "label": "quest_objectives", + "value": { + "1": 0, + "2": 0, + "3": 0, + "4": 0 + } + }, + { + "label": "final", + "value": { + "power": 0, + "max_power": 1000, + "x": -8912, + "map": 0, + "alive": 1, + "moving": 0, + "max_health": 5000, + "y": -138, + "guid": 148, + "combat": 0, + "transport": 0, + "z": 80.9000015258789, + "health": 5000, + "level": 1 + } + } + ] + }, + { + "schema": 1, + "run_id": "paused_admission", + "state": "passed", + "started_unix_ms": 1793383175649, + "elapsed_ms": 0, + "checks": 1, + "failures": 0, + "error": "", + "bots": [], + "events": [ + { + "check": "pause and resume", + "passed": true + } + ] + }, + { + "schema": 1, + "run_id": "prepare_and_move", + "state": "passed", + "started_unix_ms": 1793382523637, + "elapsed_ms": 488, + "checks": 5, + "failures": 0, + "error": "", + "bots": [ + 148 + ], + "events": [ + { + "check": "provided inventory", + "passed": true + }, + { + "check": "level preparation", + "passed": true + }, + { + "check": "health preparation", + "passed": true + }, + { + "label": "battle_shout_result", + "value": 255 + }, + { + "check": "normal learned spell cast", + "passed": true + }, + { + "label": "after_movement", + "value": { + "level": 10, + "combat": 0, + "y": -138, + "z": 81.68343353271484, + "guid": 148, + "map": 0, + "power": 1000, + "health": 5000, + "transport": 0, + "x": -8910, + "moving": 0, + "alive": 1, + "max_power": 1000, + "max_health": 5000 + } + }, + { + "check": "MMAP movement completed", + "passed": true + } + ] + }, + { + "schema": 1, + "run_id": "runtime_failure", + "state": "failed", + "started_unix_ms": 1793382395281, + "elapsed_ms": 0, + "checks": 0, + "failures": 0, + "error": "...server/server/debug/testbots/archive/runtime_failure.lua:1: expected runtime failure", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "state_isolation", + "state": "passed", + "started_unix_ms": 1793382401290, + "elapsed_ms": 0, + "checks": 1, + "failures": 0, + "error": "", + "bots": [], + "events": [ + { + "check": "isolated globals", + "passed": true + } + ] + }, + { + "schema": 1, + "run_id": "state_writer", + "state": "passed", + "started_unix_ms": 1793382400290, + "elapsed_ms": 0, + "checks": 1, + "failures": 0, + "error": "", + "bots": [], + "events": [ + { + "check": "writer", + "passed": true + } + ] + }, + { + "schema": 1, + "run_id": "syntax_failure", + "state": "failed", + "started_unix_ms": 1793382402291, + "elapsed_ms": 0, + "checks": 0, + "failures": 0, + "error": "..._server/server/debug/testbots/archive/syntax_failure.lua:1: syntax error near 'is'", + "bots": [], + "events": [] + }, + { + "schema": 1, + "run_id": "unrestricted_travel", + "state": "passed", + "started_unix_ms": 1793382524639, + "elapsed_ms": 1097, + "checks": 1, + "failures": 0, + "error": "", + "bots": [ + 148 + ], + "events": [ + { + "label": "low_level_northrend", + "value": { + "moving": 0, + "health": 60, + "power": 1000, + "combat": 0, + "y": 835.5360107421875, + "max_power": 1000, + "guid": 148, + "z": 680.3350219726562, + "x": 5820.18017578125, + "alive": 1, + "transport": 0, + "map": 571, + "level": 1, + "max_health": 60 + } + }, + { + "check": "testbot bypasses Adventure area/flight restrictions", + "passed": true + } + ] + } +] \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/browser-build-2026-10-31.log b/doc/clientless/checkpoints/2026-10-31-browser/browser-build-2026-10-31.log new file mode 100644 index 0000000000..96579dd2f3 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/browser-build-2026-10-31.log @@ -0,0 +1,1080 @@ +[1/1053] cd /home/wow_admin/wow_cata_server/source/TrinityCore && /usr/bin/cmake -DBUILDDIR="/home/wow_admin/wow_cata_server/build/debug" -P /home/wow_admin/wow_cata_server/source/TrinityCore/cmake/genrev.cmake /home/wow_admin/wow_cata_server/build/debug +[2/1053] Building CXX object src/server/worldserver/CMakeFiles/worldserver.dir/Main.cpp.o +[3/1053] Building CXX object src/server/game/CMakeFiles/game.dir/cmake_pch.hxx.gch +[4/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/ReactorAI.cpp.o +[5/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/PassiveAI.cpp.o +[6/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/GameObjectAI.cpp.o +[7/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/GuardAI.cpp.o +[8/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CreatureAIRegistry.cpp.o +[9/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CreatureAISelector.cpp.o +[10/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/CombatAI.cpp.o +[11/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CreatureAI.cpp.o +[12/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/PetAI.cpp.o +[13/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/ScheduledChangeAI.cpp.o +[14/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/TotemAI.cpp.o +[15/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/CoreAI/UnitAI.cpp.o +[16/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/PlayerAI/PlayerAI.cpp.o +[17/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/ScriptedAI/ScriptedGossip.cpp.o +[18/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/ScriptedAI/ScriptedFollowerAI.cpp.o +[19/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/ScriptedAI/ScriptedEscortAI.cpp.o +[20/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/ScriptedAI/ScriptedCreature.cpp.o +[21/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/cmake_pch.hxx.gch +[22/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/SmartScripts/SmartAI.cpp.o +[23/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Accounts/RBAC.cpp.o +[24/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Accounts/AccountMgr.cpp.o +[25/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Addons/AddonMgr.cpp.o +[26/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AuctionHouseBot/AuctionHouseBot.cpp.o +[27/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AuctionHouseBot/AuctionHouseBotBuyer.cpp.o +[28/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/SmartScripts/SmartScriptMgr.cpp.o +[29/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AuctionHouse/AuctionHouseMgr.cpp.o +[30/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AuctionHouseBot/AuctionHouseBotSeller.cpp.o +[31/1053] Building CXX object src/server/game/CMakeFiles/game.dir/AI/SmartScripts/SmartScript.cpp.o +[32/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlefield/BattlefieldMgr.cpp.o +[33/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Arena.cpp.o +[34/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlefield/Battlefield.cpp.o +[35/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/ArenaTeamMgr.cpp.o +[36/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/ArenaTeam.cpp.o +[37/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Achievements/AchievementMgr.cpp.o +[38/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundBE.cpp.o +[39/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundAB.cpp.o +[40/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundDS.cpp.o +[41/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundBFG.cpp.o +[42/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Battleground.cpp.o +[43/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/BattlegroundQueue.cpp.o +[44/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundAV.cpp.o +[45/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/BattlegroundMgr.cpp.o +[46/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundEY.cpp.o +[47/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundIC.cpp.o +[48/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundNA.cpp.o +[49/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundRL.cpp.o +[50/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundRV.cpp.o +[51/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundSA.cpp.o +[52/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundWS.cpp.o +[53/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Battlegrounds/Zones/BattlegroundTP.cpp.o +[54/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Cache/CharacterCache.cpp.o +[55/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Calendar/CalendarMgr.cpp.o +[56/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Chat/Channels/ChannelMgr.cpp.o +[57/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Chat/ChatLink.cpp.o +[58/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Chat/ChatCommands/ChatCommandHyperlinks.cpp.o +[59/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Combat/CombatManager.cpp.o +[60/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Chat/Chat.cpp.o +[61/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Chat/ChatCommands/ChatCommandArgs.cpp.o +[62/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Chat/Channels/Channel.cpp.o +[63/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Combat/ThreatManager.cpp.o +[64/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DataStores/GameTables.cpp.o +[65/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DataStores/DB2Stores.cpp.o +[66/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DungeonFinding/LFGGroupData.cpp.o +[67/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DungeonFinding/LFG.cpp.o +[68/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Conditions/DisableMgr.cpp.o +[69/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DataStores/M2Stores.cpp.o +[70/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DungeonFinding/LFGPlayerData.cpp.o +[71/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Conditions/ConditionMgr.cpp.o +[72/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DungeonFinding/LFGScripts.cpp.o +[73/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/AreaTrigger/AreaTrigger.cpp.o +[74/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Corpse/Corpse.cpp.o +[75/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DungeonFinding/LFGQueue.cpp.o +[76/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Creature/CreatureGroups.cpp.o +[77/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Creature/Trainer.cpp.o +[78/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Creature/TemporarySummon.cpp.o +[79/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Creature/GossipDef.cpp.o +[80/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DungeonFinding/LFGMgr.cpp.o +[81/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/DynamicObject/DynamicObject.cpp.o +[82/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Item/ItemTemplate.cpp.o +[83/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Item/Item.cpp.o +[84/1053] Building CXX object src/server/game/CMakeFiles/game.dir/DataStores/DBCStores.cpp.o +[85/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Creature/Creature.cpp.o +[86/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Object/MovementInfo.cpp.o +[87/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Item/ItemEnchantmentMgr.cpp.o +[88/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Item/Container/Bag.cpp.o +[89/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Object/ObjectPosSelector.cpp.o +[90/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Object/ObjectGuid.cpp.o +[91/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Object/Position.cpp.o +[92/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Object/Updates/UpdateData.cpp.o +[93/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Object/Updates/UpdateFieldFlags.cpp.o +[94/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Player/CinematicMgr.cpp.o +[95/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/GameObject/GameObject.cpp.o +[96/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Player/KillRewarder.cpp.o +[97/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Player/TradeData.cpp.o +[98/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Player/PlayerTaxi.cpp.o +[99/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Player/SocialMgr.cpp.o +[100/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Totem/Totem.cpp.o +[101/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Unit/CharmInfo.cpp.o +[102/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Pet/Pet.cpp.o +[103/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Object/Object.cpp.o +[104/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Unit/Stats.cpp.o +[105/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Events/GameEventSender.cpp.o +[106/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Unit/StatSystem.cpp.o +[107/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Transport/Transport.cpp.o +[108/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Globals/ObjectAccessor.cpp.o +[109/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Vehicle/Vehicle.cpp.o +[110/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Grids/NGrid.cpp.o +[111/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Grids/GridStates.cpp.o +[112/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Grids/Notifiers/GridNotifiers.cpp.o +[113/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Grids/ObjectGridLoader.cpp.o +[114/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Groups/GroupReference.cpp.o +[115/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Events/GameEventMgr.cpp.o +[116/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Groups/GroupMgr.cpp.o +[117/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Guilds/GuildFinderMgr.cpp.o +[118/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Groups/Group.cpp.o +[119/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/ArenaTeamHandler.cpp.o +[120/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/AuthHandler.cpp.o +[121/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Guilds/GuildMgr.cpp.o +[122/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/AuctionHouseHandler.cpp.o +[123/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/BattlefieldHandler.cpp.o +[124/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/BattleGroundHandler.cpp.o +[125/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Guilds/Guild.cpp.o +[126/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/ChannelHandler.cpp.o +[127/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Unit/Unit.cpp.o +[128/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/CalendarHandler.cpp.o +[129/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/CombatHandler.cpp.o +[130/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/ChatHandler.cpp.o +[131/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/DuelHandler.cpp.o +[132/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/GroupHandler.cpp.o +[133/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/GuildFinderHandler.cpp.o +[134/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/InspectHandler.cpp.o +[135/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/GuildHandler.cpp.o +[136/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Entities/Player/Player.cpp.o +[137/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/ItemHandler.cpp.o +[138/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/LootHandler.cpp.o +[139/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/CharacterHandler.cpp.o +[140/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/LFGHandler.cpp.o +[141/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/MailHandler.cpp.o +[142/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/NPCHandler.cpp.o +[143/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/ReferAFriendHandler.cpp.o +[144/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/QueryHandler.cpp.o +[145/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/PetitionsHandler.cpp.o +[146/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/PetHandler.cpp.o +[147/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/QuestHandler.cpp.o +[148/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/SkillHandler.cpp.o +[149/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/MiscHandler.cpp.o +[150/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/SocialHandler.cpp.o +[151/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/MovementHandler.cpp.o +[152/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/TicketHandler.cpp.o +[153/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/VehicleHandler.cpp.o +[154/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/VoiceChatHandler.cpp.o +[155/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/TaxiHandler.cpp.o +[156/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/TradeHandler.cpp.o +[157/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Globals/ObjectMgr.cpp.o +[158/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/SpellHandler.cpp.o +[159/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Handlers/VoidStorageHandler.cpp.o +[160/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/AreaBoundary.cpp.o +[161/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Instances/InstanceSaveMgr.cpp.o +[162/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/GridMap.cpp.o +[163/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Loot/LootItemStorage.cpp.o +[164/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Loot/Loot.cpp.o +[165/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/MapReference.cpp.o +[166/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Mails/Mail.cpp.o +[167/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Loot/LootMgr.cpp.o +[168/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Instances/InstanceScript.cpp.o +[169/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/MapUpdater.cpp.o +[170/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/MapManager.cpp.o +[171/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/ZoneScript.cpp.o +[172/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Miscellaneous/CommonPredicates.cpp.o +[173/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/MapScripts.cpp.o +[174/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/AbstractPursuer.cpp.o +[175/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerator.cpp.o +[176/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementPacketSender.cpp.o +[177/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/TerrainMgr.cpp.o +[178/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MotionMaster.cpp.o +[179/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/ConfusedMovementGenerator.cpp.o +[180/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/ChaseMovementGenerator.cpp.o +[181/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementStructures.cpp.o +[182/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/TransportMgr.cpp.o +[183/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/FleeingMovementGenerator.cpp.o +[184/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/CyclicMovementGenerator.cpp.o +[185/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/PathGenerator.cpp.o +[186/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/IdleMovementGenerator.cpp.o +[187/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/FollowMovementGenerator.cpp.o +[188/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/GenericMovementGenerator.cpp.o +[189/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/FormationMovementGenerator.cpp.o +[190/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/HomeMovementGenerator.cpp.o +[191/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/FlightPathMovementGenerator.cpp.o +[192/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/RandomMovementGenerator.cpp.o +[193/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/PointMovementGenerator.cpp.o +[194/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Maps/Map.cpp.o +[195/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/SplineChainMovementGenerator.cpp.o +[196/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/Spline/MovementUtil.cpp.o +[197/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/Spline/MovementPacketBuilder.cpp.o +[198/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/Spline/MoveSplineInit.cpp.o +[199/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/Spline/Spline.cpp.o +[200/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/Spline/MoveSpline.cpp.o +[201/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/MovementGenerators/WaypointMovementGenerator.cpp.o +[202/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Phasing/PhaseShift.cpp.o +[203/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Movement/Waypoints/WaypointManager.cpp.o +[204/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Petitions/PetitionMgr.cpp.o +[205/1053] Building CXX object src/server/game/CMakeFiles/game.dir/OutdoorPvP/OutdoorPvP.cpp.o +[206/1053] Building CXX object src/server/game/CMakeFiles/game.dir/OutdoorPvP/OutdoorPvPMgr.cpp.o +[207/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Scripting/ScriptReloadMgr.cpp.o +[208/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Pools/QuestPools.cpp.o +[209/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Phasing/PhasingHandler.cpp.o +[210/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Quests/QuestDef.cpp.o +[211/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Reputation/ReputationMgr.cpp.o +[212/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Pools/PoolMgr.cpp.o +[213/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/GameClient.cpp.o +[214/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packet.cpp.o +[215/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/AchievementPackets.cpp.o +[216/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/WorldPacket.cpp.o +[217/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/ArchaeologyPackets.cpp.o +[218/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Scripting/ScriptSystem.cpp.o +[219/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/BattlegroundPackets.cpp.o +[220/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/AuthenticationPackets.cpp.o +[221/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/ChatPackets.cpp.o +[222/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/CombatLogPackets.cpp.o +[223/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/CombatPackets.cpp.o +[224/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/GuildPackets.cpp.o +[225/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/WorldSocket.cpp.o +[226/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/WorldSocketMgr.cpp.o +[227/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/InspectPackets.cpp.o +[228/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/CharacterPackets.cpp.o +[229/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/ItemPackets.cpp.o +[230/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/InstancePackets.cpp.o +[231/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/ItemPacketsCommon.cpp.o +[232/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/LFGPacketsCommon.cpp.o +[233/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/LootPackets.cpp.o +[234/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/MiscPackets.cpp.o +[235/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/LFGPackets.cpp.o +[236/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/MovementPackets.cpp.o +[237/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/PacketUtilities.cpp.o +[238/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/WorldSession.cpp.o +[239/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/NPCPackets.cpp.o +[240/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/PetPackets.cpp.o +[241/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/PartyPackets.cpp.o +[242/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/QuestPackets.cpp.o +[243/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/QueryPackets.cpp.o +[244/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/ReforgePackets.cpp.o +[245/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/SystemPackets.cpp.o +[246/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/TalentPackets.cpp.o +[247/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/TicketPackets.cpp.o +[248/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/SpellPackets.cpp.o +[249/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/TotemPackets.cpp.o +[250/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Scripting/ScriptMgr.cpp.o +[251/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/TradePackets.cpp.o +[252/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/VehiclePackets.cpp.o +[253/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/WhoPackets.cpp.o +[254/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Packets/WorldStatePackets.cpp.o +[255/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Protocol/PacketLog.cpp.o +[256/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/Archaeology/Archaeology.cpp.o +[257/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/Archaeology/SitePolygonGeometry.cpp.o +[258/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/Archaeology/SitePolygonGraph.cpp.o +[259/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/SkillDiscovery.cpp.o +[260/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/SkillExtraItems.cpp.o +[261/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/Archaeology/ArchaeologySites.cpp.o +[262/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/Archaeology/ArchaeologyProjects.cpp.o +[263/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Skills/Archaeology/ArchaeologyMgr.cpp.o +[264/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Storages/WhoListStorage.cpp.o +[265/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/SpellHistory.cpp.o +[266/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/SpellInfo.cpp.o +[267/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/SpellScript.cpp.o +[268/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/Auras/SpellAuras.cpp.o +[269/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Texts/ChatTextBuilder.cpp.o +[270/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/SpellEffects.cpp.o +[271/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Time/GameTime.cpp.o +[272/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/Auras/SpellAuraEffects.cpp.o +[273/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/Spell.cpp.o +[274/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Tickets/TicketMgr.cpp.o +[275/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Server/Protocol/Opcodes.cpp.o +[276/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Time/UpdateTime.cpp.o +[277/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Texts/CreatureTextMgr.cpp.o +[278/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Spells/SpellMgr.cpp.o +[279/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Tools/CharacterDatabaseCleaner.cpp.o +[280/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Warden/Warden.cpp.o +[281/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Warden/WardenCheckMgr.cpp.o +[282/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Warden/WardenMac.cpp.o +[283/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Tools/PlayerDump.cpp.o +[284/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Weather/Weather.cpp.o +[285/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Warden/WardenWin.cpp.o +[286/1053] Building CXX object src/server/game/CMakeFiles/game.dir/Weather/WeatherMgr.cpp.o +[287/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureAreaMgr.cpp.o +[288/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureEncounterMgr.cpp.o +[289/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureCombatMgr.cpp.o +[290/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureInteractionMgr.cpp.o +[291/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureProfessionTargets.cpp.o +[292/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureLocationMgr.cpp.o +[293/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureGroupTravelMgr.cpp.o +[294/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureGeneratorMgr.cpp.o +[295/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureGroupMgr.cpp.o +[296/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventurePopulationMgr.cpp.o +[297/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureSocialActions.cpp.o +[298/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureBehaviorMgr.cpp.o +[299/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureSupplyMgr.cpp.o +[300/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessPerceptionMgr.cpp.o +[301/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessCompanionMgr.cpp.o +[302/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessPositioning.cpp.o +[303/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessCharacterFactory.cpp.o +[304/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessLuaEngine.cpp.o +[305/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessRouteRecorderMgr.cpp.o +[306/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessPlayerMgr.cpp.o +[307/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessActionExecutorMgr.cpp.o +[308/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessFlightMgr.cpp.o +[309/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/TransportDeckMesh.cpp.o +[310/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessTransportDeckMgr.cpp.o +[311/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessWorldPointMgr.cpp.o +[312/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessTravelMgr.cpp.o +[313/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessTestBotMgr.cpp.o +[314/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/gen_scriptloader/static/ScriptLoader.cpp.o +[315/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/WorldStates/WorldStateMgr.cpp.o +[316/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessTransportMgr.cpp.o +[317/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Battlefield/battlefield_script_loader.cpp.o +[318/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Battlefield/BattlefieldTB.cpp.o +[319/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_achievement.cpp.o +[320/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessTravelGraphMgr.cpp.o +[321/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Battlefield/BattlefieldWG.cpp.o +[322/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_bf.cpp.o +[323/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_ahbot.cpp.o +[324/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_account.cpp.o +[325/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_arena.cpp.o +[326/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_ban.cpp.o +[327/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_cast.cpp.o +[328/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_cheat.cpp.o +[329/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_deserter.cpp.o +[330/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_character.cpp.o +[331/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_event.cpp.o +[332/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_gm.cpp.o +[333/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_disable.cpp.o +[334/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_debug.cpp.o +[335/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_group.cpp.o +[336/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_gobject.cpp.o +[337/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_honor.cpp.o +[338/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_guild.cpp.o +[339/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_go.cpp.o +[340/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_instance.cpp.o +[341/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_learn.cpp.o +[342/1053] Building CXX object src/server/game/CMakeFiles/game.dir/World/World.cpp.o +[343/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_lfg.cpp.o +[344/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_message.cpp.o +[345/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_mmaps.cpp.o +[346/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_list.cpp.o +[347/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_lookup.cpp.o +[348/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_modify.cpp.o +[349/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_pet.cpp.o +[350/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_rbac.cpp.o +[351/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_quest.cpp.o +[352/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_misc.cpp.o +[353/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_npc.cpp.o +[354/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_script_loader.cpp.o +[355/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_reset.cpp.o +[356/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_send.cpp.o +[357/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Custom/custom_script_loader.cpp.o +[358/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_server.cpp.o +[359/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_titles.cpp.o +[360/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_ticket.cpp.o +[361/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_reload.cpp.o +[362/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_tele.cpp.o +[363/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Commands/cs_wp.cpp.o +[364/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Custom/vcore_diagnostics.cpp.o +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/vcore_diagnostics.cpp:236:39: warning: ‘std::optional > VCoreDiagnostics::DisplayTextColumn(const std::string&, const std::string&)’ defined but not used [-Wunused-function] + 236 | static std::optional DisplayTextColumn( + | ^~~~~~~~~~~~~~~~~ +[365/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/arathi_highlands.cpp.o +[366/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/eastern_kingdoms_script_loader.cpp.o +[367/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_dun_morogh.cpp.o +[368/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_blasted_lands.cpp.o +[369/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_duskwood.cpp.o +[370/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp.o +[371/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Custom/viano_adventurers.cpp.o +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_adventurers.cpp: In member function ‘void VianoAdventurers::npc_horde_adventurer_melee::npc_horde_adventurer_meleeAI::HandleOutOfCombatRecovery(uint32)’: +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_adventurers.cpp:310:49: warning: comparison of integer expressions of different signedness: ‘int32’ {aka ‘int’} and ‘uint32’ {aka ‘unsigned int’} [-Wsign-compare] + 310 | if (maxMana > 0 && me->GetPower(POWER_MANA) < maxMana) + | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_adventurers.cpp: In member function ‘void VianoAdventurers::npc_horde_adventurer_tank::npc_horde_adventurer_tankAI::HandleOutOfCombatRecovery(uint32)’: +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_adventurers.cpp:861:57: warning: comparison of integer expressions of different signedness: ‘int32’ {aka ‘int’} and ‘uint32’ {aka ‘unsigned int’} [-Wsign-compare] + 861 | if (maxMana && me->GetPower(POWER_MANA) < maxMana) + | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_adventurers.cpp: In member function ‘void VianoAdventurers::npc_horde_adventurer_healer::npc_horde_adventurer_healerAI::HandleOutOfCombatRecovery(uint32, Player*)’: +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_adventurers.cpp:1518:57: warning: comparison of integer expressions of different signedness: ‘int32’ {aka ‘int’} and ‘uint32’ {aka ‘unsigned int’} [-Wsign-compare] + 1518 | if (maxMana && me->GetPower(POWER_MANA) < maxMana) + | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ +[372/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_elwynn_forest.cpp.o +[373/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_ghostlands.cpp.o +[374/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_hinterlands.cpp.o +[375/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_ironforge.cpp.o +[376/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_silverpine_forest.cpp.o +[377/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_stormwind_city.cpp.o +[378/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_redridge_mountains.cpp.o +[379/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_hillsbrad_foothills.cpp.o +[380/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_swamp_of_sorrows.cpp.o +[381/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_tirisfal_glades.cpp.o +[382/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_tol_barad.cpp.o +[383/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_undercity.cpp.o +[384/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Custom/viano_bot_commands.cpp.o +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_bot_commands.cpp: In function ‘bool VianoBotCommands::HandleClientlessLocationAdd(ChatHandler*, const char*)’: +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_bot_commands.cpp:2391:20: warning: unused variable ‘loaded’ [-Wunused-variable] + 2391 | bool const loaded = sClientlessWorldPointMgr->Reload(); + | ^~~~~~ +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_bot_commands.cpp: In function ‘bool VianoBotCommands::HandleClientlessLocationMove(ChatHandler*, const char*)’: +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_bot_commands.cpp:2428:20: warning: unused variable ‘loaded’ [-Wunused-variable] + 2428 | bool const loaded = sClientlessWorldPointMgr->Reload(); + | ^~~~~~ +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_bot_commands.cpp: In function ‘bool VianoBotCommands::HandleClientlessLocationRemove(ChatHandler*, const char*)’: +/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/scripts/Custom/viano_bot_commands.cpp:2452:20: warning: unused variable ‘loaded’ [-Wunused-variable] + 2452 | bool const loaded = sClientlessWorldPointMgr->Reload(); + | ^~~~~~ +[385/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_western_plaguelands.cpp.o +[386/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_wetlands.cpp.o +[387/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/AlteracValley/alterac_valley.cpp.o +[388/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_twilight_highlands.cpp.o +[389/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/AlteracValley/boss_balinda.cpp.o +[390/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/AlteracValley/boss_drekthar.cpp.o +[391/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/zone_westfall.cpp.o +[392/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/AlteracValley/boss_galvangar.cpp.o +[393/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/AlteracValley/boss_vanndar.cpp.o +[394/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BaradinHold/boss_alizabal.cpp.o +[395/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp.o +[396/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BaradinHold/boss_occuthar.cpp.o +[397/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp.o +[398/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.cpp.o +[399/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BastionOfTwilight/instance_bastion_of_twilight.cpp.o +[400/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp.o +[401/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp.o +[402/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp.o +[403/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp.o +[404/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp.o +[405/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp.o +[406/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BastionOfTwilight/boss_theralion_and_valiona.cpp.o +[407/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla_herald_of_twilight.cpp.o +[408/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp.o +[409/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp.o +[410/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp.o +[411/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp.o +[412/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp.o +[413/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp.o +[414/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp.o +[415/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp.o +[416/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp.o +[417/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp.o +[418/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp.o +[419/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp.o +[420/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp.o +[421/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp.o +[422/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp.o +[423/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp.o +[424/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp.o +[425/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp.o +[426/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp.o +[427/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp.o +[428/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp.o +[429/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp.o +[430/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp.o +[431/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp.o +[432/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp.o +[433/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp.o +[434/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp.o +[435/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp.o +[436/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp.o +[437/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.cpp.o +[438/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp.o +[439/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_chimaeron.cpp.o +[440/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp.o +[441/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_atramedes.cpp.o +[442/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp.o +[443/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_maloriak.cpp.o +[444/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_magmaw.cpp.o +[445/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp.o +[446/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_omnotron_defense_system.cpp.o +[447/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp.o +[448/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp.o +[449/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp.o +[450/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_nefarians_end.cpp.o +[451/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp.o +[452/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp.o +[453/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp.o +[454/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp.o +[455/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp.o +[456/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp.o +[457/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp.o +[458/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp.o +[459/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp.o +[460/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp.o +[461/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp.o +[462/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp.o +[463/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp.o +[464/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp.o +[465/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/boss_captain_cookie.cpp.o +[466/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/boss_admiral_ripsnarl.cpp.o +[467/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/boss_foe_reaper_5000.cpp.o +[468/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/boss_glubtok.cpp.o +[469/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/boss_vanessa_van_cleef.cpp.o +[470/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/deadmines.cpp.o +[471/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/instance_deadmines.cpp.o +[472/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Gilneas/gilneas_chapter_1.cpp.o +[473/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Deadmines/boss_helix_gearbreaker.cpp.o +[474/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Gilneas/gilneas_chapter_2.cpp.o +[475/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Gnomeregan/gnomeregan.cpp.o +[476/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp.o +[477/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/GrimBatol/boss_drahga_shadowburner.cpp.o +[478/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/GrimBatol/grim_batol.cpp.o +[479/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/GrimBatol/instance_grim_batol.cpp.o +[480/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_curator.cpp.o +[481/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/GrimBatol/boss_erudax.cpp.o +[482/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/GrimBatol/boss_general_umbriss.cpp.o +[483/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/GrimBatol/boss_forgemaster_throngus.cpp.o +[484/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp.o +[485/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_midnight.cpp.o +[486/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_moroes.cpp.o +[487/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_netherspite.cpp.o +[488/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp.o +[489/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp.o +[490/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_nightbane.cpp.o +[491/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp.o +[492/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/instance_karazhan.cpp.o +[493/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/bosses_opera.cpp.o +[494/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Karazhan/karazhan.cpp.o +[495/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp.o +[496/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp.o +[497/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp.o +[498/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp.o +[499/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp.o +[500/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp.o +[501/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletEnclave/the_scarlet_enclave_chapter_2.cpp.o +[502/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp.o +[503/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletEnclave/the_scarlet_enclave_chapter_5.cpp.o +[504/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp.o +[505/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp.o +[506/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletEnclave/the_scarlet_enclave_chapter_1.cpp.o +[507/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp.o +[508/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_herod.cpp.o +[509/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp.o +[510/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp.o +[511/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp.o +[512/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp.o +[513/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp.o +[514/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/boss_scorn.cpp.o +[515/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp.o +[516/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp.o +[517/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp.o +[518/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp.o +[519/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_illucia_barov.cpp.o +[520/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp.o +[521/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_jandice_barov.cpp.o +[522/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp.o +[523/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp.o +[524/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp.o +[525/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp.o +[526/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_kormok.cpp.o +[527/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_the_ravenian.cpp.o +[528/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/boss_vectus.cpp.o +[529/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Scholomance/instance_scholomance.cpp.o +[530/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/boss_baron_ashbury.cpp.o +[531/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/boss_baron_silverlaine.cpp.o +[532/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp.o +[533/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/boss_commander_springvale.cpp.o +[534/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp.o +[535/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp.o +[536/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/boss_lord_walden.cpp.o +[537/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp.o +[538/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ShadowfangKeep/boss_lord_godfrey.cpp.o +[539/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_balnazzar.cpp.o +[540/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp.o +[541/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp.o +[542/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp.o +[543/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp.o +[544/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_nerubenkan.cpp.o +[545/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp.o +[546/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp.o +[547/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp.o +[548/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp.o +[549/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/instance_stratholme.cpp.o +[550/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp.o +[551/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunkenTemple/sunken_temple.cpp.o +[552/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Stratholme/stratholme.cpp.o +[553/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp.o +[554/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp.o +[555/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp.o +[556/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp.o +[557/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/boss_muru.cpp.o +[558/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp.o +[559/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp.o +[560/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/TheStockade/boss_hogger.cpp.o +[561/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/TheStockade/boss_lord_overheat.cpp.o +[562/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp.o +[563/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/TheStockade/boss_randolph_moloch.cpp.o +[564/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/TheStockade/instance_the_stockade.cpp.o +[565/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ThroneOfTheTides/boss_commander_ulthok.cpp.o +[566/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ThroneOfTheTides/boss_mindbender_gursha.cpp.o +[567/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ThroneOfTheTides/boss_lady_nazjar.cpp.o +[568/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Uldaman/boss_archaedas.cpp.o +[569/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ThroneOfTheTides/instance_throne_of_the_tides.cpp.o +[570/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Uldaman/boss_ironaya.cpp.o +[571/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Uldaman/uldaman.cpp.o +[572/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ThroneOfTheTides/boss_ozumat.cpp.o +[573/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ThroneOfTheTides/throne_of_the_tides.cpp.o +[574/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/Uldaman/instance_uldaman.cpp.o +[575/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/boss_daakara.cpp.o +[576/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/boss_halazzi.cpp.o +[577/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/boss_hexlord.cpp.o +[578/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/boss_nalorakk.cpp.o +[579/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/boss_akilzon.cpp.o +[580/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/instance_zulaman.cpp.o +[581/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/zulaman.cpp.o +[582/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulAman/boss_janalai.cpp.o +[583/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_grilek.cpp.o +[584/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_hazzarah.cpp.o +[585/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_bloodlord_mandokir.cpp.o +[586/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_renataki.cpp.o +[587/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_wushoolay.cpp.o +[588/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp.o +[589/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_high_priestess_kilnara.cpp.o +[590/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_high_priest_venoxis.cpp.o +[591/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/instance_zulgurub.cpp.o +[592/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Events/childrens_week.cpp.o +[593/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Events/events_script_loader.cpp.o +[594/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_zanzil.cpp.o +[595/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/zulgurub.cpp.o +[596/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Events/fireworks_show.cpp.o +[597/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/kalimdor_script_loader.cpp.o +[598/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_ashenvale.cpp.o +[599/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_azuremyst_isle.cpp.o +[600/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_desolace.cpp.o +[601/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_bloodmyst_isle.cpp.o +[602/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_durotar.cpp.o +[603/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_moonglade.cpp.o +[604/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_felwood.cpp.o +[605/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_mulgore.cpp.o +[606/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_northern_barrens.cpp.o +[607/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_mount_hyjal.cpp.o +[608/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_southern_barrens.cpp.o +[609/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_silithus.cpp.o +[610/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_tanaris.cpp.o +[611/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_thunder_bluff.cpp.o +[612/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_ungoro_crater.cpp.o +[613/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_uldum.cpp.o +[614/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/zone_winterspring.cpp.o +[615/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp.o +[616/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp.o +[617/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp.o +[618/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/BlackfathomDeeps/boss_kelris.cpp.o +[619/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp.o +[620/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp.o +[621/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp.o +[622/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp.o +[623/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp.o +[624/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp.o +[625/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp.o +[626/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp.o +[627/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp.o +[628/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp.o +[629/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp.o +[630/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp.o +[631/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp.o +[632/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp.o +[633/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp.o +[634/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp.o +[635/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/DragonSoul/instance_dragon_soul.cpp.o +[636/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EndTime/instance_end_time.cpp.o +[637/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EndTime/end_time.cpp.o +[638/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp.o +[639/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EndTime/boss_murozond.cpp.o +[640/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp.o +[641/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp.o +[642/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EndTime/boss_echo_of_jaina.cpp.o +[643/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp.o +[644/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp.o +[645/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp.o +[646/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/HourOfTwilight/instance_hour_of_twilight.cpp.o +[647/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/DragonSoul/boss_madness_of_deathwing.cpp.o +[648/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp.o +[649/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp.o +[650/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp.o +[651/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp.o +[652/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp.o +[653/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/WellOfEternity/instance_well_of_eternity.cpp.o +[654/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp.o +[655/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/DireMaul/instance_dire_maul.cpp.o +[656/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Firelands/firelands.cpp.o +[657/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Firelands/boss_alysrazor.cpp.o +[658/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Firelands/boss_baleroc.cpp.o +[659/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Firelands/instance_firelands.cpp.o +[660/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Firelands/boss_majordomo_staghelm.cpp.o +[661/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/boss_ammunae.cpp.o +[662/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/boss_anraphet.cpp.o +[663/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp.o +[664/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Firelands/boss_lord_rhyolith.cpp.o +[665/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/boss_rajh.cpp.o +[666/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/boss_isiset.cpp.o +[667/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/boss_setesh.cpp.o +[668/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Firelands/boss_ragnaros_firelands.cpp.o +[669/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp.o +[670/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp.o +[671/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/HallsOfOrigination/halls_of_origination.cpp.o +[672/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/LostCityOfTheTolvir/boss_lockmaw_and_augh.cpp.o +[673/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/LostCityOfTheTolvir/boss_high_prophet_barim.cpp.o +[674/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/LostCityOfTheTolvir/boss_general_husam.cpp.o +[675/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp.o +[676/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.cpp.o +[677/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp.o +[678/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Maraudon/boss_landslide.cpp.o +[679/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/LostCityOfTheTolvir/boss_siamat.cpp.o +[680/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Maraudon/boss_noxxion.cpp.o +[681/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Maraudon/boss_princess_theradras.cpp.o +[682/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/Maraudon/instance_maraudon.cpp.o +[683/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/OnyxiasLair/boss_onyxia.cpp.o +[684/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp.o +[685/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp.o +[686/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp.o +[687/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenDowns/boss_glutton.cpp.o +[688/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp.o +[689/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp.o +[690/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp.o +[691/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenDowns/razorfen_downs.cpp.o +[692/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp.o +[693/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RazorfenKraul/razorfen_kraul.cpp.o +[694/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp.o +[695/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp.o +[696/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp.o +[697/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp.o +[698/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp.o +[699/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp.o +[700/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp.o +[701/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp.o +[702/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp.o +[703/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp.o +[704/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp.o +[705/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp.o +[706/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp.o +[707/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp.o +[708/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp.o +[709/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp.o +[710/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp.o +[711/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp.o +[712/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/ThroneOfTheFourWinds/instance_throne_of_the_four_winds.cpp.o +[713/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/ThroneOfTheFourWinds/throne_of_the_four_winds.cpp.o +[714/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/VortexPinnacle/instance_vortex_pinnacle.cpp.o +[715/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/VortexPinnacle/boss_grand_vizier_ertan.cpp.o +[716/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/ThroneOfTheFourWinds/boss_conclave_of_wind.cpp.o +[717/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/VortexPinnacle/boss_altairus.cpp.o +[718/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/ThroneOfTheFourWinds/boss_alakir.cpp.o +[719/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/boss_kresh.cpp.o +[720/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/VortexPinnacle/boss_asaad.cpp.o +[721/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/VortexPinnacle/vortex_pinnacle.cpp.o +[722/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/boss_lady_anacondra.cpp.o +[723/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/boss_lord_cobrahn.cpp.o +[724/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/boss_lord_pythas.cpp.o +[725/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/boss_lord_serpentis.cpp.o +[726/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/boss_skum.cpp.o +[727/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/boss_verdan_the_everliving.cpp.o +[728/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp.o +[729/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/WailingCaverns/wailing_caverns.cpp.o +[730/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/ZulFarrak/boss_zum_rah.cpp.o +[731/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/ZulFarrak/instance_zulfarrak.cpp.o +[732/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/kezan.cpp.o +[733/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Kalimdor/ZulFarrak/zulfarrak.cpp.o +[734/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/maelstrom_script_loader.cpp.o +[735/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/zone_deepholm.cpp.o +[736/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/Stonecore/boss_corborus.cpp.o +[737/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/Stonecore/instance_stonecore.cpp.o +[738/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/Stonecore/boss_slabhide.cpp.o +[739/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/Stonecore/boss_ozruk.cpp.o +[740/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/northrend_script_loader.cpp.o +[741/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/Stonecore/boss_high_priestess_azil.cpp.o +[742/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_crystalsong_forest.cpp.o +[743/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Maelstrom/Stonecore/stonecore.cpp.o +[744/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_dalaran.cpp.o +[745/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_borean_tundra.cpp.o +[746/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_icecrown.cpp.o +[747/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_howling_fjord.cpp.o +[748/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_dragonblight.cpp.o +[749/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_grizzly_hills.cpp.o +[750/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_sholazar_basin.cpp.o +[751/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_wintergrasp.cpp.o +[752/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp.o +[753/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_storm_peaks.cpp.o +[754/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/zone_zuldrak.cpp.o +[755/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp.o +[756/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp.o +[757/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp.o +[758/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp.o +[759/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp.o +[760/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp.o +[761/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp.o +[762/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp.o +[763/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp.o +[764/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp.o +[765/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp.o +[766/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp.o +[767/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp.o +[768/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp.o +[769/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp.o +[770/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp.o +[771/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp.o +[772/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp.o +[773/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp.o +[774/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp.o +[775/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp.o +[776/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp.o +[777/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp.o +[778/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp.o +[779/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp.o +[780/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/DraktharonKeep/boss_king_dred.cpp.o +[781/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/DraktharonKeep/boss_novos.cpp.o +[782/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp.o +[783/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp.o +[784/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp.o +[785/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp.o +[786/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp.o +[787/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/DraktharonKeep/boss_tharon_ja.cpp.o +[788/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/DraktharonKeep/boss_trollgore.cpp.o +[789/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp.o +[790/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp.o +[791/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/HallsOfReflection/boss_horAI.cpp.o +[792/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp.o +[793/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp.o +[794/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp.o +[795/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp.o +[796/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp.o +[797/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp.o +[798/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp.o +[799/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp.o +[800/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp.o +[801/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Gundrak/boss_drakkari_colossus.cpp.o +[802/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Gundrak/boss_eck.cpp.o +[803/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp.o +[804/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp.o +[805/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp.o +[806/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Gundrak/boss_gal_darah.cpp.o +[807/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Gundrak/boss_moorabi.cpp.o +[808/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Gundrak/boss_slad_ran.cpp.o +[809/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Gundrak/instance_gundrak.cpp.o +[810/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_festergut.cpp.o +[811/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp.o +[812/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp.o +[813/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp.o +[814/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp.o +[815/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp.o +[816/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_rotface.cpp.o +[817/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp.o +[818/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_professor_putricide.cpp.o +[819/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp.o +[820/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IsleOfConquest/boss_ioc_horde_alliance.cpp.o +[821/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_sindragosa.cpp.o +[822/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp.o +[823/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/icecrown_citadel.cpp.o +[824/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_anubrekhan.cpp.o +[825/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp.o +[826/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IsleOfConquest/isle_of_conquest.cpp.o +[827/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_faerlina.cpp.o +[828/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/IcecrownCitadel/boss_the_lich_king.cpp.o +[829/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_gluth.cpp.o +[830/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_four_horsemen.cpp.o +[831/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_heigan.cpp.o +[832/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_grobbulus.cpp.o +[833/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_gothik.cpp.o +[834/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_loatheb.cpp.o +[835/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_maexxna.cpp.o +[836/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_noth.cpp.o +[837/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_kelthuzad.cpp.o +[838/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_patchwerk.cpp.o +[839/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_razuvious.cpp.o +[840/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/instance_naxxramas.cpp.o +[841/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/naxxramas.cpp.o +[842/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_thaddius.cpp.o +[843/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Nexus/boss_anomalus.cpp.o +[844/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp.o +[845/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Naxxramas/boss_sapphiron.cpp.o +[846/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp.o +[847/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Nexus/boss_magus_telestra.cpp.o +[848/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Nexus/boss_keristrasza.cpp.o +[849/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Nexus/boss_nexus_commanders.cpp.o +[850/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp.o +[851/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Nexus/boss_ormorok.cpp.o +[852/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Nexus/instance_nexus.cpp.o +[853/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Oculus/boss_drakos.cpp.o +[854/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Oculus/boss_urom.cpp.o +[855/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Oculus/boss_eregos.cpp.o +[856/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Oculus/instance_oculus.cpp.o +[857/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Oculus/boss_varos.cpp.o +[858/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp.o +[859/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Nexus/Oculus/oculus.cpp.o +[860/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp.o +[861/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp.o +[862/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfLightning/boss_general_bjarngrim.cpp.o +[863/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp.o +[864/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp.o +[865/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp.o +[866/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp.o +[867/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp.o +[868/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp.o +[869/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_auriaya.cpp.o +[870/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_freya.cpp.o +[871/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp.o +[872/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_ignis.cpp.o +[873/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp.o +[874/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp.o +[875/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_hodir.cpp.o +[876/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp.o +[877/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_kologarn.cpp.o +[878/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_razorscale.cpp.o +[879/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp.o +[880/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/instance_ulduar.cpp.o +[881/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp.o +[882/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp.o +[883/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_mimiron.cpp.o +[884/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_xt002.cpp.o +[885/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp.o +[886/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_thorim.cpp.o +[887/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp.o +[888/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp.o +[889/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp.o +[890/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp.o +[891/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp.o +[892/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp.o +[893/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VaultOfArchavon/boss_archavon.cpp.o +[894/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VaultOfArchavon/boss_emalon.cpp.o +[895/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp.o +[896/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VaultOfArchavon/boss_koralon.cpp.o +[897/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VaultOfArchavon/boss_toravon.cpp.o +[898/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp.o +[899/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/boss_cyanigosa.cpp.o +[900/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/boss_lavanthor.cpp.o +[901/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/boss_erekem.cpp.o +[902/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/boss_moragg.cpp.o +[903/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/boss_xevozz.cpp.o +[904/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/boss_ichoron.cpp.o +[905/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/boss_zuramat.cpp.o +[906/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/instance_violet_hold.cpp.o +[907/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/OutdoorPvP/OutdoorPvPHP.cpp.o +[908/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/OutdoorPvP/OutdoorPvPScriptLoader.cpp.o +[909/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/OutdoorPvP/OutdoorPvPTF.cpp.o +[910/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/OutdoorPvP/OutdoorPvPNA.cpp.o +[911/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Northrend/VioletHold/violet_hold.cpp.o +[912/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/boss_doomwalker.cpp.o +[913/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/OutdoorPvP/OutdoorPvPSI.cpp.o +[914/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/OutdoorPvP/OutdoorPvPZM.cpp.o +[915/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/boss_doomlord_kazzak.cpp.o +[916/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/outland_script_loader.cpp.o +[917/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_blades_edge_mountains.cpp.o +[918/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_nagrand.cpp.o +[919/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_shattrath_city.cpp.o +[920/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_hellfire_peninsula.cpp.o +[921/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp.o +[922/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_terokkar_forest.cpp.o +[923/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_shadowmoon_valley.cpp.o +[924/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_zangarmarsh.cpp.o +[925/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/zone_netherstorm.cpp.o +[926/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp.o +[927/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp.o +[928/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp.o +[929/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp.o +[930/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp.o +[931/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp.o +[932/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp.o +[933/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp.o +[934/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp.o +[935/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp.o +[936/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp.o +[937/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp.o +[938/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp.o +[939/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp.o +[940/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp.o +[941/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp.o +[942/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/black_temple.cpp.o +[943/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_mother_shahraz.cpp.o +[944/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_illidari_council.cpp.o +[945/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_reliquary_of_souls.cpp.o +[946/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_supremus.cpp.o +[947/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_shade_of_akama.cpp.o +[948/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_illidan.cpp.o +[949/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/instance_black_temple.cpp.o +[950/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_warlord_najentus.cpp.o +[951/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp.o +[952/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/BlackTemple/boss_teron_gorefiend.cpp.o +[953/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp.o +[954/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp.o +[955/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp.o +[956/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp.o +[957/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp.o +[958/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp.o +[959/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp.o +[960/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp.o +[961/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp.o +[962/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp.o +[963/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp.o +[964/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp.o +[965/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp.o +[966/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp.o +[967/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp.o +[968/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp.o +[969/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheUnderbog/instance_the_underbog.cpp.o +[970/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp.o +[971/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/GruulsLair/boss_gruul.cpp.o +[972/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/GruulsLair/instance_gruuls_lair.cpp.o +[973/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/GruulsLair/boss_high_king_maulgar.cpp.o +[974/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp.o +[975/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp.o +[976/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp.o +[977/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp.o +[978/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp.o +[979/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp.o +[980/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp.o +[981/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp.o +[982/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp.o +[983/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp.o +[984/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp.o +[985/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp.o +[986/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp.o +[987/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp.o +[988/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Eye/boss_alar.cpp.o +[989/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp.o +[990/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Eye/boss_astromancer.cpp.o +[991/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Eye/boss_kaelthas.cpp.o +[992/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Eye/the_eye.cpp.o +[993/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Eye/boss_void_reaver.cpp.o +[994/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Eye/instance_the_eye.cpp.o +[995/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp.o +[996/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp.o +[997/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp.o +[998/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp.o +[999/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp.o +[1000/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/Mechanar/instance_mechanar.cpp.o +[1001/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/arcatraz/arcatraz.cpp.o +[1002/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp.o +[1003/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp.o +[1004/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp.o +[1005/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp.o +[1006/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp.o +[1007/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp.o +[1008/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/botanica/boss_laj.cpp.o +[1009/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp.o +[1010/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp.o +[1011/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/botanica/boss_warp_splinter.cpp.o +[1012/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Outland/TempestKeep/botanica/instance_the_botanica.cpp.o +[1013/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_generic.cpp.o +[1014/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_dk.cpp.o +[1015/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_mage.cpp.o +[1016/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_paladin.cpp.o +[1017/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_hunter.cpp.o +[1018/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_script_loader.cpp.o +[1019/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_priest.cpp.o +[1020/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Pet/pet_shaman.cpp.o +[1021/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_pet.cpp.o +[1022/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_holiday.cpp.o +[1023/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_dk.cpp.o +[1024/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_hunter.cpp.o +[1025/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_mage.cpp.o +[1026/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_druid.cpp.o +[1027/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_priest.cpp.o +[1028/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_paladin.cpp.o +[1029/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_script_loader.cpp.o +[1030/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/achievement_scripts.cpp.o +[1031/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/action_ip_logger.cpp.o +[1032/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_quest.cpp.o +[1033/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_rogue.cpp.o +[1034/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/areatrigger_scripts.cpp.o +[1035/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_item.cpp.o +[1036/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_warrior.cpp.o +[1037/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/duel_reset.cpp.o +[1038/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_generic.cpp.o +[1039/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_shaman.cpp.o +[1040/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/guards.cpp.o +[1041/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/chat_log.cpp.o +[1042/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/Spells/spell_warlock.cpp.o +[1043/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/mob_generic_creature.cpp.o +[1044/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/item_scripts.cpp.o +[1045/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/npc_innkeeper.cpp.o +[1046/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/go_scripts.cpp.o +[1047/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/world_map_scripts.cpp.o +[1048/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/world_script_loader.cpp.o +[1049/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/npc_professions.cpp.o +[1050/1053] Building CXX object src/server/scripts/CMakeFiles/scripts.dir/World/npcs_special.cpp.o +[1051/1053] Linking CXX static library src/server/game/libgame.a +[1052/1053] Linking CXX static library src/server/scripts/libscripts.a +[1053/1053] Linking CXX executable src/server/worldserver/worldserver diff --git a/doc/clientless/checkpoints/2026-10-31-browser/browser-build-incremental-2026-10-31.log b/doc/clientless/checkpoints/2026-10-31-browser/browser-build-incremental-2026-10-31.log new file mode 100644 index 0000000000..9b84ebe399 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/browser-build-incremental-2026-10-31.log @@ -0,0 +1,4 @@ +[1/4] cd /home/wow_admin/wow_cata_server/source/TrinityCore && /usr/bin/cmake -DBUILDDIR="/home/wow_admin/wow_cata_server/build/debug" -P /home/wow_admin/wow_cata_server/source/TrinityCore/cmake/genrev.cmake /home/wow_admin/wow_cata_server/build/debug +[2/4] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureGroupMgr.cpp.o +[3/4] Linking CXX static library src/server/game/libgame.a +[4/4] Linking CXX executable src/server/worldserver/worldserver diff --git a/doc/clientless/checkpoints/2026-10-31-browser/browser-config-before.json b/doc/clientless/checkpoints/2026-10-31-browser/browser-config-before.json new file mode 100644 index 0000000000..fd97d3016b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/browser-config-before.json @@ -0,0 +1,9 @@ +{ + "Clientless.Browser.Dungeon.QueueEnabled": null, + "Clientless.Browser.Dungeon.JoinEnabled": null, + "Clientless.Browser.Raid.QueueEnabled": null, + "Clientless.Browser.Raid.JoinEnabled": null, + "Clientless.Browser.Battleground.QueueEnabled": null, + "Clientless.Browser.Battleground.JoinEnabled": null, + "Clientless.Browser.AllowBotOnlyTests": null +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/browser-config-prepared.json b/doc/clientless/checkpoints/2026-10-31-browser/browser-config-prepared.json new file mode 100644 index 0000000000..dea4903e1c --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/browser-config-prepared.json @@ -0,0 +1,9 @@ +{ + "Clientless.Browser.Dungeon.QueueEnabled": "1", + "Clientless.Browser.Dungeon.JoinEnabled": "1", + "Clientless.Browser.Raid.QueueEnabled": "1", + "Clientless.Browser.Raid.JoinEnabled": "0", + "Clientless.Browser.Battleground.QueueEnabled": "1", + "Clientless.Browser.Battleground.JoinEnabled": "0", + "Clientless.Browser.AllowBotOnlyTests": "0" +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/focused-tests-resumed.json b/doc/clientless/checkpoints/2026-10-31-browser/focused-tests-resumed.json new file mode 100644 index 0000000000..0d93f36ad6 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/focused-tests-resumed.json @@ -0,0 +1,79 @@ +[ + { + "status": "fulfilled", + "value": { + "name": "test_browser_admission", + "chunk_id": "5fcb62", + "wall_time_seconds": 0.332960882, + "exit_code": 0, + "original_token_count": 30, + "output": "Browser admission, last-human departure, independent switches, bot-only override, roles and formation progress passed.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_browser_participants", + "chunk_id": "192197", + "wall_time_seconds": 0.413228084, + "exit_code": 0, + "original_token_count": 31, + "output": "Production participant gate: exact party, disconnect, live switches, bot-only tests and independent human groups passed.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_browser_match_order", + "chunk_id": "07e26c", + "wall_time_seconds": 0.500924581, + "exit_code": 0, + "original_token_count": 30, + "output": "Native matching order: last human gets dungeon/raid slot, stale bot-only cache is rejected, and test/config gates hold.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_browser_bg_brackets", + "chunk_id": "94484e", + "wall_time_seconds": 0.032101788, + "exit_code": 0, + "original_token_count": 27, + "output": "Production BG recruitment uses native brackets, minimum levels, random eligibility and available templates.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_group_role_composition", + "chunk_id": "d43d31", + "wall_time_seconds": 0.575640471, + "exit_code": 0, + "original_token_count": 31, + "output": "Production role composition: correct party, missing healer, surplus tank, inaccessible/offline member and PvP group passed.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_adventure_groups", + "chunk_id": "37303a", + "wall_time_seconds": 0.973504747, + "exit_code": 0, + "original_token_count": 47, + "output": "Production recruitment: capitals, different goals, native inviter leadership, joining existing groups, capacity/reservations, raid conversion, planned transition and local contact passed.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_adventure_instance_begin", + "chunk_id": "8e38d1", + "wall_time_seconds": 0.475982874, + "exit_code": 0, + "original_token_count": 30, + "output": "Production entrance travel uses the existing location planner, requires mapping and retains normal social/area travel.\n" + } + } +] diff --git a/doc/clientless/checkpoints/2026-10-31-browser/lifecycle.json b/doc/clientless/checkpoints/2026-10-31-browser/lifecycle.json new file mode 100644 index 0000000000..8a66b575ff --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/lifecycle.json @@ -0,0 +1,111 @@ +{ + "26": "Offline", + "62": "Offline", + "34": "Offline", + "63": "Offline", + "33": "Offline", + "140": "Offline", + "36": "Offline", + "35": "Offline", + "40": "Online", + "145": "Offline", + "39": "Offline", + "144": "Offline", + "42": "Online", + "146": "Offline", + "41": "Offline", + "151": "Offline", + "44": "Offline", + "147": "Online", + "43": "Online", + "153": "Offline", + "46": "Online", + "152": "Offline", + "45": "Online", + "48": "Offline", + "47": "Offline", + "50": "Offline", + "49": "Offline", + "52": "Offline", + "51": "Offline", + "54": "Online", + "53": "Offline", + "57": "Offline", + "56": "Offline", + "61": "Offline", + "60": "Offline", + "65": "Offline", + "64": "Offline", + "67": "Offline", + "66": "Offline", + "69": "Offline", + "68": "Offline", + "71": "Offline", + "70": "Offline", + "73": "Online", + "72": "Offline", + "75": "Offline", + "74": "Online", + "77": "Offline", + "76": "Offline", + "79": "Offline", + "78": "Offline", + "81": "Offline", + "80": "Offline", + "83": "Offline", + "82": "Offline", + "85": "Offline", + "84": "Offline", + "87": "Offline", + "86": "Offline", + "89": "Offline", + "88": "Offline", + "91": "Online", + "90": "Offline", + "93": "Offline", + "92": "Online", + "95": "Offline", + "94": "Offline", + "97": "Offline", + "96": "Offline", + "99": "Offline", + "98": "Offline", + "101": "Offline", + "100": "Offline", + "103": "Offline", + "102": "Offline", + "105": "Offline", + "104": "Offline", + "107": "Offline", + "106": "Offline", + "109": "Offline", + "108": "Offline", + "111": "Offline", + "110": "Offline", + "113": "Offline", + "112": "Offline", + "115": "Offline", + "114": "Offline", + "117": "Offline", + "116": "Offline", + "119": "Offline", + "118": "Online", + "121": "Offline", + "120": "Offline", + "123": "Offline", + "122": "Offline", + "125": "Online", + "124": "Offline", + "126": "Offline", + "127": "Offline", + "128": "Offline", + "129": "Offline", + "130": "Offline", + "131": "Offline", + "132": "Offline", + "133": "Offline", + "134": "Offline", + "135": "Offline", + "136": "Offline", + "137": "Offline" +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/loader-resumed.log b/doc/clientless/checkpoints/2026-10-31-browser/loader-resumed.log new file mode 100644 index 0000000000..44b594d653 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/loader-resumed.log @@ -0,0 +1,1224 @@ +Loading Graveyard Orientations... +>> Loaded 1016 graveyard orientations in 2 ms +Loading spell pet auras... +>> Loaded 34 spell pet auras in 1 ms +Loading Spell target coordinates... +>> Loaded 1440 spell teleport coordinates in 4 ms +Loading linked spells... +>> Loaded 413 linked spells in 2 ms +Loading Player Create Data... +>> Loaded 91 player create definitions in 1 ms +Loading Player Create Items Data... +>> Loaded 1 custom player create items in 1 ms +Loading Player Create Skill Data... +>> Loaded player create skills in 0 ms +Loading Player Create Custom Spell Data... +>> Loaded 4507 custom player create spells in 2 ms +Loading Player Create Cast Spell Data... +>> Loaded 63 player create cast spells in 1 ms +Loading Player Create Action Data... +>> Loaded 352 player create actions in 1 ms +Loading Player Create Level Stats Data... +>> Loaded 850 level stats definitions in 5 ms +Loading Player Create XP Data... +>> Loaded 84 xp for level definitions in 1 ms +Loading Exploration BaseXP Data... +>> Loaded 80 BaseXP definitions in 1 ms +Loading Pet Name Parts... +>> Loaded 313 pet name parts in 1 ms +Loading the max pet number... +>> Loaded the max pet number: 52 in 0 ms +Loading pet level stats... +>> Loaded 2720 level pet stats definitions in 4 ms +Loading Player level dependent mail rewards... +>> Loaded 24 level dependent mail rewards in 1 ms +Loading creature loot templates... +>> Loaded 528193 creature loot templates in 634 ms +Loading fishing loot templates... +>> Loaded 266 fishing loot templates in 2 ms +Loading gameobject loot templates... +>> Loaded 19834 gameobject loot templates in 29 ms +Loading item loot templates... +>> Loaded 5031 item loot templates in 16 ms +Loading mail loot templates... +>> Loaded 90 mail loot templates in 0 ms +Loading milling loot templates... +>> Loaded 51 milling loot templates in 3 ms +Loading pickpocketing loot templates... +>> Loaded 10981 pickpocketing loot templates in 19 ms +Loading skinning loot templates... +>> Loaded 3390 skinning loot templates in 9 ms +Loading disenchanting loot templates... +>> Loaded 180 disenchanting loot templates in 1 ms +Loading prospecting loot templates... +>> Loaded 43 prospecting loot templates in 3 ms +Loading spell loot templates... +>> Loaded 292 spell loot templates in 3 ms +Loading reference loot templates... +>> Loaded refence loot templates in 46 ms +Loading Skill Discovery Table... +>> Loaded 347 skill discovery definitions in 3 ms. +Loading Skill Extra Item Table... +>> Loaded 225 spell specialization definitions in 1 ms +Loading Skill Perfection Data Table... +>> Loaded 72 spell perfection definitions in 1 ms. +Loading Skill Fishing base level requirements... +>> Loaded 95 areas for fishing base skill level in 1 ms +Loading Archaeology store... +>> Loaded 180 archaeology sites in 1 ms +>> Loaded 180 archaeology site polygons in 159 ms +>> Loaded 9 archaeology branches in 0 ms +>> Loaded 139 archaeology projects in 1 ms +>> Calculated 9 archaeology branch chances in 0 ms +Loading Achievements... +>> Loaded 47 achievement references in 0 ms. +Loading Achievement Criteria Lists... +>> Loaded 9803 achievement criteria and 952 guild achievement crieteria in 5 ms. +Loading Achievement Criteria Data... +>> Loaded 1291 additional achievement criteria data in 2 ms +Loading Achievement Rewards... +>> Loaded 120 achievement rewards in 1 ms. +Loading Achievement Reward Locales... +>> Loaded 0 achievement reward locale strings. DB table `achievement_reward_loc +ale` is empty. +Loading Completed Achievements... +>> Loaded 77 realm first completed achievements in 3 ms. +Loading Item Auctions... +>> Loaded 0 auction items. DB table `auctionhouse` or `item_instance` is empty! +Loading Auctions... +>> Loaded 0 auctions. DB table `auctionhouse` is empty. +Loading Guild XP for level... +>> Loaded 24 xp for guild level definitions in 0 ms +Loading Guild rewards... +>> Loaded 42 guild reward definitions in 1 ms +Initializing Guild Profession Data Store... +Loading Guild Challenges... +>> Loaded 4 guild challenge definitions in 0 ms +Loading Guilds... +Loading guilds definitions... +>> Loaded 1 guild definitions in 1 ms +Loading guild ranks... +>> Loaded 5 guild ranks in 0 ms +Loading guild members... +>> Loaded 4 guild members in 5 ms +Loading bank tab rights... +>> Loaded 30 bank tab rights in 0 ms +Loading guild event logs... +>> Loaded 8 guild event logs in 1 ms +Loading guild bank event logs... +>> Loaded 22 guild bank event logs in 0 ms +Loading Guild News... +>> Loaded 0 guild event logs. DB table `guild_newslog` is empty. +Loading guild bank tabs... +>> Loaded 6 guild bank tabs in 0 ms +>> Loaded 22 guild bank tab items in 2 ms +>> Validated data of loaded guilds in 0 ms +Loading guild finder guild-related settings... +>> Loaded 0 guild finder guild-related settings. Table `guild_finder_guild_setti +ngs` is empty. +Loading guild finder membership requests... +>> Loaded 0 guild finder membership requests. Table `guild_finder_applicant` is +empty. +Loading ArenaTeams... +>> Loaded 0 arena teams. DB table `arena_team` is empty! +Loading Groups... +>> Loaded 3 group definitions in 2 ms +Loading Group members... +>> Loaded 7 group members in 1 ms +Loading Group instance saves... +>> Loaded 0 group-instance saves. DB table `group_instance` is empty! +Loading ReservedNames... +>> Loaded 0 reserved player names. DB table `reserved_name` is empty! +Loading GameObjects for quests... +>> Loaded 2750 GameObjects for quests in 5 ms +Loading BattleMasters... +>> Loaded 171 battlemaster entries in 3 ms +Loading GameTeleports... +>> Loaded 1531 GameTeleports in 5 ms +Loading Trainers... +>> Loaded 88 Trainers in 10 ms +Loading Gossip menu... +>> Loaded 8225 gossip_menu IDs in 9 ms +Loading Gossip menu options... +>> Loaded 5837 gossip_menu_option entries in 17 ms +Loading Creature Template Gossip... +creature_template_gossip has gossip definitions for menu id 55002 but this menu +doesn't exist +creature_template_gossip has gossip definitions for menu id 55002 but this menu +doesn't exist +creature_template_gossip has gossip definitions for menu id 6268 but this menu d +oesn't exist +creature_template_gossip has gossip definitions for menu id 9856 but this menu d +oesn't exist +creature_template_gossip has gossip definitions for menu id 10844 but this menu +doesn't exist +creature_template_gossip has gossip definitions for menu id 10852 but this menu +doesn't exist +creature_template_gossip has gossip definitions for menu id 2522 but this menu d +oesn't exist +creature_template_gossip has gossip definitions for menu id 12720 but this menu +doesn't exist +creature_template_gossip has gossip definitions for menu id 12718 but this menu +doesn't exist +creature_template_gossip has gossip definitions for menu id 13160 but this menu +doesn't exist +>> Loaded 5435 creature template gossip menus in 8 ms +Loading Creature trainers... +>> Loaded 1187 default trainers in 3 ms +Loading Vendors... +Table `(game_event_)npc_vendor` for Vendor (Entry: 44972) have in item list non- +existed item (60822, type 1), ignore +>> Loaded 48278 Vendors in 67 ms +Loading Waypoints... +>> Loaded 110626 waypoints in 166 ms +Loading Waypoint Addons... +>> Loaded 639 waypoint addon data in 3 ms +Loading SmartAI Waypoints... +>> Loaded 586 SmartAI waypoint paths (total 7064 waypoints) in 9 ms +Loading Creature Formations... +>> Loaded 2517 creatures in formations in 5 ms +Loading World State templates... +Table `world_state` contains a world state 3490 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3490 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3491 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3491 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3600 with invalid MapID (1134), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (1504), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (1505), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (1552), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (1672), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (1825), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (1911), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (2167), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (2373), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (2509), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (2511), map i +gnored +Table `world_state` contains a world state 3600 with invalid MapID (2547), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (1134), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (1504), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (1505), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (1552), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (1672), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (1825), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (1911), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (2167), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (2373), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (2509), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (2511), map i +gnored +Table `world_state` contains a world state 3601 with invalid MapID (2547), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (1134), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (1504), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (1505), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (1552), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (1672), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (1825), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (1911), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (2167), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (2373), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (2509), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (2511), map i +gnored +Table `world_state` contains a world state 3610 with invalid MapID (2547), map i +gnored +Table `world_state` contains a world state 3680 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3680 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3681 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3681 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3698 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3698 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3699 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3699 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3700 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3700 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3701 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3701 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3702 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3702 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3703 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3703 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3704 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3704 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3705 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3705 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3706 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3706 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3710 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3710 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3711 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3711 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3712 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3712 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3713 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3713 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3714 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3714 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3749 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3749 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3750 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3750 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3751 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3751 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3752 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3752 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3753 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3753 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3754 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3754 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3755 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3755 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3756 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3756 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3757 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3757 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3758 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3758 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3759 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3759 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3760 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3760 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3761 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3761 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3762 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3762 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3763 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3763 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3764 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3764 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3765 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3765 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3766 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3766 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3767 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3767 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3768 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3768 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3769 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3769 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3770 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3770 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3771 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3771 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3772 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3772 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3773 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3773 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3781 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3781 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3801 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3801 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3802 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3802 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3803 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 3803 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 3815 with invalid MapID (1544), map i +gnored +Table `world_state` contains a world state 3816 with invalid MapID (1544), map i +gnored +Table `world_state` contains a world state 4022 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 4022 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 4023 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 4023 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 4024 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 4024 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 4025 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 4025 with invalid AreaID (10176), are +a ignored +Table `world_state` contains a world state 4354 with invalid MapID (2118), map i +gnored +Table `world_state` contains a world state 4354 with invalid AreaID (10176), are +a ignored +>> Loaded 526 world state templates 3 ms +>> Loaded 44 saved world state values 0 ms +Loading Persistend World Variables... +>> Loaded 9 world variables in 0 ms +Loading Terrain World Map definitions... +>> Loaded 4 terrain world maps in 0 ms. +Loading Terrain Swap Default definitions... +>> Loaded 4 terrain swap defaults in 1 ms. +Loading Phase Area definitions... +>> Loaded 25 phase areas in 1 ms. +Loading Conditions... +>> Loaded 15912 conditions in 39 ms +Loading faction change achievement pairs... +>> Loaded 124 faction change achievement pairs in 1 ms +Loading faction change spell pairs... +>> Loaded 113 faction change spell pairs in 0 ms +Loading faction change quest pairs... +>> Loaded 250 faction change quest pairs in 1 ms +Loading faction change item pairs... +>> Loaded 752 faction change item pairs in 3 ms +Loading faction change reputation pairs... +>> Loaded 17 faction change reputation pairs in 0 ms +Loading faction change title pairs... +>> Loaded 22 faction change title pairs in 1 ms +Loading GM tickets... +>> Loaded 2 GM tickets in 0 ms +Loading GM surveys... +>> Loaded GM Survey count from database in 1 ms +Loading client addons... +>> Loaded 35 known addons in 0 ms +Returning old mails... +>> No expired mails found. +Loading Autobroadcasts... +>> Loaded 0 autobroadcasts definitions. DB table `autobroadcast` is empty for th +is realm! +Loading spell_scripts... +>> Loaded 143 script definitions in 1 ms +Loading event_scripts... +>> Loaded 461 script definitions in 3 ms +Loading waypoint_scripts... +>> Loaded 422 script definitions in 2 ms +Loading spell script names... +Scriptname: `spell_vcore_dungeon_horn` spell (Id: 120000) does not exist. +Scriptname: `spell_vcore_dungeon_horn` spell (Id: 120001) does not exist. +Scriptname: `spell_vcore_dungeon_horn` spell (Id: 120002) does not exist. +Scriptname: `spell_vcore_dungeon_horn` spell (Id: 120003) does not exist. +>> Loaded 3282 spell script names in 7 ms +Loading Creature Texts... +>> Loaded 16797 creature texts for 3997 creatures in 48 ms +Loading Creature Text Locales... +Loading creature StaticFlags overrides... +>> Loaded 133 creature static flag overrides in 0 ms +Loading Taxi node level definitions... +>> Loaded 274 taxi node level definitions in 1 ms +Initializing Scripts... +Loading Script Waypoints for 54 creature(s)... +>> Loaded 1377 Script Waypoint nodes in 4 ms +>> Loaded spline chain data for 85 chains, consisting of 272 splines with 1414 w +aypoints in 4 ms +Loading C++ scripts +Script named 'world_map_set_faction_worldstates_609' does not have a script name + assigned in database. +Script named 'item_gor_dreks_ointment' does not have a script name assigned in d +atabase. +>> Loaded 4106 C++ scripts in 143 ms +Validating spell scripts... +Spell `85123` Effect `Index: EFFECT_0 Target: 7` of script `spell_siege_cannon` +did not match dbc effect data - handler bound to hook `OnObjectAreaTargetSelect` + of SpellScript won't be executed +>> Validated 3470 scripts in 12 ms +Loading SmartAI scripts... +>> Loaded SmartAIMgr Helpers in 16 ms +>> Loaded 13506 SmartAI scripts in 152 ms +Loading Calendar data... +>> Loaded 0 calendar events in 1 ms +>> Loaded 0 calendar invites in 0 ms +Loading Petitions... +>> Loaded 0 petitions. +Loading Signatures... +>> Loaded 0 Petition signs! +Loading Summon Properties parameter data... +>> Loaded 78 summon properties parameters in 1 ms +Loading Item loot... +>> Loaded 0 stored item loots +>> Loaded 0 stored item money +Initialize query data... +>> Initialized query cache data in 971 ms +Initialize commands... +Initialize game time and timers +Mail timer set to: 480, mail return is called every 1440 minutes +Starting Map System +Starting Game Event system... +Initialize AuctionHouseBot... +Initializing Opcodes... +Starting Arena Season... +Starting Battleground System +>> Loaded 15 battlegrounds in 0 ms +Starting Outdoor PvP System +>> Loaded 5 outdoor PvP definitions in 0 ms +Starting Battlefield System +>> Loaded 2 battlefields in 0 ms +Loading Warden Checks... +Loading Warden Action Overrides... +Deleting expired bans... +Initializing quest reset times... +Calculate random battleground reset time... +Calculate guild limitation(s) reset time... +Calculate next currency reset time... +World initialized in 0 minutes 10 seconds +TC>TC>TrinityCore rev. 649915e575e0+ 2026-10-30 12:43:22 +0100 (feature/clientle +ss-player-core branch) (Unix, Debug, Static) (worldserver-daemon) ready... +clientless login 43 +TC>clientless login 46 +TC>clientless login 54 +TC>clientless login 73 +TC>clientless login 74 +TC>clientless login 118 +TC>clientless login 147 +TC>Registered clientless session for character GUID 43 (account 7), state=Loadin +g. +Created clientless player session for character GUID 43 (account 7). +ClientlessPlayerMgr started character GUID 43 (account 7). +Clientless login started for 'Fizzira' (GUID 43, account 7). +TC> Registered clientless session for character GUID 46 (account 8), state=Loadi +ng. +Created clientless player session for character GUID 46 (account 8). +ClientlessPlayerMgr started character GUID 46 (account 8). +Clientless login started for 'Selthas' (GUID 46, account 8). +TC> Registered clientless session for character GUID 54 (account 8), state=Loadi +ng. +Created clientless player session for character GUID 54 (account 8). +ClientlessPlayerMgr started character GUID 54 (account 8). +Clientless login started for 'Falaeriel' (GUID 54, account 8). +TC> Registered clientless session for character GUID 73 (account 10), state=Load +ing. +Created clientless player session for character GUID 73 (account 10). +ClientlessPlayerMgr started character GUID 73 (account 10). +Clientless login started for 'Rixzek' (GUID 73, account 10). +TC> Registered clientless session for character GUID 74 (account 11), state=Load +ing. +Created clientless player session for character GUID 74 (account 11). +ClientlessPlayerMgr started character GUID 74 (account 11). +Clientless login started for 'Nimbin' (GUID 74, account 11). +TC> Registered clientless session for character GUID 118 (account 15), state=Loa +ding. +Created clientless player session for character GUID 118 (account 15). +ClientlessPlayerMgr started character GUID 118 (account 15). +Clientless login started for 'Lillina' (GUID 118, account 15). +TC> Registered clientless session for character GUID 147 (account 17), state=Loa +ding. +Created clientless player session for character GUID 147 (account 17). +ClientlessPlayerMgr started character GUID 147 (account 17). +Clientless login started for 'Seraenriel' (GUID 147, account 17). +TC> Initialized transport GameObject grids: map=1 instance=0 grids=13 candidates +=17 +Clientless player character GUID 118 (account 15) reached state=Online. +Clientless player character GUID 74 (account 11) reached state=Online. +Loading saved respawn time of 1790175804 for spawnid (0,323981) - spawn does not + exist, ignoring +Loading saved respawn time of 1790090644 for spawnid (0,396680) - spawn does not + exist, ignoring +Loading saved respawn time of 1790019808 for spawnid (0,396681) - spawn does not + exist, ignoring +Loading saved respawn time of 1790019853 for spawnid (0,396682) - spawn does not + exist, ignoring +Initialized transport GameObject grids: map=0 instance=0 grids=4 candidates=15 +Clientless player character GUID 73 (account 10) reached state=Online. +Clientless player character GUID 54 (account 8) reached state=Online. +Initialized transport GameObject grids: map=571 instance=0 grids=18 candidates=4 +7 +Clientless player character GUID 46 (account 8) reached state=Online. +Player::LoadFromDB: Player (GUID Full: 0x0000000000000093 Type: Player Low: 147) + has too short taxi destination list, teleport to original node. +Initialized transport GameObject grids: map=530 instance=0 grids=5 candidates=8 +Clientless player character GUID 147 (account 17) reached state=Online. +Clientless player character GUID 43 (account 7) reached state=Online. +ClientlessLua initialized, script root '/home/wow_admin/wow_cata_server/source/T +rinityCore/src/server/scripts/Custom/clientless'. +[AdventureBot][Profile] loaded guid=118 name='Lillina' source='generated:118' ho +me='dun_morogh' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2 +.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=118 primary=2 +ClientlessLua[118]: adventure profile controller ready for Lillina +ClientlessLua[118]: executed generic adventure script '/home/wow_admin/wow_cata_ +server/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic +.lua'. +AREA_CATALOG revision=1 areas=3206 nodes=1098 taxiResolved=314 taxiClosedUnknown +=141 +ADVENTURE_CATALOG locations=2916 actions=86 lines=76 instanceBands=168 +INTENT_TRAVEL guid=118 intent='adventure' location='poi_guard_549' area=0 +[AdventureBot][Profile] loaded guid=74 name='Nimbin' source='generated:74' home= +'dun_morogh' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2.00 + personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=74 primary=2 +ClientlessLua[74]: adventure profile controller ready for Nimbin +ClientlessLua[74]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=74 intent='social' location='stonefire_tavern' area=0 +[AdventureBot][Profile] loaded guid=73 name='Rixzek' source='generated:73' home= +'durotar' canGroundMount=1 mounts=1 mountMinDistance=60.0 mountSpeedRate=2.00 pe +rsonality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=73 primary=2 +ClientlessLua[73]: adventure profile controller ready for Rixzek +ClientlessLua[73]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=73 intent='leisure' location='poi_guard_451' area=0 +[AdventureBot][Profile] loaded guid=54 name='Falaeriel' source='generated:54' ho +me='eversongwoods' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRat +e=2.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=54 primary=2 +ClientlessLua[54]: adventure profile controller ready for Falaeriel +ClientlessLua[54]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=54 intent='adventure' location='poi_guard_259' area=0 +[AdventureBot][Profile] loaded guid=46 name='Selthas' source='generated:46' home +='eversongwoods' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate= +2.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=46 primary=2 +ClientlessLua[46]: adventure profile controller ready for Selthas +ClientlessLua[46]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=46 intent='groupformation' location='poi_npc_286595' area=0 +[AdventureBot][Profile] loaded guid=147 name='Seraenriel' source='generated:147' + home='eversongwoods' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeed +Rate=2.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=147 primary=2 +ClientlessLua[147]: adventure profile controller ready for Seraenriel +ClientlessLua[147]: executed generic adventure script '/home/wow_admin/wow_cata_ +server/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic +.lua'. +INTENT_TRAVEL guid=147 intent='groupformation' location='poi_guard_346' area=0 +[AdventureBot][Profile] loaded guid=43 name='Fizzira' source='generated:43' home +='dun_morogh' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2.0 +0 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=43 primary=2 +ClientlessLua[43]: adventure profile controller ready for Fizzira +ClientlessLua[43]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +clientless info 43 +TC>clientless flight status 43 +TC>clientless transport status 43 +TC>clientless actioninfo 43 +TC>clientless interaction 43 +TC>clientless info 46 +TC>clientless flight status 46 +TC>clientless transport status 46 +TC>clientless actioninfo 46 +TC>clientless interaction 46 +TC>clientless info 54 +TC>CreatureAI::EngagementOver called even though creature is not currently engag +ed. +CreatureAI::EngagementOver called even though creature is not currently engaged. +clientless flight status 54 +TC>clientless transport status 54 +TC>clientless actioninfo 54 +TC>clientless interaction 54 +TC>clientless info 73 +TC>clientless flight status 73 +TC>clientless transport status 73 +TC>clientless actioninfo 73 +TC>clientless interaction 73 +TC>clientless info 74 +TC>clientless flight status 74 +TC>clientless transport status 74 +TC>clientless actioninfo 74 +TC>clientless interaction 74 +TC>clientless info 118 +TC>clientless flight status 118 +TC>clientless transport status 118 +TC>clientless actioninfo 118 +TC>clientless interaction 118 +TC>clientless info 147 +TC>clientless flight status 147 +TC>clientless transport status 147 +TC>clientless actioninfo 147 +TC>clientless interaction 147 +TC>Clientless GUID 43: account=7 state=Online +Intent: +Action queue: 0 +TC> Flight capability GUID 43: enabled=1 riding=225 flightLicense=1 coldWeather= +0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 43 has no action execution state. +TC> Bot group intent='groupformation' next='raid' forming=0 botLed=0 capacity=3 +meeting='poi_guard_55' +Group travel leader=0 separationMs=0 protected=0 flight=0 pending=0 route='' det +ail='' +Interactions guid=43 grouped=1 leader=47 partner=0 intent='' schedule='groupform +ation:poi_guard_55' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.45 loyalty=0.85 +TC> Clientless GUID 46: account=8 state=Online +Intent: groupformation + location = poi_npc_286595 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_npc_286595 +TC> Flight capability GUID 46: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 46: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='groupformation' next='profession' forming=1 botLed=0 capac +ity=3 meeting='poi_npc_286595' +No group travel state. +Interactions guid=46 grouped=0 leader=0 partner=0 intent='groupformation' schedu +le='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.76 loyalty=0.25 +TC> Clientless GUID 54: account=8 state=Online +Intent: adventure + location = poi_guard_259 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_259 +TC> Flight capability GUID 54: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 54: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='adventure' next='adventure' forming=0 botLed=0 capacity=3 +meeting='poi_guard_259' +No group travel state. +Interactions guid=54 grouped=0 leader=0 partner=0 intent='adventure' schedule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.90 loyalty=0.64 +TC> Clientless GUID 73: account=10 state=Online +Intent: leisure + location = poi_guard_451 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_451 +TC> Flight capability GUID 73: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 73: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='leisure' next='groupformation' forming=0 botLed=0 capacity +=3 meeting='poi_guard_451' +No group travel state. +Interactions guid=73 grouped=0 leader=0 partner=0 intent='leisure' schedule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.56 loyalty=0.32 +TC> Clientless GUID 74: account=11 state=Online +Intent: social + location = stonefire_tavern +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = stonefire_tavern +TC> Flight capability GUID 74: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 74: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='social' next='social' forming=0 botLed=0 capacity=10 meeti +ng='stonefire_tavern' +No group travel state. +Interactions guid=74 grouped=0 leader=0 partner=0 intent='social' schedule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.57 loyalty=0.72 +TC> Clientless GUID 118: account=15 state=Online +Intent: adventure + location = poi_guard_549 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_549 +TC> Flight capability GUID 118: enabled=1 riding=225 flightLicense=1 coldWeather +=1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 118: state=Idle action='' target='' targetGuid=0 entry=0 detail= +'' +TC> Bot group intent='adventure' next='groupformation' forming=0 botLed=0 capaci +ty=3 meeting='poi_guard_549' +No group travel state. +Interactions guid=118 grouped=0 leader=0 partner=0 intent='adventure' schedule=' +' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.64 loyalty=0.75 +TC> Clientless GUID 147: account=17 state=Online +Intent: groupformation + location = poi_guard_346 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_346 +TC> Flight capability GUID 147: enabled=1 riding=225 flightLicense=1 coldWeather +=0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 147: state=Idle action='' target='' targetGuid=0 entry=0 detail= +'' +TC> Bot group intent='groupformation' next='adventure' forming=1 botLed=0 capaci +ty=3 meeting='poi_guard_346' +No group travel state. +Interactions guid=147 grouped=0 leader=0 partner=0 intent='groupformation' sched +ule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.29 loyalty=0.86 +TC> [AdventureBot] loaded 3933 clientless world points. +[AdventureBot] ignoring travel edge id=1752 from='portal_go_83_source' to='porta +l_go_83_target': node missing +[AdventureBot] ignoring travel edge id=1822 from='dreadmaul' to='blastedlands_cr +ossroad0': node missing +[AdventureBot] ignoring travel edge id=1823 from='swamp_of_s_crossroad0' to='dre +admaul': node missing +[AdventureBot] ignoring travel edge id=1865 from='azurwatch' to='exodar_gate': n +ode missing +[AdventureBot] ignoring travel edge id=1866 from='ammen_valley' to='azurwatch': +node missing +[AdventureBot] ignoring travel edge id=1869 from='taxi_624' to='azurwatch': node + missing +[AdventureBot] loaded travel graph: 1098 node(s), 1938 directed edge(s). +tele name Fizzira Stormwind +TC>tele name Selthas Orgrimmar +TC>tele name Falaeriel Orgrimmar +TC>tele name Rixzek Orgrimmar +TC>tele name Nimbin Stormwind +TC>tele name Lillina Stormwind +TC>tele name Seraenriel Orgrimmar +TC>clientless adventure status 43 +TC>clientless logout status +TC>CPC_ROUTE target='portal_at_2171_target' totalMs=25337.956 navMs=17.106 probe +s=329 cacheHits=142 cacheSize=222 startMs=1.399 startCalls=2 flightMs=19037.744 +flightCalls=11372 +[AdventureBot] travel-location-planned guid=118 name='Lillina' location='poi_gua +rd_549' anchor='portal_at_2171_target' steps=10 directRadius=300.0 anchorRadius= +1000.0 +[AdventureBot] travel-route-step guid=118 name='Lillina' step=1/10 node='flight_ +departure' edgeType='start' +CPC_ROUTE target='ironforge_gate' totalMs=6119.392 navMs=29.092 probes=438 cache +Hits=418 cacheSize=401 startMs=1.139 startCalls=2 flightMs=4397.697 flightCalls= +16210 +[AdventureBot] travel-location-planned guid=74 name='Nimbin' location='stonefire +_tavern' anchor='ironforge_gate' steps=23 directRadius=300.0 anchorRadius=1000.0 +[AdventureBot] travel-route-step guid=74 name='Nimbin' step=1/23 node='flight_de +parture' edgeType='start' +CPC_ROUTE target='orgrimmar_main_gate' totalMs=2714.680 navMs=10.684 probes=122 +cacheHits=197 cacheSize=448 startMs=0.679 startCalls=14 flightMs=1672.349 flight +Calls=6486 +[AdventureBot] travel-location-planned guid=73 name='Rixzek' location='poi_guard +_451' anchor='orgrimmar_main_gate' steps=8 directRadius=300.0 anchorRadius=1000. +0 +[AdventureBot] travel-route-step guid=73 name='Rixzek' step=1/8 node='flight_dep +arture' edgeType='start' +CPC_ROUTE target='portal_go_47196_source' totalMs=5491.408 navMs=31.772 probes=4 +14 cacheHits=271 cacheSize=586 startMs=0.186 startCalls=2 flightMs=4187.629 flig +htCalls=7739 +[AdventureBot] travel-location-planned guid=54 name='Falaeriel' location='poi_gu +ard_259' anchor='portal_go_47196_source' steps=19 directRadius=300.0 anchorRadiu +s=1000.0 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/19 node='flight +_departure' edgeType='start' +CPC_ROUTE target='portal_at_2230_source' totalMs=2091.826 navMs=21.763 probes=22 +5 cacheHits=304 cacheSize=588 startMs=2.674 startCalls=2 flightMs=1626.526 fligh +tCalls=8672 +[AdventureBot] travel-location-planned guid=46 name='Selthas' location='poi_npc_ +286595' anchor='portal_at_2230_source' steps=7 directRadius=300.0 anchorRadius=1 +000.0 +[AdventureBot] travel-route-step guid=46 name='Selthas' step=1/7 node='flight_de +parture' edgeType='start' +CPC_ROUTE target='taxi_11' totalMs=615.964 navMs=0.717 probes=6 cacheHits=28 cac +heSize=588 startMs=2.744 startCalls=2 flightMs=514.901 flightCalls=4543 +[AdventureBot] travel-location-planned guid=147 name='Seraenriel' location='poi_ +guard_346' anchor='taxi_11' steps=3 directRadius=300.0 anchorRadius=1000.0 +[AdventureBot] travel-route-step guid=147 name='Seraenriel' step=1/3 node='taxi_ +205' edgeType='start' +CPC_PERF windowMs=56327 ticks=1389 players=7 travelMs=0.021 perceptionMs=1.498 t +ransportMs=0.040 flightMs=0.044 actionsMs=42402.047 controllersMs=1914.943 slowG +uid=118 slowMs=788.003 +You are teleporting Fizzira to Stormwind. +TC> You are teleporting Selthas to Orgrimmar. +TC> You are teleporting Falaeriel to Orgrimmar. +TC> You are teleporting Rixzek to Orgrimmar. +TC> You are teleporting Nimbin to Stormwind. +TC> You are teleporting Lillina to Stormwind. +TC> You are teleporting Seraenriel to Orgrimmar. +TC> Adventure GUID 43: enabled=1 schedule=1 phase=0 intent='' location='' micro= +'' deadline=0 detail='social/group interaction; original deadline retained' +TC> Safe logout pending=0 sessions=7 combat=0 transport=0 flight=0 loading=0 +TC> CPC_ROUTE target='portal_go_47196_source' totalMs=731.206 navMs=32.218 probe +s=276 cacheHits=409 cacheSize=588 startMs=0.077 startCalls=2 flightMs=484.192 fl +ightCalls=7956 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/18 node='flight +_departure' edgeType='start' +SUPPLY_RESTOCK guid=46 day=20261031 daily=0 afterCombat=1 +GROUP_CHANNEL guid=46 zone=1637 text='Ich suche Gefaehrten fuer gemeinsame Beruf +sarbeit. Ziel: HaldarrEncampment.' +SUPPLY_TOPUP guid=43 role='healing_potion' item=22829 added=1 stack=20 +SUPPLY_RESTOCK guid=43 day=20261031 daily=0 afterCombat=1 +clientless adventure area 43 +TC>clientless flight status 43 +TC>clientless transport status 43 +TC>clientless adventure area 46 +TC>clientless flight status 46 +TC>clientless transport status 46 +TC>clientless adventure area 54 +TC>clientless flight status 54 +TC>clientless transport status 54 +TC>clientless adventure area 73 +TC>clientless flight status 73 +TC>clientless transport status 73 +TC>clientless adventure area 74 +TC>clientless flight status 74 +TC>clientless transport status 74 +TC>clientless adventure area 118 +TC>clientless flight status 118 +TC>clientless transport status 118 +TC>clientless adventure area 147 +TC>clientless flight status 147 +TC>clientless transport status 147 +TC>reload config +TC>clientless population reload +TC>clientless test resume +TC>CPC_ROUTE target='portal_at_2171_target' totalMs=9222.790 navMs=9.078 probes= +75 cacheHits=476 cacheSize=592 startMs=13.774 startCalls=26 flightMs=6820.128 fl +ightCalls=11858 +[AdventureBot] travel-route-step guid=118 name='Lillina' step=1/2 node='virtual_ +ground_entry' edgeType='start' +CPC_ROUTE target='ironforge_gate' totalMs=847.074 navMs=6.864 probes=45 cacheHit +s=413 cacheSize=592 startMs=9.055 startCalls=26 flightMs=678.242 flightCalls=114 +31 +[AdventureBot] travel-route-step guid=74 name='Nimbin' step=1/3 node='stormwind_ +tradecenter' edgeType='start' +CPC_ROUTE target='orgrimmar_main_gate' totalMs=181.155 navMs=0.055 probes=7 cach +eHits=72 cacheSize=592 startMs=13.955 startCalls=27 flightMs=142.518 flightCalls +=2697 +[AdventureBot] travel-route-step guid=73 name='Rixzek' step=1/3 node='virtual_gr +ound_entry' edgeType='start' +CPC_ROUTE target='portal_go_47196_source' totalMs=3035.765 navMs=17.478 probes=1 +59 cacheHits=378 cacheSize=592 startMs=11.318 startCalls=27 flightMs=2107.831 fl +ightCalls=9941 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/10 node='flight +_departure' edgeType='start' +CPC_ROUTE target='portal_at_2230_source' totalMs=252.187 navMs=7.789 probes=64 c +acheHits=182 cacheSize=592 startMs=11.345 startCalls=27 flightMs=120.746 flightC +alls=6716 +[AdventureBot] travel-route-step guid=46 name='Selthas' step=1/2 node='virtual_g +round_entry' edgeType='start' +[AdventureBot] taxi-started guid=147 name='Seraenriel' routeStep=2/3 path=772 so +urce=205 destination=68 cost=1020 +Area access GUID 43: revision=1 map=0 area=5148 factionMask=1 minLevel=1 maxLeve +l=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 43: enabled=1 riding=225 flightLicense=1 coldWeather= +0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 46: revision=1 map=1 area=5170 factionMask=2 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 46: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 54: revision=1 map=1 area=5170 factionMask=2 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 54: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 73: revision=1 map=1 area=5170 factionMask=2 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 73: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 74: revision=1 map=0 area=5148 factionMask=1 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 74: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 118: revision=1 map=0 area=5148 factionMask=1 minLevel=1 ma +xLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 118: enabled=1 riding=225 flightLicense=1 coldWeather +=1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 147: revision=1 map=1 area=5170 factionMask=2 minLevel=1 ma +xLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 147: enabled=1 riding=225 flightLicense=1 coldWeather +=0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Using enUS DBC Locale +Will clear `logs` table of entries older than 1209600 seconds every 10 minutes. +Client cache version set to: 22011 +WORLD: MMap data directory is: /home/wow_admin/wow_cata_server/data/mmaps +VMap support included. LineOfSight: 1, getHeight: 1, indoorCheck: 1 +VMap data directory is: /home/wow_admin/wow_cata_server/data/vmaps +Missing name DungeonFinder.LowPopulation.Enable in config file /home/wow_admin/w +ow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopulati +on.Enable = 0" to this file +Missing name DungeonFinder.LowPopulation.FallbackDelay in config file /home/wow_ +admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowP +opulation.FallbackDelay = 60" to this file +Missing name DungeonFinder.LowPopulation.MinPlayers in config file /home/wow_adm +in/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopu +lation.MinPlayers = 1" to this file +Missing name DungeonFinder.LowPopulation.SoloGroupOutsideTimeout in config file +/home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonF +inder.LowPopulation.SoloGroupOutsideTimeout = 300" to this file +TC> Adventure loader enabled=1 schema=0 busy=1 pools=50/5/50/5 known=0 rotations +=0 manager=7 error='' +pool=0 faction=alliance persistent=1 target=50 online=0 pending=0 saved=0 +pool=1 faction=alliance persistent=0 target=5 online=0 pending=0 saved=0 +pool=2 faction=horde persistent=1 target=50 online=0 pending=0 saved=0 +pool=3 faction=horde persistent=0 target=5 online=0 pending=0 saved=0 +TC> Testbot job admission resumed; active runs remain controlled separately. +TC> [AdventureBot] recorded-ground-spline guid=118 name='Lillina' routeStep=2/2 +points=99 +[AdventureBot] recorded-ground-spline guid=73 name='Rixzek' routeStep=2/3 points +=9 +[AdventureBot] recorded-ground-spline guid=46 name='Selthas' routeStep=2/2 point +s=100 +INTENT_FALLBACK guid=73 from='poi_guard_451' to='poi_tele_1276' tried=1 retryMs= +2446 +INTENT_TRAVEL guid=73 intent='leisure' location='poi_tele_1276' area=0 +clientless population status +TC>Adventure loader enabled=1 schema=1 busy=0 pools=50/5/50/5 known=110 rotation +s=0 manager=7 error='' +pool=0 faction=alliance persistent=1 target=50 online=3 pending=0 saved=50 +pool=1 faction=alliance persistent=0 target=5 online=0 pending=0 saved=5 +pool=2 faction=horde persistent=1 target=50 online=3 pending=0 saved=50 +pool=3 faction=horde persistent=0 target=5 online=1 pending=0 saved=5 +TC> Registered clientless session for character GUID 26 (account 6), state=Loadi +ng. +Created clientless player session for character GUID 26 (account 6). +ClientlessPlayerMgr started character GUID 26 (account 6). +BOT_LOADER_LOGIN guid=26 pool=0 +Initialized transport GameObject grids: map=369 instance=0 grids=3 candidates=6 +Clientless player character GUID 26 (account 6) reached state=Online. +[AdventureBot][Profile] loaded guid=26 name='Arthoran' source='/home/wow_admin/w +ow_cata_server/source/TrinityCore/src/server/scripts/Custom/clientless/adventure +/profiles/arthoran.lua' home='elwynn' canGroundMount=1 mounts=1 mountMinDistance +=45.0 mountSpeedRate=1.60 personality=10 regionAffinity=4 activityAffinity=12 +PROFILE_PROFESSIONS guid=26 primary=2 +ClientlessLua[26]: Arthoran ready; no automatic test journey queued +ClientlessLua[26]: executed adventure override script '/home/wow_admin/wow_cata_ +server/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/overrid +es/arthoran.lua'. +INTENT_TRAVEL guid=26 intent='social' location='poi_npc_314313' area=0 +CPC_ROUTE target='taxi_36' totalMs=301.052 navMs=2.088 probes=28 cacheHits=37 ca +cheSize=610 startMs=1.235 startCalls=9 flightMs=264.480 flightCalls=5005 +[AdventureBot] travel-location-planned guid=26 name='Arthoran' location='poi_npc +_314313' anchor='taxi_36' steps=4 directRadius=300.0 anchorRadius=1000.0 +[AdventureBot] travel-route-step guid=26 name='Arthoran' step=1/4 node='virtual_ +ground_entry' edgeType='start' +[AdventureBot] recorded-ground-spline guid=26 name='Arthoran' routeStep=2/4 poin +ts=9 +Registered clientless session for character GUID 62 (account 9), state=Loading. +Created clientless player session for character GUID 62 (account 9). +ClientlessPlayerMgr started character GUID 62 (account 9). +BOT_LOADER_LOGIN guid=62 pool=1 +Clientless player character GUID 62 (account 9) reached state=Online. +[AdventureBot][Profile] loaded guid=62 name='Garenden' source='generated:62' hom +e='elwynn' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=1.60 p +ersonality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=62 primary=2 +ClientlessLua[62]: adventure profile controller ready for Garenden +ClientlessLua[62]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +BROWSER_QUEUE guid=62 intent='instance' joinEnabled=1 botOnlyTests=0 +INTENT_ARRIVED guid=73 intent='leisure' location='poi_tele_1276' +MICRO_START guid=73 intent='leisure' location='poi_tele_1276' action='leisure_vi +ew' durationMs=31000 +CPC_PERF windowMs=30009 ticks=621 players=9 travelMs=4.274 perceptionMs=16.999 t +ransportMs=0.096 flightMs=22.843 actionsMs=14603.872 controllersMs=6938.760 slow +Guid=73 slowMs=6772.348 +Registered clientless session for character GUID 34 (account 8), state=Loading. +Created clientless player session for character GUID 34 (account 8). +ClientlessPlayerMgr started character GUID 34 (account 8). +BOT_LOADER_LOGIN guid=34 pool=2 +Clientless player character GUID 34 (account 8) reached state=Online. +[AdventureBot][Profile] loaded guid=34 name='Sylaria' source='generated:34' home +='eversongwoods' canGroundMount=0 mounts=0 mountMinDistance=60.0 mountSpeedRate= +1.60 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=34 primary=2 +ClientlessLua[34]: adventure profile controller ready for Sylaria +ClientlessLua[34]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=34 intent='adventure' location='poi_tele_1278' area=0 +CPC_ROUTE target='orc_start' totalMs=716.590 navMs=5.958 probes=33 cacheHits=124 + cacheSize=610 startMs=19.715 startCalls=21 flightMs=0.000 flightCalls=0 +[AdventureBot] travel-location-planned guid=34 name='Sylaria' location='poi_tele +_1278' anchor='orc_start' steps=4 directRadius=300.0 anchorRadius=1000.0 +[AdventureBot] travel-route-step guid=34 name='Sylaria' step=1/4 node='virtual_g +round_entry' edgeType='start' +Registered clientless session for character GUID 63 (account 10), state=Loading. +Created clientless player session for character GUID 63 (account 10). +ClientlessPlayerMgr started character GUID 63 (account 10). +BOT_LOADER_LOGIN guid=63 pool=3 +Clientless player character GUID 63 (account 10) reached state=Online. +[AdventureBot][Profile] loaded guid=63 name='Drakuga' source='generated:63' home +='durotar' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2.00 p +ersonality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=63 primary=2 +ClientlessLua[63]: adventure profile controller ready for Drakuga +ClientlessLua[63]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=63 intent='groupformation' location='poi_guard_595' area=0 +[AdventureBot] travel-location-planned guid=63 name='Drakuga' location='poi_guar +d_595' anchor='portal_go_211359_source' steps=1 directRadius=300.0 anchorRadius= +1000.0 +[AdventureBot] taxi-started guid=74 name='Nimbin' routeStep=3/3 path=13 source=2 + destination=6 cost=50 +GROUP_CHANNEL guid=63 zone=1637 text='Ich suche Gefaehrten fuer eine gesellige R +unde. Ziel: Tinza Silvermug Innkeeper.' +CPC_ROUTE target='portal_go_47196_source' totalMs=2480.525 navMs=17.968 probes=1 +53 cacheHits=374 cacheSize=610 startMs=19.083 startCalls=27 flightMs=2223.657 fl +ightCalls=9685 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/10 node='flight +_departure' edgeType='start' +Registered clientless session for character GUID 33 (account 7), state=Loading. +Created clientless player session for character GUID 33 (account 7). +ClientlessPlayerMgr started character GUID 33 (account 7). +BOT_LOADER_LOGIN guid=33 pool=0 +[AdventureBot] recorded-ground-spline guid=26 name='Arthoran' routeStep=3/4 poin +ts=2 +Clientless player character GUID 33 (account 7) reached state=Online. +[AdventureBot][Profile] loaded guid=33 name='Tinkbin' source='generated:33' home +='dun_morogh' canGroundMount=0 mounts=0 mountMinDistance=60.0 mountSpeedRate=1.6 +0 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=33 primary=2 +ClientlessLua[33]: adventure profile controller ready for Tinkbin +ClientlessLua[33]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=33 intent='rest' location='poi_npc_307710' area=0 +CPC_ROUTE target='portal_go_211359_source' totalMs=2311.468 navMs=10.197 probes= +59 cacheHits=115 cacheSize=610 startMs=2.693 startCalls=29 flightMs=0.000 flight +Calls=0 +INTENT_FALLBACK guid=33 from='poi_npc_307710' to='poi_tele_1436' tried=1 retryMs +=2920 +SUPPLY_BAG guid=154 slot=19 item=54443 slots=22 +SUPPLY_BAG guid=154 slot=20 item=54443 slots=22 +SUPPLY_BAG guid=154 slot=21 item=54443 slots=22 +SUPPLY_BAG guid=154 slot=22 item=54443 slots=22 +CPC_ROUTE target='taxi_36' totalMs=131.050 navMs=1.817 probes=18 cacheHits=31 ca +cheSize=610 startMs=6.789 startCalls=23 flightMs=85.829 flightCalls=6757 +[AdventureBot] travel-route-step guid=26 name='Arthoran' step=1/2 node='virtual_ +ground_entry' edgeType='start' +[AdventureBot] recorded-ground-spline guid=26 name='Arthoran' routeStep=2/2 poin +ts=145 +CPC_ROUTE target='portal_go_47196_source' totalMs=920.971 navMs=15.274 probes=15 +0 cacheHits=378 cacheSize=610 startMs=14.694 startCalls=27 flightMs=720.101 flig +htCalls=9599 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/11 node='flight +_departure' edgeType='start' + diff --git a/doc/clientless/checkpoints/2026-10-31-browser/pending-runtime.log b/doc/clientless/checkpoints/2026-10-31-browser/pending-runtime.log new file mode 100644 index 0000000000..d74feaef5b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/pending-runtime.log @@ -0,0 +1,165 @@ +CPC_PERF windowMs=30001 ticks=8335 players=12 travelMs=0.370 perceptionMs=67.893 transportMs=0.621 flightMs=8.488 actionsMs=70.497 controllersMs=501.458 slowGuid=43 slowMs=4.981 +[AdventureBot] taxi-complete guid=91 name='Norara' path=38 source=21 destination=11 remaining=1.12 +[AdventureBot] taxi-started guid=91 name='Norara' routeStep=6/17 path=2075 source=11 destination=460 cost=0 +[AdventureBot] taxi-complete guid=45 name='Kargarrin' path=101 source=26 destination=27 remaining=3.18 +[AdventureBot] recorded-ground-spline guid=45 name='Kargarrin' routeStep=6/11 points=30 +CPC_PERF windowMs=30000 ticks=4989 players=12 travelMs=0.294 perceptionMs=52.089 transportMs=0.603 flightMs=5.412 actionsMs=46.038 controllersMs=324.855 slowGuid=45 slowMs=7.832 +Clientless removal requested for character GUID 45 (account 7), state=Removing. +CLIENTLESS_SAFE_LOGOUT guid=45 +Clientless player character GUID 45 (account 7) reached state=Offline. +[AdventureBot] taxi-complete guid=42 name='Zulana' path=2075 source=11 destination=460 remaining=3.48 +Clientless removal requested for character GUID 42 (account 8), state=Removing. +CLIENTLESS_SAFE_LOGOUT guid=42 +Clientless player character GUID 42 (account 8) reached state=Offline. +[AdventureBot] taxi-complete guid=92 name='Tholgar' path=12 source=6 destination=2 remaining=11.32 +[AdventureBot] taxi-started guid=92 name='Tholgar' routeStep=6/8 path=2221 source=2 destination=582 cost=0 +CPC_PERF windowMs=30000 ticks=7215 players=10 travelMs=0.464 perceptionMs=52.920 transportMs=0.866 flightMs=7.018 actionsMs=60.225 controllersMs=437.840 slowGuid=42 slowMs=7.830 +[AdventureBot] taxi-complete guid=91 name='Norara' path=2075 source=11 destination=460 remaining=3.48 +Clientless removal requested for character GUID 91 (account 12), state=Removing. +CLIENTLESS_SAFE_LOGOUT guid=91 +Clientless player character GUID 91 (account 12) reached state=Offline. +Command: clientless node list_nearby [Player: Allitester (GUID Full: 0x0000000000000015 Type: Player Low: 21) (Account: 1) X: -4137.014648 Y: -11503.443359 Z: 9.646135 Map: 530 (Outland) Area: 3524 (r) Zone: Unknown Selected: (GUID Full: 0x0000000000000000 Type: None Low: 0)] +Clientless removal requested for character GUID 125 (account 16), state=Removing. +CLIENTLESS_SAFE_LOGOUT guid=125 +Clientless player character GUID 125 (account 16) reached state=Offline. +[AdventureBot] taxi-complete guid=92 name='Tholgar' path=2221 source=2 destination=582 remaining=2.61 +Clientless removal requested for character GUID 92 (account 11), state=Removing. +CLIENTLESS_SAFE_LOGOUT guid=92 +Clientless player character GUID 92 (account 11) reached state=Offline. +CPC_PERF windowMs=30008 ticks=4889 players=7 travelMs=0.789 perceptionMs=41.280 transportMs=0.683 flightMs=4.955 actionsMs=34.863 controllersMs=301.536 slowGuid=92 slowMs=8.410 +CPC_PERF windowMs=30000 ticks=5066 players=7 travelMs=0.212 perceptionMs=31.715 transportMs=0.473 flightMs=4.477 actionsMs=24.908 controllersMs=268.089 slowGuid=43 slowMs=0.515 +Command: clientless node list_nearby [Player: Allitester (GUID Full: 0x0000000000000015 Type: Player Low: 21) (Account: 1) X: -4032.959229 Y: -11560.104492 Z: -138.286713 Map: 530 (Outland) Area: 3557 ( ) Zone: Unknown Selected: (GUID Full: 0x0000000000000000 Type: None Low: 0)] +clientless info 40 +[?2004l [?2004hTC>clientless flight status 40 +[?2004l [?2004hTC>clientless transport status 40 +[?2004l [?2004hTC>clientless actioninfo 40 +[?2004l [?2004hTC>Character GUID 40 is not managed by ClientlessPlayerMgr. +TC> No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 40 has no action execution state. +TC> clientless info 42 +[?2004l [?2004hTC>clientless flight status 42 +[?2004l [?2004hTC>clientless transport status 42 +[?2004l [?2004hTC>clientless actioninfo 42 +[?2004l [?2004hTC>clientless info 43 +[?2004l [?2004hTC>clientless flight status 43 +[?2004l [?2004hTC>clientless transport status 43 +[?2004l [?2004hTC>clientless actioninfo 43 +[?2004l [?2004hTC>clientless info 45 +[?2004l [?2004hTC>clientless flight status 45 +[?2004l [?2004hTC>clientless transport status 45 +[?2004l [?2004hTC>clientless actioninfo 45 +[?2004l [?2004hTC>clientless info 46 +[?2004l [?2004hTC>clientless flight status 46 +[?2004l [?2004hTC>clientless transport status 46 +[?2004l [?2004hTC>clientless actioninfo 46 +[?2004l [?2004hTC>Character GUID 42 is not managed by ClientlessPlayerMgr. +TC> No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 42 has no action execution state. +TC> Clientless GUID 43: account=7 state=Online +Intent: +Action queue: 0 +TC> Flight capability GUID 43: enabled=1 riding=225 flightLicense=1 coldWeather=0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 43: state=Idle action='' target='' targetGuid=0 entry=0 detail='' +TC> Character GUID 45 is not managed by ClientlessPlayerMgr. +TC> No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 45 has no action execution state. +TC> Clientless GUID 46: account=8 state=Online +Intent: groupformation + location = poi_npc_287214 +Action queue: 0 +TC> Flight capability GUID 46: enabled=1 riding=225 flightLicense=1 coldWeather=1 outdoors=1 +Flight GUID 46: state=Failed map=571 mountSpell=32244 segments=0 avoidances=0 handoffs=0 travelled=0.0 detail='no safe bounded flight corridor; holding position mounted' +TC> No transport ride state for this character. +TC> Action GUID 46: state=Failed action='travel_to_location' target='node:taxi_257' targetGuid=0 entry=0 detail='no safe bounded flight corridor; holding position mounted' +TC> clientless info 54 +[?2004l [?2004hTC>clientless flight status 54 +[?2004l [?2004hClientless GUID 54: account=8 state=Online +Intent: instance + location = instance_visit_at_5010 +Action queue: 0 +TTC> C>Flight capability GUID 54: enabled=1 riding=225 flightLicense=1 coldWeather=1 outdoors=1 +Flight GUID 54: state=Failed map=1 mountSpell=32245 segments=42 avoidances=40 handoffs=12 travelled=671.0 detail='no safe bounded flight corridor; holding position mounted' +TC> clientless transport status 54 +[?2004l [?2004hTC>clientless actioninfo 54 +[?2004l [?2004hTC>No transport ride state for this character. +TC> Action GUID 54: state=Failed action='travel_to_location' target='node:taxi_343' targetGuid=0 entry=0 detail='no safe bounded flight corridor; holding position mounted' +TC> clientless info 73 +[?2004l [?2004hTC>clientless flight status 73 +[?2004l [?2004hTC>clientless transport status 73 +[?2004l [?2004hTC>clientless actioninfo 73 +[?2004l [?2004hTC>Clientless GUID 73: account=10 state=Online +Intent: rest + location = poi_npc_286763 +Action queue: 0 +TC> Flight capability GUID 73: enabled=1 riding=225 flightLicense=1 coldWeather=1 outdoors=1 +Flight GUID 73: state=Failed map=0 mountSpell=32245 segments=47 avoidances=1 handoffs=28 travelled=978.8 detail='no safe bounded flight corridor; holding position mounted' +TC> No transport ride state for this character. +TC> Action GUID 73: state=Failed action='travel_to_location' target='node:portal_at_4354_source' targetGuid=0 entry=0 detail='no safe bounded flight corridor; holding position mounted' +TC> clientless info 74 +[?2004l [?2004hTC>clientless flight status 74 +[?2004l [?2004hTC>clientless transport status 74 +[?2004l [?2004hTC>clientless actioninfo 74 +[?2004l [?2004hTC>clientless info 91 +[?2004l [?2004hTC>clientless flight status 91 +[?2004l [?2004hTC>clientless transport status 91 +[?2004l [?2004hTC>clientless actioninfo 91 +[?2004l [?2004hTC>Clientless GUID 74: account=11 state=Online +Intent: adventure + location = poi_tele_318 +Action queue: 0 +TC> Flight capability GUID 74: enabled=1 riding=225 flightLicense=1 coldWeather=1 outdoors=1 +Flight GUID 74: state=Failed map=1 mountSpell=32235 segments=0 avoidances=0 handoffs=0 travelled=0.0 detail='no safe bounded flight corridor; holding position mounted' +TC> No transport ride state for this character. +TC> Action GUID 74: state=Failed action='travel_to_location' target='node:taxi_559' targetGuid=0 entry=0 detail='no safe bounded flight corridor; holding position mounted' +TC> Character GUID 91 is not managed by ClientlessPlayerMgr. +TC> No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 91 has no action execution state. +TC> clientless info 92 +[?2004l [?2004hTC>clientless flight status 92 +[?2004l [?2004hTC>clientless transport status 92 +[?2004l [?2004hTC>clientless actioninfo 92 +[?2004l [?2004hTC>clientless info 118 +[?2004l [?2004hTC>clientless flight status 118 +[?2004l [?2004hTC>clientless transport status 118 +[?2004l [?2004hTC>clientless actioninfo 118 +[?2004l [?2004hTC>Character GUID 92 is not managed by ClientlessPlayerMgr. +TC> No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 92 has no action execution state. +TC> Clientless GUID 118: account=15 state=Online +Intent: instance + location = instance_visit_at_4406 +Action queue: 0 +TC> Flight capability GUID 118: enabled=1 riding=225 flightLicense=1 coldWeather=1 outdoors=1 +Flight GUID 118: state=Failed map=1 mountSpell=32235 segments=0 avoidances=0 handoffs=0 travelled=0.0 detail='no safe bounded flight corridor; holding position mounted' +TC> No transport ride state for this character. +TC> Action GUID 118: state=Failed action='travel_to_location' target='node:taxi_559' targetGuid=0 entry=0 detail='no safe bounded flight corridor; holding position mounted' +TC> clientless info 125 +[?2004l [?2004hTC>clientless flight status 125 +[?2004l [?2004hTC>clientless transport status 125 +[?2004l [?2004hTC>clientless actioninfo 125 +[?2004l [?2004hTC>clientless info 147 +[?2004l [?2004hTC>clientless flight status 147 +[?2004l [?2004hTC>clientless transport status 147 +[?2004l [?2004hTC>clientless actioninfo 147 +[?2004l [?2004hTC>clientless logout status +[?2004l [?2004hTC>Character GUID 125 is not managed by ClientlessPlayerMgr. +TC> No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 125 has no action execution state. +TC> Clientless GUID 147: account=17 state=Online +Intent: rest + location = poi_guard_380 +Action queue: 0 +TC> Flight capability GUID 147: enabled=1 riding=225 flightLicense=1 coldWeather=0 outdoors=1 +Flight GUID 147: state=Arrived map=0 mountSpell=32244 segments=31 avoidances=5 handoffs=17 travelled=645.9 detail='landed on validated destination ground' +TC> No transport ride state for this character. +TC> Action GUID 147: state=Moving action='travel_to_location' target='node:taxi_205' targetGuid=0 entry=0 detail='taxi path 771 68 -> 205' +TC> Safe logout pending=7 sessions=7 combat=2 transport=0 flight=6 loading=0 +TC> WaypointMovementGenerator::DoInitialize: creature Orgrimmar Wind Rider (Entry: 51346 GUID: 39920 DB GUID: 287138) doesn't have waypoint path id: 0 diff --git a/doc/clientless/checkpoints/2026-10-31-browser/post-recovery-loader.log b/doc/clientless/checkpoints/2026-10-31-browser/post-recovery-loader.log new file mode 100644 index 0000000000..314d6ea5c1 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/post-recovery-loader.log @@ -0,0 +1,184 @@ +Hits=418 cacheSize=401 startMs=1.139 startCalls=2 flightMs=4397.697 flightCalls= +16210 +[AdventureBot] travel-location-planned guid=74 name='Nimbin' location='stonefire +_tavern' anchor='ironforge_gate' steps=23 directRadius=300.0 anchorRadius=1000.0 +[AdventureBot] travel-route-step guid=74 name='Nimbin' step=1/23 node='flight_de +parture' edgeType='start' +CPC_ROUTE target='orgrimmar_main_gate' totalMs=2714.680 navMs=10.684 probes=122 +cacheHits=197 cacheSize=448 startMs=0.679 startCalls=14 flightMs=1672.349 flight +Calls=6486 +[AdventureBot] travel-location-planned guid=73 name='Rixzek' location='poi_guard +_451' anchor='orgrimmar_main_gate' steps=8 directRadius=300.0 anchorRadius=1000. +0 +[AdventureBot] travel-route-step guid=73 name='Rixzek' step=1/8 node='flight_dep +arture' edgeType='start' +CPC_ROUTE target='portal_go_47196_source' totalMs=5491.408 navMs=31.772 probes=4 +14 cacheHits=271 cacheSize=586 startMs=0.186 startCalls=2 flightMs=4187.629 flig +htCalls=7739 +[AdventureBot] travel-location-planned guid=54 name='Falaeriel' location='poi_gu +ard_259' anchor='portal_go_47196_source' steps=19 directRadius=300.0 anchorRadiu +s=1000.0 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/19 node='flight +_departure' edgeType='start' +CPC_ROUTE target='portal_at_2230_source' totalMs=2091.826 navMs=21.763 probes=22 +5 cacheHits=304 cacheSize=588 startMs=2.674 startCalls=2 flightMs=1626.526 fligh +tCalls=8672 +[AdventureBot] travel-location-planned guid=46 name='Selthas' location='poi_npc_ +286595' anchor='portal_at_2230_source' steps=7 directRadius=300.0 anchorRadius=1 +000.0 +[AdventureBot] travel-route-step guid=46 name='Selthas' step=1/7 node='flight_de +parture' edgeType='start' +CPC_ROUTE target='taxi_11' totalMs=615.964 navMs=0.717 probes=6 cacheHits=28 cac +heSize=588 startMs=2.744 startCalls=2 flightMs=514.901 flightCalls=4543 +[AdventureBot] travel-location-planned guid=147 name='Seraenriel' location='poi_ +guard_346' anchor='taxi_11' steps=3 directRadius=300.0 anchorRadius=1000.0 +[AdventureBot] travel-route-step guid=147 name='Seraenriel' step=1/3 node='taxi_ +205' edgeType='start' +CPC_PERF windowMs=56327 ticks=1389 players=7 travelMs=0.021 perceptionMs=1.498 t +ransportMs=0.040 flightMs=0.044 actionsMs=42402.047 controllersMs=1914.943 slowG +uid=118 slowMs=788.003 +You are teleporting Fizzira to Stormwind. +TC> You are teleporting Selthas to Orgrimmar. +TC> You are teleporting Falaeriel to Orgrimmar. +TC> You are teleporting Rixzek to Orgrimmar. +TC> You are teleporting Nimbin to Stormwind. +TC> You are teleporting Lillina to Stormwind. +TC> You are teleporting Seraenriel to Orgrimmar. +TC> Adventure GUID 43: enabled=1 schedule=1 phase=0 intent='' location='' micro= +'' deadline=0 detail='social/group interaction; original deadline retained' +TC> Safe logout pending=0 sessions=7 combat=0 transport=0 flight=0 loading=0 +TC> CPC_ROUTE target='portal_go_47196_source' totalMs=731.206 navMs=32.218 probe +s=276 cacheHits=409 cacheSize=588 startMs=0.077 startCalls=2 flightMs=484.192 fl +ightCalls=7956 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/18 node='flight +_departure' edgeType='start' +SUPPLY_RESTOCK guid=46 day=20261031 daily=0 afterCombat=1 +GROUP_CHANNEL guid=46 zone=1637 text='Ich suche Gefaehrten fuer gemeinsame Beruf +sarbeit. Ziel: HaldarrEncampment.' +SUPPLY_TOPUP guid=43 role='healing_potion' item=22829 added=1 stack=20 +SUPPLY_RESTOCK guid=43 day=20261031 daily=0 afterCombat=1 +clientless adventure area 43 +TC>clientless flight status 43 +TC>clientless transport status 43 +TC>clientless adventure area 46 +TC>clientless flight status 46 +TC>clientless transport status 46 +TC>clientless adventure area 54 +TC>clientless flight status 54 +TC>clientless transport status 54 +TC>clientless adventure area 73 +TC>clientless flight status 73 +TC>clientless transport status 73 +TC>clientless adventure area 74 +TC>clientless flight status 74 +TC>clientless transport status 74 +TC>clientless adventure area 118 +TC>clientless flight status 118 +TC>clientless transport status 118 +TC>clientless adventure area 147 +TC>clientless flight status 147 +TC>clientless transport status 147 +TC>reload config +TC>clientless population reload +TC>clientless test resume +TC>CPC_ROUTE target='portal_at_2171_target' totalMs=9222.790 navMs=9.078 probes= +75 cacheHits=476 cacheSize=592 startMs=13.774 startCalls=26 flightMs=6820.128 fl +ightCalls=11858 +[AdventureBot] travel-route-step guid=118 name='Lillina' step=1/2 node='virtual_ +ground_entry' edgeType='start' +CPC_ROUTE target='ironforge_gate' totalMs=847.074 navMs=6.864 probes=45 cacheHit +s=413 cacheSize=592 startMs=9.055 startCalls=26 flightMs=678.242 flightCalls=114 +31 +[AdventureBot] travel-route-step guid=74 name='Nimbin' step=1/3 node='stormwind_ +tradecenter' edgeType='start' +CPC_ROUTE target='orgrimmar_main_gate' totalMs=181.155 navMs=0.055 probes=7 cach +eHits=72 cacheSize=592 startMs=13.955 startCalls=27 flightMs=142.518 flightCalls +=2697 +[AdventureBot] travel-route-step guid=73 name='Rixzek' step=1/3 node='virtual_gr +ound_entry' edgeType='start' +CPC_ROUTE target='portal_go_47196_source' totalMs=3035.765 navMs=17.478 probes=1 +59 cacheHits=378 cacheSize=592 startMs=11.318 startCalls=27 flightMs=2107.831 fl +ightCalls=9941 +[AdventureBot] travel-route-step guid=54 name='Falaeriel' step=1/10 node='flight +_departure' edgeType='start' +CPC_ROUTE target='portal_at_2230_source' totalMs=252.187 navMs=7.789 probes=64 c +acheHits=182 cacheSize=592 startMs=11.345 startCalls=27 flightMs=120.746 flightC +alls=6716 +[AdventureBot] travel-route-step guid=46 name='Selthas' step=1/2 node='virtual_g +round_entry' edgeType='start' +[AdventureBot] taxi-started guid=147 name='Seraenriel' routeStep=2/3 path=772 so +urce=205 destination=68 cost=1020 +Area access GUID 43: revision=1 map=0 area=5148 factionMask=1 minLevel=1 maxLeve +l=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 43: enabled=1 riding=225 flightLicense=1 coldWeather= +0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 46: revision=1 map=1 area=5170 factionMask=2 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 46: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 54: revision=1 map=1 area=5170 factionMask=2 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 54: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 73: revision=1 map=1 area=5170 factionMask=2 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 73: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 74: revision=1 map=0 area=5148 factionMask=1 minLevel=1 max +Level=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 74: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 118: revision=1 map=0 area=5148 factionMask=1 minLevel=1 ma +xLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 118: enabled=1 riding=225 flightLicense=1 coldWeather +=1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Area access GUID 147: revision=1 map=1 area=5170 factionMask=2 minLevel=1 ma +xLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=1 +TC> Flight capability GUID 147: enabled=1 riding=225 flightLicense=1 coldWeather +=0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Using enUS DBC Locale +Will clear `logs` table of entries older than 1209600 seconds every 10 minutes. +Client cache version set to: 22011 +WORLD: MMap data directory is: /home/wow_admin/wow_cata_server/data/mmaps +VMap support included. LineOfSight: 1, getHeight: 1, indoorCheck: 1 +VMap data directory is: /home/wow_admin/wow_cata_server/data/vmaps +Missing name DungeonFinder.LowPopulation.Enable in config file /home/wow_admin/w +ow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopulati +on.Enable = 0" to this file +Missing name DungeonFinder.LowPopulation.FallbackDelay in config file /home/wow_ +admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowP +opulation.FallbackDelay = 60" to this file +Missing name DungeonFinder.LowPopulation.MinPlayers in config file /home/wow_adm +in/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopu +lation.MinPlayers = 1" to this file +Missing name DungeonFinder.LowPopulation.SoloGroupOutsideTimeout in config file +/home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonF +inder.LowPopulation.SoloGroupOutsideTimeout = 300" to this file +TC> Adventure loader enabled=1 schema=0 busy=1 pools=50/5/50/5 known=0 rotations +=0 manager=7 error='' +pool=0 faction=alliance persistent=1 target=50 online=0 pending=0 saved=0 +pool=1 faction=alliance persistent=0 target=5 online=0 pending=0 saved=0 +pool=2 faction=horde persistent=1 target=50 online=0 pending=0 saved=0 +pool=3 faction=horde persistent=0 target=5 online=0 pending=0 saved=0 +TC> Testbot job admission resumed; active runs remain controlled separately. +TC> [AdventureBot] recorded-ground-spline guid=118 name='Lillina' routeStep=2/2 +points=99 +[AdventureBot] recorded-ground-spline guid=73 name='Rixzek' routeStep=2/3 points +=9 +[AdventureBot] recorded-ground-spline guid=46 name='Selthas' routeStep=2/2 point +s=100 + diff --git a/doc/clientless/checkpoints/2026-10-31-browser/post-start-recovery.log b/doc/clientless/checkpoints/2026-10-31-browser/post-start-recovery.log new file mode 100644 index 0000000000..f7ae8e4ffe --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/post-start-recovery.log @@ -0,0 +1,284 @@ +TC> Registered clientless session for character GUID 74 (account 11), state=Load +ing. +Created clientless player session for character GUID 74 (account 11). +ClientlessPlayerMgr started character GUID 74 (account 11). +Clientless login started for 'Nimbin' (GUID 74, account 11). +TC> Registered clientless session for character GUID 118 (account 15), state=Loa +ding. +Created clientless player session for character GUID 118 (account 15). +ClientlessPlayerMgr started character GUID 118 (account 15). +Clientless login started for 'Lillina' (GUID 118, account 15). +TC> Registered clientless session for character GUID 147 (account 17), state=Loa +ding. +Created clientless player session for character GUID 147 (account 17). +ClientlessPlayerMgr started character GUID 147 (account 17). +Clientless login started for 'Seraenriel' (GUID 147, account 17). +TC> Initialized transport GameObject grids: map=1 instance=0 grids=13 candidates +=17 +Clientless player character GUID 118 (account 15) reached state=Online. +Clientless player character GUID 74 (account 11) reached state=Online. +Loading saved respawn time of 1790175804 for spawnid (0,323981) - spawn does not + exist, ignoring +Loading saved respawn time of 1790090644 for spawnid (0,396680) - spawn does not + exist, ignoring +Loading saved respawn time of 1790019808 for spawnid (0,396681) - spawn does not + exist, ignoring +Loading saved respawn time of 1790019853 for spawnid (0,396682) - spawn does not + exist, ignoring +Initialized transport GameObject grids: map=0 instance=0 grids=4 candidates=15 +Clientless player character GUID 73 (account 10) reached state=Online. +Clientless player character GUID 54 (account 8) reached state=Online. +Initialized transport GameObject grids: map=571 instance=0 grids=18 candidates=4 +7 +Clientless player character GUID 46 (account 8) reached state=Online. +Player::LoadFromDB: Player (GUID Full: 0x0000000000000093 Type: Player Low: 147) + has too short taxi destination list, teleport to original node. +Initialized transport GameObject grids: map=530 instance=0 grids=5 candidates=8 +Clientless player character GUID 147 (account 17) reached state=Online. +Clientless player character GUID 43 (account 7) reached state=Online. +ClientlessLua initialized, script root '/home/wow_admin/wow_cata_server/source/T +rinityCore/src/server/scripts/Custom/clientless'. +[AdventureBot][Profile] loaded guid=118 name='Lillina' source='generated:118' ho +me='dun_morogh' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2 +.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=118 primary=2 +ClientlessLua[118]: adventure profile controller ready for Lillina +ClientlessLua[118]: executed generic adventure script '/home/wow_admin/wow_cata_ +server/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic +.lua'. +AREA_CATALOG revision=1 areas=3206 nodes=1098 taxiResolved=314 taxiClosedUnknown +=141 +ADVENTURE_CATALOG locations=2916 actions=86 lines=76 instanceBands=168 +INTENT_TRAVEL guid=118 intent='adventure' location='poi_guard_549' area=0 +[AdventureBot][Profile] loaded guid=74 name='Nimbin' source='generated:74' home= +'dun_morogh' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2.00 + personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=74 primary=2 +ClientlessLua[74]: adventure profile controller ready for Nimbin +ClientlessLua[74]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=74 intent='social' location='stonefire_tavern' area=0 +[AdventureBot][Profile] loaded guid=73 name='Rixzek' source='generated:73' home= +'durotar' canGroundMount=1 mounts=1 mountMinDistance=60.0 mountSpeedRate=2.00 pe +rsonality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=73 primary=2 +ClientlessLua[73]: adventure profile controller ready for Rixzek +ClientlessLua[73]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=73 intent='leisure' location='poi_guard_451' area=0 +[AdventureBot][Profile] loaded guid=54 name='Falaeriel' source='generated:54' ho +me='eversongwoods' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRat +e=2.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=54 primary=2 +ClientlessLua[54]: adventure profile controller ready for Falaeriel +ClientlessLua[54]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=54 intent='adventure' location='poi_guard_259' area=0 +[AdventureBot][Profile] loaded guid=46 name='Selthas' source='generated:46' home +='eversongwoods' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate= +2.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=46 primary=2 +ClientlessLua[46]: adventure profile controller ready for Selthas +ClientlessLua[46]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=46 intent='groupformation' location='poi_npc_286595' area=0 +[AdventureBot][Profile] loaded guid=147 name='Seraenriel' source='generated:147' + home='eversongwoods' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeed +Rate=2.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=147 primary=2 +ClientlessLua[147]: adventure profile controller ready for Seraenriel +ClientlessLua[147]: executed generic adventure script '/home/wow_admin/wow_cata_ +server/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic +.lua'. +INTENT_TRAVEL guid=147 intent='groupformation' location='poi_guard_346' area=0 +[AdventureBot][Profile] loaded guid=43 name='Fizzira' source='generated:43' home +='dun_morogh' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2.0 +0 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=43 primary=2 +ClientlessLua[43]: adventure profile controller ready for Fizzira +ClientlessLua[43]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +clientless info 43 +TC>clientless flight status 43 +TC>clientless transport status 43 +TC>clientless actioninfo 43 +TC>clientless interaction 43 +TC>clientless info 46 +TC>clientless flight status 46 +TC>clientless transport status 46 +TC>clientless actioninfo 46 +TC>clientless interaction 46 +TC>clientless info 54 +TC>CreatureAI::EngagementOver called even though creature is not currently engag +ed. +CreatureAI::EngagementOver called even though creature is not currently engaged. +clientless flight status 54 +TC>clientless transport status 54 +TC>clientless actioninfo 54 +TC>clientless interaction 54 +TC>clientless info 73 +TC>clientless flight status 73 +TC>clientless transport status 73 +TC>clientless actioninfo 73 +TC>clientless interaction 73 +TC>clientless info 74 +TC>clientless flight status 74 +TC>clientless transport status 74 +TC>clientless actioninfo 74 +TC>clientless interaction 74 +TC>clientless info 118 +TC>clientless flight status 118 +TC>clientless transport status 118 +TC>clientless actioninfo 118 +TC>clientless interaction 118 +TC>clientless info 147 +TC>clientless flight status 147 +TC>clientless transport status 147 +TC>clientless actioninfo 147 +TC>clientless interaction 147 +TC>Clientless GUID 43: account=7 state=Online +Intent: +Action queue: 0 +TC> Flight capability GUID 43: enabled=1 riding=225 flightLicense=1 coldWeather= +0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Clientless GUID 43 has no action execution state. +TC> Bot group intent='groupformation' next='raid' forming=0 botLed=0 capacity=3 +meeting='poi_guard_55' +Group travel leader=0 separationMs=0 protected=0 flight=0 pending=0 route='' det +ail='' +Interactions guid=43 grouped=1 leader=47 partner=0 intent='' schedule='groupform +ation:poi_guard_55' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.45 loyalty=0.85 +TC> Clientless GUID 46: account=8 state=Online +Intent: groupformation + location = poi_npc_286595 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_npc_286595 +TC> Flight capability GUID 46: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 46: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='groupformation' next='profession' forming=1 botLed=0 capac +ity=3 meeting='poi_npc_286595' +No group travel state. +Interactions guid=46 grouped=0 leader=0 partner=0 intent='groupformation' schedu +le='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.76 loyalty=0.25 +TC> Clientless GUID 54: account=8 state=Online +Intent: adventure + location = poi_guard_259 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_259 +TC> Flight capability GUID 54: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 54: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='adventure' next='adventure' forming=0 botLed=0 capacity=3 +meeting='poi_guard_259' +No group travel state. +Interactions guid=54 grouped=0 leader=0 partner=0 intent='adventure' schedule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.90 loyalty=0.64 +TC> Clientless GUID 73: account=10 state=Online +Intent: leisure + location = poi_guard_451 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_451 +TC> Flight capability GUID 73: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 73: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='leisure' next='groupformation' forming=0 botLed=0 capacity +=3 meeting='poi_guard_451' +No group travel state. +Interactions guid=73 grouped=0 leader=0 partner=0 intent='leisure' schedule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.56 loyalty=0.32 +TC> Clientless GUID 74: account=11 state=Online +Intent: social + location = stonefire_tavern +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = stonefire_tavern +TC> Flight capability GUID 74: enabled=1 riding=225 flightLicense=1 coldWeather= +1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 74: state=Idle action='' target='' targetGuid=0 entry=0 detail=' +' +TC> Bot group intent='social' next='social' forming=0 botLed=0 capacity=10 meeti +ng='stonefire_tavern' +No group travel state. +Interactions guid=74 grouped=0 leader=0 partner=0 intent='social' schedule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.57 loyalty=0.72 +TC> Clientless GUID 118: account=15 state=Online +Intent: adventure + location = poi_guard_549 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_549 +TC> Flight capability GUID 118: enabled=1 riding=225 flightLicense=1 coldWeather +=1 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 118: state=Idle action='' target='' targetGuid=0 entry=0 detail= +'' +TC> Bot group intent='adventure' next='groupformation' forming=0 botLed=0 capaci +ty=3 meeting='poi_guard_549' +No group travel state. +Interactions guid=118 grouped=0 leader=0 partner=0 intent='adventure' schedule=' +' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.64 loyalty=0.75 +TC> Clientless GUID 147: account=17 state=Online +Intent: groupformation + location = poi_guard_346 +Action queue: 1 + [0] travel_to_location + hard_destination = false + id = poi_guard_346 +TC> Flight capability GUID 147: enabled=1 riding=225 flightLicense=1 coldWeather +=0 outdoors=1 +No free-flight state for this character. +TC> No transport ride state for this character. +TC> Action GUID 147: state=Idle action='' target='' targetGuid=0 entry=0 detail= +'' +TC> Bot group intent='groupformation' next='adventure' forming=1 botLed=0 capaci +ty=3 meeting='poi_guard_346' +No group travel state. +Interactions guid=147 grouped=0 leader=0 partner=0 intent='groupformation' sched +ule='' + leaderIdleSeconds=0 afkSeconds=0 sociability=0.29 loyalty=0.86 +TC> [AdventureBot] loaded 3933 clientless world points. +[AdventureBot] ignoring travel edge id=1752 from='portal_go_83_source' to='porta +l_go_83_target': node missing +[AdventureBot] ignoring travel edge id=1822 from='dreadmaul' to='blastedlands_cr +ossroad0': node missing +[AdventureBot] ignoring travel edge id=1823 from='swamp_of_s_crossroad0' to='dre +admaul': node missing +[AdventureBot] ignoring travel edge id=1865 from='azurwatch' to='exodar_gate': n +ode missing +[AdventureBot] ignoring travel edge id=1866 from='ammen_valley' to='azurwatch': +node missing +[AdventureBot] ignoring travel edge id=1869 from='taxi_624' to='azurwatch': node + missing +[AdventureBot] loaded travel graph: 1098 node(s), 1938 directed edge(s). + diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/final-summary.json b/doc/clientless/checkpoints/2026-10-31-browser/regression/final-summary.json new file mode 100644 index 0000000000..74885c3b5e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/final-summary.json @@ -0,0 +1,754 @@ +{ + "total": 120, + "passed": 120, + "failed": 0, + "initial_passed": 114, + "adapter_updates": [ + "test_adventure_area_node.py", + "test_adventure_day_persistence.py", + "test_adventure_destination_level.py", + "test_adventure_instance_persistence.py", + "test_adventure_interactions.py", + "test_adventure_leisure.py" + ], + "results": [ + { + "name": "test_adventure_area_node.py", + "exit_code": 0, + "seconds": 0.44, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log", + "rerun_output": "Production area destination excludes outside and unreachable graph nodes.\n", + "initial_failure_log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log", + "resolved": "Updated native test adapters and added behavior checks." + }, + { + "name": "test_adventure_area_policy.py", + "exit_code": 0, + "seconds": 0.546, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_policy.log" + }, + { + "name": "test_adventure_area_segment.py", + "exit_code": 0, + "seconds": 0.738, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_segment.log" + }, + { + "name": "test_adventure_async_database.py", + "exit_code": 0, + "seconds": 0.024, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_async_database.log" + }, + { + "name": "test_adventure_behavior_policy.py", + "exit_code": 0, + "seconds": 0.805, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_behavior_policy.log" + }, + { + "name": "test_adventure_class_rotation.py", + "exit_code": 0, + "seconds": 0.408, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_class_rotation.log" + }, + { + "name": "test_adventure_combat_exercise.py", + "exit_code": 0, + "seconds": 0.777, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_exercise.log" + }, + { + "name": "test_adventure_combat_preparation.py", + "exit_code": 0, + "seconds": 0.454, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_preparation.log" + }, + { + "name": "test_adventure_combat_reactions.py", + "exit_code": 0, + "seconds": 1.117, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_reactions.log" + }, + { + "name": "test_adventure_day_persistence.py", + "exit_code": 0, + "seconds": 0.599, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log", + "rerun_output": "Production day planner: all 24 TINYINT slots restored across logins, incomplete/old-day replacement, full transaction and curiosity/level weighting passed\n", + "initial_failure_log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log", + "resolved": "Updated native test adapters and added behavior checks." + }, + { + "name": "test_adventure_destination_level.py", + "exit_code": 0, + "seconds": 0.339, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log", + "rerun_output": "Native dungeon/raid minimum levels, unknown destinations and strict adventure invitation levels passed\n", + "initial_failure_log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log", + "resolved": "Updated native test adapters and added behavior checks." + }, + { + "name": "test_adventure_economy.py", + "exit_code": 0, + "seconds": 0.749, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy.log" + }, + { + "name": "test_adventure_economy_catalog.py", + "exit_code": 0, + "seconds": 0.038, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy_catalog.log" + }, + { + "name": "test_adventure_encounter.py", + "exit_code": 0, + "seconds": 0.688, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_encounter.log" + }, + { + "name": "test_adventure_equipment_maintenance.py", + "exit_code": 0, + "seconds": 0.607, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_equipment_maintenance.log" + }, + { + "name": "test_adventure_exploration.py", + "exit_code": 0, + "seconds": 0.617, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration.log" + }, + { + "name": "test_adventure_exploration_catalog.py", + "exit_code": 0, + "seconds": 0.025, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration_catalog.log" + }, + { + "name": "test_adventure_generator_equipment.py", + "exit_code": 0, + "seconds": 0.699, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_equipment.log" + }, + { + "name": "test_adventure_generator_ownership.py", + "exit_code": 0, + "seconds": 0.793, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_ownership.log" + }, + { + "name": "test_adventure_generator_policy.py", + "exit_code": 0, + "seconds": 4.129, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_policy.log" + }, + { + "name": "test_adventure_graph_handover.py", + "exit_code": 0, + "seconds": 0.519, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_graph_handover.log" + }, + { + "name": "test_adventure_ground_avoidance.py", + "exit_code": 0, + "seconds": 0.475, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_ground_avoidance.log" + }, + { + "name": "test_adventure_group_departure.py", + "exit_code": 0, + "seconds": 0.869, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_departure.log" + }, + { + "name": "test_adventure_group_gather.py", + "exit_code": 0, + "seconds": 0.536, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_gather.log" + }, + { + "name": "test_adventure_group_plan.py", + "exit_code": 0, + "seconds": 0.672, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_plan.log" + }, + { + "name": "test_adventure_group_travel.py", + "exit_code": 0, + "seconds": 1.367, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_travel.log" + }, + { + "name": "test_adventure_groups.py", + "exit_code": 0, + "seconds": 1.36, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_groups.log" + }, + { + "name": "test_adventure_instance.py", + "exit_code": 0, + "seconds": 0.51, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance.log" + }, + { + "name": "test_adventure_instance_autoresume.py", + "exit_code": 0, + "seconds": 0.742, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_autoresume.log" + }, + { + "name": "test_adventure_instance_begin.py", + "exit_code": 0, + "seconds": 0.665, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_begin.log" + }, + { + "name": "test_adventure_instance_catalog.py", + "exit_code": 0, + "seconds": 0.028, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_catalog.log" + }, + { + "name": "test_adventure_instance_loader.py", + "exit_code": 0, + "seconds": 0.806, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_loader.log" + }, + { + "name": "test_adventure_instance_persistence.py", + "exit_code": 0, + "seconds": 0.396, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log", + "rerun_output": "Production instance persistence: phases, original deadline, instance ID, transactional HP marker, failed commit and intent release passed.\n", + "initial_failure_log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log", + "resolved": "Updated native test adapters and added behavior checks." + }, + { + "name": "test_adventure_instance_variants.py", + "exit_code": 0, + "seconds": 0.764, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_variants.log" + }, + { + "name": "test_adventure_intent_state.py", + "exit_code": 0, + "seconds": 0.729, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_intent_state.log" + }, + { + "name": "test_adventure_interactions.py", + "exit_code": 0, + "seconds": 0.599, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log", + "rerun_output": "/tmp/tmpqf3qnkok/test.cpp: In member function \u2018void AdventureInteractionMgr::Leave(Player*, Record&, const char*)\u2019:\n/tmp/tmpqf3qnkok/test.cpp:145:69: warning: unused parameter \u2018reason\u2019 [-Wunused-parameter]\n 145 | void AdventureInteractionMgr::Leave(Player* p,Record& r,char const* reason)\n | ~~~~~~~~~~~~^~~~~~\nproduction interaction manager: invitations, factions, reservations, follow, AFK and deferred departure passed\n", + "initial_failure_log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log", + "resolved": "Updated native test adapters and added behavior checks." + }, + { + "name": "test_adventure_leisure.py", + "exit_code": 0, + "seconds": 0.539, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log", + "rerun_output": "Leisure: substantial curved MMAP routes, mirrored return, interrupted return, rejected corridors, actual arrival, companion follow, riding, flight and fishing passed.\n", + "initial_failure_log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log", + "resolved": "Updated native test adapters and added behavior checks." + }, + { + "name": "test_adventure_leisure_catalog.py", + "exit_code": 0, + "seconds": 0.03, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure_catalog.log" + }, + { + "name": "test_adventure_location_import.py", + "exit_code": 0, + "seconds": 0.633, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_location_import.log" + }, + { + "name": "test_adventure_manager_inventory.py", + "exit_code": 0, + "seconds": 0.529, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_manager_inventory.log" + }, + { + "name": "test_adventure_micro_reset.py", + "exit_code": 0, + "seconds": 0.345, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_micro_reset.log" + }, + { + "name": "test_adventure_native_lfg.py", + "exit_code": 0, + "seconds": 0.389, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_native_lfg.log" + }, + { + "name": "test_adventure_navigation_rescue.py", + "exit_code": 0, + "seconds": 0.47, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_navigation_rescue.log" + }, + { + "name": "test_adventure_northrend_flight.py", + "exit_code": 0, + "seconds": 0.642, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_northrend_flight.log" + }, + { + "name": "test_adventure_poi_binding.py", + "exit_code": 0, + "seconds": 0.644, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_poi_binding.log" + }, + { + "name": "test_adventure_population.py", + "exit_code": 0, + "seconds": 0.738, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_population.log" + }, + { + "name": "test_adventure_profession_catalog.py", + "exit_code": 0, + "seconds": 0.03, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_catalog.log" + }, + { + "name": "test_adventure_profession_profile.py", + "exit_code": 0, + "seconds": 0.567, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_profile.log" + }, + { + "name": "test_adventure_profession_sightline.py", + "exit_code": 0, + "seconds": 0.523, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_sightline.log" + }, + { + "name": "test_adventure_profession_targets.py", + "exit_code": 0, + "seconds": 0.861, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_targets.log" + }, + { + "name": "test_adventure_profile_selection.py", + "exit_code": 0, + "seconds": 0.48, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profile_selection.log" + }, + { + "name": "test_adventure_pvp.py", + "exit_code": 0, + "seconds": 0.662, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_pvp.log" + }, + { + "name": "test_adventure_recovery_policy.py", + "exit_code": 0, + "seconds": 0.489, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_recovery_policy.log" + }, + { + "name": "test_adventure_repair_catalog.py", + "exit_code": 0, + "seconds": 0.027, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_repair_catalog.log" + }, + { + "name": "test_adventure_rest.py", + "exit_code": 0, + "seconds": 0.785, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest.log" + }, + { + "name": "test_adventure_rest_fire.py", + "exit_code": 0, + "seconds": 0.662, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_fire.log" + }, + { + "name": "test_adventure_rest_space.py", + "exit_code": 0, + "seconds": 0.465, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_space.log" + }, + { + "name": "test_adventure_rest_targets.py", + "exit_code": 0, + "seconds": 0.711, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_targets.log" + }, + { + "name": "test_adventure_retry_policy.py", + "exit_code": 0, + "seconds": 0.372, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_retry_policy.log" + }, + { + "name": "test_adventure_rotation.py", + "exit_code": 0, + "seconds": 0.727, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rotation.log" + }, + { + "name": "test_adventure_social.py", + "exit_code": 0, + "seconds": 0.947, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social.log" + }, + { + "name": "test_adventure_social_fire.py", + "exit_code": 0, + "seconds": 0.755, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social_fire.log" + }, + { + "name": "test_adventure_supplies.py", + "exit_code": 0, + "seconds": 0.549, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supplies.log" + }, + { + "name": "test_adventure_supply_catalog.py", + "exit_code": 0, + "seconds": 0.024, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_catalog.log" + }, + { + "name": "test_adventure_supply_items.py", + "exit_code": 0, + "seconds": 1.171, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_items.log" + }, + { + "name": "test_adventure_talent_templates.py", + "exit_code": 0, + "seconds": 0.597, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_talent_templates.log" + }, + { + "name": "test_adventure_training_catalog.py", + "exit_code": 0, + "seconds": 0.026, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_training_catalog.log" + }, + { + "name": "test_adventure_walk.py", + "exit_code": 0, + "seconds": 0.419, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_walk.log" + }, + { + "name": "test_adventure_world_presence.py", + "exit_code": 0, + "seconds": 0.597, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_world_presence.log" + }, + { + "name": "test_browser_admission.py", + "exit_code": 0, + "seconds": 0.464, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_admission.log" + }, + { + "name": "test_browser_bg_brackets.py", + "exit_code": 0, + "seconds": 0.095, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_bg_brackets.log" + }, + { + "name": "test_browser_match_order.py", + "exit_code": 0, + "seconds": 0.708, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_match_order.log" + }, + { + "name": "test_browser_participants.py", + "exit_code": 0, + "seconds": 0.575, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_participants.log" + }, + { + "name": "test_capital_portal_seed.py", + "exit_code": 0, + "seconds": 0.032, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_capital_portal_seed.log" + }, + { + "name": "test_cheat_explore.py", + "exit_code": 0, + "seconds": 0.314, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_cheat_explore.log" + }, + { + "name": "test_city_catalog_parents.py", + "exit_code": 0, + "seconds": 0.039, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_city_catalog_parents.log" + }, + { + "name": "test_clientless_character_factory.py", + "exit_code": 0, + "seconds": 0.714, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_character_factory.log" + }, + { + "name": "test_clientless_companion.py", + "exit_code": 0, + "seconds": 0.504, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_companion.log" + }, + { + "name": "test_clientless_damage_notifications.py", + "exit_code": 0, + "seconds": 0.522, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_damage_notifications.log" + }, + { + "name": "test_clientless_near_teleport_observer.py", + "exit_code": 0, + "seconds": 0.082, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_near_teleport_observer.log" + }, + { + "name": "test_clientless_skill_preparation.py", + "exit_code": 0, + "seconds": 0.173, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_skill_preparation.log" + }, + { + "name": "test_clientless_social_notifications.py", + "exit_code": 0, + "seconds": 0.795, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_social_notifications.log" + }, + { + "name": "test_default_phase.py", + "exit_code": 0, + "seconds": 0.317, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_default_phase.log" + }, + { + "name": "test_empty_spell_effect.py", + "exit_code": 0, + "seconds": 0.096, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_empty_spell_effect.log" + }, + { + "name": "test_flight_area_query.py", + "exit_code": 0, + "seconds": 0.596, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_area_query.log" + }, + { + "name": "test_flight_departure.py", + "exit_code": 0, + "seconds": 0.754, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_departure.log" + }, + { + "name": "test_flight_handoff.py", + "exit_code": 0, + "seconds": 0.69, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_handoff.log" + }, + { + "name": "test_flight_landing_search.py", + "exit_code": 0, + "seconds": 0.468, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_landing_search.log" + }, + { + "name": "test_flight_policy.py", + "exit_code": 0, + "seconds": 0.804, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_policy.log" + }, + { + "name": "test_flight_terrain_fallback.py", + "exit_code": 0, + "seconds": 0.605, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_terrain_fallback.log" + }, + { + "name": "test_follow_spline_velocity.py", + "exit_code": 0, + "seconds": 0.098, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_follow_spline_velocity.log" + }, + { + "name": "test_free_flight.py", + "exit_code": 0, + "seconds": 0.76, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight.log" + }, + { + "name": "test_free_flight_planner.py", + "exit_code": 0, + "seconds": 2.419, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight_planner.log" + }, + { + "name": "test_graph_probe_cache.py", + "exit_code": 0, + "seconds": 0.489, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_graph_probe_cache.log" + }, + { + "name": "test_ground_exit_continuation.py", + "exit_code": 0, + "seconds": 1.255, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_ground_exit_continuation.log" + }, + { + "name": "test_group_flight_follow.py", + "exit_code": 0, + "seconds": 0.727, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_follow.log" + }, + { + "name": "test_group_flight_mount.py", + "exit_code": 0, + "seconds": 0.306, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_mount.log" + }, + { + "name": "test_group_role_composition.py", + "exit_code": 0, + "seconds": 0.831, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_role_composition.log" + }, + { + "name": "test_guildless_group_restore.py", + "exit_code": 0, + "seconds": 0.368, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_guildless_group_restore.log" + }, + { + "name": "test_item_equip_cooldown.py", + "exit_code": 0, + "seconds": 0.337, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_item_equip_cooldown.log" + }, + { + "name": "test_local_spline_segments.py", + "exit_code": 0, + "seconds": 0.575, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_local_spline_segments.log" + }, + { + "name": "test_lua_reload.py", + "exit_code": 0, + "seconds": 0.678, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_lua_reload.log" + }, + { + "name": "test_native_skill_slot.py", + "exit_code": 0, + "seconds": 0.449, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_native_skill_slot.log" + }, + { + "name": "test_player_pure_max_skill.py", + "exit_code": 0, + "seconds": 0.324, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_player_pure_max_skill.log" + }, + { + "name": "test_portal_conditions.py", + "exit_code": 0, + "seconds": 0.027, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_conditions.log" + }, + { + "name": "test_portal_transfer.py", + "exit_code": 0, + "seconds": 0.445, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_transfer.log" + }, + { + "name": "test_portal_use.py", + "exit_code": 0, + "seconds": 1.243, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_use.log" + }, + { + "name": "test_rescue_executor.py", + "exit_code": 0, + "seconds": 0.486, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_executor.log" + }, + { + "name": "test_rescue_graph.py", + "exit_code": 0, + "seconds": 3.761, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_graph.log" + }, + { + "name": "test_route_portal_prerequisites.py", + "exit_code": 0, + "seconds": 0.406, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_route_portal_prerequisites.log" + }, + { + "name": "test_safe_logout.py", + "exit_code": 0, + "seconds": 0.091, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_safe_logout.log" + }, + { + "name": "test_shared_group_route.py", + "exit_code": 0, + "seconds": 0.75, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_shared_group_route.log" + }, + { + "name": "test_taxi_import_disabled.py", + "exit_code": 0, + "seconds": 0.029, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_taxi_import_disabled.log" + }, + { + "name": "test_testbot_client.py", + "exit_code": 0, + "seconds": 0.587, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_testbot_client.log" + }, + { + "name": "test_transport.py", + "exit_code": 0, + "seconds": 1.187, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport.log" + }, + { + "name": "test_transport_deck_control.py", + "exit_code": 0, + "seconds": 0.675, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_control.log" + }, + { + "name": "test_transport_deck_mesh.py", + "exit_code": 0, + "seconds": 1.406, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_mesh.log" + }, + { + "name": "test_transport_deck_return.py", + "exit_code": 0, + "seconds": 0.17, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_return.log" + }, + { + "name": "test_transport_grid_loading.py", + "exit_code": 0, + "seconds": 0.501, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_grid_loading.log" + }, + { + "name": "test_travel_telemetry.py", + "exit_code": 0, + "seconds": 0.511, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_travel_telemetry.log" + } + ] +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/rerun-results.json b/doc/clientless/checkpoints/2026-10-31-browser/regression/rerun-results.json new file mode 100644 index 0000000000..fb21a1ef96 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/rerun-results.json @@ -0,0 +1,68 @@ +[ + { + "status": "fulfilled", + "value": { + "name": "test_adventure_destination_level", + "chunk_id": "96276f", + "wall_time_seconds": 0.309534567, + "exit_code": 0, + "original_token_count": 26, + "output": "Native dungeon/raid minimum levels, unknown destinations and strict adventure invitation levels passed\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_adventure_area_node", + "chunk_id": "26d161", + "wall_time_seconds": 0.38132662, + "exit_code": 0, + "original_token_count": 19, + "output": "Production area destination excludes outside and unreachable graph nodes.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_adventure_day_persistence", + "chunk_id": "426ca7", + "wall_time_seconds": 0.542735438, + "exit_code": 0, + "original_token_count": 39, + "output": "Production day planner: all 24 TINYINT slots restored across logins, incomplete/old-day replacement, full transaction and curiosity/level weighting passed\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_adventure_instance_persistence", + "chunk_id": "14cd62", + "wall_time_seconds": 0.394777229, + "exit_code": 0, + "original_token_count": 35, + "output": "Production instance persistence: phases, original deadline, instance ID, transactional HP marker, failed commit and intent release passed.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_adventure_leisure", + "chunk_id": "be87f7", + "wall_time_seconds": 0.532656741, + "exit_code": 0, + "original_token_count": 42, + "output": "Leisure: substantial curved MMAP routes, mirrored return, interrupted return, rejected corridors, actual arrival, companion follow, riding, flight and fishing passed.\n" + } + }, + { + "status": "fulfilled", + "value": { + "name": "test_adventure_interactions", + "chunk_id": "bc2985", + "wall_time_seconds": 0.622508384, + "exit_code": 0, + "original_token_count": 123, + "output": "/tmp/tmpqf3qnkok/test.cpp: In member function ‘void AdventureInteractionMgr::Leave(Player*, Record&, const char*)’:\n/tmp/tmpqf3qnkok/test.cpp:145:69: warning: unused parameter ‘reason’ [-Wunused-parameter]\n 145 | void AdventureInteractionMgr::Leave(Player* p,Record& r,char const* reason)\n | ~~~~~~~~~~~~^~~~~~\nproduction interaction manager: invitations, factions, reservations, follow, AFK and deferred departure passed\n" + } + } +] diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/summary.json b/doc/clientless/checkpoints/2026-10-31-browser/regression/summary.json new file mode 100644 index 0000000000..91157c331c --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/summary.json @@ -0,0 +1,764 @@ +{ + "total": 120, + "passed": 114, + "failed": [ + { + "name": "test_adventure_destination_level.py", + "exit_code": 1, + "seconds": 0.339, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log" + }, + { + "name": "test_adventure_area_node.py", + "exit_code": 1, + "seconds": 0.44, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log" + }, + { + "name": "test_adventure_day_persistence.py", + "exit_code": 1, + "seconds": 0.599, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log" + }, + { + "name": "test_adventure_instance_persistence.py", + "exit_code": 1, + "seconds": 0.396, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log" + }, + { + "name": "test_adventure_leisure.py", + "exit_code": 1, + "seconds": 0.539, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log" + }, + { + "name": "test_adventure_interactions.py", + "exit_code": 1, + "seconds": 0.599, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log" + } + ], + "results": [ + { + "name": "test_adventure_area_node.py", + "exit_code": 1, + "seconds": 0.44, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log" + }, + { + "name": "test_adventure_area_policy.py", + "exit_code": 0, + "seconds": 0.546, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_policy.log" + }, + { + "name": "test_adventure_area_segment.py", + "exit_code": 0, + "seconds": 0.738, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_segment.log" + }, + { + "name": "test_adventure_async_database.py", + "exit_code": 0, + "seconds": 0.024, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_async_database.log" + }, + { + "name": "test_adventure_behavior_policy.py", + "exit_code": 0, + "seconds": 0.805, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_behavior_policy.log" + }, + { + "name": "test_adventure_class_rotation.py", + "exit_code": 0, + "seconds": 0.408, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_class_rotation.log" + }, + { + "name": "test_adventure_combat_exercise.py", + "exit_code": 0, + "seconds": 0.777, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_exercise.log" + }, + { + "name": "test_adventure_combat_preparation.py", + "exit_code": 0, + "seconds": 0.454, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_preparation.log" + }, + { + "name": "test_adventure_combat_reactions.py", + "exit_code": 0, + "seconds": 1.117, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_reactions.log" + }, + { + "name": "test_adventure_day_persistence.py", + "exit_code": 1, + "seconds": 0.599, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log" + }, + { + "name": "test_adventure_destination_level.py", + "exit_code": 1, + "seconds": 0.339, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log" + }, + { + "name": "test_adventure_economy.py", + "exit_code": 0, + "seconds": 0.749, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy.log" + }, + { + "name": "test_adventure_economy_catalog.py", + "exit_code": 0, + "seconds": 0.038, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy_catalog.log" + }, + { + "name": "test_adventure_encounter.py", + "exit_code": 0, + "seconds": 0.688, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_encounter.log" + }, + { + "name": "test_adventure_equipment_maintenance.py", + "exit_code": 0, + "seconds": 0.607, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_equipment_maintenance.log" + }, + { + "name": "test_adventure_exploration.py", + "exit_code": 0, + "seconds": 0.617, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration.log" + }, + { + "name": "test_adventure_exploration_catalog.py", + "exit_code": 0, + "seconds": 0.025, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration_catalog.log" + }, + { + "name": "test_adventure_generator_equipment.py", + "exit_code": 0, + "seconds": 0.699, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_equipment.log" + }, + { + "name": "test_adventure_generator_ownership.py", + "exit_code": 0, + "seconds": 0.793, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_ownership.log" + }, + { + "name": "test_adventure_generator_policy.py", + "exit_code": 0, + "seconds": 4.129, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_policy.log" + }, + { + "name": "test_adventure_graph_handover.py", + "exit_code": 0, + "seconds": 0.519, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_graph_handover.log" + }, + { + "name": "test_adventure_ground_avoidance.py", + "exit_code": 0, + "seconds": 0.475, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_ground_avoidance.log" + }, + { + "name": "test_adventure_group_departure.py", + "exit_code": 0, + "seconds": 0.869, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_departure.log" + }, + { + "name": "test_adventure_group_gather.py", + "exit_code": 0, + "seconds": 0.536, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_gather.log" + }, + { + "name": "test_adventure_group_plan.py", + "exit_code": 0, + "seconds": 0.672, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_plan.log" + }, + { + "name": "test_adventure_group_travel.py", + "exit_code": 0, + "seconds": 1.367, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_travel.log" + }, + { + "name": "test_adventure_groups.py", + "exit_code": 0, + "seconds": 1.36, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_groups.log" + }, + { + "name": "test_adventure_instance.py", + "exit_code": 0, + "seconds": 0.51, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance.log" + }, + { + "name": "test_adventure_instance_autoresume.py", + "exit_code": 0, + "seconds": 0.742, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_autoresume.log" + }, + { + "name": "test_adventure_instance_begin.py", + "exit_code": 0, + "seconds": 0.665, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_begin.log" + }, + { + "name": "test_adventure_instance_catalog.py", + "exit_code": 0, + "seconds": 0.028, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_catalog.log" + }, + { + "name": "test_adventure_instance_loader.py", + "exit_code": 0, + "seconds": 0.806, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_loader.log" + }, + { + "name": "test_adventure_instance_persistence.py", + "exit_code": 1, + "seconds": 0.396, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log" + }, + { + "name": "test_adventure_instance_variants.py", + "exit_code": 0, + "seconds": 0.764, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_variants.log" + }, + { + "name": "test_adventure_intent_state.py", + "exit_code": 0, + "seconds": 0.729, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_intent_state.log" + }, + { + "name": "test_adventure_interactions.py", + "exit_code": 1, + "seconds": 0.599, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log" + }, + { + "name": "test_adventure_leisure.py", + "exit_code": 1, + "seconds": 0.539, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log" + }, + { + "name": "test_adventure_leisure_catalog.py", + "exit_code": 0, + "seconds": 0.03, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure_catalog.log" + }, + { + "name": "test_adventure_location_import.py", + "exit_code": 0, + "seconds": 0.633, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_location_import.log" + }, + { + "name": "test_adventure_manager_inventory.py", + "exit_code": 0, + "seconds": 0.529, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_manager_inventory.log" + }, + { + "name": "test_adventure_micro_reset.py", + "exit_code": 0, + "seconds": 0.345, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_micro_reset.log" + }, + { + "name": "test_adventure_native_lfg.py", + "exit_code": 0, + "seconds": 0.389, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_native_lfg.log" + }, + { + "name": "test_adventure_navigation_rescue.py", + "exit_code": 0, + "seconds": 0.47, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_navigation_rescue.log" + }, + { + "name": "test_adventure_northrend_flight.py", + "exit_code": 0, + "seconds": 0.642, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_northrend_flight.log" + }, + { + "name": "test_adventure_poi_binding.py", + "exit_code": 0, + "seconds": 0.644, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_poi_binding.log" + }, + { + "name": "test_adventure_population.py", + "exit_code": 0, + "seconds": 0.738, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_population.log" + }, + { + "name": "test_adventure_profession_catalog.py", + "exit_code": 0, + "seconds": 0.03, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_catalog.log" + }, + { + "name": "test_adventure_profession_profile.py", + "exit_code": 0, + "seconds": 0.567, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_profile.log" + }, + { + "name": "test_adventure_profession_sightline.py", + "exit_code": 0, + "seconds": 0.523, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_sightline.log" + }, + { + "name": "test_adventure_profession_targets.py", + "exit_code": 0, + "seconds": 0.861, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_targets.log" + }, + { + "name": "test_adventure_profile_selection.py", + "exit_code": 0, + "seconds": 0.48, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profile_selection.log" + }, + { + "name": "test_adventure_pvp.py", + "exit_code": 0, + "seconds": 0.662, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_pvp.log" + }, + { + "name": "test_adventure_recovery_policy.py", + "exit_code": 0, + "seconds": 0.489, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_recovery_policy.log" + }, + { + "name": "test_adventure_repair_catalog.py", + "exit_code": 0, + "seconds": 0.027, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_repair_catalog.log" + }, + { + "name": "test_adventure_rest.py", + "exit_code": 0, + "seconds": 0.785, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest.log" + }, + { + "name": "test_adventure_rest_fire.py", + "exit_code": 0, + "seconds": 0.662, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_fire.log" + }, + { + "name": "test_adventure_rest_space.py", + "exit_code": 0, + "seconds": 0.465, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_space.log" + }, + { + "name": "test_adventure_rest_targets.py", + "exit_code": 0, + "seconds": 0.711, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_targets.log" + }, + { + "name": "test_adventure_retry_policy.py", + "exit_code": 0, + "seconds": 0.372, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_retry_policy.log" + }, + { + "name": "test_adventure_rotation.py", + "exit_code": 0, + "seconds": 0.727, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rotation.log" + }, + { + "name": "test_adventure_social.py", + "exit_code": 0, + "seconds": 0.947, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social.log" + }, + { + "name": "test_adventure_social_fire.py", + "exit_code": 0, + "seconds": 0.755, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social_fire.log" + }, + { + "name": "test_adventure_supplies.py", + "exit_code": 0, + "seconds": 0.549, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supplies.log" + }, + { + "name": "test_adventure_supply_catalog.py", + "exit_code": 0, + "seconds": 0.024, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_catalog.log" + }, + { + "name": "test_adventure_supply_items.py", + "exit_code": 0, + "seconds": 1.171, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_items.log" + }, + { + "name": "test_adventure_talent_templates.py", + "exit_code": 0, + "seconds": 0.597, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_talent_templates.log" + }, + { + "name": "test_adventure_training_catalog.py", + "exit_code": 0, + "seconds": 0.026, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_training_catalog.log" + }, + { + "name": "test_adventure_walk.py", + "exit_code": 0, + "seconds": 0.419, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_walk.log" + }, + { + "name": "test_adventure_world_presence.py", + "exit_code": 0, + "seconds": 0.597, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_world_presence.log" + }, + { + "name": "test_browser_admission.py", + "exit_code": 0, + "seconds": 0.464, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_admission.log" + }, + { + "name": "test_browser_bg_brackets.py", + "exit_code": 0, + "seconds": 0.095, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_bg_brackets.log" + }, + { + "name": "test_browser_match_order.py", + "exit_code": 0, + "seconds": 0.708, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_match_order.log" + }, + { + "name": "test_browser_participants.py", + "exit_code": 0, + "seconds": 0.575, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_participants.log" + }, + { + "name": "test_capital_portal_seed.py", + "exit_code": 0, + "seconds": 0.032, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_capital_portal_seed.log" + }, + { + "name": "test_cheat_explore.py", + "exit_code": 0, + "seconds": 0.314, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_cheat_explore.log" + }, + { + "name": "test_city_catalog_parents.py", + "exit_code": 0, + "seconds": 0.039, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_city_catalog_parents.log" + }, + { + "name": "test_clientless_character_factory.py", + "exit_code": 0, + "seconds": 0.714, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_character_factory.log" + }, + { + "name": "test_clientless_companion.py", + "exit_code": 0, + "seconds": 0.504, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_companion.log" + }, + { + "name": "test_clientless_damage_notifications.py", + "exit_code": 0, + "seconds": 0.522, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_damage_notifications.log" + }, + { + "name": "test_clientless_near_teleport_observer.py", + "exit_code": 0, + "seconds": 0.082, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_near_teleport_observer.log" + }, + { + "name": "test_clientless_skill_preparation.py", + "exit_code": 0, + "seconds": 0.173, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_skill_preparation.log" + }, + { + "name": "test_clientless_social_notifications.py", + "exit_code": 0, + "seconds": 0.795, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_social_notifications.log" + }, + { + "name": "test_default_phase.py", + "exit_code": 0, + "seconds": 0.317, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_default_phase.log" + }, + { + "name": "test_empty_spell_effect.py", + "exit_code": 0, + "seconds": 0.096, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_empty_spell_effect.log" + }, + { + "name": "test_flight_area_query.py", + "exit_code": 0, + "seconds": 0.596, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_area_query.log" + }, + { + "name": "test_flight_departure.py", + "exit_code": 0, + "seconds": 0.754, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_departure.log" + }, + { + "name": "test_flight_handoff.py", + "exit_code": 0, + "seconds": 0.69, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_handoff.log" + }, + { + "name": "test_flight_landing_search.py", + "exit_code": 0, + "seconds": 0.468, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_landing_search.log" + }, + { + "name": "test_flight_policy.py", + "exit_code": 0, + "seconds": 0.804, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_policy.log" + }, + { + "name": "test_flight_terrain_fallback.py", + "exit_code": 0, + "seconds": 0.605, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_terrain_fallback.log" + }, + { + "name": "test_follow_spline_velocity.py", + "exit_code": 0, + "seconds": 0.098, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_follow_spline_velocity.log" + }, + { + "name": "test_free_flight.py", + "exit_code": 0, + "seconds": 0.76, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight.log" + }, + { + "name": "test_free_flight_planner.py", + "exit_code": 0, + "seconds": 2.419, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight_planner.log" + }, + { + "name": "test_graph_probe_cache.py", + "exit_code": 0, + "seconds": 0.489, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_graph_probe_cache.log" + }, + { + "name": "test_ground_exit_continuation.py", + "exit_code": 0, + "seconds": 1.255, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_ground_exit_continuation.log" + }, + { + "name": "test_group_flight_follow.py", + "exit_code": 0, + "seconds": 0.727, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_follow.log" + }, + { + "name": "test_group_flight_mount.py", + "exit_code": 0, + "seconds": 0.306, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_mount.log" + }, + { + "name": "test_group_role_composition.py", + "exit_code": 0, + "seconds": 0.831, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_role_composition.log" + }, + { + "name": "test_guildless_group_restore.py", + "exit_code": 0, + "seconds": 0.368, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_guildless_group_restore.log" + }, + { + "name": "test_item_equip_cooldown.py", + "exit_code": 0, + "seconds": 0.337, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_item_equip_cooldown.log" + }, + { + "name": "test_local_spline_segments.py", + "exit_code": 0, + "seconds": 0.575, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_local_spline_segments.log" + }, + { + "name": "test_lua_reload.py", + "exit_code": 0, + "seconds": 0.678, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_lua_reload.log" + }, + { + "name": "test_native_skill_slot.py", + "exit_code": 0, + "seconds": 0.449, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_native_skill_slot.log" + }, + { + "name": "test_player_pure_max_skill.py", + "exit_code": 0, + "seconds": 0.324, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_player_pure_max_skill.log" + }, + { + "name": "test_portal_conditions.py", + "exit_code": 0, + "seconds": 0.027, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_conditions.log" + }, + { + "name": "test_portal_transfer.py", + "exit_code": 0, + "seconds": 0.445, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_transfer.log" + }, + { + "name": "test_portal_use.py", + "exit_code": 0, + "seconds": 1.243, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_use.log" + }, + { + "name": "test_rescue_executor.py", + "exit_code": 0, + "seconds": 0.486, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_executor.log" + }, + { + "name": "test_rescue_graph.py", + "exit_code": 0, + "seconds": 3.761, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_graph.log" + }, + { + "name": "test_route_portal_prerequisites.py", + "exit_code": 0, + "seconds": 0.406, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_route_portal_prerequisites.log" + }, + { + "name": "test_safe_logout.py", + "exit_code": 0, + "seconds": 0.091, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_safe_logout.log" + }, + { + "name": "test_shared_group_route.py", + "exit_code": 0, + "seconds": 0.75, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_shared_group_route.log" + }, + { + "name": "test_taxi_import_disabled.py", + "exit_code": 0, + "seconds": 0.029, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_taxi_import_disabled.log" + }, + { + "name": "test_testbot_client.py", + "exit_code": 0, + "seconds": 0.587, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_testbot_client.log" + }, + { + "name": "test_transport.py", + "exit_code": 0, + "seconds": 1.187, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport.log" + }, + { + "name": "test_transport_deck_control.py", + "exit_code": 0, + "seconds": 0.675, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_control.log" + }, + { + "name": "test_transport_deck_mesh.py", + "exit_code": 0, + "seconds": 1.406, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_mesh.log" + }, + { + "name": "test_transport_deck_return.py", + "exit_code": 0, + "seconds": 0.17, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_return.log" + }, + { + "name": "test_transport_grid_loading.py", + "exit_code": 0, + "seconds": 0.501, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_grid_loading.log" + }, + { + "name": "test_travel_telemetry.py", + "exit_code": 0, + "seconds": 0.511, + "log": "/home/wow_admin/wow_cata_server/source/TrinityCore/doc/clientless/checkpoints/2026-10-31-browser/regression/test_travel_telemetry.log" + } + ] +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log new file mode 100644 index 0000000000..018eeb6cff --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_node.log @@ -0,0 +1,18 @@ +/tmp/vcore-area-node-p5f0rgyg/test.cpp:52:60: error: ‘Record’ has not been declared + 52 | void AdventureBehaviorMgr::LatchGroupTravel(Player* player,Record& r) + | ^~~~~~ +/tmp/vcore-area-node-p5f0rgyg/test.cpp:52:6: error: no declaration matches ‘void AdventureBehaviorMgr::LatchGroupTravel(Player*, int&)’ + 52 | void AdventureBehaviorMgr::LatchGroupTravel(Player* player,Record& r) + | ^~~~~~~~~~~~~~~~~~~~ +/tmp/vcore-area-node-p5f0rgyg/test.cpp:52:6: note: no functions named ‘void AdventureBehaviorMgr::LatchGroupTravel(Player*, int&)’ +/tmp/vcore-area-node-p5f0rgyg/test.cpp:19:8: note: ‘struct AdventureBehaviorMgr’ defined here + 19 | struct AdventureBehaviorMgr{std::string AreaNode(Player*,AdventureLocation const&);}; + | ^~~~~~~~~~~~~~~~~~~~ +Traceback (most recent call last): + File "/home/wow_admin/wow_cata_server/source/TrinityCore/tests/clientless/test_adventure_area_node.py", line 37, in + subprocess.run(['c++','-std=c++17',str(cpp),'-o',str(binary)],check=True) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.14/subprocess.py", line 578, in run + raise CalledProcessError(retcode, process.args, + output=stdout, stderr=stderr) +subprocess.CalledProcessError: Command '['c++', '-std=c++17', '/tmp/vcore-area-node-p5f0rgyg/test.cpp', '-o', '/tmp/vcore-area-node-p5f0rgyg/test']' returned non-zero exit status 1. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_policy.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_policy.log new file mode 100644 index 0000000000..42c6a6aa0b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_policy.log @@ -0,0 +1 @@ +Area inheritance, faction intersection, level limits, flight overrides and invalid data passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_segment.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_segment.log new file mode 100644 index 0000000000..7f919cc6e4 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_area_segment.log @@ -0,0 +1 @@ +Segment geography cache, faction isolation, reload permissions, lazy completion and terrain swaps passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_async_database.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_async_database.log new file mode 100644 index 0000000000..de73c8dd20 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_async_database.log @@ -0,0 +1 @@ +Async creation DB contracts: prepared connection masks, native security column names, no future waits, successful-save cache publication and world-update-only loader hook passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_behavior_policy.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_behavior_policy.log new file mode 100644 index 0000000000..89522a65e8 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_behavior_policy.log @@ -0,0 +1 @@ +24-hour generation, shared intents with changing destinations, broad location classification and repetition penalties passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_class_rotation.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_class_rotation.log new file mode 100644 index 0000000000..b7ac3f97dc --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_class_rotation.log @@ -0,0 +1 @@ +Production class rotations: persistent PvE solo pools, native rank aura IDs, combo/holy power/proc/execute/resource gates, Eclipse and healer coverage passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_exercise.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_exercise.log new file mode 100644 index 0000000000..6def2494d1 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_exercise.log @@ -0,0 +1 @@ +Production exercise: stance/charge/melee/casts, native validation delegation, bounded lifetime, invalid targets and unchanged native phases passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_preparation.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_preparation.log new file mode 100644 index 0000000000..248c65804a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_preparation.log @@ -0,0 +1 @@ +Production talent learner: native tiers/dependencies/class gates, all 26 legal level60 points, no capstone bypass and repeat safety passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_reactions.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_reactions.log new file mode 100644 index 0000000000..ffcf3c9447 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_combat_reactions.log @@ -0,0 +1 @@ +Production combat focus, damage ordering, risk filters, corpse radius/delay, flight/group override, blocked escape, danger avoidance and malus-free persisted fallback passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log new file mode 100644 index 0000000000..eb8d8bb70f --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_day_persistence.log @@ -0,0 +1,69 @@ +/tmp/tmpz_2oe7ue/test.cpp: In lambda function: +/tmp/tmpz_2oe7ue/test.cpp:84:672: error: ‘struct Player’ has no member named ‘getLevel’ + 84 | Affinity(profile->ActivityAffinity, "social", 1) * Affinity(profile->Personality, "sociability", 0.5f) + Affinity(profile->ActivityAffinity, "tavern", 0.5f) * Affinity(profile->Personality, "tavern_affinity", 0.5f), Affinity(profile->ActivityAffinity, "adventure", 1) * Affinity(profile->Personality, "adventurousness", 0.5f), Affinity(profile->ActivityAffinity, "profession", 0.5f), Affinity(profile->ActivityAffinity, "rest", 0.5f), Affinity(profile->ActivityAffinity, "leisure", 0.5f), Affinity(profile->ActivityAffinity, "economy", 0.5f), Affinity(profile->ActivityAffinity, "instance", 0.5f), Affinity(profile->ActivityAffinity, "raid", 0.25f), (player->getLevel()>=10?Affinity(profile->ActivityAffinity,"pvp",0.2f)*Affinity(profile->Personality,"aggression",0.5f):0.0f) + | ^~~~~~~~ +/tmp/tmpz_2oe7ue/test.cpp:85:9: error: no matching function for call to ‘std::vector::vector()’ + 85 | }; + | ^ +/tmp/tmpz_2oe7ue/test.cpp:85:9: note: there are 12 candidates +In file included from /usr/include/c++/15/vector:68, + from /usr/include/c++/15/bits/random.h:34, + from /usr/include/c++/15/random:50, + from /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World/AdventureBehaviorPolicy.h:8, + from /tmp/tmpz_2oe7ue/test.cpp:2: +/usr/include/c++/15/bits/stl_vector.h:736:9: note: candidate 1: ‘template std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const allocator_type&) [with = _InputIterator; _Tp = double; _Alloc = std::allocator]’ + 736 | vector(_InputIterator __first, _InputIterator __last, + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:736:9: note: candidate expects 3 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:708:7: note: candidate 2: ‘std::vector<_Tp, _Alloc>::vector(std::initializer_list<_Tp>, const allocator_type&) [with _Tp = double; _Alloc = std::allocator; allocator_type = std::allocator]’ + 708 | vector(initializer_list __l, + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:708:7: note: candidate expects 2 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:689:7: note: candidate 3: ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>&&, std::__type_identity_t<_Alloc>&) [with _Tp = double; _Alloc = std::allocator; std::__type_identity_t<_Alloc> = std::allocator]’ + 689 | vector(vector&& __rv, const __type_identity_t& __m) + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:689:7: note: candidate expects 2 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:670:7: note: candidate 4: ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>&&, const allocator_type&, std::false_type) [with _Tp = double; _Alloc = std::allocator; allocator_type = std::allocator; std::false_type = std::false_type]’ + 670 | vector(vector&& __rv, const allocator_type& __m, false_type) + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:670:7: note: candidate expects 3 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:665:7: note: candidate 5: ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>&&, const allocator_type&, std::true_type) [with _Tp = double; _Alloc = std::allocator; allocator_type = std::allocator; std::true_type = std::true_type]’ + 665 | vector(vector&& __rv, const allocator_type& __m, true_type) noexcept + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:665:7: note: candidate expects 3 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:654:7: note: candidate 6: ‘std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&, std::__type_identity_t<_Alloc>&) [with _Tp = double; _Alloc = std::allocator; std::__type_identity_t<_Alloc> = std::allocator]’ + 654 | vector(const vector& __x, const __type_identity_t& __a) + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:654:7: note: candidate expects 2 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:650:7: note: candidate 7: ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>&&) [with _Tp = double; _Alloc = std::allocator]’ + 650 | vector(vector&&) noexcept = default; + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:650:7: note: candidate expects 1 argument, 9 provided +/usr/include/c++/15/bits/stl_vector.h:631:7: note: candidate 8: ‘std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp = double; _Alloc = std::allocator]’ + 631 | vector(const vector& __x) + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:631:7: note: candidate expects 1 argument, 9 provided +/usr/include/c++/15/bits/stl_vector.h:599:7: note: candidate 9: ‘std::vector<_Tp, _Alloc>::vector(size_type, const value_type&, const allocator_type&) [with _Tp = double; _Alloc = std::allocator; size_type = long unsigned int; value_type = double; allocator_type = std::allocator]’ + 599 | vector(size_type __n, const value_type& __value, + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:599:7: note: candidate expects 3 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:586:7: note: candidate 10: ‘std::vector<_Tp, _Alloc>::vector(size_type, const allocator_type&) [with _Tp = double; _Alloc = std::allocator; size_type = long unsigned int; allocator_type = std::allocator]’ + 586 | vector(size_type __n, const allocator_type& __a = allocator_type()) + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:586:7: note: candidate expects 2 arguments, 9 provided +/usr/include/c++/15/bits/stl_vector.h:572:7: note: candidate 11: ‘std::vector<_Tp, _Alloc>::vector(const allocator_type&) [with _Tp = double; _Alloc = std::allocator; allocator_type = std::allocator]’ + 572 | vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:572:7: note: candidate expects 1 argument, 9 provided +/usr/include/c++/15/bits/stl_vector.h:561:7: note: candidate 12: ‘std::vector<_Tp, _Alloc>::vector() [with _Tp = double; _Alloc = std::allocator]’ + 561 | vector() = default; + | ^~~~~~ +/usr/include/c++/15/bits/stl_vector.h:561:7: note: candidate expects 0 arguments, 9 provided +Traceback (most recent call last): + File "/home/wow_admin/wow_cata_server/source/TrinityCore/tests/clientless/test_adventure_day_persistence.py", line 77, in + subprocess.run(['g++','-std=c++17','-I',str(root/'src/server/game/World'),str(p/'test.cpp'),'-o',str(p/'test')],check=True) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.14/subprocess.py", line 578, in run + raise CalledProcessError(retcode, process.args, + output=stdout, stderr=stderr) +subprocess.CalledProcessError: Command '['g++', '-std=c++17', '-I', '/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World', '/tmp/tmpz_2oe7ue/test.cpp', '-o', '/tmp/tmpz_2oe7ue/test']' returned non-zero exit status 1. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log new file mode 100644 index 0000000000..c09ae8eded --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_destination_level.log @@ -0,0 +1,12 @@ +/tmp/tmp0t3129d0/test.cpp: In member function ‘bool AdventureLocationMgr::LevelEligible(const Player*, const AdventureLocation&, const std::string&, bool) const’: +/tmp/tmp0t3129d0/test.cpp:25:25: error: ‘AdventureGroupPolicy’ has not been declared + 25 | if(intent=="pvp" && AdventureGroupPolicy::WorldPvP(location.ZoneId?location.ZoneId:location.AreaId))strictArea=true; + | ^~~~~~~~~~~~~~~~~~~~ +Traceback (most recent call last): + File "/home/wow_admin/wow_cata_server/source/TrinityCore/tests/clientless/test_adventure_destination_level.py", line 43, in + subprocess.run(['c++','-std=c++17',str(p/'test.cpp'),'-o',str(p/'test')],check=True) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.14/subprocess.py", line 578, in run + raise CalledProcessError(retcode, process.args, + output=stdout, stderr=stderr) +subprocess.CalledProcessError: Command '['c++', '-std=c++17', '/tmp/tmp0t3129d0/test.cpp', '-o', '/tmp/tmp0t3129d0/test']' returned non-zero exit status 1. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy.log new file mode 100644 index 0000000000..f52c4e3c21 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy.log @@ -0,0 +1 @@ +Economy: native service roles, friendly/phase/LOS/bounds gates, no bot service targets and coherent performative cues passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy_catalog.log new file mode 100644 index 0000000000..f67e803120 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_economy_catalog.log @@ -0,0 +1 @@ +Economy catalog: eleven actions, three faction-bound service anchors, native flag gates and idempotent preservation passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_encounter.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_encounter.log new file mode 100644 index 0000000000..116759dbc9 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_encounter.log @@ -0,0 +1 @@ +Production encounters: bot-only exclusion, mixed mode, extension hook, wait/revive, wipe fallback/reentry/gather/return, living-player priority, kick exit and offline cleanup passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_equipment_maintenance.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_equipment_maintenance.log new file mode 100644 index 0000000000..7ab4b2efd5 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_equipment_maintenance.log @@ -0,0 +1 @@ +Production gear maintenance: same birth/retention gate rejects wrong armor/stats, malformed effects, level, temporary, reputation, map, holiday, native-use and slot mismatches passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration.log new file mode 100644 index 0000000000..b93ad1976b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration.log @@ -0,0 +1 @@ +Exploration: visible native props only, no chests/traps/furniture, phase/map/LOS/range gates and contextual preparation passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration_catalog.log new file mode 100644 index 0000000000..6f8bfa98ac --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_exploration_catalog.log @@ -0,0 +1 @@ +Exploration catalog: ten actions, shared scenes, default wander replacement, explicit category eligibility and preserved edits passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_equipment.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_equipment.log new file mode 100644 index 0000000000..a3e3669705 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_equipment.log @@ -0,0 +1 @@ +Production equipment affinity: mana-only/direct/triggered procs, caster/physical stat effects and bounded cycles passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_ownership.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_ownership.log new file mode 100644 index 0000000000..2ac1dbbef2 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_ownership.log @@ -0,0 +1 @@ +Production generator commands: batch bounds, dedicated ownership, persistent/online/removing retirement protection and retired login refusal passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_policy.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_policy.log new file mode 100644 index 0000000000..9860e29f14 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_generator_policy.log @@ -0,0 +1 @@ +Production generator: 6144 cultural names and 61440 real Lua profiles, profession coherence, personality ranges, escaping and equipment/armor gates passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_graph_handover.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_graph_handover.log new file mode 100644 index 0000000000..ef724e5729 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_graph_handover.log @@ -0,0 +1 @@ +Production graph handover waits for ship/taxi/flight/teleport and stops at safe road/node boundaries. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_ground_avoidance.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_ground_avoidance.log new file mode 100644 index 0000000000..6c13e1ee04 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_ground_avoidance.log @@ -0,0 +1 @@ +Production ground avoidance: harmful/friendly, phase169, height, reachable safe endpoint, rejected paths and reuse without cast/movement thrashing passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_departure.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_departure.log new file mode 100644 index 0000000000..a8124312da --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_departure.log @@ -0,0 +1 @@ +Production handoffs: full-group deadline, late clamp, unchanged next slot, kick, restart persistence, expiry and failed save passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_gather.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_gather.log new file mode 100644 index 0000000000..9d6c2094f9 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_gather.log @@ -0,0 +1 @@ +Production five-minute gathering: exact cutoff, safe corridor return request, preparation cancellation, bounded retries, meeting hold and deadline release passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_plan.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_plan.log new file mode 100644 index 0000000000..31dc81f4bf --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_plan.log @@ -0,0 +1 @@ +Production group plans: leader meeting/goal/deadline inheritance, untouched personal day, manual preparation and instance-state guards passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_travel.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_travel.log new file mode 100644 index 0000000000..3eb62f5522 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_group_travel.log @@ -0,0 +1 @@ +Production group travel: distinct slots, phase169 cliff safety, width, mounts, flight/kick landing, taxi grace, portal queue, bounded separation and recorded-road validation passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_groups.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_groups.log new file mode 100644 index 0000000000..83db5db447 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_groups.log @@ -0,0 +1 @@ +Production recruitment: capitals, different goals, native inviter leadership, joining existing groups, capacity/reservations, raid conversion, planned transition and local contact passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance.log new file mode 100644 index 0000000000..be8b5075bf --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance.log @@ -0,0 +1 @@ +Production instance lifecycle: time budget, true entry, denied/shared entry, native rear exit, restart, expired copy, late arrival, HP and return replay passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_autoresume.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_autoresume.log new file mode 100644 index 0000000000..7fed78689a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_autoresume.log @@ -0,0 +1 @@ +Deferred instance script: missing schema/visits stays idle; no login work on startup; saved visitors resume with Adventure controllers and native accounts. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_begin.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_begin.log new file mode 100644 index 0000000000..b96a0e91eb --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_begin.log @@ -0,0 +1 @@ +Production entrance travel uses the existing location planner, requires mapping and retains normal social/area travel. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_catalog.log new file mode 100644 index 0000000000..0c1a937ff5 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_catalog.log @@ -0,0 +1 @@ +Instance migrations: outside entrances only, native graph preserved, disabled/missing transitions excluded, edits and saved visits preserved. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_loader.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_loader.log new file mode 100644 index 0000000000..eb289aedac --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_loader.log @@ -0,0 +1 @@ +Production instance recovery: no startup DB/login work, asynchronous delayed/paced manual recovery, generated-bot quota ownership, absent-schema compatibility and existing preparation ticks passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log new file mode 100644 index 0000000000..020bd9c7cc --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_persistence.log @@ -0,0 +1,12 @@ +/tmp/tmpiwrafkp_/save.cpp: In member function ‘bool AdventureBehaviorMgr::RestoreInstance(Player*, Record&)’: +/tmp/tmpiwrafkp_/save.cpp:89:7: error: ‘struct AdventureBehaviorMgr::Record’ has no member named ‘ExpeditionStarted’ + 89 | r.ExpeditionStarted=true; + | ^~~~~~~~~~~~~~~~~ +Traceback (most recent call last): + File "/home/wow_admin/wow_cata_server/source/TrinityCore/tests/clientless/test_adventure_instance_persistence.py", line 92, in + subprocess.run(['g++','-std=c++17','-I'+str(root/'src/server/game/World'),str(src),'-o',str(exe)],check=True) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.14/subprocess.py", line 578, in run + raise CalledProcessError(retcode, process.args, + output=stdout, stderr=stderr) +subprocess.CalledProcessError: Command '['g++', '-std=c++17', '-I/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World', '/tmp/tmpiwrafkp_/save.cpp', '-o', '/tmp/tmpiwrafkp_/save']' returned non-zero exit status 1. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_variants.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_variants.log new file mode 100644 index 0000000000..780a3243ef --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_instance_variants.log @@ -0,0 +1 @@ +Real Cataclysm DBC: dungeon normal/heroic, obsolete SFK row, classic raid placeholders, native10/25 normal/heroic and physical entrance reuse passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_intent_state.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_intent_state.log new file mode 100644 index 0000000000..ff47137737 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_intent_state.log @@ -0,0 +1 @@ +Production intent arrival, failed/partial travel, deadlines and safe schedule handover passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log new file mode 100644 index 0000000000..5a81e4ca0b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_interactions.log @@ -0,0 +1,22 @@ +/tmp/tmpsnethl81/test.cpp: In member function ‘void AdventureInteractionMgr::Leave(Player*, Record&, const char*)’: +/tmp/tmpsnethl81/test.cpp:144:69: warning: unused parameter ‘reason’ [-Wunused-parameter] + 144 | void AdventureInteractionMgr::Leave(Player* p,Record& r,char const* reason) + | ~~~~~~~~~~~~^~~~~~ +/tmp/tmpsnethl81/test.cpp: In member function ‘bool AdventureInteractionMgr::Update(Player*, uint32)’: +/tmp/tmpsnethl81/test.cpp:250:75: error: ‘class Player’ has no member named ‘isUsingLfg’ + 250 | bool protectedTravel=sAdventureGroupTravelMgr->Protected(p) || p->isUsingLfg() || p->InBattlegroundQueue() || p->InBattleground(); + | ^~~~~~~~~~ +/tmp/tmpsnethl81/test.cpp:250:94: error: ‘class Player’ has no member named ‘InBattlegroundQueue’ + 250 | bool protectedTravel=sAdventureGroupTravelMgr->Protected(p) || p->isUsingLfg() || p->InBattlegroundQueue() || p->InBattleground(); + | ^~~~~~~~~~~~~~~~~~~ +/tmp/tmpsnethl81/test.cpp:250:122: error: ‘class Player’ has no member named ‘InBattleground’ + 250 | bool protectedTravel=sAdventureGroupTravelMgr->Protected(p) || p->isUsingLfg() || p->InBattlegroundQueue() || p->InBattleground(); + | ^~~~~~~~~~~~~~ +Traceback (most recent call last): + File "/home/wow_admin/wow_cata_server/source/TrinityCore/tests/clientless/test_adventure_interactions.py", line 133, in + subprocess.run(['g++','-std=c++17','-Wall','-Wextra','-I',str(root/'src/server/game/World'),str(p/'test.cpp'),'-o',str(p/'test')],check=True) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.14/subprocess.py", line 578, in run + raise CalledProcessError(retcode, process.args, + output=stdout, stderr=stderr) +subprocess.CalledProcessError: Command '['g++', '-std=c++17', '-Wall', '-Wextra', '-I', '/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World', '/tmp/tmpsnethl81/test.cpp', '-o', '/tmp/tmpsnethl81/test']' returned non-zero exit status 1. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log new file mode 100644 index 0000000000..ab7e153403 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure.log @@ -0,0 +1,22 @@ +/tmp/vcore-leisure-5aj8oipv/test.cpp: In member function ‘void AdventureBehaviorMgr::SetWanted(Player*, Record&, const std::string&, const std::string&, time_t)’: +/tmp/vcore-leisure-5aj8oipv/test.cpp:458:33: error: ‘struct AdventureBehaviorMgr::Record’ has no member named ‘ExpeditionStarted’ + 458 | if(r.WantedIntent!=intent)r.ExpeditionStarted=r.ExpeditionIntent==intent && GameTime::GetGameTime()CancelBrowser(player); + | ^~~~~~~~~~~~~~~~~~ + | sAdventureCombatMgr +Traceback (most recent call last): + File "/home/wow_admin/wow_cata_server/source/TrinityCore/tests/clientless/test_adventure_leisure.py", line 239, in + subprocess.run(['c++','-std=c++17','-I'+str(root/'src/server/game/World'),str(cpp),'-o',str(binary)],check=True) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.14/subprocess.py", line 578, in run + raise CalledProcessError(retcode, process.args, + output=stdout, stderr=stderr) +subprocess.CalledProcessError: Command '['c++', '-std=c++17', '-I/home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World', '/tmp/vcore-leisure-5aj8oipv/test.cpp', '-o', '/tmp/vcore-leisure-5aj8oipv/test']' returned non-zero exit status 1. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure_catalog.log new file mode 100644 index 0000000000..f853e176ab --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_leisure_catalog.log @@ -0,0 +1 @@ +Leisure migration: native city anchor, shared scene references, pet-walk mapping and preservation of edited weights passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_location_import.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_location_import.log new file mode 100644 index 0000000000..c39b1a68c7 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_location_import.log @@ -0,0 +1 @@ +Locations: actual Debug SMALLINT reads retain continent IDs; explicit location eligibility and edited weight overrides passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_manager_inventory.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_manager_inventory.log new file mode 100644 index 0000000000..68114c16fe --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_manager_inventory.log @@ -0,0 +1 @@ +Production inventory maintenance: only full backpacks, native stack trimming, level-appropriate supplies, tools, leash, fishing pole, containers and untouched equipped slots passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_micro_reset.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_micro_reset.log new file mode 100644 index 0000000000..535400e49e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_micro_reset.log @@ -0,0 +1 @@ +Micro cleanup ends physical local movement, preserves transit and does not stand up dead players. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_native_lfg.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_native_lfg.log new file mode 100644 index 0000000000..bd1834d1e6 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_native_lfg.log @@ -0,0 +1 @@ +Native LFG: ID26, localized standard channel, zone eligibility, join verification and population throttle passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_navigation_rescue.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_navigation_rescue.log new file mode 100644 index 0000000000..c01d34929a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_navigation_rescue.log @@ -0,0 +1 @@ +Real hearth recovery: grace, animation, faction capitals, cancellation, activity gaps and long taxi grace passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_northrend_flight.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_northrend_flight.log new file mode 100644 index 0000000000..f84d72d501 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_northrend_flight.log @@ -0,0 +1 @@ +Production flight: legacy defaults, level60 riding, level68 cold weather, all-entry denial, repair, faction mount, preserved weights and ordinary-player isolation passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_poi_binding.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_poi_binding.log new file mode 100644 index 0000000000..e7c526739d --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_poi_binding.log @@ -0,0 +1 @@ +POI native gossip graph: recursive menus/cycles, unique map, ambiguity rejection, local height anchor. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_population.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_population.log new file mode 100644 index 0000000000..0a8c272a31 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_population.log @@ -0,0 +1 @@ +Production population: four independent faction/persistence targets, fair selection, pending reservations, retries, existing inventory, once-per-boot rotation and connected/persistent protection passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_catalog.log new file mode 100644 index 0000000000..25ed5fc07e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_catalog.log @@ -0,0 +1 @@ +Profession catalog: native workstation roles, no workshop/resource inference, idempotence and preserved edits passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_profile.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_profile.log new file mode 100644 index 0000000000..b44e2efa5b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_profile.log @@ -0,0 +1 @@ +Production profession parser, real Lua profiles, primary restrictions and secondary permissions passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_sightline.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_sightline.log new file mode 100644 index 0000000000..0cc6cdefa1 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_sightline.log @@ -0,0 +1 @@ +Native workstation working-surface sightline and blocked geometry rejection passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_targets.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_targets.log new file mode 100644 index 0000000000..f1ca6dab23 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profession_targets.log @@ -0,0 +1 @@ +Production profession targets: native locks, phase/spawn/loot, stations, corpses, history and trainers passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profile_selection.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profile_selection.log new file mode 100644 index 0000000000..fbcc636333 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_profile_selection.log @@ -0,0 +1 @@ +Production profile selection: real Lua ID dictionaries, exact 9:1 companion weighting, zero/negative/infinite/NaN/oversized weights rejected and legacy companion fallback passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_pvp.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_pvp.log new file mode 100644 index 0000000000..9ed2052394 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_pvp.log @@ -0,0 +1 @@ +Production PvP selector: level boundaries, radius, factions, native legality, navigation, intent, personality and resources passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_recovery_policy.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_recovery_policy.log new file mode 100644 index 0000000000..771d132328 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_recovery_policy.log @@ -0,0 +1 @@ +Five quick redeaths arm the NEXT graveyard fallback; rescue grace/cooldown and asymmetric invitation limits passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_repair_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_repair_catalog.log new file mode 100644 index 0000000000..bddfdab0d2 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_repair_catalog.log @@ -0,0 +1 @@ +Repair action catalog: proper native service requirement, economy-only intent and preserved administrator weights passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest.log new file mode 100644 index 0000000000..503a067134 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest.log @@ -0,0 +1 @@ +Recovery: authored places, bounds, arrival, occupancy, full rest duration, failure, reload and interruption passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_fire.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_fire.log new file mode 100644 index 0000000000..39ef1ac33a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_fire.log @@ -0,0 +1 @@ +Rest fire: shared scene mapping, additive migration, preserved weights and authored creation-place policy passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_space.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_space.log new file mode 100644 index 0000000000..7e2297e004 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_space.log @@ -0,0 +1 @@ +Sleep footprint: furniture, body extent, overhead collision, ledges, stairs, missing heights, rotation and scale passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_targets.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_targets.log new file mode 100644 index 0000000000..9e934e903d --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rest_targets.log @@ -0,0 +1 @@ +Native sleep targets: chair exclusion, phase, despawn, floor search, indoors, water, storey, occupancy, bed/surface preference passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_retry_policy.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_retry_policy.log new file mode 100644 index 0000000000..44a56f7981 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_retry_policy.log @@ -0,0 +1 @@ +Travel failures: exponential/jittered retry spacing, strict 30s bound and overflow safety passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rotation.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rotation.log new file mode 100644 index 0000000000..aebc2f82ab --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_rotation.log @@ -0,0 +1,11 @@ +/tmp/tmp6x5ibwkk/test.cpp: In instantiation of ‘std::string Trinity::StringFormat(const char*, A ...) [with A = {}; std::string = std::__cxx11::basic_string]’: +/tmp/tmp6x5ibwkk/test.cpp:22:126: required from ‘void Tx::PAppend(const char*, A ...) [with A = {}]’ + 22 | struct Tx{std::vectorsql;templatevoid PAppend(char const*f,A...a){sql.push_back(Trinity::StringFormat(f,a...));}}; + | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ +/tmp/tmp6x5ibwkk/test.cpp:51:75: required from here + 51 | auto barrier=CharacterDatabase.BeginTransaction();barrier->PAppend("DO 0"); + | ~~~~~~~~~~~~~~~~^~~~~~~~ +/tmp/tmp6x5ibwkk/test.cpp:11:113: warning: format not a string literal and no format arguments [-Wformat-security] + 11 | namespace Trinity{templatestd::string StringFormat(char const* f,A...args){char b[4096];std::snprintf(b,sizeof(b),f,args...);return b;}} + | ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~ +Production rotation: connected/native-online protection, ownership refusal, native delete failure, world cleanup failure and journal-retained retry before successful profile/plan/state removal passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social.log new file mode 100644 index 0000000000..cbcffc4869 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social.log @@ -0,0 +1 @@ +Production social flow: approach before talk, coherent greeting/talk/listen/farewell, lost targets, native chair confirmation and real fire confirmation passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social_fire.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social_fire.log new file mode 100644 index 0000000000..1715aa97b3 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_social_fire.log @@ -0,0 +1 @@ +Shared fire: native detection/provisioning, buildings/city/parent/zone restrictions, existing fires and outdoor/water checks passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supplies.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supplies.log new file mode 100644 index 0000000000..1f929714b7 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supplies.log @@ -0,0 +1 @@ +Production supplies: exact10% boundary, bandage-before-food, native lockout fallback, recovery completion, combat potions, mana-only drinking and daily/post-combat top-ups passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_catalog.log new file mode 100644 index 0000000000..9628f7d807 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_catalog.log @@ -0,0 +1 @@ +Supply migrations: all five roles, level60 netherweave tier, editable/disabled catalog preservation and persistent daily stamp passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_items.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_items.log new file mode 100644 index 0000000000..9b327d3c5a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_supply_items.log @@ -0,0 +1 @@ +Production native-item delegation: usable bandage tiers, native cooldown/lockout gates, real inventory consumption, self targeting and level60 secondary caps passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_talent_templates.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_talent_templates.log new file mode 100644 index 0000000000..5652685220 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_talent_templates.log @@ -0,0 +1 @@ +Canonical Cata PvE builds: 4.3.4 class/tree/rank/prerequisite gates, all 1..41 point budgets, solo selection coverage passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_training_catalog.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_training_catalog.log new file mode 100644 index 0000000000..dfc0e883b1 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_training_catalog.log @@ -0,0 +1 @@ +Training catalog: real dummy requirement, leisure-only intent, bounded duration and preserved administrator weights passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_walk.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_walk.log new file mode 100644 index 0000000000..41fbfd595a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_walk.log @@ -0,0 +1 @@ +Production travel gait reaches native spline, survives repaths, prevents mounting and preserves legacy running defaults. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_world_presence.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_world_presence.log new file mode 100644 index 0000000000..a5423ca401 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_adventure_world_presence.log @@ -0,0 +1 @@ +Production world presence: persistent PvP, Worgen intent/arrival decisions, travel deferral, native Running Wild, human horse and aura cleanup passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_admission.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_admission.log new file mode 100644 index 0000000000..a208721e7f --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_admission.log @@ -0,0 +1 @@ +Browser admission, last-human departure, independent switches, bot-only override, roles and formation progress passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_bg_brackets.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_bg_brackets.log new file mode 100644 index 0000000000..e6654a0fe3 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_bg_brackets.log @@ -0,0 +1 @@ +Production BG recruitment uses native brackets, minimum levels, random eligibility and available templates; native Type1 LFR and legacy Type2 browser options. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_match_order.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_match_order.log new file mode 100644 index 0000000000..c9764d7ecb --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_match_order.log @@ -0,0 +1 @@ +Native matching order: last human gets dungeon/raid slot, stale bot-only cache is rejected, and test/config gates hold. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_participants.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_participants.log new file mode 100644 index 0000000000..d1ae483e15 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_browser_participants.log @@ -0,0 +1 @@ +Production participant gate: exact party, disconnect, live switches, bot-only tests and independent human groups passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_capital_portal_seed.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_capital_portal_seed.log new file mode 100644 index 0000000000..fc9470997b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_capital_portal_seed.log @@ -0,0 +1 @@ +Capital seed: native direct/script targets, factions, quest transit closed, wrong spawn entry rejected, manual edits and disabled flags preserved, idempotence. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_cheat_explore.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_cheat_explore.log new file mode 100644 index 0000000000..71b969d021 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_cheat_explore.log @@ -0,0 +1 @@ +Native cheat explore reveals/clears every zone field on selected player; caller stays unchanged. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_city_catalog_parents.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_city_catalog_parents.log new file mode 100644 index 0000000000..5cddd9c698 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_city_catalog_parents.log @@ -0,0 +1 @@ +Editable city catalog parents: Dalaran/CrystalSong, Shattrath/Terokkar, operator preservation, map guard, idempotence and new DBC exports. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_character_factory.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_character_factory.log new file mode 100644 index 0000000000..11ac8646af --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_character_factory.log @@ -0,0 +1 @@ +Production native factory: character/profile atomicity, failed preparation/commit, cache publication order, account/security/name/cap gates passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_companion.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_companion.log new file mode 100644 index 0000000000..989554c90f --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_companion.log @@ -0,0 +1 @@ +Native companion: provisioning, delayed summon, ownership, real item target, leash confirmation/timeout, reuse and cleanup passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_damage_notifications.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_damage_notifications.log new file mode 100644 index 0000000000..f18c439e27 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_damage_notifications.log @@ -0,0 +1 @@ +Production damage handoff: 16 concurrent map-worker writers, ordered GUID-only events, clientless-only/positive damage gates and post-health notification passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_near_teleport_observer.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_near_teleport_observer.log new file mode 100644 index 0000000000..023cec5e2b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_near_teleport_observer.log @@ -0,0 +1 @@ +Production near-teleport observer packet includes actual mover GUID and destination; clientless timestamp refreshed, regular client timestamp preserved. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_skill_preparation.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_skill_preparation.log new file mode 100644 index 0000000000..c33d579f53 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_skill_preparation.log @@ -0,0 +1 @@ +Production offline skill preparation: native tier caps, no downgrading, rank/level/race/tier gates and no modification of online players passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_social_notifications.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_social_notifications.log new file mode 100644 index 0000000000..8f5d9cf5ba --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_clientless_social_notifications.log @@ -0,0 +1 @@ +Production social/helper queues: concurrent GUID-only delivery, bounded queues, human/self/zero-damage gates, pet attribution and lethal-cleanup ordering passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_default_phase.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_default_phase.log new file mode 100644 index 0000000000..6b1c4ae21b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_default_phase.log @@ -0,0 +1 @@ +Native PhaseShift: implicit/default 169 visibility, genuine custom-phase separation and reference updates passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_empty_spell_effect.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_empty_spell_effect.log new file mode 100644 index 0000000000..184dbedde0 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_empty_spell_effect.log @@ -0,0 +1 @@ +Native empty spell effects: poisoned-memory scaling initialization, Lock and Load cleared slot, active effect values and all-empty spell values passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_area_query.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_area_query.log new file mode 100644 index 0000000000..c45af5ec3a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_area_query.log @@ -0,0 +1 @@ +Native terrain query map/phase, area/zone ordering and cache passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_departure.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_departure.log new file mode 100644 index 0000000000..d341e74219 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_departure.log @@ -0,0 +1 @@ +Production flight admission: airborne mount retained, lower-floor MMAP departure, blocked/cliff/missing support rejected. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_handoff.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_handoff.log new file mode 100644 index 0000000000..12538ff1e3 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_handoff.log @@ -0,0 +1 @@ +Flight handoff before spline end, terminal landing, return corners, collision stop and actual distance passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_landing_search.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_landing_search.log new file mode 100644 index 0000000000..23c6108011 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_landing_search.log @@ -0,0 +1 @@ +Production landing search: distant/layered alternatives, native final ground approach, water/collision/area rejection. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_policy.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_policy.log new file mode 100644 index 0000000000..90f68a0a2b --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_policy.log @@ -0,0 +1 @@ +Flight native eligibility, license/profile/zone policy, RP costs and fail-safe return decisions passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_terrain_fallback.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_terrain_fallback.log new file mode 100644 index 0000000000..818c3722db --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_flight_terrain_fallback.log @@ -0,0 +1 @@ +Missing phase tile uses native base terrain; an existing phase tile with missing collision stays forbidden diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_follow_spline_velocity.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_follow_spline_velocity.log new file mode 100644 index 0000000000..cfcd6fdd8e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_follow_spline_velocity.log @@ -0,0 +1 @@ +Native follow: actual player/creature spline velocity, client gait and independent follower speeds passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight.log new file mode 100644 index 0000000000..fed22fb4eb --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight.log @@ -0,0 +1 @@ +Flight geometry passed: takeoff/landing, smoothed peak, ceiling, lateral/climbing avoidance, missing terrain and blocked corridors. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight_planner.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight_planner.log new file mode 100644 index 0000000000..f1c6539cbe --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_free_flight_planner.log @@ -0,0 +1 @@ +ground planner regressions and dynamic flight/node/location/virtual-exit integration passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_graph_probe_cache.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_graph_probe_cache.log new file mode 100644 index 0000000000..1a4a3dfeff --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_graph_probe_cache.log @@ -0,0 +1 @@ +Graph probe cache: exact directed/map/instance keys, successful geometry only, invalidation and bounded storage passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_ground_exit_continuation.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_ground_exit_continuation.log new file mode 100644 index 0000000000..427c306d4e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_ground_exit_continuation.log @@ -0,0 +1 @@ +optional exits: repeated probes, retained route, delayed success, forward resume, flight fallback passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_follow.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_follow.log new file mode 100644 index 0000000000..f69a883e14 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_follow.log @@ -0,0 +1 @@ +Moving-target flight: bounded phased corridors, obstacle hold, ceiling rejection, aerial formation hold, safe landing and return fallback passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_mount.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_mount.log new file mode 100644 index 0000000000..ddc2cebfaa --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_flight_mount.log @@ -0,0 +1 @@ +Group flight mount: native admission, mount retention, casting wait, rejected capabilities, stationary flight animation and bounded publication passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_role_composition.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_role_composition.log new file mode 100644 index 0000000000..72fdd73779 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_group_role_composition.log @@ -0,0 +1 @@ +Production role composition: correct party, missing healer, surplus tank, inaccessible/offline member and PvP group passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_guildless_group_restore.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_guildless_group_restore.log new file mode 100644 index 0000000000..4423e946c6 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_guildless_group_restore.log @@ -0,0 +1 @@ +Production group restore retains guildless members and their roles; only missing characters are deleted. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_item_equip_cooldown.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_item_equip_cooldown.log new file mode 100644 index 0000000000..df3b8fb45e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_item_equip_cooldown.log @@ -0,0 +1 @@ +Native item equip cooldown: zero/sentinel/missing spells safely skipped, valid use cooldown preserved and longer/disabled cooldowns untouched passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_local_spline_segments.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_local_spline_segments.log new file mode 100644 index 0000000000..259f25ab91 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_local_spline_segments.log @@ -0,0 +1 @@ +Production local spline clipping passes native path-length validation, tiny remainders and 1000 sampled paths. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_lua_reload.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_lua_reload.log new file mode 100644 index 0000000000..2fbdb35ad3 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_lua_reload.log @@ -0,0 +1 @@ +Lua reload regression tests passed (production reload/bindings, real Lua 5.4). diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_native_skill_slot.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_native_skill_slot.log new file mode 100644 index 0000000000..a0d4159884 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_native_skill_slot.log @@ -0,0 +1,2 @@ +Native riding/profession allocation accepts slot zero and last slot, rejects a full skill array +Native recursive skill activation preserves INSERT for new placeholders and UPDATE for saved skills diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_player_pure_max_skill.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_player_pure_max_skill.log new file mode 100644 index 0000000000..cc4975b6ca --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_player_pure_max_skill.log @@ -0,0 +1 @@ +Native pure skill cap: learned skills return stored cap; missing/deleted/zero-rank skills return0. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_conditions.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_conditions.log new file mode 100644 index 0000000000..36c3c99a99 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_conditions.log @@ -0,0 +1,2 @@ +Portal condition migration: explicit user target, preserved level gate, scoped updates and idempotence passed. +Public portal caster migration: static allowlist, party/type guards and idempotence passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_transfer.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_transfer.log new file mode 100644 index 0000000000..c8948ed790 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_transfer.log @@ -0,0 +1 @@ +Portal near/far ACK and denied same-map transfer regressions passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_use.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_use.log new file mode 100644 index 0000000000..63ce324f78 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_portal_use.log @@ -0,0 +1,3 @@ +Interactive portal native click, near/far/global ACK, denial, timeout and target checks passed. +Native portal destination discovery and unsupported/ambiguous spell rejection passed. +Production clientless ACK completion sequence increments only after completed near/far transfers. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_executor.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_executor.log new file mode 100644 index 0000000000..7c6531053a --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_executor.log @@ -0,0 +1 @@ +Rescue executor: walk first, tram-only validated transfer, native ACK, original goal retention, state reset, access and bounded retry guards passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_graph.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_graph.log new file mode 100644 index 0000000000..81f3591401 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_rescue_graph.log @@ -0,0 +1,2 @@ +ground planner regressions and dynamic flight/node/location/virtual-exit integration passed +Rescue graph: normal exclusion, walking first, recorded-only escapes, bounded tram transfer, access/blocked-edge checks and scoped planning passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_route_portal_prerequisites.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_route_portal_prerequisites.log new file mode 100644 index 0000000000..473e2fe5dc --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_route_portal_prerequisites.log @@ -0,0 +1 @@ +Production portal prerequisites: level/quest, target roles, AND/OR, negative and reference conditions; no stale permission cache. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_safe_logout.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_safe_logout.log new file mode 100644 index 0000000000..24acfcd33e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_safe_logout.log @@ -0,0 +1 @@ +Native safe logout gate waits for combat, casting, movement, transport, taxi, flight, falling, teleport and resurrection. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_shared_group_route.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_shared_group_route.log new file mode 100644 index 0000000000..582dc870d2 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_shared_group_route.log @@ -0,0 +1 @@ +Production generic shared routes: same edges/taxi/free flight, independent execution state, final local goal, late catch-up, permissions and stale-goal rejection passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_taxi_import_disabled.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_taxi_import_disabled.log new file mode 100644 index 0000000000..d516de8d94 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_taxi_import_disabled.log @@ -0,0 +1 @@ +Taxi importer preserves disabled rows and their reasons. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_testbot_client.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_testbot_client.log new file mode 100644 index 0000000000..5bbcfcd855 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_testbot_client.log @@ -0,0 +1 @@ +External TestBot SOAP submission, base64 script integrity, result retrieval and run-ID validation passed. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport.log new file mode 100644 index 0000000000..9a3cbb74be --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport.log @@ -0,0 +1 @@ +Transport dock, frame, recorder, cross-map copy and ride regressions passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_control.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_control.log new file mode 100644 index 0000000000..81599178a4 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_control.log @@ -0,0 +1 @@ +Production deck controller: halt budgets, departure interruption, return-before-exit, blocked paths and reservations passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_mesh.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_mesh.log new file mode 100644 index 0000000000..66081ca0c1 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_mesh.log @@ -0,0 +1,3 @@ +/tmp/tmpmwlu2p5u/Transportship.wmo.fixture polygons=1678 reachable=259 returns=259 +/tmp/tmpmwlu2p5u/Subwaycar.m2.fixture polygons=105 reachable=59 returns=59 +Real deck meshes: connectivity, floor isolation, edge clearance and return paths passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_return.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_return.log new file mode 100644 index 0000000000..3cb7c974a7 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_deck_return.log @@ -0,0 +1 @@ +Native deck fallback: stopped-only, sufficient exit reserve, exact local anchor, preserved attachment, world transform and movement broadcast passed diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_grid_loading.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_grid_loading.log new file mode 100644 index 0000000000..cb9c7e8e40 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_transport_grid_loading.log @@ -0,0 +1 @@ +Core transport grid initialization regressions passed (no CPC dependency). diff --git a/doc/clientless/checkpoints/2026-10-31-browser/regression/test_travel_telemetry.log b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_travel_telemetry.log new file mode 100644 index 0000000000..2e30cebfab --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/regression/test_travel_telemetry.log @@ -0,0 +1 @@ +Temporary travel traces: instance/raid scope, stable journey ID, deduplication, 40/min budget across goal changes and logout cleanup. diff --git a/doc/clientless/checkpoints/2026-10-31-browser/remaining-last-saved.tsv b/doc/clientless/checkpoints/2026-10-31-browser/remaining-last-saved.tsv new file mode 100644 index 0000000000..aacea3a959 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/remaining-last-saved.tsv @@ -0,0 +1,14 @@ +guid name race map position_x position_y position_z health online +40 Drakagmok 2 1 1773.39 -4278.97 101.113 1563 0 +42 Zulana 8 0 2272.68 372.064 35.7615 8710 0 +43 Fizzira 7 0 -11784.6 -3171.89 -29.1957 4947 1 +45 Kargarrin 3 1 8177.84 1002.65 6.69677 4401 0 +46 Selthas 10 571 2795.81 6300.04 74.8689 85312 1 +54 Falaeriel 10 1 2726.69 -2606.26 278.937 44807 1 +73 Rixzek 9 0 -11919.3 -3203.1 1.869 7666 1 +74 Nimbin 7 1 5391.2 -3378.67 1649.72 20938 1 +91 Norara 5 0 2272.68 372.064 35.7615 4551 0 +92 Tholgar 3 0 -9468.76 64.3408 55.9918 29526 0 +118 Lillina 7 1 5391.2 -3378.67 1649.72 14613 1 +125 Koruhon 6 1 1493.45 -4416.19 23.9117 975 0 +147 Seraenriel 10 0 3490.11 -4509.4 149.552 5989 1 diff --git a/doc/clientless/checkpoints/2026-10-31-browser/restart-recovery-needed.json b/doc/clientless/checkpoints/2026-10-31-browser/restart-recovery-needed.json new file mode 100644 index 0000000000..5d1053fe39 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/restart-recovery-needed.json @@ -0,0 +1,179 @@ +{ + "source": "Last native seven-session snapshot before external environment restart; not current live state.", + "worldserver_currently_running": true, + "fresh_startup_required_for_checks": false, + "automatic_teleport_not_performed": true, + "records": [ + { + "guid": 43, + "name": "Fizzira", + "faction": "alliance", + "last_saved_position": { + "map": 0, + "x": -11784.6, + "y": -3171.89, + "z": -29.1957 + }, + "native_flight_status": "no free-flight state", + "native_transport_status": "no transport ride state", + "individual_combat_taxi_teleport_flags": "not captured; recheck live after next authorized startup", + "post_startup_checked": true, + "post_startup_result": { + "online": true, + "admin_recovery_city": "Stormwind", + "verified_map": 0, + "verified_area": 5148, + "area_allowed": true, + "free_flight_state": "none", + "transport_ride_state": "none" + } + }, + { + "guid": 46, + "name": "Selthas", + "faction": "horde", + "last_saved_position": { + "map": 571, + "x": 2795.81, + "y": 6300.04, + "z": 74.8689 + }, + "native_flight_status": "Flight GUID 46: state=Failed map=571 mountSpell=32244 segments=0 avoidances=0 handoffs=0 travelled=0.0 detail='no safe bounded flight corridor; holding position mounted'", + "native_transport_status": "no transport ride state", + "individual_combat_taxi_teleport_flags": "not captured; recheck live after next authorized startup", + "post_startup_checked": true, + "post_startup_result": { + "online": true, + "admin_recovery_city": "Orgrimmar", + "verified_map": 1, + "verified_area": 5170, + "area_allowed": true, + "free_flight_state": "none", + "transport_ride_state": "none" + } + }, + { + "guid": 54, + "name": "Falaeriel", + "faction": "horde", + "last_saved_position": { + "map": 1, + "x": 2726.69, + "y": -2606.26, + "z": 278.937 + }, + "native_flight_status": "Flight GUID 54: state=Failed map=1 mountSpell=32245 segments=42 avoidances=40 handoffs=12 travelled=671.0 detail='no safe bounded flight corridor; holding position mounted'", + "native_transport_status": "no transport ride state", + "individual_combat_taxi_teleport_flags": "not captured; recheck live after next authorized startup", + "post_startup_checked": true, + "post_startup_result": { + "online": true, + "admin_recovery_city": "Orgrimmar", + "verified_map": 1, + "verified_area": 5170, + "area_allowed": true, + "free_flight_state": "none", + "transport_ride_state": "none" + } + }, + { + "guid": 73, + "name": "Rixzek", + "faction": "horde", + "last_saved_position": { + "map": 0, + "x": -11919.3, + "y": -3203.1, + "z": 1.869 + }, + "native_flight_status": "Flight GUID 73: state=Failed map=0 mountSpell=32245 segments=47 avoidances=1 handoffs=28 travelled=978.8 detail='no safe bounded flight corridor; holding position mounted'", + "native_transport_status": "no transport ride state", + "individual_combat_taxi_teleport_flags": "not captured; recheck live after next authorized startup", + "post_startup_checked": true, + "post_startup_result": { + "online": true, + "admin_recovery_city": "Orgrimmar", + "verified_map": 1, + "verified_area": 5170, + "area_allowed": true, + "free_flight_state": "none", + "transport_ride_state": "none" + } + }, + { + "guid": 74, + "name": "Nimbin", + "faction": "alliance", + "last_saved_position": { + "map": 1, + "x": 5391.2, + "y": -3378.67, + "z": 1649.72 + }, + "native_flight_status": "Flight GUID 74: state=Failed map=1 mountSpell=32235 segments=0 avoidances=0 handoffs=0 travelled=0.0 detail='no safe bounded flight corridor; holding position mounted'", + "native_transport_status": "no transport ride state", + "individual_combat_taxi_teleport_flags": "not captured; recheck live after next authorized startup", + "post_startup_checked": true, + "post_startup_result": { + "online": true, + "admin_recovery_city": "Stormwind", + "verified_map": 0, + "verified_area": 5148, + "area_allowed": true, + "free_flight_state": "none", + "transport_ride_state": "none" + } + }, + { + "guid": 118, + "name": "Lillina", + "faction": "alliance", + "last_saved_position": { + "map": 1, + "x": 5391.2, + "y": -3378.67, + "z": 1649.72 + }, + "native_flight_status": "Flight GUID 118: state=Failed map=1 mountSpell=32235 segments=0 avoidances=0 handoffs=0 travelled=0.0 detail='no safe bounded flight corridor; holding position mounted'", + "native_transport_status": "no transport ride state", + "individual_combat_taxi_teleport_flags": "not captured; recheck live after next authorized startup", + "post_startup_checked": true, + "post_startup_result": { + "online": true, + "admin_recovery_city": "Stormwind", + "verified_map": 0, + "verified_area": 5148, + "area_allowed": true, + "free_flight_state": "none", + "transport_ride_state": "none" + } + }, + { + "guid": 147, + "name": "Seraenriel", + "faction": "horde", + "last_saved_position": { + "map": 0, + "x": 3490.11, + "y": -4509.4, + "z": 149.552 + }, + "native_flight_status": "Flight GUID 147: state=Arrived map=0 mountSpell=32244 segments=31 avoidances=5 handoffs=17 travelled=645.9 detail='landed on validated destination ground'", + "native_transport_status": "no transport ride state", + "individual_combat_taxi_teleport_flags": "not captured; recheck live after next authorized startup", + "post_startup_checked": true, + "post_startup_result": { + "online": true, + "admin_recovery_city": "Orgrimmar", + "verified_map": 1, + "verified_area": 5170, + "area_allowed": true, + "free_flight_state": "none", + "transport_ride_state": "none" + } + } + ], + "recovery_completed": true, + "evidence": "post-recovery-loader.log; post-start-recovery.log; loader-resumed.log", + "notes": "Native safe-logout status after teleports: sessions=7 combat=0 transport=0 flight=0 loading=0. All seven subsequently confirmed in capital areas. Normal schedules resumed. Later new taxis/routes are normal behavior, not old retained transport states." +} diff --git a/doc/clientless/checkpoints/2026-10-31-browser/resumed-build-state.json b/doc/clientless/checkpoints/2026-10-31-browser/resumed-build-state.json new file mode 100644 index 0000000000..e9075779f9 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/resumed-build-state.json @@ -0,0 +1,9 @@ +{ + "worldserver_running": false, + "tmux_worldserver_present": false, + "clientless_sessions": 0, + "loader_enabled": 0, + "testbot_enabled_before": 1, + "install_allowed": false, + "server_start_allowed": false +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/runtime-summary.log b/doc/clientless/checkpoints/2026-10-31-browser/runtime-summary.log new file mode 100644 index 0000000000..099a7224f1 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/runtime-summary.log @@ -0,0 +1,6 @@ +Testbot job admission paused; active runs remain controlled separately. +TC> Adventure loader enabled=0 schema=1 busy=0 pools=50/5/50/5 known=110 rotations=0 manager=107 error='' +TC> Safe logout pending=109 sessions=109 combat=3 transport=2 flight=26 loading=1 +Safe logout pending=30 sessions=30 combat=3 transport=2 flight=22 loading=0 +[?2004hTC>Safe logout pending=15 sessions=15 combat=2 transport=0 flight=13 loading=0 +[?2004hTC>Safe logout pending=12 sessions=12 combat=2 transport=0 flight=10 loading=0 diff --git a/doc/clientless/checkpoints/2026-10-31-browser/safe-logout-request.json b/doc/clientless/checkpoints/2026-10-31-browser/safe-logout-request.json new file mode 100644 index 0000000000..4b8eda686e --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/safe-logout-request.json @@ -0,0 +1,24 @@ +{ + "loader": "1", + "requested_at": "2026-10-31T01:21:40.018106+01:00", + "restart_forbidden_while_recording": true, + "snapshot_at": "2026-10-31T01:30:10.337966+01:00", + "remaining_guids": [ + 40, + 42, + 43, + 45, + 46, + 54, + 73, + 74, + 91, + 92, + 118, + 125, + 147 + ], + "build_deferred": true, + "shutdown_performed": false, + "reason": "User is recording ship route; do not restart or shut down." +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-browser/startup-and-initial-runtime.log b/doc/clientless/checkpoints/2026-10-31-browser/startup-and-initial-runtime.log new file mode 100644 index 0000000000..b2f81aadc7 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/startup-and-initial-runtime.log @@ -0,0 +1,15 @@ +Using enUS DBC Locale +Will clear `logs` table of entries older than 1209600 seconds every 10 minutes. +Client cache version set to: 22011 +WORLD: MMap data directory is: /home/wow_admin/wow_cata_server/data/mmaps +VMap support included. LineOfSight: 1, getHeight: 1, indoorCheck: 1 +VMap data directory is: /home/wow_admin/wow_cata_server/data/vmaps +Missing name DungeonFinder.LowPopulation.Enable in config file /home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopulation.Enable = 0" to this file +Missing name DungeonFinder.LowPopulation.FallbackDelay in config file /home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopulation.FallbackDelay = 60" to this file +Missing name DungeonFinder.LowPopulation.MinPlayers in config file /home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopulation.MinPlayers = 1" to this file +Missing name DungeonFinder.LowPopulation.SoloGroupOutsideTimeout in config file /home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf, add "DungeonFinder.LowPopulation.SoloGroupOutsideTimeout = 300" to this file +[AdventureBot] recorded-ground-spline guid=118 name='Lillina' routeStep=2/2 points=99 +[AdventureBot] recorded-ground-spline guid=73 name='Rixzek' routeStep=2/3 points=9 +[AdventureBot] recorded-ground-spline guid=46 name='Selthas' routeStep=2/2 points=100 +INTENT_FALLBACK guid=73 from='poi_guard_451' to='poi_tele_1276' tried=1 retryMs=2446 +INTENT_TRAVEL guid=73 intent='leisure' location='poi_tele_1276' area=0 diff --git a/doc/clientless/checkpoints/2026-10-31-browser/validation-status.json b/doc/clientless/checkpoints/2026-10-31-browser/validation-status.json new file mode 100644 index 0000000000..056a75139d --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-browser/validation-status.json @@ -0,0 +1,19 @@ +{ + "focused_tests_initial": 7, + "clientless_tests_total": 120, + "clientless_tests_passed": 120, + "initial_adapter_failures_fixed": 6, + "cmake_build": "PASS (-j10), full build and final incremental build exit0", + "installed": true, + "server_started": true, + "gameplay_verified": false, + "loader_enabled": 1, + "testbot_enabled": 1, + "pending_next_authorized_startup_checks": null, + "startup_ready": true, + "listening_ports": [ + 8085, + 8087 + ], + "recovery_completed": true +} diff --git a/doc/clientless/checkpoints/2026-10-31-elunes-blessing/after.json b/doc/clientless/checkpoints/2026-10-31-elunes-blessing/after.json new file mode 100644 index 0000000000..ec5be71343 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-elunes-blessing/after.json @@ -0,0 +1,17 @@ +{ + "edge": [ + { + "id": "1859", + "from_node_key": "ship_elunes_blessing_ruttheran", + "to_node_key": "ship_elunes_blessing_azuremyst", + "edge_type": "ship", + "cost": "100", + "bidirectional": "1", + "enabled": "1", + "comment": "CPC recorded native transport" + } + ], + "node_access": "node_key\tallowed_factions\tflightmaster_spawn_id\tnotes\nship_elunes_blessing_azuremyst\t1\tNULL\tAlliance Elunes Blessing recorded ship service\nship_elunes_blessing_ruttheran\t1\tNULL\tAlliance Elunes Blessing recorded ship service\n", + "ruttheran_recorded_ground_edges": "", + "live_ride_tested": false +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-elunes-blessing/before.json b/doc/clientless/checkpoints/2026-10-31-elunes-blessing/before.json new file mode 100644 index 0000000000..01cb7ddc01 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-elunes-blessing/before.json @@ -0,0 +1,7 @@ +{ + "vcore_clientless_transport_stop": "node_key\ttransport_entry\ttransport_spawn\tmap\tdock_x\tdock_y\tdock_z\tdock_o\tperiod_ms\tstand_name\nship_elunes_blessing_azuremyst\t181646\t9\t530\t-4264.97\t-11317.2\t0\t0.0889411\t238656\telunes_blessing_center\nship_elunes_blessing_ruttheran\t181646\t9\t1\t8346.62\t1177.08\t0\t3.18425\t238656\telunes_blessing_center\n", + "vcore_clientless_transport_point": "node_key\tpoint_index\ton_transport\tx\ty\tz\to\nship_elunes_blessing_azuremyst\t0\t0\t-4264.42\t-11332\t5.49679\t1.69799\nship_elunes_blessing_azuremyst\t1\t0\t-4263.89\t-11330.8\t5.37357\t1.70756\nship_elunes_blessing_azuremyst\t2\t0\t-4263.44\t-11330\t5.28374\t1.06746\nship_elunes_blessing_azuremyst\t3\t0\t-4262.95\t-11329\t5.81486\t1.13814\nship_elunes_blessing_azuremyst\t4\t0\t-4262.52\t-11328\t5.82116\t1.15385\nship_elunes_blessing_azuremyst\t5\t0\t-4262.3\t-11327.2\t5.49282\t1.35413\nship_elunes_blessing_azuremyst\t6\t1\t1.81416\t-10.0779\t5.2608\t1.30446\nship_elunes_blessing_azuremyst\t7\t1\t2.02182\t-9.31602\t5.48785\t1.30446\nship_elunes_blessing_azuremyst\t8\t1\t2.38219\t-8.00692\t5.10558\t1.30838\nship_elunes_blessing_azuremyst\t9\t1\t2.28806\t-6.75925\t5.04779\t1.94848\nship_elunes_blessing_azuremyst\t10\t1\t1.76874\t-5.33738\t4.98275\t1.81889\nship_elunes_blessing_azuremyst\t11\t1\t1.35021\t-3.87941\t4.917\t1.81497\nship_elunes_blessing_azuremyst\t12\t1\t0.992184\t-2.41898\t4.8667\t1.80318\nship_elunes_blessing_azuremyst\t13\t1\t0.724427\t-0.930328\t4.83485\t1.72464\nship_elunes_blessing_azuremyst\t14\t1\t0.54946\t0.224543\t4.82025\t1.72072\nship_elunes_blessing_azuremyst\t15\t1\t0.54946\t0.224543\t4.82025\t1.72072\nship_elunes_blessing_ruttheran\t0\t0\t8343.44\t1161.52\t4.51575\t4.73302\nship_elunes_blessing_ruttheran\t1\t0\t8343.93\t1163.97\t4.22647\t1.67495\nship_elunes_blessing_ruttheran\t2\t0\t8344.64\t1165.31\t4.10661\t1.07412\nship_elunes_blessing_ruttheran\t3\t1\t1.96206\t10.8168\t4.40401\t4.17306\nship_elunes_blessing_ruttheran\t4\t1\t0.966135\t8.87239\t5.33952\t4.22024\nship_elunes_blessing_ruttheran\t5\t1\t0.833186\t8.00178\t4.97141\t4.22018\nship_elunes_blessing_ruttheran\t6\t1\t0.468164\t4.5336\t4.85926\t4.60895\nship_elunes_blessing_ruttheran\t7\t1\t0.105732\t1.05737\t4.79647\t4.60899\nship_elunes_blessing_ruttheran\t8\t1\t-0.0111294\t-0.100447\t4.77433\t4.61678\nship_elunes_blessing_ruttheran\t9\t1\t-0.0111294\t-0.100447\t4.77433\t4.61678\n", + "vcore_clientless_transport_stand": "transport_entry\tname\tx\ty\tz\to\n181646\telunes_blessing_center\t-0.0111294\t-0.100447\t4.77433\t4.61678\n", + "vcore_clientless_node_access": "", + "vcore_clientless_travel_edge": "id\tfrom_node_key\tto_node_key\tedge_type\tcost\tbidirectional\tenabled\tcomment\n1858\texodar_gate_second\tship_elunes_blessing_azuremyst\tground\t254.397\t1\t1\tRecorded in game\n" +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-elunes-blessing/runtime-verification.log b/doc/clientless/checkpoints/2026-10-31-elunes-blessing/runtime-verification.log new file mode 100644 index 0000000000..b278652a98 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-elunes-blessing/runtime-verification.log @@ -0,0 +1,6 @@ +AREA_CATALOG revision=1 areas=3206 nodes=1092 taxiResolved=314 taxiClosedUnknown=141 +Transport edge created. The shared stop nodes are used in both directions. +Stop 'ship_elunes_blessing_ruttheran': entry=181646 spawn=9 map=1 points=10 length=16.56 stand='elunes_blessing_center' period=238656ms dock=(8346.620 1177.080 0.000) +Stop 'ship_elunes_blessing_azuremyst': entry=181646 spawn=9 map=530 points=16 length=16.42 stand='elunes_blessing_center' period=238656ms dock=(-4264.970 -11317.200 0.000) +[?2004hTC>AREA_CATALOG revision=2 areas=3206 nodes=1092 taxiResolved=314 taxiClosedUnknown=141 +Adventure catalogs reloaded. diff --git a/doc/clientless/checkpoints/2026-10-31-group-test/applied.json b/doc/clientless/checkpoints/2026-10-31-group-test/applied.json new file mode 100644 index 0000000000..f29e5344c4 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-group-test/applied.json @@ -0,0 +1,1130 @@ +{ + "date": 20261031, + "formation_hour": 14, + "activity_hour": 15, + "native_load_revalidates_destinations": true, + "changes": [ + { + "guid": "26", + "name": "Arthoran", + "level": "60", + "race": "1", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "", + "meeting": "poi_guard_22" + }, + { + "guid": "35", + "name": "Karggan", + "level": "85", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_6196", + "meeting": "poi_guard_22" + }, + { + "guid": "36", + "name": "Edwin", + "level": "85", + "race": "5", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_6664_d0", + "meeting": "poi_guard_179" + }, + { + "guid": "39", + "name": "Durnrin", + "level": "16", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_6108", + "meeting": "poi_guard_22" + }, + { + "guid": "40", + "name": "Drakagmok", + "level": "33", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_442", + "meeting": "poi_guard_179" + }, + { + "guid": "41", + "name": "Gimmik", + "level": "57", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_1466", + "meeting": "poi_guard_22" + }, + { + "guid": "42", + "name": "Zulana", + "level": "69", + "race": "8", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "", + "meeting": "poi_guard_179" + }, + { + "guid": "43", + "name": "Fizzira", + "level": "61", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3184", + "meeting": "poi_guard_22" + }, + { + "guid": "44", + "name": "Yarumak", + "level": "63", + "race": "6", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_3529", + "meeting": "poi_guard_179" + }, + { + "guid": "45", + "name": "Kargarrin", + "level": "58", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_1466", + "meeting": "poi_guard_22" + }, + { + "guid": "46", + "name": "Selthas", + "level": "84", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_5670_d2", + "meeting": "poi_guard_179" + }, + { + "guid": "47", + "name": "Nimibin", + "level": "57", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_2217", + "meeting": "poi_guard_22" + }, + { + "guid": "48", + "name": "Elaniel", + "level": "35", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3133", + "meeting": "poi_guard_179" + }, + { + "guid": "49", + "name": "Lunna", + "level": "72", + "race": "4", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_324", + "meeting": "poi_guard_22" + }, + { + "guid": "52", + "name": "Vexki", + "level": "31", + "race": "9", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_257", + "meeting": "poi_guard_179" + }, + { + "guid": "53", + "name": "Noranda", + "level": "81", + "race": "1", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_5636", + "meeting": "poi_guard_22" + }, + { + "guid": "54", + "name": "Falaeriel", + "level": "81", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_3529", + "meeting": "poi_guard_179" + }, + { + "guid": "56", + "name": "Hilddis", + "level": "29", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_2214", + "meeting": "poi_guard_22" + }, + { + "guid": "57", + "name": "Torukan", + "level": "52", + "race": "6", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_924", + "meeting": "poi_guard_179" + }, + { + "guid": "60", + "name": "Ashani", + "level": "48", + "race": "11", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_442", + "meeting": "poi_guard_22" + }, + { + "guid": "61", + "name": "Mirariel", + "level": "48", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_1466", + "meeting": "poi_guard_179" + }, + { + "guid": "62", + "name": "Garenden", + "level": "32", + "race": "1", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_244", + "meeting": "poi_guard_22" + }, + { + "guid": "63", + "name": "Drakuga", + "level": "49", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_2214", + "meeting": "poi_guard_179" + }, + { + "guid": "64", + "name": "Hildda", + "level": "78", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "", + "meeting": "poi_guard_22" + }, + { + "guid": "67", + "name": "Volasha", + "level": "47", + "race": "8", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_442", + "meeting": "poi_guard_179" + }, + { + "guid": "68", + "name": "Sylenriel", + "level": "16", + "race": "4", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_228", + "meeting": "poi_guard_22" + }, + { + "guid": "69", + "name": "Halilden", + "level": "15", + "race": "5", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4405_d1", + "meeting": "poi_guard_179" + }, + { + "guid": "70", + "name": "Renaisia", + "level": "71", + "race": "22", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_3528", + "meeting": "poi_guard_22" + }, + { + "guid": "71", + "name": "Elaria", + "level": "45", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3184", + "meeting": "poi_guard_179" + }, + { + "guid": "72", + "name": "Sorana", + "level": "55", + "race": "11", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_2216", + "meeting": "poi_guard_22" + }, + { + "guid": "73", + "name": "Rixzek", + "level": "68", + "race": "9", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4321", + "meeting": "poi_guard_179" + }, + { + "guid": "74", + "name": "Nimbin", + "level": "77", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_5379", + "meeting": "poi_guard_22" + }, + { + "guid": "75", + "name": "Faeleran", + "level": "24", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_257", + "meeting": "poi_guard_179" + }, + { + "guid": "76", + "name": "Renalin", + "level": "35", + "race": "1", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_523", + "meeting": "poi_guard_22" + }, + { + "guid": "77", + "name": "Drakogzug", + "level": "60", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_924", + "meeting": "poi_guard_179" + }, + { + "guid": "80", + "name": "Noralin", + "level": "21", + "race": "22", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_228", + "meeting": "poi_guard_22" + }, + { + "guid": "82", + "name": "Taliara", + "level": "42", + "race": "22", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_2214", + "meeting": "poi_guard_22" + }, + { + "guid": "83", + "name": "Mahuwa", + "level": "84", + "race": "6", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_6485", + "meeting": "poi_guard_179" + }, + { + "guid": "84", + "name": "Brynli", + "level": "70", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_3529", + "meeting": "poi_guard_22" + }, + { + "guid": "85", + "name": "Gixni", + "level": "34", + "race": "9", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3134", + "meeting": "poi_guard_179" + }, + { + "guid": "86", + "name": "Brindra", + "level": "15", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_78", + "meeting": "poi_guard_22" + }, + { + "guid": "87", + "name": "Moggra", + "level": "47", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3189", + "meeting": "poi_guard_179" + }, + { + "guid": "88", + "name": "Pibwin", + "level": "18", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_228", + "meeting": "poi_guard_22" + }, + { + "guid": "89", + "name": "Tahuima", + "level": "78", + "race": "6", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4152_d1", + "meeting": "poi_guard_179" + }, + { + "guid": "91", + "name": "Norara", + "level": "68", + "race": "5", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4151", + "meeting": "poi_guard_179" + }, + { + "guid": "92", + "name": "Tholgar", + "level": "79", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "", + "meeting": "poi_guard_22" + }, + { + "guid": "93", + "name": "Gargar", + "level": "78", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4151", + "meeting": "poi_guard_179" + }, + { + "guid": "94", + "name": "Brinunli", + "level": "19", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_228", + "meeting": "poi_guard_22" + }, + { + "guid": "96", + "name": "Darden", + "level": "82", + "race": "1", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "", + "meeting": "poi_guard_22" + }, + { + "guid": "97", + "name": "Talzul", + "level": "66", + "race": "8", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_257", + "meeting": "poi_guard_179" + }, + { + "guid": "98", + "name": "Nimimi", + "level": "15", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3133", + "meeting": "poi_guard_22" + }, + { + "guid": "99", + "name": "Shadra", + "level": "70", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4983", + "meeting": "poi_guard_179" + }, + { + "guid": "100", + "name": "Lunsia", + "level": "26", + "race": "4", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3134", + "meeting": "poi_guard_22" + }, + { + "guid": "101", + "name": "Korutam", + "level": "69", + "race": "6", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4406", + "meeting": "poi_guard_179" + }, + { + "guid": "102", + "name": "Corren", + "level": "69", + "race": "22", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "", + "meeting": "poi_guard_22" + }, + { + "guid": "103", + "name": "Korgar", + "level": "28", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_101", + "meeting": "poi_guard_179" + }, + { + "guid": "104", + "name": "Lillini", + "level": "75", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_4470", + "meeting": "poi_guard_22" + }, + { + "guid": "106", + "name": "Nibelin", + "level": "38", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_614", + "meeting": "poi_guard_22" + }, + { + "guid": "107", + "name": "Zixaki", + "level": "28", + "race": "9", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_257", + "meeting": "poi_guard_179" + }, + { + "guid": "108", + "name": "Pellianra", + "level": "42", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3134", + "meeting": "poi_guard_22" + }, + { + "guid": "109", + "name": "Rixbin", + "level": "72", + "race": "9", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4363", + "meeting": "poi_guard_179" + }, + { + "guid": "110", + "name": "Elaansa", + "level": "20", + "race": "11", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_228", + "meeting": "poi_guard_22" + }, + { + "guid": "111", + "name": "Graakdra", + "level": "20", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_2230", + "meeting": "poi_guard_179" + }, + { + "guid": "112", + "name": "Aeliriel", + "level": "73", + "race": "4", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_4153", + "meeting": "poi_guard_22" + }, + { + "guid": "113", + "name": "Rokorok", + "level": "42", + "race": "8", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4405_d1", + "meeting": "poi_guard_179" + }, + { + "guid": "115", + "name": "Seraniel", + "level": "29", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_257", + "meeting": "poi_guard_179" + }, + { + "guid": "116", + "name": "Pibelrik", + "level": "51", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4320", + "meeting": "poi_guard_22" + }, + { + "guid": "117", + "name": "Mokrak", + "level": "40", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3133", + "meeting": "poi_guard_179" + }, + { + "guid": "118", + "name": "Lillina", + "level": "76", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_3529", + "meeting": "poi_guard_22" + }, + { + "guid": "119", + "name": "Aethilrin", + "level": "42", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3133", + "meeting": "poi_guard_179" + }, + { + "guid": "120", + "name": "Brynna", + "level": "22", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_101", + "meeting": "poi_guard_22" + }, + { + "guid": "121", + "name": "Braneven", + "level": "85", + "race": "5", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4405", + "meeting": "poi_guard_179" + }, + { + "guid": "122", + "name": "Marnili", + "level": "49", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4364_d1", + "meeting": "poi_guard_22" + }, + { + "guid": "123", + "name": "Vexenza", + "level": "25", + "race": "9", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4364_d1", + "meeting": "poi_guard_179" + }, + { + "guid": "124", + "name": "Marnra", + "level": "19", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3134", + "meeting": "poi_guard_22" + }, + { + "guid": "125", + "name": "Koruhon", + "level": "22", + "race": "6", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_228", + "meeting": "poi_guard_179" + }, + { + "guid": "127", + "name": "Darilwin", + "level": "27", + "race": "22", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_257", + "meeting": "poi_guard_22" + }, + { + "guid": "128", + "name": "Volakmar", + "level": "80", + "race": "8", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_5379", + "meeting": "poi_guard_179" + }, + { + "guid": "129", + "name": "Ishasa", + "level": "30", + "race": "11", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_324", + "meeting": "poi_guard_22" + }, + { + "guid": "130", + "name": "Darlan", + "level": "48", + "race": "5", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_3186", + "meeting": "poi_guard_179" + }, + { + "guid": "131", + "name": "Aelasia", + "level": "39", + "race": "4", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_324", + "meeting": "poi_guard_22" + }, + { + "guid": "132", + "name": "Braneron", + "level": "81", + "race": "5", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "raid", + "initial_target": "instance_visit_at_5670_d2", + "meeting": "poi_guard_179" + }, + { + "guid": "133", + "name": "Velaanna", + "level": "38", + "race": "11", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_228", + "meeting": "poi_guard_22" + }, + { + "guid": "135", + "name": "Ragnhild", + "level": "85", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_7152_d1", + "meeting": "poi_guard_22" + }, + { + "guid": "137", + "name": "Bixini", + "level": "30", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_614", + "meeting": "poi_guard_22" + }, + { + "guid": "138", + "name": "Volali", + "level": "36", + "race": "8", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4469_d1", + "meeting": "poi_guard_179" + }, + { + "guid": "144", + "name": "Wibanwip", + "level": "49", + "race": "7", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4321_d1", + "meeting": "poi_guard_22" + }, + { + "guid": "145", + "name": "Gorgar", + "level": "73", + "race": "2", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4364_d1", + "meeting": "poi_guard_179" + }, + { + "guid": "146", + "name": "Loraria", + "level": "37", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_612", + "meeting": "poi_guard_179" + }, + { + "guid": "147", + "name": "Seraenriel", + "level": "62", + "race": "10", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4150", + "meeting": "poi_guard_179" + }, + { + "guid": "151", + "name": "Velailra", + "level": "19", + "race": "11", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_78", + "meeting": "poi_guard_22" + }, + { + "guid": "153", + "name": "Ragnli", + "level": "61", + "race": "3", + "formation_hour": 14, + "next_hour": 15, + "next_intent": "instance", + "initial_target": "instance_visit_at_4152_d1", + "meeting": "poi_guard_22" + } + ], + "excluded": [ + { + "guid": "33", + "name": "Tinkbin", + "level": "1", + "race": "7" + }, + { + "guid": "34", + "name": "Sylaria", + "level": "1", + "race": "10" + }, + { + "guid": "50", + "name": "Falaniel", + "level": "2", + "race": "10" + }, + { + "guid": "51", + "name": "Tordra", + "level": "9", + "race": "3" + }, + { + "guid": "65", + "name": "Velara", + "level": "10", + "race": "10" + }, + { + "guid": "66", + "name": "Nibbin", + "level": "13", + "race": "7" + }, + { + "guid": "78", + "name": "Marnerna", + "level": "1", + "race": "3" + }, + { + "guid": "79", + "name": "Seraellin", + "level": "10", + "race": "5" + }, + { + "guid": "81", + "name": "Ashara", + "level": "9", + "race": "6" + }, + { + "guid": "90", + "name": "Dorndin", + "level": "5", + "race": "3" + }, + { + "guid": "95", + "name": "Gartha", + "level": "11", + "race": "2" + }, + { + "guid": "105", + "name": "Faelirin", + "level": "12", + "race": "10" + }, + { + "guid": "114", + "name": "Elana", + "level": "7", + "race": "11" + }, + { + "guid": "126", + "name": "Jinrin", + "level": "11", + "race": "8" + }, + { + "guid": "134", + "name": "Renven", + "level": "2", + "race": "5" + }, + { + "guid": "136", + "name": "Maraannora", + "level": "3", + "race": "5" + }, + { + "guid": "152", + "name": "Garurgar", + "level": "10", + "race": "2" + }, + { + "guid": "154", + "name": "Sorasha", + "level": "3", + "race": "11" + } + ] +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-group-test/before.json b/doc/clientless/checkpoints/2026-10-31-group-test/before.json new file mode 100644 index 0000000000..d11681b651 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-group-test/before.json @@ -0,0 +1,19146 @@ +{ + "bots": [ + { + "guid": "26", + "name": "Arthoran", + "level": "60", + "race": "1" + }, + { + "guid": "33", + "name": "Tinkbin", + "level": "1", + "race": "7" + }, + { + "guid": "34", + "name": "Sylaria", + "level": "1", + "race": "10" + }, + { + "guid": "35", + "name": "Karggan", + "level": "85", + "race": "3" + }, + { + "guid": "36", + "name": "Edwin", + "level": "85", + "race": "5" + }, + { + "guid": "39", + "name": "Durnrin", + "level": "16", + "race": "3" + }, + { + "guid": "40", + "name": "Drakagmok", + "level": "33", + "race": "2" + }, + { + "guid": "41", + "name": "Gimmik", + "level": "57", + "race": "7" + }, + { + "guid": "42", + "name": "Zulana", + "level": "69", + "race": "8" + }, + { + "guid": "43", + "name": "Fizzira", + "level": "61", + "race": "7" + }, + { + "guid": "44", + "name": "Yarumak", + "level": "63", + "race": "6" + }, + { + "guid": "45", + "name": "Kargarrin", + "level": "58", + "race": "3" + }, + { + "guid": "46", + "name": "Selthas", + "level": "84", + "race": "10" + }, + { + "guid": "47", + "name": "Nimibin", + "level": "57", + "race": "7" + }, + { + "guid": "48", + "name": "Elaniel", + "level": "35", + "race": "10" + }, + { + "guid": "49", + "name": "Lunna", + "level": "72", + "race": "4" + }, + { + "guid": "50", + "name": "Falaniel", + "level": "2", + "race": "10" + }, + { + "guid": "51", + "name": "Tordra", + "level": "9", + "race": "3" + }, + { + "guid": "52", + "name": "Vexki", + "level": "31", + "race": "9" + }, + { + "guid": "53", + "name": "Noranda", + "level": "81", + "race": "1" + }, + { + "guid": "54", + "name": "Falaeriel", + "level": "81", + "race": "10" + }, + { + "guid": "56", + "name": "Hilddis", + "level": "29", + "race": "3" + }, + { + "guid": "57", + "name": "Torukan", + "level": "52", + "race": "6" + }, + { + "guid": "60", + "name": "Ashani", + "level": "48", + "race": "11" + }, + { + "guid": "61", + "name": "Mirariel", + "level": "48", + "race": "10" + }, + { + "guid": "62", + "name": "Garenden", + "level": "32", + "race": "1" + }, + { + "guid": "63", + "name": "Drakuga", + "level": "49", + "race": "2" + }, + { + "guid": "64", + "name": "Hildda", + "level": "78", + "race": "3" + }, + { + "guid": "65", + "name": "Velara", + "level": "10", + "race": "10" + }, + { + "guid": "66", + "name": "Nibbin", + "level": "13", + "race": "7" + }, + { + "guid": "67", + "name": "Volasha", + "level": "47", + "race": "8" + }, + { + "guid": "68", + "name": "Sylenriel", + "level": "16", + "race": "4" + }, + { + "guid": "69", + "name": "Halilden", + "level": "15", + "race": "5" + }, + { + "guid": "70", + "name": "Renaisia", + "level": "71", + "race": "22" + }, + { + "guid": "71", + "name": "Elaria", + "level": "45", + "race": "10" + }, + { + "guid": "72", + "name": "Sorana", + "level": "55", + "race": "11" + }, + { + "guid": "73", + "name": "Rixzek", + "level": "68", + "race": "9" + }, + { + "guid": "74", + "name": "Nimbin", + "level": "77", + "race": "7" + }, + { + "guid": "75", + "name": "Faeleran", + "level": "24", + "race": "10" + }, + { + "guid": "76", + "name": "Renalin", + "level": "35", + "race": "1" + }, + { + "guid": "77", + "name": "Drakogzug", + "level": "60", + "race": "2" + }, + { + "guid": "78", + "name": "Marnerna", + "level": "1", + "race": "3" + }, + { + "guid": "79", + "name": "Seraellin", + "level": "10", + "race": "5" + }, + { + "guid": "80", + "name": "Noralin", + "level": "21", + "race": "22" + }, + { + "guid": "81", + "name": "Ashara", + "level": "9", + "race": "6" + }, + { + "guid": "82", + "name": "Taliara", + "level": "42", + "race": "22" + }, + { + "guid": "83", + "name": "Mahuwa", + "level": "84", + "race": "6" + }, + { + "guid": "84", + "name": "Brynli", + "level": "70", + "race": "3" + }, + { + "guid": "85", + "name": "Gixni", + "level": "34", + "race": "9" + }, + { + "guid": "86", + "name": "Brindra", + "level": "15", + "race": "3" + }, + { + "guid": "87", + "name": "Moggra", + "level": "47", + "race": "2" + }, + { + "guid": "88", + "name": "Pibwin", + "level": "18", + "race": "7" + }, + { + "guid": "89", + "name": "Tahuima", + "level": "78", + "race": "6" + }, + { + "guid": "90", + "name": "Dorndin", + "level": "5", + "race": "3" + }, + { + "guid": "91", + "name": "Norara", + "level": "68", + "race": "5" + }, + { + "guid": "92", + "name": "Tholgar", + "level": "79", + "race": "3" + }, + { + "guid": "93", + "name": "Gargar", + "level": "78", + "race": "2" + }, + { + "guid": "94", + "name": "Brinunli", + "level": "19", + "race": "3" + }, + { + "guid": "95", + "name": "Gartha", + "level": "11", + "race": "2" + }, + { + "guid": "96", + "name": "Darden", + "level": "82", + "race": "1" + }, + { + "guid": "97", + "name": "Talzul", + "level": "66", + "race": "8" + }, + { + "guid": "98", + "name": "Nimimi", + "level": "15", + "race": "7" + }, + { + "guid": "99", + "name": "Shadra", + "level": "70", + "race": "2" + }, + { + "guid": "100", + "name": "Lunsia", + "level": "26", + "race": "4" + }, + { + "guid": "101", + "name": "Korutam", + "level": "69", + "race": "6" + }, + { + "guid": "102", + "name": "Corren", + "level": "69", + "race": "22" + }, + { + "guid": "103", + "name": "Korgar", + "level": "28", + "race": "2" + }, + { + "guid": "104", + "name": "Lillini", + "level": "75", + "race": "7" + }, + { + "guid": "105", + "name": "Faelirin", + "level": "12", + "race": "10" + }, + { + "guid": "106", + "name": "Nibelin", + "level": "38", + "race": "7" + }, + { + "guid": "107", + "name": "Zixaki", + "level": "28", + "race": "9" + }, + { + "guid": "108", + "name": "Pellianra", + "level": "42", + "race": "7" + }, + { + "guid": "109", + "name": "Rixbin", + "level": "72", + "race": "9" + }, + { + "guid": "110", + "name": "Elaansa", + "level": "20", + "race": "11" + }, + { + "guid": "111", + "name": "Graakdra", + "level": "20", + "race": "2" + }, + { + "guid": "112", + "name": "Aeliriel", + "level": "73", + "race": "4" + }, + { + "guid": "113", + "name": "Rokorok", + "level": "42", + "race": "8" + }, + { + "guid": "114", + "name": "Elana", + "level": "7", + "race": "11" + }, + { + "guid": "115", + "name": "Seraniel", + "level": "29", + "race": "10" + }, + { + "guid": "116", + "name": "Pibelrik", + "level": "51", + "race": "7" + }, + { + "guid": "117", + "name": "Mokrak", + "level": "40", + "race": "2" + }, + { + "guid": "118", + "name": "Lillina", + "level": "76", + "race": "7" + }, + { + "guid": "119", + "name": "Aethilrin", + "level": "42", + "race": "10" + }, + { + "guid": "120", + "name": "Brynna", + "level": "22", + "race": "3" + }, + { + "guid": "121", + "name": "Braneven", + "level": "85", + "race": "5" + }, + { + "guid": "122", + "name": "Marnili", + "level": "49", + "race": "3" + }, + { + "guid": "123", + "name": "Vexenza", + "level": "25", + "race": "9" + }, + { + "guid": "124", + "name": "Marnra", + "level": "19", + "race": "3" + }, + { + "guid": "125", + "name": "Koruhon", + "level": "22", + "race": "6" + }, + { + "guid": "126", + "name": "Jinrin", + "level": "11", + "race": "8" + }, + { + "guid": "127", + "name": "Darilwin", + "level": "27", + "race": "22" + }, + { + "guid": "128", + "name": "Volakmar", + "level": "80", + "race": "8" + }, + { + "guid": "129", + "name": "Ishasa", + "level": "30", + "race": "11" + }, + { + "guid": "130", + "name": "Darlan", + "level": "48", + "race": "5" + }, + { + "guid": "131", + "name": "Aelasia", + "level": "39", + "race": "4" + }, + { + "guid": "132", + "name": "Braneron", + "level": "81", + "race": "5" + }, + { + "guid": "133", + "name": "Velaanna", + "level": "38", + "race": "11" + }, + { + "guid": "134", + "name": "Renven", + "level": "2", + "race": "5" + }, + { + "guid": "135", + "name": "Ragnhild", + "level": "85", + "race": "3" + }, + { + "guid": "136", + "name": "Maraannora", + "level": "3", + "race": "5" + }, + { + "guid": "137", + "name": "Bixini", + "level": "30", + "race": "7" + }, + { + "guid": "138", + "name": "Volali", + "level": "36", + "race": "8" + }, + { + "guid": "144", + "name": "Wibanwip", + "level": "49", + "race": "7" + }, + { + "guid": "145", + "name": "Gorgar", + "level": "73", + "race": "2" + }, + { + "guid": "146", + "name": "Loraria", + "level": "37", + "race": "10" + }, + { + "guid": "147", + "name": "Seraenriel", + "level": "62", + "race": "10" + }, + { + "guid": "151", + "name": "Velailra", + "level": "19", + "race": "11" + }, + { + "guid": "152", + "name": "Garurgar", + "level": "10", + "race": "2" + }, + { + "guid": "153", + "name": "Ragnli", + "level": "61", + "race": "3" + }, + { + "guid": "154", + "name": "Sorasha", + "level": "3", + "race": "11" + } + ], + "plans": [ + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_542" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_guard_542" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_guard_542" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_guard_542" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_guard_557" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_guard_557" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_guard_557" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_guard_548" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_4365" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_guard_558" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_guard_557" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_guard_557" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_542" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_542" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "26", + "local_date": "20261031", + "hour_slot": "23", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_guard_1" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "gilded_rose_sleep_room_test" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "gilded_rose_sleep_room_test" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_guard_115" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_npc_306229" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_guard_55" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_82941" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_npc_311927" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_npc_61975" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_tele_1055" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_tele_1055" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "33", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_guard_355" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_380" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_guard_356" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_npc_326401" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_guard_380" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_1222" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_guard_603" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_tele_1278" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_tele_322" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_npc_286706" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_378" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_407" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_guard_496" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_guard_356" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_guard_371" + }, + { + "character_guid": "34", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_371" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_guard_72" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_guard_72" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_guard_72" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_guard_72" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_npc_82946" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_82946" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_82946" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_tele_270" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_tele_997" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_317772" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_guard_250" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_589" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_4983_d1" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_6196" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_6196" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "35", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_guard_206" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_tele_330" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_324" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_65520" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "5", + "intent": "raid", + "location_key": "instance_visit_at_6664_d0" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "6", + "intent": "raid", + "location_key": "instance_visit_at_6864" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "7", + "intent": "raid", + "location_key": "instance_visit_at_6581_d3" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "8", + "intent": "raid", + "location_key": "instance_visit_at_6581_d3" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_guard_346" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_271993" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_106961" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_tele_642" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_tele_642" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_tele_642" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_326231" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_tele_847" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_tele_847" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_tele_124" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_tele_819" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "36", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_npc_313886" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_307500" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_npc_306497" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "3", + "intent": "leisure", + "location_key": "poi_guard_551" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_guard_551" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_guard_558" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "7", + "intent": "adventure", + "location_key": "poi_tele_1031" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_1031" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_guard_83" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_1193" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_guard_83" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_83" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_83" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_guard_91" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_tele_696" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "16", + "intent": "adventure", + "location_key": "poi_tele_65" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_guard_55" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_tele_1068" + }, + { + "character_guid": "39", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_npc_334777" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_tele_820" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_287122" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_npc_310846" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_npc_310320" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_tele_440" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_tele_440" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_440" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_guard_414" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_598" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_tele_584" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_npc_287004" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_tele_751" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_tele_631" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_tele_631" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_guard_347" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_299174" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_npc_299174" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_tele_1212" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_npc_287005" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_287005" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_guard_519" + }, + { + "character_guid": "40", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_519" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_1468" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_1466" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_294590" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_tele_987" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_npc_307490" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_tele_1104" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_tele_306" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_tele_306" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_1468" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_1466" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_2214" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_359801" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_npc_267380" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_npc_289405" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_316476" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_316476" + }, + { + "character_guid": "41", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_guard_61" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_tele_1263" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_88265" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_npc_296262" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_npc_296262" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_npc_125423" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_tele_390" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_npc_286684" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_npc_71625" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_4152" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_4321" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_tele_1135" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_tele_668" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_88271" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_npc_286760" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "42", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_279448" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_tele_982" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_npc_262180" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "13", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "14", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "15", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_npc_67047" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_67047" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_npc_67047" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_tele_1377" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_tele_829" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_guard_39" + }, + { + "character_guid": "43", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_guard_39" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_npc_88267" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_88267" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_68760" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "8", + "intent": "raid", + "location_key": "instance_visit_at_3529" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "9", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "10", + "intent": "raid", + "location_key": "instance_visit_at_3529" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "11", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_65520" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_446" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_tele_1261" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "16", + "intent": "adventure", + "location_key": "poi_tele_1212" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "17", + "intent": "adventure", + "location_key": "poi_tele_1212" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_tele_1225" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_guard_358" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_tele_299" + }, + { + "character_guid": "44", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_npc_296227" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_tele_408" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_tele_408" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_tele_408" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_tele_408" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_59" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_guard_462" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_guard_65" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_guard_541" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_534" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_guard_534" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_guard_193" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_guard_109" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_tele_280" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_tele_280" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_tele_1321" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_guard_57" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_tele_1193" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_1193" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_300584" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_tele_440" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "45", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_5215_d1" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "2", + "intent": "raid", + "location_key": "instance_visit_at_5670_d2" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "3", + "intent": "raid", + "location_key": "instance_visit_at_5670_d2" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "4", + "intent": "raid", + "location_key": "instance_visit_at_5670_d2" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "6", + "intent": "raid", + "location_key": "instance_visit_at_5379" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "7", + "intent": "raid", + "location_key": "instance_visit_at_5379" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_tele_1162" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_tele_1162" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_67879" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_tele_463" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_tele_463" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_tele_463" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_6485" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_5117" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_5093" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_npc_97654" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "46", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_300050" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_369649" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "8", + "intent": "instance", + "location_key": "instance_visit_at_924" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_924" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_guard_74" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_guard_74" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_guard_74" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_guard_573" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_446" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_446" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_2217" + }, + { + "character_guid": "47", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_2217" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_298845" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_guard_355" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_npc_328015" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_tele_1223" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_1307" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_tele_943" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_guard_346" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_guard_346" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_guard_355" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_370886" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_tele_648" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_guard_379" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_356" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_tele_1312" + }, + { + "character_guid": "48", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_guard_552" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_guard_99" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "2", + "intent": "adventure", + "location_key": "poi_tele_694" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_298845" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_298845" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_guard_111" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_guard_109" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_guard_109" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_125429" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_npc_125429" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "the_gilded_rose" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "12", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "13", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "14", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "15", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_tele_837" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_tele_1031" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_tele_319" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_tele_319" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "49", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_68349" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_guard_354" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_guard_355" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_npc_57638" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_npc_57638" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_tele_685" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_380" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_224" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_224" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_350" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_tele_584" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_326674" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_guard_496" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_guard_591" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_guard_368" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_355" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_57638" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_guard_409" + }, + { + "character_guid": "50", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_npc_57653" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_tele_1055" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_guard_72" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_tele_622" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_1104" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_guard_104" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_104" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_guard_104" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_465" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_1073" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_npc_62917" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_npc_62917" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_npc_62917" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_314493" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_npc_280695" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_npc_82949" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_guard_59" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_guard_199" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_guard_202" + }, + { + "character_guid": "51", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_guard_202" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_guard_179" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_guard_358" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_guard_409" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_450" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_npc_326231" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_npc_326231" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_npc_286597" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "52", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_npc_88273" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_98346" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_5636" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_261241" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_guard_541" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_105659" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_tele_696" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_tele_159" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_552" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "18", + "intent": "raid", + "location_key": "instance_visit_at_5290_d0" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "19", + "intent": "raid", + "location_key": "instance_visit_at_5379" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "20", + "intent": "raid", + "location_key": "instance_visit_at_5670_d3" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_guard_215" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_tele_596" + }, + { + "character_guid": "53", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_npc_68775" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_5010" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_5010" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_5010" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_187" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_187" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_498" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_guard_355" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_guard_516" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_709" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_guard_259" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_guard_259" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_57617" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_57617" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_tele_346" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_tele_1362" + }, + { + "character_guid": "54", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_tele_1362" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_guard_55" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_guard_558" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_guard_558" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_npc_334777" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_334777" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_guard_55" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_guard_81" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_guard_81" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_npc_307616" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_tele_153" + }, + { + "character_guid": "56", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_guard_95" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_guard_319" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_tele_129" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_tele_129" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_npc_57627" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_npc_57627" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_npc_57627" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_924" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_649" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_813" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_npc_328550" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_428" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_179" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_57627" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_tele_187" + }, + { + "character_guid": "57", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_npc_326245" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_npc_82941" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_tele_34" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_262180" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_262180" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_262180" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_tele_847" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_33" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_638" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_564" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_guard_190" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_guard_190" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_guard_210" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_420" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_guard_542" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_542" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_297587" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_tele_1351" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_tele_1351" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_guard_217" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "60", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_3184" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_guard_363" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_guard_363" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "2", + "intent": "leisure", + "location_key": "poi_guard_363" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_2214" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_tele_256" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_256" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_guard_355" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_1466" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_1466" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_3185" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_tele_511" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_tele_511" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_npc_287001" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_353" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_guard_353" + }, + { + "character_guid": "61", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_tele_1212" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_guard_558" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_guard_535" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_548" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_guard_11" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_guard_11" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "5", + "intent": "adventure", + "location_key": "poi_guard_11" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_160" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_guard_17" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_guard_557" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_3134" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_324" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "13", + "intent": "instance", + "location_key": "instance_visit_at_523" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "14", + "intent": "instance", + "location_key": "instance_visit_at_523" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_3" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_guard_558" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_guard_111" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_62870" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_tele_435" + }, + { + "character_guid": "62", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_guard_349" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "2", + "intent": "adventure", + "location_key": "poi_guard_349" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_tele_97" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_326897" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_326897" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_tele_511" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_316" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_guard_498" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_guard_498" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_guard_498" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_370242" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_369903" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_369903" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_tele_1263" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "63", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_2214" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_guard_138" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_guard_161" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_guard_56" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_tele_117" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_tele_117" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_tele_1068" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_tele_1068" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_tele_693" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_tele_693" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_guard_55" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_npc_68349" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_558" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_272" + }, + { + "character_guid": "64", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_272" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_380" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_guard_355" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_tele_1212" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_npc_326398" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_384" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_guard_384" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_guard_356" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_guard_355" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_guard_355" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_tele_399" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_guard_427" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_387" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_372" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_357" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_tele_1324" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_tele_213" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_tele_1338" + }, + { + "character_guid": "65", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_guard_312" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_npc_307487" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_307487" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_tele_1061" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "goldshire_sleep_upstairs" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_200" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_1104" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_tele_403" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_guard_109" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_guard_109" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "66", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_guard_347" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_tele_1475" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_3187" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_885" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_guard_527" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_513" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_guard_513" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_1216" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_guard_518" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_339" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_339" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_2214" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_guard_520" + }, + { + "character_guid": "67", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_520" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_guard_104" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_guard_59" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_guard_59" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_59" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_npc_312188" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_63162" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_guard_111" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_312109" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_npc_316615" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_npc_316615" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_npc_316480" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_312176" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_tele_79" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_guard_93" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_npc_61738" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_guard_109" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_npc_316479" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_npc_316479" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_316479" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_guard_194" + }, + { + "character_guid": "68", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_npc_313878" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_tele_745" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_tele_1011" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "2", + "intent": "leisure", + "location_key": "poi_guard_348" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "3", + "intent": "leisure", + "location_key": "poi_guard_522" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_guard_321" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_tele_540" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_540" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_tele_540" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_tele_494" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_tele_494" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_tele_494" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_tele_494" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_346" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_324" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_guard_350" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_tele_732" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_tele_832" + }, + { + "character_guid": "69", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_tele_832" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_guard_570" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_guard_540" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "2", + "intent": "leisure", + "location_key": "poi_tele_696" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4321_d1" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "stormwind_leisure_trade" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_guard_547" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_guard_8" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_guard_557" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_guard_265" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_guard_23" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_guard_23" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_17" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_guard_548" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "14", + "intent": "instance", + "location_key": "instance_visit_at_4404" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_4364" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_4405_d1" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_267380" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_261" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_npc_311927" + }, + { + "character_guid": "70", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_npc_40516" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_3186" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_3186" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_3186" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_3186" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_tele_1482" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_guard_530" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_tele_187" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_tele_187" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_tele_155" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_298845" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_guard_347" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_guard_347" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_guard_506" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_924" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_tele_945" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_npc_326511" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_356" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_3187" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "71", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_3184" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_2216" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_2214" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_tele_420" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_npc_85615" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "big_anvil" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_guard_194" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_216" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_npc_300229" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_216" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_guard_107" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_guard_117" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_tele_511" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_guard_54" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_guard_54" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_548" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_924" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_194" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_300584" + }, + { + "character_guid": "72", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_guard_352" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_4321" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_guard_595" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_tele_184" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_1276" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_guard_509" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_451" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_317772" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_317772" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_317772" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_103487" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_103487" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_260762" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_68349" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_68349" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "73", + "local_date": "20261031", + "hour_slot": "23", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_tele_1505" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_tele_318" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "2", + "intent": "adventure", + "location_key": "poi_tele_1008" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_tele_1306" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_tele_474" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_guard_66" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_tele_1349" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "8", + "intent": "instance", + "location_key": "instance_visit_at_5093" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "16", + "intent": "adventure", + "location_key": "poi_tele_1103" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "17", + "intent": "adventure", + "location_key": "poi_tele_1103" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_tele_1103" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_100776" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "74", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_548" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_2230" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_2230" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_2230" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_npc_262180" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_355" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_355" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_guard_355" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_guard_403" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_guard_403" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "75", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_tele_869" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "stormwind_rest_bench" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_guard_65" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_guard_65" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_npc_311928" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_3134" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_npc_314478" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_262180" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_328422" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_370013" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_313878" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_313878" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_313878" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_312188" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_tele_696" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_523" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_324" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_101" + }, + { + "character_guid": "76", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_523" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_tele_1275" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_179" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "3", + "intent": "raid", + "location_key": "instance_visit_at_3529" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "4", + "intent": "raid", + "location_key": "instance_visit_at_3529" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "5", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_npc_369879" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_npc_310336" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_npc_328422" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_npc_328422" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_286768" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_npc_286768" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_tele_439" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_tele_439" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_tele_439" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_guard_179" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_294097" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "77", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_guard_68" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_tele_164" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_guard_55" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_npc_312109" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_guard_542" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_guard_449" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_npc_306229" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_npc_306229" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_guard_74" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_guard_74" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_307661" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_npc_305396" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_tele_79" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_tele_79" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_guard_91" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "78", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "3", + "intent": "leisure", + "location_key": "poi_tele_1108" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_tele_10" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_guard_324" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_npc_303484" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_guard_346" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_guard_446" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_guard_380" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_tele_743" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_tele_1263" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_npc_57654" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_57654" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_tele_309" + }, + { + "character_guid": "79", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_tele_605" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_npc_314493" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_307567" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_npc_307567" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_guard_542" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_guard_542" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "the_gilded_rose" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_npc_62870" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_guard_462" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_tele_270" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_tele_270" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "goldshire_sleep_upstairs" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_guard_548" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_271100" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_271100" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "80", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_npc_296248" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_guard_419" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_npc_294097" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "3", + "intent": "leisure", + "location_key": "poi_guard_380" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_guard_526" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_tele_1214" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "6", + "intent": "adventure", + "location_key": "poi_tele_357" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "7", + "intent": "adventure", + "location_key": "poi_guard_436" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_guard_446" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_guard_446" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_1152" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_tele_368" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_tele_773" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_421" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_guard_388" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_guard_379" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_tele_188" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_423" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_guard_429" + }, + { + "character_guid": "81", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_429" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_npc_314504" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_guard_216" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_guard_216" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_guard_216" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_guard_542" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_guard_557" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_guard_557" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_guard_64" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_312155" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_tele_319" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_guard_64" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "stormwind_rest_bench" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "stormwind_rest_bench" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_234" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_tele_1001" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_tele_190" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_457" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "82", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_guard_548" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_5246" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_6612" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_4998_d1" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4998" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_npc_296227" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_npc_302365" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_6620" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_npc_287101" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "13", + "intent": "instance", + "location_key": "instance_visit_at_5246_d1" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "14", + "intent": "instance", + "location_key": "instance_visit_at_6485" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_npc_68634" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_guard_152" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_guard_261" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_guard_379" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "21", + "intent": "raid", + "location_key": "instance_visit_at_5290_d0" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "22", + "intent": "raid", + "location_key": "instance_visit_at_5258_d0" + }, + { + "character_guid": "83", + "local_date": "20261031", + "hour_slot": "23", + "intent": "raid", + "location_key": "instance_visit_at_4319" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_4405_d1" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_4320_d1" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_4467" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_4407_d1" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_4404_d1" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_4469" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "8", + "intent": "instance", + "location_key": "instance_visit_at_4405" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_guard_109" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "13", + "intent": "instance", + "location_key": "instance_visit_at_4364_d1" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "14", + "intent": "instance", + "location_key": "instance_visit_at_4364_d1" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_tele_1239" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_1103" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_448" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_79" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_npc_106237" + }, + { + "character_guid": "84", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_npc_88265" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_326619" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_guard_595" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_300050" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_170" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_3134" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_3134" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_1046" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_npc_260762" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_407" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_1216" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_519" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_npc_300229" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_300229" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "85", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_tele_507" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_306842" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_tele_306" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_56" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_tele_133" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_1073" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_127" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_tele_1183" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_214" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_17" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_1508" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_449" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_449" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_78" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_npc_307495" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_npc_314423" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_npc_311927" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_guard_538" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_guard_64" + }, + { + "character_guid": "86", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_guard_64" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_npc_286933" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_3183" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_3187" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_3189" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_3189" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_1198" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_1198" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_179" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_guard_520" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_guard_520" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_tele_258" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_npc_332783" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_2214" + }, + { + "character_guid": "87", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_guard_383" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_guard_73" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "2", + "intent": "adventure", + "location_key": "poi_guard_73" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_guard_73" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_guard_575" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "6", + "intent": "adventure", + "location_key": "poi_guard_609" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_guard_68" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_tele_934" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_52" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_307567" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_307567" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_guard_69" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_npc_314241" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_guard_66" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_66" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "88", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "0", + "intent": "raid", + "location_key": "instance_visit_at_4153" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_4469_d1" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_110511" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_107673" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_npc_107673" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_guard_272" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_tele_1402" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_tele_869" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_tele_615" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_tele_615" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_161" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_106187" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_npc_88266" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_npc_57659" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_npc_57659" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_326722" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "89", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_4152_d1" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_guard_217" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_tele_507" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "5", + "intent": "adventure", + "location_key": "poi_tele_507" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_639" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_guard_206" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_guard_456" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_guard_456" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_tele_164" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_npc_314307" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_npc_314307" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_tele_465" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_307667" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_306507" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_npc_306842" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_tele_252" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_tele_252" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_548" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_548" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_tele_252" + }, + { + "character_guid": "90", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_tele_252" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_npc_326992" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_tele_745" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_npc_326457" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_npc_286514" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_75088" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "7", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "8", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_332783" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_guard_324" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_370013" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_tele_751" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_773" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_npc_298845" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_guard_355" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_4321" + }, + { + "character_guid": "91", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_4151" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_npc_307643" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_tele_234" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_guard_50" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_npc_15654" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_462" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_98803" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_1104" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_tele_934" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_guard_208" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_270" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_tele_669" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_tele_669" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_npc_88259" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_5010" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_4321_d1" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_4321_d1" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_4469_d1" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_4404_d1" + }, + { + "character_guid": "92", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_5150" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_4320_d1" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_179" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_5010" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4151_d1" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_5246" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_4998" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_4152_d1" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_4150_d1" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_4150_d1" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_4151" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "13", + "intent": "instance", + "location_key": "instance_visit_at_4406_d1" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "14", + "intent": "instance", + "location_key": "instance_visit_at_4983" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_110613" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_guard_530" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_guard_505" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_guard_505" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_npc_286684" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_npc_75089" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "93", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_guard_63" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_306368" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_npc_306368" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_npc_316476" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_npc_316476" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_113" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_guard_82" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_313797" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "94", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_179" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_tele_746" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_tele_1128" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "5", + "intent": "adventure", + "location_key": "poi_tele_1128" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_1275" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_guard_367" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_guard_367" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_guard_353" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_guard_353" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_409" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_tele_1108" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_tele_1108" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_179" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_guard_595" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_595" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_guard_423" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_guard_423" + }, + { + "character_guid": "95", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_guard_381" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_100776" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_103487" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "the_gilded_rose" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_5209_d1" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_5150" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_4998" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_4983_d1" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_5246_d1" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "8", + "intent": "instance", + "location_key": "instance_visit_at_5093_d1" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_tele_931" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_300584" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_115502" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_557" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_5635" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_npc_68760" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "the_gilded_rose" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_557" + }, + { + "character_guid": "96", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "2", + "intent": "leisure", + "location_key": "poi_guard_520" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "3", + "intent": "leisure", + "location_key": "poi_tele_1276" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_tele_336" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "5", + "intent": "adventure", + "location_key": "poi_tele_224" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_guard_179" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_303484" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_npc_71626" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_guard_379" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_tele_841" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "16", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_tele_529" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_tele_529" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_tele_773" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "97", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "big_anvil" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_307500" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_tele_786" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_tele_800" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "5", + "intent": "adventure", + "location_key": "poi_tele_92" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "7", + "intent": "adventure", + "location_key": "poi_tele_1350" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_1350" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_tele_1350" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_tele_270" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_tele_270" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_npc_260545" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_guard_558" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_guard_558" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_312188" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_tele_1103" + }, + { + "character_guid": "98", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_tele_860" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_4983" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4152_d1" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_4983" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_npc_15654" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_npc_310295" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_tele_1278" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_41791" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_tele_1234" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_4321" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "13", + "intent": "instance", + "location_key": "instance_visit_at_4151_d1" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_333518" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_tele_1349" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_67879" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_tele_599" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_458" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_525" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_tele_299" + }, + { + "character_guid": "99", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_367" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_312743" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_312743" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_312188" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_npc_311707" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_guard_111" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_guard_577" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_guard_577" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_548" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_548" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_guard_93" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_guard_111" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_guard_93" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_93" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_366595" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_npc_307570" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_85588" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_63162" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_312188" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_guard_109" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_312743" + }, + { + "character_guid": "100", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_312743" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_4406" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_4363" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_4406" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4406" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_4320" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "8", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "9", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "10", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_1261" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "13", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "14", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_tele_1047" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_tele_1335" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_583" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_328422" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_328422" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_guard_324" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "22", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "101", + "local_date": "20261031", + "hour_slot": "23", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "gilded_rose_sleep_upstairs" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_tele_1349" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "gilded_rose_sleep_room_test" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_npc_314116" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_npc_314116" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_npc_314621" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_npc_280703" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "poi_npc_68760" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_289405" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_289405" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_289405" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_289405" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_guard_109" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "16", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "17", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "18", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_370242" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_125423" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_npc_41723" + }, + { + "character_guid": "102", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_guard_67" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_npc_57634" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_npc_302189" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_npc_310846" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_guard_603" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_333518" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_tele_1236" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_guard_358" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_tele_337" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_tele_312" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_guard_405" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_guard_510" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_510" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_tele_642" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_tele_1313" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_tele_278" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_tele_753" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "103", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_4364_d1" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_4152_d1" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_4405_d1" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4467" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_709" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_88262" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_tele_1068" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_guard_462" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_guard_91" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_guard_91" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_guard_560" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "17", + "intent": "raid", + "location_key": "instance_visit_at_4470" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "18", + "intent": "raid", + "location_key": "instance_visit_at_4153" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_260762" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_npc_260762" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_299015" + }, + { + "character_guid": "104", + "local_date": "20261031", + "hour_slot": "23", + "intent": "adventure", + "location_key": "poi_tele_117" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_guard_356" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_npc_286497" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_guard_379" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_352" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_tele_1241" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_guard_497" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_guard_497" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_guard_356" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_tele_155" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_guard_347" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_npc_326401" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_npc_310332" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_npc_310332" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_npc_310332" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_tele_1005" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "16", + "intent": "adventure", + "location_key": "poi_tele_116" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "17", + "intent": "adventure", + "location_key": "poi_tele_1324" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_guard_504" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_guard_504" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_npc_57617" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_286921" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_npc_286921" + }, + { + "character_guid": "105", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_tele_311" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_614" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_npc_314116" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_guard_84" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_tele_696" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_tele_1073" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_guard_558" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_guard_1" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_1059" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_guard_83" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_632" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_68" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_934" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_npc_350029" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_guard_52" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_guard_52" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_366595" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_271100" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_312743" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_tele_816" + }, + { + "character_guid": "106", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_guard_72" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_guard_504" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_guard_504" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "2", + "intent": "economy", + "location_key": "poi_npc_287005" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "3", + "intent": "leisure", + "location_key": "poi_tele_182" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_guard_603" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_1125" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_112" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_tele_112" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_326861" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_npc_302388" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_tele_421" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_tele_312" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_tele_312" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_tele_869" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_tele_869" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_310902" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_tele_278" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_npc_332788" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "107", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_guard_217" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_guard_265" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "2", + "intent": "adventure", + "location_key": "poi_guard_69" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_guard_549" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_npc_298285" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_696" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_164" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_guard_109" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "14", + "intent": "instance", + "location_key": "instance_visit_at_3134" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_npc_306368" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_npc_307616" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "108", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4364_d1" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_4363" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_4363" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_guard_380" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_guard_380" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_npc_286980" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_npc_286980" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_npc_88269" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_npc_125429" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_tele_391" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_npc_125426" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_tele_1276" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_tele_1276" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_182" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_262" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_npc_310337" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_npc_68349" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_68349" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_npc_326845" + }, + { + "character_guid": "109", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_npc_105993" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_guard_199" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_78" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_101" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_312743" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_guard_216" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_216" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_332783" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_62917" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_tele_714" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_85597" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_guard_218" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_guard_194" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_guard_62" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_194" + }, + { + "character_guid": "110", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_194" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_57627" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_npc_57627" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_npc_57627" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_tele_333" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_333" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_guard_530" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_286991" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_2230" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_179" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "111", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "0", + "intent": "raid", + "location_key": "instance_visit_at_4153" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "1", + "intent": "raid", + "location_key": "instance_visit_at_4535" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_4321" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_4321" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_4364_d1" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_5117" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_npc_311850" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_819" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_819" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_333027" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_guard_93" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_guard_93" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_guard_93" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_tele_1020" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_558" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_npc_88259" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_guard_59" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_tele_974" + }, + { + "character_guid": "112", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_tele_974" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_tele_820" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_npc_302189" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_157" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_tele_157" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_tele_157" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_npc_57638" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_326619" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "16", + "intent": "adventure", + "location_key": "poi_tele_1164" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "17", + "intent": "adventure", + "location_key": "poi_tele_925" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_tele_146" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_tele_146" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_332148" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "113", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_npc_85595" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_311314" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_guard_67" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_npc_306507" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_206" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_tele_638" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_tele_638" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_tele_638" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_guard_216" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_guard_194" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "the_gilded_rose" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "the_gilded_rose" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_guard_194" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_guard_194" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_tele_169" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_62917" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_npc_307490" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_npc_62999" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_311922" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "114", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_tele_346" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_guard_356" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_guard_383" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_guard_383" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_npc_286890" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_guard_380" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_271100" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_271100" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_guard_355" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_433" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_tele_1141" + }, + { + "character_guid": "115", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_tele_1141" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "2", + "intent": "leisure", + "location_key": "poi_guard_192" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_tele_696" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_65" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_369856" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_369856" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_guard_56" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_guard_55" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_tele_465" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_tele_277" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_npc_307758" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_306497" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_111" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_369649" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_350029" + }, + { + "character_guid": "116", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_350029" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_guard_509" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_guard_526" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_57790" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_npc_57790" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_npc_57790" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_1125" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_567" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_1005" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_1005" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_603" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_guard_459" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_tele_869" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_npc_56982" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_npc_294059" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_npc_286497" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_tele_190" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "117", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_5010" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_4406" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_4406" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_4406" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_74143" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_npc_68775" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_npc_68775" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_guard_577" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_guard_549" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_guard_549" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "14", + "intent": "raid", + "location_key": "instance_visit_at_3528" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "15", + "intent": "raid", + "location_key": "instance_visit_at_4319" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "16", + "intent": "raid", + "location_key": "instance_visit_at_4153" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "17", + "intent": "raid", + "location_key": "instance_visit_at_4153" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "18", + "intent": "raid", + "location_key": "instance_visit_at_3529" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "19", + "intent": "raid", + "location_key": "instance_visit_at_3529" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_300584" + }, + { + "character_guid": "118", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_tele_164" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_326722" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "4", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_442" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_tele_39" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_387" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_188" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_188" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "11", + "intent": "leisure", + "location_key": "poi_tele_188" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_npc_70730" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_guard_379" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_guard_356" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_3134" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_244" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_3133" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_guard_375" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_495" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_357" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_guard_365" + }, + { + "character_guid": "119", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_365" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_101" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_145" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_145" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_tele_164" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_tele_164" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_1358" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_tele_1358" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_71" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_tele_1104" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_1104" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_guard_61" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_93" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_101" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_101" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "120", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_tele_890" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_68349" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_300050" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_300050" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_npc_68760" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_guard_410" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_tele_1362" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_tele_753" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_npc_262180" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_380996" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_tele_1518" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_tele_1102" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_guard_251" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_guard_365" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_326897" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_tele_1313" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_tele_1525" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_tele_150" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_298285" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "121", + "local_date": "20261031", + "hour_slot": "23", + "intent": "raid", + "location_key": "instance_visit_at_7155_d2" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_guard_215" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_306507" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_guard_462" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_guard_462" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "big_anvil" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_tele_821" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_tele_821" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_tele_821" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_guard_70" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_guard_549" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_npc_307567" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_289405" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_guard_548" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_npc_369649" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_557" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "22", + "intent": "leisure", + "location_key": "poi_guard_55" + }, + { + "character_guid": "122", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_78" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_npc_286670" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_286670" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_guard_318" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_guard_381" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "poi_guard_508" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_875" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "13", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "14", + "intent": "profession", + "location_key": "poi_guard_347" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_tele_1312" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_tele_869" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "17", + "intent": "profession", + "location_key": "poi_tele_869" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "18", + "intent": "profession", + "location_key": "poi_tele_869" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "19", + "intent": "profession", + "location_key": "poi_npc_317687" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_599" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_guard_595" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_guard_595" + }, + { + "character_guid": "123", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_guard_595" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_guard_68" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_guard_555" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "2", + "intent": "adventure", + "location_key": "poi_guard_555" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_tele_632" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_tele_1297" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_npc_311927" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_311927" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_npc_307486" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_tele_306" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_1409" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_tele_30" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_tele_993" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_npc_312743" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_334777" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "lakeshire_tavern" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "124", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_356" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_npc_326992" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_npc_326992" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_370875" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_370875" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "8", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_guard_379" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_guard_379" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_npc_302189" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_267380" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_267380" + }, + { + "character_guid": "125", + "local_date": "20261031", + "hour_slot": "23", + "intent": "leisure", + "location_key": "poi_guard_434" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_npc_286708" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_303484" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_355" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_355" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_guard_403" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_tele_815" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_57617" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_guard_592" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_458" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_guard_418" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_286703" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_npc_310295" + }, + { + "character_guid": "126", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_guard_506" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "0", + "intent": "profession", + "location_key": "poi_npc_313886" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "1", + "intent": "profession", + "location_key": "poi_npc_312155" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "2", + "intent": "profession", + "location_key": "poi_npc_84582" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_npc_84582" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_npc_85595" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_85595" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_307604" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_npc_307604" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_tele_696" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_guard_548" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_45" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "the_gilded_rose" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_614" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_257" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_tele_1024" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "19", + "intent": "groupformation", + "location_key": "poi_guard_93" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "20", + "intent": "profession", + "location_key": "poi_tele_270" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_tele_270" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_npc_313797" + }, + { + "character_guid": "127", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_npc_313797" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_4983_d1" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_tele_1279" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "2", + "intent": "leisure", + "location_key": "poi_tele_1279" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_guard_451" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_guard_451" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_guard_451" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "10", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "11", + "intent": "raid", + "location_key": "instance_visit_at_5379" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_521" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_521" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_73" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_guard_179" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_5093_d1" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_5093_d1" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_guard_509" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_guard_239" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_guard_595" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_595" + }, + { + "character_guid": "128", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_guard_216" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_tele_660" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "2", + "intent": "leisure", + "location_key": "poi_tele_693" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_tele_420" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_guard_216" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_npc_61975" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_tele_306" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_300229" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_82941" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_npc_82941" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_82941" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_324" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "16", + "intent": "instance", + "location_key": "instance_visit_at_324" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_639" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_tele_639" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_tele_639" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_91" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_194" + }, + { + "character_guid": "129", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_332783" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_guard_321" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "1", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_333027" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_333027" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_333027" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_333027" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "6", + "intent": "adventure", + "location_key": "poi_guard_338" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "7", + "intent": "adventure", + "location_key": "poi_guard_338" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_172" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_tele_172" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_guard_356" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_271100" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_271100" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_326511" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_326511" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_tele_185" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_tele_1503" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_tele_1503" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_tele_1503" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_tele_1503" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_3186" + }, + { + "character_guid": "130", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_3186" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_614" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_610" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "2", + "intent": "instance", + "location_key": "instance_visit_at_3134" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "3", + "intent": "instance", + "location_key": "instance_visit_at_324" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_guard_109" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_332788" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "big_anvil" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "big_anvil" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_tele_1476" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_tele_860" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_npc_62916" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "11", + "intent": "groupformation", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "12", + "intent": "profession", + "location_key": "poi_guard_575" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "13", + "intent": "profession", + "location_key": "poi_tele_316" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_guard_556" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_guard_109" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_guard_109" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_npc_62870" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_guard_542" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_288275" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_tele_847" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_guard_93" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "131", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_63162" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "0", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "1", + "intent": "instance", + "location_key": "instance_visit_at_6108" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_302365" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_tele_1349" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_4983" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "8", + "intent": "instance", + "location_key": "instance_visit_at_6612" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_6612" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_6612" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_4998" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_guard_322" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_322" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_201" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_tele_646" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_5150_d1" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_5150_d1" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_5150_d1" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_5093_d1" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_6196" + }, + { + "character_guid": "132", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_4998_d1" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_tele_227" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_tele_270" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "3", + "intent": "profession", + "location_key": "poi_guard_575" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "4", + "intent": "profession", + "location_key": "poi_guard_215" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_guard_215" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_639" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_npc_312188" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_82949" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_312155" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_guard_191" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_216" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_npc_368537" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_guard_548" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "stormwind_brewfest" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_tele_164" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_guard_194" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_guard_1" + }, + { + "character_guid": "133", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_npc_311636" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "0", + "intent": "economy", + "location_key": "poi_tele_584" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "1", + "intent": "economy", + "location_key": "poi_tele_129" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "2", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_guard_419" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "6", + "intent": "adventure", + "location_key": "poi_guard_349" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "7", + "intent": "adventure", + "location_key": "poi_tele_10" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_guard_522" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "9", + "intent": "rest", + "location_key": "poi_guard_346" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_guard_346" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_63362" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "15", + "intent": "social", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_guard_356" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_guard_324" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_508" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "20", + "intent": "social", + "location_key": "poi_guard_324" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "21", + "intent": "profession", + "location_key": "poi_npc_375512" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_npc_326679" + }, + { + "character_guid": "134", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "0", + "intent": "adventure", + "location_key": "poi_tele_987" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "1", + "intent": "adventure", + "location_key": "poi_tele_507" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "2", + "intent": "adventure", + "location_key": "poi_guard_257" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "3", + "intent": "adventure", + "location_key": "poi_tele_1093" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_tele_1419" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "5", + "intent": "adventure", + "location_key": "poi_tele_1419" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "6", + "intent": "adventure", + "location_key": "poi_tele_1419" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "7", + "intent": "adventure", + "location_key": "poi_tele_1526" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_153" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_102323" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_300584" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_tele_164" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "poi_npc_107673" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "poi_npc_313808" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "ironforge_brewfest" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "16", + "intent": "profession", + "location_key": "poi_npc_105659" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "17", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_7152_d1" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_5636" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_6485" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "21", + "intent": "groupformation", + "location_key": "poi_npc_314039" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_tele_421" + }, + { + "character_guid": "135", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_tele_299" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_tele_299" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "6", + "intent": "leisure", + "location_key": "poi_tele_299" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "7", + "intent": "leisure", + "location_key": "poi_tele_299" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_guard_339" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_431" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "10", + "intent": "rest", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "11", + "intent": "rest", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_326726" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_guard_324" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_guard_324" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "15", + "intent": "rest", + "location_key": "poi_guard_324" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_guard_595" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_guard_346" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_tele_1263" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_324" + }, + { + "character_guid": "136", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_324" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_tele_1436" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_guard_55" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_tele_182" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_guard_105" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "7", + "intent": "instance", + "location_key": "instance_visit_at_614" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "8", + "intent": "instance", + "location_key": "instance_visit_at_614" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_tele_696" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_tele_696" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_tele_696" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_275002" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "15", + "intent": "adventure", + "location_key": "poi_guard_477" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "16", + "intent": "adventure", + "location_key": "poi_guard_192" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "17", + "intent": "adventure", + "location_key": "poi_tele_1225" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "18", + "intent": "adventure", + "location_key": "poi_tele_1225" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "19", + "intent": "adventure", + "location_key": "poi_tele_1482" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "20", + "intent": "adventure", + "location_key": "poi_guard_534" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "21", + "intent": "adventure", + "location_key": "poi_tele_1230" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "22", + "intent": "adventure", + "location_key": "poi_tele_1230" + }, + { + "character_guid": "137", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_tele_753" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_npc_286760" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_npc_302322" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_guard_324" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_guard_352" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_guard_352" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "8", + "intent": "profession", + "location_key": "poi_guard_352" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_tele_1227" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_tele_788" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_tele_788" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "12", + "intent": "adventure", + "location_key": "poi_guard_512" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_guard_429" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_751" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "15", + "intent": "leisure", + "location_key": "poi_tele_751" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_tele_751" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_tele_751" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "18", + "intent": "leisure", + "location_key": "poi_guard_305" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_tele_849" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_405" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "21", + "intent": "leisure", + "location_key": "poi_guard_409" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_287214" + }, + { + "character_guid": "138", + "local_date": "20261031", + "hour_slot": "23", + "intent": "rest", + "location_key": "poi_guard_595" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "0", + "intent": "groupformation", + "location_key": "poi_guard_558" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_63162" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_63162" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_370013" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "5", + "intent": "rest", + "location_key": "poi_npc_370013" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_tele_847" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_270" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "9", + "intent": "adventure", + "location_key": "poi_guard_550" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "10", + "intent": "adventure", + "location_key": "poi_guard_550" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "11", + "intent": "adventure", + "location_key": "poi_guard_550" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "12", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "13", + "intent": "social", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "14", + "intent": "social", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_313878" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "16", + "intent": "economy", + "location_key": "poi_npc_313878" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "17", + "intent": "economy", + "location_key": "poi_npc_328550" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_guard_55" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_guard_55" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "22", + "intent": "profession", + "location_key": "poi_tele_1313" + }, + { + "character_guid": "144", + "local_date": "20261031", + "hour_slot": "23", + "intent": "profession", + "location_key": "poi_guard_462" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_179" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_98071" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_98071" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_98071" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "4", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "5", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "6", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "7", + "intent": "raid", + "location_key": "instance_visit_at_4153" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "8", + "intent": "leisure", + "location_key": "poi_tele_235" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "9", + "intent": "leisure", + "location_key": "poi_tele_235" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "10", + "intent": "leisure", + "location_key": "poi_tele_235" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_npc_88256" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "12", + "intent": "economy", + "location_key": "poi_npc_88256" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_88256" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "15", + "intent": "instance", + "location_key": "instance_visit_at_4364_d1" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_npc_286595" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_4468" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "20", + "intent": "instance", + "location_key": "instance_visit_at_4364_d1" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_guard_179" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "145", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_303484" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "0", + "intent": "leisure", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "1", + "intent": "leisure", + "location_key": "poi_guard_390" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "4", + "intent": "leisure", + "location_key": "poi_tele_938" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "5", + "intent": "leisure", + "location_key": "poi_tele_938" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "6", + "intent": "rest", + "location_key": "poi_npc_297587" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "7", + "intent": "rest", + "location_key": "poi_npc_297587" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "8", + "intent": "rest", + "location_key": "poi_npc_297587" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "poi_npc_57614" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_612" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_610" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_1102" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "13", + "intent": "economy", + "location_key": "poi_npc_300050" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "14", + "intent": "groupformation", + "location_key": "poi_guard_380" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "15", + "intent": "profession", + "location_key": "poi_tele_1223" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "16", + "intent": "rest", + "location_key": "poi_guard_383" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "17", + "intent": "rest", + "location_key": "poi_guard_383" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "18", + "intent": "rest", + "location_key": "poi_guard_383" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "19", + "intent": "rest", + "location_key": "poi_guard_383" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_npc_333027" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "146", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "0", + "intent": "raid", + "location_key": "" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_guard_380" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_294701" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_326619" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_guard_355" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "5", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "6", + "intent": "instance", + "location_key": "instance_visit_at_4152" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "7", + "intent": "economy", + "location_key": "poi_guard_403" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_guard_403" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "9", + "intent": "profession", + "location_key": "poi_npc_40517" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "10", + "intent": "profession", + "location_key": "poi_npc_40517" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "11", + "intent": "profession", + "location_key": "poi_npc_326861" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_346" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_tele_992" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "14", + "intent": "economy", + "location_key": "poi_npc_57681" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_57681" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "16", + "intent": "groupformation", + "location_key": "poi_guard_356" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "17", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "18", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "19", + "intent": "instance", + "location_key": "instance_visit_at_4150" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_npc_296156" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "21", + "intent": "social", + "location_key": "poi_guard_356" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "22", + "intent": "social", + "location_key": "poi_npc_368537" + }, + { + "character_guid": "147", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_guard_383" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "stormwind_brewfest" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "stormwind_brewfest" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "goldshire_tavern" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "3", + "intent": "rest", + "location_key": "poi_npc_314313" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "4", + "intent": "groupformation", + "location_key": "poi_guard_194" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "5", + "intent": "profession", + "location_key": "poi_npc_67161" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "6", + "intent": "profession", + "location_key": "poi_npc_307490" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "7", + "intent": "profession", + "location_key": "poi_guard_575" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "8", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "9", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "10", + "intent": "instance", + "location_key": "instance_visit_at_145" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "11", + "intent": "instance", + "location_key": "instance_visit_at_78" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "12", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "13", + "intent": "instance", + "location_key": "instance_visit_at_78" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "14", + "intent": "instance", + "location_key": "instance_visit_at_145" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "15", + "intent": "economy", + "location_key": "poi_npc_62917" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "16", + "intent": "leisure", + "location_key": "poi_guard_216" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "17", + "intent": "leisure", + "location_key": "poi_guard_201" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "18", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_guard_111" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "20", + "intent": "groupformation", + "location_key": "poi_guard_542" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "21", + "intent": "instance", + "location_key": "instance_visit_at_228" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "22", + "intent": "instance", + "location_key": "instance_visit_at_78" + }, + { + "character_guid": "151", + "local_date": "20261031", + "hour_slot": "23", + "intent": "instance", + "location_key": "instance_visit_at_145" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_guard_419" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_guard_508" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "3", + "intent": "economy", + "location_key": "poi_npc_370886" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "4", + "intent": "economy", + "location_key": "poi_npc_286703" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "5", + "intent": "economy", + "location_key": "poi_tele_703" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "6", + "intent": "economy", + "location_key": "poi_tele_703" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "7", + "intent": "groupformation", + "location_key": "poi_guard_595" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "8", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "9", + "intent": "social", + "location_key": "poi_guard_355" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_310323" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_55372" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "12", + "intent": "rest", + "location_key": "poi_npc_326619" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "13", + "intent": "rest", + "location_key": "poi_guard_595" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "14", + "intent": "rest", + "location_key": "poi_npc_281946" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_npc_287033" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_guard_403" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_npc_286903" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "19", + "intent": "economy", + "location_key": "poi_tele_1440" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "20", + "intent": "economy", + "location_key": "poi_guard_304" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_286684" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "22", + "intent": "groupformation", + "location_key": "poi_npc_286763" + }, + { + "character_guid": "152", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "poi_npc_303746" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "0", + "intent": "rest", + "location_key": "poi_npc_279448" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "1", + "intent": "rest", + "location_key": "poi_npc_69856" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "2", + "intent": "rest", + "location_key": "poi_npc_306360" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "3", + "intent": "groupformation", + "location_key": "poi_npc_307710" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "4", + "intent": "adventure", + "location_key": "poi_tele_179" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "5", + "intent": "adventure", + "location_key": "poi_tele_179" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "6", + "intent": "adventure", + "location_key": "poi_tele_300" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "7", + "intent": "adventure", + "location_key": "poi_guard_576" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "8", + "intent": "adventure", + "location_key": "poi_tele_1380" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "9", + "intent": "groupformation", + "location_key": "stonefire_tavern" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "10", + "intent": "social", + "location_key": "poi_npc_301269" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "11", + "intent": "social", + "location_key": "poi_npc_365340" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "12", + "intent": "groupformation", + "location_key": "poi_guard_55" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "13", + "intent": "adventure", + "location_key": "poi_guard_75" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "14", + "intent": "adventure", + "location_key": "poi_guard_75" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_tele_1221" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_tele_1312" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_npc_266922" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "18", + "intent": "social", + "location_key": "poi_npc_367660" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "19", + "intent": "social", + "location_key": "poi_npc_367660" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "20", + "intent": "rest", + "location_key": "poi_npc_332783" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "21", + "intent": "rest", + "location_key": "poi_npc_332783" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "22", + "intent": "rest", + "location_key": "poi_npc_332783" + }, + { + "character_guid": "153", + "local_date": "20261031", + "hour_slot": "23", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "0", + "intent": "social", + "location_key": "poi_guard_109" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "1", + "intent": "social", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "2", + "intent": "social", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "3", + "intent": "social", + "location_key": "poi_npc_82948" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "4", + "intent": "rest", + "location_key": "poi_npc_314470" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "5", + "intent": "groupformation", + "location_key": "poi_npc_82940" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "6", + "intent": "social", + "location_key": "poi_npc_280710" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "7", + "intent": "social", + "location_key": "kharanos_tavern" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "8", + "intent": "economy", + "location_key": "poi_tele_70" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "9", + "intent": "economy", + "location_key": "poi_tele_70" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "10", + "intent": "economy", + "location_key": "poi_guard_216" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "11", + "intent": "economy", + "location_key": "poi_guard_216" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "12", + "intent": "leisure", + "location_key": "poi_tele_638" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "13", + "intent": "leisure", + "location_key": "poi_tele_767" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "14", + "intent": "leisure", + "location_key": "poi_tele_1235" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "15", + "intent": "groupformation", + "location_key": "poi_guard_194" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "16", + "intent": "social", + "location_key": "poi_tele_420" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "17", + "intent": "social", + "location_key": "poi_guard_111" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "18", + "intent": "economy", + "location_key": "poi_npc_84408" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "19", + "intent": "leisure", + "location_key": "poi_guard_111" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "20", + "intent": "leisure", + "location_key": "poi_guard_111" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "21", + "intent": "economy", + "location_key": "poi_npc_125648" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "22", + "intent": "economy", + "location_key": "poi_npc_125648" + }, + { + "character_guid": "154", + "local_date": "20261031", + "hour_slot": "23", + "intent": "economy", + "location_key": "poi_guard_196" + } + ] +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-group-test/plan-counts.json b/doc/clientless/checkpoints/2026-10-31-group-test/plan-counts.json new file mode 100644 index 0000000000..a0130b4cc7 --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-group-test/plan-counts.json @@ -0,0 +1,82 @@ +[ + { + "hour_slot": "14", + "intent": "adventure", + "bots": "2" + }, + { + "hour_slot": "14", + "intent": "economy", + "bots": "3" + }, + { + "hour_slot": "14", + "intent": "groupformation", + "bots": "94" + }, + { + "hour_slot": "14", + "intent": "leisure", + "bots": "1" + }, + { + "hour_slot": "14", + "intent": "profession", + "bots": "3" + }, + { + "hour_slot": "14", + "intent": "rest", + "bots": "4" + }, + { + "hour_slot": "14", + "intent": "social", + "bots": "3" + }, + { + "hour_slot": "15", + "intent": "adventure", + "bots": "2" + }, + { + "hour_slot": "15", + "intent": "economy", + "bots": "4" + }, + { + "hour_slot": "15", + "intent": "groupformation", + "bots": "2" + }, + { + "hour_slot": "15", + "intent": "instance", + "bots": "74" + }, + { + "hour_slot": "15", + "intent": "leisure", + "bots": "2" + }, + { + "hour_slot": "15", + "intent": "profession", + "bots": "4" + }, + { + "hour_slot": "15", + "intent": "raid", + "bots": "18" + }, + { + "hour_slot": "15", + "intent": "rest", + "bots": "2" + }, + { + "hour_slot": "15", + "intent": "social", + "bots": "2" + } +] \ No newline at end of file diff --git a/doc/clientless/checkpoints/2026-10-31-group-test/startup-check.log b/doc/clientless/checkpoints/2026-10-31-group-test/startup-check.log new file mode 100644 index 0000000000..c5cfe8ef6f --- /dev/null +++ b/doc/clientless/checkpoints/2026-10-31-group-test/startup-check.log @@ -0,0 +1,114 @@ +[AdventureBot] ignoring travel edge id=1822 from='dreadmaul' to='blastedlands_cr +ossroad0': node missing +[AdventureBot] ignoring travel edge id=1823 from='swamp_of_s_crossroad0' to='dre +admaul': node missing +[AdventureBot] ignoring travel edge id=1865 from='azurwatch' to='exodar_gate': n +ode missing +[AdventureBot] ignoring travel edge id=1866 from='ammen_valley' to='azurwatch': +node missing +[AdventureBot] ignoring travel edge id=1869 from='taxi_624' to='azurwatch': node + missing +[AdventureBot] loaded travel graph: 1098 node(s), 1938 directed edge(s). +CPC_ROUTE target='taxi_625' totalMs=1350.477 navMs=31.515 probes=241 cacheHits=3 +25 cacheSize=43 startMs=19.719 startCalls=29 flightMs=0.000 flightCalls=0 +[AdventureBot] travel-location-planned guid=34 name='Sylaria' location='poi_tele +_322' anchor='taxi_625' steps=4 directRadius=300.0 anchorRadius=1000.0 +[AdventureBot] travel-route-step guid=34 name='Sylaria' step=1/4 node='taxi_23' +edgeType='start' +Registered clientless session for character GUID 63 (account 10), state=Loading. +Created clientless player session for character GUID 63 (account 10). +ClientlessPlayerMgr started character GUID 63 (account 10). +BOT_LOADER_LOGIN guid=63 pool=3 +Clientless player character GUID 63 (account 10) reached state=Online. +[AdventureBot][Profile] loaded guid=63 name='Drakuga' source='generated:63' home +='durotar' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate=2.00 p +ersonality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=63 primary=2 +ClientlessLua[63]: adventure profile controller ready for Drakuga +ClientlessLua[63]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=63 intent='social' location='poi_npc_287033' area=0 +[AdventureBot] travel-location-planned guid=63 name='Drakuga' location='poi_npc_ +287033' anchor='portal_at_2530_target' steps=1 directRadius=300.0 anchorRadius=1 +000.0 +clientless adventure plan 26 +TC>clientless population status +TC>Registered clientless session for character GUID 33 (account 7), state=Loadin +g. +Created clientless player session for character GUID 33 (account 7). +ClientlessPlayerMgr started character GUID 33 (account 7). +BOT_LOADER_LOGIN guid=33 pool=0 +00:00-01:00 social poi_npc_314470 +01:00-02:00 social poi_npc_280710 +02:00-03:00 social poi_guard_542 +03:00-04:00 social poi_guard_542 +04:00-05:00 social poi_guard_542 +05:00-06:00 social poi_guard_542 +06:00-07:00 social poi_guard_557 +07:00-08:00 social poi_guard_557 +08:00-09:00 social poi_guard_557 +09:00-10:00 groupformation poi_guard_548 +10:00-11:00 instance instance_visit_at_4365 +11:00-12:00 groupformation poi_guard_558 +12:00-13:00 social poi_npc_314313 +13:00-14:00 social poi_npc_332148 +14:00-15:00 groupformation poi_npc_314039 +15:00-16:00 raid instance_visit_at_3529 +16:00-17:00 social poi_guard_557 +17:00-18:00 leisure poi_guard_542 +18:00-19:00 leisure poi_guard_542 +19:00-20:00 groupformation poi_npc_314039 +20:00-21:00 social goldshire_tavern +21:00-22:00 social goldshire_tavern +22:00-23:00 groupformation poi_npc_314313 +23:00-24:00 raid instance_visit_at_3528 +TC> Adventure loader enabled=1 schema=1 busy=0 pools=50/5/50/5 known=110 rotatio +ns=0 manager=4 error='' +pool=0 faction=alliance persistent=1 target=50 online=1 pending=1 saved=50 +pool=1 faction=alliance persistent=0 target=5 online=1 pending=0 saved=5 +pool=2 faction=horde persistent=1 target=50 online=1 pending=0 saved=50 +pool=3 faction=horde persistent=0 target=5 online=1 pending=0 saved=5 +TC> Loading saved respawn time of 1790175804 for spawnid (0,323981) - spawn does + not exist, ignoring +Loading saved respawn time of 1790090644 for spawnid (0,396680) - spawn does not + exist, ignoring +Loading saved respawn time of 1790019808 for spawnid (0,396681) - spawn does not + exist, ignoring +Loading saved respawn time of 1790019853 for spawnid (0,396682) - spawn does not + exist, ignoring +Initialized transport GameObject grids: map=0 instance=0 grids=4 candidates=15 +Clientless player character GUID 33 (account 7) reached state=Online. +[AdventureBot][Profile] loaded guid=33 name='Tinkbin' source='generated:33' home +='dun_morogh' canGroundMount=0 mounts=0 mountMinDistance=60.0 mountSpeedRate=1.6 +0 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=33 primary=2 +ClientlessLua[33]: adventure profile controller ready for Tinkbin +ClientlessLua[33]: executed generic adventure script '/home/wow_admin/wow_cata_s +erver/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic. +lua'. +INTENT_TRAVEL guid=33 intent='groupformation' location='poi_guard_55' area=0 +CPC_ROUTE target='ironforge_gate' totalMs=1321.458 navMs=0.000 probes=0 cacheHit +s=0 cacheSize=43 startMs=1.815 startCalls=4 flightMs=0.000 flightCalls=0 +INTENT_FALLBACK guid=33 from='poi_guard_55' to='poi_npc_307710' tried=1 retryMs= +2767 +Registered clientless session for character GUID 144 (account 7), state=Loading. +Created clientless player session for character GUID 144 (account 7). +ClientlessPlayerMgr started character GUID 144 (account 7). +BOT_LOADER_LOGIN guid=144 pool=1 +Clientless player character GUID 144 (account 7) reached state=Online. +[AdventureBot][Profile] loaded guid=144 name='Wibanwip' source='generated:144' h +ome='dun_morogh' canGroundMount=1 mounts=3 mountMinDistance=60.0 mountSpeedRate= +2.00 personality=10 regionAffinity=1 activityAffinity=8 +PROFILE_PROFESSIONS guid=144 primary=2 +ClientlessLua[144]: adventure profile controller ready for Wibanwip +ClientlessLua[144]: executed generic adventure script '/home/wow_admin/wow_cata_ +server/source/TrinityCore/src/server/scripts/Custom/clientless/adventure/generic +.lua'. +INTENT_TRAVEL guid=144 intent='social' location='stonefire_tavern' area=0 +CPC_ROUTE target='ironforge_gate' totalMs=318.152 navMs=0.043 probes=6 cacheHits +=0 cacheSize=45 startMs=3.904 startCalls=4 flightMs=0.000 flightCalls=0 +[AdventureBot] travel-location-planned guid=144 name='Wibanwip' location='stonef +ire_tavern' anchor='ironforge_gate' steps=1 directRadius=300.0 anchorRadius=1000 +.0 + diff --git a/doc/clientless/checkpoints/hillsbrad/azurelode-fixtures.json b/doc/clientless/checkpoints/hillsbrad/azurelode-fixtures.json new file mode 100644 index 0000000000..4310363565 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/azurelode-fixtures.json @@ -0,0 +1,1316 @@ +{ + "bears": [ + { + "guid": "323245", + "id": "47204", + "map": "0", + "position_x": "-1046.35", + "position_y": "76.3447", + "position_z": "52.1014" + }, + { + "guid": "323254", + "id": "47204", + "map": "0", + "position_x": "-1052.32", + "position_y": "87.2363", + "position_z": "55.3149" + }, + { + "guid": "323390", + "id": "47204", + "map": "0", + "position_x": "-1042.74", + "position_y": "172.78", + "position_z": "65.4724" + }, + { + "guid": "323401", + "id": "47204", + "map": "0", + "position_x": "-1015.09", + "position_y": "113.433", + "position_z": "53.7973" + }, + { + "guid": "323412", + "id": "47204", + "map": "0", + "position_x": "-981.972", + "position_y": "79.7985", + "position_z": "52.3574" + }, + { + "guid": "323422", + "id": "47204", + "map": "0", + "position_x": "-880.462", + "position_y": "79.4454", + "position_z": "36.0741" + }, + { + "guid": "323431", + "id": "47204", + "map": "0", + "position_x": "-844.042", + "position_y": "72.5851", + "position_z": "37.7693" + }, + { + "guid": "323450", + "id": "47204", + "map": "0", + "position_x": "-896.134", + "position_y": "106.207", + "position_z": "39.3018" + }, + { + "guid": "323667", + "id": "47204", + "map": "0", + "position_x": "-960.328", + "position_y": "157.501", + "position_z": "46.7915" + }, + { + "guid": "323684", + "id": "47204", + "map": "0", + "position_x": "-841.781", + "position_y": "131.703", + "position_z": "38.7089" + }, + { + "guid": "323696", + "id": "47204", + "map": "0", + "position_x": "-821.727", + "position_y": "117.328", + "position_z": "40.7864" + }, + { + "guid": "323705", + "id": "47204", + "map": "0", + "position_x": "-805.911", + "position_y": "142.473", + "position_z": "43.208" + }, + { + "guid": "323715", + "id": "47204", + "map": "0", + "position_x": "-782.183", + "position_y": "84.276", + "position_z": "38.0517" + }, + { + "guid": "323730", + "id": "47204", + "map": "0", + "position_x": "-776.984", + "position_y": "124.41", + "position_z": "42.9572" + }, + { + "guid": "323967", + "id": "47204", + "map": "0", + "position_x": "-904.166", + "position_y": "279.166", + "position_z": "30.5818" + }, + { + "guid": "323992", + "id": "47204", + "map": "0", + "position_x": "-834.153", + "position_y": "275.146", + "position_z": "38.5025" + }, + { + "guid": "324004", + "id": "47204", + "map": "0", + "position_x": "-806.825", + "position_y": "226.569", + "position_z": "37.5147" + }, + { + "guid": "324023", + "id": "47204", + "map": "0", + "position_x": "-754.682", + "position_y": "202.569", + "position_z": "54.6108" + }, + { + "guid": "324032", + "id": "47204", + "map": "0", + "position_x": "-745.619", + "position_y": "187.417", + "position_z": "50.3454" + }, + { + "guid": "324048", + "id": "47204", + "map": "0", + "position_x": "-730.002", + "position_y": "117.028", + "position_z": "42.2995" + }, + { + "guid": "324062", + "id": "47204", + "map": "0", + "position_x": "-707.676", + "position_y": "161.436", + "position_z": "46.6054" + }, + { + "guid": "324220", + "id": "47204", + "map": "0", + "position_x": "-714.244", + "position_y": "220.679", + "position_z": "51.0158" + }, + { + "guid": "324231", + "id": "47204", + "map": "0", + "position_x": "-703.069", + "position_y": "245.036", + "position_z": "50.6704" + }, + { + "guid": "324241", + "id": "47204", + "map": "0", + "position_x": "-770.256", + "position_y": "252.965", + "position_z": "45.721" + }, + { + "guid": "324251", + "id": "47204", + "map": "0", + "position_x": "-723.903", + "position_y": "270.716", + "position_z": "49.3726" + }, + { + "guid": "324262", + "id": "47204", + "map": "0", + "position_x": "-762.295", + "position_y": "289.806", + "position_z": "46.9655" + }, + { + "guid": "324272", + "id": "47204", + "map": "0", + "position_x": "-831.956", + "position_y": "302.305", + "position_z": "44.7856" + }, + { + "guid": "324300", + "id": "47204", + "map": "0", + "position_x": "-817.971", + "position_y": "349.337", + "position_z": "53.9645" + }, + { + "guid": "324309", + "id": "47204", + "map": "0", + "position_x": "-788.734", + "position_y": "317.735", + "position_z": "52.0704" + }, + { + "guid": "324322", + "id": "47204", + "map": "0", + "position_x": "-682.432", + "position_y": "282.371", + "position_z": "48.9513" + }, + { + "guid": "324393", + "id": "47204", + "map": "0", + "position_x": "-692.978", + "position_y": "362.038", + "position_z": "61.9623" + }, + { + "guid": "324402", + "id": "47204", + "map": "0", + "position_x": "-723.33", + "position_y": "322.331", + "position_z": "48.9629" + }, + { + "guid": "324413", + "id": "47204", + "map": "0", + "position_x": "-711.852", + "position_y": "413.797", + "position_z": "74.9438" + }, + { + "guid": "324424", + "id": "47204", + "map": "0", + "position_x": "-747.462", + "position_y": "407.733", + "position_z": "72.2284" + }, + { + "guid": "324434", + "id": "47204", + "map": "0", + "position_x": "-791.807", + "position_y": "361.156", + "position_z": "60.7099" + } + ], + "humans": [ + { + "guid": "323441", + "id": "2269", + "map": "0", + "position_x": "-869.394", + "position_y": "61.9253", + "position_z": "2.83463" + }, + { + "guid": "323444", + "id": "2269", + "map": "0", + "position_x": "-860.563", + "position_y": "79.809", + "position_z": "3.95971" + }, + { + "guid": "323445", + "id": "2269", + "map": "0", + "position_x": "-848.665", + "position_y": "55.4618", + "position_z": "3.89097" + }, + { + "guid": "323446", + "id": "2503", + "map": "0", + "position_x": "-851.608", + "position_y": "66.408", + "position_z": "3.31888" + }, + { + "guid": "323449", + "id": "2269", + "map": "0", + "position_x": "-838.149", + "position_y": "68.467", + "position_z": "1.84621" + }, + { + "guid": "323460", + "id": "2269", + "map": "0", + "position_x": "-784.233", + "position_y": "35.8698", + "position_z": "14.3469" + }, + { + "guid": "323646", + "id": "2269", + "map": "0", + "position_x": "-710.427", + "position_y": "29.842", + "position_z": "12.8298" + }, + { + "guid": "323651", + "id": "2269", + "map": "0", + "position_x": "-765.575", + "position_y": "42.9045", + "position_z": "14.079" + }, + { + "guid": "323652", + "id": "2503", + "map": "0", + "position_x": "-778.184", + "position_y": "33.5712", + "position_z": "12.8462" + }, + { + "guid": "323657", + "id": "2269", + "map": "0", + "position_x": "-840.58", + "position_y": "79.342", + "position_z": "3.71694" + }, + { + "guid": "323682", + "id": "2270", + "map": "0", + "position_x": "-884.944", + "position_y": "186.401", + "position_z": "16.3249" + }, + { + "guid": "323694", + "id": "2269", + "map": "0", + "position_x": "-846.042", + "position_y": "100.189", + "position_z": "4.02171" + }, + { + "guid": "323726", + "id": "2269", + "map": "0", + "position_x": "-825.512", + "position_y": "142.002", + "position_z": "17.6065" + }, + { + "guid": "323729", + "id": "2269", + "map": "0", + "position_x": "-806.137", + "position_y": "116.134", + "position_z": "16.9954" + }, + { + "guid": "323739", + "id": "2503", + "map": "0", + "position_x": "-821.566", + "position_y": "150.405", + "position_z": "17.4861" + }, + { + "guid": "323740", + "id": "2269", + "map": "0", + "position_x": "-804.7", + "position_y": "102.198", + "position_z": "6.67607" + }, + { + "guid": "323741", + "id": "2503", + "map": "0", + "position_x": "-802.479", + "position_y": "82.3299", + "position_z": "5.2288" + }, + { + "guid": "323742", + "id": "2269", + "map": "0", + "position_x": "-820.924", + "position_y": "156.135", + "position_z": "17.5591" + }, + { + "guid": "323743", + "id": "2269", + "map": "0", + "position_x": "-822.863", + "position_y": "140.314", + "position_z": "2.78693" + }, + { + "guid": "323749", + "id": "2503", + "map": "0", + "position_x": "-786.123", + "position_y": "112.563", + "position_z": "15.757" + }, + { + "guid": "323751", + "id": "2269", + "map": "0", + "position_x": "-786.471", + "position_y": "92.4722", + "position_z": "8.23385" + }, + { + "guid": "323756", + "id": "2269", + "map": "0", + "position_x": "-775.061", + "position_y": "81.9653", + "position_z": "11.1969" + }, + { + "guid": "323757", + "id": "2503", + "map": "0", + "position_x": "-802.161", + "position_y": "147.981", + "position_z": "1.98358" + }, + { + "guid": "323758", + "id": "2269", + "map": "0", + "position_x": "-773.184", + "position_y": "117.194", + "position_z": "16.2855" + }, + { + "guid": "323761", + "id": "2269", + "map": "0", + "position_x": "-753.759", + "position_y": "63.1649", + "position_z": "12.3501" + }, + { + "guid": "323763", + "id": "2269", + "map": "0", + "position_x": "-734.363", + "position_y": "42.2899", + "position_z": "11.6095" + }, + { + "guid": "323765", + "id": "2269", + "map": "0", + "position_x": "-750.53", + "position_y": "92.1615", + "position_z": "12.4376" + }, + { + "guid": "323766", + "id": "2269", + "map": "0", + "position_x": "-732.8", + "position_y": "67.2344", + "position_z": "10.0565" + }, + { + "guid": "323769", + "id": "2503", + "map": "0", + "position_x": "-716.781", + "position_y": "46.0035", + "position_z": "11.2494" + }, + { + "guid": "323770", + "id": "2269", + "map": "0", + "position_x": "-751.104", + "position_y": "106.233", + "position_z": "14.5482" + }, + { + "guid": "323773", + "id": "2269", + "map": "0", + "position_x": "-717.696", + "position_y": "58.967", + "position_z": "9.69042" + }, + { + "guid": "323774", + "id": "2269", + "map": "0", + "position_x": "-733.271", + "position_y": "95.0087", + "position_z": "13.9253" + }, + { + "guid": "323775", + "id": "2269", + "map": "0", + "position_x": "-704.375", + "position_y": "50.0903", + "position_z": "12.3267" + }, + { + "guid": "323930", + "id": "2269", + "map": "0", + "position_x": "-793.781", + "position_y": "147.762", + "position_z": "2.4743" + }, + { + "guid": "323932", + "id": "2269", + "map": "0", + "position_x": "-818.564", + "position_y": "164.776", + "position_z": "2.56275" + }, + { + "guid": "323933", + "id": "2270", + "map": "0", + "position_x": "-863.583", + "position_y": "184.009", + "position_z": "16.6428" + }, + { + "guid": "323934", + "id": "2503", + "map": "0", + "position_x": "-865.585", + "position_y": "186.896", + "position_z": "16.0436" + }, + { + "guid": "323982", + "id": "2270", + "map": "0", + "position_x": "-881.191", + "position_y": "245.51", + "position_z": "9.20844" + }, + { + "guid": "323984", + "id": "2270", + "map": "0", + "position_x": "-868.863", + "position_y": "242.693", + "position_z": "10.4184" + }, + { + "guid": "323985", + "id": "2270", + "map": "0", + "position_x": "-873.484", + "position_y": "214.198", + "position_z": "8.88758" + }, + { + "guid": "323986", + "id": "2270", + "map": "0", + "position_x": "-873.802", + "position_y": "206.873", + "position_z": "8.88758" + }, + { + "guid": "323988", + "id": "2269", + "map": "0", + "position_x": "-858.835", + "position_y": "206.5", + "position_z": "17.5857" + }, + { + "guid": "323991", + "id": "2270", + "map": "0", + "position_x": "-849.266", + "position_y": "219.957", + "position_z": "9.49518" + }, + { + "guid": "324001", + "id": "2269", + "map": "0", + "position_x": "-837.804", + "position_y": "202.875", + "position_z": "7.11098" + }, + { + "guid": "324003", + "id": "2269", + "map": "0", + "position_x": "-830.035", + "position_y": "186.309", + "position_z": "20.8517" + }, + { + "guid": "324014", + "id": "2269", + "map": "0", + "position_x": "-831.809", + "position_y": "180.524", + "position_z": "3.66788" + }, + { + "guid": "324017", + "id": "2269", + "map": "0", + "position_x": "-808.512", + "position_y": "183.63", + "position_z": "20.5318" + }, + { + "guid": "324018", + "id": "2269", + "map": "0", + "position_x": "-801.495", + "position_y": "164.293", + "position_z": "20.2229" + }, + { + "guid": "324041", + "id": "2269", + "map": "0", + "position_x": "-769.063", + "position_y": "160.931", + "position_z": "21.3047" + }, + { + "guid": "324044", + "id": "2269", + "map": "0", + "position_x": "-754.967", + "position_y": "177.304", + "position_z": "22.9019" + }, + { + "guid": "324045", + "id": "2503", + "map": "0", + "position_x": "-748.53", + "position_y": "172.373", + "position_z": "21.918" + }, + { + "guid": "324057", + "id": "2269", + "map": "0", + "position_x": "-740.656", + "position_y": "132.526", + "position_z": "20.648" + }, + { + "guid": "324060", + "id": "2503", + "map": "0", + "position_x": "-731.061", + "position_y": "120.233", + "position_z": "18.5036" + }, + { + "guid": "324071", + "id": "2269", + "map": "0", + "position_x": "-708.115", + "position_y": "156.299", + "position_z": "19.1837" + }, + { + "guid": "324074", + "id": "2269", + "map": "0", + "position_x": "-691.346", + "position_y": "166.191", + "position_z": "16.4011" + } + ], + "murlocs": [ + { + "guid": "323133", + "id": "2375", + "map": "0", + "position_x": "-1183.68", + "position_y": "-49.3514", + "position_z": "-12.76" + }, + { + "guid": "323139", + "id": "2375", + "map": "0", + "position_x": "-1116.33", + "position_y": "-45.758", + "position_z": "-3.06632" + }, + { + "guid": "323222", + "id": "2375", + "map": "0", + "position_x": "-1095.84", + "position_y": "-21.0632", + "position_z": "-0.500226" + }, + { + "guid": "323225", + "id": "2374", + "map": "0", + "position_x": "-1152.56", + "position_y": "-20.673", + "position_z": "-3.2098" + }, + { + "guid": "323226", + "id": "2375", + "map": "0", + "position_x": "-1141.52", + "position_y": "-7.48945", + "position_z": "-0.474984" + }, + { + "guid": "323227", + "id": "2375", + "map": "0", + "position_x": "-1187.28", + "position_y": "21.4164", + "position_z": "-8.45807" + }, + { + "guid": "323228", + "id": "2374", + "map": "0", + "position_x": "-1093.65", + "position_y": "8.58892", + "position_z": "7.8067" + }, + { + "guid": "323229", + "id": "2375", + "map": "0", + "position_x": "-1087.7", + "position_y": "1.44276", + "position_z": "4.14142" + }, + { + "guid": "323230", + "id": "2375", + "map": "0", + "position_x": "-1146.8", + "position_y": "10.1514", + "position_z": "0.561033" + }, + { + "guid": "323231", + "id": "2375", + "map": "0", + "position_x": "-1155.7", + "position_y": "28.0613", + "position_z": "-1.1604" + }, + { + "guid": "323232", + "id": "2375", + "map": "0", + "position_x": "-1142.2", + "position_y": "21.2048", + "position_z": "1.73791" + }, + { + "guid": "323233", + "id": "2375", + "map": "0", + "position_x": "-1215.5", + "position_y": "48.3912", + "position_z": "-13.3163" + }, + { + "guid": "323234", + "id": "2375", + "map": "0", + "position_x": "-1175.51", + "position_y": "69.6888", + "position_z": "-3.25101" + }, + { + "guid": "323235", + "id": "2374", + "map": "0", + "position_x": "-1176.57", + "position_y": "102.856", + "position_z": "-0.78427" + }, + { + "guid": "323236", + "id": "2375", + "map": "0", + "position_x": "-1200.44", + "position_y": "110.59", + "position_z": "-5.41789" + }, + { + "guid": "323237", + "id": "2375", + "map": "0", + "position_x": "-1192.92", + "position_y": "150.169", + "position_z": "-3.73903" + }, + { + "guid": "323238", + "id": "2375", + "map": "0", + "position_x": "-1154.7", + "position_y": "112.86", + "position_z": "8.22992" + }, + { + "guid": "323239", + "id": "2374", + "map": "0", + "position_x": "-1170.22", + "position_y": "113.85", + "position_z": "1.29036" + }, + { + "guid": "323240", + "id": "2375", + "map": "0", + "position_x": "-1143.52", + "position_y": "38.7088", + "position_z": "2.26482" + }, + { + "guid": "323241", + "id": "2375", + "map": "0", + "position_x": "-1151.32", + "position_y": "60.7263", + "position_z": "0.977421" + }, + { + "guid": "323242", + "id": "2375", + "map": "0", + "position_x": "-1163.77", + "position_y": "96.8125", + "position_z": "1.76664" + }, + { + "guid": "323243", + "id": "2375", + "map": "0", + "position_x": "-1154.16", + "position_y": "169.146", + "position_z": "0.997761" + }, + { + "guid": "323244", + "id": "2375", + "map": "0", + "position_x": "-1146.47", + "position_y": "174.013", + "position_z": "2.73987" + }, + { + "guid": "323379", + "id": "2375", + "map": "0", + "position_x": "-1210.31", + "position_y": "187.052", + "position_z": "-9.47759" + }, + { + "guid": "323380", + "id": "2374", + "map": "0", + "position_x": "-1218.12", + "position_y": "249.529", + "position_z": "-10.0705" + }, + { + "guid": "323381", + "id": "2375", + "map": "0", + "position_x": "-1184.18", + "position_y": "215.889", + "position_z": "-8.27894" + }, + { + "guid": "323382", + "id": "2375", + "map": "0", + "position_x": "-1187.6", + "position_y": "285.313", + "position_z": "-8.5283" + }, + { + "guid": "323383", + "id": "2374", + "map": "0", + "position_x": "-1137.59", + "position_y": "241.907", + "position_z": "-2.77792" + }, + { + "guid": "323384", + "id": "2374", + "map": "0", + "position_x": "-1131.18", + "position_y": "200.593", + "position_z": "4.04397" + }, + { + "guid": "323385", + "id": "2375", + "map": "0", + "position_x": "-1131.54", + "position_y": "203.149", + "position_z": "3.67675" + }, + { + "guid": "323386", + "id": "2375", + "map": "0", + "position_x": "-1103.06", + "position_y": "245.173", + "position_z": "5.41774" + }, + { + "guid": "323387", + "id": "2374", + "map": "0", + "position_x": "-1145.24", + "position_y": "185.993", + "position_z": "1.84585" + }, + { + "guid": "323388", + "id": "2374", + "map": "0", + "position_x": "-1118.84", + "position_y": "255.641", + "position_z": "1.17793" + }, + { + "guid": "323660", + "id": "2374", + "map": "0", + "position_x": "-1156.07", + "position_y": "318.179", + "position_z": "-8.5283" + }, + { + "guid": "323661", + "id": "2374", + "map": "0", + "position_x": "-1102.11", + "position_y": "280.263", + "position_z": "0.827282" + }, + { + "guid": "323662", + "id": "2375", + "map": "0", + "position_x": "-1131.96", + "position_y": "293.683", + "position_z": "-0.35881" + }, + { + "guid": "323663", + "id": "2374", + "map": "0", + "position_x": "-1079.84", + "position_y": "262.95", + "position_z": "4.53315" + }, + { + "guid": "323664", + "id": "2375", + "map": "0", + "position_x": "-1082.52", + "position_y": "304.649", + "position_z": "-6.69435" + }, + { + "guid": "323666", + "id": "2374", + "map": "0", + "position_x": "-1057.94", + "position_y": "274.698", + "position_z": "1.59294" + }, + { + "guid": "323676", + "id": "2374", + "map": "0", + "position_x": "-999.455", + "position_y": "248.352", + "position_z": "10.9127" + }, + { + "guid": "323677", + "id": "2374", + "map": "0", + "position_x": "-1010.72", + "position_y": "258.54", + "position_z": "6.9557" + }, + { + "guid": "323955", + "id": "2375", + "map": "0", + "position_x": "-1111.98", + "position_y": "352.417", + "position_z": "-8.5283" + }, + { + "guid": "323956", + "id": "2375", + "map": "0", + "position_x": "-1045.75", + "position_y": "351.969", + "position_z": "-8.96293" + }, + { + "guid": "323957", + "id": "2375", + "map": "0", + "position_x": "-960.592", + "position_y": "276.731", + "position_z": "8.86238" + }, + { + "guid": "323958", + "id": "2374", + "map": "0", + "position_x": "-958.647", + "position_y": "284.392", + "position_z": "9.29904" + }, + { + "guid": "323959", + "id": "2375", + "map": "0", + "position_x": "-973.269", + "position_y": "331.143", + "position_z": "-0.0269952" + }, + { + "guid": "323960", + "id": "2374", + "map": "0", + "position_x": "-981.974", + "position_y": "315.614", + "position_z": "0.426113" + }, + { + "guid": "323961", + "id": "2375", + "map": "0", + "position_x": "-991.618", + "position_y": "281.796", + "position_z": "4.3344" + }, + { + "guid": "323962", + "id": "2374", + "map": "0", + "position_x": "-969.795", + "position_y": "325.382", + "position_z": "2.34319" + }, + { + "guid": "323963", + "id": "2375", + "map": "0", + "position_x": "-1001.59", + "position_y": "322.809", + "position_z": "-5.13038" + }, + { + "guid": "324284", + "id": "2375", + "map": "0", + "position_x": "-970.481", + "position_y": "369.639", + "position_z": "-3.17808" + }, + { + "guid": "324285", + "id": "2374", + "map": "0", + "position_x": "-1003.5", + "position_y": "378.383", + "position_z": "-9.41256" + }, + { + "guid": "324286", + "id": "2374", + "map": "0", + "position_x": "-979.714", + "position_y": "412.876", + "position_z": "0.0434151" + } + ], + "supplies": [ + { + "guid": "204012", + "id": "206783", + "map": "0", + "position_x": "-1020.57", + "position_y": "281.835", + "position_z": "0.121757" + }, + { + "guid": "204086", + "id": "206783", + "map": "0", + "position_x": "-1155.23", + "position_y": "174.378", + "position_z": "0.0493362" + }, + { + "guid": "204087", + "id": "206783", + "map": "0", + "position_x": "-1148.58", + "position_y": "177.299", + "position_z": "1.7044" + }, + { + "guid": "204089", + "id": "206783", + "map": "0", + "position_x": "-1168.65", + "position_y": "144.309", + "position_z": "-0.327454" + }, + { + "guid": "204090", + "id": "206783", + "map": "0", + "position_x": "-1171.53", + "position_y": "112.057", + "position_z": "0.794986" + }, + { + "guid": "204091", + "id": "206783", + "map": "0", + "position_x": "-1166.19", + "position_y": "81.9444", + "position_z": "-0.166677" + }, + { + "guid": "204092", + "id": "206783", + "map": "0", + "position_x": "-1174.46", + "position_y": "105.59", + "position_z": "1.88442" + }, + { + "guid": "204093", + "id": "206783", + "map": "0", + "position_x": "-1173.16", + "position_y": "107.905", + "position_z": "0.174023" + }, + { + "guid": "204095", + "id": "206783", + "map": "0", + "position_x": "-1152.14", + "position_y": "37.2465", + "position_z": "-0.223247" + }, + { + "guid": "204096", + "id": "206783", + "map": "0", + "position_x": "-1149.03", + "position_y": "25.625", + "position_z": "0.43544" + }, + { + "guid": "204097", + "id": "206783", + "map": "0", + "position_x": "-1147.64", + "position_y": "16.8038", + "position_z": "0.709479" + } + ], + "egg_accessories": [ + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "0", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 0", + "summontype": "6", + "summontimer": "30000" + }, + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "1", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 1", + "summontype": "6", + "summontimer": "30000" + }, + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "2", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 2", + "summontype": "6", + "summontimer": "30000" + }, + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "3", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 3", + "summontype": "6", + "summontimer": "30000" + }, + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "4", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 4", + "summontype": "6", + "summontimer": "30000" + }, + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "5", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 5", + "summontype": "6", + "summontimer": "30000" + }, + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "6", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 6", + "summontype": "6", + "summontimer": "30000" + }, + { + "entry": "47204", + "accessory_entry": "47203", + "seat_id": "7", + "minion": "1", + "description": "Infested Bear - Creeper Egg seat 7", + "summontype": "6", + "summontimer": "30000" + } + ] +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/hillsbrad/console-outcomes.log b/doc/clientless/checkpoints/hillsbrad/console-outcomes.log new file mode 100644 index 0000000000..f14423e9ed --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/console-outcomes.log @@ -0,0 +1,15 @@ +TESTBOT_RESULT run=hillsbrad_03_supplies_open state=failed checks=0 failures=0 error='[string "..."]:5: native Opening cast and loot window' +TESTBOT_RESULT run=hillsbrad_03_supplies_lock13 state=failed checks=0 failures=0 error='[string "..."]:5: native Opening cast and loot window' +TESTBOT_RESULT run=hillsbrad_03_supplies_retry state=passed checks=3 failures=0 error='' +TESTBOT_RESULT run=hillsbrad_04_capture state=passed checks=1 failures=0 error='' +TESTBOT_RESULT run=hillsbrad_07_sludge state=failed checks=1 failures=0 error='...er/server/debug/testbots/archive/hillsbrad_07_sludge.lua:89: native Sludge Fields assessment event' +TESTBOT_RESULT run=hillsbrad_08_rescue state=passed checks=1 failures=0 error='' +TESTBOT_RESULT run=hillsbrad_10_science state=passed checks=1 failures=0 error='' +TESTBOT_RESULT run=hillsbrad_11_coastal_stage state=passed checks=0 failures=0 error='' +TESTBOT_RESULT run=hillsbrad_09_coastal state=failed checks=0 failures=0 error='[string "..."]:5: hungry creeper eats actual owner kill' +TESTBOT_RESULT run=hillsbrad_12_coastal_observe state=failed checks=0 failures=0 error='.../debug/testbots/archive/hillsbrad_12_coastal_observe.lua:107: hungry creeper eats actual owner kill' +TESTBOT_RESULT run=hillsbrad_13_creeper_lifetime state=passed checks=0 failures=0 error='' +TESTBOT_RESULT run=hillsbrad_14_coastal_live_accept state=passed checks=1 failures=0 error='' +TESTBOT_RESULT run=hillsbrad_15_assessment_retry state=failed checks=2 failures=1 error='' +[?2004hTC>Safe logout pending=0 sessions=0 combat=0 transport=0 flight=0 loading=0 +Adventure loader enabled=1 schema=1 busy=0 pools=50/5/50/5 known=110 rotations=0 manager=4 error='' diff --git a/doc/clientless/checkpoints/hillsbrad/diagnostic-db.json b/doc/clientless/checkpoints/hillsbrad/diagnostic-db.json new file mode 100644 index 0000000000..143ff335f4 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/diagnostic-db.json @@ -0,0 +1,8 @@ +{ + "assessment_quest": "ID\tLogTitle\tFlags\tSourceSpellID\tPrevQuestID\tSpecialFlags\n28192\tNo One Here Gets Out Alive\t1048578\t0\t28168\t0\n", + "warden": "entry\tname\tAIName\tScriptName\n47781\tWarden Stillwater\t\t\n", + "assessment_area_links": "", + "warden_smartai": "", + "assessment_gossip": "", + "coastal_ai": "entry\tname\tScriptName\n47662\tHungry Mine Creeper\tnpc_hillsbrad_hungry_mine_creeper\n" +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/hillsbrad/final-character-quests.tsv b/doc/clientless/checkpoints/hillsbrad/final-character-quests.tsv new file mode 100644 index 0000000000..0127aac3b3 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/final-character-quests.tsv @@ -0,0 +1,12 @@ +guid quest +150 28096 +150 28111 +150 28114 +150 28115 +150 28138 +150 28144 +150 28146 +150 28156 +150 28168 +150 28199 +150 28571 diff --git a/doc/clientless/checkpoints/hillsbrad/item-spells.json b/doc/clientless/checkpoints/hillsbrad/item-spells.json new file mode 100644 index 0000000000..e15223b595 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/item-spells.json @@ -0,0 +1,477 @@ +{ + "25": { + "class": 2, + "subclass": 7, + "inventory_type": 21, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3495": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3497": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3498": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3506": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3508": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3520": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3554": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3701": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3710": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 1538, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3717": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "3721": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "49778": { + "class": 2, + "subclass": 8, + "inventory_type": 17, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "62932": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "63079": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 88797, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "63090": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "63150": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 89089, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "63249": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "63426": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 89752, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "63508": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 89821, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "64416": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 90679, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "64445": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 90976, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "64471": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 91085, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "64583": { + "class": 12, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 91400, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + }, + "64666": { + "class": 15, + "subclass": 0, + "inventory_type": 0, + "spells": [ + 0, + 0, + 0, + 0, + 0 + ], + "triggers": [ + 0, + 0, + 0, + 0, + 0 + ] + } +} \ No newline at end of file diff --git a/doc/clientless/checkpoints/hillsbrad/quest-catalog.json b/doc/clientless/checkpoints/hillsbrad/quest-catalog.json new file mode 100644 index 0000000000..a0c1bf3017 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/quest-catalog.json @@ -0,0 +1,16960 @@ +[ + { + "ID": "494", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "3", + "RewardMoney": "600", + "RewardBonusMoney": "4650", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "3", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Time To Strike", + "LogDescription": "Travel to Tarren Mill to deliver Deathstalker Lesh's message to High Executor Darthalia.", + "QuestDescription": "Be silent and pay attention, $c.$b$bI was sent to this position in order to survey the town of Hillsbrad. My mission is one of reconnaissance. It is imperative that you send word to High Executor Darthalia in Tarren Mill at once. Let her know that I, Deathstalker Lesh, send the following message:$b$b\"The raven's cry from the west doth beckon.\"$b$bFollow the road to the east and pay close attention to the signs. Now, hurry! Off you go to Tarren Mill, and with urgency I might add!", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "496", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "499", + "RewardXPDifficulty": "1", + "RewardMoney": "150", + "RewardBonusMoney": "1080", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "2", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Suffering", + "LogDescription": "Apothecary Lydon of Tarren Mill wants 10 Gray Bear Tongues and some Creeper Ichor.", + "QuestDescription": "Ah, another wretched day in Tarren Mill. All of this clean air puts me in such a foul mood, $N.$b$bThe sooner we can plague the humans here, the better. I've been conducting intense studies on possible killing agents to use in my concoctions but I haven't the time to collect them all.$b$bIf you want to make yourself of use, procure the following items for me: 10 Gray Bear Tongues and the very rare and hard to find, Creeper Ichor. You'll find both bears and creepers just outside of Tarren Mill.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Apothecary Lydon at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3476", + "RequiredItemId2": "3477", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "10", + "RequiredItemCount2": "1", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "499", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3495", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Suffering", + "LogDescription": "Give Umpi the Elixir of Suffering.", + "QuestDescription": "It will take but a moment for me to mix these components into what I have deemed an Elixir of Suffering.$b$bThere we go! Ah, nothing brightens a gloomy day in these miserable foothills like bringing a little suffering into the world.$b$bLet us see if our little potion has achieved its desired effect.$b$bGive my assistant Umpi a taste of what the Dark Lady has planned for both humans and Scourge alike.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3495", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "496", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "501", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "502", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "11700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "3735", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "2230", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "3741", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "6482", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Pain", + "LogDescription": "Bring 10 vials of Mountain Lion Blood to Apothecary Lydon in Tarren Mill.", + "QuestDescription": "Oh, $N. . .the flowers are blooming in Hillsbrad and the air is so fresh and brisk. I can't help but to wallow in the misery of it all. I look out my grimy window and long for the day when our New Plague brings this world the death it deserves.$b$bAs much as I would love to sit and brood all day, my duty to the Dark Lady calls. Help me, would you? My research leads me to believe I can make the most splendid death-brew with the blood of a Mountain Lion. Bring some to me and we'll have a little fun.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Apothecary Lydon at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3496", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "10", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "499", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "502", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "4", + "RewardMoney": "0", + "RewardBonusMoney": "8700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3497", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "4", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Pain", + "LogDescription": "Feed the Elixir of Pain to Stanley.", + "QuestDescription": "Ah, nothing like the smell of fresh blood in the foothills!$b$bNow we'll mix in a touch of this and a little of that and let the real fun begin! What I have created with this blood, I like to call an Elixir of Pain. If my calculations are correct this concoction could be the start of something very beautiful for Lady Sylvanas. But what we need is a test.$b$bTake this elixir out to the northern farm in Hillsbrad Fields to the southwest. Let's see how Farmer Ray's little dog Stanley likes this \"treat.\"", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3497", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "501", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "503", + "QuestType": "2", + "QuestLevel": "36", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "506", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "21000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "278540", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "76", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Gol'dir", + "LogDescription": "Free Gol'dir then return to Krusk in Tarren Mill.", + "QuestDescription": "From what I can tell of the documents you procured, Gol'dir is being held in a large Syndicate base to the north, most likely in the Alterac Mountains. He has been held captive far too long and must be freed.", + "AreaDescription": "Find where Gol'dir is being held", + "QuestCompletionLog": "Return to Gol'dir at The Uplands in Alterac Mountains.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3704", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "533", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "506", + "QuestType": "2", + "QuestLevel": "36", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "507", + "RewardXPDifficulty": "4", + "RewardMoney": "3000", + "RewardBonusMoney": "15600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "76", + "RewardFactionValue1": "4", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Blackmoore's Legacy", + "LogDescription": "Return the information gathered by Gol'dir to Krusk in Tarren Mill.", + "QuestDescription": "A day or two ago, I was visited by the leader of this Syndicate. His name was Aliden Perenolde, and styled himself lord of this land. He confided in me his plans to take the orcs that stood against him as slaves, just as his father and his mentor, the despised Blackmoore, had planned.$b$bMore important was that he brought his mistress, a wisp of a girl named Elysa. Around her neck was the pendant the Warchief desires.$b$bNow go, I will make my own way, after I have settled my business here.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "503", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "507", + "QuestType": "2", + "QuestLevel": "42", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "508", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "36000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "278536", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Lord Aliden Perenolde", + "LogDescription": "Kill Lord Aliden Perenolde and ask his mistress, Elysa, about Taretha's pendant.", + "QuestDescription": "It is clear that Perenolde must be killed, his foulness removed from the world. His manor lies a ways to the north of here, on the shores of Lordamere Lake. Do your duty, $n, then retrieve the pendant that the Warchief desires, and return here.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Elysa at The Uplands in Alterac Mountains.", + "RequiredNpcOrGo1": "2423", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "506", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "508", + "QuestType": "2", + "QuestLevel": "40", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "32700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3498", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "3764", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "3765", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "76", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Taretha's Gift", + "LogDescription": "Return Taretha's pendant to Krusk at Tarren Mill in Hillsbrad Foothills.", + "QuestDescription": "The pendant? Of course you can have it... Take it! I want no memory of him... just please, please leave in peace...", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3498", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "507", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "509", + "QuestType": "2", + "QuestLevel": "28", + "MinLevel": "24", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "513", + "RewardXPDifficulty": "5", + "RewardMoney": "2500", + "RewardBonusMoney": "13800", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "2459", + "RewardAmount1": "3", + "RewardItem2": "929", + "RewardAmount2": "5", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Agony", + "LogDescription": "Bring 6 Mudsnout Blossoms to Apothecary Lydon in Tarren Mill.", + "QuestDescription": "Another day, another elixir to be made. If it were up to me, I'd just let the pathetic humans and Scourge fight it out. They seem bent on killing each other as is.$b$bAlas, our Dark Lady wants to help speed up the process a tad so why not pass these morbid days by spreading a little death and disease across the land?$b$bHere's the plan, $N: you go out to Nethander Stead, south of Tarren Mill and east of the river and Southshore. Collect for me 6 Mudsnout Blossoms from the field for my next elixir.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Apothecary Lydon at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3502", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "6", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "502", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "513", + "QuestType": "2", + "QuestLevel": "28", + "MinLevel": "24", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "515", + "RewardXPDifficulty": "3", + "RewardMoney": "0", + "RewardBonusMoney": "6900", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3506", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "3", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Agony", + "LogDescription": "Take the Mudsnout Composite to Master Apothecary Faranell in the Undercity.", + "QuestDescription": "Just when I thought another day was going to pass devoid of any joy, you brought me those marvelous Mudsnout Blossoms.$b$bFirst I will mix them down into a fine composite. We'll then need Master Apothecary Faranell in the Undercity to apply his colloid of decay to it and then we'll be ready for some good fun indeed!$b$bHere, take this Mudsnout Composite and run it off to Master Faranell at once, $N.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3506", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "509", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "515", + "QuestType": "2", + "QuestLevel": "30", + "MinLevel": "24", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "517", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "18300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3508", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "3749", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "3747", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Agony", + "LogDescription": "Bring the Mudsnout Mixture, a Strong Troll's Blood Potion, 5 Daggerspine Scales and 5 Torn Fin Eyes to Apothecary Lydon in Tarren Mill.", + "QuestDescription": "A mudsnout composite? Absolutely brilliant! Why didn't I think of that?$b$bLet me contribute my colloid of decay to this devilish brew.$b$bIn order to activate the contaminating agents in this mudsnout mixture, Lydon is going to need a strong troll's blood potion, as well as some daggerspine scales and torn fin eyes from the southern coast of Hillsbrad. He'll know what to do once you've gathered him all the reagents. And my, how anxious I am to hear how his experiment goes!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Apothecary Lydon at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3508", + "RequiredItemId2": "3388", + "RequiredItemId3": "3509", + "RequiredItemId4": "3510", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "1", + "RequiredItemCount3": "5", + "RequiredItemCount4": "5", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "513", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "517", + "QuestType": "2", + "QuestLevel": "30", + "MinLevel": "24", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "524", + "RewardXPDifficulty": "3", + "RewardMoney": "0", + "RewardBonusMoney": "7200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "3", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Agony", + "LogDescription": "Bring a keg of Shindigger Stout to Apothecary Lydon in Tarren Mill.", + "QuestDescription": "This new elixir is finally ready to be tested. But why let a perfectly good, highly contagious plague go to waste on a mere frog or dog? Let's have us some true fun in the name of Lady Sylvanas.$b$bHead down to Dun Garok. You know the barracks where those filthy little dwarves skitter about. Steal me a keg of their Shindigger Stout. Once I have that keg, you and I will have quite the party, $N.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Apothecary Lydon at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3517", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "515", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "518", + "QuestType": "2", + "QuestLevel": "39", + "MinLevel": "34", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "519", + "RewardXPDifficulty": "4", + "RewardMoney": "0", + "RewardBonusMoney": "18600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] The Crown of Will", + "LogDescription": "Kill 10 Crushridge Maulers for Melisara in Tarren Mill.", + "QuestDescription": "Mug'Thol and his Crushridge ogres have overrun the ruins of Alterac. It will be hard to inflict any serious punishment upon him without thinning out the ogres' numbers.$b$bAfter softening them up, we'll proceed.$b$bUnderstood? Good. Now go.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Melisara at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2254", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "495", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "519", + "QuestType": "2", + "QuestLevel": "41", + "MinLevel": "34", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "520", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "27600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] The Crown of Will", + "LogDescription": "Kill Targ, Muckrake, and Glommus and bring their heads to Melisara in Tarren Mill.", + "QuestDescription": "Targ, Muckrake, and Glommus are Mug'Thol's lieutenants. They are loyal to him, though who can say what drives an ogre to loyalty.$b$bBring me their heads, $n, and then all that will remain is to remove Mug'Thol's head, crown and all.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Melisara at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3550", + "RequiredItemId2": "3551", + "RequiredItemId3": "3552", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "1", + "RequiredItemCount3": "1", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "518", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "520", + "QuestType": "2", + "QuestLevel": "43", + "MinLevel": "34", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "521", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "37800", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] The Crown of Will", + "LogDescription": "Kill Mug'Thol, and return his head with the Crown of Will to Melisara in Tarren Mill.", + "QuestDescription": "With Mug'Thol's lieutenants dead, all that remains is to kill Mug'Thol and retrieve the Crown of Will. I have no doubt he'll be reluctant to part with it. Most likely expecting you, too, given the... departure... of his fellows.$b$bFind Mug'Thol, and deliver his head and the Crown to me. The Crushridge resistance will be at an end.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Melisara at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3553", + "RequiredItemId2": "3554", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "1", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "519", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "521", + "QuestType": "2", + "QuestLevel": "43", + "MinLevel": "34", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "30300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3554", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "4430", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] The Crown of Will", + "LogDescription": "Deliver the Crown of Will to Sharlindra in the Undercity.", + "QuestDescription": "All that remains is to deliver the Crown of Will to Sharlindra in the Undercity. She will see that it is delivered to Lady Sylvanas. I would warn you against thinking to use it for your own purposes, $n, Mug'Thol's fate should be illustration enough.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3554", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "520", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "524", + "QuestType": "2", + "QuestLevel": "30", + "MinLevel": "24", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "7", + "RewardMoney": "0", + "RewardBonusMoney": "21900", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3520", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Elixir of Agony", + "LogDescription": "Place the Tainted Keg on the rug for the captured farmers.", + "QuestDescription": "Next door the Deathguards are holding a few captured farmers hostage. High Executor Darthalia suspected one of the military strategists from Stormwind to be hiding out amongst them. Apparently the military chap was found dead in the Plaguelands last night. Darthalia, always looking out for me, decided the prisoners would be left to my disposal.$b$bI think it's time we threw those farmers a party. Sounds like a grand ol' time!$b$bPlace this tainted keg on the rug in their room. Plagued brew for all!", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3520", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "517", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "527", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "528", + "RewardXPDifficulty": "5", + "RewardMoney": "1700", + "RewardBonusMoney": "11700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Kill 6 Hillsbrad Farmhands, 6 Hillsbrad Farmers, Farmer Ray and Farmer Getz and report back to Darthalia in Tarren Mill.", + "QuestDescription": "Stand at attention while addressing me, $c.$b$bI am under direct command of Sylvanas. We are to quell the human infestation until our apothecaries can develop the new plague.$b$bOur information leads us to believe that the town of Hillsbrad is vulnerable to attack. Your first assignment is aimed at disrupting their food supply and infrastructure.$b$bTravel west. Raid the northernmost farms of Hillsbrad Fields. Make sure that the landowners, Farmer Ray and Farmer Getz, are executed as well.", + "AreaDescription": "", + "QuestCompletionLog": "Return to High Executor Darthalia at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2266", + "RequiredNpcOrGo2": "2360", + "RequiredNpcOrGo3": "232", + "RequiredNpcOrGo4": "2403", + "RequiredNpcOrGoCount1": "6", + "RequiredNpcOrGoCount2": "6", + "RequiredNpcOrGoCount3": "1", + "RequiredNpcOrGoCount4": "1", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "528", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "529", + "RewardXPDifficulty": "5", + "RewardMoney": "1800", + "RewardBonusMoney": "12000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Kill 15 Hillsbrad Peasants and report back to Darthalia in Tarren Mill.", + "QuestDescription": "Word of the attack on the northern farms has the townsfolk panicked. Most excellent.$b$bOur Deathstalkers report peasants fleeing to the fields in southern Hillsbrad. The fools think they can hide in the orchards and escape their doom.$b$bProve them wrong, $N. Return to Hillsbrad Fields and seek out the cowering peasants. Lay waste to them in the name of our Dark Lady.$b$bDismissed!", + "AreaDescription": "", + "QuestCompletionLog": "Return to High Executor Darthalia at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2267", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "15", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "527", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "529", + "QuestType": "2", + "QuestLevel": "26", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "532", + "RewardXPDifficulty": "5", + "RewardMoney": "2000", + "RewardBonusMoney": "12600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Kill Blacksmith Verringtan and 4 Hillsbrad Apprentice Blacksmiths.$b$bRetrieve a shipment of iron and report back to Darthalia in Tarren Mill.", + "QuestDescription": "The humans of Hillsbrad have been putting up unexpected resistance. The problem appears to be that the townsfolk are being armed by the local blacksmith. We need to shut down all supply lines.$b$bYour mission will be to execute Blacksmith Verringtan. Slay his apprentices as well. While there, bring back a shipment of iron from their stockpile. The supplies will come in handy when we are done with the conquering of Hillsbrad and begin razing Southshore.", + "AreaDescription": "", + "QuestCompletionLog": "Return to High Executor Darthalia at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2404", + "RequiredNpcOrGo2": "2265", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "4", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "3564", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "1", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "528", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "532", + "QuestType": "2", + "QuestLevel": "26", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "539", + "RewardXPDifficulty": "5", + "RewardMoney": "2000", + "RewardBonusMoney": "12600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Kill Magistrate Burnside and 4 Hillsbrad Councilmen. Destroy the Hillsbrad Proclamation. Steal the Hillsbrad Town Registry. Report back to Darthalia in Tarren Mill afterwards.", + "QuestDescription": "The town of Hillsbrad is in disarray and we believe it will soon fall. We must, however, persist in our ruthlessness until the human scum are wiped from the foothills for eternity.$b$bDespite their overwhelming losses, the humans rally around their leadership and keep fighting. We must eliminate their leader, Magistrate Burnside, as well as the town council. Destroy their revered political document as well, the Hillsbrad Proclamation. And while you're at it, steal the town registry.", + "AreaDescription": "", + "QuestCompletionLog": "Return to High Executor Darthalia at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2335", + "RequiredNpcOrGo2": "2387", + "RequiredNpcOrGo3": "-1761", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "4", + "RequiredNpcOrGoCount3": "1", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "3657", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "1", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "Hillsbrad Proclamation destroyed", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "529", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "533", + "QuestType": "2", + "QuestLevel": "34", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "503", + "RewardXPDifficulty": "5", + "RewardMoney": "3500", + "RewardBonusMoney": "18600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "76", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Infiltration", + "LogDescription": "Retrieve information about Gol'dir's whereabouts for Krusk in Tarren Mill.", + "QuestDescription": "At last we begin to hear word and rumor, find evidence of Gol'dir's whereabouts. The humans have been moving him around, but we are narrowing down our search and focusing on the large Syndicate camp just north of here.$b$bGo there, $n, and bring back whatever information you can get your hands on.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Krusk at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3601", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "536", + "QuestType": "2", + "QuestLevel": "30", + "MinLevel": "25", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "559", + "RewardXPDifficulty": "4", + "RewardMoney": "2100", + "RewardBonusMoney": "11100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Down the Coast", + "LogDescription": "Kill 10 Torn Fin Tidehunters and 10 Torn Fin Oracles for Lieutenant Farren Orinelle in Southshore.", + "QuestDescription": "Transferred from the Stormwind city guard to Southshore, a town that should be abandoned by the looks of it... Smell of the harbor day and night.$b$bNot to mention ol' Redpath... Wants me to take care of the murlocs. Ha! $b$bI can barely rouse myself to go out to some of the pockets of the overgrown fish down the Western Strand. If you would go in my place and take care of them, I'd appreciate it.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Lieutenant Farren Orinelle at Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2377", + "RequiredNpcOrGo2": "2376", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "10", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "539", + "QuestType": "2", + "QuestLevel": "28", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "541", + "RewardXPDifficulty": "5", + "RewardMoney": "2500", + "RewardBonusMoney": "13800", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Kill Foreman Bonds and 10 Hillsbrad Miners and report back to Darthalia in Tarren Mill.", + "QuestDescription": "The Hillsbrad Town Registry indicates that the Azurelode Mine is under Alliance control. Furthermore, the mine is a prime source of iron ore for the Alliance armories.$b$bEven though we've struck a decisive blow to the town of Hillsbrad, the Alliance still supports and protects the Azurelode Mine fervently.$b$bThe mine lies due south of Hillsbrad. Go there and slay the foreman, a human by the name of Bonds. Kill his miners as well. That should send a clear message to the Alliance.", + "AreaDescription": "", + "QuestCompletionLog": "Return to High Executor Darthalia at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2305", + "RequiredNpcOrGo2": "2269", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "10", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "532", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "541", + "QuestType": "2", + "QuestLevel": "30", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "14351", + "RewardXPDifficulty": "5", + "RewardMoney": "2500", + "RewardBonusMoney": "14700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Travel to Dun Garok and kill 8 Mountaineers, 4 Riflemen, 2 Priests and Captain Ironhill and report back to Darthalia in Tarren Mill.", + "QuestDescription": "Dwarves aiding the humans? Damn those filthy little beasts.$b$bWe shall test the strength of the so-called Alliance. We'll see how anxious those little ankle-bashers are to help the humans once they feel our wrath. We know exactly where their stronghold is in this territory.$b$bThey have established a barracks in southeastern Hillsbrad along Thoradin's Wall called Dun Garok. The final mission of this battle is to lay siege on Dun Garok, $c. Captain Ironhill, their leader, must die.", + "AreaDescription": "", + "QuestCompletionLog": "Return to High Executor Darthalia at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2344", + "RequiredNpcOrGo2": "2345", + "RequiredNpcOrGo3": "2346", + "RequiredNpcOrGo4": "2304", + "RequiredNpcOrGoCount1": "8", + "RequiredNpcOrGoCount2": "4", + "RequiredNpcOrGoCount3": "2", + "RequiredNpcOrGoCount4": "1", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "539", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "544", + "QuestType": "2", + "QuestLevel": "34", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "545", + "RewardXPDifficulty": "6", + "RewardMoney": "7000", + "RewardBonusMoney": "23100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Prison Break In", + "LogDescription": "Find the traitors and recover their artifacts, then return to Magus Voidglare in Tarren Mill.", + "QuestDescription": "I came to Tarren Mill to research, but now must resolve a crisis. You see, four Forsaken fled the Undercity a few months ago. They turned their backs on their brethren, but what's worse...they stole from the Dark Lady.$B$BThese thieves broke into a secure vault and stole four artifacts, items our apothecaries required in certain studies. Sylvanas would have these artifacts returned.$B$BThe thieves fled the Undercity to Dalaran, and those wizards quarantined them in the Lordamere Internment Camp.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Magus Wordeen Voidglare at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3691", + "RequiredItemId2": "3689", + "RequiredItemId3": "3690", + "RequiredItemId4": "3688", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "1", + "RequiredItemCount3": "1", + "RequiredItemCount4": "1", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "545", + "QuestType": "2", + "QuestLevel": "35", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "4", + "RewardMoney": "2500", + "RewardBonusMoney": "14700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "4", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Dalaran Patrols", + "LogDescription": "Kill 6 Dalaran Summoners and 12 Elemental Slaves, then return to Magus Voidglare in Tarren Mill.", + "QuestDescription": "The wizards of Dalaran constructed a vast, magical dome around the heart of their city. Some believe it was for protection from the violence of these times, while others say they merely wanted solitude, to study and plot.$B$BI don't care what the reason was. I do care that the ruined outskirts of their city may hide valuable magical treasures.$B$BBut the area is patrolled by the wizards and their elemental slaves.$B$BSo hunt them, and return when their numbers are sufficiently reduced.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Magus Wordeen Voidglare at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2358", + "RequiredNpcOrGo2": "2359", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "6", + "RequiredNpcOrGoCount2": "12", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "544", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "546", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "15300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "3739", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Souvenirs of Death", + "LogDescription": "Deathguard Samsa of Tarren Mill wants 30 Hillsbrad Human Skulls.", + "QuestDescription": "I hear you were enlisted by Darthalia to wage war on the humans of Hillsbrad. So jealous I am. . .$b$bWhile you're off having all the fun -- slaying humans, pillaging the town, terrorizing innocent people -- I am stuck standing guard here in Tarren Mill.$b$bPerhaps you'll take pity on an old Deathguard like myself? You see I am collecting human skulls. And you will be fighting humans for quite some time. Over the course of your long battle, bring me 30 skulls and I will make it worth your while.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Deathguard Samsa at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3692", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "30", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "547", + "QuestType": "2", + "QuestLevel": "30", + "MinLevel": "26", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "18300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "3750", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "3751", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Humbert's Sword", + "LogDescription": "Retrieve Deathguard Humbert's sword from Dun Garok and return it to him in Tarren Mill.", + "QuestDescription": "High Executor Darthalia sent me to keep watch of Dun Garok from a distance. I had set up camp just out of sight. But when morning came and I had to boil water, I left to gather firewood.$b$bWhen I returned to camp, I discovered my gear was missing.$b$bApparently some dwarven scouts from Dun Garok had passed by and made off with it. I need my sword! If you can get it back for me I would be so grateful. So many dwarves there...it will be quite difficult to find the dirty little thief who stole it.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Deathguard Humbert at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3693", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "550", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "16200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3701", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "3760", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "6282", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "3761", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "3822", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Take Darthalia's Sealed Commendation to Bragor Bloodfist in the Undercity.", + "QuestDescription": "Because you fought with such valor and perseverance in the Battle of Hillsbrad, I have written this commendation, extolling your heroics in combat for the high command to recognize.$b$bTake this sealed commendation to Bragor Bloodfist in the Undercity. Go with pride, $c.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3701", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "541", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "552", + "QuestType": "2", + "QuestLevel": "33", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "553", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "17400", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Helcular's Revenge", + "LogDescription": "Retrieve Helcular's Rod from the Yeti and bring it back to Novice Thaivand in Tarren Mill.", + "QuestDescription": "Master Helcular was almost complete with his transformation into a Lich when a human lynch mob discovered his ritual lair in the hills and brutally killed him. To make matters worse they buried his corpse in the Southshore cemetery.$b$bSuch disregard for the great wizard is unacceptable. As his apprentice I shall see to it that the rains of vengeance fall upon the town of Southshore.$b$bWe will need Helcular's Rod first. Yeti overtook his ritual lair. Undoubtedly one of the beasts has it.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Novice Thaivand at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3708", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "553", + "QuestType": "2", + "QuestLevel": "33", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "21600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3710", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Helcular's Revenge", + "LogDescription": "Charge the Rod of Helcular with the powers of the Flame of Azel, Flame of Veraz and the Flame of Uzel.$b$bDrive the charged rod into Helcular's grave in Southshore.", + "QuestDescription": "Here, take the Rod of Helcular. You will need it.$b$bHelcular fashioned 3 ceremonial pyres as part of his most powerful spell. The Flame of Azel and the Flame of Veraz lie within the Foothill Caverns. The Flame of Uzel lies in a cave above the caverns, further north in the mountains.$b$bThe Rod of Helcular must be charged from each of the three flames. Once the ritual is complete, drive the rod into Helcular's grave in Southshore, the heavily guarded human town to the south. Vengeance shall be ours!", + "AreaDescription": "", + "QuestCompletionLog": "Seek out Helcular's Grave at the Southshore graveyard in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "-1768", + "RequiredNpcOrGo2": "-1769", + "RequiredNpcOrGo3": "-1770", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "1", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "3710", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "1", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Flame of Azel charged", + "ObjectiveText2": "Flame of Veraz charged", + "ObjectiveText3": "Flame of Uzel charged", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "552", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "555", + "QuestType": "2", + "QuestLevel": "31", + "MinLevel": "28", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "3000", + "RewardBonusMoney": "15300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "3737", + "RewardAmount1": "1", + "RewardItem2": "3729", + "RewardAmount2": "3", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Soothing Turtle Bisque", + "LogDescription": "Bring 10 pieces of Turtle Meat to Chef Jessen in Southshore.", + "QuestDescription": "If there's one thing you'll learn about Southshore it's that we have some of the best cuisine north of Stormwind!$b$bTake my secret recipe for Turtle Bisque, for example. I've known folks to travel from as far as Darkshire just to enjoy a bowl. Speaking of which, I haven't been able to make any lately. I used to head up past Dalaran to Lake Lordamere myself to hunt Snapjaws but it's just too dangerous now. If you bring me some Turtle Meat from the Snapjaws up north, I'll whip some up!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Chef Jessen at Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3712", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "10", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "556", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "3000", + "RewardBonusMoney": "16200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Stone Tokens", + "LogDescription": "Bring 10 Worn Stone Tokens to Keeper Bel'varil in Tarren Mill.", + "QuestDescription": "A notable talent of the wizards of Dalaran is their familiarity with elementals: powerful creatures from other dimensions. The wizards use magical tokens as a means to control these elementals. Magus Voidglare would like some of these tokens to study.$B$BEnter the territories of the Dalaran wizards, west of Hillsbrad, and gather the tokens.$B$BYou might find the tokens on any citizen of Dalaran, but I suggest hunting at the internment camp. It's safer than Dalaran itself.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Keeper Bel'varil at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3714", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "10", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "557", + "QuestType": "2", + "QuestLevel": "34", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "3500", + "RewardBonusMoney": "18600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Bracers of Binding", + "LogDescription": "Bring 4 Bracers of Earth Binding to Keeper Bel'varil in Tarren Mill.", + "QuestDescription": "The Magus will be busy studying those stone tokens you gathered, but I know he'll eventually want examples of their counterpart: bracers of binding. These are set around the wrists of actual elementals, and bind them into the mage's service.$B$BHunt elementals in the ruins of Dalaran and gather their Bracers of Earth Binding, and the Magus will be pleased.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Keeper Bel'varil at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3715", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "4", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "556", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "559", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "25", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "560", + "RewardXPDifficulty": "5", + "RewardMoney": "3000", + "RewardBonusMoney": "16200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Farren's Proof", + "LogDescription": "Collect 10 Murloc Heads from the murlocs on the Western Strand for Lieutenant Farren Orinelle in Southshore.", + "QuestDescription": "Would you believe it, $n? Redpath wasn't satisfied with all the murlocs we killed--oh now, don't be modest, you had some hand in it. Now he wants me to bring proof of the dead, hacking off cold, slimy murloc heads to submit for his approval.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Lieutenant Farren Orinelle at Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3716", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "10", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "536", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "560", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "25", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "561", + "RewardXPDifficulty": "1", + "RewardMoney": "0", + "RewardBonusMoney": "1620", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3717", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "2", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Farren's Proof", + "LogDescription": "Deliver the sack of murloc heads to Marshall Redpath in Southshore.", + "QuestDescription": "You know, $n, I'd really rather not take these heads... Since you've already got a handle on them, would you mind delivering them to Redpath for me?", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3717", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "559", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "561", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "25", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "562", + "RewardXPDifficulty": "1", + "RewardMoney": "0", + "RewardBonusMoney": "1620", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Farren's Proof", + "LogDescription": "Speak with Lieutenant Farren Orinelle in Southshore.", + "QuestDescription": "Please inform Lieutenant Orinelle that I would like him to refocus his efforts on the naga infesting the Eastern Strand. When he has results, tell him to report to me in person.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "560", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "562", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "25", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "563", + "RewardXPDifficulty": "4", + "RewardMoney": "0", + "RewardBonusMoney": "12000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "3755", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Stormwind Ho!", + "LogDescription": "Kill 10 Daggerspine Shorehunters and 10 Daggerspine Sirens for Lieutenant Farren Orinelle in Southshore.", + "QuestDescription": "My former mentor in the Stormwind city guard sent a message to me that Alliance High Command is becoming concerned with the threat posed by the naga. From what he's heard, there's good chances for promotion--or at least reassignment--for anyone who proves valuable in this regard.$b$bThere's just one small problem... I can't handle the naga, $n. Oh sure, I could break up a drunken barroom brawl, or haul off a belligerent beggar, but the naga are too much for me. You've got to help me, $n!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Lieutenant Farren Orinelle at Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2369", + "RequiredNpcOrGo2": "2371", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "10", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "561", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "563", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "25", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "20100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3721", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Reassignment", + "LogDescription": "Deliver Farren's report to Major Samuelson in Stormwind Keep.", + "QuestDescription": "It shouldn't be a problem getting my report seen. The new captain of the guard, Major Samuelson, was my mentor while I was stationed in Stormwind. It should give him more than enough excuse to have me transferred back to the city. I'll need you to carry my report to him, though... wouldn't want ol' Redpath to catch on.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3721", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "562", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "564", + "QuestType": "2", + "QuestLevel": "34", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "18600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "3736", + "RewardAmount1": "1", + "RewardItem2": "3728", + "RewardAmount2": "5", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "3753", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "3754", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Costly Menace", + "LogDescription": "Darren Malvew of Southshore wants you to kill 8 Mountain Lions and 10 Hulking Mountain Lions.", + "QuestDescription": "Ain't nothin' that irks me more than losin' these here beautiful horses. And believe me, we've lost quite a few between them pesky undead creeps, the dang Syndicate gang and all the other good-for-nothin' scoundrels pokin' about these parts.$b$bBut I swear on my ol' grand-daddy's grave there ain't no bigger menace to our horses here than them Mountain Lions up in Alterac. Always comin' down from the hills and makin' my life difficult!$b$bYou fancy yourself a hero? Go and do somethin' about it then!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Darren Malvew at Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2406", + "RequiredNpcOrGo2": "2407", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "8", + "RequiredNpcOrGoCount2": "10", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "565", + "QuestType": "2", + "QuestLevel": "34", + "MinLevel": "29", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "18600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "2805", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Bartolo's Yeti Fur Cloak", + "LogDescription": "Bring Bartolo Ginsetti of Southshore a Bolt of Wool, a Hillman's Cloak, Fine Thread and 10 clumps of Yeti Fur.", + "QuestDescription": "I, the great Bartolo, shall make for you the world famous, Alliance renowned, Yeti Fur Cloak!$b$bTravel the planet and find yourself a better cloak, I dare you. Oh wait, what is that, little $r? \"Bartolo, there is no finer cloak!\" Yes, yes! That, I have heard before.$b$bBartolo requires a Bolt of Wool, a Hillman's Cloak made by a skilled leatherworker, Fine Thread and Yeti Fur, of course! Bring to me these items and you shall be a happy customer!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Bartolo Ginsetti at Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "2997", + "RequiredItemId2": "2321", + "RequiredItemId3": "3719", + "RequiredItemId4": "3720", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "1", + "RequiredItemCount3": "1", + "RequiredItemCount4": "10", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "657", + "QuestType": "2", + "QuestLevel": "36", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "0", + "RewardMoney": "0", + "RewardBonusMoney": "0", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Hints of a New Plague?", + "LogDescription": "Speak to Kinelory near Go'Shek Farm in Arathi Highlands.", + "QuestDescription": "$B$BThis IS interesting. Seems Apothecary Jorell has been working on some deadly experiments here at Go'Shek. Not sure what that has to do with Hillsbrad, but Phin wouldn't like it if we let it continue.$B$BWe had a run-in with some orcs while you were gone, and I'm not in good enough shape to help Kinelory. If you're up for it, she's going to need some protection when she goes down to the farm to steal whatever research Jorell still hasn't sent to Tarren Mill.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "658", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "658", + "QuestType": "2", + "QuestLevel": "36", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "657", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "21000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Hints of a New Plague?", + "LogDescription": "Find the Forsaken Courier and bring back her Sealed Folder to Quae near the Go'Shek Farm.", + "QuestDescription": "So, Phin sent you to check on us? Not surprised--he worries too much.$B$BWe've been watching the farm for days, and Kin claims she saw a courier come out of that small house to the south not long ago.$B$BShe talks a lot, but I can always trust her senses when we're in dangerous areas.$B$BYou wouldn't happen to be a skilled tracker, would you? We think the courier might be carrying notes to Tarren Mill. If we could get our hands on those documents, it might shed some light on what's happening in Hillsbrad.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Quae in Arathi Highlands.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "4482", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "659", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "659", + "QuestType": "2", + "QuestLevel": "33", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "658", + "RewardXPDifficulty": "3", + "RewardMoney": "0", + "RewardBonusMoney": "8700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "3", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Hints of a New Plague?", + "LogDescription": "Find Quae and Kinelory near the Go'Shek Farm in the Arathi Highlands.", + "QuestDescription": "Hail, and well met, $N. I lead a group of adventurers investigating odd happenings in this area.$B$BMy cousin in Hillsbrad recently put down his dog Stanley because the animal mystically grew to an immense size and savagely attacked anyone who came near him.$B$BI believe the undead are involved, and we're looking for signs to prove as much.$B$BTwo of my companions, Quae and Kinelory, headed to the Go'Shek Farm in the Arathi Highlands, and haven't checked in for days. Find them for me? I grow concerned.", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "660", + "QuestType": "2", + "QuestLevel": "37", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "661", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "22200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16386", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Hints of a New Plague?", + "LogDescription": "Protect Kinelory until she returns to Quae.", + "QuestDescription": "All right, $N. I'm ready if you are.$B$BShall we?", + "AreaDescription": "Protect Kinelory", + "QuestCompletionLog": "Return to Quae in Arathi Highlands.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "657", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "661", + "QuestType": "2", + "QuestLevel": "37", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "27600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "15455", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "15456", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "72", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Hints of a New Plague?", + "LogDescription": "Find Phin Odelic at Southshore in Hillsbrad Foothills.", + "QuestDescription": "I've seen Kinelory look way worse after a night in the tavern than she does now. You obviously did a good job protecting her.$B$BThese items she brought back from the farm should at least let Phin get an idea of what's going on out here in Arathi. Just to make sure there's no retaliation after your attack, we're going to stay here for a bit longer. Would you be willing to head back to Southshore and talk to Phin?", + "AreaDescription": "", + "QuestCompletionLog": "NULL", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "660", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "676", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "30", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "677", + "RewardXPDifficulty": "5", + "RewardMoney": "3000", + "RewardBonusMoney": "16200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "530", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Hammer May Fall", + "LogDescription": "Kill 8 Boulderfist Ogres and 10 Boulderfist Enforcers, then find Drum Fel in the Hammerfall outpost in Arathi Highlands.", + "QuestDescription": "Weaklings... all of them. You, $c, what are you looking at? Think you're something special, huh? Why not prove it?$B$BThe Hammerfall outpost in Arathi's under attack. Unless we send them help soon, their demise is imminent.$B$BBut before you go rushing off, you may want to test your skills first. Northeast of Stromgarde in Arathi is an ogre mound inhabited by the Boulderfist tribe. When you can handle the ogres and enforcers there, then report to Drum Fel in Hammerfall.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Drum Fel at Hammerfall in Arathi Highlands.", + "RequiredNpcOrGo1": "2562", + "RequiredNpcOrGo2": "2564", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "8", + "RequiredNpcOrGoCount2": "10", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "9435", + "QuestType": "2", + "QuestLevel": "29", + "MinLevel": "25", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "2500", + "RewardBonusMoney": "14100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16392", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "930", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Missing Crystals", + "LogDescription": "Retrieve the Shipment of Rare Crystals from the Forsaken and return it to Huraan in Southshore.", + "QuestDescription": "If there's one great truth about Hillsbrad, it's that this region is destined to live under the shadow of war. Even something as innocuous as a cartload of stone is a target.$B$BNormally the loss of building materials is no great setback, but the most recent shipment from the Azurelode mine contained a crate of rare crystals I was eager to study. Forsaken raiders intercepted the cart and drove it northeast to a tower they're attempting to rebuild. It's imperative that we retrieve those crystals, $c!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Huraan at Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "23646", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2098253", + "SourceSpellID": "0" + }, + { + "ID": "14351", + "QuestType": "2", + "QuestLevel": "32", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "16200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "3701", + "Flags": "16384", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "3760", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "6282", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "3761", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "3822", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DEPRECATED] Battle of Hillsbrad", + "LogDescription": "Take Darthalia's Sealed Commendation to Bragor Bloodfist in the Undercity.", + "QuestDescription": "Because you fought with such valor and perseverance in the Battle of Hillsbrad, I have written this commendation, extolling your heroics in combat for the high command to recognize.$b$bTake this sealed commendation to Bragor Bloodfist in the Undercity. Go with pride, $c.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Bragor Bloodfist at Lordamere Lake in Silverpine Forest.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3701", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "NULL", + "QuestGiverTargetName": "NULL", + "QuestTurnTextWindow": "NULL", + "QuestTurnTargetName": "NULL", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "541", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "8388607", + "SourceSpellID": "0" + }, + { + "ID": "28089", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28096", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "262152", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Warchief's Command: Hillsbrad Foothills!", + "LogDescription": "Report to High Executor Darthalia at Southpoint Gate in Hillsbrad Foothills.", + "QuestDescription": "All able bodied members of the Horde are hereby ordered to report to High Executor Darthalia at Southpoint Gate in Hillsbrad Foothills. The Forsaken war machine marches ever onward, securing Lordaeron for the Horde!$B$BTo reach Southpoint Gate you must follow the road south through Silverpine Forest and take the east fork leading into Hillsbrad Foothills.$B$BOnward, $g brother:sister;! Destiny calls!", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "28096", + "ExclusiveGroup": "28089", + "AllowableClasses": "0", + "AllowableRaces": "946", + "SourceSpellID": "0" + }, + { + "ID": "28096", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28111", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "62932", + "Flags": "11534344", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "62932", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "65711", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65693", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65671", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Welcome to the Machine", + "LogDescription": "Hand out 3 Quests.", + "QuestDescription": "Come in here dear $g boy:girl;, have a cigar. You're gonna go far and fly high as a ranking officer of the Forsaken. Yes, indeed, this is the good life and you are going to live it!$B$BI want you to take these orders and dispense them to the lowly scrubs that come along looking for work. Who you give what to is wholly at your discretion.$B$BWhen you're ready, mount up on my trusty skeletal steed - so they don't miss you - and start living the life! Which means just stand there and wait.", + "AreaDescription": "", + "QuestCompletionLog": "Report to High Executor Darthalia at Southpoint Gate in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47444", + "RequiredNpcOrGo2": "47443", + "RequiredNpcOrGo3": "47442", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "1", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "First Quest Dispensed", + "ObjectiveText2": "Second Quest Dispensed", + "ObjectiveText3": "Third Quest Dispensed", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28111", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28138", + "RewardXPDifficulty": "1", + "RewardMoney": "0", + "RewardBonusMoney": "960", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8650760", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "1", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Trouble at Azurelode", + "LogDescription": "Report to Captain Keyton at the Azurelode Mine in Hillsbrad Foothills.", + "QuestDescription": "Productivity from our spider farm at the Azurelode Mine is at a standstill. Captain Keyton has requested that we send help immediately. Keyton claims that the mine spiders refuse command and are running rampant. Furthermore, a group of coastal murlocs are raiding our supplies. I want you to go down there and check things out. Help out Keyton and the spider-handler, $N.$B$BYou'll find Azurelode Mine to the southeast, near the coast.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28096", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28114", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "540016648", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65710", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65692", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65670", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Glorious Harvest", + "LogDescription": "Recover 60 Creeper Eggs.", + "QuestDescription": "Directly southeast of Southpoint Gate you will find our spider domestication operations. Through the years we have grown a kinship with the spiders of Hillsbrad and have managed to domesticate and breed the adorable little critters. Spiders now serve us as regular household pets and beasts of battle! Such diverse creatures they are!$B$BI need you to head into the fields to the southeast and carefully harvest the eggs that we have incubating on the bears. Deliver the harvest to Sarus at the mine.", + "AreaDescription": "", + "QuestCompletionLog": "Deliver the Creeper Eggs to Spider-Handler Sarus at Azurelode Mine in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63029", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "60", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28115", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Past Their Prime", + "LogDescription": "Kill 8 Infested Bears.", + "QuestDescription": "Bears are soulless beasts put upon this earth to torment us. Only through Forsaken ingenuity have we devised a way to make use of the bears so that they may serve some purpose! We use the bears at our spider farm as living egg feeders. Our spiders lay their eggs in the bear flesh and the eggs thrive off of the meat and blood of the beasts.$B$BAfter they have served their purpose the monsters must be put down. Travel southeast and kill the infested bears that have lived past their prime.", + "AreaDescription": "", + "QuestCompletionLog": "Report to Spider-Handler Sarus at Azurelode Mine in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47204", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "8", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28138", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "7", + "RewardMoney": "0", + "RewardBonusMoney": "14100", + "RewardDisplaySpell": "0", + "RewardSpell": "88794", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "63079", + "Flags": "540016648", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "63079", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "65709", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65690", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65668", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Human Infestation", + "LogDescription": "Capture 8 Hillsbrad Humans.", + "QuestDescription": "This mine was once the heart of Alliance mining operations in Hillsbrad. It now serves as a breeding ground for our loyal spiders, though, the humans still occupy it - in a way.$B$B$B$BBut onto business! Warden Stillwater has called for more workers at the Sludge Fields. I want you to enter the mine with these shackles and capture Hillsbrad humans for labor in the fields.$B$BBreak them out of their web paralysis and beat them into submission before you use the shackles.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Captain Keyton at the Azurelode Mine in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47697", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "8", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Hillsbrad Human Captured", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28111", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28144", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28168", + "RewardXPDifficulty": "5", + "RewardMoney": "1200", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "545259528", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Thieving Little Monsters!", + "LogDescription": "Recover 6 Forsaken Camp \"Supplies.\"", + "QuestDescription": "The long stretch of coastline directly south of our position that extends from west to east is known as the Western Strand. Along the Western Strand you will find two things: murlocs and our stolen \"supplies.\"$B$B$B$BThose damned thieving murlocs struck while our backs were turned and took our \"supplies.\"$B$BSarus and I cannot leave this post. We need you to head to the Western Strand and recover those \"supplies!\"", + "AreaDescription": "", + "QuestCompletionLog": "Return to Captain Keyton at the Azurelode Mine in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63082", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "6", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28146", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "1200", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "88763", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "3145736", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Coastal Delicacies!", + "LogDescription": "Feed the Hungry Mine Spider 12 Murlocs from the Western Strand.", + "QuestDescription": "My spiders are hungry and agitated! They haven't eaten for days and are starting to sample our human captives. We can't have that. We need those humans for use in the Sludge Fields.$B$BI want you to take one of my hungry mine spiders out and feed it murlocs from the Western Strand, south of here. Whatever you kill, it'll eat! The more the better!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Spider-Handler Sarus at the Azurelode Mine in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47752", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "12", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Murlocs fed to Hungry Mine Spider", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28154", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "63090", + "Flags": "262144", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65691", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65669", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Muckgill's Flipper or Something...", + "LogDescription": "Deliver Muckgill's Flipper back to Captain Keyton at the Azurelode Mine in Hillsbrad Foothills.", + "QuestDescription": "This looks like Muckgill's flipper or something. Maybe there's somebody that cares that you killed this murloc back at the Azurelode Mine camp. Probably not, but it's worth a shot.$B$BTake Muckgill's fin or whatever it might be back to Captain Keyton at the Azurelode Mine in southwestern Hillsbrad.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63090", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28156", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "84", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "7", + "RewardMoney": "3500", + "RewardBonusMoney": "14100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "2", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Deep Mine Rescue", + "LogDescription": "Escort Dumass to Safety!", + "QuestDescription": "$B$BHI! SPIDERS EVERYWHERE! THE CAPTAIN SENT ME TO SAVE THE WORLD AND CAPTURE HUMANS! WHAT IS THIS PLACE ANYWAY? IT'S SO HOT! I...$B$B$B$BPerhaps you should cut him free and get him back to safety. Or you can just leave him here, though it's your fault that he's stuck in this mine.", + "AreaDescription": "Escort Dumass to Safety!", + "QuestCompletionLog": "Speak to Captain Keyton at the Azurelode Mine in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28168", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28192", + "RewardXPDifficulty": "1", + "RewardMoney": "0", + "RewardBonusMoney": "1020", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8650760", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "1", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Trouble at the Sludge Fields", + "LogDescription": "Report to Warden Stillwater at the Sludge Fields in Hillsbrad Foothills.", + "QuestDescription": "Warden Stillwater, over at the Sludge Fields, north of here, has sent out a distress signal. The missive wasn't clear, but from what I could make of the letter there's a riot happening at the Sludge Fields and most of the guards have been killed. The warden has warned that any would-be-heroes approach from the back entry, located on the western side of the Sludge Fields.$B$BHe's also asked for discretion. He doesn't want news of this little *ahem* uprising to surface.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28144", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28189", + "QuestType": "2", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "7", + "RewardMoney": "0", + "RewardBonusMoney": "14100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "63150", + "Flags": "1245184", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "65667", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "63150", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Do the Right Thing", + "LogDescription": "\"Save\" 15 Human Seedlings.", + "QuestDescription": "You have come upon a horrific scene. Someone or something has buried all of the humans up to their necks in a manner consistent with planting. The ghouls, which are seemingly tending the field of human seedlings, periodically jump to the nearest human and devour its head!$B$BYou can end this right here and now. Take this shovel and \"save\" the humans.$B$BDo the right thing.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "47872", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "15", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Human Seedling \"saved\"", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28192", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28197", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9900", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "1048578", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "No One Here Gets Out Alive", + "LogDescription": "Assess the situation at the Sludge Fields.", + "QuestDescription": "This farm is under lockdown! Nothing gets in and nothing gets out! We're still assessing the situation to try and figure out exactly what happened, but my theory is that the laborers ate the mushrooms and somehow mutated into hideous undead monsters. I mean, how else could this have happened? This is just a farm! We grow mushrooms here! And sludge! Yes, sludge!$B$BTake a look around, $c, because now that you're here you can't leave until this issue is resolved.$B$BSee for yourself!", + "AreaDescription": "Assess the situation at the Sludge Fields.", + "QuestCompletionLog": "Speak with Warden Stillwater at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28168", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28196", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28206", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "12300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "63249", + "Flags": "8650752", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Battle for Hillsbrad", + "LogDescription": "Deliver the Battle for Hillsbrad to Warden Stillwater at the Sludge Fields in Hillsbrad Foothills.", + "QuestDescription": "The journal documents the last 62 days of Clerk Horrace Whitesteed's life. In it is written damning allegations against Warden Stillwater and his activities at the Sludge Fields.$B$BYou should show this to the warden. He will undoubtedly have an explanation for what is written in this journal.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63249", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28192", + "NextQuestID": "28206", + "ExclusiveGroup": "28196", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28197", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28206", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9900", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8388616", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65712", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65694", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65672", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Discretion is Key", + "LogDescription": "Kill Citizen Wilkes and Clerk Horrace Whitesteed.", + "QuestDescription": "We must destroy all of the evidence, $N! Did I say evidence? I meant crazed undead! Anyway, discretion is key. We must not let the rampaging undead make it out of the Sludge Fields and no one outside of this institution must know about what happened here!$B$BDirectly southeast of here in what used to be the old mushroom farm you'll find a reanimated fiend known as Citizen Wilkes and his cohort, Clerk Horrace Whitesteed. They have been causing huge problems for my guards. Find them and kill them!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Warden Stillwater at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47791", + "RequiredNpcOrGo2": "47789", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28192", + "NextQuestID": "28206", + "ExclusiveGroup": "28196", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28199", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "1300", + "RewardBonusMoney": "9900", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "For Science!", + "LogDescription": "Recover 6 Flesh Samples.", + "QuestDescription": "Samples... yes... must have samples! These, ah, experiments... I mean, these unfortunate laborers must be studied.$B$BTravel southeast to the first farm and kill the risen ghouls. From their decrepit corpses you must recover flesh samples. Bring them to me!$B$B$B$BMust test!", + "AreaDescription": "", + "QuestCompletionLog": "Return the Flesh Samples to Flesh-Shaper Arnauld at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63254", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "6", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28206", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "3", + "RewardMoney": "0", + "RewardBonusMoney": "4950", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "262152", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "3", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Little Girl Lost", + "LogDescription": "Find Johnny \"Jenny\" Awesome at the Sludge Fields in Hillsbrad Foothills.", + "QuestDescription": "It was only yesterday that I sent her out to investigate the farm directly east of here, but it feels like an eternity has passed!$B$BI knew it was true love the minute I saw her. Her lovely blonde locks and the way they framed her perfect blood elf face... She melted my shriveled heart. I didn't want to send her out, but she was so demanding! I had to give her what she asked for! Who could refuse such a vision?$B$BAlas, poor Jenny Awesome has not returned! I fear the worst, $N. Find her!", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28209", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "9900", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65713", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65695", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65673", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Freedom for Lydon", + "LogDescription": "Recover Lydon's Cage Key.", + "QuestDescription": "This place is no farm! Stillwater has been experimenting on the humans of Hillsbrad. The monstrosities here are all his creations.$B$BThat's not the worst of it, $c. The aberrations that have the key to my cage are former Forsaken. Stillwater's experiments have the side effect of turning Forsaken into mindless zombies. Why do you think he's so afraid of letting this get out? He knows that such a crime is punishable by true death.$B$BGet me out of here! The infected sludge guards outside have the key!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Master Apothecary Lydon at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63281", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28230", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28235", + "RewardXPDifficulty": "6", + "RewardMoney": "2500", + "RewardBonusMoney": "12300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8388616", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Protocol", + "LogDescription": "Kill the Ray-Getz-Kalaba Monstrosity.", + "QuestDescription": "Before the warden receives his comeuppance we must deal with the outbreak. We cannot risk this contagion being released into the world.$B$BWithin the laborers' quarters, directly north of here, is a monstrosity Stillwater pieced together out of three farmers. This beast must be destroyed if we are to secure the Sludge Fields! Protocol demands it!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Master Apothecary Lydon at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47793", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28231", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "0", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "264", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65714", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65696", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65674", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "911", + "RewardFactionValue2": "6", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Do it for Twinkles", + "LogDescription": "Kill the Blacksmith Verringtan.", + "QuestDescription": "Warden Stillwater sent me out into the field to investigate the outbreak. When I arrived, Twinkles and I were charged by the lumbering monstrosity known as Verringtan. I was knocked off of Twinkles and immediately ran for my life. Twinkles, though, stayed behind and fought the beast off. Alas, she was defeated and then summarily planted in the soil as if she were some type of glorious star pony seedling.$B$BShe gave her life to defend me. Vengeance must be mine! If for nothing else, do it for Twinkles!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Johnny Awesome at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47792", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28235", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28237", + "RewardXPDifficulty": "6", + "RewardMoney": "2500", + "RewardBonusMoney": "12300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "12582920", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Burnside Must Fall", + "LogDescription": "Kill Magistrate Burnside.", + "QuestDescription": "Magistrate Burnside was once the mayor of this region. In life he was a formidable adversary in the battle over Hillsbrad. In undeath he will surely test us.$B$BBurnside channels great arcane magic in the northwest section of the Sludge Fields. Lead us there and together we shall put an end to his rule, once and for all.", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Master Apothecary Lydon at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "47790", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28230", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28237", + "QuestType": "2", + "QuestLevel": "21", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28251", + "RewardXPDifficulty": "7", + "RewardMoney": "0", + "RewardBonusMoney": "15000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "15728640", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65715", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65697", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65675", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "A Blight Upon the Land", + "LogDescription": "Take the Head of Warden Stillwater.", + "QuestDescription": "With the undead outbreak contained, the time has come for Stillwater and his followers to answer for their crimes. Though we averted a tragedy the likes of which has not been seen since the Scourge invaded, we must ensure that such a thing can never happen again. They will all face true death!$B$BCome, $N! I will have Stillwater's head!", + "AreaDescription": "", + "QuestCompletionLog": "Give the Head of Warden Stillwater to Master Apothecary Lydon at the Sludge Fields in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63330", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28235", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28251", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28324", + "RewardXPDifficulty": "2", + "RewardMoney": "0", + "RewardBonusMoney": "2640", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8650760", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "2", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Trouble at Southshore", + "LogDescription": "Speak to Serge Hinott at the Ruins of Southshore in Hillsbrad Foothills.", + "QuestDescription": "Before my capture and imprisonment, I was stationed at Southshore. My primary job at the ruins was to take slime samples and make sure that the blight that we released was safely dissipating. Simple and easy if not for the worgen that would continuously harass us.$B$BI need you to head to Southshore and find my apprentice, Serge Hinott. Make sure that he's ok and inform him that I will return once my work here has concluded.$B$BYou'll find the Ruins of Southshore to the southeast, near the coast.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28237", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28324", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "1400", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "63426", + "Flags": "0", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "63426", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Studies in Lethality", + "LogDescription": "Recover 250 Blight Samples.", + "QuestDescription": "We used a fairly potent strain of blight against the humans of Southshore. As you can see, it worked. The trouble with blight use, though, is that blight tends to stick around after it's served its purpose.$B$BWhat I need from you is to take this testing kit and get out into the field to get a lethality count from the blight slimes that we've released into the area. Use the lethality analyzer on the blight slimes sweeping the slime pools. Come back to me when you have some solid data.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Serge Hinott at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48290", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "250", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Blight Sample taken", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28251", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28325", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "1400", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Green Living", + "LogDescription": "Recover 8 Used Blight Canisters.", + "QuestDescription": "Recycling! It's all the craze these days. The Banshee Queen has decreed that we must conserve if we are to prosper as a people. Everyone must do their part, right? With that said, you will be doing our part for us.$B$BThere are likely thousands of blight canister bits and pieces all over Southshore. We can reuse those canisters for more blight bombing goodness. Just head into the ruins here and pick up whatever you can find.\\n", + "AreaDescription": "", + "QuestCompletionLog": "Return to Serge Hinott at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "63432", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "8", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28329", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28330", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "89457", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "146341888", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "36106", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Angry Scrubbing Bubbles", + "LogDescription": "Kill 5 Angry Blight Slimes.", + "QuestDescription": "These blight slimes seem to be really angry. They've even got a faint outline of an angry humanoid face in their ectoplasm. You don't think Hinott would be too happy about having non-compliant slimes working the slime pools.$B$BKill any angry blight slimes that you see and try to get a lock on a breeding pool.", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Serge Hinott at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48319", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "5", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Perhaps it was beaten as a young slime.", + "QuestGiverTargetName": "Angry Slime", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28330", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "1", + "SuggestedGroupNum": "2", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "13200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "134742016", + "MinimapTargetMark": "1", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "36110", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65718", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65700", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65679", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Trail of Filth", + "LogDescription": "Kill Chet the Slime-Breeder.", + "QuestDescription": "The trail of filth and anger leads into the ruined town hall. Surely there is a slime breeding pool inside the structure. Fight your way inside and deal with whatever angry slime-breeder that you encounter!$B$BShould you succeed Serge Hinott at the Ruins of Southshore will surely want to hear about it.", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Serge Hinott at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48322", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "You're stewed, buttwad!", + "QuestGiverTargetName": "Chet", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28329", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28331", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28344", + "RewardXPDifficulty": "7", + "RewardMoney": "0", + "RewardBonusMoney": "15600", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "63508", + "Flags": "8388616", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "65676", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "63508", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Helcular's Rod Giveth...", + "LogDescription": "Use Helcular's Rod to Empower 8 Dark Rangers.", + "QuestDescription": "To think, I, a master of necromancy, trained by Kel'Thuzad himself, was reduced to nothing more than a corpse in a grave. Thankfully, my astute apprentice, Thaivand, managed to find a group of heroes to recover this:$B$B$B$BIt is through the power of the rod that I was reborn. The rod giveth and the rod taketh away!$B$BTake it now and use it to empower our dark rangers battling the worgen in the field north of us. Renew their vigor with my rod.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Helcular at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48269", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "8", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Dark Ranger empowered", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "28344", + "ExclusiveGroup": "28331", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28332", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28344", + "RewardXPDifficulty": "5", + "RewardMoney": "1400", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8388616", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Helcular's Command", + "LogDescription": "Kill 15 Bloodfang Forsaken Hunters.", + "QuestDescription": "Our dark rangers search the fields for worgen terrorists. These worgen have been sent out by their dark masters to hunt and kill us. And though a dark ranger is a formidable combatant, the worgen often attack in packs, which can overwhelm even a dark ranger.$B$BSearch the fields around the ruins of Southshore for Bloodfang forsaken hunters. Kill any that you see! For the Forsaken and for Lordaeron!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Helcular at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48272", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "15", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "28344", + "ExclusiveGroup": "28331", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28344", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28345", + "RewardXPDifficulty": "1", + "RewardMoney": "0", + "RewardBonusMoney": "1080", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8650760", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "1", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Can You Smell What the Lok'tar is Cooking?", + "LogDescription": "Find Kingslayer Orkus at the Ruins of Southshore in Hillsbrad Foothills.", + "QuestDescription": "Shortly before you arrived an orc flew in upon a frost wyrm and demanded that I direct him to where the 'newbies were hanging out.' Uncertain as to the vernacular, I told him to fulfill his duty as a member of the Horde and deal with the worgen threat of the area. He grumbled something about 'what the lok'tar was cooking' and headed south to the docks.$B$BOrdinarily I wouldn't care about whether or not an orc went missing, but I am genuinely curious about what the lok'tar might be cooking. Find out.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28345", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28348", + "RewardXPDifficulty": "3", + "RewardMoney": "700", + "RewardBonusMoney": "5250", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "11534346", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "3", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "3", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "*Gurgle* HELP! *Gurgle*", + "LogDescription": "Help Kingslayer Orkus get out of the water.", + "QuestDescription": "*GURGLE*$B$BHELP!*GASP*$B$BORKUS IS DROWNING! HELP ME, QUEST GIVER $N!$B$B*GLUB*$B$BDwarf threw Orkus into the water! Must not die!$B$B*GURGLE*$B$BThe shame would be too great.", + "AreaDescription": "Orkus Safely Escorted Out of the Water", + "QuestCompletionLog": "Speak to Kingslayer Orkus at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28344", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28348", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28354", + "RewardXPDifficulty": "5", + "RewardMoney": "1400", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "9437186", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Stormpike Rendezvous", + "LogDescription": "Learn about the Stormpike Rendezvous from Orkus.", + "QuestDescription": "I tracked down the decrepit necromancer, Helcular, in hopes of getting a lead on Alliance movement within Hillsbrad.$B$BHelcular tasked me with finding and killing worgen. Ordinarily this would not be a problem for Orkus, but I had just eaten several helpings of Dirge's Kickin' Chimaerok chops, causing my bowels to cry out in anguish. That's when the trouble began and how I ended up in the water.$B$BHear Orkus out, $N.", + "AreaDescription": "Learn about the Stormpike rendezvous", + "QuestCompletionLog": "Speak to Kingslayer Orkus at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28345", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28354", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65717", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65699", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65678", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Kasha Will Fly Again", + "LogDescription": "Gather 8 Mudsnout Blossoms.", + "QuestDescription": "Kasha will fly again, $N. She must if we are to claim vengeance! Sadly, Orkus must stay here with Kasha. You must help us. I beg of you!$B$BListen carefully, quest giver. When I first arrived here I flew around for days to learn the lay of the land. There is a farm east of here that has long since been abandoned and is now overrun by gnolls. On this farm grows a special type of mushroom known as the mudsnout. Go to the stead and gather mudsnout for Kasha. Return here when your pack is full.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Kingslayer Orkus at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3502", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "8", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28348", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28355", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "1320", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "1900544", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Terrible Little Creatures", + "LogDescription": "Kill any 10 Gnolls at the Nethander Stead.", + "QuestDescription": "Gnolls! These terrible little creatures are a blight upon any land - which is saying a lot when you consider that Hillsbrad is Forsaken territory. Kill as many of the gnolls at the Nethander Stead as you can. For the good of the world!", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "2372", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Mudsnout Gnoll or Shaman slain", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28356", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "13200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "0", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65727", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65716", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65698", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "65677", + "RewardChoiceItemQuantity4": "1", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Preemptive Strike", + "LogDescription": "Kill any 15 Naga at the Eastern Strand.", + "QuestDescription": "These plans document what appears to be an imminent attack on Southshore. The naga of the Eastern Strand are planning to take over the town now that the Alliance has been pushed out.$B$BNot if you can help it!$B$BKill all of the naga on the Eastern Strand and report to Helcular at the Ruins of Southshore with the Daggerspine attack plan.", + "AreaDescription": "", + "QuestCompletionLog": "Report to Helcular at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "2371", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "15", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Daggerspine Naga slain", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28371", + "QuestType": "2", + "QuestLevel": "22", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "10500", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "1024", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "[DND] ORKUS QUEST FLAG [DO NOT LOCALIZE]", + "LogDescription": "Gather 8 Mudsnout Blossoms.", + "QuestDescription": "Kasha will fly again, $N. She must if we are to claim vengeance! Sadly, Orkus must stay here with Kasha. You must help us. I beg of you!$B$BListen carefully, quest giver. When I first arrived here I flew around for days to learn the lay of the land. There is a farm east of here that has long since been abandoned and is now overrun by gnolls. On this farm grows a special type of mushroom known as the mudsnout. Go to the stead and gather mudsnout for Kasha. Return here when your pack is full.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Kingslayer Orkus at the Ruins of Southshore in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "3502", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "8", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28375", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28397", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "11100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "1048578", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Road to Purgation", + "LogDescription": "Accompany Kingslayer Orkus to Purgation Isle.", + "QuestDescription": "The time of vengeance has come, $N. Kasha can once more fly, thanks to you. She will take us to Purgation Isle so that we may confront the Stormpike dwarf general, Vanndar Stormpike, and his captain, Balinda Stonehearth. BOTH will pay for what they have done.$B$BAre you ready? Orkus cannot do this alone.", + "AreaDescription": "The Road to Purgation taken", + "QuestCompletionLog": "Speak to Kingslayer Orkus at Purgation Isle in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28397", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "8", + "RewardMoney": "1500", + "RewardBonusMoney": "22200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "4194304", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "They Will Never Expect This...", + "LogDescription": "Kill 8 Stormpike Dwarves and 8 Bloodfang Sentries on Purgation Isle.", + "QuestDescription": "They made a mistake by not killing me when they had the chance. Perhaps they thought Orkus would drown. HAH! Now they will pay the price for their carelessness.$B$BYou and I will tear this island apart, $N. They will never expect this! Once all of their soldiers are dead we will confront the leaders. Be on the lookout for attack plans. If we can get our hands on their plans we will be able to put a stop to their whole invasion!$B$BLet's go, $N!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Kingslayer Orkus at Purgation Isle in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48482", + "RequiredNpcOrGo2": "48484", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "8", + "RequiredNpcOrGoCount2": "8", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Stormpike Dwarf slain", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28375", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28400", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "8", + "RewardMoney": "6000", + "RewardBonusMoney": "22200", + "RewardDisplaySpell": "0", + "RewardSpell": "90414", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "6291458", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65728", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65719", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65701", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "65680", + "RewardChoiceItemQuantity4": "1", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "7", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Heroes of the Horde!", + "LogDescription": "Steal the Alliance Battle Plans and Become Heroes of the Horde.", + "QuestDescription": "Now to find their battle plans and take out their leaders! Should we succeed there is an orc high warlord who served in the war in Silverpine that is now stationed at Tarren Mill - located in the heart of Hillsbrad. He will grant both of us commendations for this! We will be heroes of the Horde, $N!$B$BOnward! Together we will defeat the Alliance filth!", + "AreaDescription": "Become Heroes of the Horde", + "QuestCompletionLog": "Give the Alliance Battle Plans to High Warlord Cromush at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "64307", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28484", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "11100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "65731", + "RewardAmount1": "12", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65720", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65702", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65682", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Heart of the Matter", + "LogDescription": "Collect 12 Beating Yeti Hearts.", + "QuestDescription": "The magus has been idle for far too long and an idle magus often leads to poorly thought out schemes. This time I am charged with collecting various beast organs in order to power some type of control rod. I am far too frail to go out hunting beasts - especially yetis!$B$BPerhaps if I were to offer you a reward of some kind you would do it? All I need is for you to head west to the yeti caves and kill yetis. Rip their still beating hearts from their chests and bring them back here.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Keeper Bel'varil at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "64380", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "12", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28485", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "1", + "SuggestedGroupNum": "3", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "8", + "RewardMoney": "0", + "RewardBonusMoney": "24000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "134217736", + "MinimapTargetMark": "16", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "31426", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65726", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65708", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65688", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Yetimus the Yeti Lord", + "LogDescription": "Take Yetimus' Twisted Horn.", + "QuestDescription": "For years the mountain yeti of this region have been allowed free reign. Our complacency in dealing with the yeti menace has resulted in an aberration! Yetimus, lord of all yetis, has grown to a size and strength that our guard simply cannot handle. We fear that should his appetite lead him near Tarren Mill he would devour us all.$B$BGather a party of suitable adventurers and dispatch the beast. He roams the countryside to the west.$B$BBring me one of his horns and I will reward you handsomely.", + "AreaDescription": "", + "QuestCompletionLog": "Return Yetimus' Twisted Horn to Deathguard Samsa at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "64386", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "The scourge of Darrow Hill.", + "QuestGiverTargetName": "Yetimus", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28487", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "1500", + "RewardBonusMoney": "11100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Humbert's Personal Problems", + "LogDescription": "Recover Humbert's Sword, Humbert's Helm, and Humbert's Pants.", + "QuestDescription": "So this is pretty embarrassing. Where to begin?$B$BWell, you see, Melisara sent me to investigate the yeti menace in the nearby caves, west of here. It was getting late and my armor was weighing heavily on me. I took my gear off and decided to take a stroll. Yes, I, erm, went for a walk. Anyway, when I returned I discovered that my gear had been stolen! It was the yetis. I'm sure of it. They took my pants, sword and helm and ran off into their cave. Get them back for me and I will reward you.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Deathguard Humbert at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "64390", + "RequiredItemId2": "64391", + "RequiredItemId3": "64393", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "1", + "RequiredItemCount2": "1", + "RequiredItemCount3": "1", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28489", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "3000", + "RewardBonusMoney": "11100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "65730", + "RewardAmount1": "3", + "RewardItem2": "65681", + "RewardAmount2": "1", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Stagwiches", + "LogDescription": "Retrieve 8 slabs of Stag Meat.", + "QuestDescription": "Ever had a stagwich? Me neither. Apparently they're delicious. Now I'm not one for eating, but I am a businessman. If my customers want stagwiches, who am I to argue?$B$BYou're probably asking yourself, \"What does this have to do with me?\" I'll tell you what, $c, I need stag meat! You get me stag meat from the hill stags of Hillsbrad and I will pay you. Sounds like a pretty good deal, doesn't it?$B$BGet going! Stags are most plentiful to the west.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Derak Nightfall at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "64410", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "8", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28495", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "1500", + "RewardBonusMoney": "11100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "64416", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "64416", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "911", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "A Fighting Chance", + "LogDescription": "Save 10 Hill Fawns.", + "QuestDescription": "Blessed be the Light! I need your help!$B$BOn my way into Hillsbrad I noticed several families of adorable little deer. As I went out to pet one of the little fawns a ravenous mountain cat leapt out and killed it. I fled to Tarren Mill and swore to solve the plight of the hill fawn. Now, after many days of tinkering, I have created the hill fawn's salvation!$B$BTake my wand into the fields to the west and use it to empower the wee hill fawns. Once empowered they will be able to fend for themselves!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Advisor Duskingdawn at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48684", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Hill Fawn \"saved\"", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28506", + "QuestType": "2", + "QuestLevel": "23", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28556", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "11100", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "1048578", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "March of the Stormpike", + "LogDescription": "See the March of the Stormpike.", + "QuestDescription": "These plans you recovered weave an interesting tale, $N. The Stormpike have been moving their armies from Alterac Valley into the \"four fingers\" of Hillsbrad for over a month. Somehow they have managed to secretly get their installations set up without our forces knowing. Had we not received these plans they would have marched on us in a week's time, annihilating everything in their path.$B$BWith these plans, though, we can turn the tables.$B$BThis is what we must do...", + "AreaDescription": "See the March of the Stormpike.", + "QuestCompletionLog": "Speak to High Warlord Cromush at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28600", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28538", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28566", + "RewardXPDifficulty": "7", + "RewardMoney": "0", + "RewardBonusMoney": "17400", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "64445", + "Flags": "65544", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "10702", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "64445", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Cry of the Banshee", + "LogDescription": "Use the Banshee Mirror to capture 10 SI:7 Agents.", + "QuestDescription": "So you are to be our savior? Very well then, I will bond myself with you. Through this bond I will be able to see through your eyes and communicate with you in the field.$B$BAccording to the plans you brought to us, the Stormpike have enlisted the aid of SI:7 at Sofera's Naze, to the north. SI:7 are comprised solely of humans - humans that we are able to use to our benefit.$B$BTake my mirror and travel north. Engage in combat with the SI:7 and bring them near death. Once they are injured, use the mirror.", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Melisara at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48752", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "SI:7 Agent captured", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "There is much more work to be done. Do not grow complacent.", + "QuestTurnTargetName": "Melisara", + "SoundAccept": "890", + "SoundTurnIn": "0", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28556", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "1440", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "64471", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "64471", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "65721", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65703", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65683", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "6", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Breaking the Hand", + "LogDescription": "Plant a Goblin Pocket-Nuke at Sofera's Naze, Corrahn's Dagger, the Headland and Gavin's Naze.", + "QuestDescription": "We must break the fingers of the Stormpike if we are to stop their incursion.$B$B$B$BWithin this package are four high-yield goblin explosives. You are to infiltrate each of the four fingers - Sofera's Naze, Corrahn's Dagger, the Headland and Gavin's Naze - and plant a goblin pocket-nuke at each.$B$BOnce you have done that - as well as all that Melisara asks of you - return to me.", + "AreaDescription": "", + "QuestCompletionLog": "Return to High Warlord Cromush at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48862", + "RequiredNpcOrGo2": "48864", + "RequiredNpcOrGo3": "48865", + "RequiredNpcOrGo4": "48867", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "1", + "RequiredNpcOrGoCount4": "1", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Pocket-Nuke Armed at Sofera's Naze", + "ObjectiveText2": "Pocket-Nuke Armed at Corrahn's Dagger", + "ObjectiveText3": "Pocket-Nuke Armed at the Headland", + "ObjectiveText4": "Pocket-Nuke Armed at Gavin's Naze", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28506", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28566", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28603", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "11700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "134807552", + "MinimapTargetMark": "1", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "10702", + "QuestTurnInPortrait": "10702", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Decimation", + "LogDescription": "Kill Captain Iceheart and 12 Stormpike Soldiers.", + "QuestDescription": "$B$BThe Stormpike forward camp sits atop Corrahn's Dagger, west of Sofera's Naze. You must enter the camp and slaughter every dwarf that you see. They must be taught what it means to fear and there is no finer lesson than absolute decimation.$B$BNo survivors, $N. Even their captain - especially their captain - must die.$B$BI will be in contact.", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Melisara at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48880", + "RequiredNpcOrGo2": "48878", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "12", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "The Stormpike will learn what it means to fear.", + "QuestGiverTargetName": "Melisara", + "QuestTurnTextWindow": "Decimation leads to hesitation.", + "QuestTurnTargetName": "Melisara", + "SoundAccept": "1172", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28538", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28571", + "QuestType": "1", + "QuestLevel": "20", + "MinLevel": "19", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28096", + "RewardXPDifficulty": "1", + "RewardMoney": "0", + "RewardBonusMoney": "960", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "262152", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "1", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Warchief's Command: Hillsbrad Foothills!", + "LogDescription": "Report to High Executor Darthalia at Southpoint Gate in Hillsbrad Foothills.", + "QuestDescription": "All able bodied members of the Horde are hereby ordered to report to High Executor Darthalia at Southpoint Gate in Hillsbrad Foothills. The Forsaken war machine marches ever onward, securing Lordaeron for the Horde!$B$BTo reach Southpoint Gate you must follow the road south through Silverpine Forest and take the east fork leading into Hillsbrad Foothills.$B$BOnward, $g brother:sister;! Destiny calls!", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "28096", + "ExclusiveGroup": "28089", + "AllowableClasses": "0", + "AllowableRaces": "946", + "SourceSpellID": "0" + }, + { + "ID": "28587", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28600", + "RewardXPDifficulty": "1", + "RewardMoney": "0", + "RewardBonusMoney": "1200", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "1", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "1", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Aid of the Frostwolf", + "LogDescription": "Speak to Voggah Deathgrip at Alterac Mountains in Hillsbrad Foothills.", + "QuestDescription": "I will study the Stormpike battle plans and prepare for an assault. I need you to go to Alterac Valley and enlist the aid of the Frostwolf Clan: the very clan of our former warchief, Thrall. They will help us battle the Stormpike dwarves! Together, we will crush the invaders and see them driven out of Lordaeron for good!$B$BGo now, $N. Alterac Valley is northeast of Tarren Mill. Find Voggah Deathgrip and tell him that the Horde requires the aid of the Frostwolf!$B$BLOK'TAR!", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28600", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28506", + "RewardXPDifficulty": "5", + "RewardMoney": "1700", + "RewardBonusMoney": "11700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "1048578", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "5", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Matters of Loyalty", + "LogDescription": "Speak to Drek'Thar.", + "QuestDescription": "I have no authority over such matters. You must speak to our leader, Drek'Thar. I have already sent word of your arrival to Frostwolf Keep. Drek'Thar will be out to speak with you personally.", + "AreaDescription": "Learn of Matters of Loyalty.", + "QuestCompletionLog": "Return to High Warlord Cromush at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28587", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28603", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28605", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "11700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "16318464", + "MinimapTargetMark": "7", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "10994", + "QuestTurnInPortrait": "10994", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Infiltration", + "LogDescription": "Kill Instructor Rufus, Drill Sergeant Magnus and Captain Crudbeard.", + "QuestDescription": "For your next mission I want you to travel west to the Headland and infiltrate the Stormpike training grounds. Though there are hundreds of Stormpike trainees there, one of my banshees will disguise you to look like one of the humans captured earlier, allowing you to walk freely among the enemy.$B$BEnter the Headland and find the Stormpike instructors. Once found, coerce them into attacking you! When they attack, kill them. With their instructors dead, they will be unable to train more soldiers!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Melisara at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "48922", + "RequiredNpcOrGo2": "48923", + "RequiredNpcOrGo3": "48924", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "1", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Turn them against each other.", + "QuestGiverTargetName": "Melisara", + "QuestTurnTextWindow": "Confusion leads to chaos.", + "QuestTurnTargetName": "Melisara", + "SoundAccept": "1172", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28566", + "NextQuestID": "28605", + "ExclusiveGroup": "28603", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28604", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28605", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "14400", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "64583", + "Flags": "12582912", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "64583", + "ItemDropQuantity4": "1", + "RewardChoiceItemID1": "65729", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65722", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65704", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "65684", + "RewardChoiceItemQuantity4": "1", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Deception and Trickery", + "LogDescription": "Use the Barrel of Water to Poison 30 Stormpike Trainees.", + "QuestDescription": "As long as I am by your side the enemy will think of you as one of their own. Your newfound humanity, however, will not allow you to be reckless. If you draw attention to yourself the dwarves will grow suspicious and likely attack!$B$BWith that said, I have a plan. Take this barrel of poisoned water and use it to sate the thirst of the tired Stormpike trainees. Once they drink from it they will become deathly ill, eventually succumbing to the poison.", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Lilith in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49037", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "30", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Stormpike Trainee poisoned", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28566", + "NextQuestID": "28605", + "ExclusiveGroup": "28603", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28605", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "6700", + "RewardBonusMoney": "11700", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "4718592", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "10994", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Domination", + "LogDescription": "Kill 10 Stormpike Engineers.", + "QuestDescription": "$B$BThe last task will be an assault against the siege technicians of Gavin's Naze, located west of the Headland. Venture to the final finger and lay waste to the dwarf and gnome engineers that build and fortify the Stormpike machines of war. Be sure to plant Cromush's final pocket-nuke as well.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Melisara at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49116", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Domination leads to victory!", + "QuestGiverTargetName": "Melisara", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "1172", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28616", + "QuestType": "2", + "QuestLevel": "24", + "MinLevel": "21", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "8", + "RewardMoney": "6700", + "RewardBonusMoney": "23400", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "1048578", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "3", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65723", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65705", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65685", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "76", + "RewardFactionValue2": "7", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Stormpike Apocalypse", + "LogDescription": "Witness the Stormpike Apocalypse.", + "QuestDescription": "Before we continue, let us have a moment of silence for our fallen brother, Orkus, for without him, we would have been destroyed by the Stormpike onslaught. This is for you, brother!$B$B$B$BNow, $N, do not think that I forgot your part in all of this! That is why you get the honors of detonating the goblin pocket-nukes.$B$BAre you ready? FOR THE HORDE!", + "AreaDescription": "Witness the Stormpike Apocalypse.", + "QuestCompletionLog": "Speak to High Warlord Cromush at Tarren Mill in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28617", + "QuestType": "2", + "QuestLevel": "-1", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28744", + "RewardXPDifficulty": "5", + "RewardMoney": "125", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "2152726592", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Flower Power", + "LogDescription": "Survive a Massive Wave of Zombies.", + "QuestDescription": "You know how to use the spitters, but did you know that if you use a sunflower you can grow things faster? We'll grow some sunflowers and then we'll plant some spitters to push back Warden Stillwater's crazed monstrosities.$B$BLet's go!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Brazie the Botanist at Brazie's Farmstead in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "49542", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Waves Survived", + "ObjectiveText2": "Massive Wave Survived", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28733", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28620", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28634", + "RewardXPDifficulty": "2", + "RewardMoney": "0", + "RewardBonusMoney": "3000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8650760", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "2", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Eastpoint Tower", + "LogDescription": "Speak to Nils Beerot at Eastpoint Tower in Hillsbrad Foothills.", + "QuestDescription": "Our outpost in the southeast is having some problems. I don't have any details other than... well, let me just read from the latest letter:$B$B\"The orcs have grown petulant. Send help or I will have them beaten with reeds.\"$B$BThat's it. It was sent from our chief psylosopher, Nils Beerot. Yea, I have no idea what that means either. Could you please head to Eastpoint Tower and find out what he needs? I can't take any more of these cryptic letters!$B$BJust head south and then follow the road east.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28634", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "3500", + "RewardBonusMoney": "12000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Extinction", + "LogDescription": "Kill 12 Rampaging Owlbeasts.", + "QuestDescription": "Owlbeasts... Soulless, feathered monstrosities sent from the darkest depths of the Twisting Nether to prey upon the weak.$B$B$B$BThey surround us on all sides and they are planning an attack - I can sense it. You must stop them before they can organize.$B$BI want you to head into the forest and kill every owlbeast that you see. NONE SHOULD SURVIVE!", + "AreaDescription": "", + "QuestCompletionLog": "Return to Nils Beerot at Eastpoint Tower in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49245", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "12", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28620", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28635", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28636", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "12000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "12", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "A Haunting in Hillsbrad", + "LogDescription": "Search Dun Garok for evidence of a haunting.", + "QuestDescription": "The battle over Dun Garok was the bloodiest of all the Hillsbrad battles. The dwarves, outnumbered ten-to-one, fought until the bitter end. Every last one of 'em died in defense of that piece of land.$B$BNow I hear claims that the place is haunted. Nobody wants to go near it! Unfortunately I have orders to prepare Dun Garok for habitation.$B$BCould you do me a favor and go to Dun Garok and search for evidence of a haunting? It's far to the southeast.", + "AreaDescription": "Search Dun Garok for Evidence of a Haunting.", + "QuestCompletionLog": "Speak to Captain Ironhill's Ghost at Dun Garok in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28636", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "0", + "RewardBonusMoney": "12000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "8", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65724", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65706", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65686", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "5", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Silence of the Dwarves", + "LogDescription": "Kill 10 Dun Garok Spirits.", + "QuestDescription": "The spirits of my soldiers haunt this fort now, $g lad:lass;. Their souls are now bound to this place. Even in death they continue to fight for it. 'Tis sad.$B$BPut 'em out o' their misery and perhaps ye shall have the spoils of yer people's victory.", + "AreaDescription": "", + "QuestCompletionLog": "Return to Captain Jekyll at Eastpoint Tower in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49269", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "10", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28635", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28643", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "1", + "SuggestedGroupNum": "3", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28644", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "15300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "64666", + "Flags": "134283272", + "MinimapTargetMark": "1", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "36061", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Durnholde Challenge: Zephyrus", + "LogDescription": "Kill Zephyrus.", + "QuestDescription": "Durnholde Keep has always been a place of strife. For years the humans used it as an internment camp and prison for the orcs. After that it was taken over by the Syndicate. Now? The Dark Lady captured and placed powerful elementals within its walls. She charged me with administering \"The Durnholde Challenge.\" Any that can defeat all of the elementals will earn a grand prize! Take this guide and face your first challenge: Zephyrus!$B$BDurnholde is located just northeast of us.", + "AreaDescription": "", + "QuestCompletionLog": "Report to Captain Jekyll at Eastpoint Tower in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49263", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Minion of Al'Akir", + "QuestGiverTargetName": "Zephyrus", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28644", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "1", + "SuggestedGroupNum": "3", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28645", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "15300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "134807552", + "MinimapTargetMark": "1", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "36122", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Durnholde Challenge: Teracula", + "LogDescription": "Kill Teracula.", + "QuestDescription": "According to the guide, Teracula is your next challenge. It roams the path just outside of Zephyrus' lair.", + "AreaDescription": "", + "QuestCompletionLog": "Report to Captain Jekyll at Eastpoint Tower in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49265", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Minion of Therazane", + "QuestGiverTargetName": "Teracula", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28643", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28645", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "1", + "SuggestedGroupNum": "3", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28646", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "15300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "134807552", + "MinimapTargetMark": "1", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "36429", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Durnholde Challenge: Bloodvenom", + "LogDescription": "Kill Bloodvenom.", + "QuestDescription": "According to the guide, Bloodvenom is your next challenge. The fearsome elemental can be found on the lower level of Durnholde Keep, near the western prisons.", + "AreaDescription": "", + "QuestCompletionLog": "Report to Captain Jekyll at Eastpoint Tower in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49264", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Minion of Neptulon", + "QuestGiverTargetName": "Bloodvenom", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28644", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28646", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "1", + "SuggestedGroupNum": "3", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28647", + "RewardXPDifficulty": "6", + "RewardMoney": "0", + "RewardBonusMoney": "15300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "134807552", + "MinimapTargetMark": "1", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "36434", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "6", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Durnholde Challenge: Infernus", + "LogDescription": "Kill Infernus.", + "QuestDescription": "According to the guide, Infernus is your next challenge. This being, made of molten lava and raging fire, can be found on the lower level of Durnholde Keep, near the eastern prisons.", + "AreaDescription": "", + "QuestCompletionLog": "Report to Captain Jekyll at Eastpoint Tower in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49266", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Minion of Ragnaros", + "QuestGiverTargetName": "Infernus", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28645", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28647", + "QuestType": "2", + "QuestLevel": "25", + "MinLevel": "23", + "QuestSortID": "267", + "QuestInfoID": "1", + "SuggestedGroupNum": "3", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "8", + "RewardMoney": "7300", + "RewardBonusMoney": "24000", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "134742016", + "MinimapTargetMark": "1", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "36435", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65725", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65707", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "65687", + "RewardChoiceItemQuantity3": "1", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "68", + "RewardFactionValue1": "7", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "The Durnholde Challenge: D-1000", + "LogDescription": "Kill the D-1000.", + "QuestDescription": "Imprisoned in the old Durnholde Keep arena is a being comprised of pure mercury. The Forsaken have dubbed it the D-1000. Kill the D-1000 and claim your prize!", + "AreaDescription": "", + "QuestCompletionLog": "Report to Captain Jekyll at Eastpoint Tower in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "49268", + "RequiredNpcOrGo2": "0", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "1", + "RequiredNpcOrGoCount2": "0", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "Minion of Blue", + "QuestGiverTargetName": "D-1000", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28646", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28733", + "QuestType": "2", + "QuestLevel": "-1", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28617", + "RewardXPDifficulty": "5", + "RewardMoney": "94000", + "RewardBonusMoney": "165400", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "2152726592", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Basic Botany", + "LogDescription": "Survive a Massive Wave of Zombies.", + "QuestDescription": "HELP! HELP! Crazed undead are attacking my farm! That psycho warden over at the Sludge Fields is probably responsible for this mess. Help me fight off the zombies!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Brazie the Botanist at Brazie's Farmstead in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "49189", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "", + "ObjectiveText2": "Massive Wave Survived", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28744", + "QuestType": "2", + "QuestLevel": "-1", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28747", + "RewardXPDifficulty": "5", + "RewardMoney": "125", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "2152726592", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Ghouls Hate My Grains", + "LogDescription": "Survive 2 Massive Waves of Zombies.", + "QuestDescription": "You're a pro at this, $N! A regular junior botanist! Listen, I've got a new seed to try called the rocknut. Use it to block the undead. Just drop it down and they'll stop dead in their tracks. Undead are so stupid!$B$BLet's give it a try!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Brazie the Botanist at Brazie's Farmstead in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "49553", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "2", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Waves Survived", + "ObjectiveText2": "Massive Wave Survived", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28617", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28747", + "QuestType": "2", + "QuestLevel": "-1", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "28748", + "RewardXPDifficulty": "5", + "RewardMoney": "94000", + "RewardBonusMoney": "165400", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "2152726592", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Someone Setup the Pumpkin Bomb", + "LogDescription": "Survive 2 Massive Waves of Zombies.", + "QuestDescription": "You ever seen one of these?$B$B$B$BThis ain't no ordinary pumpkin, friend. See, once you plant it they'll lay in wait until a zombie shows up and then KABLOOEY! Zombie guts all over the place. Let's go!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Brazie the Botanist at Brazie's Farmstead in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "49561", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "2", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Waves Survived", + "ObjectiveText2": "Massive Wave Survived", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28744", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28748", + "QuestType": "2", + "QuestLevel": "-1", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "8", + "RewardMoney": "376000", + "RewardBonusMoney": "330750", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "2152726592", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "66067", + "RewardAmount1": "1", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "65689", + "RewardChoiceItemQuantity1": "1", + "RewardChoiceItemID2": "65666", + "RewardChoiceItemQuantity2": "1", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Lawn of the Dead", + "LogDescription": "Defeat Warden Stillwater.", + "QuestDescription": "IT'S STILLWATER! HE'S ALMOST HERE! It's going to take everything that we've got to beat him! Let's do this!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Brazie the Botanist at Brazie's Farmstead in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "49627", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "1", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Waves Survived", + "ObjectiveText2": "Warden Stillwater Defeated", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "28747", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28751", + "QuestType": "2", + "QuestLevel": "-1", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "94000", + "RewardBonusMoney": "165400", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "5247040", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Tending the Garden", + "LogDescription": "Survive 2 Massive Waves of Zombies.", + "QuestDescription": "Even though we beat Warden Stillwater, his zombies still roam the countryside. Look there, another wave is approaching! Help me fight them off, old buddy! Let's go!", + "AreaDescription": "", + "QuestCompletionLog": "Speak to Brazie the Botanist at Brazie's Farmstead in Hillsbrad Foothills.", + "RequiredNpcOrGo1": "0", + "RequiredNpcOrGo2": "49626", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "0", + "RequiredNpcOrGoCount2": "2", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Waves Survived", + "ObjectiveText2": "Massive Wave Defeated", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + }, + { + "ID": "28752", + "QuestType": "2", + "QuestLevel": "-1", + "MinLevel": "20", + "QuestSortID": "267", + "QuestInfoID": "0", + "SuggestedGroupNum": "0", + "RequiredFactionId1": "0", + "RequiredFactionId2": "0", + "RequiredFactionValue1": "0", + "RequiredFactionValue2": "0", + "RewardNextQuest": "0", + "RewardXPDifficulty": "5", + "RewardMoney": "125", + "RewardBonusMoney": "9300", + "RewardDisplaySpell": "0", + "RewardSpell": "0", + "RewardHonor": "0", + "RewardKillHonor": "0", + "StartItem": "0", + "Flags": "5242944", + "MinimapTargetMark": "0", + "RequiredPlayerKills": "0", + "RewardSkillId": "0", + "RewardSkillPoints": "0", + "RewardReputationMask": "0", + "QuestGiverPortrait": "0", + "QuestTurnInPortrait": "0", + "RewardItem1": "0", + "RewardAmount1": "0", + "RewardItem2": "0", + "RewardAmount2": "0", + "RewardItem3": "0", + "RewardAmount3": "0", + "RewardItem4": "0", + "RewardAmount4": "0", + "ItemDrop1": "0", + "ItemDropQuantity1": "0", + "ItemDrop2": "0", + "ItemDropQuantity2": "0", + "ItemDrop3": "0", + "ItemDropQuantity3": "0", + "ItemDrop4": "0", + "ItemDropQuantity4": "0", + "RewardChoiceItemID1": "0", + "RewardChoiceItemQuantity1": "0", + "RewardChoiceItemID2": "0", + "RewardChoiceItemQuantity2": "0", + "RewardChoiceItemID3": "0", + "RewardChoiceItemQuantity3": "0", + "RewardChoiceItemID4": "0", + "RewardChoiceItemQuantity4": "0", + "RewardChoiceItemID5": "0", + "RewardChoiceItemQuantity5": "0", + "RewardChoiceItemID6": "0", + "RewardChoiceItemQuantity6": "0", + "POIContinent": "0", + "POIx": "0", + "POIy": "0", + "POIPriority": "0", + "RewardTitle": "0", + "RewardTalents": "0", + "RewardArenaPoints": "0", + "RewardFactionID1": "0", + "RewardFactionValue1": "0", + "RewardFactionOverride1": "0", + "RewardFactionID2": "0", + "RewardFactionValue2": "0", + "RewardFactionOverride2": "0", + "RewardFactionID3": "0", + "RewardFactionValue3": "0", + "RewardFactionOverride3": "0", + "RewardFactionID4": "0", + "RewardFactionValue4": "0", + "RewardFactionOverride4": "0", + "RewardFactionID5": "0", + "RewardFactionValue5": "0", + "RewardFactionOverride5": "0", + "LogTitle": "Unstoppable Onslaught", + "LogDescription": "", + "QuestDescription": "See how long you can last! Hold off at least 10 waves and I'll give you some coin.", + "AreaDescription": "", + "QuestCompletionLog": "", + "RequiredNpcOrGo1": "49188", + "RequiredNpcOrGo2": "49685", + "RequiredNpcOrGo3": "0", + "RequiredNpcOrGo4": "0", + "RequiredNpcOrGoCount1": "50", + "RequiredNpcOrGoCount2": "10", + "RequiredNpcOrGoCount3": "0", + "RequiredNpcOrGoCount4": "0", + "RequiredItemId1": "0", + "RequiredItemId2": "0", + "RequiredItemId3": "0", + "RequiredItemId4": "0", + "RequiredItemId5": "0", + "RequiredItemId6": "0", + "RequiredItemCount1": "0", + "RequiredItemCount2": "0", + "RequiredItemCount3": "0", + "RequiredItemCount4": "0", + "RequiredItemCount5": "0", + "RequiredItemCount6": "0", + "RequiredSpell": "0", + "ObjectiveText1": "Waves Survived", + "ObjectiveText2": "Massive Waves Survived", + "ObjectiveText3": "", + "ObjectiveText4": "", + "RewardCurrencyId1": "0", + "RewardCurrencyId2": "0", + "RewardCurrencyId3": "0", + "RewardCurrencyId4": "0", + "RewardCurrencyCount1": "0", + "RewardCurrencyCount2": "0", + "RewardCurrencyCount3": "0", + "RewardCurrencyCount4": "0", + "RequiredCurrencyId1": "0", + "RequiredCurrencyId2": "0", + "RequiredCurrencyId3": "0", + "RequiredCurrencyId4": "0", + "RequiredCurrencyCount1": "0", + "RequiredCurrencyCount2": "0", + "RequiredCurrencyCount3": "0", + "RequiredCurrencyCount4": "0", + "QuestGiverTextWindow": "", + "QuestGiverTargetName": "", + "QuestTurnTextWindow": "", + "QuestTurnTargetName": "", + "SoundAccept": "890", + "SoundTurnIn": "878", + "VerifiedBuild": "15595", + "PrevQuestID": "0", + "NextQuestID": "0", + "ExclusiveGroup": "0", + "AllowableClasses": "0", + "AllowableRaces": "2099199", + "SourceSpellID": "0" + } +] \ No newline at end of file diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro.json new file mode 100644 index 0000000000..65b91c245c --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_00_intro","state":"failed","started_unix_ms":1793385759270,"elapsed_ms":1003,"checks":0,"failures":0,"error":"...ver/server/debug/testbots/archive/hillsbrad_00_intro.lua:29: prepare level-appropriate sword skill","bots":[150],"events":[]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro_retry.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro_retry.json new file mode 100644 index 0000000000..d33a3ddc37 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_00_intro_retry.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_00_intro_retry","state":"failed","started_unix_ms":1793385911014,"elapsed_ms":118430,"checks":3,"failures":0,"error":"[string \"...\"]:5: scene gossip stage: 47444/1102","bots":[150],"events":[{"label":"prepared_horde_character","value":{"moving":0,"agility":33,"vehicle_guid":"","spirit":31,"health":8000,"stamina":43,"level":20,"x":1699.849975585938,"y":1706.56005859375,"combat":0,"z":135.9279937744141,"alive":1,"intellect":20,"power":1000,"transport":0,"strength":46,"vehicle_entry":0,"max_health":8000,"map":0,"max_power":1000,"guid":150}},{"label":"prepared_inventory","value":{"1":{"slot":4,"bag":255,"item":58231,"count":1},"2":{"slot":6,"bag":255,"item":39,"count":1},"3":{"slot":7,"bag":255,"item":40,"count":1},"4":{"slot":15,"bag":255,"item":49778,"count":1},"5":{"slot":19,"bag":255,"item":54443,"count":1},"6":{"slot":20,"bag":255,"item":54443,"count":1},"7":{"slot":21,"bag":255,"item":54443,"count":1},"8":{"slot":22,"bag":255,"item":54443,"count":1},"9":{"slot":23,"bag":255,"item":6948,"count":1}}},{"check":"Cromush-only variant is not granted by board","passed":true},{"label":"before_accept_28571","value":{"status":0,"counters":{},"quest":28571,"rewarded":false}},{"label":"accepted_28571","value":{"status":1,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28571,"rewarded":false}},{"label":"rewarded_28571","value":{"status":6,"counters":{},"quest":28571,"rewarded":true}},{"check":"quest rewarded: 28571","passed":true},{"check":"Trouble at Azurelode requires Welcome to the Machine","passed":true},{"label":"before_accept_28096","value":{"status":0,"counters":{},"quest":28096,"rewarded":false}},{"label":"accepted_28096","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28096,"rewarded":false}},{"label":"steed_before_boarding","value":{"z":80.21520233154297,"x":-575.1890258789062,"y":422.9389953613281,"health":433,"alive":true,"distance":3.158617973327637}},{"label":"aboard_steed","value":{"moving":0,"agility":33,"vehicle_guid":"17388601936000845768","spirit":31,"health":8000,"stamina":43,"level":20,"x":-575.3466186523438,"y":423.0621337890625,"combat":0,"z":80.21520233154297,"alive":1,"intellect":20,"power":996,"transport":0,"strength":46,"vehicle_entry":47445,"max_health":8000,"map":0,"max_power":1000,"guid":150}},{"label":"gossip_47444_1101","value":{"id":12273,"options":{"1":{"id":0,"text":"Maybe you should go take a nap or something. I don't know if I have any work for you.","action":1101}}}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_01_machine.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_01_machine.json new file mode 100644 index 0000000000..8e83219b89 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_01_machine.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_01_machine","state":"passed","started_unix_ms":1793386480899,"elapsed_ms":118974,"checks":5,"failures":0,"error":"","bots":[150],"events":[{"label":"prepared_horde_character","value":{"spirit":31,"map":0,"intellect":20,"max_power":1000,"level":20,"transport":0,"power":1000,"guid":150,"alive":1,"max_health":8000,"z":80.21520233154297,"y":423.0621337890625,"moving":0,"strength":46,"x":-575.3466186523438,"combat":0,"agility":33,"stamina":43,"health":8000,"vehicle_entry":0,"vehicle_guid":""}},{"label":"prepared_inventory","value":{"1":{"item":58231,"bag":255,"count":1,"slot":4},"2":{"item":39,"bag":255,"count":1,"slot":6},"3":{"item":40,"bag":255,"count":1,"slot":7},"4":{"item":49778,"bag":255,"count":1,"slot":15},"5":{"item":54443,"bag":255,"count":1,"slot":19},"6":{"item":54443,"bag":255,"count":1,"slot":20},"7":{"item":54443,"bag":255,"count":1,"slot":21},"8":{"item":54443,"bag":255,"count":1,"slot":22},"9":{"item":6948,"bag":255,"count":1,"slot":23},"10":{"item":62932,"bag":255,"count":1,"slot":24}}},{"check":"breadcrumb reward persisted across logout/login","passed":true},{"check":"Trouble at Azurelode requires Welcome to the Machine","passed":true},{"label":"before_accept_28096","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28096}},{"label":"accepted_28096","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28096}},{"label":"steed_before_boarding","value":{"health":433,"max_health":433,"z":80.21520233154297,"y":422.9389953613281,"x":-575.1890258789062,"distance":3.158617973327637,"level":20,"entry":47445,"alive":true}},{"label":"aboard_steed","value":{"spirit":31,"map":0,"intellect":20,"max_power":1000,"level":20,"transport":0,"power":987,"guid":150,"alive":1,"max_health":8000,"z":80.21520233154297,"y":423.0621337890625,"moving":0,"strength":46,"x":-575.3466186523438,"combat":0,"agility":33,"stamina":43,"health":8000,"vehicle_entry":47445,"vehicle_guid":"17388601936000845548"}},{"label":"gossip_47444_1101","value":{"options":{"1":{"text":"Maybe you should go take a nap or something. I don't know if I have any work for you.","id":0,"action":1101}},"id":12273}},{"label":"gossip_47444_1102","value":{"options":{"1":{"text":"Wait a minute. It looks like something just came up. Yes, right here on this sheet of paper. You need to head southeast to the Azurelode Mine and report to Captain Keyton. Southeast is that way *you point southeast*.","id":0,"action":1102}},"id":12273}},{"label":"scene_progress_47444","value":{"status":3,"counters":{"1":1,"2":0,"3":0,"4":0},"rewarded":false,"quest":28096}},{"label":"gossip_47443_1103","value":{"options":{"1":{"text":"Um... Apparently there is some trouble at Southshore. Something about worgen insurgents. Maybe you could help with them?","id":0,"action":1103}},"id":12276}},{"label":"gossip_47443_1104","value":{"options":{"1":{"text":"None.","id":0,"action":1104}},"id":12276}},{"label":"gossip_47443_1105","value":{"options":{"1":{"text":"Right, thanks. Just go ahead and head southeast. More south than east. Probably off the coast.","id":0,"action":1105}},"id":12276}},{"label":"scene_progress_47443","value":{"status":3,"counters":{"1":1,"2":1,"3":0,"4":0},"rewarded":false,"quest":28096}},{"label":"gossip_47442_1106","value":{"options":{"1":{"text":"Well, we are having some problems at the Sludge Fields, located northeast of here. Warden Stillwater could use your help.","id":0,"action":1106}},"id":12279}},{"label":"gossip_47442_1107","value":{"options":{"1":{"text":"That's all.","id":0,"action":1107}},"id":12279}},{"label":"gossip_47442_1108","value":{"options":{"1":{"text":"THAT'S ALL, JOHNNY AWESOME. TAKE IT OR LEAVE IT!","id":0,"action":1108}},"id":12279}},{"label":"scene_progress_47442","value":{"status":1,"counters":{"1":1,"2":1,"3":1,"4":0},"rewarded":false,"quest":28096}},{"label":"machine_completed","value":{"status":1,"counters":{"1":1,"2":1,"3":1,"4":0},"rewarded":false,"quest":28096}},{"label":"rewarded_28096","value":{"status":6,"counters":{},"rewarded":true,"quest":28096}},{"check":"quest rewarded: 28096","passed":true},{"label":"before_accept_28111","value":{"status":0,"counters":{},"rewarded":false,"quest":28111}},{"label":"accepted_28111","value":{"status":1,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28111}},{"check":"Human Infestation requires rewarded Trouble at Azurelode","passed":true},{"label":"rewarded_28111","value":{"status":6,"counters":{},"rewarded":true,"quest":28111}},{"check":"quest rewarded: 28111","passed":true},{"label":"before_accept_28138","value":{"status":0,"counters":{},"rewarded":false,"quest":28138}},{"label":"accepted_28138","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28138}},{"label":"before_accept_28144","value":{"status":0,"counters":{},"rewarded":false,"quest":28144}},{"label":"accepted_28144","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28144}},{"label":"chain_checkpoint","value":{"spirit":31,"map":0,"intellect":20,"max_power":1000,"level":20,"transport":0,"power":0,"guid":150,"alive":1,"max_health":8000,"z":9.818949699401855,"y":231.3411865234375,"moving":1,"strength":46,"x":-902.3660278320312,"combat":0,"agility":33,"stamina":43,"health":8000,"vehicle_entry":0,"vehicle_guid":""}},{"label":"capture_quest","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28138}},{"label":"supplies_quest","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28144}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest.json new file mode 100644 index 0000000000..72cfb04733 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_02_harvest","state":"cancelled","started_unix_ms":1793386944176,"elapsed_ms":229404,"checks":1,"failures":0,"error":"cancelled by operator","bots":[150],"events":[{"label":"before_accept_28114","value":{"counters":{},"quest":28114,"rewarded":false,"status":0}},{"label":"accepted_or_resumed_28114","value":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28114,"rewarded":false,"status":3}},{"label":"before_accept_28115","value":{"counters":{},"quest":28115,"rewarded":false,"status":0}},{"label":"accepted_or_resumed_28115","value":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28115,"rewarded":false,"status":3}},{"label":"harvest_progress","value":{"eggs":12}},{"label":"harvest_progress","value":{"eggs":24}},{"label":"harvest_progress","value":{"eggs":36}},{"label":"harvest_progress","value":{"eggs":44}},{"label":"harvest_progress","value":{"eggs":52}},{"label":"harvest_progress","value":{"eggs":60}},{"check":"Glorious Harvest completed through native egg clicks","passed":true},{"label":"combat_timeout","value":{"level":19,"alive":true,"max_health":607,"y":76.34470367431641,"z":51.89080429077148,"entry":47204,"x":-1046.349975585938,"health":110,"distance":0}},{"label":"combat_timeout","value":{"level":19,"alive":true,"max_health":607,"y":87.23629760742188,"z":55.25976943969727,"entry":47204,"x":-1052.319946289062,"health":114,"distance":0}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest_prepared.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest_prepared.json new file mode 100644 index 0000000000..6f8298f5b4 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_02_harvest_prepared.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_02_harvest_prepared","state":"passed","started_unix_ms":1793387244987,"elapsed_ms":227802,"checks":4,"failures":0,"error":"","bots":[150],"events":[{"label":"before_accept_28114","value":{"quest":28114,"status":1,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0}}},{"label":"accepted_or_resumed_28114","value":{"quest":28114,"status":1,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0}}},{"label":"before_accept_28115","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0}}},{"label":"accepted_or_resumed_28115","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0}}},{"check":"Glorious Harvest completed through native egg clicks","passed":true},{"label":"bear_kill","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":1,"2":0,"3":0,"4":0}}},{"label":"bear_kill","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":2,"2":0,"3":0,"4":0}}},{"label":"bear_kill","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":3,"2":0,"3":0,"4":0}}},{"label":"bear_kill","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":4,"2":0,"3":0,"4":0}}},{"label":"bear_kill","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":5,"2":0,"3":0,"4":0}}},{"label":"bear_kill","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":6,"2":0,"3":0,"4":0}}},{"label":"bear_kill","value":{"quest":28115,"status":3,"rewarded":false,"counters":{"1":7,"2":0,"3":0,"4":0}}},{"label":"bear_kill","value":{"quest":28115,"status":1,"rewarded":false,"counters":{"1":8,"2":0,"3":0,"4":0}}},{"check":"Past Their Prime native kill objectives","passed":true},{"check":"rewarded quest: 28114","passed":true},{"label":"rewarded_28114","value":{"quest":28114,"status":6,"rewarded":true,"counters":{}}},{"check":"rewarded quest: 28115","passed":true},{"label":"rewarded_28115","value":{"quest":28115,"status":6,"rewarded":true,"counters":{}}},{"label":"before_accept_28146","value":{"quest":28146,"status":0,"rewarded":false,"counters":{}}},{"label":"accepted_or_resumed_28146","value":{"quest":28146,"status":3,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0}}},{"label":"coastal_ready","value":{"quest":28146,"status":3,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0}}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies.json new file mode 100644 index 0000000000..53d8192a8d --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_03_supplies","state":"failed","started_unix_ms":1793387891125,"elapsed_ms":6113,"checks":0,"failures":0,"error":"[string \"...\"]:5: native quest chest loot","bots":[150],"events":[]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_lock13.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_lock13.json new file mode 100644 index 0000000000..b2e937e108 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_lock13.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_03_supplies_lock13","state":"failed","started_unix_ms":1793389566764,"elapsed_ms":13735,"checks":0,"failures":0,"error":"[string \"...\"]:5: native Opening cast and loot window","bots":[150],"events":[{"label":"opening_before","value":{"power":995,"spirit":31,"mover_guid":"150","max_health":8000,"stamina":43,"guid":150,"zone":267,"alive":1,"max_power":1000,"intellect":20,"level":20,"x":-1022.070007324219,"area":295,"agility":33,"moving":0,"loot_guid":"","z":0.2217569947242737,"y":281.8349914550781,"transport":0,"combat":0,"vehicle_guid":"","health":8000,"vehicle_entry":0,"map":0,"strength":46}},{"label":"supplies_looted","value":{"spawn":204012,"count":1}},{"label":"opening_before","value":{"power":973,"spirit":31,"mover_guid":"150","max_health":8000,"stamina":43,"guid":150,"zone":267,"alive":1,"max_power":1000,"intellect":20,"level":20,"x":-1156.72998046875,"area":295,"agility":33,"moving":0,"loot_guid":"","z":0.1493362039327621,"y":174.3780059814453,"transport":0,"combat":0,"vehicle_guid":"","health":8000,"vehicle_entry":0,"map":0,"strength":46}},{"label":"supplies_looted","value":{"spawn":204086,"count":2}},{"label":"opening_before","value":{"power":957,"spirit":31,"mover_guid":"150","max_health":8000,"stamina":43,"guid":150,"zone":267,"alive":1,"max_power":1000,"intellect":20,"level":20,"x":-1150.079956054688,"area":295,"agility":33,"moving":0,"loot_guid":"","z":1.804399967193604,"y":177.2989959716797,"transport":0,"combat":1,"vehicle_guid":"","health":8000,"vehicle_entry":0,"map":0,"strength":46}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_open.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_open.json new file mode 100644 index 0000000000..9b4bcdbc78 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_open.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_03_supplies_open","state":"failed","started_unix_ms":1793389383888,"elapsed_ms":11395,"checks":0,"failures":0,"error":"[string \"...\"]:5: native Opening cast and loot window","bots":[150],"events":[{"label":"opening_before","value":{"stamina":43,"loot_guid":"","z":0.2217569947242737,"zone":267,"map":0,"vehicle_entry":0,"transport":0,"health":8000,"combat":1,"alive":1,"guid":150,"moving":0,"area":295,"mover_guid":"150","vehicle_guid":"","max_health":8000,"max_power":1000,"x":-1022.070007324219,"spirit":31,"agility":33,"y":281.8349914550781,"power":988,"strength":46,"level":20,"intellect":20}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_retry.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_retry.json new file mode 100644 index 0000000000..33ec8d8a6b --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_03_supplies_retry.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_03_supplies_retry","state":"passed","started_unix_ms":1793389819916,"elapsed_ms":31990,"checks":3,"failures":0,"error":"","bots":[150],"events":[{"label":"opening_before","value":{"map":0,"z":1.804399967193604,"loot_guid":"","level":20,"agility":33,"health":7960,"intellect":20,"moving":0,"y":177.2989959716797,"x":-1150.079956054688,"vehicle_entry":0,"transport":0,"max_power":1000,"combat":0,"spirit":31,"power":933,"strength":46,"zone":267,"vehicle_guid":"","mover_guid":"150","alive":1,"max_health":8000,"stamina":43,"area":295,"guid":150}},{"label":"supplies_looted","value":{"count":3,"spawn":204087}},{"label":"opening_before","value":{"map":0,"z":-0.2274540066719055,"loot_guid":"","level":20,"agility":33,"health":7755,"intellect":20,"moving":0,"y":144.3090057373047,"x":-1170.150024414062,"vehicle_entry":0,"transport":0,"max_power":1000,"combat":0,"spirit":31,"power":996,"strength":46,"zone":267,"vehicle_guid":"","mover_guid":"150","alive":1,"max_health":8000,"stamina":43,"area":295,"guid":150}},{"label":"supplies_looted","value":{"count":4,"spawn":204089}},{"label":"opening_before","value":{"map":0,"z":0.8949859738349915,"loot_guid":"","level":20,"agility":33,"health":7720,"intellect":20,"moving":0,"y":112.056999206543,"x":-1173.030029296875,"vehicle_entry":0,"transport":0,"max_power":1000,"combat":1,"spirit":31,"power":983,"strength":46,"zone":267,"vehicle_guid":"","mover_guid":"150","alive":1,"max_health":8000,"stamina":43,"area":295,"guid":150}},{"label":"supplies_looted","value":{"count":5,"spawn":204090}},{"label":"opening_before","value":{"map":0,"z":-0.06667699664831161,"loot_guid":"","level":20,"agility":33,"health":7619,"intellect":20,"moving":0,"y":81.94439697265625,"x":-1167.68994140625,"vehicle_entry":0,"transport":0,"max_power":1000,"combat":1,"spirit":31,"power":999,"strength":46,"zone":267,"vehicle_guid":"","mover_guid":"150","alive":1,"max_health":8000,"stamina":43,"area":295,"guid":150}},{"label":"supplies_looted","value":{"count":6,"spawn":204091}},{"check":"Thieving Little Monsters native loot completion","passed":true},{"check":"Sludge Fields remains locked before supplies reward","passed":true},{"check":"rewarded quest: 28144","passed":true},{"label":"rewarded_28144","value":{"counters":{},"quest":28144,"status":6,"rewarded":true}},{"label":"before_accept_28168","value":{"counters":{},"quest":28168,"status":0,"rewarded":false}},{"label":"accepted_or_resumed_28168","value":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28168,"status":1,"rewarded":false}},{"label":"sludge_fields_ready","value":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28168,"status":1,"rewarded":false}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_04_capture.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_04_capture.json new file mode 100644 index 0000000000..e943dd1dac --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_04_capture.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_04_capture","state":"passed","started_unix_ms":1793389852043,"elapsed_ms":336423,"checks":1,"failures":0,"error":"","bots":[150],"events":[{"label":"captured_human","value":{"status":3,"quest":28138,"rewarded":false,"counters":{"1":1,"2":0,"3":0,"4":0}}},{"label":"captured_human","value":{"status":3,"quest":28138,"rewarded":false,"counters":{"1":2,"2":0,"3":0,"4":0}}},{"label":"captured_human","value":{"status":3,"quest":28138,"rewarded":false,"counters":{"1":3,"2":0,"3":0,"4":0}}},{"label":"captured_human","value":{"status":3,"quest":28138,"rewarded":false,"counters":{"1":4,"2":0,"3":0,"4":0}}},{"label":"captured_human","value":{"status":3,"quest":28138,"rewarded":false,"counters":{"1":5,"2":0,"3":0,"4":0}}},{"label":"captured_human","value":{"status":3,"quest":28138,"rewarded":false,"counters":{"1":6,"2":0,"3":0,"4":0}}},{"label":"captured_human","value":{"status":3,"quest":28138,"rewarded":false,"counters":{"1":7,"2":0,"3":0,"4":0}}},{"label":"captured_human","value":{"status":1,"quest":28138,"rewarded":false,"counters":{"1":8,"2":0,"3":0,"4":0}}},{"check":"rewarded quest: 28138","passed":true},{"label":"rewarded_28138","value":{"status":6,"quest":28138,"rewarded":true,"counters":{}}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_07_sludge.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_07_sludge.json new file mode 100644 index 0000000000..08108f652c --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_07_sludge.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_07_sludge","state":"failed","started_unix_ms":1793390191187,"elapsed_ms":83713,"checks":1,"failures":0,"error":"...er/server/debug/testbots/archive/hillsbrad_07_sludge.lua:89: native Sludge Fields assessment event","bots":[150],"events":[{"check":"rewarded quest: 28168","passed":true},{"label":"rewarded_28168","value":{"status":6,"counters":{},"rewarded":true,"quest":28168}},{"label":"before_accept_28192","value":{"status":0,"counters":{},"rewarded":false,"quest":28192}},{"label":"accepted_or_resumed_28192","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28192}},{"label":"assessment_before","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28192}},{"label":"assessment_walk","value":{"x":-492,"y":70,"z":55,"accepted":true}},{"label":"assessment_progress","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28192}},{"label":"assessment_walk","value":{"x":-510,"y":30,"z":50,"accepted":true}},{"label":"assessment_progress","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28192}},{"label":"assessment_walk","value":{"x":-541,"y":-30,"z":45.75,"accepted":true}},{"label":"assessment_progress","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28192}},{"label":"assessment_walk","value":{"x":-585,"y":-65,"z":45,"accepted":true}},{"label":"assessment_progress","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28192}},{"label":"assessment_walk","value":{"x":-615,"y":-46,"z":60.4,"accepted":false}},{"label":"assessment_progress","value":{"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"quest":28192}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_08_rescue.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_08_rescue.json new file mode 100644 index 0000000000..53c1e93f07 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_08_rescue.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_08_rescue","state":"passed","started_unix_ms":1793390275122,"elapsed_ms":34652,"checks":1,"failures":0,"error":"","bots":[150],"events":[{"label":"before_accept_28156","value":{"rewarded":false,"quest":28156,"counters":{},"status":0}},{"label":"accepted_or_resumed_28156","value":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3}},{"label":"rescue_start","value":{"level":19,"entry":47681,"distance":0,"x":-794.2689819335938,"y":68.80380249023438,"z":9.112879753112793,"alive":true,"max_health":404,"health":404}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":974,"max_health":8000,"intellect":20,"y":66.58379364013672,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-805.5274658203125,"guid":150,"z":6.648680210113525,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":0.6716227531433105,"x":-802.534912109375,"y":65.02137756347656,"z":8.092388153076172,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":949,"max_health":8000,"intellect":20,"y":79.65414428710938,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-810.3230590820312,"guid":150,"z":4.586926937103271,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":1.57148551940918,"x":-808.7555541992188,"y":75.38207244873047,"z":5.023747444152832,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":924,"max_health":8000,"intellect":20,"y":92.71521759033203,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-815.115234375,"guid":150,"z":5.408812046051025,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":1.649694442749023,"x":-813.5205078125,"y":88.36890411376953,"z":4.977459907531738,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":899,"max_health":8000,"intellect":20,"y":104.2175750732422,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-822.5447998046875,"guid":150,"z":2.911847829818726,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":1.605531692504883,"x":-819.96044921875,"y":100.5377044677734,"z":3.907138586044312,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":874,"max_health":8000,"intellect":20,"y":115.3898696899414,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-830.3909912109375,"guid":150,"z":1.819562673568726,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":1.735841274261475,"x":-827.6868286132812,"y":111.5393753051758,"z":2.357514619827271,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":848,"max_health":8000,"intellect":20,"y":128.7979736328125,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-833.5966796875,"guid":150,"z":2.036584138870239,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":1.684699058532715,"x":-833.9595947265625,"y":124.1293563842773,"z":1.899787425994873,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":823,"max_health":8000,"intellect":20,"y":142.745361328125,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-832.5122680664062,"guid":150,"z":1.931387901306152,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":1.729829788208008,"x":-832.878662109375,"y":138.0325317382812,"z":2.093505382537842,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":803,"max_health":8000,"intellect":20,"y":153.2449645996094,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-830.8318481445312,"guid":150,"z":2.622127294540405,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":1.418705463409424,"x":-832.123046875,"y":149.0496215820312,"z":2.115312576293945,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":748,"max_health":8000,"intellect":20,"y":176.6181793212891,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-828.7765502929688,"guid":150,"z":2.852489948272705,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":12.51491355895996,"x":-823.1195678710938,"y":162.1719970703125,"z":2.989960432052612,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":723,"max_health":8000,"intellect":20,"y":188.6391143798828,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-835.796875,"guid":150,"z":4.542022705078125,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":10.80844020843506,"x":-828.9959106445312,"y":176.7370758056641,"z":2.880282402038574,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":704,"max_health":8000,"intellect":20,"y":197.8513641357422,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-841.1769409179688,"guid":150,"z":6.647165775299072,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":9.269906044006348,"x":-835.1332397460938,"y":187.4325256347656,"z":4.307923316955566,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":671,"max_health":8000,"intellect":20,"y":213.3279876708984,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-850.2155151367188,"guid":150,"z":9.253265380859375,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":6.680747032165527,"x":-845.4384155273438,"y":205.144287109375,"z":7.272549629211426,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":646,"max_health":8000,"intellect":20,"y":222.5940551757812,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-859.119140625,"guid":150,"z":8.803073883056641,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":4.209797859191895,"x":-852.9920043945312,"y":218.8408050537109,"z":9.396791458129883,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":621,"max_health":8000,"intellect":20,"y":225.2506866455078,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-872.918212890625,"guid":150,"z":9.015266418457031,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":2.240939140319824,"x":-867.7744750976562,"y":224.2569122314453,"z":8.867560386657715,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":3},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":596,"max_health":8000,"intellect":20,"y":227.9111480712891,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-886.7372436523438,"guid":150,"z":8.833369255065918,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":2.497948169708252,"x":-881.3385009765625,"y":226.8717803955078,"z":8.806475639343262,"alive":true,"max_health":404,"health":404}}},{"label":"rescue_follow","value":{"quest":{"rewarded":false,"quest":28156,"counters":{"1":0,"2":0,"3":0,"4":0},"status":1},"player":{"agility":33,"area":288,"stamina":43,"max_power":1000,"power":571,"max_health":8000,"intellect":20,"y":230.5387878417969,"zone":267,"mover_guid":"150","transport":0,"level":20,"alive":1,"strength":46,"vehicle_guid":"","moving":1,"combat":0,"spirit":31,"x":-900.3856811523438,"guid":150,"z":9.70778751373291,"loot_guid":"","vehicle_entry":0,"map":0,"health":8000},"follower":{"level":19,"entry":47681,"distance":4.038730621337891,"x":-893.4769287109375,"y":229.2087097167969,"z":9.498605728149414,"alive":true,"max_health":404,"health":404}}},{"check":"rewarded quest: 28156","passed":true},{"label":"rewarded_28156","value":{"rewarded":true,"quest":28156,"counters":{},"status":6}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_09_coastal.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_09_coastal.json new file mode 100644 index 0000000000..49ba44587a --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_09_coastal.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_09_coastal","state":"failed","started_unix_ms":1793390371386,"elapsed_ms":20414,"checks":0,"failures":0,"error":"[string \"...\"]:5: hungry creeper eats actual owner kill","bots":[150],"events":[{"label":"coastal_initial","value":{"moving":0,"power":1000,"zone":267,"vehicle_guid":"","intellect":20,"z":0.8949999809265137,"y":112.056999206543,"stamina":43,"spirit":31,"guid":150,"x":-1173.030029296875,"combat":0,"transport":0,"level":20,"map":0,"vehicle_entry":0,"max_health":8000,"max_power":1000,"health":8000,"area":295,"alive":1,"mover_guid":"150","loot_guid":"","agility":33,"strength":600}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_10_science.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_10_science.json new file mode 100644 index 0000000000..1c9228121e --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_10_science.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_10_science","state":"passed","started_unix_ms":1793390310689,"elapsed_ms":34221,"checks":1,"failures":0,"error":"","bots":[150],"events":[{"label":"before_accept_28199","value":{"counters":{},"quest":28199,"status":0,"rewarded":false}},{"label":"accepted_or_resumed_28199","value":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28199,"status":3,"rewarded":false}},{"label":"flesh_collected","value":{"count":1,"quest":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28199,"status":3,"rewarded":false}}},{"label":"flesh_collected","value":{"count":2,"quest":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28199,"status":3,"rewarded":false}}},{"label":"flesh_collected","value":{"count":3,"quest":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28199,"status":3,"rewarded":false}}},{"label":"flesh_collected","value":{"count":4,"quest":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28199,"status":3,"rewarded":false}}},{"label":"flesh_collected","value":{"count":5,"quest":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28199,"status":3,"rewarded":false}}},{"label":"flesh_collected","value":{"count":6,"quest":{"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28199,"status":1,"rewarded":false}}},{"check":"rewarded quest: 28199","passed":true},{"label":"rewarded_28199","value":{"counters":{},"quest":28199,"status":6,"rewarded":true}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_11_coastal_stage.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_11_coastal_stage.json new file mode 100644 index 0000000000..fe41d398e3 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_11_coastal_stage.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_11_coastal_stage","state":"passed","started_unix_ms":1793390354344,"elapsed_ms":1279,"checks":0,"failures":0,"error":"","bots":[150],"events":[{"label":"coastal_staging","value":{"strength":46,"vehicle_guid":"","area":295,"combat":1,"health":7961,"max_power":1000,"spirit":31,"alive":1,"z":0.8949999809265137,"y":112.056999206543,"mover_guid":"150","agility":33,"x":-1173.030029296875,"stamina":43,"transport":0,"intellect":20,"moving":0,"vehicle_entry":0,"map":0,"zone":267,"loot_guid":"","level":20,"max_health":8000,"guid":150,"power":1000}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_12_coastal_observe.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_12_coastal_observe.json new file mode 100644 index 0000000000..80e00961e8 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_12_coastal_observe.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_12_coastal_observe","state":"failed","started_unix_ms":1793390430804,"elapsed_ms":27240,"checks":0,"failures":0,"error":".../debug/testbots/archive/hillsbrad_12_coastal_observe.lua:107: hungry creeper eats actual owner kill","bots":[150],"events":[{"label":"coastal_initial","value":{"strength":600,"spirit":31,"stamina":43,"x":-1173.030029296875,"y":112.056999206543,"z":0.8949999809265137,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":8000,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20}},{"label":"feeding_before","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7889,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"target":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":true,"z":1.770883560180664,"health":509,"max_health":509,"level":20,"entry":2375}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7929,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7888,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7857,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7818,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7818,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7786,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7753,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7717,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7680,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"player":{"strength":600,"spirit":31,"stamina":43,"x":-1165.036254882812,"y":99.9415283203125,"z":1.733166933059692,"map":0,"transport":0,"max_power":1000,"guid":150,"power":1000,"health":7640,"mover_guid":"150","vehicle_entry":0,"max_health":8000,"alive":1,"combat":1,"area":295,"loot_guid":"","zone":267,"vehicle_guid":"","agility":33,"moving":0,"level":20,"intellect":20},"corpse":{"distance":0,"x":-1164.603515625,"y":99.35784912109375,"alive":false,"z":1.770883560180664,"health":0,"max_health":509,"level":20,"entry":2375},"quest":{"rewarded":false,"status":3,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_13_creeper_lifetime.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_13_creeper_lifetime.json new file mode 100644 index 0000000000..da2d4f3269 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_13_creeper_lifetime.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_13_creeper_lifetime","state":"passed","started_unix_ms":1793390485927,"elapsed_ms":5474,"checks":0,"failures":0,"error":"","bots":[150],"events":[{"label":"creeper_login","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":1000},"creeper":{"max_health":872,"distance":0,"health":872,"level":20,"z":1.733166933059692,"y":99.9415283203125,"x":-1165.036254882812,"entry":47662,"alive":true}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":1000},"creeper":{"max_health":872,"distance":0,"health":872,"level":20,"z":1.733166933059692,"y":99.9415283203125,"x":-1165.036254882812,"entry":47662,"alive":true}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":0,"x":-1165.036254882812,"max_power":1000,"power":999}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":0,"x":-1165.036254882812,"max_power":1000,"power":996}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":0,"x":-1165.036254882812,"max_power":1000,"power":994}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":0,"x":-1165.036254882812,"max_power":1000,"power":987}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":0,"x":-1165.036254882812,"max_power":1000,"power":984}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":0,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":8000,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":981}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":7970,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":991}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":7970,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":991}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":7970,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":991}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":7970,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":991}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":7970,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":991}}},{"label":"creeper_stationary","value":{"player":{"strength":46,"moving":0,"map":0,"health":7970,"vehicle_guid":"","agility":33,"intellect":20,"area":295,"alive":1,"z":1.733166933059692,"max_health":8000,"guid":150,"spirit":31,"y":99.9415283203125,"zone":267,"mover_guid":"150","transport":0,"loot_guid":"","vehicle_entry":0,"level":20,"stamina":43,"combat":1,"x":-1165.036254882812,"max_power":1000,"power":991}}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_14_coastal_live_accept.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_14_coastal_live_accept.json new file mode 100644 index 0000000000..84c454901b --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_14_coastal_live_accept.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_14_coastal_live_accept","state":"passed","started_unix_ms":1793390534168,"elapsed_ms":225734,"checks":1,"failures":0,"error":"","bots":[150],"events":[{"label":"before_accept_28146","value":{"status":0,"rewarded":false,"counters":{},"quest":28146}},{"label":"accepted_or_resumed_28146","value":{"status":3,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}},{"label":"creeper_after_live_accept","value":{"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":991,"loot_guid":"","agility":33,"strength":600,"x":-905.5430297851562,"max_power":1000,"y":232.0019989013672,"z":9.48915958404541,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":288,"spirit":31,"transport":0,"zone":267},"creeper":{"y":229.9752655029297,"z":9.756587982177734,"distance":6.838759422302246,"health":872,"max_health":872,"x":-897.458740234375,"alive":true,"entry":47662,"level":20}}},{"label":"coastal_initial","value":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":991,"loot_guid":"","agility":33,"strength":600,"x":-905.5430297851562,"max_power":1000,"y":232.0019989013672,"z":9.48915958404541,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":288,"spirit":31,"transport":0,"zone":267}},{"label":"feeding_before","value":{"companion":{"y":274.4598999023438,"z":7.666885852813721,"distance":21.05052375793457,"health":712,"max_health":872,"x":-980.1235961914062,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7862,"power":919,"loot_guid":"","agility":33,"strength":600,"x":-957.6099243164062,"max_power":1000,"y":275.0775756835938,"z":8.797890663146973,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":275.3316040039062,"z":8.805989265441895,"distance":0,"health":472,"max_health":472,"x":-958.068115234375,"alive":true,"entry":2375,"level":19}}},{"label":"feeding_tick","value":{"companion":{"y":275.1167602539062,"z":8.525233268737793,"distance":4.400659084320068,"health":712,"max_health":872,"x":-963.504150390625,"alive":true,"entry":47662,"level":20},"corpse":{"y":275.3316040039062,"z":8.805989265441895,"distance":0,"health":0,"max_health":472,"x":-958.068115234375,"alive":false,"entry":2375,"level":19},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7959,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-957.6099243164062,"max_power":1000,"y":275.0775756835938,"z":8.797890663146973,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":274.1078186035156,"z":8.801887512207031,"distance":0.4999886751174927,"health":712,"max_health":872,"x":-955.8607788085938,"alive":true,"entry":47662,"level":20},"corpse":{"y":275.3316040039062,"z":8.805989265441895,"distance":0,"health":0,"max_health":472,"x":-958.068115234375,"alive":false,"entry":2375,"level":19},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7959,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-957.6099243164062,"max_power":1000,"y":275.0775756835938,"z":8.797890663146973,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":0,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":274.1078186035156,"z":8.801887512207031,"distance":0.4999886751174927,"health":712,"max_health":872,"x":-955.8607788085938,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7923,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-957.6099243164062,"max_power":1000,"y":275.0775756835938,"z":8.797890663146973,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":1,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":1,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":279.1211242675781,"z":8.930383682250977,"distance":3.221330642700195,"health":712,"max_health":872,"x":-958.0601806640625,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7923,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-958.5819091796875,"max_power":1000,"y":283.8076171875,"z":9.166067123413086,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":279.5340270996094,"z":8.95674991607666,"distance":0.8485019207000732,"health":472,"max_health":472,"x":-958.169921875,"alive":true,"entry":2374,"level":19}}},{"label":"feeding_tick","value":{"companion":{"y":285.7987365722656,"z":9.362277984619141,"distance":0.5095930099487305,"health":712,"max_health":872,"x":-958.7700805664062,"alive":true,"entry":47662,"level":20},"corpse":{"y":280.5029602050781,"z":8.99556827545166,"distance":0,"health":0,"max_health":472,"x":-958.2696533203125,"alive":false,"entry":2374,"level":19},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":974,"loot_guid":"","agility":33,"strength":600,"x":-958.5819091796875,"max_power":1000,"y":283.8076171875,"z":9.166067123413086,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":1,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":285.7987365722656,"z":9.362277984619141,"distance":0.5095930099487305,"health":712,"max_health":872,"x":-958.7700805664062,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":949,"loot_guid":"","agility":33,"strength":600,"x":-958.5819091796875,"max_power":1000,"y":283.8076171875,"z":9.166067123413086,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":2,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":2,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":282.13818359375,"z":5.534671783447266,"distance":0.5535128116607666,"health":712,"max_health":872,"x":-985.998779296875,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7927,"power":937,"loot_guid":"","agility":33,"strength":600,"x":-987.9950561523438,"max_power":1000,"y":282.0166015625,"z":5.068827152252197,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":282.0965576171875,"z":5.377010822296143,"distance":0,"health":509,"max_health":509,"x":-986.6820678710938,"alive":true,"entry":2375,"level":20}}},{"label":"feeding_tick","value":{"companion":{"y":281.89501953125,"z":4.604232788085938,"distance":0.5532293319702148,"health":712,"max_health":872,"x":-989.9913330078125,"alive":true,"entry":47662,"level":20},"corpse":{"y":285.4402465820312,"z":3.549902677536011,"distance":1.372777700424194,"health":0,"max_health":509,"x":-991.0332641601562,"alive":false,"entry":2375,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":973,"loot_guid":"","agility":33,"strength":600,"x":-987.9950561523438,"max_power":1000,"y":282.0166015625,"z":5.068827152252197,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":2,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":281.89501953125,"z":4.604232788085938,"distance":0.5532293319702148,"health":712,"max_health":872,"x":-989.9913330078125,"alive":true,"entry":47662,"level":20},"corpse":{"y":285.4402465820312,"z":3.549902677536011,"distance":1.372777700424194,"health":0,"max_health":509,"x":-991.0332641601562,"alive":false,"entry":2375,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":948,"loot_guid":"","agility":33,"strength":600,"x":-987.9950561523438,"max_power":1000,"y":282.0166015625,"z":5.068827152252197,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":2,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":281.89501953125,"z":4.604232788085938,"distance":0.5532293319702148,"health":712,"max_health":872,"x":-989.9913330078125,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":923,"loot_guid":"","agility":33,"strength":600,"x":-987.9950561523438,"max_power":1000,"y":282.0166015625,"z":5.068827152252197,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":3,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":3,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":263.1799926757812,"z":6.260387420654297,"distance":1.307775497436523,"health":872,"max_health":872,"x":-1006.228637695312,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7923,"power":907,"loot_guid":"","agility":33,"strength":600,"x":-1008.172119140625,"max_power":1000,"y":261.172119140625,"z":6.534115791320801,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":260.6329040527344,"z":6.61577844619751,"distance":0,"health":438,"max_health":438,"x":-1008.694091796875,"alive":true,"entry":2374,"level":18}}},{"label":"feeding_tick","value":{"companion":{"y":262.609130859375,"z":6.366439819335938,"distance":0.507023811340332,"health":872,"max_health":872,"x":-1006.781066894531,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":974,"loot_guid":"","agility":33,"strength":600,"x":-1008.172119140625,"max_power":1000,"y":261.172119140625,"z":6.534115791320801,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":4,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":4,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":253.7170715332031,"z":8.845039367675781,"distance":1.94006872177124,"health":712,"max_health":872,"x":-1003.10302734375,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7932,"power":984,"loot_guid":"","agility":33,"strength":600,"x":-1001.239807128906,"max_power":1000,"y":250.9768676757812,"z":9.769034385681152,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":250.2852630615234,"z":10.07419395446777,"distance":0,"health":438,"max_health":438,"x":-1000.76953125,"alive":true,"entry":2374,"level":18}}},{"label":"feeding_tick","value":{"companion":{"y":252.6307373046875,"z":9.207603454589844,"distance":0.5772948265075684,"health":712,"max_health":872,"x":-1002.364379882812,"alive":true,"entry":47662,"level":20},"corpse":{"y":250.2852630615234,"z":10.07419395446777,"distance":0,"health":0,"max_health":438,"x":-1000.76953125,"alive":false,"entry":2374,"level":18},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":975,"loot_guid":"","agility":33,"strength":600,"x":-1001.239807128906,"max_power":1000,"y":250.9768676757812,"z":9.769034385681152,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":4,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":252.6307373046875,"z":9.207603454589844,"distance":0.5772948265075684,"health":712,"max_health":872,"x":-1002.364379882812,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":8000,"power":953,"loot_guid":"","agility":33,"strength":600,"x":-1001.239807128906,"max_power":1000,"y":250.9768676757812,"z":9.769034385681152,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":0,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":5,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":5,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":262.5367431640625,"z":6.503077983856201,"distance":36.11161804199219,"health":712,"max_health":872,"x":-1019.633117675781,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7930,"power":893,"loot_guid":"","agility":33,"strength":600,"x":-1054.525024414062,"max_power":1000,"y":275.5352478027344,"z":1.190101623535156,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":275.1026916503906,"z":1.368103384971619,"distance":0,"health":438,"max_health":438,"x":-1056.289306640625,"alive":true,"entry":2374,"level":18}}},{"label":"feeding_tick","value":{"companion":{"y":267.9416198730469,"z":4.294419288635254,"distance":19.3105640411377,"health":712,"max_health":872,"x":-1035.399658203125,"alive":true,"entry":47662,"level":20},"corpse":{"y":275.1026916503906,"z":1.368103384971619,"distance":0,"health":0,"max_health":438,"x":-1056.289306640625,"alive":false,"entry":2374,"level":18},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7883,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1054.525024414062,"max_power":1000,"y":275.5352478027344,"z":1.190101623535156,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":5,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":271.8551330566406,"z":2.695190191268921,"distance":7.174141883850098,"health":712,"max_health":872,"x":-1046.815795898438,"alive":true,"entry":47662,"level":20},"corpse":{"y":275.1026916503906,"z":1.368103384971619,"distance":0,"health":0,"max_health":438,"x":-1056.289306640625,"alive":false,"entry":2374,"level":18},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7883,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1054.525024414062,"max_power":1000,"y":275.5352478027344,"z":1.190101623535156,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":5,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":275.1026916503906,"z":1.368103504180908,"distance":0.3252345323562622,"health":712,"max_health":872,"x":-1056.289306640625,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7860,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1054.525024414062,"max_power":1000,"y":275.5352478027344,"z":1.190101623535156,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":6,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":6,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":265.9556274414062,"z":3.89837646484375,"distance":1.687015056610107,"health":712,"max_health":872,"x":-1073.794311523438,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7740,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1076.634399414062,"max_power":1000,"y":264.5436706542969,"z":4.21037483215332,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":264.1171569824219,"z":4.303672313690186,"distance":0,"health":438,"max_health":438,"x":-1077.492309570312,"alive":true,"entry":2374,"level":18}}},{"label":"feeding_tick","value":{"companion":{"y":265.4340209960938,"z":4.01568603515625,"distance":0.5094594955444336,"health":712,"max_health":872,"x":-1074.843505859375,"alive":true,"entry":47662,"level":20},"corpse":{"y":264.1171569824219,"z":4.303672313690186,"distance":0,"health":0,"max_health":438,"x":-1077.492309570312,"alive":false,"entry":2374,"level":18},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7878,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1076.634399414062,"max_power":1000,"y":264.5436706542969,"z":4.21037483215332,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":6,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":265.4340209960938,"z":4.01568603515625,"distance":0.5094594955444336,"health":712,"max_health":872,"x":-1074.843505859375,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7853,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1076.634399414062,"max_power":1000,"y":264.5436706542969,"z":4.21037483215332,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":7,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":7,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":277.2396240234375,"z":1.502197265625,"distance":1.075719594955444,"health":872,"max_health":872,"x":-1097.210205078125,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7690,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1099.385864257812,"max_power":1000,"y":278.5820922851562,"z":1.18816351890564,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":279.3594360351562,"z":1.019802331924438,"distance":0,"health":472,"max_health":472,"x":-1100.6455078125,"alive":true,"entry":2374,"level":19}}},{"label":"feeding_tick","value":{"companion":{"y":277.5317687988281,"z":1.43798828125,"distance":0.5155608654022217,"health":872,"max_health":872,"x":-1097.683837890625,"alive":true,"entry":47662,"level":20},"corpse":{"y":279.3594360351562,"z":1.019802331924438,"distance":0,"health":0,"max_health":472,"x":-1100.6455078125,"alive":false,"entry":2374,"level":19},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7884,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1099.385864257812,"max_power":1000,"y":278.5820922851562,"z":1.18816351890564,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":7,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":277.5317687988281,"z":1.43798828125,"distance":0.5155608654022217,"health":872,"max_health":872,"x":-1097.683837890625,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7825,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1099.385864257812,"max_power":1000,"y":278.5820922851562,"z":1.18816351890564,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":8,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":8,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":257.5220336914062,"z":2.134033203125,"distance":1.761660575866699,"health":712,"max_health":872,"x":-1112.354125976562,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7625,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1115.452880859375,"max_power":1000,"y":256.6233215332031,"z":1.656054377555847,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":255.6410064697266,"z":1.177929997444153,"distance":0.1089169979095459,"health":472,"max_health":472,"x":-1118.839965820312,"alive":true,"entry":2374,"level":19}}},{"label":"feeding_tick","value":{"companion":{"y":255.7264709472656,"z":1.3843994140625,"distance":0.5183267593383789,"health":712,"max_health":872,"x":-1117.240478515625,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7638,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1115.452880859375,"max_power":1000,"y":256.6233215332031,"z":1.656054377555847,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":9,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":9,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":250.1234436035156,"z":3.7886962890625,"distance":1.220714330673218,"health":872,"max_health":872,"x":-1106.43505859375,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7501,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1104.9375,"max_power":1000,"y":247.9267425537109,"z":4.36671781539917,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":247.5021057128906,"z":4.536744117736816,"distance":0,"health":472,"max_health":472,"x":-1104.648071289062,"alive":true,"entry":2375,"level":19}}},{"label":"feeding_tick","value":{"companion":{"y":249.5793762207031,"z":3.92181396484375,"distance":0.5489168167114258,"health":872,"max_health":872,"x":-1106.06396484375,"alive":true,"entry":47662,"level":20},"corpse":{"y":247.5021057128906,"z":4.536744117736816,"distance":0,"health":0,"max_health":472,"x":-1104.648071289062,"alive":false,"entry":2375,"level":19},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7866,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1104.9375,"max_power":1000,"y":247.9267425537109,"z":4.36671781539917,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":9,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":249.5793762207031,"z":3.92181396484375,"distance":0.5489168167114258,"health":872,"max_health":872,"x":-1106.06396484375,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7832,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1104.9375,"max_power":1000,"y":247.9267425537109,"z":4.36671781539917,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":10,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":10,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":204.9218902587891,"z":3.5953369140625,"distance":0.4999947547912598,"health":872,"max_health":872,"x":-1130.614379882812,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7651,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1131.5400390625,"max_power":1000,"y":203.1490020751953,"z":3.593994140625,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":208.6064910888672,"z":3.516076326370239,"distance":2.578559637069702,"health":509,"max_health":509,"x":-1128.980102539062,"alive":true,"entry":2375,"level":20}}},{"label":"feeding_tick","value":{"companion":{"y":201.2244110107422,"z":3.6982421875,"distance":0.502730131149292,"health":872,"max_health":872,"x":-1132.084106445312,"alive":true,"entry":47662,"level":20},"corpse":{"y":206.2384490966797,"z":3.40606689453125,"distance":0,"health":0,"max_health":509,"x":-1130.666748046875,"alive":false,"entry":2375,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7597,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1131.5400390625,"max_power":1000,"y":203.1490020751953,"z":3.593994140625,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":10,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"feeding_tick","value":{"companion":{"y":201.2244110107422,"z":3.6982421875,"distance":0.502730131149292,"health":872,"max_health":872,"x":-1132.084106445312,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7490,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1131.5400390625,"max_power":1000,"y":203.1490020751953,"z":3.593994140625,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":3,"rewarded":false,"counters":{"1":11,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":3,"rewarded":false,"counters":{"1":11,"2":0,"3":0,"4":0},"quest":28146}},{"label":"feeding_before","value":{"companion":{"y":201.2244110107422,"z":3.6982421875,"distance":0.502730131149292,"health":712,"max_health":872,"x":-1132.084106445312,"alive":true,"entry":47662,"level":20},"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7414,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1131.5400390625,"max_power":1000,"y":203.1490020751953,"z":3.593994140625,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"target":{"y":200.5930023193359,"z":4.043970108032227,"distance":0,"health":472,"max_health":472,"x":-1131.180053710938,"alive":true,"entry":2374,"level":19}}},{"label":"feeding_tick","value":{"player":{"intellect":20,"guid":150,"stamina":43,"level":20,"mover_guid":"150","vehicle_entry":0,"health":7840,"power":1000,"loot_guid":"","agility":33,"strength":600,"x":-1131.5400390625,"max_power":1000,"y":203.1490020751953,"z":3.593994140625,"max_health":8000,"vehicle_guid":"","alive":1,"moving":0,"combat":1,"map":0,"area":295,"spirit":31,"transport":0,"zone":267},"quest":{"status":1,"rewarded":false,"counters":{"1":12,"2":0,"3":0,"4":0},"quest":28146}}},{"label":"murloc_eaten","value":{"status":1,"rewarded":false,"counters":{"1":12,"2":0,"3":0,"4":0},"quest":28146}},{"check":"rewarded quest: 28146","passed":true},{"label":"rewarded_28146","value":{"status":6,"rewarded":true,"counters":{},"quest":28146}}]} diff --git a/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_15_assessment_retry.json b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_15_assessment_retry.json new file mode 100644 index 0000000000..95fb6ef437 --- /dev/null +++ b/doc/clientless/checkpoints/hillsbrad/results/hillsbrad_15_assessment_retry.json @@ -0,0 +1 @@ +{"schema":1,"run_id":"hillsbrad_15_assessment_retry","state":"failed","started_unix_ms":1793390760255,"elapsed_ms":61442,"checks":2,"failures":1,"error":"","bots":[150],"events":[{"label":"before_accept_28192","value":{"quest":28192,"counters":{},"rewarded":false,"status":0}},{"label":"accepted_or_resumed_28192","value":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3}},{"label":"assessment_gossip","value":{"options":{},"source_guid":"17379596179855118841","id":12342}},{"label":"assessment_scene_tick","value":{"quest":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3},"player":{"map":0,"health":8000,"loot_guid":"","max_power":1000,"z":56.39839935302734,"x":-500.718994140625,"agility":33,"area":286,"vehicle_entry":0,"stamina":43,"zone":267,"power":874,"intellect":20,"vehicle_guid":"","spirit":31,"guid":150,"strength":46,"level":20,"y":90.80210113525391,"transport":0,"mover_guid":"150","moving":0,"alive":1,"combat":0,"max_health":8000}}},{"label":"assessment_scene_tick","value":{"quest":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3},"player":{"map":0,"health":8000,"loot_guid":"","max_power":1000,"z":56.39839935302734,"x":-500.718994140625,"agility":33,"area":286,"vehicle_entry":0,"stamina":43,"zone":267,"power":749,"intellect":20,"vehicle_guid":"","spirit":31,"guid":150,"strength":46,"level":20,"y":90.80210113525391,"transport":0,"mover_guid":"150","moving":0,"alive":1,"combat":0,"max_health":8000}}},{"label":"assessment_scene_tick","value":{"quest":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3},"player":{"map":0,"health":8000,"loot_guid":"","max_power":1000,"z":56.39839935302734,"x":-500.718994140625,"agility":33,"area":286,"vehicle_entry":0,"stamina":43,"zone":267,"power":623,"intellect":20,"vehicle_guid":"","spirit":31,"guid":150,"strength":46,"level":20,"y":90.80210113525391,"transport":0,"mover_guid":"150","moving":0,"alive":1,"combat":0,"max_health":8000}}},{"label":"assessment_scene_tick","value":{"quest":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3},"player":{"map":0,"health":8000,"loot_guid":"","max_power":1000,"z":56.39839935302734,"x":-500.718994140625,"agility":33,"area":286,"vehicle_entry":0,"stamina":43,"zone":267,"power":499,"intellect":20,"vehicle_guid":"","spirit":31,"guid":150,"strength":46,"level":20,"y":90.80210113525391,"transport":0,"mover_guid":"150","moving":0,"alive":1,"combat":0,"max_health":8000}}},{"label":"assessment_scene_tick","value":{"quest":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3},"player":{"map":0,"health":8000,"loot_guid":"","max_power":1000,"z":56.39839935302734,"x":-500.718994140625,"agility":33,"area":286,"vehicle_entry":0,"stamina":43,"zone":267,"power":373,"intellect":20,"vehicle_guid":"","spirit":31,"guid":150,"strength":46,"level":20,"y":90.80210113525391,"transport":0,"mover_guid":"150","moving":0,"alive":1,"combat":0,"max_health":8000}}},{"label":"assessment_scene_tick","value":{"quest":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3},"player":{"map":0,"health":8000,"loot_guid":"","max_power":1000,"z":56.39839935302734,"x":-500.718994140625,"agility":33,"area":286,"vehicle_entry":0,"stamina":43,"zone":267,"power":248,"intellect":20,"vehicle_guid":"","spirit":31,"guid":150,"strength":46,"level":20,"y":90.80210113525391,"transport":0,"mover_guid":"150","moving":0,"alive":1,"combat":0,"max_health":8000}}},{"label":"assessment_reward_attempt","value":{"quest":28192,"counters":{"1":0,"2":0,"3":0,"4":0},"rewarded":false,"status":3}},{"check":"downstream story correctly locked by incomplete assessment","passed":true},{"check":"assessment cinematic naturally completes and rewards","passed":false}]} diff --git a/doc/clientless/hillsbrad-quest-test-2026-10-30.md b/doc/clientless/hillsbrad-quest-test-2026-10-30.md new file mode 100644 index 0000000000..ec7077b7f2 --- /dev/null +++ b/doc/clientless/hillsbrad-quest-test-2026-10-30.md @@ -0,0 +1,84 @@ +# Hillsbrad-Questreihe: nativer Horde-Test, 30.10.2026 + +Getestet auf dem lokalen Entwicklungsserver mit Morvath (GUID150), einem eigenen +Untoten-Krieger auf Stufe20. Keine Adventure-KI und kein fremder Spielercharakter. +Level, Lebenspunkte, Waffenfertigkeit, Stärke und Taschen waren administrative +Testvorbereitung. Schaden, Questannahme, Dialoge, Gegenstandsbenutzung, Beute, +Begleiter, Questfortschritt und Belohnungen entstanden durch native Spieleraktionen. +Der Test prüft Funktion, nicht Schwierigkeitsgrad oder Klassenbalance. +Keine Quest wurde per Abschlussbefehl, erfundenem Credit oder bereitgestelltem +Questgegenstand übersprungen. Gameplay-Questskripte und Questdaten unverändert. + +## Ergebnis und Reichweite + +Elf Quests einschließlich erreichbarer Nebenaufgaben regulär abgeschlossen: + +| ID | Quest | Tatsächliche Prüfung | +|---|---|---| +|28571|Warchief’s Command: Hillsbrad Foothills!|Befehlstafel in Unterstadt, Annahme und Abgabe| +|28096|Welcome to the Machine|Questfahrzeug und alle drei mehrstufigen NPC-Dialoge| +|28111|Trouble at Azurelode|Annahme, Zustellung, Freischaltung der Folgeaufgaben| +|28114|Glorious Harvest|60 native Klicks auf Spinneneier an lebenden Bären| +|28115|Past Their Prime|8 echte Bärenkills| +|28144|Thieving Little Monsters!|6 Truhen normal geöffnet und Questbeute aufgenommen| +|28138|Human Infestation|8 lebende Menschen im Kampf geschwächt und mit Questfesseln gefangen| +|28156|Deep Mine Rescue|Dumass zu Fuß aus der Mine bis Keyton eskortiert; nativer Abschluss| +|28168|Trouble at the Sludge Fields|Erst nach28144 freigeschaltet, bei Stillwater abgegeben| +|28199|For Science!|6 Fleischproben von regulär getöteten und geplünderten Ghulen| +|28146|Coastal Delicacies!|Frische Annahme, Begleiter zu Fuß an die Küste geführt,12 eigene Murlockkills gefressen, Abgabe| + +Die vom Nutzer verlinkte28089 ist lokal die Cromush-Einstiegsvariante mit +beschworenen NPCs. Der tatsächliche Test verwendete die Befehlstafel-Variante28571; +beide führen zu28096.28089 selbst wurde damit nicht live nachgewiesen. + +## Gefundene Probleme + +1. **Hauptgeschichte bei28192 „No One Here Gets Out Alive“ blockiert.** + Nach Annahme bleibt der Queststatus unvollständig. Das Durchlaufen der + Schlammfelder löste keinen Abschluss aus. Auch eine erneute Annahme zu Fuß,60Sekunden Wartezeit, Öffnen des + Gossip-Dialogs und ein normaler Abgabeversuch bleiben erfolglos (Fall15). + Die Folgequest28197 bleibt dadurch regulär gesperrt. Die spätere Questreihe + wurde nicht durch künstliche Voraussetzungen freigeschaltet und ist ungetestet. + Lokale Diagnose: SourceSpellID0, Stillwater ohne ScriptName/SmartAI, keine + AreaTrigger-Zuordnung und keine Gossip-Option für die Szene. Das deutet auf + eine fehlende serverseitige Szenenauslösung hin; kein Gameplayfix vorgenommen. + Historischer Ablauf mit Szene bei Annahme: + [Cataclysm-Questführer](https://www.wow-pro.com/source-code-hillsbrad-foothills/). + +2. **28146: Begleiter nach erneutem Login instabil.** + Bei fortgesetzter Quest erscheint47662 direkt nach Login und verschwindet + nach ungefähr500ms. Fall13 zeigt dies bei stillstehendem Spieler in erlaubter + Area295, ohne Bewegung, Teleport oder Kill. Anschließende Murlockkills geben + keine Fütterungsgutschrift. Frische native Annahme bei Sarus während der + Sitzung funktioniert dagegen vollständig: Begleiter bleibt, folgt und frisst12 + echte Leichen. Damit sind Wiederherstellung nach Login und normaler Ablauf + getrennt nachgewiesen. Verhalten eines grafischen Clients noch nicht geprüft. + +## Testwerkzeug und frühere Fehlversuche + +Der Test ergänzte fehlende native TestBot-Eingaben: aktuelle Gossip-Menüs, +SpellClick/Fahrzeugausstieg, Item-/Bodenziele, Inventar-Metadaten, Opening-Casts, +Fertigkeiten und Bestätigung der erlaubten aktiven Bewegungseinheit. Diese +Änderungen wurden mit-j10 gebaut, installiert und im frischen Serverlauf benutzt. +Fehler bei anfangs falscher Waffenfertigkeit, zurückgesetztem Gossip-Dialog, +GAMEOBJ_USE statt Opening, falschem Locktyp und unterbrochenen Öffnungszaubern +waren Testablauffehler; sie sind keine gefundenen Questfehler. Native Truhen +verwenden Locktyp13 und Opening22810; reale Kampfunterbrechungen bleiben wirksam. + +Der externe Python/SOAP-Adaptertest mit lokalem HTTP-Fixture bestand ebenfalls. +SOAP am Worldserver bleibt deaktiviert; keine Live-SOAP-Anmeldung behauptet. +Native JSON-Ergebnisse stehen im Unterverzeichnis results, lokale Datenbefunde +in diagnostic-db.json. Reproduzierbare Lua-Fälle liegen unter +src/server/scripts/Custom/clientless/testbots/hillsbrad_*.lua. Einzelne Fälle +setzen den beschriebenen persistenten Charakterstand voraus. Frische Erzeugung +mit dem bereits belegten Namen Morvath ist nicht wiederholbar; login150 verwenden. +Dateiaufträge haben keine garantierte Ausführungsreihenfolge: abhängige Fälle erst +nach abgeschlossenem Vorgänger einreichen. + +Der absichtliche negative Abgabeversuch bei28192 erzeugt die erwartete native +QUEST_STATUS_COMPLETE-Warnung (nicht erlaubt). Das ist kein zusätzlicher Fehler. + +Normalbetrieb wiederhergestellt: Loader1, Timeout300, bekannte Population110, +Poolziele50/5/50/5. Runtime enabled1/schema1/busy0 ohne Loaderfehler; erfolgreiche +gestaffelte Logins in allen vier Pools beobachtet. Testcharakter150 offline. +Worldserver490158 blieb aktiv, Ports8085/8087 geprüft. Kein weiterer Neustart. diff --git a/doc/clientless/testbot-validation-2026-10-30.md b/doc/clientless/testbot-validation-2026-10-30.md new file mode 100644 index 0000000000..4c0f5ffa36 --- /dev/null +++ b/doc/clientless/testbot-validation-2026-10-30.md @@ -0,0 +1,66 @@ +# Testbot-Abnahme im Testserver,30.10.2026 + +Build `-j10` und Installation erfolgreich, finale Konsole +`/tmp/vcore-testbot-final-start.log`. Frische Ready-Meldung und Ports8085/8087 +bestätigt, Prozess484034.115Clientless-Tests bestanden; SOAP-Adapter nochmals +nach Ergänzung des Clienttimeouts gegen echte lokale HTTP/SOAP-Fixture geprüft. +Der echte SOAP-Listener bleibt unverändert deaktiviert; Remote-Authentifizierung +ist somit nicht am laufenden Server abgenommen. Native submit/result-Kommandos +und Dateiaufträge sind live geprüft. + +## Live-Ergebnisse + +| Lauf | Zustand | Prüfungen | Aussage | +|---|---|---:|---| +| `await_deadline` | failed | 0 | Echte Wartefrist sichtbar fehlgeschlagen. | +| `boot_interrupted` | interrupted | 0 | Persistierter running-Zustand nach Start als interrupted erkannt; keine Wiederholung. | +| `cancel_case` | cancelled | 0 | Konsole bricht wartenden Lauf ab. | +| `cli_ingress` | passed | 1 | Base64-Auftrag über administratives Kommando ausgeführt. | +| `deadline_enforced` | timed_out | 0 | Konfigurierbare1s-Laufzeitgrenze beendet60s-Warteauftrag als timed_out. | +| `false_assertion` | failed | 1 | Absichtlich falsche Prüfung ergibt failed. | +| `foreign_character` | failed | 0 | Allitester-GUID21 abgewiesen; keine Übernahme. | +| `instruction_limit` | failed | 0 | Endlosschleife vom Instruktionsbudget beendet. | +| `lua_smoke` | passed | 1 | Eigener Lua-Zustand und JSON-Beobachtung. | +| `memory_limit` | failed | 0 | 16MiB-Anforderung scheitert am8MiB-Limit, Server läuft weiter. | +| `native_fresh_fullquest` | passed | 3 | Neuer Charakter149: Annahme,sechs reale Killcredits,Questabschluss und Abgabe in einem Lauf. | +| `native_full_quest` | failed | 1 | Zwei reale Kills/Credits, dann Script-Timeout an beweglichem Ziel; kein Corefehler kaschiert. | +| `native_full_quest_follow` | passed | 3 | Lua-Nachlaufen ergänzt; restliche Credits und native Belohnungswahl bestanden. | +| `native_quest_accept` | failed | 0 | Erster Fixturefehler: Magierquest28757 für Krieger; native Ablehnung korrekt. | +| `native_quest_replay` | passed | 3 | Native Aufgabe abbrechen, Klassenbeschränkung prüfen, erneut annehmen. | +| `native_quest_warrior` | passed | 1 | Passende Kriegerquest28766 nativ angenommen. | +| `paused_admission` | passed | 1 | Aktiver Lauf beendet sich trotz Pause; wartender Auftrag erst nach resume gestartet. | +| `prepare_and_move` | passed | 5 | Level,Grundwerte,HP,Ausrüstung,Inventar,Battle-Shout-Cast undMMAP-Bewegung. | +| `runtime_failure` | failed | 0 | Absichtlicher Lua-Laufzeitfehler isoliert. | +| `state_isolation` | passed | 1 | Variable im zweiten Lauf nicht vorhanden. | +| `state_writer` | passed | 1 | Variable im ersten Lauf gesetzt. | +| `syntax_failure` | failed | 0 | Syntaxfehler als failed ohne Bot-Anmeldung. | +| `unrestricted_travel` | passed | 1 | Stufe1 nach Nordend und zurück teleportiert, ohne Adventure-Filter. | + +## Daten und Grenzen + +Zwei reine Testcharaktere: GUID148Testrion und149Testaria auf normalem Botaccount17. +Beide sind im Testbot-Register, nicht in der Adventure-Generierung. Charaktere, +Inventar und Questergebnisse bleiben zur Untersuchung erhalten. Alle Testläufe +fordern Logout ihrer eigenen Akteure an; final sind beide offline. +Konkrete Rohresultate liegen unter +`/home/wow_admin/wow_cata_server/server/debug/testbots/results/`, zusammengeführt +unter `/tmp/vcore-testbot-validation-results.json` und reproduzierbar im +Repository unter `doc/clientless/checkpoints/2026-10-30-testbots/results.json`. + +Quests wurden nicht künstlich abgeschlossen; Vorbereitung durfte Stats und +Positionen setzen, Kampfschaden und Killcredits kamen aus normalen Spieler- +Nahkampfangriffen. Der frische vollständige Test hat ein nicht erreichbares +bewegliches Ziel protokolliert und einen anderen passenden Gegner angegriffen; +alle sechs gezählten Credits wurden anschließend nativ bestätigt. Keine +allgemeine autonome Kampf-/Quest-KI: solche Abläufe gehören in das Testskript. + +Gossip,GameObject-Klick,Loot und Itembenutzung sind an native Handler angebunden +und kompiliert, aber nicht jede dieser Aktionen wurde in dieser Sitzung separat +im Spiel abgenommen. Das macht sie als API verfügbar, ersetzt weitere konkrete +Spielsystemtests jedoch nicht. Der Simulator ersetzt keinen gerenderten Client. +Kein Push, kein neuer Commit; vorherige Portal-/Transportänderungen erhalten. + +Nach Abschluss der Tests: ursprünglicher Adventure-Loaderwert1 wiederhergestellt, +sicherer Logoutmodus resumed,Config/Population neu geladen. Normale Pools +50/5/50/5 laufen wieder schrittweise an. TestBot-Controller bleibt aktiviert; +Auftragseingang resumed,Standardfrist wieder300Sekunden. diff --git a/doc/clientless/testbots.md b/doc/clientless/testbots.md new file mode 100644 index 0000000000..50da0f8c10 --- /dev/null +++ b/doc/clientless/testbots.md @@ -0,0 +1,182 @@ +# Lua-gesteuerte Testbots + +Testbots sind ein eigener Verbraucher des Clientless Player Core. Sie laden keine +Adventure-Profile, keinen Tagesplan, keine Versorgungs-, Gruppen- oder Kampf-KI. +Die Adventure-Population verwaltet diese Charaktere nicht. Ausführung erfolgt im +Worldthread durch einen getrennten Lua-Zustand pro Testlauf. Normale Serverphysik +und Prüfungen echter Spieleraktionen bleiben wirksam; administrative Vorbereitung +ist davon getrennt. DungeonBots bleiben unabhängig. + +## Einstieg und Ergebnis + +```ini +Clientless.TestBot.Enabled = 1 +Clientless.TestBot.Root = "/path/to/testbots" +Clientless.TestBot.TimeoutSeconds = 300 +``` + +Der Root enthält `requests`, `scripts`, `results`, `archive` und `registry`. +Keine Installation und kein Neustart für neue Lua-Testskripte erforderlich. +Dateiaufträge zuerst außerhalb von `requests` schreiben und atomar nach +`requests/.lua` verschieben. Alternativ: + +```text +clientless test pause +clientless test resume +clientless test run +clientless test submit +clientless test status +clientless test result +clientless test cancel +``` + +`run` lädt `scripts/.lua`. `submit` nimmt bis64KiB Lua entgegen und +stellt es in die Dateiwarteschlange. Die vorhandenen GM-/SOAP-Rechte schützen +diesen administrativen Einstieg; es wird kein neuer Netzwerkdienst geöffnet. +Skripte sind administrative Testaufträge für vertrauenswürdige Betreiber. + +Ein Test läuft zur Zeit, kann aber mehrere Bots steuern. Dateiaufträge warten; +ihre Reihenfolge ist nicht garantiert. Abhängige Fälle erst nach abgeschlossenem +Vorgänger einreichen. +`pause` hält die Annahme neuer Läufe an; laufende Tests werden separat mit +`cancel` beendet. Vor Builds Testannahme pausieren, aktive Tests beenden und +dann den sicheren Logout aller Clientless-Sessions abwarten. +IDs werden nie wiederverwendet. `results/.json` wird per atomarem Umbenennen +veröffentlicht: Schema1, Run-ID, Zustand, Startzeit, Dauer, Prüfungs-/Fehlerzahl, +Fehlermeldung, Bot-GUIDs und Beobachtungen. Terminalzustände sind `passed`, +`failed`, `cancelled`, `timed_out`, `interrupted`. Bei Neustart werden zuvor +laufende Tests als `interrupted` markiert und nicht still wiederholt. +`record`/`check` publizieren mit dem nächsten Yield bzw. Abschluss. + +Ende/Fehler/Abbruch fordert den Logout ausschließlich der zum Lauf gehörenden +Testbots an. Charaktere und deren regulär gespeicherter Quest-/Inventarstand +bleiben zur Untersuchung und Wiederverwendung erhalten. Eine Ausgabe `passed` +bedeutet nur, dass das Skript ohne Fehler und ohne fehlgeschlagene `check`-Prüfung +endete; die Aussagekraft hängt von den tatsächlich formulierten Prüfungen ab. + +Der Python-Adapter kann über vorhandenes SOAP ohne tmux-/Datenbankzugriff arbeiten: + +```bash +# TESTBOT_PASSWORD über die Umgebung des ausführenden Systems bereitstellen. +python3 tools/testbots/client.py quest-001 case.lua \ + --endpoint http://127.0.0.1:7878/ --user operator --output result.json +``` + +SOAP bleibt standardmäßig deaktiviert; der Adapter verwendet die vorhandene +Trinity-SOAP-Konfiguration und Berechtigungen. Dateieingang und lokale Konsole +funktionieren unabhängig von SOAP. Exitcode0: passed,1: anderer Terminalzustand, +2: Übertragungs-/Clientfehler. `--timeout` setzt die Client-Wartefrist. Ein Clienttimeout beendet den serverseitigen Lauf +nicht; er kann anschließend abgefragt oder abgebrochen werden. + +## Charakterinitialisierung vollständig in Lua + +```lua +local bot = testbot.create(account_id, "Testrion", 1, 1, 10, 0) +-- Parameter: normaler Testaccount, Name, Rasse, Klasse, Level, Geschlecht. +-- Rückkehr erst nach asynchronem Erzeugen und abgeschlossener Anmeldung. +testbot.level(bot, 10) +testbot.clear_slot(bot, 15) -- vorhandene Haupthand bewusst entfernen +assert(testbot.equip(bot, 15, 25)) +testbot.stat(bot, 0, 100) -- Grundwert Stärke; 0..4: Stärke bis Willenskraft +-- Lebens-/Ressourcenwerte zuletzt setzen, nach Level/Ausrüstung/Grundwerten: +testbot.stats(bot, 5000, 100) +assert(testbot.teleport(bot, 0, -8912, -138, 80.9, 0)) +testbot.await(function() return testbot.online(bot) end, 10000, "Teleport") +testbot.record("start", testbot.state(bot)) +testbot.check(testbot.state(bot).level == 10, "Level vorbereitet") +``` + +Charaktererzeugung nutzt die generische native CharacterFactory, keine +Adventure-Generierung. Account muss normal sein und einen freien Charakterslot +haben; Rasse/Klasse/Name müssen für den Core gültig sein. Ein erzeugter Charakter +wird im Testbot-Register hinterlegt. Später `testbot.login(guid)` verwenden. +Nur registrierte Testcharaktere dürfen angemeldet werden; fremde Spieler und +AdventureBots werden nicht übernommen. Keine vorhandenen Figuren werden geklont. +Aufgabenspezifische Stats werden bei Bedarf in jedem Lauf erneut gesetzt. + +## Lua-API + +Alle Bot-GUIDs stammen aus `create` oder `login`. Jede Aktion überprüft die +Zugehörigkeit zum aktuellen Lauf. Nach Teleports auf `online` warten. + +| Funktion | Wirkung / Rückgabe | +|---|---| +| `create(account,name,race,class,level,gender)` | Charakter erzeugen und anmelden; GUID | +| `login(guid)` | Registrierten Testcharakter anmelden, auf Login warten; GUID | +| `online(guid)` | Anmeldung und Teleport abgeschlossen | +| `wait(ms)` | Coroutine abgeben,0..60000ms; blockiert den Server nicht | +| `await(predicate,timeout_ms,label)` | Bedingung mit echter Laufzeitfrist prüfen | +| `now_ms()` | Monotone Millisekunden seit Laufbeginn | +| `state(guid)` | Map,XYZ,Level,HP/Ressource,alive/combat/moving/transport (0/1) | +| `teleport(guid,map,x,y,z,o)` | Administrativer nativer Teleport; bool | +| `level(guid,level)` | Level1..85 samt Talentgrundinitialisierung | +| `stat(guid,index,value)` | Grundwert0..4 über natives Stats-System setzen | +| `stats(guid,max_hp,max_power?)` | Lebens-/aktuelle Klassenressource auffüllen | +| `learn(guid,spell)` | Vorbereitung: einen gültigen Zauber lernen | +| `item(guid,item,count)` | Vorbereitung: Inventargegenstände bereitstellen; bool | +| `clear_slot(guid,slot)` | Vorbereitung: Gegenstand im Ausrüstungs-/Taschenslot0..22 löschen | +| `equip(guid,slot,item)` | Vorbereitung: leeren Slot nativ ausrüsten; bool | +| `item_count(guid,item)` | Aktuelle Inventaranzahl ohne Bank | +| `move(guid,x,y,z)` | Native MMAP-/MovePoint-Bewegung ohne Gebietskatalog; bool | +| `stop(guid)` | Angriff und aktuelle Bewegung stoppen | +| `creature(guid,spawn)` / `object(guid,spawn)` | Sichtbarer geladener Spawn; vollständige GUID als String oder nil | +| `target_state(guid,target)` | Geladenes Unit-Ziel: HP,alive,Distanz,XYZ; sonst nil | +| `face(guid,target)` | Zum geladenen Ziel ausrichten | +| `attack(guid,target)` | Nativen Nahkampfangriff beginnen; bool | +| `cast(guid,spell,target?)` | Nicht getriggerter nativer Cast, Standardziel selbst; SpellCastResult (Erfolg255) | +| `use_item(guid,bag,slot,spell,target?)` | Nativer Spieler-UseItem-Handler | +| `use(guid,object)` | Nativer GameObject-Klick | +| `gossip(guid,target,menu,option,code?)` | Native Gossip-Auswahl, optional Texteingabe | +| `hello(guid,target)` | Nativen Questgeberdialog öffnen | +| `accept(guid,target,quest)` | Normale Questannahme über Spieler-Handler | +| `abandon(guid,quest)` | Quest über nativen Questlog-Handler abbrechen | +| `request_reward(guid,target,quest)` | Nativen Abgabedialog anfordern; erzwingt keine Zielerfüllung | +| `reward(guid,target,quest,choice)` | Native Belohnungswahl0..5; Eligibility bleibt erhalten | +| `quest(guid,quest)` | Status und rewarded; NONE0,COMPLETE1,INCOMPLETE3,FAILED5 | +| `objectives(guid,quest)` | Vier native Questlog-Zähler (Lua-Indizes1..4) | +| `loot(guid,target)` | Native Lootöffnung einer Kreaturenleiche; Truhen über den passenden Opening-Zauber öffnen | +| `loot_item(guid,slot)` / `loot_release(guid,target)` | Lootgegenstand aufnehmen / Fenster schließen | +| `record(label,value)` | JSON-Beobachtung; Skalare oder begrenzte Tabellen | +| `check(condition,label)` | Prüfung protokollieren; false macht Endergebnis failed | + +Zusätzliche Eingaben und Beobachtungen für mehrstufige Questtests: + +| Funktion | Wirkung / Rückgabe | +|---|---| +| `skill(guid,id,value,max)` | Vorbereitung: gültige Fertigkeit nativ setzen; bool | +| `remove_item(guid,item,count)` | Vorbereitung: Gegenstände entfernen | +| `inventory(guid)` | Gegenstände mit bag/slot/item/count, GUID-String und spells[{id,trigger}] | +| `nearest_creature(guid,entry,radius)` / `nearest_object(guid,entry,radius)` | Sichtbares Ziel innerhalb maximal100Yards; GUID-String oder nil | +| `npc_hello(guid,target)` | Nativen Gossip-Dialog öffnen | +| `menu(guid)` | Aktuelle id/source_guid und options[{id,text,action,coded}] | +| `spellclick(guid,target)` | Nativer NPC-Zauberklick, etwa Questfahrzeuge | +| `exit_vehicle(guid)` | Normalen Fahrzeugausstieg anfordern | +| `request_cast(guid,spell,target?)` | Normales Client-Cast-Paket, Unit-/GO-Ziel automatisch | +| `request_cast_at(guid,spell,x,y,z)` | Client-Cast mit Bodenziel | +| `use_item_at(guid,bag,slot,spell,x,y,z)` | Itembenutzung mit Bodenziel | +| `area_trigger(guid,id)` | Nativer AreaTrigger-Handler; echte Position wird geprüft | + +`state` enthält zusätzlich area/zone, loot_guid, vehicle_entry/vehicle_guid und +mover_guid. `target_state` enthält zusätzlich entry/level/max_health. Ein Testbot +bestätigt seine erlaubte kontrollierte Einheit über den normalen ActiveMover- +Handler, auch beim Wechsel in ein Fahrzeug. Das umgeht keine Bewegungsrechte. +Ein GameObject-Klick öffnet nicht automatisch jede Truhe: Dafür muss wie beim +Client der zu Lock.dbc passende Opening-Zauber verwendet werden. Native +Unterbrechungen durch Kampf gelten auch für solche Zauber. + +GUID-Strings von `creature`/`object` umgehen Lua-Präzisionsverlust bei64Bit-GUIDs. +Aktionen mit `void`/ohne Rückgabe bestätigen nur den Aufruf: anschließend Status, +Inventar oder Questfortschritt prüfen. Ein versendeter Handleraufruf allein ist +kein Erfolgsnachweis. Quests werden nicht durch künstliche Credits abgeschlossen. +Normale Casts prüfen Kosten, Reichweite, Cooldowns usw.; Vorbereitung darf diese +Bedingungen gezielt durch Level, Stats, Items und gelernte Zauber herstellen. +Native MMAP-Bewegung braucht begehbaren Boden; Teleport steht unabhängig davon +zur Verfügung. Das konkrete Questbeispiel steht unter +`src/server/scripts/Custom/clientless/testbots/quest_accept.lua`. + +Lua hat pro Lauf8MiB und pro Ausführungsschritt100000Instruktionen, danach muss +es mit `wait`/`await` abgeben. Keine Datei-/OS-/Package-/Debug-Funktionen und kein +Abfangen des Ressourcenabbruchs durch `pcall`/eigene Coroutines. Maximal1000 +Beobachtungen; Tabellen werden für Ergebnisse begrenzt serialisiert. Laufzeit +ist per Config1..86400Sekunden einstellbar. Das ist eine administrative +Testumgebung, keine Isolation für beliebigen fremden Code oder Corefehler. diff --git a/doc/clientless/transport-tools.md b/doc/clientless/transport-tools.md index 6861869ded..57a1045bd3 100644 --- a/doc/clientless/transport-tools.md +++ b/doc/clientless/transport-tools.md @@ -104,7 +104,8 @@ Aufnahme ausdrücklich entfernt wurde. ## 3. Land -> Deck aufnehmen -Wieder am gemeinsamen Haltestellen-Node auf festem Boden stehen. Auf die nächste +Wieder auf festem Boden höchstens 5 Yards vom gemeinsamen Haltestellen-Node +entfernt stehen. Auf die nächste Ankunft warten, damit ein vollständiges Haltefenster verfügbar ist: ```text @@ -127,8 +128,11 @@ bereits, muss der GM höchstens 1,5 Yards davon entfernt stehen. Die Aufnahme muss während desselben Halts beendet werden. Abfahrt, Transportwechsel, Verlassen des Fahrzeugs nach bereits erfolgtem Einstieg, -Positionssprünge über 8 Yards, Flug oder ein Übergang über 60 Yards machen sie -ungültig. Vorhandene Aufnahmen werden nicht still überschrieben. +Flug oder ein Übergang über 60 Yards machen sie +ungültig. Einzelne Messabstände über 8 Yards sind erlaubt, weil native +Einstiege Höhenkorrekturen und verzögert übertragene Bewegung enthalten können. +Keine Teleports während der Aufnahme verwenden. Vorhandene Aufnahmen werden +nicht still überschrieben. ```text .clientless transport record cancel diff --git a/sql/custom/world/2026_10_30_01_capital_click_portals.sql b/sql/custom/world/2026_10_30_01_capital_click_portals.sql new file mode 100644 index 0000000000..4ea50691ae --- /dev/null +++ b/sql/custom/world/2026_10_30_01_capital_click_portals.sql @@ -0,0 +1,83 @@ +-- Native clickable capital portals. Preserve operator positions and disabled edges. +-- No invented portals or destinations; sources and fixed targets come from the +-- spawned objects, spell_target_position and deterministic native spell_scripts. +CREATE TEMPORARY TABLE vcore_capital_portal_seed ( + spawn_id INT UNSIGNED PRIMARY KEY, expected_entry INT UNSIGNED NOT NULL, faction TINYINT UNSIGNED NOT NULL, + travel_enabled TINYINT UNSIGNED NOT NULL DEFAULT 1 +); +INSERT INTO vcore_capital_portal_seed VALUES + (217855,195141,1,1),(219119,195141,1,1),(151163,195141,1,1),(219120,207995,1,1), + (203251,195142,2,1),(214456,195142,2,1),(151162,195142,2,1),(12608,184502,2,1),(203457,184503,2,1), + (56568,191009,2,1),(61217,190960,1,1),(57634,193604,3,1),(60709,194011,3,1),(151243,194012,3,1),(61496,193772,3,1), + (83,183325,1,1),(47196,187056,3,1), + (219963,195141,1,1),(211298,195142,2,1),(211359,195142,2,1),(218904,195142,2,1),(219035,206595,2,1), + -- Quest scenario entry points are visible nodes, not ordinary transit shortcuts. + (223195,205268,1,0),(223199,205268,2,0); + +CREATE TEMPORARY TABLE vcore_capital_portal_native AS +SELECT g.guid,g.id entry,t.type, + IF(t.type=10,t.data10,t.data0) spell_id, + g.map source_map,g.position_x sx,g.position_y sy,g.position_z sz,g.orientation so, + COALESCE(p.MapID,c.MapID,d.datalong) target_map, + COALESCE(p.PositionX,c.PositionX,d.x) tx,COALESCE(p.PositionY,c.PositionY,d.y) ty, + COALESCE(p.PositionZ,c.PositionZ,d.z) tz,COALESCE(p.Orientation,c.Orientation,d.o) target_o, + seed.faction,seed.travel_enabled +FROM vcore_capital_portal_seed seed JOIN gameobject g ON g.guid=seed.spawn_id AND g.id=seed.expected_entry +JOIN gameobject_template t ON t.entry=g.id AND t.type IN(10,22) +LEFT JOIN spell_target_position p ON p.ID=IF(t.type=10,t.data10,t.data0) AND p.EffectIndex=0 +LEFT JOIN spell_scripts cast_script ON cast_script.id=IF(t.type=10,t.data10,t.data0) + AND cast_script.effIndex=0 AND cast_script.command=15 AND cast_script.datalong2=2 AND cast_script.delay<=3 +LEFT JOIN spell_target_position c ON c.ID=cast_script.datalong AND c.EffectIndex=0 +LEFT JOIN spell_scripts d ON d.id=IF(t.type=10,t.data10,t.data0) + AND d.effIndex=0 AND d.command=6 AND d.datalong2=0 AND d.delay<=3 +WHERE COALESCE(p.MapID,c.MapID,d.datalong) IS NOT NULL; + +START TRANSACTION; +INSERT IGNORE INTO vcore_clientless_world_point +(point_key,category,map,position_x,position_y,position_z,orientation,enabled,comment) +SELECT CONCAT('portal_go_',guid,'_source'),'travel_portal',source_map,sx,sy,sz,so,1,'Native capital portal source' FROM vcore_capital_portal_native; +INSERT IGNORE INTO vcore_clientless_world_point +(point_key,category,map,position_x,position_y,position_z,orientation,enabled,comment) +SELECT CONCAT('portal_go_',guid,'_target'),'travel_portal',target_map,tx,ty,tz,target_o,1,'Native capital portal target' FROM vcore_capital_portal_native; +INSERT IGNORE INTO vcore_clientless_travel_node(node_key,node_type,world_point_key,enabled,comment) +SELECT w.point_key,'portal',w.point_key,1,'Native capital clickable portal' +FROM vcore_clientless_world_point w JOIN vcore_capital_portal_native p + ON w.point_key IN(CONCAT('portal_go_',p.guid,'_source'),CONCAT('portal_go_',p.guid,'_target')); +INSERT IGNORE INTO vcore_clientless_travel_edge(from_node_key,to_node_key,edge_type,cost,bidirectional,enabled,comment) +SELECT CONCAT('portal_go_',guid,'_source'),CONCAT('portal_go_',guid,'_target'),'portal_use',1,0,travel_enabled, + IF(travel_enabled=1,'Native capital portal click','Quest scenario portal; ordinary transit disabled') FROM vcore_capital_portal_native; +INSERT IGNORE INTO vcore_clientless_portal_use(edge_id,gameobject_spawn_id,gameobject_entry,spell_id) +SELECT e.id,p.guid,p.entry,p.spell_id FROM vcore_capital_portal_native p JOIN vcore_clientless_travel_edge e + ON e.from_node_key=CONCAT('portal_go_',p.guid,'_source') AND e.to_node_key=CONCAT('portal_go_',p.guid,'_target') AND e.edge_type='portal_use'; +INSERT IGNORE INTO vcore_clientless_node_access(node_key,allowed_factions,notes) +SELECT CONCAT('portal_go_',guid,'_source'),faction,'Capital faction; area catalog remains authoritative' FROM vcore_capital_portal_native; +COMMIT; +DROP TEMPORARY TABLE vcore_capital_portal_native; +DROP TEMPORARY TABLE vcore_capital_portal_seed; + +-- Dalaran well: same-map walk-through portal, previously skipped by bulk import. +-- Source from local Cataclysm AreaTrigger.dbc ID5273; target stays native DB data. +INSERT IGNORE INTO vcore_clientless_world_point +(point_key,category,map,position_x,position_y,position_z,orientation,enabled,comment) +SELECT 'portal_at_5273_source','travel_portal',571,5886.270020,651.448975,640,0,1,'Native Dalaran well AreaTrigger5273' +FROM areatrigger_teleport WHERE ID=5273; +INSERT IGNORE INTO vcore_clientless_world_point +(point_key,category,map,position_x,position_y,position_z,orientation,enabled,comment) +SELECT 'portal_at_5273_target','travel_portal',target_map,target_position_x,target_position_y,target_position_z,target_orientation,1,'Native Dalaran well destination' +FROM areatrigger_teleport WHERE ID=5273; +INSERT IGNORE INTO vcore_clientless_travel_node(node_key,node_type,world_point_key,enabled,comment) +SELECT point_key,'portal',point_key,1,'Native Dalaran well portal' FROM vcore_clientless_world_point WHERE point_key IN('portal_at_5273_source','portal_at_5273_target'); +INSERT IGNORE INTO vcore_clientless_travel_edge(from_node_key,to_node_key,edge_type,cost,bidirectional,enabled,comment) +SELECT 'portal_at_5273_source','portal_at_5273_target','portal',1,0,1,'Native Dalaran well AreaTrigger5273' FROM areatrigger_teleport WHERE ID=5273; + +-- Purple Parlor return: native visitor teleport must be cast by its visitor, +-- as with the existing public-portal fix. Preserve all target and spell checks. +UPDATE gameobject_template SET data6=1 +WHERE entry=194012 AND type=22 AND data0=61420 AND data2=0 AND data6=0; + +-- Native Shattrath->Stormwind click revalidated on 2026-10-30 after the +-- earlier playerCast repair. Remove ONLY the obsolete diagnostic disable. +UPDATE vcore_clientless_travel_edge SET enabled=1,comment='Native capital portal click; obsolete LOS test restriction resolved' +WHERE from_node_key='portal_go_83_source' AND to_node_key='portal_go_83_target' + AND edge_type='portal_use' AND enabled=0 + AND comment='Disabled test portal: native Shattrath spell effects rejected by LOS; level 20/60 tested'; diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index f92379c30c..079a47ba0a 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "ClientlessBrowserPolicy.h" #include "BattlegroundQueue.h" #include "ArenaTeam.h" #include "ArenaTeamMgr.h" @@ -112,6 +113,10 @@ bool BattlegroundQueue::SelectionPool::KickGroup(uint32 size) // returns false when selection pool is full bool BattlegroundQueue::SelectionPool::AddGroup(GroupQueueInfo* ginfo, uint32 desiredCount) { + for(auto const& member:ginfo->Players) + if(!ginfo->ArenaType && ClientlessBrowserPolicy::Bot(ObjectAccessor::FindConnectedPlayer(member.first)) && + (!ClientlessBrowserPolicy::QueueEnabled(ClientlessBrowserPolicy::Kind::Battleground) || + !ClientlessBrowserPolicy::JoinEnabled(ClientlessBrowserPolicy::Kind::Battleground)))return true; //if group is larger than desired count - don't allow to add it to pool if (!ginfo->IsInvitedToBGInstanceGUID && desiredCount >= PlayerCount + ginfo->Players.size()) { @@ -431,6 +436,7 @@ uint32 BattlegroundQueue::GetPlayersInQueue(TeamId id) bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, uint32 side) { + if(!bg->isArena() && !CanInviteSelected(bg))return false; // set side if needed if (side) ginfo->Team = side; @@ -634,7 +640,7 @@ bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint } } //premade selection pools are set - return true; + return CanInviteSelected(); } } // now check if we can move group from Premade queue to normal queue (timer has expired) or group size lowered!! @@ -696,6 +702,7 @@ bool BattlegroundQueue::CheckNormalMatch(Battleground* /*bg_template*/, Battlegr return false; } //allow 1v0 if debug bg + if(!CanInviteSelected())return false; if (sBattlegroundMgr->isTesting() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount())) return true; //return true if there are enough players in selection pools - enable to work .debug bg command correctly @@ -1104,3 +1111,21 @@ void BGQueueRemoveEvent::Abort(uint64 /*e_time*/) { //do nothing } + +bool BattlegroundQueue::CanInviteSelected(Battleground* existing) const +{ + std::vector participants; + for(auto const& pool:m_SelectionPools) + for(auto group:pool.SelectedGroups) + for(auto const& member:group->Players)participants.push_back(member.first); + if(existing)for(auto const& member:existing->GetPlayers())participants.push_back(member.first); + return ClientlessBrowserPolicy::CanMatch(participants,ClientlessBrowserPolicy::Kind::Battleground); +} +bool BattlegroundQueue::CanClientlessEnter(Battleground* bg) const +{ + std::vector participants; + for(auto const& member:bg->GetPlayers())participants.push_back(member.first); + for(auto const& queued:m_QueuedPlayers) + if(queued.second.GroupInfo && queued.second.GroupInfo->IsInvitedToBGInstanceGUID==bg->GetInstanceID())participants.push_back(queued.first); + return ClientlessBrowserPolicy::CanMatch(participants,ClientlessBrowserPolicy::Kind::Battleground); +} diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h index cd22e963c8..e13465c6fa 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.h +++ b/src/server/game/Battlegrounds/BattlegroundQueue.h @@ -82,6 +82,8 @@ class TC_GAME_API BattlegroundQueue void FillPlayersToBG(Battleground* bg, BattlegroundBracketId bracket_id); bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam); + bool CanInviteSelected(Battleground* existing = nullptr) const; + bool CanClientlessEnter(Battleground* bg) const; bool CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers); bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam); GroupQueueInfo* AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0); diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index dc3a87895e..f1f35056e6 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -16,6 +16,7 @@ */ #include "LFGMgr.h" +#include "ClientlessBrowserPolicy.h" #include "Common.h" #include "DatabaseEnv.h" #include "DBCStores.h" @@ -419,12 +420,12 @@ void LFGMgr::Update(uint32 diff) if (lastProposalId != m_lfgProposalId) { - // FIXME lastProposalId ? lastProposalId +1 ? - for (LfgProposalContainer::const_iterator itProposal = ProposalsStore.find(m_lfgProposalId); itProposal != ProposalsStore.end(); ++itProposal) + std::vector created; + for(auto it=ProposalsStore.upper_bound(lastProposalId);it!=ProposalsStore.end();++it)created.push_back(it->first); + for(auto proposalId:created) { - uint32 proposalId = itProposal->first; - LfgProposal& proposal = ProposalsStore[proposalId]; - + auto found=ProposalsStore.find(proposalId);if(found==ProposalsStore.end())continue; + LfgProposal& proposal=found->second; ObjectGuid guid; for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers) { @@ -445,6 +446,13 @@ void LFGMgr::Update(uint32 diff) } } + std::vector> botAnswers; + for(auto const& entry:ProposalsStore) + for(auto const& member:entry.second.players) + if(member.second.accept==LFG_ANSWER_PENDING && ClientlessBrowserPolicy::Bot(ObjectAccessor::FindConnectedPlayer(member.first))) + botAnswers.emplace_back(entry.first,member.first); + for(auto const& answer:botAnswers)UpdateProposal(answer.first,answer.second,true); + // Update all players status queue info and shortage status if (m_QueueTimer > LFG_QUEUEUPDATE_INTERVAL) { @@ -548,7 +556,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const joinData.result = LFG_JOIN_INTERNAL_ERROR; else if (grp) { - if (grp->GetMembersCount() > MAXGROUPSIZE) + if (grp->GetMembersCount() > (GetLFGDungeon(*dungeons.begin()) && GetLFGDungeon(*dungeons.begin())->IsRaid()?25u:MAXGROUPSIZE)) joinData.result = LFG_JOIN_TOO_MUCH_MEMBERS; else { @@ -624,6 +632,14 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const } } + if(joinData.result==LFG_JOIN_OK) + { + auto data=dungeons.empty()?nullptr:GetLFGDungeon(*dungeons.begin()); + auto kind=data && data->IsRaid()?ClientlessBrowserPolicy::Kind::Raid:ClientlessBrowserPolicy::Kind::Dungeon; + if(!ClientlessBrowserPolicy::QueueEnabled(kind)) + for(auto guid:players)if(ClientlessBrowserPolicy::Bot(ObjectAccessor::FindConnectedPlayer(guid))) + {joinData.result=LFG_JOIN_NOT_MEET_REQS;break;} + } // Can't join. Send result if (joinData.result != LFG_JOIN_OK) { @@ -812,6 +828,16 @@ WorldPackets::LFG::RideTicket const* LFGMgr::GetTicket(ObjectGuid guid) const return nullptr; } +/// True only while this member still owes a role choice. +bool LFGMgr::IsRoleCheckPending(ObjectGuid gguid,ObjectGuid guid) const +{ + auto check=RoleChecksStore.find(gguid); + if(check==RoleChecksStore.end() || check->second.state!=LFG_ROLECHECK_INITIALITING)return false; + auto member=check->second.roles.find(guid); + return member!=check->second.roles.end() && member->second==PLAYER_ROLE_NONE; +} + + /** Update the Role check info with the player selected role. @@ -819,6 +845,7 @@ WorldPackets::LFG::RideTicket const* LFGMgr::GetTicket(ObjectGuid guid) const @param[in] guid Player guid (0 = rolecheck failed) @param[in] roles Player selected roles */ + void LFGMgr::UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid /* = ObjectGuid::Empty */, uint8 roles /* = PLAYER_ROLE_NONE */) { if (!gguid) @@ -1139,6 +1166,11 @@ void LFGMgr::MakeNewGroup(LfgProposal const& proposal) _SaveToDB(gguid, grp->GetDbStoreId()); + bool hasClientlessMember=std::any_of(players.begin(),players.end(),[](ObjectGuid guid) + {return ClientlessBrowserPolicy::Bot(ObjectAccessor::FindConnectedPlayer(guid));}); + if(hasClientlessMember && !ClientlessBrowserPolicy::Human(ObjectAccessor::FindConnectedPlayer(grp->GetLeaderGUID()))) + for(auto guid:players)if(auto member=ObjectAccessor::FindConnectedPlayer(guid)) + if(ClientlessBrowserPolicy::Human(member)){grp->ChangeLeader(guid);break;} // Update group info grp->SendUpdate(); @@ -1200,6 +1232,13 @@ void LFGMgr::UpdateProposal(uint32 proposalId, ObjectGuid guid, bool accept) return; } + // A last human may disconnect/leave between proposal and final acceptance. + std::vector participants; + for(auto const& member:proposal.players)participants.push_back(member.first); + auto dungeon=GetLFGDungeon(proposal.dungeonId); + if(!dungeon || !ClientlessBrowserPolicy::CanMatch(participants,dungeon->IsRaid()?ClientlessBrowserPolicy::Kind::Raid:ClientlessBrowserPolicy::Kind::Dungeon)) + {RemoveProposal(itProposal,LFG_UPDATETYPE_PROPOSAL_FAILED);return;} + bool sendUpdate = proposal.state != LFG_PROPOSAL_SUCCESS; proposal.state = LFG_PROPOSAL_SUCCESS; time_t joinTime = GameTime::GetGameTime(); @@ -1486,6 +1525,12 @@ void LFGMgr::TeleportPlayer(Player* player, bool out, bool fromOpcode /*= false* return; } + if(ClientlessBrowserPolicy::Bot(player) && player->GetMapId()!=uint32(dungeon->map)) + { + std::vector participants; + for(auto const& slot:group->GetMemberSlots())participants.push_back(slot.guid); + if(!ClientlessBrowserPolicy::CanMatch(participants,dungeon->IsRaid()?ClientlessBrowserPolicy::Kind::Raid:ClientlessBrowserPolicy::Kind::Dungeon))return; + } LfgTeleportResult error = LFG_TELEPORT_RESULT_NONE; if (!player->IsAlive()) diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index a448521079..9aa2d075ff 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -424,6 +424,7 @@ class TC_GAME_API LFGMgr /// Updates proposal to join dungeon with player answer void UpdateProposal(uint32 proposalId, ObjectGuid guid, bool accept); /// Updates the role check with player answer + bool IsRoleCheckPending(ObjectGuid gguid,ObjectGuid guid) const; void UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid = ObjectGuid::Empty, uint8 roles = PLAYER_ROLE_NONE); /// Sets player lfg roles void SetRoles(ObjectGuid guid, uint8 roles); diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index 91fc792b71..3a67abb092 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -23,6 +23,7 @@ #include "Group.h" #include "LFGQueue.h" #include "LFGMgr.h" +#include "ClientlessBrowserPolicy.h" #include "World.h" #include "Log.h" @@ -312,6 +313,14 @@ LfgCompatibilityData* LFGQueue::GetCompatibilityData(std::string const& key) uint8 LFGQueue::FindGroups() { + // Bot-only waiting populations must not trigger combinatorial searches on + // every world tick. Keep their queue records intact until a human arrives. + bool hasHuman=false,hasBot=false; + for(auto const& entry:QueueDataStore)for(auto const& member:entry.second.roles) + if(sLFGMgr->GetState(member.first)==LFG_STATE_QUEUED) + if(auto player=ObjectAccessor::FindConnectedPlayer(member.first)) + {if(ClientlessBrowserPolicy::Bot(player))hasBot=true;else if(ClientlessBrowserPolicy::Human(player))hasHuman=true;} + if(hasBot && !hasHuman && !ClientlessBrowserPolicy::BotOnlyTests())return 0; uint8 proposals = 0; GuidList firstNew; while (!newToQueueStore.empty()) @@ -443,6 +452,43 @@ uint8 LFGQueue::FindLowPopulationGroups() */ LfgCompatibility LFGQueue::FindNewGroups(GuidList& check, GuidList& all) { + // Mutable browser switches and human presence are not compatibility-cache + // facts. Evaluate them before using cached native combinations. + bool bot=false,human=false; + unsigned playerCount=0; + LFGDungeonData const* selectedDungeon=nullptr; + auto hasHuman=[&](ObjectGuid guid) + { + auto found=QueueDataStore.find(guid);if(found==QueueDataStore.end())return false; + for(auto const& member:found->second.roles) + if(auto player=ObjectAccessor::FindConnectedPlayer(member.first)) + if(ClientlessBrowserPolicy::Human(player))return true; + return false; + }; + for(auto guid:check) + { + auto found=QueueDataStore.find(guid);if(found==QueueDataStore.end())return LFG_COMPATIBILITY_PENDING; + playerCount+=found->second.roles.size(); + if(!selectedDungeon && !found->second.dungeons.empty())selectedDungeon=sLFGMgr->GetLFGDungeon(*found->second.dungeons.begin()); + bool entryBot=false; + for(auto const& member:found->second.roles) + if(ClientlessBrowserPolicy::Bot(ObjectAccessor::FindConnectedPlayer(member.first)))entryBot=true; + bot|=entryBot;human|=hasHuman(guid); + if(entryBot && !found->second.dungeons.empty()) + if(auto dungeon=sLFGMgr->GetLFGDungeon(*found->second.dungeons.begin())) + { + auto kind=dungeon->IsRaid()?ClientlessBrowserPolicy::Kind::Raid:ClientlessBrowserPolicy::Kind::Dungeon; + if(!ClientlessBrowserPolicy::QueueEnabled(kind) || !ClientlessBrowserPolicy::JoinEnabled(kind))return LFG_COMPATIBILITY_PENDING; + } + } + if(bot && !human && !ClientlessBrowserPolicy::BotOnlyTests()) + { + // Prune a full all-bot branch immediately. Recursing into a sixth queue + // entry would consume the human candidate instead of trying that human + // in the fifth slot on the parent branch. Never cache this decision. + if((selectedDungeon && playerCount>=selectedDungeon->GetMaxGroupSize()) || + std::none_of(all.begin(),all.end(),hasHuman))return LFG_COMPATIBILITY_PENDING; + } std::string strGuids = ConcatenateGuids(check); LfgCompatibility compatibles = GetCompatibles(strGuids); @@ -657,6 +703,11 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check, bool allowIncomple return LFG_COMPATIBLES_WITH_LESS_PLAYERS; } + std::vector participants; + for(auto const& role:proposalRoles)participants.push_back(role.first); + if(!ClientlessBrowserPolicy::CanMatch(participants,dungeon->IsRaid()?ClientlessBrowserPolicy::Kind::Raid:ClientlessBrowserPolicy::Kind::Dungeon)) + return LFG_COMPATIBILITY_PENDING; // Prune without consuming alternatives or caching mutable admission. + ObjectGuid gguid = check.front(); proposal.queues = check; proposal.isNew = numLfgGroups != 1 || sLFGMgr->GetOldState(gguid) != LFG_STATE_DUNGEON; @@ -694,6 +745,14 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check, bool allowIncomple data.accept = LFG_ANSWER_AGREE; } + // A browser group containing humans is always led by one of those humans. + std::vector humans; + bool hasBot=false; + for(auto guid:participants) + if(ClientlessBrowserPolicy::Bot(ObjectAccessor::FindConnectedPlayer(guid)))hasBot=true; + else if(ClientlessBrowserPolicy::Human(ObjectAccessor::FindConnectedPlayer(guid)))humans.push_back(guid); + if(hasBot && !humans.empty())proposal.leader=humans[urand(0,uint32(humans.size()-1))]; + // Mark proposal members as not queued (but not remove queue data) for (GuidList::const_iterator itQueue = proposal.queues.begin(); itQueue != proposal.queues.end(); ++itQueue) { diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index f3964d1845..76db4c1bf2 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "ClientlessBrowserPolicy.h" #include "WorldSession.h" #include "ArenaTeam.h" #include "ArenaTeamMgr.h" @@ -110,6 +111,13 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) return; } + if(!ClientlessBrowserPolicy::QueueEnabled(ClientlessBrowserPolicy::Kind::Battleground)) + { + if(ClientlessBrowserPolicy::Bot(_player))return; + if(asGroup)if(auto group=_player->GetGroup()) + for(auto const& slot:group->GetMemberSlots()) + if(ClientlessBrowserPolicy::Bot(ObjectAccessor::FindConnectedPlayer(slot.guid)))return; + } if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, bgTypeId_, nullptr)) { ChatHandler(this).PSendSysMessage(LANG_BG_DISABLED); @@ -498,6 +506,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) if (!bracketEntry) return; + if(action && ClientlessBrowserPolicy::Bot(_player) && !bg->isArena() && !bgQueue.CanClientlessEnter(bg))action=0; //some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it if (action == 1 && ginfo.ArenaType == 0) { diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index b46c8cb7c7..3b9271e22b 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -197,6 +197,12 @@ WorldSession::~WorldSession() LoginDatabase.PExecute("UPDATE account SET online = 0 WHERE id = %u;", GetAccountId()); // One-time query } +bool WorldSession::HasOpenRealmConnection() const +{ + // The instance connection may legitimately change during a world transfer. + return m_Socket[CONNECTION_TYPE_REALM] && m_Socket[CONNECTION_TYPE_REALM]->IsOpen(); +} + bool WorldSession::PlayerDisconnected() const { return !(m_Socket[CONNECTION_TYPE_REALM] && m_Socket[CONNECTION_TYPE_REALM]->IsOpen() && diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8f61336dec..821ae4b456 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -490,6 +490,7 @@ class TC_GAME_API WorldSession bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; } bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } bool PlayerDisconnected() const; + bool HasOpenRealmConnection() const; void ReadAddonsInfo(ByteBuffer& data); void SendAddonsInfo(); diff --git a/src/server/game/World/AdventureBehaviorMgr.cpp b/src/server/game/World/AdventureBehaviorMgr.cpp index 6c2fdae137..fb14729c61 100644 --- a/src/server/game/World/AdventureBehaviorMgr.cpp +++ b/src/server/game/World/AdventureBehaviorMgr.cpp @@ -143,7 +143,7 @@ namespace bool Known(std::string const & intent) { - return intent == "social" || intent == "adventure" || intent == "profession" || intent == "rest" || intent == "leisure" || intent == "economy" || intent == "instance" || intent == "raid" || intent == "groupformation"; + return intent == "social" || intent == "adventure" || intent == "profession" || intent == "rest" || intent == "leisure" || intent == "economy" || intent == "instance" || intent == "raid" || intent == "groupformation" || intent == "pvp"; } bool Busy(uint32 guid) { @@ -350,14 +350,14 @@ void AdventureBehaviorMgr::Generate(Player * player, Record & record, uint32 dat { std::vector < double > weights { - Affinity(profile->ActivityAffinity, "social", 1) * Affinity(profile->Personality, "sociability", 0.5f) + Affinity(profile->ActivityAffinity, "tavern", 0.5f) * Affinity(profile->Personality, "tavern_affinity", 0.5f), Affinity(profile->ActivityAffinity, "adventure", 1) * Affinity(profile->Personality, "adventurousness", 0.5f), Affinity(profile->ActivityAffinity, "profession", 0.5f), Affinity(profile->ActivityAffinity, "rest", 0.5f), Affinity(profile->ActivityAffinity, "leisure", 0.5f), Affinity(profile->ActivityAffinity, "economy", 0.5f), Affinity(profile->ActivityAffinity, "instance", 0.5f), Affinity(profile->ActivityAffinity, "raid", 0.25f) + Affinity(profile->ActivityAffinity, "social", 1) * Affinity(profile->Personality, "sociability", 0.5f) + Affinity(profile->ActivityAffinity, "tavern", 0.5f) * Affinity(profile->Personality, "tavern_affinity", 0.5f), Affinity(profile->ActivityAffinity, "adventure", 1) * Affinity(profile->Personality, "adventurousness", 0.5f), Affinity(profile->ActivityAffinity, "profession", 0.5f), Affinity(profile->ActivityAffinity, "rest", 0.5f), Affinity(profile->ActivityAffinity, "leisure", 0.5f), Affinity(profile->ActivityAffinity, "economy", 0.5f), Affinity(profile->ActivityAffinity, "instance", 0.5f), Affinity(profile->ActivityAffinity, "raid", 0.25f), (player->getLevel()>=10?Affinity(profile->ActivityAffinity,"pvp",0.2f)*Affinity(profile->Personality,"aggression",0.5f):0.0f) }; auto i = Choose(weights, record.Random); - return std::array < std::string, 8 > + return std::array < std::string, 9 > { - "social", "adventure", "profession", "rest", "leisure", "economy", "instance", "raid" + "social", "adventure", "profession", "rest", "leisure", "economy", "instance", "raid", "pvp" } - [std::min(i, std::size_t(7))]; + [std::min(i, std::size_t(8))]; }; record.Plan = AdventureBehaviorPolicy::Generate(record.Random, Affinity(profile->Personality, "wanderlust", 0.3f), pick,[&](std::string const & intent) { @@ -381,6 +381,8 @@ void AdventureBehaviorMgr::Generate(Player * player, Record & record, uint32 dat void AdventureBehaviorMgr::SetWanted(Player * player, Record & r, std::string const & intent, std::string const & location, time_t deadline) { + if(r.WantedIntent!=intent)r.ExpeditionStarted=r.ExpeditionIntent==intent && GameTime::GetGameTime()CancelBrowser(player); r.WantedIntent = intent; r.WantedLocation = location; r.Deadline = deadline; @@ -454,6 +456,17 @@ std::string AdventureBehaviorMgr::AreaNode(Player * player, AdventureLocation co }; } +void AdventureBehaviorMgr::LatchGroupTravel(Player* player,Record& r) +{ + r.ExpeditionStarted=true;r.ExpeditionIntent=r.Intent;r.ExpeditionUntil=r.Deadline; + if(auto group=player->GetGroup())if(sAdventureGroupMgr->BotLed(player)) + for(auto const& slot:group->GetMemberSlots()) + { + auto member=_records.find(slot.guid.GetCounter());if(member==_records.end())continue; + member->second.ExpeditionStarted=true;member->second.ExpeditionIntent=r.Intent;member->second.ExpeditionUntil=r.Deadline; + } +} + void AdventureBehaviorMgr::Begin(Player * player, Record & r) { r.Dirty = false; @@ -483,6 +496,16 @@ void AdventureBehaviorMgr::Begin(Player * player, Record & r) intent.Parameters["location"] = r.Location; sClientlessPlayerMgr->SetIntent(player->GetGUID().GetCounter(), std::move(intent)); r.Publishing = false; + bool groupedActivity=r.Intent=="instance" || r.Intent=="raid" || r.Intent=="pvp"; + bool worldPvP=r.Intent=="pvp" && AdventureGroupPolicy::WorldPvP(l->ZoneId?l->ZoneId:l->AreaId); + if(groupedActivity && ((!worldPvP && r.Intent=="pvp") || + (!r.ExpeditionStarted && !sAdventureGroupMgr->Complete(player)))) + { + r.State=Phase::WaitingGroup;r.Detail="waiting for a suitable group / native browser queue"; + sAdventureGroupMgr->QueueBrowser(player,r.Intent); + return; + } + if(groupedActivity)sAdventureGroupMgr->CancelBrowser(player); if ((r.Intent=="instance" || r.Intent=="raid")) { if (!ResolveInstance(player,r)) {Fallback(player,r);return;} @@ -499,6 +522,7 @@ void AdventureBehaviorMgr::Begin(Player * player, Record & r) Queue(player, r, "travel_to_node", "node", node, true); } else Queue(player, r, "travel_to_location", "id", r.Location); + if(groupedActivity && r.Queued)LatchGroupTravel(player,r); r.State = Phase::Travel; r.Detail = "travelling to " + r.Location; TC_LOG_INFO("server.adventurebot", "INTENT_TRAVEL guid=%u intent='%s' location='%s' area=%u", player->GetGUID().GetCounter(), r.Intent.c_str(), r.Location.c_str(), l->IsArea ? 1 : 0); @@ -1199,7 +1223,7 @@ void AdventureBehaviorMgr::Micro(Player * player, Record & r) { auto a=ResolvedAction(catalog); if(a.Kind=="unsupported")continue; - auto w = a.Intents.find(r.Intent); + auto w = a.Intents.find(r.Intent=="pvp"?"adventure":r.Intent); if (w == a.Intents.end()) continue; if ((a.Kind=="leisure" || a.Kind=="outing") && !LeisureAvailable(player,r,a)) continue; if (a.Kind=="recovery" && !RecoveryAvailable(player,r,a)) continue; @@ -1419,6 +1443,7 @@ void AdventureBehaviorMgr::Update(Player * player, uint32 diff) if (entry == _records.end() || ! entry->second.Enabled || ! player->IsInWorld()) return; auto & r = entry->second; ClientlessTravelTelemetry::Tick(player); + if(player->InBattleground())return; if(UpdateNavigationRescue(player,r))return; if(r.AreaRevision!=sAdventureAreaMgr->Revision()) { @@ -1544,6 +1569,17 @@ void AdventureBehaviorMgr::Update(Player * player, uint32 diff) Begin(player, r); return; } + if(r.State==Phase::WaitingGroup) + { + auto location=sAdventureLocationMgr->Find(r.Location); + bool world=r.Intent!="pvp" || (location && AdventureGroupPolicy::WorldPvP(location->ZoneId?location->ZoneId:location->AreaId)); + // Once a native browser owns this group, never race it with physical travel. + auto group=player->GetGroup(); + if(world && (r.ExpeditionStarted || sAdventureGroupMgr->Complete(player)) && (!group || !group->isLFGGroup()) && !player->isUsingLfg() && !player->InBattlegroundQueue()) + {r.Dirty=true;r.State=Phase::Idle;} + else sAdventureGroupMgr->QueueBrowser(player,r.Intent); + return; + } if (r.State == Phase::Travel) { if (r.Queued && sClientlessPlayerMgr->GetQueuedActionCount(guid)) return; @@ -1752,7 +1788,7 @@ bool AdventureBehaviorMgr::Command(ChatHandler * handler, char const * args) auto l = sAdventureLocationMgr->Find(location); if (! Known(intent) || ! l || ! Allowed(player, * l, intent)) { - handler->SendSysMessage("Use social/adventure/profession/rest/leisure/economy/instance/raid/groupformation and a matching enabled location."); + handler->SendSysMessage("Use social/adventure/profession/rest/leisure/economy/instance/raid/pvp/groupformation and a matching enabled location."); return false; } ClearDeparture(player,r); @@ -1812,6 +1848,7 @@ bool AdventureBehaviorMgr::RestoreInstance(Player* player, Record& r) if(auto selected=sAdventureLocationMgr->Find(v.Location))v.Difficulty=selected->InstanceDifficulty; auto restoredMap=sMapStore.LookupEntry(v.Map); if(player->GetMapId()==v.Map && restoredMap)v.Difficulty=uint32(player->GetDifficulty(restoredMap->IsRaid())); + r.ExpeditionStarted=true; r.Intent=r.WantedIntent=restoredMap && restoredMap->IsRaid()?"raid":"instance";r.Location=r.WantedLocation=v.Location;r.Deadline=v.BlockEnd; r.State=v.Stage==AdventureInstancePolicy::Phase::Travel?Phase::Idle:Phase::OnSite; r.Dirty=v.Stage==AdventureInstancePolicy::Phase::Travel; diff --git a/src/server/game/World/AdventureBehaviorMgr.h b/src/server/game/World/AdventureBehaviorMgr.h index e83fedba7b..e5eda27a6b 100644 --- a/src/server/game/World/AdventureBehaviorMgr.h +++ b/src/server/game/World/AdventureBehaviorMgr.h @@ -43,7 +43,7 @@ public: std::string InteractionIntent(Player* player) const; std::string InteractionSchedule(Player* player); private: - enum class Phase {Idle, Travel, OnSite, Switching, Handover}; + enum class Phase {Idle, Travel, OnSite, Switching, Handover, WaitingGroup}; struct RecoveryScene { bool Active=false, Approaching=false; @@ -62,7 +62,9 @@ private: time_t PersonalDeadline=0; time_t Deadline=0; AdventureGroupPolicy::Departure Departure; - bool Gathering=false; + bool Gathering=false, ExpeditionStarted=false; + std::string ExpeditionIntent; + time_t ExpeditionUntil=0; time_t GatherRetryAt=0; uint32 AreaRevision=0; time_t StalledSince=0,LastRescue=0,RescueAt=0,NextSpacing=0,LastNavigationCheck=0; @@ -108,6 +110,7 @@ private: void Generate(Player* player, Record& record, uint32 date); void SetWanted(Player* player, Record& record, std::string const& intent, std::string const& location, time_t deadline); void Begin(Player* player, Record& record); + void LatchGroupTravel(Player* player,Record& record); void Fallback(Player* player, Record& record); void Queue(Player* player, Record& record, std::string const& action, std::string const& parameter, std::string const& value, bool hard = false); void ResetMicro(Player* player, Record& record); diff --git a/src/server/game/World/AdventureCombatPolicy.h b/src/server/game/World/AdventureCombatPolicy.h index 5c53a4a370..56ce7751af 100644 --- a/src/server/game/World/AdventureCombatPolicy.h +++ b/src/server/game/World/AdventureCombatPolicy.h @@ -25,7 +25,7 @@ namespace AdventureCombatPolicy {return level>enemy?level-enemy<=5:enemy-level<=5;} inline float PvPWillingness(std::string const& intent,float adventure,float risk) { - float weight=intent=="adventure"?1.0f:intent=="leisure"?0.35f: + float weight=intent=="pvp"?1.0f:intent=="adventure"?1.0f:intent=="leisure"?0.35f: intent=="social"?0.2f:intent=="profession"?0.15f:intent=="economy"?0.1f:0.0f; return weight*std::max(0.0f,std::min(1.0f,adventure))* std::max(0.0f,std::min(1.0f,risk)); diff --git a/src/server/game/World/AdventureGeneratorPolicy.h b/src/server/game/World/AdventureGeneratorPolicy.h index ed0e22ee6f..db7f215ce4 100644 --- a/src/server/game/World/AdventureGeneratorPolicy.h +++ b/src/server/game/World/AdventureGeneratorPolicy.h @@ -138,7 +138,7 @@ namespace AdventureGeneratorPolicy lua<<" }, activity_affinity = { social = "< namespace @@ -33,6 +40,31 @@ float Sociability(Player* p) if(profile){auto it=profile->Personality.find("sociability");if(it!=profile->Personality.end())return std::clamp(it->second,0.0f,1.0f);} return .5f; } +bool ProfessionCompatible(Player* a,Player* b,std::string const& intent) +{ + if(intent!="profession")return true; + auto first=sClientlessLuaEngine->GetAdventureProfile(a->GetGUID().GetCounter()); + auto second=sClientlessLuaEngine->GetAdventureProfile(b->GetGUID().GetCounter()); + if(first && second)for(auto const& profession:first->PrimaryProfessions) + if(second->PrimaryProfessions.count(profession))return true; + return false; +} +bool BattlegroundCompatible(Player* leader,Player* member) +{ + if(leader->getLevel()<10 || member->getLevel()<10)return false; + auto type=leader->getLevel()>=45?BATTLEGROUND_RB:BATTLEGROUND_WS; + if(type==BATTLEGROUND_RB && member->getLevel()<45)return false; + auto bg=sBattlegroundMgr->GetBattlegroundTemplate(type);if(!bg)return false; + auto a=sDBCManager.GetBattlegroundBracketByLevel(bg->GetMapId(),leader->getLevel()); + auto b=sDBCManager.GetBattlegroundBracketByLevel(bg->GetMapId(),member->getLevel()); + return a && b && a->GetBracketId()==b->GetBracketId(); +} +bool BrowserOfferEnabled(lfg::LFGDungeonData const& offer) +{ + // Native Type1 Dragon Soul LFR uses DungeonFinder; Type2 is legacy browser. + auto option=offer.type==lfg::LFG_TYPE_RAID?lfg::LFG_OPTION_ENABLE_RAID_BROWSER:lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER; + return sLFGMgr->isOptionEnabled(option); +} bool Ready(Player* p) {return p && p->IsInWorld() && p->IsAlive() && !p->IsInCombat() && !sAdventureCombatMgr->Busy(p) && !p->IsBeingTeleported() && !p->GetTransport() && !p->IsInFlight() && !p->IsFlying() && !p->IsCharmed() && !p->GetMap()->IsDungeon();} @@ -87,7 +119,9 @@ std::string AdventureGroupMgr::RecruitmentText(Player* player) auto activity=Activity(plan); auto destination=sAdventureLocationMgr->Find(plan.Forming?plan.NextLocation:plan.Location); std::string label=activity=="raid"?"einen Schlachtzug":activity=="instance"?"einen Instanzbesuch": - activity=="profession"?"gemeinsame Berufsarbeit":activity=="social"?"eine gesellige Runde":"ein Abenteuer"; + activity=="pvp"?"gemeinsames PvP":activity=="profession"?"gemeinsame Berufsarbeit":activity=="social"?"eine gesellige Runde":"ein Abenteuer"; + if(activity=="pvp" && destination && !AdventureGroupPolicy::WorldPvP(destination->ZoneId?destination->ZoneId:destination->AreaId)) + return "Ich suche Gefaehrten fuer ein Schlachtfeld."; return "Ich suche Gefaehrten fuer "+label+". Ziel: "+(destination?destination->Name:std::string("noch offen"))+"."; } bool AdventureGroupMgr::RecruitPlayer(Player* player, std::string const& intent) @@ -110,6 +144,7 @@ bool AdventureGroupMgr::RecruitPlayer(Player* player, std::string const& intent) void AdventureGroupMgr::Offline(Player* p) { // Native player logout owns channel membership cleanup. + CancelBrowser(p); _records.erase(p->GetGUID()); } bool AdventureGroupMgr::Accept(Player* invited,Player* inviter) @@ -136,12 +171,174 @@ bool AdventureGroupMgr::CanInvite(Player* leader,Player* member) if(bot->GetSession() && bot->GetSession()->IsClientless() && !AdventureGroupPolicy::AcceptPlayerLevel(bot->getLevel(),member->getLevel()))return false; auto plan=sAdventureBehaviorMgr->GroupPlan(leader); auto location=sAdventureLocationMgr->Find(plan.Forming?plan.NextLocation:plan.Location); + if(location && Activity(plan)=="pvp" && !AdventureGroupPolicy::WorldPvP(location->ZoneId?location->ZoneId:location->AreaId) && + !BattlegroundCompatible(leader,member))return false; + if((!leader->GetGroup() || leader->GetGroup()!=member->GetGroup()) && !NeedsRole(leader,member))return false; if(!plan.Enabled || !location || !sAdventureLocationMgr->LevelEligible(member,*location,Activity(plan),true) || !sAdventureLocationMgr->LevelEligible(leader,*location,Activity(plan),true))return false; Position goal;goal.Relocate(location->Point.X,location->Point.Y,location->Point.Z); return sAdventureAreaMgr->AllowsPosition(leader,location->Point.MapId,goal) && sAdventureAreaMgr->AllowsPosition(member,location->Point.MapId,goal); } +namespace +{ +uint8 BrowserRole(Player* p) +{ + if(auto profile=sClientlessLuaEngine->GetAdventureProfile(p->GetGUID().GetCounter())) + return profile->Role=="tank"?lfg::PLAYER_ROLE_TANK:profile->Role=="healer"?lfg::PLAYER_ROLE_HEALER:lfg::PLAYER_ROLE_DAMAGE; + if(auto group=p->GetGroup())if(auto role=group->GetLfgRoles(p->GetGUID()) & ~lfg::PLAYER_ROLE_LEADER)return uint8(role); + return PlayerAI::IsPlayerHealer(p)?lfg::PLAYER_ROLE_HEALER:((p->getClass()==CLASS_WARRIOR && PlayerAI::GetPlayerSpec(p)==2) || (p->getClass()==CLASS_PALADIN && PlayerAI::GetPlayerSpec(p)==1) || (p->getClass()==CLASS_DEATH_KNIGHT && PlayerAI::GetPlayerSpec(p)==0) || (p->getClass()==CLASS_DRUID && p->HasAura(5487)))?lfg::PLAYER_ROLE_TANK:lfg::PLAYER_ROLE_DAMAGE; +} +} +unsigned AdventureGroupMgr::PendingInvites(Player* leader,Player* except) const +{ + unsigned pending=0;auto now=GameTime::GetGameTime(); + for(auto const& entry:_records) + if(entry.second.Inviter==leader->GetGUID() && entry.second.InviteUntil>now) + if(auto invited=ObjectAccessor::FindPlayer(entry.first)) + if(invited!=except && invited->GetGroupInvite())++pending; + return pending; +} +bool AdventureGroupMgr::NeedsRole(Player* leader,Player* member) +{ + auto plan=sAdventureBehaviorMgr->GroupPlan(leader);auto intent=Activity(plan); + if(intent!="instance" && intent!="raid")return true; + auto required=AdventureGroupPolicy::RequiredRoles(Capacity(plan)); + unsigned tanks=0,healers=0,damage=0; + auto count=[&](Player* p){auto role=BrowserRole(p);if(role==lfg::PLAYER_ROLE_TANK)++tanks;else if(role==lfg::PLAYER_ROLE_HEALER)++healers;else ++damage;}; + if(auto group=leader->GetGroup()) + {for(auto ref=group->GetFirstMember();ref;ref=ref->next())if(auto p=ref->GetSource())count(p);} + else count(leader); + // An invitation reserves its role until accepted, declined or expired. + // Exclude the candidate's own reservation when validating its acceptance. + auto now=GameTime::GetGameTime(); + for(auto const& entry:_records) + if(entry.second.Inviter==leader->GetGUID() && entry.second.InviteUntil>now) + if(auto invited=ObjectAccessor::FindPlayer(entry.first)) + if(invited!=member && invited->GetGroupInvite())count(invited); + if(tanks>required.Tanks || healers>required.Healers || damage>required.Damage)return false; + auto role=BrowserRole(member); + return role==lfg::PLAYER_ROLE_TANK?tanksGetGroup();if(!group || !BotLed(member))return false; + auto leader=ObjectAccessor::FindPlayer(group->GetLeaderGUID());if(!leader)return false; + auto plan=sAdventureBehaviorMgr->GroupPlan(leader);auto intent=Activity(plan); + if(intent!="instance" && intent!="raid")return false; + auto required=AdventureGroupPolicy::RequiredRoles(Capacity(plan)); + auto role=BrowserRole(member);unsigned count=0; + for(auto ref=group->GetFirstMember();ref;ref=ref->next()) + if(auto p=ref->GetSource())if(BrowserRole(p)==role)++count; + unsigned limit=role==lfg::PLAYER_ROLE_TANK?required.Tanks:role==lfg::PLAYER_ROLE_HEALER?required.Healers:required.Damage; + return count>limit; +} + +bool AdventureGroupMgr::Complete(Player* p) +{ + auto group=p->GetGroup();if(!group)return false; + auto leader=ObjectAccessor::FindPlayer(group->GetLeaderGUID());if(!leader)return false; + auto planner=leader->GetSession()->IsClientless()?leader:p; + auto plan=sAdventureBehaviorMgr->GroupPlan(planner); + for(auto const& slot:group->GetMemberSlots()) + { + auto member=ObjectAccessor::FindPlayer(slot.guid); + if(!member || (member!=planner && !CanInvite(planner,member)))return false; + } + if(Activity(plan)=="pvp")return group->GetMembersCount()>=2; + if(group->GetMembersCount()!=Capacity(plan))return false; + if(Activity(plan)!="instance" && Activity(plan)!="raid")return true; + auto required=AdventureGroupPolicy::RequiredRoles(Capacity(plan)); + unsigned tanks=0,healers=0,damage=0; + for(auto const& slot:group->GetMemberSlots()) + { + auto member=ObjectAccessor::FindPlayer(slot.guid);if(!member)return false; + auto role=BrowserRole(member);if(role==lfg::PLAYER_ROLE_TANK)++tanks;else if(role==lfg::PLAYER_ROLE_HEALER)++healers;else ++damage; + } + return tanks==required.Tanks && healers==required.Healers && damage==required.Damage; +} +bool AdventureGroupMgr::Merge(Player* p,AdventureGroupPlan const& plan) +{ + auto now=GameTime::GetGameTime();auto& record=_records[p->GetGUID()]; + if(!plan.Forming || !Ready(p) || record.MergeAt>now || p->GetGroupInvite())return false; + auto source=p->GetGroup(); + if(source) + { + if(!BotLed(p) || Complete(p) || source->isLFGGroup())return false; + auto leader=ObjectAccessor::FindPlayer(source->GetLeaderGUID()); + if(!leader || !sAdventureBehaviorMgr->GroupPlan(leader).Forming)return false; + } + record.MergeAt=now+urand(15,30); + unsigned size=source?source->GetMembersCount():1; + bool surplus=source && SurplusRole(p); + Player* best=nullptr;unsigned bestScore=0; + for(auto const& candidate:_records) + { + auto leader=ObjectAccessor::FindPlayer(candidate.first); + if(leader==p || !Ready(leader) || leader->isUsingLfg() || leader->InBattlegroundQueue() || leader->GetTeam()!=p->GetTeam())continue; + auto target=leader->GetGroup();if(!target || target==source || !BotLed(leader) || target->isLFGGroup() || target->GetLeaderGUID()!=leader->GetGUID())continue; + unsigned count=target->GetMembersCount();auto other=sAdventureBehaviorMgr->GroupPlan(leader); + bool completes=count+1==Capacity(other); + if(!other.Enabled || !other.Forming || !AdventureGroupPolicy::Compatible(Activity(plan),Activity(other),p->getLevel(),leader->getLevel()) || + !ProfessionCompatible(p,leader,Activity(plan)) || + count+PendingInvites(leader)>=Capacity(other) || + !AdventureGroupPolicy::PreferMerge(size,count,surplus,completes,!source || target->GetGUID()GetGUID()) || + !AdventureGroupPolicy::Capital(leader->GetZoneId()) || !CanInvite(leader,p) || !NeedsRole(leader,p))continue; + unsigned score=count*10+(completes?1000:0); + if(score>bestScore){best=leader;bestScore=score;} + } + if(!best || frand(0,1)>AdventureGroupPolicy::MergeChance(Sociability(p),plan.Deadline-now))return false; + // Preflight and transfer run on the world thread; no other invitation can + // consume a slot between them. Preserve the source for rollback if a native + // invite is nevertheless rejected by another server hook. + CancelBrowser(p); + ObjectGuid old=source?source->GetGUID():ObjectGuid::Empty; + ObjectGuid oldLeader=source?source->GetLeaderGUID():ObjectGuid::Empty; + bool oldRaid=source && source->isRaidGroup(); + auto oldDungeonMode=source?source->GetDungeonDifficulty():DUNGEON_DIFFICULTY_NORMAL; + auto oldRaidMode=source?source->GetRaidDifficulty():RAID_DIFFICULTY_10MAN_NORMAL; + std::vector oldMembers; + if(source)for(auto const& slot:source->GetMemberSlots())oldMembers.push_back(slot.guid); + if(source)source->RemoveMember(p->GetGUID(),GROUP_REMOVEMETHOD_LEAVE); + Invite(best,p,Activity(plan),true); + if(p->GetGroupInvite()) + {WorldPackets::Party::PartyInviteResponse response{WorldPacket(CMSG_PARTY_INVITE_RESPONSE)};response.Accept=true;p->GetSession()->HandlePartyInviteResponseOpcode(response);} + record.MergeAt=now+120; + TC_LOG_INFO("server.adventurebot","GROUP_MERGE member=%u from=%s leader=%u joined=%u",p->GetGUID().GetCounter(),old.ToString().c_str(),best->GetGUID().GetCounter(),p->GetGroup()==best->GetGroup()); + if(!p->GetGroup() && old) + { + auto previous=sGroupMgr->GetGroupByGUID(old.GetCounter()); + if(previous) + { + if(previous->AddMember(p)) + { + if(oldLeader==p->GetGUID() && !ClientlessBrowserPolicy::Human(ObjectAccessor::FindConnectedPlayer(previous->GetLeaderGUID()))) + previous->ChangeLeader(p->GetGUID()); + PlayerLeadership(p);previous->SendUpdate(); + } + } + else if(oldMembers.size()==2) + { + // Native removal disbands a two-member source. Recreate only its + // original online participants, never take over a changed group. + auto peer=ObjectAccessor::FindPlayer(oldMembers[0]==p->GetGUID()?oldMembers[1]:oldMembers[0]); + if(peer && !peer->GetGroup() && !peer->GetGroupInvite()) + { + auto restored=new Group(); + auto leader=oldLeader==p->GetGUID()?p:peer; + if(restored->Create(leader)) + { + sGroupMgr->AddGroup(restored); + if(oldRaid)restored->ConvertToRaid(); + restored->SetDungeonDifficulty(oldDungeonMode);restored->SetRaidDifficulty(oldRaidMode); + restored->AddMember(leader==p?peer:p);restored->SendUpdate(); + } + else delete restored; + } + } + } + return true; // A mutation occurred; caller must not reuse its old Group pointer. +} void AdventureGroupMgr::CheckFullGroup(Player* p) { auto group=p->GetGroup();if(!group)return; @@ -152,7 +349,7 @@ void AdventureGroupMgr::CheckFullGroup(Player* p) if(!source->GetSession()->IsClientless())source=p; if(source->GetMap()->IsDungeon())return; auto plan=sAdventureBehaviorMgr->GroupPlan(source); - if(!plan.Forming || !AdventureGroupPolicy::Eligible(plan.NextIntent) || group->GetMembersCount()GetFirstMember();ref;ref=ref->next()) if(auto member=ref->GetSource())if(member->GetSession()->IsClientless()) { @@ -166,13 +363,14 @@ void AdventureGroupMgr::Update(Player* p) auto now=GameTime::GetGameTime();auto& r=_records[p->GetGUID()]; CheckFullGroup(p); if(PlayerLeadership(p))return; - if(!Ready(p))return; + if(!Ready(p) || p->isUsingLfg() || p->InBattlegroundQueue())return; if(EnforceCapacity(p))return; auto plan=sAdventureBehaviorMgr->GroupPlan(p);if(!plan.Enabled)return; auto intent=Activity(plan);if(!AdventureGroupPolicy::Eligible(intent))return; auto group=p->GetGroup(); if(group && BotLed(p))if(auto leader=ObjectAccessor::FindPlayer(group->GetLeaderGUID())) {auto leaderPlan=sAdventureBehaviorMgr->GroupPlan(leader);if(leaderPlan.Forming)r.FormationIntent=Activity(leaderPlan);} + if(Merge(p,plan))return; if(group && group->GetLeaderGUID()!=p->GetGUID())return; if((intent=="raid" || intent=="instance") && p->GetDifficulty(intent=="raid")!=Difficulty(plan.Mode)) { @@ -209,18 +407,11 @@ void AdventureGroupMgr::Update(Player* p) { if(guid==p->GetGUID())continue; auto other=ObjectAccessor::FindPlayer(guid); - if(!Ready(other) || other->GetGroupInvite() || other->GetTeam()!=p->GetTeam())continue; + if(!Ready(other) || other->isUsingLfg() || other->InBattlegroundQueue() || other->GetGroupInvite() || other->GetTeam()!=p->GetTeam())continue; auto peerPlan=sAdventureBehaviorMgr->GroupPlan(other); if(!peerPlan.Enabled || peerPlan.Forming!=plan.Forming || !AdventureGroupPolicy::Compatible(intent,Activity(peerPlan),p->getLevel(),other->getLevel()))continue; - if(intent=="profession") - { - auto a=sClientlessLuaEngine->GetAdventureProfile(p->GetGUID().GetCounter()); - auto b=sClientlessLuaEngine->GetAdventureProfile(other->GetGUID().GetCounter()); - bool compatible=false; - if(a && b)for(auto const& profession:a->PrimaryProfessions)if(b->PrimaryProfessions.count(profession))compatible=true; - if(!compatible)continue; - } + if(!ProfessionCompatible(p,other,intent))continue; if(auto existing=other->GetGroup()) { if(group || existing->GetLeaderGUID()!=other->GetGUID() || @@ -298,7 +489,7 @@ bool AdventureGroupMgr::PlayerLeadership(Player* leader) for(auto member=group->GetFirstMember();member;member=member->next()) { auto player=member->GetSource(); - if(!player || player->GetSession()->IsClientless())continue; + if(!ClientlessBrowserPolicy::Human(player))continue; group->ChangeLeader(player->GetGUID());group->SendUpdate(); TC_LOG_INFO("server.adventurebot","GROUP_PLAYER_LEADER old=%u leader=%u",leader->GetGUID().GetCounter(),player->GetGUID().GetCounter()); return true; @@ -327,3 +518,126 @@ bool AdventureGroupMgr::EnforceCapacity(Player* p) } return false; } + +namespace +{ +void BattlegroundInput(Player* p,uint32 slot,bool enter) +{ + // Native Cata CMSG_BATTLEFIELD_PORT; all eligibility/invitation checks stay native. + WorldPacket packet(CMSG_BATTLEFIELD_PORT,32);packet<GetSession()->HandleBattleFieldPortOpcode(packet); +} +} +void AdventureGroupMgr::CancelBrowser(Player* p) +{ + auto it=_records.find(p->GetGUID());if(it==_records.end())return; + auto& r=it->second; + if(r.BrowserOwned && !p->GetMap()->IsDungeon()) + { + auto group=p->GetGroup(); + if(!group || (BotLed(p) && group->GetLeaderGUID()==p->GetGUID())) + sLFGMgr->LeaveLfg(group?group->GetGUID():p->GetGUID()); + } + if(r.BgOwned && !p->InBattleground()) + for(uint32 slot=0;slotGetBattlegroundQueueTypeId(slot)!=BATTLEGROUND_QUEUE_NONE)BattlegroundInput(p,slot,false); + r.BrowserOwned=r.BgOwned=false;r.BrowserIntent.clear(); +} +void AdventureGroupMgr::UpdateBrowser(Player* p) +{ + auto& r=_records[p->GetGUID()]; + auto now=GameTime::GetGameTime(); + if(nowGetGroupInvite()) + if(invitation->GetLeaderGUID()!=p->GetGUID() && r.Inviter==invitation->GetLeaderGUID() && r.InviteUntil && now>=r.InviteUntil) + { + WorldPackets::Party::PartyInviteResponse response{WorldPacket(CMSG_PARTY_INVITE_RESPONSE)}; + response.Accept=false;p->GetSession()->HandlePartyInviteResponseOpcode(response); + } + if(p->GetGroup() && sLFGMgr->IsRoleCheckPending(p->GetGroup()->GetGUID(),p->GetGUID())) + sLFGMgr->UpdateRoleCheck(p->GetGroup()->GetGUID(),p->GetGUID(),BrowserRole(p)); + auto intent=sAdventureBehaviorMgr->InteractionIntent(p); + auto kind=r.BrowserIntent=="pvp"?ClientlessBrowserPolicy::Kind::Battleground:r.BrowserIntent=="raid"?ClientlessBrowserPolicy::Kind::Raid:ClientlessBrowserPolicy::Kind::Dungeon; + if(!r.BrowserIntent.empty() && !ClientlessBrowserPolicy::QueueEnabled(kind))CancelBrowser(p); + if(!r.BrowserIntent.empty() && intent!=r.BrowserIntent && !p->GetMap()->IsDungeon() && !p->InBattleground())CancelBrowser(p); + if(!p->InBattlegroundQueue() || !Ready(p))return; + for(uint32 slot=0;slotGetBattlegroundQueueTypeId(slot);if(type==BATTLEGROUND_QUEUE_NONE)continue; + GroupQueueInfo info; + auto& queue=sBattlegroundMgr->GetBattlegroundQueue(type); + if(!queue.GetPlayerGroupInfoData(p->GetGUID(),&info) || !info.IsInvitedToBGInstanceGUID)continue; + if(!ClientlessBrowserPolicy::JoinEnabled(ClientlessBrowserPolicy::Kind::Battleground))continue; + auto bg=sBattlegroundMgr->GetBattleground(info.IsInvitedToBGInstanceGUID,BATTLEGROUND_TYPE_NONE); + if(bg && queue.CanClientlessEnter(bg))BattlegroundInput(p,slot,true); + } +} +void AdventureGroupMgr::QueueBrowser(Player* p,std::string const& intent) +{ + using namespace ClientlessBrowserPolicy; + auto& r=_records[p->GetGUID()];auto now=GameTime::GetGameTime(); + if(!Ready(p) || nowGetGroup(); + if(group && (!BotLed(p) || group->GetLeaderGUID()!=p->GetGUID() || group->isLFGGroup()))return; + auto kind=intent=="pvp"?Kind::Battleground:intent=="raid"?Kind::Raid:Kind::Dungeon; + if(!QueueEnabled(kind))return; + if(auto invitation=p->GetGroupInvite()) + { + if(invitation->GetLeaderGUID()!=p->GetGUID() || invitation->IsCreated())return; + // End a formation attempt which never acquired a second actual member. + // Cancel only our own uncreated group; do not touch an incoming invitation. + WorldPacket leave(CMSG_GROUP_DISBAND); + p->GetSession()->HandleGroupDisbandOpcode(leave); + } + if(intent=="pvp") + { + if(p->getLevel()<10 || p->InBattlegroundQueue() || p->isUsingLfg())return; + // Queue WSG at10..44; native random battleground eligibility starts at45. + auto type=p->getLevel()>=45?BATTLEGROUND_RB:BATTLEGROUND_WS; + ObjectGuid guid{uint64(type)}; + WorldPacket packet(CMSG_BATTLEMASTER_JOIN,32);packet<GetSession()->HandleBattlemasterJoinOpcode(packet); + r.BgOwned=p->InBattlegroundQueue(); + } + else + { + auto state=sLFGMgr->GetState(group?group->GetGUID():p->GetGUID()); + if(state!=lfg::LFG_STATE_NONE && state!=lfg::LFG_STATE_FINISHED_DUNGEON)return; + lfg::LfgDungeonSet choices; + auto locks=sLFGMgr->GetLockedDungeons(p->GetGUID()); + for(auto entry:sLFGDungeonStore) + { + auto data=sLFGMgr->GetLFGDungeon(entry->ID);if(!data || !data->GetMaxGroupSize())continue; + if(data->IsRaid()!=(kind==Kind::Raid) || (data->type!=lfg::LFG_TYPE_DUNGEON && data->type!=lfg::LFG_TYPE_HEROIC && data->type!=lfg::LFG_TYPE_RAID))continue; + if(!BrowserOfferEnabled(*data))continue; + if(p->getLevel()minlevel || p->getLevel()>data->maxlevel || locks.count(data->Entry()))continue; + choices.insert(data->id); + } + if(choices.empty())return; + // Native JoinLfg checks every member, item level, locks, expansion and RBAC. + WorldPackets::LFG::LFGJoin request{WorldPacket(CMSG_LFG_JOIN)}; + request.Roles=BrowserRole(p);request.Comment="Adventure group seeking companions"; + for(auto id:choices){if(request.Slots.size()>=50)break;request.Slots.push_back(sLFGMgr->GetLFGDungeonEntry(id));} + p->GetSession()->HandleLfgJoinOpcode(request); + auto stateAfter=sLFGMgr->GetState(group?group->GetGUID():p->GetGUID()); + r.BrowserOwned=stateAfter==lfg::LFG_STATE_QUEUED || stateAfter==lfg::LFG_STATE_ROLECHECK; + } + if(r.BrowserOwned || r.BgOwned) + { + r.BrowserIntent=intent; + if(group)for(auto const& member:group->GetMemberSlots()) + if(auto it=_records.find(member.guid);it!=_records.end()) + {it->second.BrowserOwned=r.BrowserOwned;it->second.BgOwned=r.BgOwned;it->second.BrowserIntent=intent;} + TC_LOG_INFO("server.adventurebot","BROWSER_QUEUE guid=%u intent='%s' joinEnabled=%u botOnlyTests=%u",p->GetGUID().GetCounter(),intent.c_str(),JoinEnabled(kind),BotOnlyTests()); + } +} diff --git a/src/server/game/World/AdventureGroupMgr.h b/src/server/game/World/AdventureGroupMgr.h index 9b70ce16d8..5a573d5670 100644 --- a/src/server/game/World/AdventureGroupMgr.h +++ b/src/server/game/World/AdventureGroupMgr.h @@ -20,6 +20,11 @@ class TC_GAME_API AdventureGroupMgr public: static AdventureGroupMgr* instance(); void Update(Player* player); + bool Complete(Player* player); + bool NeedsRole(Player* leader,Player* member); + void UpdateBrowser(Player* player); + void QueueBrowser(Player* player,std::string const& intent); + void CancelBrowser(Player* player); void RequestPlayerAdmission(Player* member,Player* requester); bool EnforceCapacity(Player* player); bool PlayerLeadership(Player* leader); @@ -34,12 +39,17 @@ public: private: struct Record { - time_t SearchAt=0,SpeakAt=0; + time_t SearchAt=0,SpeakAt=0,MergeAt=0,BrowserAt=0,BrowserCheckAt=0; + bool BrowserOwned=false,BgOwned=false; + std::string BrowserIntent; ObjectGuid Inviter; std::string FormationIntent; time_t InviteUntil=0; std::unordered_map Partners; }; + unsigned PendingInvites(Player* leader,Player* except=nullptr) const; + bool SurplusRole(Player* member); + bool Merge(Player* player,AdventureGroupPlan const& plan); void CheckFullGroup(Player* player); void Invite(Player* leader,Player* member,std::string const& intent,bool forming); void Speak(Player* player,std::string const& message); diff --git a/src/server/game/World/AdventureGroupPolicy.h b/src/server/game/World/AdventureGroupPolicy.h index 56a94ba167..0554884ce8 100644 --- a/src/server/game/World/AdventureGroupPolicy.h +++ b/src/server/game/World/AdventureGroupPolicy.h @@ -22,9 +22,18 @@ inline time_t DepartureAt(time_t now,time_t blockEnd) inline bool Gathering(std::string const& intent,long long deadline,long long now) {return intent=="groupformation" && deadline>now && deadline-now<=300;} inline bool Eligible(std::string const& intent) -{return intent=="instance" || intent=="raid" || intent=="adventure" || intent=="profession" || intent=="social";} +{return intent=="pvp" || intent=="instance" || intent=="raid" || intent=="adventure" || intent=="profession" || intent=="social";} inline unsigned Capacity(std::string const& intent) {return intent=="raid"?20:intent=="instance"?5:intent=="social"?10:3;} +inline bool WorldPvP(unsigned zone) +{return zone==5094 || zone==5095 || zone==3483 || zone==3519 || zone==3518 || zone==3521;} +struct Roles {unsigned Tanks,Healers,Damage;}; +inline Roles RequiredRoles(unsigned capacity) +{if(capacity<=5)return {1,1,3};unsigned healers=capacity<=10?2:capacity<=20?4:6;return {2,healers,capacity-2-healers};} +inline float MergeChance(float sociability,long long remaining) +{float progress=1.0f-std::clamp(float(remaining)/3600.0f,0.0f,1.0f);return std::clamp(.2f+.3f*sociability+.5f*progress,0.0f,1.0f);} +inline bool PreferMerge(unsigned sourceSize,unsigned targetSize,bool surplus,bool completes,bool stableOrder) +{return targetSize>sourceSize || surplus || completes || (targetSize==sourceSize && stableOrder);} inline bool InviteLevel(unsigned bot,unsigned player) {return bot>player?bot-player<=5:player-bot<=5;} inline bool AcceptPlayerLevel(unsigned bot,unsigned player) diff --git a/src/server/game/World/AdventureInteractionMgr.cpp b/src/server/game/World/AdventureInteractionMgr.cpp index 8fc43e275d..3cca84a273 100644 --- a/src/server/game/World/AdventureInteractionMgr.cpp +++ b/src/server/game/World/AdventureInteractionMgr.cpp @@ -176,7 +176,7 @@ bool AdventureInteractionMgr::Update(Player* p,uint32 diff) } bool forming=sAdventureGroupMgr->Forming(p); if(forming){r.LastActivity=now;r.AfkSince=0;r.Schedule=sAdventureBehaviorMgr->InteractionSchedule(p);} - bool protectedTravel=sAdventureGroupTravelMgr->Protected(p); + bool protectedTravel=sAdventureGroupTravelMgr->Protected(p) || p->isUsingLfg() || p->InBattlegroundQueue() || p->InBattleground(); if(protectedTravel){r.LastActivity=now;r.AfkSince=0;} if(!forming && !protectedTravel && AdventureInteractionPolicy::CanLeave(p->IsAlive(),p->IsInCombat(),p->GetMap()->IsDungeon(),p->GetTransport() || p->IsInFlight() || p->IsFlying())) { diff --git a/src/server/game/World/AdventureLocationMgr.cpp b/src/server/game/World/AdventureLocationMgr.cpp index 7b25655d0a..f7d0592aa0 100644 --- a/src/server/game/World/AdventureLocationMgr.cpp +++ b/src/server/game/World/AdventureLocationMgr.cpp @@ -144,6 +144,7 @@ bool AdventureLocationMgr::LevelEligible(Player const* player,AdventureLocation // five levels over the recommended upper edge is the outer tolerance. return intent=="raid" || (it->second.Max && player->getLevel()<=it->second.Max+5); } + if(intent=="pvp" && AdventureGroupPolicy::WorldPvP(location.ZoneId?location.ZoneId:location.AreaId))strictArea=true; if(!strictArea)return true; auto area=sAdventureAreaMgr->Area(location.AreaId?location.AreaId:location.ZoneId); return area.KnownLevel && player->getLevel()>=area.MinLevel; @@ -162,6 +163,12 @@ float AdventureLocationMgr::Weight(AdventureLocation const & location, std::stri if(!map || !map->IsDungeon() || map->IsRaid()!=(intent=="raid"))return 0; if(!location.InstanceCapacity)return 0; } + if(intent=="pvp") + { + auto zone=location.ZoneId?location.ZoneId:location.AreaId; + if(AdventureGroupPolicy::Capital(zone))return 0.3f; // Explicit battleground-browser assignment. + return AdventureGroupPolicy::WorldPvP(zone) && location.IsArea?1.0f:0.0f; + } if(intent=="groupformation" && !AdventureGroupPolicy::Capital(location.ZoneId?location.ZoneId:location.AreaId))return 0; auto type = _types.find(location.Point.Category); if (type != _types.end()) diff --git a/src/server/game/World/AdventurePopulationMgr.cpp b/src/server/game/World/AdventurePopulationMgr.cpp index 2cfa7146e4..99d0e19bea 100644 --- a/src/server/game/World/AdventurePopulationMgr.cpp +++ b/src/server/game/World/AdventurePopulationMgr.cpp @@ -82,7 +82,7 @@ void AdventurePopulationMgr::Snapshot() } void AdventurePopulationMgr::Update(uint32 diff) { - ClientlessCharacterFactory::Update(); + _queries.ProcessReadyCallbacks();_saves.ProcessReadyCallbacks(); if(!_configured){Configure();return;} if(!_enabled || sWorld->IsStopped())return; diff --git a/src/server/game/World/ClientlessActionExecutorMgr.cpp b/src/server/game/World/ClientlessActionExecutorMgr.cpp index 6af54b5cd0..b064a1d68a 100644 --- a/src/server/game/World/ClientlessActionExecutorMgr.cpp +++ b/src/server/game/World/ClientlessActionExecutorMgr.cpp @@ -1594,8 +1594,8 @@ bool ClientlessActionExecutorMgr::StartPortalUse(Player* player, if (candidate && candidate->GetEntry() == portal->Entry && candidate->isSpawned() && player->IsInPhase(candidate) && player->CanSeeOrDetect(candidate) && !candidate->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE | GO_FLAG_LOCKED) && - candidate->GetGoType() == GAMEOBJECT_TYPE_SPELLCASTER && - candidate->GetGOInfo()->spellcaster.spell == portal->SpellId && + ((candidate->GetGoType()==GAMEOBJECT_TYPE_SPELLCASTER && candidate->GetGOInfo()->spellcaster.spell==portal->SpellId) || + (candidate->GetGoType()==GAMEOBJECT_TYPE_GOOBER && candidate->GetGOInfo()->goober.spell==portal->SpellId)) && player->GetGameObjectIfCanInteractWith(candidate->GetGUID()) == candidate) { object = candidate; diff --git a/src/server/game/World/ClientlessBrowserPolicy.h b/src/server/game/World/ClientlessBrowserPolicy.h new file mode 100644 index 0000000000..641ae6d45d --- /dev/null +++ b/src/server/game/World/ClientlessBrowserPolicy.h @@ -0,0 +1,40 @@ +#ifndef VCORE_CLIENTLESS_BROWSER_POLICY_H +#define VCORE_CLIENTLESS_BROWSER_POLICY_H +#include "Config.h" +#include "ClientlessBrowserRules.h" +#include "ObjectAccessor.h" +#include "Player.h" +#include "WorldSession.h" +#include + +// Generic CPC admission policy: matchmaking must not depend on AdventureBots. +namespace ClientlessBrowserPolicy +{ +enum class Kind { Dungeon, Raid, Battleground }; +inline char const* Prefix(Kind kind) +{return kind==Kind::Dungeon?"Clientless.Browser.Dungeon.":kind==Kind::Raid?"Clientless.Browser.Raid.":"Clientless.Browser.Battleground.";} +inline bool QueueEnabled(Kind kind) +{return sConfigMgr->GetBoolDefault(std::string(Prefix(kind))+"QueueEnabled",true);} +inline bool JoinEnabled(Kind kind) +{return sConfigMgr->GetBoolDefault(std::string(Prefix(kind))+"JoinEnabled",kind==Kind::Dungeon);} +inline bool Bot(Player const* player) +{return player && player->GetSession() && player->GetSession()->IsClientless();} +inline bool Human(Player const* player) +{return player && player->GetSession() && !player->GetSession()->IsClientless() && + !player->GetSession()->PlayerLogout() && player->GetSession()->HasOpenRealmConnection();} +inline bool BotOnlyTests() +{return sConfigMgr->GetBoolDefault("Clientless.Browser.AllowBotOnlyTests",false);} +inline bool CanMatch(std::vector const& participants,Kind kind) +{ + if(participants.empty())return false; + bool bot=false,human=false; + for(auto guid:participants) + { + auto p=ObjectAccessor::FindConnectedPlayer(guid); + if(!p)continue; // Offline humans do not satisfy the participation requirement. + if(Bot(p))bot=true;else if(Human(p))human=true; + } + return ClientlessBrowserRules::Admit(bot,human,BotOnlyTests(),QueueEnabled(kind),JoinEnabled(kind)); +} +} +#endif diff --git a/src/server/game/World/ClientlessBrowserRules.h b/src/server/game/World/ClientlessBrowserRules.h new file mode 100644 index 0000000000..026b7299ff --- /dev/null +++ b/src/server/game/World/ClientlessBrowserRules.h @@ -0,0 +1,8 @@ +#ifndef VCORE_CLIENTLESS_BROWSER_RULES_H +#define VCORE_CLIENTLESS_BROWSER_RULES_H +namespace ClientlessBrowserRules +{ +constexpr bool Admit(bool hasBot,bool hasHuman,bool allowBotOnly,bool queueEnabled,bool joinEnabled) +{return !hasBot || (queueEnabled && joinEnabled && (hasHuman || allowBotOnly));} +} +#endif diff --git a/src/server/game/World/ClientlessLuaEngine.cpp b/src/server/game/World/ClientlessLuaEngine.cpp index 6de5ab244e..d131452c1e 100644 --- a/src/server/game/World/ClientlessLuaEngine.cpp +++ b/src/server/game/World/ClientlessLuaEngine.cpp @@ -234,6 +234,8 @@ public: void Update(Player* player, uint32 diff) override { sClientlessLuaEngine->UpdateWorldPresence(player,sAdventureBehaviorMgr->InteractionIntent(player)); + // Browser responses remain independent of combat and supply animations. + sAdventureGroupMgr->UpdateBrowser(player); sAdventureGroupTravelMgr->Observe(player,diff); sAdventurePopulationMgr->Maintain(player,diff); // Restart restores native ship attachment, but CPC ride execution is @@ -590,7 +592,7 @@ void ClientlessLuaEngine::UpdateWorldPresence(Player* player, std::string const& if (player->getRace()!=RACE_WORGEN) return; if (!player->HasSpell(SPELL_TWO_FORMS_RACIAL)) player->LearnSpell(SPELL_TWO_FORMS_RACIAL,false); if (player->getLevel()>=20 && !player->HasSpell(458)) player->LearnSpell(458,false); - bool active=intent=="adventure" || intent=="instance" || intent=="raid" || player->IsInCombat() || player->GetMap()->IsDungeon(); + bool active=intent=="pvp" || intent=="adventure" || intent=="instance" || intent=="raid" || player->IsInCombat() || player->GetMap()->IsDungeon(); auto guid=player->GetGUID().GetCounter(); auto wanted=_worgenForms.find(guid); if (arrived && !active) wanted=_worgenForms.insert_or_assign(guid,urand(0,1)!=0).first; diff --git a/src/server/game/World/ClientlessTestBotMgr.cpp b/src/server/game/World/ClientlessTestBotMgr.cpp new file mode 100644 index 0000000000..81feb9be2d --- /dev/null +++ b/src/server/game/World/ClientlessTestBotMgr.cpp @@ -0,0 +1,534 @@ +#include "ClientlessTestBotMgr.h" +#include "ClientlessCharacterFactory.h" +#include "ClientlessPlayerMgr.h" +#include "ClientlessTravelMgr.h" +#include "Chat.h" +#include "Base64.h" +#include "Config.h" +#include "CombatPackets.h" +#include "Creature.h" +#include "GameObject.h" +#include "GossipDef.h" +#include "NPCPackets.h" +#include "Bag.h" +#include "DBCStores.h" +#include "Item.h" +#include "Log.h" +#include "Map.h" +#include "MotionMaster.h" +#include "MovementPackets.h" +#include "GameClient.h" +#include "PathGenerator.h" +#include "ObjectAccessor.h" +#include "ObjectMgr.h" +#include "Opcodes.h" +#include "Player.h" +#include "QuestPackets.h" +#include "SpellInfo.h" +#include "SpellMgr.h" +#include "SpellPackets.h" +#include "Stats.h" +#include "World.h" +#include "WorldPacket.h" +#include "WorldSession.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +namespace fs=std::filesystem; +using Clock=std::chrono::steady_clock; +struct TestController final:ClientlessPlayerController +{ + static void ClaimMover(Player* player) + { + auto client=player->GetGameClient();if(!client)return; + Unit* mover=player; + if(auto vehicle=player->GetVehicleBase())if(client->IsAllowedToMove(vehicle))mover=vehicle; + if(!client->IsAllowedToMove(mover) || client->GetActivelyMovedUnit()==mover)return; + // Emulate the client's normal control acknowledgement. The native + // handler enforces the server's allowed-mover list, including vehicles. + WorldPackets::Movement::SetActiveMover packet{WorldPacket(CMSG_SET_ACTIVE_MOVER)};packet.ActiveMover=mover->GetGUID(); + player->GetSession()->HandleSetActiveMoverOpcode(packet); + } + void OnPlayerOnline(Player* player)override{ClaimMover(player);} + void Update(Player* player,uint32)override{ClaimMover(player);} +}; +struct Run +{ + std::string Id, State="running", Error; + lua_State* Lua=nullptr; lua_State* Thread=nullptr; + Clock::time_point Started=Clock::now(), Wake=Started; + uint32 TimeoutSeconds=300; + uint64 StartedUnixMs=uint64(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + uint32 Checks=0, Failures=0, Created=0; bool Creating=false; + size_t Memory=0; + std::string CreateError; + std::set Bots; + std::vector Events; + ~Run(){if(Lua)lua_close(Lua);} +}; +std::map> runs; +std::map leases; +bool accepting=true; +fs::path Root(){return sConfigMgr->GetStringDefault("Clientless.TestBot.Root","testbots");} +bool Key(std::string const& s) +{ + return !s.empty() && s.size()<=80 && s.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-")==std::string::npos; +} +std::string Quote(std::string const& s) +{ + std::string out="\"";char const* hex="0123456789abcdef"; + for(unsigned char c:s){if(c=='"'||c=='\\'){out+='\\';out+=char(c);}else if(c<32){out+="\\u00";out+=hex[c>>4];out+=hex[c&15];}else out+=char(c);} + return out+'"'; +} +bool Write(fs::path const& path,std::string const& value) +{ + fs::create_directories(path.parent_path());auto tmp=path;tmp+=".tmp"; + std::ofstream out(tmp,std::ios::binary|std::ios::trunc);out<(Clock::now()-r.Started).count() + <<",\"checks\":"<CancelTravel(guid); + sClientlessPlayerMgr->StopPlayer(guid); + leases.erase(guid); + } + Publish(r); + if(r.Lua){lua_close(r.Lua);r.Lua=nullptr;r.Thread=nullptr;} + r.Events.clear();r.Events.shrink_to_fit(); + TC_LOG_INFO("server.worldserver","TESTBOT_RESULT run=%s state=%s checks=%u failures=%u error='%s'",r.Id.c_str(),r.State.c_str(),r.Checks,r.Failures,r.Error.c_str()); +} +Run& Context(lua_State* L){return *static_cast(lua_touserdata(L,lua_upvalueindex(1)));} +uint32 Number(lua_State* L,int index,uint32 low=1,uint32 high=0xFFFFFFFFu) +{ + auto v=luaL_checkinteger(L,index);luaL_argcheck(L,v>=low && uint64(v)<=high,index,"integer out of range");return uint32(v); +} +float Coordinate(lua_State* L,int i) +{ + auto v=luaL_checknumber(L,i);luaL_argcheck(L,std::isfinite(v) && std::fabs(v)<100000,i,"invalid coordinate");return float(v); +} +uint32 Owned(lua_State* L) +{ + auto guid=Number(L,1);luaL_argcheck(L,Context(L).Bots.count(guid),1,"bot does not belong to this run");return guid; +} +Player* Actor(lua_State* L) +{ + auto session=sWorld->FindClientlessSession(Owned(L));auto player=session?session->GetPlayer():nullptr; + luaL_argcheck(L,player && player->IsInWorld() && !player->IsBeingTeleported(),1,"bot not online or teleport pending");return player; +} +ObjectGuid Target(lua_State* L,int index=2) +{ + auto s=luaL_checkstring(L,index);char* end=nullptr;auto raw=std::strtoull(s,&end,10); + luaL_argcheck(L,*s && end && !*end && raw,index,"expected full GUID string from creature/object lookup");return ObjectGuid(uint64(raw)); +} +int Spawn(lua_State* L) +{ + auto guid=Number(L,1);auto& r=Context(L); + if(leases.count(guid) && leases.at(guid)!=r.Id)return luaL_error(L,"bot leased by another run"); + std::ifstream file(Root()/"registry"/(std::to_string(guid)+".bot"));uint32 account=0;file>>account; + if(!account)return luaL_error(L,"not a registered test character; create it with testbot.create first"); + if(sClientlessPlayerMgr->IsManaged(guid) || !sClientlessPlayerMgr->StartPlayer(account,guid,std::make_unique())) + return luaL_error(L,"test character is already managed or login failed"); + r.Bots.insert(guid);leases[guid]=r.Id;lua_pushinteger(L,guid);return 1; +} +int Online(lua_State* L) +{ + auto session=sWorld->FindClientlessSession(Owned(L));auto player=session?session->GetPlayer():nullptr; + lua_pushboolean(L,player && player->IsInWorld() && !player->IsBeingTeleported());return 1; +} +int Create(lua_State* L) +{ + auto& r=Context(L);if(r.Creating)return luaL_error(L,"creation already pending"); + auto account=Number(L,1);ClientlessCharacterFactory::Definition d; + d.Name=luaL_checkstring(L,2);d.Race=uint8(Number(L,3,1,255));d.Class=uint8(Number(L,4,1,11)); + d.Level=uint8(Number(L,5,1,85));d.Gender=uint8(luaL_optinteger(L,6,0));d.Seed=uint32(r.Bots.size()+1); + r.Creating=true;r.Created=0;r.CreateError.clear();std::weak_ptr weak=runs.at(r.Id); + ClientlessCharacterFactory::CreateAsync(account,d,{}, {},[weak,account](ClientlessCharacterFactory::Result result) + { + try + { + if(result.Guid && !Write(Root()/"registry"/(std::to_string(result.Guid)+".bot"),std::to_string(account))) + result.Error="Cannot persist test character registry"; + } + catch(std::exception const& e){result.Error=e.what();} + if(auto run=weak.lock()){run->Creating=false;run->Created=result.Guid;run->CreateError=result.Error;if(result.Guid)run->Bots.insert(result.Guid);if(run->State!="running")Publish(*run);} + }); + return 0; +} +int CreateResult(lua_State* L) +{ + auto& r=Context(L);lua_pushboolean(L,r.Creating);lua_pushinteger(L,r.Created);lua_pushstring(L,r.CreateError.c_str()); + return 3; +} +int Wait(lua_State* L) +{ + auto ms=Number(L,1,0,60000);Context(L).Wake=Clock::now()+std::chrono::milliseconds(ms);return lua_yield(L,0); +} +int Snapshot(lua_State* L) +{ + auto p=Actor(L);lua_newtable(L); + auto n=[&](char const* k,lua_Integer v){lua_pushinteger(L,v);lua_setfield(L,-2,k);}; + auto f=[&](char const* k,float v){lua_pushnumber(L,v);lua_setfield(L,-2,k);}; + n("strength",p->GetStat(StatType::Strength));n("agility",p->GetStat(StatType::Agility));n("stamina",p->GetStat(StatType::Stamina));n("intellect",p->GetStat(StatType::Intellect));n("spirit",p->GetStat(StatType::Spirit)); + auto mover=p->GetGameClient()?p->GetGameClient()->GetActivelyMovedUnit():nullptr;lua_pushstring(L,mover?std::to_string(mover->GetGUID().GetRawValue()).c_str():"");lua_setfield(L,-2,"mover_guid"); + n("area",p->GetAreaId());n("zone",p->GetZoneId());lua_pushstring(L,p->GetLootGUID()?std::to_string(p->GetLootGUID().GetRawValue()).c_str():"");lua_setfield(L,-2,"loot_guid"); + n("guid",p->GetGUID().GetCounter());n("level",p->getLevel());n("map",p->GetMapId());n("health",p->GetHealth());n("max_health",p->GetMaxHealth());n("power",p->GetPower(p->GetPowerType()));n("max_power",p->GetMaxPower(p->GetPowerType())); + auto vehicle=p->GetVehicleCreatureBase();n("vehicle_entry",vehicle?vehicle->GetEntry():0);lua_pushstring(L,vehicle?std::to_string(vehicle->GetGUID().GetRawValue()).c_str():"");lua_setfield(L,-2,"vehicle_guid"); + n("moving",p->IsSplineEnabled());n("alive",p->IsAlive());n("combat",p->IsInCombat());n("transport",bool(p->GetTransport()));f("x",p->GetPositionX());f("y",p->GetPositionY());f("z",p->GetPositionZ());return 1; +} +int Teleport(lua_State* L) +{ + auto p=Actor(L);auto map=Number(L,2,0,65535);auto x=Coordinate(L,3),y=Coordinate(L,4),z=Coordinate(L,5),o=Coordinate(L,6); + lua_pushboolean(L,p->TeleportTo(map,x,y,z,o));return 1; +} +int Level(lua_State* L){auto p=Actor(L);p->GiveLevel(uint8(Number(L,2,1,85)));p->InitTalentForLevel();p->SetFullHealth();return 0;} +int Stats(lua_State* L) +{ + auto p=Actor(L);p->SetMaxHealth(Number(L,2,1,100000000));p->SetFullHealth(); + if(lua_gettop(L)>=3){auto power=Number(L,3,0,100000000);p->SetMaxPower(p->GetPowerType(),power);p->SetPower(p->GetPowerType(),power);}return 0; +} +int Stat(lua_State* L) +{ + auto p=Actor(L);auto stat=Number(L,2,0,4);p->GetStats().SetBaseStatValue(StatType(stat),int32(Number(L,3,0,1000000)));return 0; +} +int Learn(lua_State* L){auto p=Actor(L);auto id=Number(L,2);if(!sSpellMgr->GetSpellInfo(id))return luaL_error(L,"unknown spell");p->LearnSpell(id,false);return 0;} +int Item(lua_State* L){auto p=Actor(L);lua_pushboolean(L,p->StoreNewItemInBestSlots(Number(L,2),Number(L,3,1,1000)));return 1;} +int Equip(lua_State* L) +{ + auto p=Actor(L);auto slot=uint8(Number(L,2,0,22));uint16 dest=0;auto item=Number(L,3); + if(p->GetItemByPos(INVENTORY_SLOT_BAG_0,slot))return luaL_error(L,"equipment slot occupied; clear it explicitly first"); + lua_pushboolean(L,p->CanEquipNewItem(slot,dest,item,false)==EQUIP_ERR_OK && p->EquipNewItem(dest,item,true));return 1; +} +int ClearSlot(lua_State* L){auto p=Actor(L);p->DestroyItem(INVENTORY_SLOT_BAG_0,uint8(Number(L,2,0,22)),true);return 0;} +int RemoveItem(lua_State* L){auto p=Actor(L);p->DestroyItemCount(Number(L,2),Number(L,3,1,10000),true);return 0;} +int Skill(lua_State* L) +{ + auto p=Actor(L);auto skill=Number(L,2,1,65535),value=Number(L,3,0,600),maximum=Number(L,4,0,600); + if(!sSkillLineStore.LookupEntry(skill) || value>maximum)return luaL_error(L,"invalid skill or skill value exceeds maximum"); + p->SetSkill(uint16(skill),p->GetSkillStep(uint16(skill)),uint16(value),uint16(maximum));lua_pushboolean(L,p->GetPureSkillValue(skill)==value);return 1; +} +int Count(lua_State* L){auto p=Actor(L);lua_pushinteger(L,p->GetItemCount(Number(L,2),false));return 1;} +int Quest(lua_State* L){auto p=Actor(L);auto id=Number(L,2);lua_pushinteger(L,p->GetQuestStatus(id));lua_pushboolean(L,p->GetQuestRewardStatus(id));return 2;} +int Find(lua_State* L) +{ + auto p=Actor(L);auto spawn=Number(L,2);bool object=lua_toboolean(L,lua_upvalueindex(2)); + ObjectGuid found; + if(object){auto const& store=p->GetMap()->GetGameObjectBySpawnIdStore();auto range=store.equal_range(spawn);for(auto i=range.first;i!=range.second;++i)if(p->CanSeeOrDetect(i->second)){found=i->second->GetGUID();break;}} + else {auto const& store=p->GetMap()->GetCreatureBySpawnIdStore();auto range=store.equal_range(spawn);for(auto i=range.first;i!=range.second;++i)if(p->CanSeeOrDetect(i->second)){found=i->second->GetGUID();break;}} + if(found)lua_pushstring(L,std::to_string(found.GetRawValue()).c_str());else lua_pushnil(L);return 1; +} +int Nearest(lua_State* L) +{ + auto p=Actor(L);auto entry=Number(L,2);auto radius=luaL_optnumber(L,3,40); + luaL_argcheck(L,std::isfinite(radius) && radius>0 && radius<=100,3,"radius must be 0..100 yards"); + WorldObject* object=lua_toboolean(L,lua_upvalueindex(2))?static_cast(p->FindNearestGameObject(entry,float(radius))):static_cast(p->FindNearestCreature(entry,float(radius),true)); + if(object && p->CanSeeOrDetect(object))lua_pushstring(L,std::to_string(object->GetGUID().GetRawValue()).c_str());else lua_pushnil(L);return 1; +} +int NpcHello(lua_State* L) +{ + auto p=Actor(L);WorldPackets::NPC::Hello packet{WorldPacket(CMSG_GOSSIP_HELLO)};packet.Unit=Target(L);p->GetSession()->HandleGossipHelloOpcode(packet);return 0; +} +int Menu(lua_State* L) +{ + auto p=Actor(L);auto& menu=p->PlayerTalkClass->GetGossipMenu();lua_newtable(L); + lua_pushinteger(L,menu.GetMenuId());lua_setfield(L,-2,"id");lua_pushstring(L,std::to_string(p->PlayerTalkClass->GetInteractionData().SourceGuid.GetRawValue()).c_str());lua_setfield(L,-2,"source_guid");lua_newtable(L);unsigned index=1; + for(auto const& option:menu.GetMenuItems()) + { + lua_newtable(L);lua_pushinteger(L,option.first);lua_setfield(L,-2,"id");lua_pushstring(L,option.second.Message.c_str());lua_setfield(L,-2,"text"); + lua_pushboolean(L,option.second.IsCoded);lua_setfield(L,-2,"coded");lua_pushinteger(L,option.second.OptionType);lua_setfield(L,-2,"action");lua_rawseti(L,-2,index++); + } + lua_setfield(L,-2,"options");return 1; +} +int SpellClick(lua_State* L){auto p=Actor(L);WorldPacket packet(CMSG_SPELLCLICK);packet<GetSession()->HandleSpellClick(packet);return 0;} +int ExitVehicle(lua_State* L){auto p=Actor(L);WorldPacket packet(CMSG_REQUEST_VEHICLE_EXIT);p->GetSession()->HandleRequestVehicleExit(packet);return 0;} +int RequestCast(lua_State* L) +{ + auto p=Actor(L);WorldPackets::Spells::CastSpell packet{WorldPacket(CMSG_CAST_SPELL)};packet.Cast.SpellID=int32(Number(L,2)); + auto target=lua_gettop(L)>=3?Target(L,3):p->GetGUID();packet.Cast.Target.Flags=target.IsGameObject()?TARGET_FLAG_GAMEOBJECT:TARGET_FLAG_UNIT;packet.Cast.Target.Unit=target;p->GetSession()->HandleCastSpellOpcode(packet);return 0; +} +int RequestCastAt(lua_State* L) +{ + auto p=Actor(L);WorldPackets::Spells::CastSpell packet{WorldPacket(CMSG_CAST_SPELL)};packet.Cast.SpellID=int32(Number(L,2)); + WorldPackets::Spells::TargetLocation location;location.Location.Relocate(Coordinate(L,3),Coordinate(L,4),Coordinate(L,5)); + packet.Cast.Target.Flags=TARGET_FLAG_DEST_LOCATION;packet.Cast.Target.DstLocation=location;p->GetSession()->HandleCastSpellOpcode(packet);return 0; +} +int UseItemAt(lua_State* L) +{ + auto p=Actor(L);auto bag=uint8(Number(L,2,0,255)),slot=uint8(Number(L,3,0,255));auto item=p->GetItemByPos(bag,slot);if(!item)return luaL_error(L,"item slot empty"); + WorldPackets::Spells::UseItem packet{WorldPacket(CMSG_USE_ITEM)};packet.PackSlot=bag;packet.Slot=slot;packet.CastItem=item->GetGUID();packet.Cast.SpellID=int32(Number(L,4)); + WorldPackets::Spells::TargetLocation location;location.Location.Relocate(Coordinate(L,5),Coordinate(L,6),Coordinate(L,7)); + packet.Cast.Target.Flags=TARGET_FLAG_DEST_LOCATION;packet.Cast.Target.DstLocation=location;p->GetSession()->HandleUseItemOpcode(packet);return 0; +} +int AreaTrigger(lua_State* L){auto p=Actor(L);WorldPacket packet(CMSG_AREATRIGGER);packet<GetSession()->HandleAreaTriggerOpcode(packet);return 0;} +int Inventory(lua_State* L) +{ + auto p=Actor(L);lua_newtable(L);unsigned index=1; + auto add=[&](uint8 bag,uint8 slot) + { + auto item=p->GetItemByPos(bag,slot);if(!item)return; + lua_newtable(L);lua_pushinteger(L,bag);lua_setfield(L,-2,"bag");lua_pushinteger(L,slot);lua_setfield(L,-2,"slot"); + lua_pushinteger(L,item->GetEntry());lua_setfield(L,-2,"item");lua_pushinteger(L,item->GetCount());lua_setfield(L,-2,"count");lua_pushstring(L,std::to_string(item->GetGUID().GetRawValue()).c_str());lua_setfield(L,-2,"guid"); + lua_newtable(L);unsigned effectIndex=1; + for(auto const& effect:item->GetTemplate()->Effects)if(effect.SpellID) + { + lua_newtable(L);lua_pushinteger(L,effect.SpellID);lua_setfield(L,-2,"id");lua_pushinteger(L,effect.Trigger);lua_setfield(L,-2,"trigger");lua_rawseti(L,-2,effectIndex++); + } + lua_setfield(L,-2,"spells");lua_rawseti(L,-2,index++); + }; + for(uint8 slot=0;slotGetItemByPos(INVENTORY_SLOT_BAG_0,bag))if(auto container=item->ToBag())for(uint8 slot=0;slotGetBagSize();++slot)add(bag,slot); + return 1; +} +int Use(lua_State* L){auto p=Actor(L);WorldPacket packet(CMSG_GAMEOBJ_USE,8);packet<GetSession()->HandleGameObjectUseOpcode(packet);return 0;} +int Hello(lua_State* L){auto p=Actor(L);WorldPackets::Quest::QuestGiverHello packet{WorldPacket(CMSG_QUEST_GIVER_HELLO)};packet.QuestGiverGUID=Target(L);p->GetSession()->HandleQuestgiverHelloOpcode(packet);return 0;} +int Accept(lua_State* L){auto p=Actor(L);WorldPackets::Quest::QuestGiverAcceptQuest packet{WorldPacket(CMSG_QUEST_GIVER_ACCEPT_QUEST)};packet.QuestGiverGUID=Target(L);packet.QuestID=Number(L,3);p->GetSession()->HandleQuestgiverAcceptQuestOpcode(packet);return 0;} +int Abandon(lua_State* L) +{ + auto p=Actor(L);auto slot=p->FindQuestSlot(Number(L,2));if(slot>=MAX_QUEST_LOG_SIZE)return luaL_error(L,"quest not in log"); + WorldPackets::Quest::QuestLogRemoveQuest packet{WorldPacket(CMSG_QUEST_LOG_REMOVE_QUEST)};packet.Entry=uint8(slot);p->GetSession()->HandleQuestLogRemoveQuest(packet);return 0; +} +int Reward(lua_State* L){auto p=Actor(L);WorldPackets::Quest::QuestGiverChooseReward packet{WorldPacket(CMSG_QUEST_GIVER_CHOOSE_REWARD)};packet.QuestGiverGUID=Target(L);packet.QuestID=int32(Number(L,3));packet.ItemChoiceID=int32(Number(L,4,0,5));p->GetSession()->HandleQuestgiverChooseRewardOpcode(packet);return 0;} +int Gossip(lua_State* L) +{ + auto p=Actor(L);auto guid=Target(L);auto menu=Number(L,3,0),option=Number(L,4,0);WorldPacket packet(CMSG_GOSSIP_SELECT_OPTION);packet<PlayerTalkClass->IsGossipOptionCoded(option))packet<GetSession()->HandleGossipSelectOptionOpcode(packet);return 0; +} +int Cast(lua_State* L) +{ + auto p=Actor(L);auto id=Number(L,2);auto target=lua_gettop(L)>=3?ObjectAccessor::GetUnit(*p,Target(L,3)):p; + if(!p->HasSpell(id)||!target)return luaL_error(L,"spell not learned or target not loaded"); + lua_pushinteger(L,p->CastSpell(target,id,false));return 1; +} +int TargetState(lua_State* L) +{ + auto p=Actor(L);auto target=ObjectAccessor::GetUnit(*p,Target(L));if(!target){lua_pushnil(L);return 1;} + lua_newtable(L);lua_pushinteger(L,target->GetMaxHealth());lua_setfield(L,-2,"max_health");lua_pushinteger(L,target->getLevel());lua_setfield(L,-2,"level");lua_pushinteger(L,target->GetEntry());lua_setfield(L,-2,"entry");lua_pushinteger(L,target->GetHealth());lua_setfield(L,-2,"health");lua_pushboolean(L,target->IsAlive());lua_setfield(L,-2,"alive");lua_pushnumber(L,p->GetDistance(target));lua_setfield(L,-2,"distance"); + lua_pushnumber(L,target->GetPositionX());lua_setfield(L,-2,"x");lua_pushnumber(L,target->GetPositionY());lua_setfield(L,-2,"y");lua_pushnumber(L,target->GetPositionZ());lua_setfield(L,-2,"z");return 1; +} +int Objectives(lua_State* L) +{ + auto p=Actor(L);auto slot=p->FindQuestSlot(Number(L,2));lua_newtable(L); + if(slotGetQuestSlotCounter(slot,i));lua_rawseti(L,-2,i+1);} + return 1; +} +int RequestReward(lua_State* L) +{ + auto p=Actor(L);WorldPackets::Quest::QuestGiverCompleteQuest packet{WorldPacket(CMSG_QUEST_GIVER_COMPLETE_QUEST)}; + packet.QuestGiverGUID=Target(L);packet.QuestID=int32(Number(L,3));p->GetSession()->HandleQuestgiverCompleteQuest(packet);return 0; +} +int Loot(lua_State* L){auto p=Actor(L);WorldPacket packet(CMSG_LOOT);packet<GetSession()->HandleLootOpcode(packet);return 0;} +int LootItem(lua_State* L){auto p=Actor(L);WorldPacket packet(CMSG_AUTOSTORE_LOOT_ITEM);packet<GetSession()->HandleAutostoreLootItemOpcode(packet);return 0;} +int LootRelease(lua_State* L){auto p=Actor(L);WorldPacket packet(CMSG_LOOT_RELEASE);packet<GetSession()->HandleLootReleaseOpcode(packet);return 0;} +int UseItem(lua_State* L) +{ + auto p=Actor(L);auto bag=uint8(Number(L,2,0,255)),slot=uint8(Number(L,3,0,255));auto item=p->GetItemByPos(bag,slot);if(!item)return luaL_error(L,"item slot empty"); + WorldPackets::Spells::UseItem packet{WorldPacket(CMSG_USE_ITEM)};packet.PackSlot=bag;packet.Slot=slot;packet.CastItem=item->GetGUID();packet.Cast.SpellID=int32(Number(L,4,0)); + auto target=lua_gettop(L)>=5?Target(L,5):p->GetGUID();packet.Cast.Target.Flags=target.IsGameObject()?TARGET_FLAG_GAMEOBJECT:TARGET_FLAG_UNIT;packet.Cast.Target.Unit=target;p->GetSession()->HandleUseItemOpcode(packet);return 0; +} +int Move(lua_State* L) +{ + auto p=Actor(L);auto x=Coordinate(L,2),y=Coordinate(L,3),z=Coordinate(L,4); + // Use native local navigation directly: no Adventure area/travel policy. + PathGenerator path(p);bool valid=path.CalculatePath(x,y,z) && (path.GetPathType()&PATHFIND_NORMAL); + if(valid)p->GetMotionMaster()->MovePoint(0,x,y,z,true); + lua_pushboolean(L,valid);return 1; +} +int Stop(lua_State* L){auto p=Actor(L);p->AttackStop();p->GetMotionMaster()->Clear();p->StopMoving();return 0;} +int Now(lua_State* L){lua_pushinteger(L,std::chrono::duration_cast(Clock::now()-Context(L).Started).count());return 1;} + +int Face(lua_State* L){auto p=Actor(L);auto target=ObjectAccessor::GetUnit(*p,Target(L));if(!target)return luaL_error(L,"target not loaded");p->SetFacingToObject(target);return 0;} +int Attack(lua_State* L) +{ + auto p=Actor(L);WorldPackets::Combat::AttackSwing packet{WorldPacket(CMSG_ATTACK_SWING)};packet.Victim=Target(L);p->GetSession()->HandleAttackSwingOpcode(packet); + lua_pushboolean(L,p->GetVictim() && p->GetVictim()->GetGUID()==packet.Victim);return 1; +} +std::string Json(lua_State* L,int i,unsigned depth=0) +{ + if(depth>5)return "null"; + switch(lua_type(L,i)) + { + case LUA_TBOOLEAN:return lua_toboolean(L,i)?"true":"false"; + case LUA_TNUMBER:{auto n=lua_tonumber(L,i);if(!std::isfinite(n))return "null";std::ostringstream o;o.precision(16);o<=100 || out.size()>=8192){lua_pop(L,2);break;} + std::string key; + if(lua_type(L,-2)==LUA_TSTRING)key=std::string(lua_tostring(L,-2)).substr(0,512); + else if(lua_isinteger(L,-2))key=std::to_string(lua_tointeger(L,-2)); + if(!key.empty()){++count;if(out.size()>1)out+=',';out+=Quote(key)+":"+Json(L,-1,depth+1);} + lua_pop(L,1); + }return out+"}";} + default:return "null"; + } +} +int Record(lua_State* L) +{ + auto& r=Context(L);if(r.Events.size()>=1000)return luaL_error(L,"event limit exceeded"); + auto label=std::string(luaL_checkstring(L,1)).substr(0,512);r.Events.push_back("{\"label\":"+Quote(label)+",\"value\":"+Json(L,2)+"}");return 0; +} +int Check(lua_State* L) +{ + auto& r=Context(L);++r.Checks;bool ok=lua_toboolean(L,1);if(!ok)++r.Failures; + if(r.Events.size()>=1000)return luaL_error(L,"event limit exceeded"); + r.Events.push_back("{\"check\":"+Quote(luaL_checkstring(L,2))+",\"passed\":"+(ok?"true":"false")+"}");lua_pushboolean(L,ok);return 1; +} +void* Allocate(void* user,void* ptr,size_t oldSize,size_t newSize) +{ + auto& run=*static_cast(user);if(!ptr)oldSize=0; + if(!newSize){std::free(ptr);run.Memory-=oldSize;return nullptr;} + if(newSize>8*1024*1024 || run.Memory-oldSize>8*1024*1024-newSize)return nullptr; + void* next=std::realloc(ptr,newSize);if(next)run.Memory=run.Memory-oldSize+newSize;return next; +} +void Hook(lua_State* L,lua_Debug*){luaL_error(L,"Lua instruction budget exceeded; yield with testbot.wait/await");} +void Bind(lua_State* L,Run* r,char const* name,lua_CFunction fn,int flag=0) +{ + lua_pushlightuserdata(L,r);lua_pushboolean(L,flag);lua_pushcclosure(L,fn,2);lua_setfield(L,-2,name); +} +bool Start(std::string const& id,fs::path path,std::string& error) +{ + if(!accepting){error="test job admission paused";return false;} + if(!Key(id)){error="invalid run id";return false;} + if(runs.size()>=128)for(auto it=runs.begin();it!=runs.end();) {if(it->second->State!="running")it=runs.erase(it);else ++it;} + if(runs.count(id)||fs::exists(Root()/"results"/(id+".json"))){error="run id already exists";return false;} + for(auto const& entry:runs)if(entry.second->State=="running"){error="another test is running";return false;} + if(!fs::exists(path)||fs::file_size(path)>1024*1024){error="script missing or exceeds 1MiB";return false;} + auto r=std::make_shared();r->Id=id;r->TimeoutSeconds=uint32(std::clamp(sConfigMgr->GetIntDefault("Clientless.TestBot.TimeoutSeconds",300),1,86400));r->Lua=lua_newstate(Allocate,r.get());if(!r->Lua){error="Lua allocation failed";return false;} + auto L=r->Lua;luaL_openlibs(L); + for(auto name:{"io","os","package","debug","dofile","loadfile","require","load","collectgarbage","coroutine","pcall","xpcall"}){lua_pushnil(L);lua_setglobal(L,name);} + lua_newtable(L); + for(auto const& fn:std::initializer_list>{ + {"npc_hello",NpcHello},{"menu",Menu},{"spellclick",SpellClick},{"exit_vehicle",ExitVehicle},{"request_cast",RequestCast},{"request_cast_at",RequestCastAt},{"use_item_at",UseItemAt},{"area_trigger",AreaTrigger},{"inventory",Inventory},{"stop",Stop},{"now_ms",Now},{"spawn",Spawn},{"online",Online},{"_create",Create},{"_create_result",CreateResult},{"wait",Wait},{"state",Snapshot},{"teleport",Teleport},{"level",Level},{"stats",Stats},{"stat",Stat},{"learn",Learn},{"item",Item},{"equip",Equip},{"clear_slot",ClearSlot},{"remove_item",RemoveItem},{"skill",Skill},{"item_count",Count},{"quest",Quest},{"use",Use},{"hello",Hello},{"accept",Accept},{"abandon",Abandon},{"reward",Reward},{"gossip",Gossip},{"cast",Cast},{"move",Move},{"face",Face},{"attack",Attack},{"target_state",TargetState},{"objectives",Objectives},{"request_reward",RequestReward},{"loot",Loot},{"loot_item",LootItem},{"loot_release",LootRelease},{"use_item",UseItem},{"record",Record},{"check",Check}})Bind(L,r.get(),fn.first,fn.second); + Bind(L,r.get(),"nearest_creature",Nearest);Bind(L,r.get(),"nearest_object",Nearest,1); + Bind(L,r.get(),"creature",Find);Bind(L,r.get(),"object",Find,1);lua_setglobal(L,"testbot"); + char const* helpers=R"lua( +function testbot.await(predicate, timeout_ms, label) + local deadline=testbot.now_ms()+(timeout_ms or 10000) + while not predicate() do + assert(testbot.now_ms()Thread=lua_newthread(L);if(luaL_loadfile(r->Thread,path.string().c_str())!=LUA_OK){error=lua_tostring(r->Thread,-1);return false;} + runs[id]=r;Publish(*r);return true; +} +} +ClientlessTestBotMgr* ClientlessTestBotMgr::instance(){static ClientlessTestBotMgr m;return &m;} +void ClientlessTestBotMgr::Update(uint32 diff) +{ + try + { + if(!sConfigMgr->GetBoolDefault("Clientless.TestBot.Enabled",false)) + {for(auto const& e:runs)if(e.second->State=="running")Finish(*e.second,"cancelled","test controller disabled");return;} + static uint32 poll=0;poll+=diff; + if(poll>=1000) + { + poll=0;for(auto dir:{"requests","scripts","results","registry","archive"})fs::create_directories(Root()/dir); + // A claimed request is never replayed after a worldserver restart. + static bool recovered=false;if(!recovered) + { + recovered=true; + for(auto const& e:fs::directory_iterator(Root()/"results"))if(e.path().extension()==".json" && Key(e.path().stem().string())) + { + std::ifstream input(e.path());std::string previous((std::istreambuf_iterator(input)),{}); + if(previous.find("\"state\":\"running\"")!=std::string::npos) + {Run r;r.Id=e.path().stem().string();r.Events.push_back("{\"previous_result\":"+Quote(previous)+"}");Finish(r,"interrupted","worldserver restarted during test");} + } + for(auto const& e:fs::directory_iterator(Root()/"archive"))if(e.path().extension()==".lua") + {auto id=e.path().stem().string();if(Key(id)&&!fs::exists(Root()/"results"/(id+".json"))){Run r;r.Id=id;Finish(r,"interrupted","worldserver restarted before result publication");}} + } + bool busy=false;for(auto const& e:runs)busy|=e.second->State=="running"; + if(accepting && !busy)for(auto const& e:fs::directory_iterator(Root()/"requests"))if(e.is_regular_file() && e.path().extension()==".lua" && Key(e.path().stem().string())) + { + auto id=e.path().stem().string();auto archive=Root()/"archive"/e.path().filename(); + if(fs::exists(archive)||fs::exists(Root()/"results"/(id+".json")))continue; + fs::rename(e.path(),archive);std::string error;if(!Start(id,archive,error)){Run r;r.Id=id;Finish(r,"failed",error);}break; + } + } + for(auto const& entry:runs) + { + auto& r=*entry.second;if(r.State!="running")continue; + auto now=Clock::now();if(now-r.Started>std::chrono::seconds(r.TimeoutSeconds)){Finish(r,"timed_out","configured run deadline exceeded");continue;} + if(nowGetBoolDefault("Clientless.TestBot.Enabled",false)){h->SendSysMessage("Testbot controller disabled (Clientless.TestBot.Enabled).");return true;} + std::istringstream in(args?args:"");std::string op,id,script,extra;in>>op>>id; + if(op=="pause" || op=="resume"){accepting=op=="resume";h->PSendSysMessage("Testbot job admission %s; active runs remain controlled separately.",accepting?"resumed":"paused");return true;} + if(op=="run" && (in>>script) && !(in>>extra) && Key(script)) + {std::string error;bool ok=Start(id,Root()/"scripts"/(script+".lua"),error);h->PSendSysMessage("Testbot run %s: %s",id.c_str(),ok?"accepted":error.c_str());return true;} + if(op=="submit" && Key(id) && (in>>script) && !(in>>extra)) + { + if(script.size()>87384){h->SendSysMessage("Encoded script exceeds 64KiB payload limit.");return true;} + auto decoded=Trinity::Encoding::Base64::Decode(script); + if(!decoded || decoded->size()>65536 || decoded->empty()){h->SendSysMessage("Invalid base64 or script exceeds 64KiB.");return true;} + if(runs.count(id)||fs::exists(Root()/"requests"/(id+".lua"))||fs::exists(Root()/"archive"/(id+".lua"))||fs::exists(Root()/"results"/(id+".json"))) + {h->SendSysMessage("Run id already exists.");return true;} + if(!Write(Root()/"requests"/(id+".lua"),std::string(decoded->begin(),decoded->end()))) + {h->SendSysMessage("Cannot persist test request.");return true;} + h->PSendSysMessage("Testbot run %s: queued",id.c_str());return true; + } + if(op=="result" && Key(id)) + { + std::ifstream file(Root()/"results"/(id+".json")); + if(!file){h->SendSysMessage("Testbot result not available yet.");return true;} + std::string text((std::istreambuf_iterator(file)),{});h->SendSysMessage(text.c_str());return true; + } + auto it=runs.find(id); + if(op=="cancel" && it!=runs.end() && it->second->State=="running"){Finish(*it->second,"cancelled","cancelled by operator");return true;} + if(op=="status" && it!=runs.end()){auto const& r=*it->second;h->PSendSysMessage("Testbot run %s: state=%s checks=%u failures=%u error='%s'",id.c_str(),r.State.c_str(),r.Checks,r.Failures,r.Error.c_str());return true;} + h->SendSysMessage("Usage: clientless test pause | resume | run | status | cancel | submit | result . Requests: /requests/.lua; results: results/.json");return true; + } + catch(std::exception const& e){h->PSendSysMessage("Testbot command failed: %s",e.what());return true;} +} diff --git a/src/server/game/World/ClientlessTestBotMgr.h b/src/server/game/World/ClientlessTestBotMgr.h new file mode 100644 index 0000000000..74e02b7429 --- /dev/null +++ b/src/server/game/World/ClientlessTestBotMgr.h @@ -0,0 +1,14 @@ +#ifndef VCORE_CLIENTLESS_TEST_BOT_MGR_H +#define VCORE_CLIENTLESS_TEST_BOT_MGR_H +#include "Define.h" +class ChatHandler; +// Optional test consumer of the generic Clientless Player Core. No Adventure policy. +class TC_GAME_API ClientlessTestBotMgr +{ +public: + static ClientlessTestBotMgr* instance(); + void Update(uint32 diff); + bool Command(ChatHandler* handler, char const* args); +}; +#define sClientlessTestBotMgr ClientlessTestBotMgr::instance() +#endif diff --git a/src/server/game/World/ClientlessTransportMgr.cpp b/src/server/game/World/ClientlessTransportMgr.cpp index efd87e3042..a069d04db3 100644 --- a/src/server/game/World/ClientlessTransportMgr.cpp +++ b/src/server/game/World/ClientlessTransportMgr.cpp @@ -262,8 +262,10 @@ bool ClientlessTransportMgr::Sample(Player* player, Recording& recording, bool f { auto const& previous = recording.Stop.Points.back(); float delta = Distance(WorldPoint(object, previous), WorldPoint(object, point)); - if (delta > 8.0f) - return fail("Position jump over 8 yards; do not teleport or fly while recording."); + // Native boarding may snap the visitor vertically or deliver movement + // in batches. A fixed 3D sample gap cannot distinguish that from a + // teleport. Trust the GM-recorded route within the dock/frame checks + // and the bounded total length; do not reject a real gangway here. if (!force && previous.OnTransport == point.OnTransport && delta < 0.75f) return true; } @@ -971,8 +973,8 @@ bool ClientlessTransportMgr::Command(ChatHandler* handler, char const* args) if (map != gm->GetMapId()) { handler->PSendSysMessage("Recording not started: node map=%u, recorder map=%u.", map, gm->GetMapId()); return true; } float const nodeDistance = Distance(*gm, position); - if (nodeDistance > 2.0f) - { handler->PSendSysMessage("Recording not started: distance to node '%s' is %.3f yd (maximum 2.000); node=(%.3f %.3f %.3f), recorder=(%.3f %.3f %.3f).", + if (nodeDistance > 5.0f) + { handler->PSendSysMessage("Recording not started: distance to node '%s' is %.3f yd (maximum 5.000); node=(%.3f %.3f %.3f), recorder=(%.3f %.3f %.3f).", node.c_str(), nodeDistance, position.GetPositionX(), position.GetPositionY(), position.GetPositionZ(), gm->GetPositionX(), gm->GetPositionY(), gm->GetPositionZ()); return true; } if (gm->GetTransport()) { handler->PSendSysMessage("Recording not started: recorder is already a passenger of '%s'. Start on the platform, before boarding.", diff --git a/src/server/game/World/ClientlessTravelGraphMgr.cpp b/src/server/game/World/ClientlessTravelGraphMgr.cpp index 562186bd7b..124d85ff6b 100644 --- a/src/server/game/World/ClientlessTravelGraphMgr.cpp +++ b/src/server/game/World/ClientlessTravelGraphMgr.cpp @@ -41,43 +41,65 @@ bool ClientlessTravelGraphMgr::ResolvePortalUse(uint32 spawnId, portal = {}; auto const* spawn = sObjectMgr->GetGameObjectData(spawnId); auto const* info = spawn ? sObjectMgr->GetGameObjectTemplate(spawn->id) : nullptr; - if (!info || info->type != GAMEOBJECT_TYPE_SPELLCASTER) + bool const caster=info && info->type==GAMEOBJECT_TYPE_SPELLCASTER; + bool const goober=info && info->type==GAMEOBJECT_TYPE_GOOBER; + if(!caster && !goober) + {error="spawn must be a static clickable spellcaster or goober portal";return false;} + if(goober && (info->goober.open || info->goober.questID || info->goober.eventID || + info->goober.pageID || info->goober.gossipID || info->goober.linkedTrap || info->goober.consumable)) + {error="quest, event, locked or consumable goober needs a dedicated interaction";return false;} + uint32 rootSpell=caster?info->spellcaster.spell:info->goober.spell; + uint8 mask=(caster?info->spellcaster.playerCast:info->goober.playerCast)?3:2; + SpellInfo const* spell=sSpellMgr->GetSpellInfo(rootSpell); + SpellTargetPosition resolved; + SpellTargetPosition const* destination=nullptr; + std::unordered_set seen; + uint32 delay=0; + for(unsigned depth=0;spell && depth<5;++depth) { - error = "spawn must be a static SPELLCASTER GameObject (type 22)"; - return false; - } - SpellInfo const* spell = sSpellMgr->GetSpellInfo(info->spellcaster.spell); - SpellTargetPosition const* destination = nullptr; - if (spell) - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + if(!seen.insert(spell->Id).second)break; + portal.Requirements.emplace_back(spell->Id,mask); + uint32 next=0; + for(uint8 i=0;iEffects[i]; - if (effect.Effect != SPELL_EFFECT_TELEPORT_UNITS) - continue; - // Only explicit database destinations are unambiguous. Homebind, - // script-selected destinations and triggered spell chains need - // their own interaction definitions, not guessed target nodes. - if (destination || (effect.TargetA.GetTarget() != TARGET_DEST_DB && - effect.TargetB.GetTarget() != TARGET_DEST_DB)) + auto const& effect=spell->Effects[i]; + if(effect.Effect==SPELL_EFFECT_TELEPORT_UNITS) { - error = "portal spell has an ambiguous or non-DB destination"; - return false; + if(destination || next || (effect.TargetA.GetTarget()!=TARGET_DEST_DB && effect.TargetB.GetTarget()!=TARGET_DEST_DB)) + {error="portal spell has an ambiguous or non-DB destination";return false;} + destination=sSpellMgr->GetSpellTargetPosition(spell->Id,SpellEffIndex(i)); + if(!destination){error="portal teleport effect has no native spell_target_position";return false;} } - destination = sSpellMgr->GetSpellTargetPosition(spell->Id, SpellEffIndex(i)); - if (!destination) + else if(effect.Effect==SPELL_EFFECT_SCRIPT_EFFECT) { - error = "portal teleport effect has no native spell_target_position"; - return false; + auto script=sSpellScripts.find(uint32(spell->Id | (uint32(i)<<24))); + if(script==sSpellScripts.end() || script->second.empty())continue; + if(destination || next || script->second.size()!=1) + {error="portal script must have exactly one deterministic action";return false;} + auto const& action=script->second.begin()->second; + if(script->second.begin()->first>3-delay) + {error="portal script delay exceeds native interaction timeout reserve";return false;} + delay+=script->second.begin()->first; + if(action.command==SCRIPT_COMMAND_CAST_SPELL && action.CastSpell.Flags==SF_CASTSPELL_TARGET_TO_TARGET && + (action.CastSpell.CreatureEntry==0 || action.CastSpell.CreatureEntry==1)) + next=action.CastSpell.SpellID; + else if(action.command==SCRIPT_COMMAND_TELEPORT_TO && !action.TeleportTo.Flags) + { + resolved.target_mapId=action.TeleportTo.MapID; + resolved.target_X=action.TeleportTo.DestX;resolved.target_Y=action.TeleportTo.DestY; + resolved.target_Z=action.TeleportTo.DestZ;resolved.target_Orientation=action.TeleportTo.Orientation; + destination=&resolved; + } + else {error="portal script is not a fixed visitor teleport";return false;} } } - if (!destination) - { - error = "portal requires a direct teleport spell with a fixed DB destination"; - return false; + if(destination)break; + spell=next?sSpellMgr->GetSpellInfo(next):nullptr;mask=3; } + if(!destination){error="portal requires an unambiguous native fixed teleport destination";return false;} portal.SpawnId = spawnId; portal.Entry = spawn->id; - portal.SpellId = spell->Id; + portal.SpellId = rootSpell; portal.Source.Key = "portal_go_" + std::to_string(spawnId) + "_source"; portal.Source.Type = "portal"; portal.Source.WorldPointKey = portal.Source.Key; @@ -107,12 +129,11 @@ bool ClientlessTravelGraphMgr::PortalPrerequisites(Player const* player,uint32 e { auto portal=GetPortalUse(edgeDatabaseId); auto info=portal?sObjectMgr->GetGameObjectTemplate(portal->Entry):nullptr; - if(!info || info->type!=GAMEOBJECT_TYPE_SPELLCASTER)return false; - // Native Spell::CheckCast sees caster,target. Public portals either let the - // player cast on themself or let the object cast on the visiting player. - uint8 playerTargets=info->spellcaster.playerCast?3:2; - return sConditionMgr->IsPlayerMeetingPrerequisiteConditions(CONDITION_SOURCE_TYPE_SPELL, - portal->SpellId,player,playerTargets); + if(!info || (info->type!=GAMEOBJECT_TYPE_SPELLCASTER && info->type!=GAMEOBJECT_TYPE_GOOBER))return false; + for(auto const& requirement:portal->Requirements) + if(!sConditionMgr->IsPlayerMeetingPrerequisiteConditions(CONDITION_SOURCE_TYPE_SPELL, + requirement.first,player,requirement.second))return false; + return !portal->Requirements.empty(); } bool ClientlessTravelGraphMgr::Reload() diff --git a/src/server/game/World/ClientlessTravelGraphMgr.h b/src/server/game/World/ClientlessTravelGraphMgr.h index 3814da6b5a..3a414fea6b 100644 --- a/src/server/game/World/ClientlessTravelGraphMgr.h +++ b/src/server/game/World/ClientlessTravelGraphMgr.h @@ -40,13 +40,14 @@ struct TC_GAME_API ClientlessTravelNode float O = 0.0f; }; -// A fixed-destination, clickable SPELLCASTER GameObject. The destination is +// A fixed-destination clickable SPELLCASTER or benign GOOBER. The destination is // derived from the native spell data; this is never a synthetic teleport. struct TC_GAME_API ClientlessPortalUse { uint32 SpawnId = 0; uint32 Entry = 0; uint32 SpellId = 0; + std::vector> Requirements; // native spell, visitor target mask ClientlessTravelNode Source; ClientlessTravelNode Target; }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 805e5723a8..1dc0651f1c 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -21,6 +21,8 @@ #include "World.h" #include "ClientlessPlayerMgr.h" +#include "ClientlessTestBotMgr.h" +#include "ClientlessCharacterFactory.h" #include "AdventurePopulationMgr.h" #include "ClientlessRouteRecorderMgr.h" #include "AccountMgr.h" @@ -3394,8 +3396,10 @@ void World::UpdateSessions(uint32 diff) // High-level clientless controllers observe state before the low-level // lifecycle loop may destroy a Removing session. + ClientlessCharacterFactory::Update(); sAdventurePopulationMgr->Update(diff); sClientlessPlayerMgr->Update(diff); + sClientlessTestBotMgr->Update(diff); sClientlessRouteRecorderMgr->Update(diff); // Clientless sessions share normal WorldSession callbacks/update machinery, diff --git a/src/server/scripts/Custom/clientless/testbots/hillsbrad_assessment_retry.lua b/src/server/scripts/Custom/clientless/testbots/hillsbrad_assessment_retry.lua new file mode 100644 index 0000000000..705128e9bf --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/hillsbrad_assessment_retry.lua @@ -0,0 +1,96 @@ +-- Concatenate with a stage fixture; local test character ownership stays per run. +local b=testbot.login(150) +local function mark(label,value)testbot.record(label,value)end +local function state(q)local s,r=testbot.quest(b,q);return{quest=q,status=s,rewarded=r,counters=testbot.objectives(b,q)}end +local function tp(x,y,z) + testbot.stop(b) + assert(testbot.teleport(b,0,x,y,z,0),"test staging teleport") + testbot.await(function()return testbot.online(b)end,15000,"native teleport ACK") +end +local function npc(entry) + local t + testbot.await(function()t=testbot.nearest_creature(b,entry,40);return t~=nil end,10000,"NPC loaded: "..entry) + return t +end +local function accept(t,q) + local s,r=testbot.quest(b,q) + mark("before_accept_"..q,state(q)) + if s==0 and not r then + testbot.accept(b,t,q) + testbot.await(function()return testbot.quest(b,q)~=0 end,10000,"native accept: "..q) + end + mark("accepted_or_resumed_"..q,state(q)) +end +local function reward(t,q,choice) + local _,r=testbot.quest(b,q) + if not r then + testbot.request_reward(b,t,q) + testbot.reward(b,t,q,choice or 0) + testbot.await(function()return select(2,testbot.quest(b,q)) end,10000,"native reward: "..q) + end + testbot.check(select(2,testbot.quest(b,q)),"rewarded quest: "..q) + mark("rewarded_"..q,state(q)) +end +local function prepare() + local level=testbot.state(b).level + assert(testbot.skill(b,55,math.min(600,level*5),math.min(600,level*5))) + assert(testbot.skill(b,95,math.min(600,level*5),math.min(600,level*5))) + testbot.stats(b,8000,1000) +end +local function locate(fixture) + tp(fixture[2],fixture[3],fixture[4]);testbot.wait(200) + return testbot.creature(b,fixture[1]) +end +local function approach(t) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + if s.distance>3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()old or testbot.now_ms()>deadline + assert(testbot.objectives(b,28138)[1]>old,'native shackles capture credit') + mark('captured_human',state(28138)) + end +end +assert(testbot.quest(b,28138)==1,'eight humans captured') +tp(-902.906,231.024,9.70241) +reward(npc(47554),28138) diff --git a/src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal.lua b/src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal.lua new file mode 100644 index 0000000000..a4b5c06236 --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal.lua @@ -0,0 +1,113 @@ +-- Concatenate with a stage fixture; local test character ownership stays per run. +local b=testbot.login(150) +local function mark(label,value)testbot.record(label,value)end +local function state(q)local s,r=testbot.quest(b,q);return{quest=q,status=s,rewarded=r,counters=testbot.objectives(b,q)}end +local function tp(x,y,z) + testbot.stop(b) + assert(testbot.teleport(b,0,x,y,z,0),"test staging teleport") + testbot.await(function()return testbot.online(b)end,15000,"native teleport ACK") +end +local function npc(entry) + local t + testbot.await(function()t=testbot.nearest_creature(b,entry,40);return t~=nil end,10000,"NPC loaded: "..entry) + return t +end +local function accept(t,q) + local s,r=testbot.quest(b,q) + mark("before_accept_"..q,state(q)) + if s==0 and not r then + testbot.accept(b,t,q) + testbot.await(function()return testbot.quest(b,q)~=0 end,10000,"native accept: "..q) + end + mark("accepted_or_resumed_"..q,state(q)) +end +local function reward(t,q,choice) + local _,r=testbot.quest(b,q) + if not r then + testbot.request_reward(b,t,q) + testbot.reward(b,t,q,choice or 0) + testbot.await(function()return select(2,testbot.quest(b,q)) end,10000,"native reward: "..q) + end + testbot.check(select(2,testbot.quest(b,q)),"rewarded quest: "..q) + mark("rewarded_"..q,state(q)) +end +local function prepare() + local level=testbot.state(b).level + assert(testbot.skill(b,55,math.min(600,level*5),math.min(600,level*5))) + assert(testbot.skill(b,95,math.min(600,level*5),math.min(600,level*5))) + testbot.stats(b,8000,1000) +end +local function locate(fixture) + tp(fixture[2],fixture[3],fixture[4]);testbot.wait(200) + return testbot.creature(b,fixture[1]) +end +local function approach(t) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + if s.distance>3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()0 do + local s=testbot.state(b) + table.sort(targets,function(a,c)return (a[2]-s.x)^2+(a[3]-s.y)^2<(c[2]-s.x)^2+(c[3]-s.y)^2 end) + local p=table.remove(targets,1) + walk(p[2],p[3],p[4]) + local t=testbot.creature(b,p[1]) + local ts=t and testbot.target_state(b,t) + if ts and ts.alive then + testbot.wait(2000) + local comp=testbot.nearest_creature(b,47662,100) + mark('feeding_before',{player=testbot.state(b),companion=comp and testbot.target_state(b,comp),target=ts}) + local old=testbot.objectives(b,28146)[1] + assert(fight(t,nil,60000),'native murloc kill') + local deadline=testbot.now_ms()+20000 + repeat + testbot.wait(2000) + mark('feeding_tick',{player=testbot.state(b),companion=comp and testbot.target_state(b,comp),corpse=testbot.target_state(b,t),quest=state(28146)}) + until testbot.objectives(b,28146)[1]>old or testbot.now_ms()>deadline + assert(testbot.objectives(b,28146)[1]>old,'hungry creeper eats actual owner kill') + mark('murloc_eaten',state(28146)) + end +end +assert(testbot.quest(b,28146)==1,'twelve murlocs eaten') +walk(-905.543,232.002,9.48916) +reward(npc(47551),28146) diff --git a/src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal_fresh.lua b/src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal_fresh.lua new file mode 100644 index 0000000000..7eff0647d2 --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/hillsbrad_coastal_fresh.lua @@ -0,0 +1,122 @@ +-- Concatenate with a stage fixture; local test character ownership stays per run. +local b=testbot.login(150) +local function mark(label,value)testbot.record(label,value)end +local function state(q)local s,r=testbot.quest(b,q);return{quest=q,status=s,rewarded=r,counters=testbot.objectives(b,q)}end +local function tp(x,y,z) + testbot.stop(b) + assert(testbot.teleport(b,0,x,y,z,0),"test staging teleport") + testbot.await(function()return testbot.online(b)end,15000,"native teleport ACK") +end +local function npc(entry) + local t + testbot.await(function()t=testbot.nearest_creature(b,entry,40);return t~=nil end,10000,"NPC loaded: "..entry) + return t +end +local function accept(t,q) + local s,r=testbot.quest(b,q) + mark("before_accept_"..q,state(q)) + if s==0 and not r then + testbot.accept(b,t,q) + testbot.await(function()return testbot.quest(b,q)~=0 end,10000,"native accept: "..q) + end + mark("accepted_or_resumed_"..q,state(q)) +end +local function reward(t,q,choice) + local _,r=testbot.quest(b,q) + if not r then + testbot.request_reward(b,t,q) + testbot.reward(b,t,q,choice or 0) + testbot.await(function()return select(2,testbot.quest(b,q)) end,10000,"native reward: "..q) + end + testbot.check(select(2,testbot.quest(b,q)),"rewarded quest: "..q) + mark("rewarded_"..q,state(q)) +end +local function prepare() + local level=testbot.state(b).level + assert(testbot.skill(b,55,math.min(600,level*5),math.min(600,level*5))) + assert(testbot.skill(b,95,math.min(600,level*5),math.min(600,level*5))) + testbot.stats(b,8000,1000) +end +local function locate(fixture) + tp(fixture[2],fixture[3],fixture[4]);testbot.wait(200) + return testbot.creature(b,fixture[1]) +end +local function approach(t) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + if s.distance>3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()0 do + local s=testbot.state(b) + table.sort(targets,function(a,c)return (a[2]-s.x)^2+(a[3]-s.y)^2<(c[2]-s.x)^2+(c[3]-s.y)^2 end) + local p=table.remove(targets,1) + walk(p[2],p[3],p[4]) + local t=testbot.creature(b,p[1]) + local ts=t and testbot.target_state(b,t) + if ts and ts.alive then + testbot.wait(2000) + local comp=testbot.nearest_creature(b,47662,100) + mark('feeding_before',{player=testbot.state(b),companion=comp and testbot.target_state(b,comp),target=ts}) + local old=testbot.objectives(b,28146)[1] + assert(fight(t,nil,60000),'native murloc kill') + local deadline=testbot.now_ms()+20000 + repeat + testbot.wait(2000) + mark('feeding_tick',{player=testbot.state(b),companion=comp and testbot.target_state(b,comp),corpse=testbot.target_state(b,t),quest=state(28146)}) + until testbot.objectives(b,28146)[1]>old or testbot.now_ms()>deadline + assert(testbot.objectives(b,28146)[1]>old,'hungry creeper eats actual owner kill') + mark('murloc_eaten',state(28146)) + end +end +assert(testbot.quest(b,28146)==1,'twelve murlocs eaten') +walk(-905.543,232.002,9.48916) +reward(npc(47551),28146) diff --git a/src/server/scripts/Custom/clientless/testbots/hillsbrad_harvest.lua b/src/server/scripts/Custom/clientless/testbots/hillsbrad_harvest.lua new file mode 100644 index 0000000000..ffaefcdaf8 --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/hillsbrad_harvest.lua @@ -0,0 +1,115 @@ +-- Concatenate with a stage fixture; local test character ownership stays per run. +local b=testbot.login(150) +local function mark(label,value)testbot.record(label,value)end +local function state(q)local s,r=testbot.quest(b,q);return{quest=q,status=s,rewarded=r,counters=testbot.objectives(b,q)}end +local function tp(x,y,z) + testbot.stop(b) + assert(testbot.teleport(b,0,x,y,z,0),"test staging teleport") + testbot.await(function()return testbot.online(b)end,15000,"native teleport ACK") +end +local function npc(entry) + local t + testbot.await(function()t=testbot.nearest_creature(b,entry,40);return t~=nil end,10000,"NPC loaded: "..entry) + return t +end +local function accept(t,q) + local s,r=testbot.quest(b,q) + mark("before_accept_"..q,state(q)) + if s==0 and not r then + testbot.accept(b,t,q) + testbot.await(function()return testbot.quest(b,q)~=0 end,10000,"native accept: "..q) + end + mark("accepted_or_resumed_"..q,state(q)) +end +local function reward(t,q,choice) + local _,r=testbot.quest(b,q) + if not r then + testbot.request_reward(b,t,q) + testbot.reward(b,t,q,choice or 0) + testbot.await(function()return select(2,testbot.quest(b,q)) end,10000,"native reward: "..q) + end + testbot.check(select(2,testbot.quest(b,q)),"rewarded quest: "..q) + mark("rewarded_"..q,state(q)) +end +local function prepare() +testbot.stat(b,0,200) -- Task preparation: adequate combat output, no fabricated damage. + local level=testbot.state(b).level + assert(testbot.skill(b,55,math.min(600,level*5),math.min(600,level*5))) + assert(testbot.skill(b,95,math.min(600,level*5),math.min(600,level*5))) + testbot.stats(b,8000,1000) +end +local function locate(fixture) + tp(fixture[2],fixture[3],fixture[4]);testbot.wait(200) + return testbot.creature(b,fixture[1]) +end +local function approach(t) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + if s.distance>3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()=60 then break end + tp(point[2],point[3],point[4]);testbot.wait(250) + for attempt=1,12 do + if testbot.item_count(b,63029)>=60 then break end + local egg=testbot.nearest_creature(b,47203,25) + if not egg then break end + local s=testbot.target_state(b,egg) + if s.distance>4 then + assert(testbot.move(b,s.x,s.y,s.z),'egg approach') + testbot.await(function()return testbot.target_state(b,egg).distance<4 end,10000,'egg range') + end + local count=testbot.item_count(b,63029) + testbot.spellclick(b,egg) + testbot.await(function()return testbot.item_count(b,63029)>count end,5000,'native egg click item') + testbot.wait(200) + end + mark('harvest_progress',{eggs=testbot.item_count(b,63029)}) +end +assert(testbot.item_count(b,63029)>=60,'not enough naturally spawned accessible eggs') +testbot.check(testbot.quest(b,28114)==1,'Glorious Harvest completed through native egg clicks') +for _,point in ipairs(bears)do + if testbot.quest(b,28115)==1 then break end + local t=locate(point) + if t and fight(t)then mark('bear_kill',state(28115))end +end +assert(testbot.quest(b,28115)==1,'not enough legitimate bear kills') +testbot.check(true,'Past Their Prime native kill objectives') +tp(-905.543,232.002,9.48916) +local sarus=npc(47551) +reward(sarus,28114);reward(sarus,28115) +accept(sarus,28146) +mark('coastal_ready',state(28146)) diff --git a/src/server/scripts/Custom/clientless/testbots/hillsbrad_helpers.lua b/src/server/scripts/Custom/clientless/testbots/hillsbrad_helpers.lua new file mode 100644 index 0000000000..220e870a2e --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/hillsbrad_helpers.lua @@ -0,0 +1,75 @@ +-- Concatenate with a stage fixture; local test character ownership stays per run. +local b=testbot.login(150) +local function mark(label,value)testbot.record(label,value)end +local function state(q)local s,r=testbot.quest(b,q);return{quest=q,status=s,rewarded=r,counters=testbot.objectives(b,q)}end +local function tp(x,y,z) + testbot.stop(b) + assert(testbot.teleport(b,0,x,y,z,0),"test staging teleport") + testbot.await(function()return testbot.online(b)end,15000,"native teleport ACK") +end +local function npc(entry) + local t + testbot.await(function()t=testbot.nearest_creature(b,entry,40);return t~=nil end,10000,"NPC loaded: "..entry) + return t +end +local function accept(t,q) + local s,r=testbot.quest(b,q) + mark("before_accept_"..q,state(q)) + if s==0 and not r then + testbot.accept(b,t,q) + testbot.await(function()return testbot.quest(b,q)~=0 end,10000,"native accept: "..q) + end + mark("accepted_or_resumed_"..q,state(q)) +end +local function reward(t,q,choice) + local _,r=testbot.quest(b,q) + if not r then + testbot.request_reward(b,t,q) + testbot.reward(b,t,q,choice or 0) + testbot.await(function()return select(2,testbot.quest(b,q)) end,10000,"native reward: "..q) + end + testbot.check(select(2,testbot.quest(b,q)),"rewarded quest: "..q) + mark("rewarded_"..q,state(q)) +end +local function prepare() + local level=testbot.state(b).level + assert(testbot.skill(b,55,math.min(600,level*5),math.min(600,level*5))) + assert(testbot.skill(b,95,math.min(600,level*5),math.min(600,level*5))) + testbot.stats(b,8000,1000) +end +local function locate(fixture) + tp(fixture[2],fixture[3],fixture[4]);testbot.wait(200) + return testbot.creature(b,fixture[1]) +end +local function approach(t) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + if s.distance>3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()deadline +assert(testbot.quest(b,28156)==1,'Dumass reached Captain Keyton and native escort event fired') +reward(npc(47554),28156) +-- Stage own actor on shore for next login; do not claim follower movement here. +tp(-1173.03,112.057,0.895) diff --git a/src/server/scripts/Custom/clientless/testbots/hillsbrad_science.lua b/src/server/scripts/Custom/clientless/testbots/hillsbrad_science.lua new file mode 100644 index 0000000000..4e32eebf5c --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/hillsbrad_science.lua @@ -0,0 +1,96 @@ +-- Concatenate with a stage fixture; local test character ownership stays per run. +local b=testbot.login(150) +local function mark(label,value)testbot.record(label,value)end +local function state(q)local s,r=testbot.quest(b,q);return{quest=q,status=s,rewarded=r,counters=testbot.objectives(b,q)}end +local function tp(x,y,z) + testbot.stop(b) + assert(testbot.teleport(b,0,x,y,z,0),"test staging teleport") + testbot.await(function()return testbot.online(b)end,15000,"native teleport ACK") +end +local function npc(entry) + local t + testbot.await(function()t=testbot.nearest_creature(b,entry,40);return t~=nil end,10000,"NPC loaded: "..entry) + return t +end +local function accept(t,q) + local s,r=testbot.quest(b,q) + mark("before_accept_"..q,state(q)) + if s==0 and not r then + testbot.accept(b,t,q) + testbot.await(function()return testbot.quest(b,q)~=0 end,10000,"native accept: "..q) + end + mark("accepted_or_resumed_"..q,state(q)) +end +local function reward(t,q,choice) + local _,r=testbot.quest(b,q) + if not r then + testbot.request_reward(b,t,q) + testbot.reward(b,t,q,choice or 0) + testbot.await(function()return select(2,testbot.quest(b,q)) end,10000,"native reward: "..q) + end + testbot.check(select(2,testbot.quest(b,q)),"rewarded quest: "..q) + mark("rewarded_"..q,state(q)) +end +local function prepare() + local level=testbot.state(b).level + assert(testbot.skill(b,55,math.min(600,level*5),math.min(600,level*5))) + assert(testbot.skill(b,95,math.min(600,level*5),math.min(600,level*5))) + testbot.stats(b,8000,1000) +end +local function locate(fixture) + tp(fixture[2],fixture[3],fixture[4]);testbot.wait(200) + return testbot.creature(b,fixture[1]) +end +local function approach(t) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + if s.distance>3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()3 then + if not testbot.move(b,s.x,s.y,s.z)then + -- Test setup may reposition; damage and credits remain native. + tp(s.x-1,s.y,s.z) + end + end + return true +end +local function fight(t,health_percent,timeout) + local s=testbot.target_state(b,t) + if not s or not s.alive then return false end + local deadline=testbot.now_ms()+(timeout or 90000) + testbot.stats(b,8000,1000) + while s and s.alive and testbot.now_ms()=6 then break end + tp(point[2]-1.5,point[3],point[4]+0.1);testbot.wait(250) + local chest=testbot.object(b,point[1]) + if chest then + local count=testbot.item_count(b,63082) + mark("opening_before",testbot.state(b)) + local deadline=testbot.now_ms()+20000 + repeat + testbot.request_cast(b,22810,chest) + testbot.wait(1800) + until testbot.state(b).loot_guid==chest or testbot.now_ms()>deadline + assert(testbot.state(b).loot_guid==chest,'native Opening retries exhausted') + testbot.loot_item(b,0) + testbot.await(function()return testbot.item_count(b,63082)>count end,5000,'native quest chest loot') + testbot.loot_release(b,chest) + mark('supplies_looted',{count=testbot.item_count(b,63082),spawn=point[1]}) + end +end +assert(testbot.item_count(b,63082)>=6,'six native supplies not collected') +testbot.check(testbot.quest(b,28144)==1,'Thieving Little Monsters native loot completion') +tp(-902.906,231.024,9.70241) +local keyton=npc(47554) +testbot.accept(b,keyton,28168) +testbot.check(testbot.quest(b,28168)==0,'Sludge Fields remains locked before supplies reward') +reward(keyton,28144) +accept(keyton,28168) +mark('sludge_fields_ready',state(28168)) diff --git a/src/server/scripts/Custom/clientless/testbots/quest_accept.lua b/src/server/scripts/Custom/clientless/testbots/quest_accept.lua new file mode 100644 index 0000000000..6993ebe040 --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/quest_accept.lua @@ -0,0 +1,20 @@ +-- Use a normal dedicated test account with a free character slot. +-- Replace the account/name for your environment; this character is retained. +local bot = testbot.create(17, "Testrion", 1, 1, 1, 0) +testbot.level(bot, 1) +testbot.stats(bot, 5000) +assert(testbot.teleport(bot, 0, -8912, -138, 80.9, 0)) +testbot.await(function() return testbot.online(bot) end, 10000, "teleport ACK") +testbot.record("initial", testbot.state(bot)) +local npc +testbot.await(function() + npc = testbot.creature(bot, 279961) -- Marshal McBride, this test DB + return npc ~= nil +end, 10000, "quest giver loaded") +testbot.hello(bot, npc) +testbot.accept(bot, npc, 28766) +testbot.await(function() return testbot.quest(bot, 28766) ~= 0 end, 10000, "quest accepted") +testbot.check(testbot.quest(bot, 28766) == 3, "native quest acceptance: INCOMPLETE") +testbot.record("quest_objectives", testbot.objectives(bot, 28766)) +testbot.record("final", testbot.state(bot)) +-- No forced quest completion: failures in native quest eligibility remain visible. diff --git a/src/server/scripts/Custom/clientless/testbots/quest_combat.lua b/src/server/scripts/Custom/clientless/testbots/quest_combat.lua new file mode 100644 index 0000000000..445841856e --- /dev/null +++ b/src/server/scripts/Custom/clientless/testbots/quest_combat.lua @@ -0,0 +1,59 @@ +-- Full native kill quest; account/name/spawn IDs are fixtures for this test DB. +-- Only preparation/positioning cheats; no fabricated damage or quest credits. +local b=testbot.create(17,"Testaria",1,1,10,0) +testbot.level(b,10) +testbot.clear_slot(b,15) +assert(testbot.equip(b,15,25)) +testbot.stat(b,0,1000000) +testbot.stats(b,100000,1000) +testbot.check(testbot.state(b).strength>=1000000,'native primary stat preparation') +assert(testbot.teleport(b,0,-8912,-138,80.9,0)) +testbot.await(function()return testbot.online(b)end,10000,'initial questgiver transfer') +local giver +testbot.await(function()giver=testbot.creature(b,279961);return giver~=nil end,10000,'initial questgiver loaded') +testbot.hello(b,giver) +testbot.accept(b,giver,28766) +testbot.await(function()return testbot.quest(b,28766)==3 end,10000,'quest acceptance') + +local spawns={{279754,-8814.37,-52.3635,91.1168},{279761,-8794.56,-93.5913,84.8801},{279778,-8790.93,-152.043,83.1341},{279812,-8826.65,-275.236,80.4858},{279817,-8844.67,-280.647,79.4149},{279819,-8877.97,-244.877,81.8053},{279820,-8904.37,-245.639,80.5467},{279823,-8950.42,-254.283,76.0718},{279825,-8880.98,-282.746,79.7713},{279827,-8924.86,-291.502,76.1097},{279828,-8839.92,-306.15,76.7902},{279829,-8938.4,-273.349,76.2739},{279878,-8990,-250.665,72.3779},{279887,-8960.21,-228.728,77.3577},{279889,-8809.52,-149.929,83.094},{279891,-8804.81,-163.333,81.8757}} +local kills=0 +for _,spawn in ipairs(spawns) do + if testbot.quest(b,28766)==1 then break end + assert(testbot.teleport(b,0,spawn[2],spawn[3],spawn[4],0)) + testbot.await(function()return testbot.online(b)end,10000,'spawn transfer') + local target + testbot.wait(200) + target=testbot.creature(b,spawn[1]) + local s=target and testbot.target_state(b,target) + if s and s.alive then + assert(testbot.teleport(b,0,s.x-1,s.y,s.z,0)) + testbot.await(function()return testbot.online(b)end,10000,'melee position') + testbot.face(b,target) + assert(testbot.attack(b,target),'native attack accepted') + local deadline=testbot.now_ms()+10000 + local v=testbot.target_state(b,target) + while v and v.alive and testbot.now_ms()2 then testbot.move(b,v.x,v.y,v.z) end + testbot.face(b,target) + testbot.attack(b,target) + testbot.wait(200) + v=testbot.target_state(b,target) + end + if v and v.alive then testbot.record('target_timeout',v) end + testbot.stop(b) + kills=kills+1 + testbot.record('encounter_'..kills,{spawn=spawn[1],count=testbot.objectives(b,28766)[1]}) + end +end +testbot.check(testbot.quest(b,28766)==1,'quest completed through native kill credits') +assert(testbot.quest(b,28766)==1,'insufficient valid kills') +assert(testbot.teleport(b,0,-8912,-138,80.9,0)) +testbot.await(function()return testbot.online(b)end,10000,'quest giver return') +local npc +testbot.await(function()npc=testbot.creature(b,279961);return npc~=nil end,10000,'quest giver loaded') +testbot.request_reward(b,npc,28766) +testbot.reward(b,npc,28766,0) +testbot.await(function()local _,rewarded=testbot.quest(b,28766);return rewarded end,10000,'native quest reward') +local _,rewarded=testbot.quest(b,28766) +testbot.check(rewarded,'quest rewarded by native handler') +testbot.record('final',testbot.state(b)) diff --git a/src/server/scripts/Custom/viano_bot_commands.cpp b/src/server/scripts/Custom/viano_bot_commands.cpp index 4d9e5df3ae..0467951ffb 100644 --- a/src/server/scripts/Custom/viano_bot_commands.cpp +++ b/src/server/scripts/Custom/viano_bot_commands.cpp @@ -27,6 +27,7 @@ #include "ClientlessTravelGraphMgr.h" #include "ClientlessRouteRecorderMgr.h" #include "ClientlessLuaEngine.h" +#include "ClientlessTestBotMgr.h" #include "DatabaseEnv.h" #include "AsyncCallbackProcessor.h" #include @@ -1646,7 +1647,7 @@ static bool HandleClientlessPortalObjectUse(ChatHandler* handler, char const* ar for(auto itr=range.first;itr!=range.second;++itr) { auto object=itr->second; - if(!object || object->GetGoType()!=GAMEOBJECT_TYPE_SPELLCASTER || !object->isSpawned() || + if(!object || (object->GetGoType()!=GAMEOBJECT_TYPE_SPELLCASTER && object->GetGoType()!=GAMEOBJECT_TYPE_GOOBER) || !object->isSpawned() || !player->IsInPhase(object) || !player->CanSeeOrDetect(object) || object->HasFlag(GAMEOBJECT_FLAGS,GO_FLAG_NOT_SELECTABLE|GO_FLAG_LOCKED) || player->GetGameObjectIfCanInteractWith(object->GetGUID())!=object)continue; @@ -2540,6 +2541,9 @@ static bool HandleClientlessTravelReload(ChatHandler* handler, char const* /*arg return sClientlessTransportMgr->Command(handler, args); } + static bool HandleTestBot(ChatHandler* h,char const* a) + {return sClientlessTestBotMgr->Command(h,a);} + class VianoBotCommandScript : public CommandScript { public: @@ -2565,6 +2569,7 @@ static bool HandleClientlessTravelReload(ChatHandler* handler, char const* /*arg static std::vector clientlessCommands = { + { "test", rbac::RBAC_PERM_COMMAND_GM, true, &HandleTestBot, "" }, { "combat", rbac::RBAC_PERM_COMMAND_GM, true, &ClientlessCombatPreparation::Command, "" }, { "interaction", rbac::RBAC_PERM_COMMAND_GM, true, &InteractionStatus, "" }, { "generate", rbac::RBAC_PERM_COMMAND_GM, true, &GenerateBot, "" }, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index c25118fd7c..7ba6bc0e07 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -77,6 +77,15 @@ RealmID = 1 Clientless.ScriptRoot = "scripts/clientless" +# Optional isolated TestBot controller. Trusted Lua jobs enter through GM/SOAP +# command "clientless test submit" or atomic requests/.lua files. +# Root contains requests, scripts, results, archive and the character registry. +# Existing AdventureBot population and profiles are not used by test characters. +Clientless.TestBot.Enabled = 0 +Clientless.TestBot.Root = "testbots" +Clientless.TestBot.TimeoutSeconds = 300 + + # DataDir # Description: Data directory setting. # Important: DataDir needs to be quoted, as the string might contain space characters. @@ -4356,3 +4365,14 @@ Clientless.Adventure.Loader.MaxLevel = 85 Clientless.Adventure.Loader.RotationPercent = 15 Clientless.Adventure.Loader.RotationMinAgeHours = 24 Clientless.Adventure.Manager.IntervalSeconds = 300 + +# Clientless native browser policy. Queueing and entering are independent. +# JoinEnabled=0 keeps bots searchable but excludes them from actual matches. +Clientless.Browser.Dungeon.QueueEnabled = 1 +Clientless.Browser.Dungeon.JoinEnabled = 1 +Clientless.Browser.Raid.QueueEnabled = 1 +Clientless.Browser.Raid.JoinEnabled = 0 +Clientless.Browser.Battleground.QueueEnabled = 1 +Clientless.Browser.Battleground.JoinEnabled = 0 +# Explicit isolated test override. Does not override disabled Queue/Join switches. +Clientless.Browser.AllowBotOnlyTests = 0 diff --git a/tests/clientless/test_adventure_area_node.py b/tests/clientless/test_adventure_area_node.py index 8c75cec484..2511f5bbcb 100644 --- a/tests/clientless/test_adventure_area_node.py +++ b/tests/clientless/test_adventure_area_node.py @@ -3,7 +3,9 @@ from pathlib import Path import subprocess,tempfile root=Path(__file__).resolve().parents[2] s=(root/'src/server/game/World/AdventureBehaviorMgr.cpp').read_text() -a=s.index('std::string AdventureBehaviorMgr::AreaNode(');b=s.index('\nvoid AdventureBehaviorMgr::Begin',a) +a=s.index('std::string AdventureBehaviorMgr::AreaNode(');start=s.index('{',a);b=start+1;depth=1 +while depth: + depth+=(s[b]=='{')-(s[b]=='}');b+=1 code=r''' #include #include diff --git a/tests/clientless/test_adventure_day_persistence.py b/tests/clientless/test_adventure_day_persistence.py index 96860ee281..ae1256e0f6 100644 --- a/tests/clientless/test_adventure_day_persistence.py +++ b/tests/clientless/test_adventure_day_persistence.py @@ -16,7 +16,7 @@ code=r''' using uint32=unsigned;using namespace AdventureBehaviorPolicy; #define TC_LOG_INFO(...) ((void)0) struct Guid{unsigned GetCounter(){return 99;}}; -struct Player{Guid GetGUID(){return {};}}; +struct Player{unsigned getLevel(){return 60;}Guid GetGUID(){return {};}}; struct Field{unsigned n=0;std::string s;unsigned GetUInt8(){return n;}unsigned GetUInt32(){return 0;}std::string GetString(){return s;}}; struct Rows{std::vector> data;unsigned index=0;Field*Fetch(){return data[index].data();}bool NextRow(){return ++indexconst&,std::string const&,float); - bool Known(std::string const& s){return s=="social" || s=="adventure" || s=="profession" || s=="rest" || s=="leisure" || s=="economy" || s=="instance" || s=="raid" || s=="groupformation";} + bool Known(std::string const& s){return s=="social" || s=="adventure" || s=="profession" || s=="rest" || s=="leisure" || s=="economy" || s=="instance" || s=="raid" || s=="groupformation" || s=="pvp";} std::string PickLocation(Player*,Record&,std::string const& intent){++picks;return intent+"_"+std::to_string(picks);} void Generate(Player*,Record&,uint32); }; @@ -50,6 +50,10 @@ int main(){ for(unsigned h=0;h<24;++h)assert(r.Plan[h].Location=="saved_"+std::to_string(h)); // New login uses the same stored slots instead of rerolling the day. AdventureBehaviorMgr::Record relog;mgr.Generate(&p,relog,20261029);assert(relog.Plan[23].Location==r.Plan[23].Location && mgr.picks==0); + // PvP is a persistent intent too; relog must not silently replace its slot. + rows->data[7][1].s="pvp";mgr.Generate(&p,relog,20261029); + assert(relog.Plan[7].Intent=="pvp"&&relog.Plan[7].Location=="saved_7"&&mgr.picks==0); + rows->data[7][1].s="social"; // A catalog change repairs all illegal destinations and persists them, // preserving each hour's intent instead of rerolling the entire day. locations.valid=false;mgr.Generate(&p,relog,20261029); diff --git a/tests/clientless/test_adventure_destination_level.py b/tests/clientless/test_adventure_destination_level.py index 72e2c39f61..91887e6d59 100644 --- a/tests/clientless/test_adventure_destination_level.py +++ b/tests/clientless/test_adventure_destination_level.py @@ -5,6 +5,7 @@ root=Path(__file__).resolve().parents[2] s=(root/'src/server/game/World/AdventureLocationMgr.cpp').read_text() a=s.index('bool AdventureLocationMgr::LevelEligible(');b=s.index('\nbool AdventureLocationMgr::IsWorkstation',a) code=r''' +#include "AdventureGroupPolicy.h" #include #include #include @@ -12,7 +13,7 @@ using uint64=unsigned long long; struct Player{unsigned level=60;unsigned getLevel()const{return level;}}; struct AdventureLocation{unsigned InstanceMap=0,AreaId=0,ZoneId=0,InstanceDifficulty=0;}; struct Area{bool KnownLevel=true;unsigned MinLevel=1;}; -struct Areas{auto Area(unsigned id)->::Area{return {id!=0,id};}}areas;auto sAdventureAreaMgr=&areas; +struct Areas{auto Area(unsigned id)->::Area{return {id!=0,id==3483?58:id};}}areas;auto sAdventureAreaMgr=&areas; struct AdventureLocationMgr{ struct Band{unsigned Min,Max;};std::unordered_map_instanceBands{{533ull<<8,{80,80}},{36ull<<8,{15,21}},{(36ull<<8)|1,{85,85}},{33ull<<8,{16,26}},{(33ull<<8)|1,{85,85}},{34ull<<8,{20,30}}}; bool LevelEligible(Player const*,AdventureLocation const&,std::string const&,bool strictArea=false)const; @@ -35,11 +36,14 @@ int main(){ assert(mgr.LevelEligible(&p,zone,"adventure")); // own area policy retains its separate tolerance assert(!mgr.LevelEligible(&p,zone,"adventure",true)); p.level=60;assert(mgr.LevelEligible(&p,zone,"adventure",true)); + AdventureLocation worldPvp{0,3483,3483};p.level=57; + assert(!mgr.LevelEligible(&p,worldPvp,"pvp"));p.level=58; + assert(mgr.LevelEligible(&p,worldPvp,"pvp")); assert(!mgr.LevelEligible(nullptr,zone,"adventure",true)); } ''' with tempfile.TemporaryDirectory()as d: p=Path(d);(p/'test.cpp').write_text(code) - subprocess.run(['c++','-std=c++17',str(p/'test.cpp'),'-o',str(p/'test')],check=True) + subprocess.run(['c++','-std=c++17','-I'+str(root/'src/server/game/World'),str(p/'test.cpp'),'-o',str(p/'test')],check=True) subprocess.run([str(p/'test')],check=True) print('Native dungeon/raid minimum levels, unknown destinations and strict adventure invitation levels passed') diff --git a/tests/clientless/test_adventure_groups.py b/tests/clientless/test_adventure_groups.py index aca305ce4f..3adf4c2911 100644 --- a/tests/clientless/test_adventure_groups.py +++ b/tests/clientless/test_adventure_groups.py @@ -34,6 +34,7 @@ namespace WorldPackets{namespace Party{struct PartyInviteClient{PartyInviteClien struct Session{Player*owner;bool clientless=true;bool IsClientless(){return clientless;}void HandlePartyInviteOpcode(WorldPackets::Party::PartyInviteClient&);void HandleSetRaidDifficultyOpcode(WorldPacket&);void HandleSetDungeonDifficultyOpcode(WorldPacket&p){HandleSetRaidDifficultyOpcode(p);}}; struct Player{ObjectGuid guid;Group*group=nullptr,*invite=nullptr;Session session{this};bool combat=false;unsigned zone=1519,level=60,team=0;float distance=10; unsigned difficulty=0;unsigned GetRaidDifficulty(){return difficulty;}unsigned GetDifficulty(bool){return difficulty;}ObjectGuid GetGUID(){return guid;}bool IsInWorld(){return true;}bool IsAlive(){return true;}bool IsInCombat(){return combat;} + bool isUsingLfg(){return false;}bool InBattlegroundQueue(){return false;} bool IsBeingTeleported(){return false;}bool GetTransport(){return false;}bool IsFlying(){return false;}bool IsInFlight(){return false;}bool IsCharmed(){return false;}Map*GetMap(){return ↦} unsigned GetZoneId(){return zone;}unsigned getLevel(){return level;}unsigned GetTeam(){return team;} Group*GetGroup(){return group;}Group*GetGroupInvite(){return invite;}Session*GetSession(){return &session;}std::string GetName(){return std::to_string(guid.id);} @@ -42,6 +43,7 @@ struct Player{ObjectGuid guid;Group*group=nullptr,*invite=nullptr;Session sessio std::vector people;bool afk=false;std::string whisper;bool isAFK(){return afk;}void GetPlayerListInGrid(std::vector& out,int){out=people;}void Whisper(std::string const& s,int,Player*){whisper=s;} void SetFacingToObject(Player*){}void HandleEmoteCommand(int){} }; +namespace ClientlessBrowserPolicy{bool Human(Player*p){return p&&!p->GetSession()->IsClientless();}} namespace ObjectAccessor{std::unordered_map players;Player*FindPlayer(ObjectGuid g){auto it=players.find(g);return it==players.end()?nullptr:it->second;}} void Session::HandleSetRaidDifficultyOpcode(WorldPacket&p){owner->difficulty=p.value;} void Group::RemoveMember(ObjectGuid g,int){--count;ObjectAccessor::FindPlayer(g)->group=nullptr;} @@ -54,15 +56,22 @@ namespace GameTime{time_t now=100;time_t GetGameTime(){return now;}} float frand(float,float){return 0;}unsigned urand(unsigned a,unsigned){return a;} '''+header+r''' struct Position{void Relocate(float,float,float){}}; -struct Location{std::string Name="Stormwind";struct{unsigned MapId=0;float X=0,Y=0,Z=0;}Point;}location; +struct Location{unsigned ZoneId=1519,AreaId=1519;std::string Name="Stormwind";struct{unsigned MapId=0;float X=0,Y=0,Z=0;}Point;}location; struct Locations{bool levelEligible=true;Location*Find(std::string const&){return &location;}bool LevelEligible(Player*,Location const&,std::string const&,bool){return levelEligible;}}locations;auto sAdventureLocationMgr=&locations; struct Areas{bool allowed=true;bool AllowsPosition(Player*,unsigned,Position const&){return allowed;}}areas;auto sAdventureAreaMgr=&areas; struct Behavior{std::unordered_map plans;AdventureGroupPlan GroupPlan(Player*p){return plans[p->guid.id];}unsigned arms=0;void ArmGroupDeparture(Player*,AdventureGroupPlan const&){++arms;}}behavior;auto sAdventureBehaviorMgr=&behavior; struct GroupTravel {unsigned follows=0;bool Follow(Player*){++follows;return true;}}groupTravel;auto sAdventureGroupTravelMgr=&groupTravel; int messages=0; void AdventureGroupMgr::Speak(Player*,std::string const&){++messages;} +bool BattlegroundCompatible(Player*,Player*){return true;} ''' -code+=fun('float Sociability(')+'\n'+fun('bool Ready(')+'\n'+fun('std::string Activity(')+'\n'+fun('unsigned Capacity(') +code+=r''' +void AdventureGroupMgr::UpdateBrowser(Player*){} +bool AdventureGroupMgr::Merge(Player*,AdventureGroupPlan const&){return false;} +bool AdventureGroupMgr::NeedsRole(Player*,Player*){return true;} +bool AdventureGroupMgr::Complete(Player*p){auto group=p->GetGroup();if(!group)return false;auto plan=sAdventureBehaviorMgr->GroupPlan(p);return group->GetMembersCount()==(plan.Capacity?plan.Capacity:AdventureGroupPolicy::Capacity(plan.Forming?plan.NextIntent:plan.Intent));} +''' +code+=fun('float Sociability(')+'\n'+fun('bool ProfessionCompatible(')+'\n'+fun('bool Ready(')+'\n'+fun('std::string Activity(')+'\n'+fun('unsigned Capacity(') for name in ['std::string AdventureGroupMgr::RecruitmentText(', 'bool AdventureGroupMgr::RecruitPlayer(', 'bool AdventureGroupMgr::BotLed(', 'bool AdventureGroupMgr::FollowMember(', 'bool AdventureGroupMgr::Forming(', 'bool AdventureGroupMgr::PlannedTransition(', 'bool AdventureGroupMgr::CanInvite(', 'bool AdventureGroupMgr::Accept(', 'void AdventureGroupMgr::CheckFullGroup(', 'void AdventureGroupMgr::Update(', 'void AdventureGroupMgr::Invite(', 'void AdventureGroupMgr::RequestPlayerAdmission(', 'bool AdventureGroupMgr::PlayerLeadership(', 'bool AdventureGroupMgr::EnforceCapacity(']:code+='\n'+fun(name) code+=r''' int main(){ diff --git a/tests/clientless/test_adventure_instance_begin.py b/tests/clientless/test_adventure_instance_begin.py index d322d18bf6..cacf115b4d 100644 --- a/tests/clientless/test_adventure_instance_begin.py +++ b/tests/clientless/test_adventure_instance_begin.py @@ -5,6 +5,7 @@ root=Path(__file__).resolve().parents[2] s=(root/'src/server/game/World/AdventureBehaviorMgr.cpp').read_text() a=s.index('void AdventureBehaviorMgr::Begin(');b=s.index('\nvoid AdventureBehaviorMgr::Fallback(',a) code=r''' +#include "AdventureGroupPolicy.h" #include #include #include @@ -12,23 +13,27 @@ code=r''' #define TC_LOG_INFO(...) ((void)0) struct Player{struct Guid{int GetCounter(){return 26;}};Guid GetGUID(){return {};}}; struct ClientlessIntent{std::string Name;std::unordered_map Parameters;}; -struct Location{bool IsArea=false;std::string BaseKey;}location; +struct Location{unsigned ZoneId=1519,AreaId=1519;bool IsArea=false;std::string BaseKey;}location; struct Store{bool exists=true;Location* Find(std::string const&){return exists?&location:nullptr;}}store;auto sAdventureLocationMgr=&store; struct Manager{void ClearIntent(int){}void SetIntent(int,ClientlessIntent){}}manager;auto sClientlessPlayerMgr=&manager; +struct Groups{bool complete=false;unsigned queues=0,cancels=0;bool Complete(Player*){return complete;}void QueueBrowser(Player*,std::string const&){++queues;}void CancelBrowser(Player*){++cancels;}}groups;auto sAdventureGroupMgr=&groups; struct AdventureBehaviorMgr{ - enum class Phase{Idle,Travel}; - struct Record{long Deadline=0;bool Dirty=true,Enabled=true,Publishing=false,Queued=false;std::string Intent,Location,WantedIntent="instance",WantedLocation="instance_visit_at_101",Detail;Phase State=Phase::Idle;std::unordered_setTried;}; + enum class Phase{Idle,Travel,WaitingGroup}; + struct Record{long Deadline=0;bool Dirty=true,Enabled=true,Publishing=false,Queued=false,ExpeditionStarted=false;std::string Intent,Location,WantedIntent="instance",WantedLocation="instance_visit_at_101",Detail;Phase State=Phase::Idle;std::unordered_setTried;}; bool mapped=true,allowed=true;int fallback=0;std::string action,parameter,target;bool hard=false; void Begin(Player*,Record&); + void LatchGroupTravel(Player*,Record&r){r.ExpeditionStarted=true;} bool Allowed(Player*,Location const&,std::string const&){return allowed;} void Fallback(Player*,Record&){++fallback;} bool ResolveInstance(Player*,Record&){return mapped;} std::string AreaNode(Player*,Location const&){return "reachable";} - void Queue(Player*,Record&,std::string const&a,std::string const&p,std::string const&t,bool h=false){action=a;parameter=p;target=t;hard=h;} + void Queue(Player*,Record&r,std::string const&a,std::string const&p,std::string const&t,bool h=false){action=a;parameter=p;target=t;hard=h;r.Queued=true;} }; '''+s[a:b]+r''' int main(){Player p;AdventureBehaviorMgr mgr;AdventureBehaviorMgr::Record r; - mgr.Begin(&p,r);assert(mgr.action=="travel_to_location"&&mgr.parameter=="id"&&mgr.target=="instance_visit_at_101"&&mgr.hard); + mgr.Begin(&p,r);assert(r.State==AdventureBehaviorMgr::Phase::WaitingGroup&&mgr.action.empty()&&groups.queues==1&&!r.ExpeditionStarted); + groups.complete=true;mgr.Begin(&p,r);assert(r.ExpeditionStarted); + groups.complete=false;mgr.Begin(&p,r);assert(mgr.action=="travel_to_location"&&mgr.parameter=="id"&&mgr.target=="instance_visit_at_101"&&mgr.hard); assert(r.State==AdventureBehaviorMgr::Phase::Travel&&!r.Dirty); location.BaseKey="instance_visit_at_101";r.WantedLocation="instance_visit_at_101_d1";mgr.Begin(&p,r);assert(mgr.target==location.BaseKey&&r.Location==r.WantedLocation); mgr.mapped=false;mgr.Begin(&p,r);assert(mgr.fallback==1); @@ -38,6 +43,6 @@ int main(){Player p;AdventureBehaviorMgr mgr;AdventureBehaviorMgr::Record r; ''' with tempfile.TemporaryDirectory() as tmp: src=Path(tmp)/'begin.cpp';exe=Path(tmp)/'begin';src.write_text(code) - subprocess.run(['g++','-include',str(Path(__file__).with_name('telemetry_test_stub.h')),'-std=c++17',str(src),'-o',str(exe)],check=True) + subprocess.run(['g++','-include',str(Path(__file__).with_name('telemetry_test_stub.h')),'-std=c++17','-I'+str(root/'src/server/game/World'),str(src),'-o',str(exe)],check=True) subprocess.run([str(exe)],check=True) print('Production entrance travel uses the existing location planner, requires mapping and retains normal social/area travel.') diff --git a/tests/clientless/test_adventure_instance_persistence.py b/tests/clientless/test_adventure_instance_persistence.py index 19063a5a87..d39366fe80 100644 --- a/tests/clientless/test_adventure_instance_persistence.py +++ b/tests/clientless/test_adventure_instance_persistence.py @@ -55,7 +55,7 @@ struct Player{ struct Location{unsigned InstanceDifficulty=1;};struct Locations{Location l;Location*Find(std::string const&){return &l;}}locations;auto sAdventureLocationMgr=&locations; struct AdventureBehaviorMgr{ enum class Phase{Idle,OnSite}; - struct Record{AdventureInstancePolicy::Visit Instance;bool Schedule=false,Dirty=false;Phase State=Phase::Idle; + struct Record{AdventureInstancePolicy::Visit Instance;bool Schedule=false,Dirty=false,ExpeditionStarted=false;Phase State=Phase::Idle; std::string Intent,WantedIntent,Location,WantedLocation,Detail;time_t Deadline=0;}; bool SaveInstance(Player*,Record&);bool RestoreInstance(Player*,Record&);void FinishInstance(Player*,Record&); }; @@ -64,7 +64,7 @@ for signature in ('bool AdventureBehaviorMgr::SaveInstance(', 'bool AdventureBeh code+=r''' int main(){ AdventureBehaviorMgr mgr;AdventureBehaviorMgr::Record r;Player p; - assert(!mgr.RestoreInstance(&p,r)); + assert(!mgr.RestoreInstance(&p,r)&&!r.ExpeditionStarted); auto& v=r.Instance;v.Active=true;v.Location="instance_visit_at_78";v.Entry=78;v.Exit=121;v.Map=36;v.InstanceId=7; v.BlockEnd=3600;v.PrepareUntil=2410;v.Stage=AdventureInstancePolicy::Phase::Inside;v.LossPercent=37;r.Schedule=true; assert(mgr.SaveInstance(&p,r));assert(CharacterDatabase.last.size()==2); @@ -72,6 +72,7 @@ int main(){ // Restart creates an empty behavior record, then restores the actual visit. AdventureBehaviorMgr::Record restored;assert(mgr.RestoreInstance(&p,restored)); assert(restored.Intent=="instance"&&restored.Location==v.Location&&restored.Deadline==3600&&restored.Schedule); + assert(restored.ExpeditionStarted); assert(restored.Instance.Stage==AdventureInstancePolicy::Phase::Inside&&restored.Instance.InstanceId==7); assert(restored.Instance.LossPercent==37&&!restored.Instance.InjuryApplied); // Character health and the once-only marker commit together, never separately. diff --git a/tests/clientless/test_adventure_intent_state.py b/tests/clientless/test_adventure_intent_state.py index 5d8224dc25..b6e1c8f68a 100644 --- a/tests/clientless/test_adventure_intent_state.py +++ b/tests/clientless/test_adventure_intent_state.py @@ -17,12 +17,12 @@ using uint32=uint32_t;using uint64=uint64_t; constexpr int SPELL_VISUAL_KIT_DRINK=438,UNIT_NPC_EMOTESTATE=0; struct Position {float x=0;void Relocate(void const*){}}; struct Guid{uint32 GetCounter(){return 26;}bool operator!=(Guid)const{return false;}}; -struct Group{Guid GetLeaderGUID(){return {};}}; +struct Group{bool lfg=false;Guid GetLeaderGUID(){return {};}bool isLFGGroup(){return lfg;}}; struct Object{} object; struct Map{Object* GetGameObject(int){return &object;}} map; struct Player { - bool combat=false;uint32 area=87,zone=12,mapId=0; - Group*GetGroup(){return nullptr;}Guid GetGUID(){return {};}bool IsFlying(){return false;}bool IsInWorld(){return true;}bool IsInCombat(){return combat;} + bool combat=false,battleground=false;uint32 area=87,zone=12,mapId=0; + Group*GetGroup(){return nullptr;}bool InBattleground(){return battleground;}bool isUsingLfg(){return false;}bool InBattlegroundQueue(){return false;}Guid GetGUID(){return {};}bool IsFlying(){return false;}bool IsInWorld(){return true;}bool IsInCombat(){return combat;} uint32 GetMapId(){return mapId;}uint32 GetAreaId(){return area;}uint32 GetZoneId(){return zone;} float GetPositionX(){return 0;}float GetPositionY(){return 0;}float GetPositionZ(){return 0;} float GetExactDist(Position const&){return 0;}float GetExactDist(float,float,float){return 0;}float GetExactDist(Object*){return 0;} @@ -32,7 +32,7 @@ struct Player { } player; namespace ObjectAccessor{Player*FindPlayer(Guid){return nullptr;}} struct Lua{void UpdateWorldPresence(Player*,std::string const&,bool){}}lua;auto sClientlessLuaEngine=&lua; -struct BotGroups{bool BotLed(Player*){return false;}bool FollowMember(Player*){return false;}}botGroups;auto sAdventureGroupMgr=&botGroups; +struct BotGroups{bool full=false;unsigned queued=0;bool Complete(Player*){return full;}void QueueBrowser(Player*,std::string const&){++queued;}bool BotLed(Player*){return false;}bool FollowMember(Player*){return false;}}botGroups;auto sAdventureGroupMgr=&botGroups; struct Encounters{bool active=false;bool Active(Player*){return active;}}encounters;auto sAdventureEncounterMgr=&encounters; bool unsafe=false;bool Unsafe(Player*){return unsafe;} bool busy=false;bool Busy(uint32){return busy;} @@ -47,16 +47,16 @@ struct Manager{uint32 queued=0;uint32 GetQueuedActionCount(uint32){return queued struct Graph{ bool nearest=true;void EnsureLoaded(){}bool FindNearestNodeToPosition(uint32,float,float,float,std::string& key,float& distance){key="node";distance=10;return nearest;} } graph;auto sClientlessTravelGraphMgr=&graph; -struct AdventureLocation{struct{uint32 MapId=0;float X=0,Y=0,Z=0;}Point;bool IsArea=false;uint32 AreaId=12;} location; +struct AdventureLocation{struct{uint32 MapId=0;float X=0,Y=0,Z=0;}Point;bool IsArea=false;uint32 AreaId=12,ZoneId=12;} location; struct Locations{auto Find(std::string const&){return &location;}} locations;auto sAdventureLocationMgr=&locations; struct Areas{unsigned Revision(){return 0;}} areas;auto sAdventureAreaMgr=&areas; enum class ClientlessTravelState{Moving,Arrived}; struct Travel{struct{ClientlessTravelState State=ClientlessTravelState::Arrived;}status;auto GetStatus(uint32){return &status;}}travel;auto sClientlessTravelMgr=&travel; class AdventureBehaviorMgr { public: - enum class Phase{Idle,Travel,OnSite,Switching,Handover}; + enum class Phase{Idle,Travel,OnSite,Switching,Handover,WaitingGroup}; struct Record{ - bool Enabled=true,Schedule=false,Queued=false,Dirty=false;AdventureGroupPolicy::Departure Departure; + bool Enabled=true,Schedule=false,Queued=false,Dirty=false,ExpeditionStarted=false;AdventureGroupPolicy::Departure Departure; Phase State=Phase::Travel; std::string Intent="social",Location="tavern",WantedIntent="social",WantedLocation="tavern",Detail,Micro,ManualNextIntent,ManualNextLocation; time_t Deadline=1000;uint32 AreaRevision=0,Date=20261026,Timer=0,MicroTimer=0,GestureTimer=0,RetryTimer=0;int Hour=5; @@ -94,6 +94,19 @@ code+=s[start:end] code+=s[a:b]+r''' int main(){ AdventureBehaviorMgr mgr;auto& r=mgr._records.at(26); + // Waiting for a valid party cannot start travel or ordinary micro actions. + r.State=AdventureBehaviorMgr::Phase::WaitingGroup;r.Intent="instance"; + mgr.Update(&player,1000);assert(botGroups.queued==1&&mgr.begun==0&&mgr.micros==0); + botGroups.full=true;mgr.Update(&player,1000); + assert(r.State==AdventureBehaviorMgr::Phase::Idle&&r.Dirty); + // A latched departure survives a vacancy while another member catches up. + botGroups.full=false;r.State=AdventureBehaviorMgr::Phase::WaitingGroup;r.Dirty=false;r.ExpeditionStarted=true; + mgr.Update(&player,1000);assert(r.State==AdventureBehaviorMgr::Phase::Idle&&r.Dirty&&botGroups.queued==1); + // An active battleground suspends the day planner, including hour transitions. + player.battleground=true;r.Schedule=true;r.Deadline=1;r.Plan[6]={"profession","mine"};hour=6; + mgr.Update(&player,1000);assert(mgr.switches==0&&r.Hour==5); + player.battleground=false;hour=5;r=AdventureBehaviorMgr::Record{}; + r.Instance.Active=true;mgr.EnterPlayerInstance(&player);assert(!r.Instance.Active); encounters.active=true;r.Schedule=true;r.Deadline=1;r.Plan[6]={"profession","mine"};hour=6; mgr.Update(&player,1000);assert(mgr.switches==0 && mgr.micros==0 && r.Hour==5); diff --git a/tests/clientless/test_adventure_interactions.py b/tests/clientless/test_adventure_interactions.py index 32b295452e..2285b43a21 100644 --- a/tests/clientless/test_adventure_interactions.py +++ b/tests/clientless/test_adventure_interactions.py @@ -39,6 +39,7 @@ struct Creature:Unit{}; struct Member {Player*player=nullptr;Member*nextMember=nullptr;Player*GetSource(){return player;}Member*next(){return nextMember;}}; struct Player:Unit { ObjectGuid guid,selection;bool alive=true,inWorld=true,combat=false,teleport=false,transport=false,flight=false,charmed=false,casting=false,afk=false,visible=true,phase=true,los=true; + bool lfg=false,bgqueue=false,battleground=false;bool isUsingLfg(){return lfg;}bool InBattlegroundQueue(){return bgqueue;}bool InBattleground(){return battleground;} unsigned mapid=0,team=ALLIANCE;Session session;Group*group=nullptr,*invite=nullptr;Map map;int gestures=0,says=0,posture=0;uint32 lastEmote=0; explicit Player(unsigned id=26){guid.id=id;session.owner=this;} ObjectGuid GetGUID(){return guid;}bool IsAlive(){return alive;}bool IsInWorld(){return inWorld;}bool IsInCombat(){return combat;}bool IsBeingTeleported(){return teleport;}bool GetTransport(){return transport;}bool IsFlying(){return false;}bool IsInFlight(){return flight;}bool IsCharmed(){return charmed;}bool HasUnitState(int){return casting;} @@ -122,6 +123,12 @@ int main(){ bot.group=&group;group.leader=bot.guid;botGroups.botLed=true; auto& rec=mgr._records[26];rec.Grouped=true;rec.SceneUntil=0;rec.Timer=1000; assert(!mgr.Update(&bot,50)&&rec.Timer==950);botGroups.botLed=false; + // Native queueing is activity, not an AFK leader: no intent/AFK exit while waiting. + mgr._records.clear();group.leader=leader.guid;bot.group=&group;bot.lfg=true;tick(4000); + behavior.schedule="raid:meeting";tick(5000);assert(bot.group); + bot.lfg=false;bot.bgqueue=true;tick(6000);assert(bot.group); + bot.bgqueue=false;bot.battleground=true;tick(7000);assert(bot.group); + bot.battleground=false;tick(7001);assert(!bot.group);bot.group=&group; // Explicit diagnostic leave uses ordinary safe-state guards. bot.combat=true;assert(!mgr.RequestLeave(&bot)&&bot.group);bot.combat=false; assert(mgr.RequestLeave(&bot)&&!bot.group); diff --git a/tests/clientless/test_adventure_leisure.py b/tests/clientless/test_adventure_leisure.py index 25d76a859c..e1831ec8d0 100644 --- a/tests/clientless/test_adventure_leisure.py +++ b/tests/clientless/test_adventure_leisure.py @@ -86,13 +86,14 @@ struct Travel{bool AnalyzePath(Player*,Position const&,ClientlessPathDiagnostics enum class ClientlessFlightState{Mounting,Flying,Arrived,Failed}; struct Flight{struct{ClientlessFlightState State=ClientlessFlightState::Mounting;}status;int starts=0;bool enabled=true;Position target;bool Enabled(Player*){return enabled;}bool Start(Player*,Position const&t,std::string&){++starts;target=t;status.State=ClientlessFlightState::Mounting;return true;}auto GetStatus(uint32){return &status;}}flight;auto sClientlessFlightMgr=&flight; struct Manager{void ClearQueuedActions(uint32){}}manager;auto sClientlessPlayerMgr=&manager; +struct Groups{unsigned cancellations=0;void CancelBrowser(Player*){++cancellations;}}groups;auto sAdventureGroupMgr=&groups; struct Executor{bool RequestStopAtNode(uint32){return false;}}executor;auto sClientlessActionExecutorMgr=&executor; class AdventureBehaviorMgr{public: enum class Phase{Idle,OnSite,Switching}; struct Record{ AdventureInstancePolicy::Visit Instance; std::string Intent="leisure",Location="city",WantedIntent,WantedLocation,Detail;Position Anchor;uint32 AnchorMap=0,MicroTimer=240000,RetryTimer=0;std::mt19937 Random{26}; - time_t Deadline=0;bool Dirty=false;std::unordered_set Tried;Phase State=Phase::OnSite; + time_t Deadline=0,ExpeditionUntil=0;bool Dirty=false,ExpeditionStarted=false;std::string ExpeditionIntent;std::unordered_set Tried;Phase State=Phase::OnSite; struct LeisureScene{bool Active=false,Flying=false,Moving=false,StopRequested=false,Returning=false,PlannedWalk=false,Progressive=false;std::string Kind;Position Origin;std::vector Route,WalkTrace;std::size_t Step=0,OutboundSteps=0;uint32 Elapsed=0,LegElapsed=0,PauseMs=0,CompanionWait=0,CompletedLegs=0;ClientlessCompanionScene Companion;}Leisure; }; int moves=0,resets=0;bool lastRiding=false,moveAllowed=true;Position requested; @@ -231,6 +232,11 @@ int main(){ r.Deadline=GameTime::now+300;assert(!mgr.LeisureAvailable(&p,r,{"walk"}));r.Deadline=GameTime::now+301;assert(mgr.LeisureAvailable(&p,r,{"walk"}));r.Deadline=0; assert(!mgr.LeisureAvailable(&p,r,{"ride"}));mgr.ResetLeisure(&p,r);terrain.outdoors=true;PathGenerator::bend=20; r.RetryTimer=30000;r.Tried.insert("old");mgr.SetWanted(&p,r,"rest","new",1234);assert(r.RetryTimer==0&&r.Tried.empty()&&r.Deadline==1234); + // Group travel latches survive the formation-to-activity transition but expire. + r.WantedIntent="groupformation";r.ExpeditionIntent="instance";r.ExpeditionUntil=GameTime::now+600; + mgr.SetWanted(&p,r,"instance","entrance",GameTime::now+600);assert(r.ExpeditionStarted); + r.WantedIntent="groupformation";r.ExpeditionUntil=GameTime::now; + mgr.SetWanted(&p,r,"instance","entrance",GameTime::now+600);assert(!r.ExpeditionStarted); } ''' diff --git a/tests/clientless/test_browser_admission.py b/tests/clientless/test_browser_admission.py new file mode 100644 index 0000000000..8f8a4a051c --- /dev/null +++ b/tests/clientless/test_browser_admission.py @@ -0,0 +1,42 @@ +"""Execute the admission/formation rules used by the live server.""" +from pathlib import Path +import subprocess +import tempfile +root=Path(__file__).resolve().parents[2] +code=r''' +#include "ClientlessBrowserRules.h" +#include "AdventureGroupPolicy.h" +#include +int main(){ + using ClientlessBrowserRules::Admit; + // Independent off-switches; the test override cannot defeat either switch. + for(bool queue:{false,true})for(bool enter:{false,true}){ + assert(Admit(false,true,false,queue,enter)); + assert(Admit(true,true,false,queue,enter)==(queue&&enter)); + assert(!Admit(true,false,false,queue,enter)); + assert(Admit(true,false,true,queue,enter)==(queue&&enter)); + } + // Human departure invalidates the same concrete party's admission. + assert(Admit(true,true,false,true,true));assert(!Admit(true,false,false,true,true)); + using namespace AdventureGroupPolicy; + assert(Eligible("pvp"));assert(Compatible("pvp","pvp",80,85)); + assert(!Compatible("pvp","instance",80,80)); + auto dungeon=RequiredRoles(5);assert(dungeon.Tanks==1&&dungeon.Healers==1&&dungeon.Damage==3); + auto raid=RequiredRoles(20);assert(raid.Tanks==2&&raid.Healers==4&&raid.Damage==14); + auto large=RequiredRoles(25);assert(large.Tanks+large.Healers+large.Damage==25); + for(unsigned i=0;i<10;++i){float social=float(i)/10;assert(MergeChance(social,300)>MergeChance(social,3600));} + assert(PreferMerge(2,4,false,false,false)); + assert(!PreferMerge(4,2,false,false,true)); + assert(!PreferMerge(3,3,false,false,false));assert(PreferMerge(3,3,false,false,true)); + assert(PreferMerge(5,4,false,true,false)); // close the last role gap + assert(PreferMerge(4,2,true,false,false)); // move a surplus role into a legal group + assert(WorldPvP(5095)&&WorldPvP(3483)&&WorldPvP(3519)&&!WorldPvP(1519)); + // Gathering never moves past the fixed end of an hour. + assert(DepartureAt(14*3600+57*60,15*3600)==15*3600); +} +''' +with tempfile.TemporaryDirectory() as directory: + p=Path(directory);(p/'rules.cpp').write_text(code) + subprocess.run(['g++','-std=c++17','-I'+str(root/'src/server/game/World'),str(p/'rules.cpp'),'-o',str(p/'rules')],check=True) + subprocess.run([str(p/'rules')],check=True) +print('Browser admission, last-human departure, independent switches, bot-only override, roles and formation progress passed.') diff --git a/tests/clientless/test_browser_bg_brackets.py b/tests/clientless/test_browser_bg_brackets.py new file mode 100644 index 0000000000..0015c30b92 --- /dev/null +++ b/tests/clientless/test_browser_bg_brackets.py @@ -0,0 +1,43 @@ +"""Execute production recruitment admission against native bracket adapters.""" +from pathlib import Path +import subprocess,tempfile +root=Path(__file__).resolve().parents[2] +s=(root/'src/server/game/World/AdventureGroupMgr.cpp').read_text();a=s.index('bool BattlegroundCompatible(');b=s.index('{',a);end=b+1;depth=1 +while depth: + depth+=(s[end]=='{')-(s[end]=='}');end+=1 +c=s.index('bool BrowserOfferEnabled(');d=s.index('{',c);ce=d+1;depth=1 +while depth: + depth+=(s[ce]=='{')-(s[ce]=='}');ce+=1 +code=r''' +#include +constexpr unsigned BATTLEGROUND_WS=2,BATTLEGROUND_RB=32; +struct Player{unsigned level;unsigned getLevel(){return level;}}; +struct BG{unsigned GetMapId(){return 489;}}; +struct Mgr{bool available=true;unsigned selected=0;BG bg;BG*GetBattlegroundTemplate(unsigned id){selected=id;return available?&bg:nullptr;}}manager;auto sBattlegroundMgr=&manager; +struct Bracket{unsigned id;unsigned GetBracketId()const{return id;}}; +struct DB{Bracket brackets[5]={{0},{1},{2},{3},{4}};Bracket const*GetBattlegroundBracketByLevel(unsigned map,unsigned level){assert(map==489);if(level<10)return nullptr;return &brackets[level<18?0:level<30?1:level<45?2:level<85?3:4];}}sDBCManager; +'''+s[a:end]+r''' +namespace lfg{constexpr unsigned LFG_TYPE_RAID=2,LFG_OPTION_ENABLE_RAID_BROWSER=2,LFG_OPTION_ENABLE_DUNGEON_FINDER=1;struct LFGDungeonData{unsigned type;bool raidMap;};} +struct LfgMgr{unsigned options=1;bool isOptionEnabled(unsigned value){return (options&value)!=0;}}lfgManager;auto sLFGMgr=&lfgManager; +'''+s[c:ce]+r''' +int main(){ + lfg::LFGDungeonData dragonSoul{1,true},legacyRaid{2,true},dungeon{1,false}; + assert(BrowserOfferEnabled(dragonSoul)&&BrowserOfferEnabled(dungeon)&&!BrowserOfferEnabled(legacyRaid)); + lfgManager.options=2;assert(!BrowserOfferEnabled(dragonSoul)&&!BrowserOfferEnabled(dungeon)&&BrowserOfferEnabled(legacyRaid)); + lfgManager.options=0;assert(!BrowserOfferEnabled(dragonSoul)&&!BrowserOfferEnabled(legacyRaid)); + Player a{10},b{10};assert(BattlegroundCompatible(&a,&b)&&manager.selected==BATTLEGROUND_WS); + a.level=9;assert(!BattlegroundCompatible(&a,&b)); + a.level=17;b.level=18;assert(!BattlegroundCompatible(&a,&b)); // custom native boundary, not a hardcoded five-level formula + a.level=30;b.level=34;assert(BattlegroundCompatible(&a,&b)); + a.level=44;b.level=45;assert(!BattlegroundCompatible(&a,&b)); + a.level=45;b.level=44;assert(!BattlegroundCompatible(&a,&b)); + a.level=45;b.level=46;assert(BattlegroundCompatible(&a,&b)&&manager.selected==BATTLEGROUND_RB); + a.level=85;b.level=84;assert(!BattlegroundCompatible(&a,&b)); + b.level=85;assert(BattlegroundCompatible(&a,&b));manager.available=false;assert(!BattlegroundCompatible(&a,&b)); +} +''' +with tempfile.TemporaryDirectory() as directory: + p=Path(directory);(p/'brackets.cpp').write_text(code) + subprocess.run(['g++','-std=c++17',str(p/'brackets.cpp'),'-o',str(p/'brackets')],check=True) + subprocess.run([str(p/'brackets')],check=True) +print('Production BG recruitment uses native brackets, minimum levels, random eligibility and available templates; native Type1 LFR and legacy Type2 browser options.') diff --git a/tests/clientless/test_browser_match_order.py b/tests/clientless/test_browser_match_order.py new file mode 100644 index 0000000000..8f08c0726c --- /dev/null +++ b/tests/clientless/test_browser_match_order.py @@ -0,0 +1,83 @@ +"""Run production native queue recursion with a human behind a full bot prefix.""" +from pathlib import Path +import subprocess,tempfile +root=Path(__file__).resolve().parents[2] +source=(root/'src/server/game/DungeonFinding/LFGQueue.cpp').read_text() +a=source.index('LfgCompatibility LFGQueue::FindNewGroups(');b=source.index('{',a);end=b+1;depth=1 +while depth: + depth+=(source[end]=='{')-(source[end]=='}');end+=1 +function=source[a:end] +code=r''' +#include +#include +#include +#include +#include +#include +#include +#define TC_LOG_DEBUG(...) ((void)0) +struct ObjectGuid{unsigned id;bool operator<(ObjectGuid other)const{return id; +struct Player{bool bot=true,connected=true;}; +namespace ObjectAccessor{std::mapplayers;Player*FindConnectedPlayer(ObjectGuid guid){auto it=players.find(guid);return it==players.end()?nullptr:it->second;}} +namespace ClientlessBrowserPolicy{ + enum class Kind{Dungeon,Raid};inline bool allowBotOnly=false,enter=true; + bool Bot(Player*p){return p&&p->bot;}bool Human(Player*p){return p&&!p->bot&&p->connected;} + bool BotOnlyTests(){return allowBotOnly;}bool QueueEnabled(Kind){return true;}bool JoinEnabled(Kind){return enter;} +} +struct LFGDungeonData{unsigned capacity=5;unsigned GetMaxGroupSize()const{return capacity;}bool IsRaid()const{return capacity>5;}}; +struct Mgr{LFGDungeonData data;LFGDungeonData const*GetLFGDungeon(unsigned){return &data;}bool AllQueued(GuidList const&){return true;}}mgr;auto sLFGMgr=&mgr; +enum LfgCompatibility{LFG_COMPATIBILITY_PENDING,LFG_INCOMPATIBLES_WRONG_GROUP_SIZE,LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS,LFG_INCOMPATIBLES_MULTIPLE_LFG_GROUPS,LFG_INCOMPATIBLES_HAS_IGNORES,LFG_INCOMPATIBLES_NO_ROLES,LFG_INCOMPATIBLES_NO_DUNGEONS,LFG_COMPATIBLES_WITH_LESS_PLAYERS,LFG_COMPATIBLES_BAD_STATES,LFG_COMPATIBLES_MATCH}; +std::string ConcatenateGuids(GuidList const& check){std::string key;for(auto g:check)key+=std::to_string(g.id)+",";return key;} +struct LFGQueue{ + struct Data{std::maproles;std::setdungeons{1};}; + std::mapQueueDataStore;GuidList matched;unsigned forbiddenFullBotChecks=0;bool cachedAllBotMatch=false; + LfgCompatibility FindNewGroups(GuidList&,GuidList&); + LfgCompatibility GetCompatibles(std::string const&key){return cachedAllBotMatch&&key=="1,2,3,4,5,"?LFG_COMPATIBLES_MATCH:LFG_COMPATIBILITY_PENDING;} + void SetCompatibles(std::string const&,LfgCompatibility){} + LfgCompatibility CheckCompatibility(GuidList const& check){ + unsigned size=0;bool human=false; + for(auto group:check)for(auto member:QueueDataStore.at(group).roles){++size;human|=ClientlessBrowserPolicy::Human(ObjectAccessor::FindConnectedPlayer(member.first));} + if(size>mgr.data.capacity)return LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS; + if(sizeplayers(27);for(unsigned i=0;i +#include +struct ObjectGuid{unsigned id;}; +struct WorldSession{bool bot=false,open=true,logout=false;bool IsClientless()const{return bot;}bool HasOpenRealmConnection()const{return open;}bool PlayerLogout()const{return logout;}}; +struct Player{WorldSession session;WorldSession*GetSession()const{return const_cast(&session);}}; +struct Config{std::unordered_map values;bool GetBoolDefault(std::string const&key,bool fallback){auto found=values.find(key);return found==values.end()?fallback:found->second;}}; +inline Config config;inline Config*sConfigMgr=&config; +namespace ObjectAccessor{inline std::unordered_map players;inline Player*FindConnectedPlayer(ObjectGuid guid){auto found=players.find(guid.id);return found==players.end()?nullptr:found->second;}} +''' +code=r''' +#include "ClientlessBrowserPolicy.h" +#include +int main(){ + using namespace ClientlessBrowserPolicy; + Player bot{{true}},human{{false}},unrelated{{false}}; + ObjectAccessor::players={{1,&bot},{2,&human},{3,&unrelated}}; + assert(!CanMatch({{1}},Kind::Dungeon)); // unrelated waiting human cannot qualify + assert(CanMatch({{1},{2}},Kind::Dungeon)); + human.session.open=false; + assert(!CanMatch({{1},{2}},Kind::Dungeon)); // still registered during network-disconnect grace + human.session.open=true;human.session.logout=true; + assert(!CanMatch({{1},{2}},Kind::Dungeon));human.session.logout=false; + ObjectAccessor::players.erase(2); + assert(!CanMatch({{1},{2}},Kind::Dungeon)); // last actual human disconnected + ObjectAccessor::players[2]=&human; + assert(!CanMatch({{1},{2}},Kind::Raid));assert(!CanMatch({{1},{2}},Kind::Battleground)); + config.values["Clientless.Browser.Raid.JoinEnabled"]=true; + assert(CanMatch({{1},{2}},Kind::Raid));assert(!CanMatch({{1}},Kind::Raid)); + config.values["Clientless.Browser.AllowBotOnlyTests"]=true; + assert(CanMatch({{1}},Kind::Raid)); + config.values["Clientless.Browser.Raid.QueueEnabled"]=false; + assert(!CanMatch({{1}},Kind::Raid));assert(!CanMatch({{1},{2}},Kind::Raid)); + assert(CanMatch({{2}},Kind::Raid)); // human-only behavior is independent of CPC switches + config.values["Clientless.Browser.Battleground.JoinEnabled"]=true; + assert(CanMatch({{1}},Kind::Battleground)); + config.values["Clientless.Browser.AllowBotOnlyTests"]=false; + assert(!CanMatch({{1}},Kind::Battleground));assert(CanMatch({{1},{2}},Kind::Battleground)); + assert(!CanMatch({},Kind::Battleground)); +} +''' +with tempfile.TemporaryDirectory() as directory: + p=Path(directory);(p/'types.h').write_text(stubs) + for name in ['Config.h','ObjectAccessor.h','Player.h','WorldSession.h']:(p/name).write_text('#include "types.h"\n') + (p/'participants.cpp').write_text(code) + subprocess.run(['g++','-std=c++17','-I'+str(p),'-I'+str(root/'src/server/game/World'),str(p/'participants.cpp'),'-o',str(p/'participants')],check=True) + subprocess.run([str(p/'participants')],check=True) +print('Production participant gate: exact party, disconnect, live switches, bot-only tests and independent human groups passed.') diff --git a/tests/clientless/test_capital_portal_seed.py b/tests/clientless/test_capital_portal_seed.py new file mode 100644 index 0000000000..13e4f8d840 --- /dev/null +++ b/tests/clientless/test_capital_portal_seed.py @@ -0,0 +1,43 @@ +"""Execute capital portal seed SQL on fixtures, preserving operator data.""" +from pathlib import Path +import sqlite3,re +root=Path(__file__).resolve().parents[2] +s=(root/'sql/custom/world/2026_10_30_01_capital_click_portals.sql').read_text() +s=s.replace('CREATE TEMPORARY TABLE','CREATE TEMP TABLE').replace('DROP TEMPORARY TABLE','DROP TABLE').replace('START TRANSACTION;','BEGIN;').replace('INSERT IGNORE INTO','INSERT OR IGNORE INTO') +s=re.sub(r'\bIF\(', 'IIF(',s) +db=sqlite3.connect(':memory:');db.create_function('CONCAT',-1,lambda *parts:''.join(map(str,parts))) +db.executescript(''' +CREATE TABLE areatrigger_teleport(ID INTEGER PRIMARY KEY,target_map INTEGER,target_position_x REAL,target_position_y REAL,target_position_z REAL,target_orientation REAL); +INSERT INTO areatrigger_teleport VALUES(5273,571,5878.56,666.423,615.294,0); +CREATE TABLE gameobject(guid INTEGER PRIMARY KEY,id INTEGER,map INTEGER,position_x REAL,position_y REAL,position_z REAL,orientation REAL); +CREATE TABLE gameobject_template(entry INTEGER PRIMARY KEY,type INTEGER,data0 INTEGER,data10 INTEGER,data2 INTEGER DEFAULT 0,data6 INTEGER DEFAULT 0); +CREATE TABLE spell_target_position(ID INTEGER,EffectIndex INTEGER,MapID INTEGER,PositionX REAL,PositionY REAL,PositionZ REAL,Orientation REAL); +CREATE TABLE spell_scripts(id INTEGER,effIndex INTEGER,delay INTEGER,command INTEGER,datalong INTEGER,datalong2 INTEGER,x REAL,y REAL,z REAL,o REAL); +CREATE TABLE vcore_clientless_world_point(point_key TEXT PRIMARY KEY,category TEXT,map INTEGER,position_x REAL,position_y REAL,position_z REAL,orientation REAL,enabled INTEGER,comment TEXT); +CREATE TABLE vcore_clientless_travel_node(node_key TEXT PRIMARY KEY,node_type TEXT,world_point_key TEXT,enabled INTEGER,comment TEXT); +CREATE TABLE vcore_clientless_travel_edge(id INTEGER PRIMARY KEY,from_node_key TEXT,to_node_key TEXT,edge_type TEXT,cost REAL,bidirectional INTEGER,enabled INTEGER,comment TEXT,UNIQUE(from_node_key,to_node_key,edge_type)); +CREATE TABLE vcore_clientless_portal_use(edge_id INTEGER PRIMARY KEY,gameobject_spawn_id INTEGER,gameobject_entry INTEGER,spell_id INTEGER); +CREATE TABLE vcore_clientless_node_access(node_key TEXT PRIMARY KEY,allowed_factions INTEGER,notes TEXT); +INSERT INTO gameobject VALUES(217855,195141,0,1,2,3,0),(219120,207995,1,4,5,6,0),(12608,184502,530,7,8,9,0),(203457,184503,0,10,11,12,0),(61496,193772,571,13,14,15,0),(223195,205268,0,16,17,18,0),(151163,999,530,0,0,0,0); +INSERT INTO gameobject_template(entry,type,data0,data10) VALUES(195141,22,65728,0),(207995,22,32268,0),(184502,10,0,35376),(184503,10,0,35727),(193772,22,58622,0),(205268,22,84464,0),(999,22,65728,0); +INSERT INTO spell_target_position VALUES(65728,0,0,-11708,-3168,-5,0),(32268,0,530,-4029,-11572,-138,0),(25649,0,0,1805,327,70,0),(35730,0,530,10021,-7014,49,0),(84464,0,730,854,1080,-12,0); +INSERT INTO spell_scripts VALUES(35376,0,0,15,25649,2,0,0,0,0),(35727,0,0,15,35730,2,0,0,0,0),(58622,0,1,6,571,0,5386,2840,418,3.14); +INSERT INTO vcore_clientless_world_point VALUES('portal_go_217855_source','travel_portal',0,99,98,97,0,0,'operator position'); +INSERT INTO vcore_clientless_travel_edge VALUES(1,'portal_go_217855_source','portal_go_217855_target','portal_use',7,0,0,'operator disabled'); +INSERT INTO vcore_clientless_node_access VALUES('portal_go_217855_source',0,'operator blocked'); +''') +db.execute('INSERT INTO gameobject_template(entry,type,data0,data10) VALUES(194012,22,61420,0)') +db.execute("INSERT INTO vcore_clientless_travel_edge VALUES(1752,'portal_go_83_source','portal_go_83_target','portal_use',1,0,0,'Disabled test portal: native Shattrath spell effects rejected by LOS; level 20/60 tested')") +db.executescript(s) +assert db.execute('SELECT data6 FROM gameobject_template WHERE entry=194012').fetchone()==(1,) +assert db.execute('SELECT enabled FROM vcore_clientless_travel_edge WHERE id=1752').fetchone()==(1,) +assert db.execute('SELECT COUNT(*) FROM vcore_clientless_portal_use').fetchone()==(6,) +assert db.execute("SELECT position_x,enabled FROM vcore_clientless_world_point WHERE point_key='portal_go_217855_source'").fetchone()==(99,0) +assert db.execute('SELECT cost,enabled,comment FROM vcore_clientless_travel_edge WHERE id=1').fetchone()==(7,0,'operator disabled') +assert db.execute("SELECT allowed_factions FROM vcore_clientless_node_access WHERE node_key='portal_go_217855_source'").fetchone()==(0,) +assert db.execute("SELECT enabled FROM vcore_clientless_travel_edge WHERE from_node_key='portal_go_223195_source'").fetchone()==(0,) +for spawn,mp,x in [(12608,0,1805),(203457,530,10021),(61496,571,5386),(219120,530,-4029)]: + assert db.execute('SELECT map,position_x FROM vcore_clientless_world_point WHERE point_key=?',(f'portal_go_{spawn}_target',)).fetchone()==(mp,x) +assert not db.execute("SELECT 1 FROM vcore_clientless_world_point WHERE point_key='portal_go_151163_source'").fetchone() +before=list(db.iterdump());db.executescript(s);assert list(db.iterdump())==before +print('Capital seed: native direct/script targets, factions, quest transit closed, wrong spawn entry rejected, manual edits and disabled flags preserved, idempotence.') diff --git a/tests/clientless/test_free_flight_planner.py b/tests/clientless/test_free_flight_planner.py index de77c33302..afa6315de1 100644 --- a/tests/clientless/test_free_flight_planner.py +++ b/tests/clientless/test_free_flight_planner.py @@ -22,7 +22,7 @@ preamble=r''' #include #include #include -using uint32=uint32_t; using int32=int32_t; +using uint8=unsigned char;using uint32=uint32_t; using int32=int32_t; #define TC_LOG_INFO(...) do {} while(0) #define TC_LOG_DEBUG(...) do {} while(0) #define TC_LOG_WARN(...) do {} while(0) diff --git a/tests/clientless/test_group_role_composition.py b/tests/clientless/test_group_role_composition.py new file mode 100644 index 0000000000..eb0f204987 --- /dev/null +++ b/tests/clientless/test_group_role_composition.py @@ -0,0 +1,77 @@ +"""Execute production NeedsRole/Complete against actual party compositions.""" +from pathlib import Path +import subprocess,tempfile +root=Path(__file__).resolve().parents[2] +source=(root/'src/server/game/World/AdventureGroupMgr.cpp').read_text() +def function(signature): + a=source.index(signature);b=source.index('{',a);e=b+1;depth=1 + while depth: + depth+=(source[e]=='{')-(source[e]=='}');e+=1 + return source[a:e] +code=r''' +#include "AdventureGroupPolicy.h" +#include +#include +#include +#include +#include +using uint8=unsigned char; +constexpr unsigned CLASS_WARRIOR=1,CLASS_PALADIN=2,CLASS_DEATH_KNIGHT=6,CLASS_DRUID=11; +namespace lfg{constexpr uint8 PLAYER_ROLE_LEADER=1,PLAYER_ROLE_TANK=2,PLAYER_ROLE_HEALER=4,PLAYER_ROLE_DAMAGE=8;} +struct Guid{unsigned id=0;unsigned GetCounter()const{return id;}bool operator==(Guid other)const{return id==other.id;}bool operator<(Guid other)const{return idmembers;Ref*first=nullptr; + struct Slot{Guid guid;};std::vectorGetMemberSlots(){std::vectorslots;for(auto g:members)slots.push_back({g});return slots;} + Guid GetLeaderGUID(){return leader;}unsigned GetMembersCount(){return members.size();}Ref*GetFirstMember(){return first;}uint8 GetLfgRoles(Guid){return 0;}}; +namespace ObjectAccessor{std::unordered_mapplayers;Player*FindPlayer(Guid g){auto i=players.find(g.id);return i==players.end()?nullptr:i->second;}} +struct Lua{Profile*GetAdventureProfile(unsigned id){auto p=ObjectAccessor::FindPlayer({id});return p&&p->session.bot?&p->profile:nullptr;}}lua;auto sClientlessLuaEngine=&lua; +struct PlayerAI{static bool IsPlayerHealer(Player*){return false;}static unsigned GetPlayerSpec(Player*p){return p->spec;}}; +struct AdventureGroupPlan{bool Forming=true;std::string Intent="groupformation",NextIntent="instance";unsigned Capacity=5;}; +struct Behavior{AdventureGroupPlan plan;AdventureGroupPlan GroupPlan(Player*){return plan;}}behavior;auto sAdventureBehaviorMgr=&behavior; +namespace GameTime{long now=100;long GetGameTime(){return now;}} +struct AdventureGroupMgr{struct Record{Guid Inviter;long InviteUntil=0;};std::map_records;unsigned PendingInvites(Player*,Player*except=nullptr)const;bool SurplusRole(Player*);bool BotLed(Player*)const{return true;}bool NeedsRole(Player*,Player*);bool Complete(Player*);bool CanInvite(Player*,Player*p){return p->eligible;}}; +''' +for signature in ['std::string Activity(', 'unsigned Capacity(', 'uint8 BrowserRole(', 'unsigned AdventureGroupMgr::PendingInvites(', 'bool AdventureGroupMgr::SurplusRole(', 'bool AdventureGroupMgr::NeedsRole(', 'bool AdventureGroupMgr::Complete(']:code+='\n'+function(signature) +code+=r''' +int main(){ + AdventureGroupMgr manager;Group group;std::vectorplayers(7);std::vectorrefs; + refs.reserve(5); + for(unsigned i=0;i #include #include +#include +#include +#include using uint8=uint8_t;using uint32=uint32_t; -constexpr uint32 MAX_SPELL_EFFECTS=3,GAMEOBJECT_TYPE_SPELLCASTER=22,SPELL_EFFECT_TELEPORT_UNITS=5,TARGET_DEST_DB=17; +constexpr uint32 MAX_SPELL_EFFECTS=3,GAMEOBJECT_TYPE_SPELLCASTER=22,GAMEOBJECT_TYPE_GOOBER=10,SPELL_EFFECT_TELEPORT_UNITS=5,SPELL_EFFECT_SCRIPT_EFFECT=77,TARGET_DEST_DB=17; +constexpr int SCRIPT_COMMAND_CAST_SPELL=15,SCRIPT_COMMAND_TELEPORT_TO=6,SF_CASTSPELL_TARGET_TO_TARGET=2; +struct ScriptInfo{int command=15;struct{unsigned SpellID=25649,Flags=2;int CreatureEntry=0;}CastSpell;struct{unsigned MapID=571,Flags=0;float DestX=1,DestY=2,DestZ=3,Orientation=0;}TeleportTo;}; +std::map> sSpellScripts; using SpellEffIndex=uint8; struct Position {float GetPositionX()const{return -1894;}float GetPositionY()const{return 5387;}float GetPositionZ()const{return -12;}float GetOrientation()const{return 0;}}; struct Spawn {uint32 id=183325,mapId=530;Position spawnPoint;} spawn; -struct Info {uint32 type=22;struct{uint32 spell=17334;}spellcaster;} info; +struct Info {uint32 type=22;struct{uint32 spell=17334,playerCast=1;}spellcaster;struct{uint32 spell=35376,playerCast=0,open=0,questID=0,eventID=0,pageID=0,gossipID=0,linkedTrap=0,consumable=0;}goober;} info; struct ObjectMgr {bool hasSpawn=true;auto GetGameObjectData(uint32){return hasSpawn?&spawn:nullptr;}auto GetGameObjectTemplate(uint32){return &info;}} objects; struct Target{uint32 id=0;uint32 GetTarget()const{return id;}}; struct Effect{uint32 Effect=0;Target TargetA,TargetB;}; -struct SpellInfo{uint32 Id=17334;Effect Effects[3];} spell; +struct SpellInfo{uint32 Id=17334;Effect Effects[3];} spell,child; struct SpellTargetPosition {uint32 target_mapId=0;float target_X=-8998,target_Y=861,target_Z=29,target_Orientation=2;} destination; -struct SpellMgr {bool hasSpell=true,hasTarget=true;auto GetSpellInfo(uint32){return hasSpell?&spell:nullptr;}auto GetSpellTargetPosition(uint32,SpellEffIndex){return hasTarget?&destination:nullptr;}} spells; +struct SpellMgr {bool hasSpell=true,hasTarget=true;SpellInfo* GetSpellInfo(uint32 id){return hasSpell?(id==spell.Id?&spell:id==child.Id?&child:nullptr):nullptr;}auto GetSpellTargetPosition(uint32,SpellEffIndex){return hasTarget?&destination:nullptr;}} spells; auto sObjectMgr=&objects;auto sSpellMgr=&spells; struct Node {std::string Key,Type,WorldPointKey;uint32 MapId=0;float X=0,Y=0,Z=0,O=0;}; -struct ClientlessPortalUse {uint32 SpawnId=0,Entry=0,SpellId=0;Node Source,Target;}; +struct ClientlessPortalUse {uint32 SpawnId=0,Entry=0,SpellId=0;std::vector> Requirements;Node Source,Target;}; struct ClientlessTravelGraphMgr{static bool ResolvePortalUse(uint32,ClientlessPortalUse&,std::string&);}; ''' definition_harness += definition_method @@ -179,13 +185,28 @@ int main(){ assert(p.SpawnId==83&&p.Entry==183325&&p.SpellId==17334&&p.Source.MapId==530&&p.Target.MapId==0); assert(p.Source.Key=="portal_go_83_source"&&p.Target.Key=="portal_go_83_target"&&p.Target.X==-8998); objects.hasSpawn=false;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));objects.hasSpawn=true; - info.type=10;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));info.type=22; + info.type=7;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));info.type=22; spells.hasSpell=false;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));spells.hasSpell=true; spells.hasTarget=false;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));spells.hasTarget=true; spell.Effects[0].TargetB.id=0;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));spell.Effects[0].TargetB.id=17; spell.Effects[1].Effect=5;spell.Effects[1].TargetB.id=17; assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));spell.Effects[1]={}; spell.Effects[0].Effect=77;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error)); + spell.Effects[1]={};spell.Id=35376;spell.Effects[0]={};spell.Effects[0].Effect=77; + info.type=10;child.Id=25649;child.Effects[0].Effect=5;child.Effects[0].TargetB.id=17; + sSpellScripts[35376].emplace(0,ScriptInfo{}); + assert(ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error)); + assert(p.SpellId==35376&&p.Requirements.size()==2&&p.Requirements[0].second==2&&p.Requirements[1].second==3); + info.goober.questID=1;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error));info.goober.questID=0; + sSpellScripts[35376].begin()->second.CastSpell.Flags=0;assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error)); + sSpellScripts[35376].begin()->second.CastSpell.Flags=2; + sSpellScripts[35376].emplace(0,ScriptInfo{});assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error)); + sSpellScripts[35376].clear();ScriptInfo direct;direct.command=6;sSpellScripts[35376].emplace(1,direct); + assert(ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error)&&p.Target.MapId==571&&p.Target.Z==3); + sSpellScripts[35376].clear();sSpellScripts[35376].emplace(4,direct);assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error)); + sSpellScripts[35376].clear();ScriptInfo cycle;cycle.CastSpell.SpellID=35376;sSpellScripts[35376].emplace(0,cycle); + assert(!ClientlessTravelGraphMgr::ResolvePortalUse(83,p,error)); + } ''' with tempfile.TemporaryDirectory(prefix='vcore-portal-definition-test-') as folder: diff --git a/tests/clientless/test_testbot_client.py b/tests/clientless/test_testbot_client.py new file mode 100644 index 0000000000..22d8ed6053 --- /dev/null +++ b/tests/clientless/test_testbot_client.py @@ -0,0 +1,60 @@ +"""Exercise the external adapter against a real local HTTP/SOAP fixture.""" +import base64 +import importlib.util +import json +from http.server import BaseHTTPRequestHandler, HTTPServer +from pathlib import Path +import tempfile +import threading +import xml.etree.ElementTree as ET + +root = Path(__file__).resolve().parents[2] +spec = importlib.util.spec_from_file_location('testbot_client', root / 'tools/testbots/client.py') +client = importlib.util.module_from_spec(spec) +spec.loader.exec_module(client) +requests = [] + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *args): + pass + + def do_POST(self): + assert self.headers['Authorization'] == 'Basic ' + base64.b64encode(b'operator:secret').decode() + tree = ET.fromstring(self.rfile.read(int(self.headers['Content-Length']))) + command = next(n.text for n in tree.iter() if n.tag == 'command') + requests.append(command) + if 'submit' in command: + assert base64.b64decode(command.split()[-1]) == b'testbot.check(true, "hello <&>")\n' + text = 'Testbot run adapter_case: queued' + else: + text = json.dumps({'run_id': 'adapter_case', 'state': 'passed', 'checks': 1}) + result = ET.Element('{http://schemas.xmlsoap.org/soap/envelope/}Envelope') + body = ET.SubElement(result, '{http://schemas.xmlsoap.org/soap/envelope/}Body') + ET.SubElement(body, 'result').text = text + data = ET.tostring(result) + self.send_response(200) + self.end_headers() + self.wfile.write(data) + + +server = HTTPServer(('127.0.0.1', 0), Handler) +thread = threading.Thread(target=server.serve_forever, daemon=True) +thread.start() +try: + with tempfile.TemporaryDirectory() as directory: + script = Path(directory) / 'case.lua' + script.write_text('testbot.check(true, "hello <&>")\n') + result = client.run(f'http://127.0.0.1:{server.server_port}/', 'operator', 'secret', 'adapter_case', script) + assert result['state'] == 'passed' + assert requests[-1] == 'clientless test result adapter_case' + try: + client.run('', '', '', '../bad', script) + except ValueError: + pass + else: + raise AssertionError('invalid run id accepted') +finally: + server.shutdown() + server.server_close() +print('External TestBot SOAP submission, base64 script integrity, result retrieval and run-ID validation passed.') diff --git a/tests/clientless/test_transport.py b/tests/clientless/test_transport.py index 6d27ec45b8..75a43b10ed 100644 --- a/tests/clientless/test_transport.py +++ b/tests/clientless/test_transport.py @@ -200,8 +200,13 @@ int main(){ p.x=0;ClientlessTransportMgr::Recording rec;rec.Stop=mgr._stops.at("A");rec.Stop.Points={point(false,0)};rec.Object=go.GetGUID(); p.x=1;assert(mgr.Sample(&p,rec,true));p.x=6;go.base.AddPassenger(&p);assert(mgr.Sample(&p,rec,true));assert(rec.Stop.Points.back().OnTransport&&std::fabs(rec.Stop.Points.back().Pos.x-1)<0.01); go.base.RemovePassenger(&p);assert(!mgr.Sample(&p,rec,true));assert(!rec.Error.empty()); - // Boarding onto the wrong vehicle and position jumps do not produce recordings. - ClientlessTransportMgr::Recording jump;jump.Stop=mgr._stops.at("A");jump.Stop.Points={point(false,0)};jump.Object=go.GetGUID();p.x=20;assert(!mgr.Sample(&p,jump,true)); + // Native boarding height snaps and coalesced movement may exceed eight + // yards. Accept the measured path; retain the total sixty-yard bound. + ClientlessTransportMgr::Recording tall;tall.Stop=mgr._stops.at("A");tall.Stop.Points={point(false,0)};tall.Object=go.GetGUID(); + p.Relocate(6,0,12);go.base.AddPassenger(&p);assert(mgr.Sample(&p,tall,true));assert(tall.Stop.Points.back().OnTransport); + go.base.RemovePassenger(&p);p.Relocate(20,0,0); + ClientlessTransportMgr::Recording gap;gap.Stop=mgr._stops.at("A");gap.Stop.Points={point(false,0)};gap.Object=go.GetGUID();assert(mgr.Sample(&p,gap,true)); + ClientlessTransportMgr::Recording excessive;excessive.Stop=mgr._stops.at("A");excessive.Stop.Points={point(false,0)};excessive.Object=go.GetGUID();p.x=61;assert(!mgr.Sample(&p,excessive,true));assert(excessive.Error.find("60 yards")!=std::string::npos);p.z=0; // Native ships switch between per-map copies of the same spawn. The executor // must resolve the new copy, preserve the ride and leave only at the target. ClientlessTransportMgr ships; diff --git a/tools/testbots/client.py b/tools/testbots/client.py new file mode 100644 index 0000000000..d429ccb61c --- /dev/null +++ b/tools/testbots/client.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +"""Submit Lua TestBot jobs through existing authenticated Trinity SOAP commands.""" +import argparse +import base64 +import json +import os +from pathlib import Path +import time +import urllib.error +import urllib.request +import xml.etree.ElementTree as ET + + +def command(endpoint, username, password, text, timeout=20): + envelope = ET.Element('{http://schemas.xmlsoap.org/soap/envelope/}Envelope') + body = ET.SubElement(envelope, '{http://schemas.xmlsoap.org/soap/envelope/}Body') + execute = ET.SubElement(body, '{urn:TC}executeCommand') + ET.SubElement(execute, 'command').text = text + auth = base64.b64encode((username + ':' + password).encode()).decode() + request = urllib.request.Request(endpoint, ET.tostring(envelope), headers={ + 'Content-Type': 'text/xml; charset=utf-8', 'SOAPAction': 'urn:TC#executeCommand', + 'Authorization': 'Basic ' + auth, + }) + with urllib.request.urlopen(request, timeout=timeout) as response: + root = ET.fromstring(response.read()) + for node in root.iter(): + if node.tag.rsplit('}', 1)[-1] == 'Fault': + raise RuntimeError('SOAP fault: ' + ''.join(node.itertext())) + for node in root.iter(): + if node.tag.rsplit('}', 1)[-1] in ('result', 'return'): + return ''.join(node.itertext()).strip() + raise RuntimeError('SOAP response contains no command result') + + +def run(endpoint, username, password, run_id, script, deadline=330): + if not run_id or len(run_id) > 80 or any(c not in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-' for c in run_id): + raise ValueError('Invalid run ID') + content = Path(script).read_bytes() + if not content or len(content) > 65536: + raise ValueError('Script must contain 1..65536 bytes') + reply = command(endpoint, username, password, + f'clientless test submit {run_id} ' + base64.b64encode(content).decode()) + if f'Testbot run {run_id}: queued' not in reply: + raise RuntimeError(reply) + end = time.monotonic() + deadline + while time.monotonic() < end: + reply = command(endpoint, username, password, f'clientless test result {run_id}') + try: + result = json.loads(reply) + except json.JSONDecodeError: + if 'not available yet' not in reply: + raise RuntimeError(reply) + else: + if result['run_id'] != run_id: + raise RuntimeError('Result belongs to another run') + if result['state'] != 'running': + return result + time.sleep(1) + raise TimeoutError(f'Client deadline exceeded; retrieve/cancel run {run_id} on server') + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('run_id') + parser.add_argument('script', type=Path) + parser.add_argument('--endpoint', default='http://127.0.0.1:7878/') + parser.add_argument('--user', required=True) + parser.add_argument('--output', type=Path) + parser.add_argument('--timeout', type=float, default=330, help='client wait deadline in seconds') + args = parser.parse_args() + try: + result = run(args.endpoint, args.user, os.environ['TESTBOT_PASSWORD'], args.run_id, args.script, deadline=args.timeout) + text = json.dumps(result, ensure_ascii=False, indent=2) + if args.output: + args.output.write_text(text + '\n') + print(text) + return 0 if result['state'] == 'passed' else 1 + except (OSError, ValueError, RuntimeError, TimeoutError, KeyError, ET.ParseError) as error: + print(json.dumps({'client_error': str(error)}, ensure_ascii=False)) + return 2 + + +if __name__ == '__main__': + raise SystemExit(main())