mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-13 03:32:28 -04:00
feat(mcp): Add ground height lookup and GM command execution
New MCP Tools: - get_ground_height: VMAP/DB height lookup for spawn Z coordinates - gm_command: Direct execution of go xyz, tele, gps, additem, die, revive Key changes: - WorldScan.cpp: Added GetGroundHeightAt() with VMAP + DB fallback - ServerTools.cpp: Implemented gm_command with teleport support - Updated MCP_SERVER.md with Dec 3 session summary Validated Jade Forest import: 1,767 templates, 6,540 spawns working in-game
This commit is contained in:
@@ -365,3 +365,47 @@ Room: Walls 4-7y behind, corridor opening East
|
||||
```
|
||||
|
||||
The AI can now SEE your surroundings! 👁️
|
||||
|
||||
## Session Summary (Dec 3, 2025)
|
||||
|
||||
### New MCP Tools Added 🚀
|
||||
|
||||
**`get_ground_height`** - Ground Z coordinate lookup
|
||||
- Uses VMAP when map is loaded (player on map)
|
||||
- Falls back to database (nearest creature Z within 50 yards)
|
||||
- Batch mode: up to 100 points at once
|
||||
- Returns `source: "vmap"` or `source: "database"`
|
||||
|
||||
**`gm_command`** - Direct GM command execution (no longer a stub!)
|
||||
- `go xyz X Y Z [mapId]` - Teleport to coordinates
|
||||
- `tele X Y Z mapId` - Teleport with map
|
||||
- `gps` - Get current position, zone, area
|
||||
- `additem <itemId> [count]` - Give item to player
|
||||
- `die` - Kill target or self
|
||||
- `revive` - Resurrect player
|
||||
|
||||
### Key Learnings
|
||||
|
||||
**TrinityCore 11.x API Differences:**
|
||||
- `Map::GetHeight()` requires `PhaseShift` parameter
|
||||
- Use `PhasingHandler::GetEmptyPhaseShift()` for global lookups
|
||||
- `MapManager.h` not `MapMgr.h`
|
||||
- `sMapMgr->FindMap(mapId, 0)` for world maps
|
||||
|
||||
**VMAP Height Lookup:**
|
||||
- Map must be loaded (player needs to be on map) for VMAP access
|
||||
- Use database fallback for unloaded maps
|
||||
- TrinityCore auto-snaps creatures to ground when spawning with Z=0
|
||||
|
||||
### Jade Forest Import Validated ✅
|
||||
- 1,767 creature templates imported
|
||||
- 6,540 creature spawns working
|
||||
- Wowhead coords → World coords conversion working
|
||||
- Spawns appear correctly in-game with proper Z heights
|
||||
|
||||
### Files Modified
|
||||
```
|
||||
src/araxiaonline/mcp/
|
||||
├── WorldScan.cpp # Added GetGroundHeightAt()
|
||||
└── ServerTools.cpp # Implemented gm_command
|
||||
```
|
||||
|
||||
@@ -16,6 +16,51 @@ end
|
||||
-- Load Smallfolk for serialization (used by shared data)
|
||||
local Smallfolk = require("smallfolk")
|
||||
|
||||
-- ============================================================================
|
||||
-- Configurable Display IDs (can be changed via shared data without recompile)
|
||||
-- ============================================================================
|
||||
|
||||
-- Default display IDs - these can be overridden via SetSharedData
|
||||
local DEFAULT_DISPLAYS = {
|
||||
waypoint_marker = 1824, -- Elven Wisp (works in 11.2.5)
|
||||
waypoint_highlight = 1824, -- Same as marker but scaled up (highlight via size)
|
||||
spawn_marker = 31366, -- Green targeting circle
|
||||
}
|
||||
|
||||
-- Get a display ID, checking shared data first, then falling back to default
|
||||
local function GetDisplayId(key)
|
||||
local sharedKey = "config_display_" .. key
|
||||
local value = GetSharedData(sharedKey)
|
||||
if value and value ~= "" then
|
||||
local num = tonumber(value)
|
||||
if num then
|
||||
return num
|
||||
end
|
||||
end
|
||||
return DEFAULT_DISPLAYS[key] or 17188
|
||||
end
|
||||
|
||||
-- Set a display ID in shared data (persists until server restart)
|
||||
local function SetDisplayIdConfig(key, displayId)
|
||||
local sharedKey = "config_display_" .. key
|
||||
SetSharedData(sharedKey, tostring(displayId))
|
||||
print("[Admin Handlers] Display config updated: " .. key .. " = " .. displayId)
|
||||
end
|
||||
|
||||
-- Initialize display configs from defaults (only if not already set)
|
||||
local function InitDisplayConfigs()
|
||||
for key, defaultValue in pairs(DEFAULT_DISPLAYS) do
|
||||
local sharedKey = "config_display_" .. key
|
||||
if not HasSharedData(sharedKey) then
|
||||
SetSharedData(sharedKey, tostring(defaultValue))
|
||||
end
|
||||
end
|
||||
print("[Admin Handlers] Display configs initialized")
|
||||
end
|
||||
|
||||
-- Initialize on load
|
||||
InitDisplayConfigs()
|
||||
|
||||
-- ============================================================================
|
||||
-- Helper Functions
|
||||
-- ============================================================================
|
||||
@@ -292,9 +337,13 @@ AMS.RegisterHandler("SHOW_WAYPOINTS", function(player, data)
|
||||
-- Clear any existing visualization first (fixes state after Clear All)
|
||||
pcall(function() creature:DevisualizeWaypointPath() end)
|
||||
|
||||
-- Get configurable display ID for waypoint markers
|
||||
local displayId = GetDisplayId("waypoint_marker")
|
||||
print("[Admin Handlers] SHOW_WAYPOINTS: Using displayId " .. tostring(displayId))
|
||||
|
||||
-- Visualize the path (spawns marker creatures at each waypoint)
|
||||
-- Pass player to inherit their phase (makes markers visible without GM mode)
|
||||
local success, err = pcall(function() return creature:VisualizeWaypointPath(player) end)
|
||||
-- Pass player to inherit their phase, and displayId for marker appearance
|
||||
local success, err = pcall(function() return creature:VisualizeWaypointPath(player, displayId) end)
|
||||
if not success then
|
||||
print("[Admin Handlers] SHOW_WAYPOINTS: Error calling VisualizeWaypointPath:", err)
|
||||
end
|
||||
@@ -755,8 +804,8 @@ AMS.RegisterHandler("SELECT_WAYPOINT", function(player, data)
|
||||
end
|
||||
|
||||
-- Highlight the new waypoint marker by changing its display
|
||||
-- Display IDs to try: 17519 (red orb), 17188 (blue orb), 26754 (green flame), 11686 (purple crystal)
|
||||
local highlightDisplayId = 17519 -- Red glowing orb - very visible
|
||||
-- Display ID is configurable via shared data (key: config_display_waypoint_highlight)
|
||||
local highlightDisplayId = GetDisplayId("waypoint_highlight")
|
||||
local success = HighlightWaypointMarker(player, pathId, nodeId, highlightDisplayId)
|
||||
|
||||
if success then
|
||||
@@ -815,6 +864,46 @@ AMS.RegisterHandler("GET_PLAYER_DATA", function(player, data)
|
||||
})
|
||||
end)
|
||||
|
||||
-- Set display config (for MCP to change waypoint marker appearance)
|
||||
-- Keys: waypoint_marker, waypoint_highlight, spawn_marker
|
||||
AMS.RegisterHandler("SET_DISPLAY_CONFIG", function(player, data)
|
||||
if not data or not data.key or not data.displayId then
|
||||
print("[Admin Handlers] SET_DISPLAY_CONFIG: Missing key or displayId")
|
||||
return
|
||||
end
|
||||
|
||||
local key = data.key
|
||||
local displayId = tonumber(data.displayId)
|
||||
|
||||
if not displayId then
|
||||
print("[Admin Handlers] SET_DISPLAY_CONFIG: Invalid displayId")
|
||||
return
|
||||
end
|
||||
|
||||
SetDisplayIdConfig(key, displayId)
|
||||
|
||||
print("[Admin Handlers] SET_DISPLAY_CONFIG: Set " .. key .. " = " .. displayId)
|
||||
AMS.Send(player, "DISPLAY_CONFIG_RESPONSE", {
|
||||
success = true,
|
||||
key = key,
|
||||
displayId = displayId,
|
||||
message = "Display config updated. Re-show waypoints to see changes."
|
||||
})
|
||||
end)
|
||||
|
||||
-- Get current display configs
|
||||
AMS.RegisterHandler("GET_DISPLAY_CONFIGS", function(player, data)
|
||||
local configs = {}
|
||||
for key, _ in pairs(DEFAULT_DISPLAYS) do
|
||||
configs[key] = GetDisplayId(key)
|
||||
end
|
||||
|
||||
AMS.Send(player, "DISPLAY_CONFIGS_RESPONSE", {
|
||||
success = true,
|
||||
configs = configs
|
||||
})
|
||||
end)
|
||||
|
||||
-- Teleport player to a waypoint location
|
||||
AMS.RegisterHandler("TELEPORT_TO_WAYPOINT", function(player, data)
|
||||
if not data or not data.x or not data.y or not data.z then
|
||||
|
||||
Reference in New Issue
Block a user