Add support for preset map coordinates
This commit is contained in:
		@@ -136,6 +136,7 @@ function lotj.infoPanel.createBasicStats(container)
 | 
				
			|||||||
  wireGaugeUpdate(manaGauge, "Char.Vitals.mana", "Char.Vitals.maxMana", "mn", "gmcp.Char.Vitals")
 | 
					  wireGaugeUpdate(manaGauge, "Char.Vitals.mana", "Char.Vitals.maxMana", "mn", "gmcp.Char.Vitals")
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  lotj.setup.registerEventHandler("gmcp.Char.Vitals", function()
 | 
					  lotj.setup.registerEventHandler("gmcp.Char.Vitals", function()
 | 
				
			||||||
 | 
					    if not gmcp.Char or not gmcp.Char.Vitals then return end
 | 
				
			||||||
    local totalSpace = lotj.layout.lowerInfoPanelHeight
 | 
					    local totalSpace = lotj.layout.lowerInfoPanelHeight
 | 
				
			||||||
    local manaMax = gmcp.Char.Vitals.maxMana or 0
 | 
					    local manaMax = gmcp.Char.Vitals.maxMana or 0
 | 
				
			||||||
    if manaMax > 0 then
 | 
					    if manaMax > 0 then
 | 
				
			||||||
@@ -357,6 +358,7 @@ end
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
-- Sets up timers to refresh the space tick counter
 | 
					-- Sets up timers to refresh the space tick counter
 | 
				
			||||||
function lotj.infoPanel.markSpaceTick()
 | 
					function lotj.infoPanel.markSpaceTick()
 | 
				
			||||||
 | 
					  local spaceStatFontSize = getFontSize()-1
 | 
				
			||||||
  for _, timerId in ipairs(lotj.infoPanel.spaceTickTimers or {}) do
 | 
					  for _, timerId in ipairs(lotj.infoPanel.spaceTickTimers or {}) do
 | 
				
			||||||
    killTimer(timerId)
 | 
					    killTimer(timerId)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,6 +116,8 @@ function lotj.mapper.mapCommand(input)
 | 
				
			|||||||
    lotj.mapper.shiftCurrentRoom(args)
 | 
					    lotj.mapper.shiftCurrentRoom(args)
 | 
				
			||||||
  elseif cmd == "save" then
 | 
					  elseif cmd == "save" then
 | 
				
			||||||
    lotj.mapper.saveMap()
 | 
					    lotj.mapper.saveMap()
 | 
				
			||||||
 | 
					  elseif cmd == "setroomcoords" then
 | 
				
			||||||
 | 
					    lotj.mapper.setRoomCoords(args)
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    lotj.mapper.logError("Unknown map command. Try <yellow>map help<reset>.")
 | 
					    lotj.mapper.logError("Unknown map command. Try <yellow>map help<reset>.")
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@@ -185,6 +187,18 @@ Deletes all data for an area. There's no confirmation and no undo!
 | 
				
			|||||||
Moves the current room in whichever direction you enter. Useful for adjusting placement of
 | 
					Moves the current room in whichever direction you enter. Useful for adjusting placement of
 | 
				
			||||||
rooms when you need to space them out.
 | 
					rooms when you need to space them out.
 | 
				
			||||||
]])
 | 
					]])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if gmcp.Char.Info.immLevel and gmcp.Char.Info.immLevel >= 102 then
 | 
				
			||||||
 | 
					    cecho([[
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<yellow>map setroomcoords <area name><reset>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<orange>(Staff Command)<reset> Assuming you are happy with your local copy of a map, sends commands to the
 | 
				
			||||||
 | 
					game to set the x/y/z coordinates of all rooms. (Requires the 'at' command.)
 | 
				
			||||||
 | 
					]])
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -280,6 +294,25 @@ function lotj.mapper.saveMap()
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function lotj.mapper.setRoomCoords(areaName)
 | 
				
			||||||
 | 
					  if not gmcp.Char.Info.immLevel or gmcp.Char.Info.immLevel < 102 then
 | 
				
			||||||
 | 
					    lotj.mapper.logError("This command only works for imm characters.")
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  local areaId = getAreaTable()[areaName]
 | 
				
			||||||
 | 
					  if not areaId then
 | 
				
			||||||
 | 
					    lotj.mapper.logError("Area not found by name "..areaName)
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  for _, roomId in ipairs(getAreaRooms(areaId)) do
 | 
				
			||||||
 | 
					    local x, y, z = getRoomCoordinates(roomId)
 | 
				
			||||||
 | 
					    send("at "..roomId.." redit xyz "..x.." "..y.." "..z)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
------------------------------------------------------------------------------
 | 
					------------------------------------------------------------------------------
 | 
				
			||||||
-- Event Handlers
 | 
					-- Event Handlers
 | 
				
			||||||
------------------------------------------------------------------------------
 | 
					------------------------------------------------------------------------------
 | 
				
			||||||
@@ -329,17 +362,30 @@ function lotj.mapper.handleSentCommand(event, cmd)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  local dir = dirObj(trim(cmd))
 | 
					  local dir = dirObj(trim(cmd))
 | 
				
			||||||
  if dir ~= nil then
 | 
					  if dir ~= nil then
 | 
				
			||||||
    lotj.mapper.lastMoveDir = dir
 | 
					    lotj.mapper.lastMoveDirs = lotj.mapper.lastMoveDirs or {}
 | 
				
			||||||
 | 
					    table.insert(lotj.mapper.lastMoveDirs, dir)
 | 
				
			||||||
 | 
					    lotj.mapper.logDebug("Pushed movement dir: "..dir.long)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function lotj.mapper.popMoveDir()
 | 
				
			||||||
 | 
					  if not lotj.mapper.lastMoveDirs or #lotj.mapper.lastMoveDirs == 0 then
 | 
				
			||||||
 | 
					    lotj.mapper.logDebug("Popped movement dir: nil")
 | 
				
			||||||
 | 
					    return nil
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  local result = table.remove(lotj.mapper.lastMoveDirs, 1)
 | 
				
			||||||
 | 
					  lotj.mapper.logDebug("Popped movement dir: "..result.long)
 | 
				
			||||||
 | 
					  return result
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Function used to handle a room that we've moved into. This will use the data on
 | 
					-- Function used to handle a room that we've moved into. This will use the data on
 | 
				
			||||||
-- lotj.mapper.current, compared with lotj.mapper.last, to potentially create a new room and
 | 
					-- lotj.mapper.current, compared with lotj.mapper.last, to potentially create a new room and
 | 
				
			||||||
-- link it with an exit on the previous room.
 | 
					-- link it with an exit on the previous room.
 | 
				
			||||||
function lotj.mapper.processCurrentRoom()
 | 
					function lotj.mapper.processCurrentRoom()
 | 
				
			||||||
  local vnum = lotj.mapper.current.vnum
 | 
					  local vnum = lotj.mapper.current.vnum
 | 
				
			||||||
  local moveDir = lotj.mapper.lastMoveDir
 | 
					  local moveDir = lotj.mapper.popMoveDir()
 | 
				
			||||||
  local room = lotj.mapper.getRoomByVnum(vnum)
 | 
					  local room = lotj.mapper.getRoomByVnum(vnum)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if lotj.mapper.mappingArea == nil and room == nil then
 | 
					  if lotj.mapper.mappingArea == nil and room == nil then
 | 
				
			||||||
@@ -371,14 +417,30 @@ function lotj.mapper.processCurrentRoom()
 | 
				
			|||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    -- Position the room relative to the room we came from
 | 
					    local lastRoomAtPresetCoords = false
 | 
				
			||||||
    if lastRoom ~= nil then
 | 
					    if lastRoom ~= nil then
 | 
				
			||||||
 | 
					      -- Figure out if our last room was positioned by ingame room settings.
 | 
				
			||||||
 | 
					      local lastX, lastY, lastZ = getRoomCoordinates(lotj.mapper.last.vnum)
 | 
				
			||||||
 | 
					      if lotj.mapper.last.x == lastX and
 | 
				
			||||||
 | 
					         lotj.mapper.last.y == lastY and
 | 
				
			||||||
 | 
					         lotj.mapper.last.z == lastZ then
 | 
				
			||||||
 | 
					        lastRoomAtPresetCoords = true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if lotj.mapper.current.x ~= nil and (not lastRoom or lastRoomAtPresetCoords) then
 | 
				
			||||||
 | 
					      -- This room has x/y/z set ingame and we're not coming from a lastRoom with
 | 
				
			||||||
 | 
					      -- a custom direction, so we should honor what the game said to use.
 | 
				
			||||||
 | 
					      setRoomCoordinates(vnum, lotj.mapper.current.x, lotj.mapper.current.y, lotj.mapper.current.z)
 | 
				
			||||||
 | 
					    elseif lastRoom ~= nil then
 | 
				
			||||||
 | 
					      -- Position the room relative to the room we came from
 | 
				
			||||||
      local lastX, lastY, lastZ = getRoomCoordinates(lotj.mapper.last.vnum)
 | 
					      local lastX, lastY, lastZ = getRoomCoordinates(lotj.mapper.last.vnum)
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
      -- If we recorded a valid movement command, use that direction to position this room
 | 
					      -- If we recorded a valid movement command, use that direction to position this room
 | 
				
			||||||
      if moveDir ~= nil then
 | 
					      if moveDir ~= nil then
 | 
				
			||||||
        local dx, dy, dz = unpack(moveDir.xyzDiff)
 | 
					        local dx, dy, dz = unpack(moveDir.xyzDiff)
 | 
				
			||||||
 | 
					        lotj.mapper.log("Positioning new room "..moveDir.long.." of the previous room based on movement command.")
 | 
				
			||||||
        setRoomCoordinates(vnum, lastX+dx, lastY+dy, lastZ+dz)
 | 
					        setRoomCoordinates(vnum, lastX+dx, lastY+dy, lastZ+dz)
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        -- We didn't have a valid movement command but we still changed rooms, so try to guess
 | 
					        -- We didn't have a valid movement command but we still changed rooms, so try to guess
 | 
				
			||||||
@@ -494,6 +556,13 @@ function lotj.mapper.onEnterRoom()
 | 
				
			|||||||
    planet = gmcp.Room.Info.planet,
 | 
					    planet = gmcp.Room.Info.planet,
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -- This room has coordinates set in the game which we should use.
 | 
				
			||||||
 | 
					  if gmcp.Room.Info.x ~= nil then
 | 
				
			||||||
 | 
					    lotj.mapper.current.x = gmcp.Room.Info.x
 | 
				
			||||||
 | 
					    lotj.mapper.current.y = gmcp.Room.Info.y
 | 
				
			||||||
 | 
					    lotj.mapper.current.z = gmcp.Room.Info.z
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  -- If the new room has has a planet different than the last one and we don't have
 | 
					  -- If the new room has has a planet different than the last one and we don't have
 | 
				
			||||||
  -- an area for that planet yet, give a prompt about how to start mapping it.
 | 
					  -- an area for that planet yet, give a prompt about how to start mapping it.
 | 
				
			||||||
  if lotj.mapper.current.planet then
 | 
					  if lotj.mapper.current.planet then
 | 
				
			||||||
@@ -507,10 +576,6 @@ function lotj.mapper.onEnterRoom()
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  lotj.mapper.processCurrentRoom()
 | 
					  lotj.mapper.processCurrentRoom()
 | 
				
			||||||
 | 
					 | 
				
			||||||
  -- Since we've handled the move, we don't want the last move command to get
 | 
					 | 
				
			||||||
  -- used by anything else.
 | 
					 | 
				
			||||||
  lotj.mapper.lastMoveDir = nil
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,17 +6,17 @@ local function starts_with(str, start)
 | 
				
			|||||||
   return str:sub(1, #start) == start
 | 
					   return str:sub(1, #start) == start
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if starts_with(line, "Use SHOWPLANET for more information.") then
 | 
					-- After all the planets there's a blank line
 | 
				
			||||||
 | 
					if line == "" then
 | 
				
			||||||
  lotj.galaxyMap.enqueuePendingRefreshCommands()
 | 
					  lotj.galaxyMap.enqueuePendingRefreshCommands()
 | 
				
			||||||
  return
 | 
					  return
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
line = line:gsub("%(UFG%)", "")
 | 
					 | 
				
			||||||
line = line:gsub("  +", ";")
 | 
					line = line:gsub("  +", ";")
 | 
				
			||||||
local startIdx, _, planet, system, gov, support, military = line:find("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)")
 | 
					local startIdx, _, planet, system, gov, notices = line:find("([^;]+);([^;]+);([^;]+);([^;]+)")
 | 
				
			||||||
if not startIdx then
 | 
					if not startIdx then
 | 
				
			||||||
  gov = "None"
 | 
					  gov = "None"
 | 
				
			||||||
  startIdx, _, planet, system, support, military = line:find("([^;]+);([^;]+);([^;]+);([^;]+)")
 | 
					  startIdx, _, planet, system, notices = line:find("([^;]+);([^;]+);([^;]+)")
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
if not startIdx then
 | 
					if not startIdx then
 | 
				
			||||||
  echo("\n")
 | 
					  echo("\n")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
        "fireLength": 1,
 | 
					        "fireLength": 1,
 | 
				
			||||||
        "patterns": [
 | 
					        "patterns": [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "pattern": "Planet\\s+Starsystem\\s+Governed By\\s+Opinion\\s+Military",
 | 
					            "pattern": "Planet\\s+Starsystem\\s+Governed By\\s+Notices",
 | 
				
			||||||
            "type": "regex"
 | 
					            "type": "regex"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,5 +8,35 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "script": "lotj.mapper.checkAmenityLine(matches[2], matches[3])"
 | 
					    "script": "lotj.mapper.checkAmenityLine(matches[2], matches[3])"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "invalid-dir",
 | 
				
			||||||
 | 
					    "patterns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "pattern": "^Alas, you cannot go that way.$",
 | 
				
			||||||
 | 
					        "type": "regex"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "pattern": "^The .* is closed.$",
 | 
				
			||||||
 | 
					        "type": "regex"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "pattern": "^You can't go that way,",
 | 
				
			||||||
 | 
					        "type": "regex"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "pattern": "^You can't do that sitting down.$",
 | 
				
			||||||
 | 
					        "type": "regex"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "pattern": "^Nah... You feel too relaxed...$",
 | 
				
			||||||
 | 
					        "type": "regex"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "pattern": "^In your dreams, or what\\?$",
 | 
				
			||||||
 | 
					        "type": "regex"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "script": "lotj.mapper.popMoveDir()"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user