rendered paste body/* Hello World */
objectdef oMapper inherits oBase
{
variable string ConfigDir = "${Script.CurrentDirectory}/map/"
variable string ConfigFile = "map.xml"
variable lnavregionref CurrentZone
variable lnavregionref PreviousZone
variable lnavregionref CurrentRegion
variable lnavregionref PreviousRegion
variable int LastMapRend = ${LavishScript.RunningTime}
variable oTopography Topography
variable bool MappingDisabled = TRUE
variable bool MapPathway = FALSE
variable bool MapPathwayReverse = FALSE
variable bool MapPathwayOld = FALSE
variable bool FOUND = FALSE
variable objectref MyElevator
variable float el_X
variable float el_Y
variable float el_TZ
variable float el_BZ
variable float el_TEX
variable float el_TEY
variable float el_TEZ
variable float el_BEX
variable float el_BEY
variable float el_BEZ
method Initialize()
{
LavishSettings:AddSet[Instances]
LavishSettings[Instances]:Import["config/instances.xml"]
GreyNav:InitializeNavSystem[c:\\temp\\navdata\\navregions3d]
GreyNav:LoadContinentXml[c:\\temp\\navdata\\navregions3d\\ContinentDB.xml]
GreyNav:RegisterContinent[530, Expansion01]
GreyNav:LoadMacroPathContinent[530, c:\\temp\\navdata\\navregions3d\\Expansion01_MacroPath_NavRegions.bin2]
}
method OnGUIChange()
{
This.MappingDisabled:Set[${UIElement[chkMappingOff@Overview@Pages@openbot].Checked}]
This.MapPathway:Set[${UIElement[chkMapPathway@Overview@Pages@openbot].Checked}]
This.MapPathwayReverse:Set[${UIElement[chkMapPathwayReverse@Overview@Pages@openbot].Checked}]
}
/* moved map loading out of intialize to allow LSO setting to load */
method LoadMapper()
{
This:Output["Starting Mapping System"]
This:Load
This:ZoneChanged
}
method Shutdown()
{
This:Output["Shutting down"]
This:Save
LavishSettings[Instances]:Export["config/instances.xml"]
GreyNav:FinalizeNavSystem
}
method ZoneChanged()
{
if !${LNavRegion[${This.ZoneText}](exists)}
{
LavishSettings[Instances]:AddSetting[${This.ZoneText},1]
LNavRegion[${This.Continent}]:AddChild[universe,${This.ZoneText},-unique]
}
PreviousZone:Set[${CurrentZone}]
CurrentZone:SetRegion[${LNavRegion[${This.ZoneText}].FQN}]
}
method Save1()
{
This:Debug["Saving Map file ${ConfigDir}${ConfigFile}"]
LNavRegion[Azeroth]:Export[-lso,"${ConfigDir}new${ConfigFile}"]
This:Debug["Saved"]
}
method BackupZone()
{
variable bool UseLSO = ${Config.Xboxx.Element["chkLSOFormat"]}
if ${UseLSO}
{
LNavRegion[${This.ZoneText}]:Export[-lso,${ConfigDir}/bak/${This.ZoneText}]
}
else
{
LNavRegion[${This.ZoneText}]:Export[${ConfigDir}/bak/${This.ZoneText}]
}
}
method Save()
{
variable string Continent
variable int INDEX_Continent
variable string Zone
variable int INDEX_Zone
variable bool UseLSO = ${Config.Xboxx.Element["chkLSOFormat"]}
variable iterator InstanceIterator
; Save Instance Files
LavishSettings[Instances]:GetSettingIterator[InstanceIterator]
if ${InstanceIterator:First(exists)}
{
do
{
if ${UseLSO}
{
LNavRegion[${InstanceIterator.Key}]:Export[-lso,${ConfigDir}/Instances/${InstanceIterator.Key}]
}
else
{
LNavRegion[${InstanceIterator.Key}]:Export[${ConfigDir}/Instances/${InstanceIterator.Key}]
}
}
while ${InstanceIterator:Next(exists)}
}
INDEX_Continent:Set[1]
do
{
Continent:Set[${WoWScript[GetMapContinents(),${INDEX_Continent}]}]
INDEX_Zone:Set[1]
do
{
Zone:Set[${WoWScript[GetMapZones(${INDEX_Continent}),${INDEX_Zone}]}]
if ${UseLSO}
{
LNavRegion[${Zone}]:Export[-lso,${ConfigDir}${Zone}]
}
else
{
LNavRegion[${Zone}]:Export[${ConfigDir}${Zone}]
}
INDEX_Zone:Inc
}
while ${WoWScript[GetMapZones(${INDEX_Continent}),${INDEX_Zone}](exists)}
INDEX_Continent:Inc
}
while ${WoWScript[GetMapContinents(),${INDEX_Continent}](exists)}
}
method Load()
{
variable string Continent
variable int INDEX_Continent
variable string Zone
variable int INDEX_Zone
variable lnavregionref LoadZoneRegion
variable lnavregionref LoadedZoneRegion
variable bool UseLSO = ${Config.Xboxx.Element["chkLSOFormat"]}
;Clear out the map information
LavishNav:Clear
; Add tree structure for the loading
This:InitializeRegions
;Add in a default Intance as a catch all for any zone we dont know about
LoadZoneRegion:SetRegion[${LavishNav.FindRegion["Instance"].FQN}]
LoadedZoneRegion:SetRegion[${LoadZoneRegion.Parent}]
echo "Loading ${Zone} into ${LoadedZoneRegion.FQN} P: ${LoadedZoneRegion.Parent.FQN}"
variable iterator InstanceIterator
; Load Instance Files
LavishSettings[Instances]:GetSettingIterator[InstanceIterator]
if ${InstanceIterator:First(exists)}
{
do
{
if ${UseLSO}
{
LNavRegion[Instance]:Import[-lso,${ConfigDir}Instances/${InstanceIterator.Key}]
}
else
{
LNavRegion[Instance]:Import[${ConfigDir}Instances/${InstanceIterator.Key}]
}
}
while ${InstanceIterator:Next(exists)}
}
INDEX_Continent:Set[1]
do
{
Continent:Set[${WoWScript[GetMapContinents(),${INDEX_Continent}]}]
INDEX_Zone:Set[1]
do
{
Zone:Set[${WoWScript[GetMapZones(${INDEX_Continent}),${INDEX_Zone}]}]
LoadZoneRegion:SetRegion[${LavishNav.FindRegion[${Zone}].FQN}]
LoadedZoneRegion:SetRegion[${LoadZoneRegion.Parent}]
if ${UseLSO}
{
LoadedZoneRegion:Import[-lso,"${ConfigDir}${Zone}"]
}
else
{
LoadedZoneRegion:Import["${ConfigDir}${Zone}"]
}
INDEX_Zone:Inc
}
while ${WoWScript[GetMapZones(${INDEX_Continent}),${INDEX_Zone}](exists)}
INDEX_Continent:Inc
}
while ${WoWScript[GetMapContinents(),${INDEX_Continent}](exists)}
}
method InitializeRegions()
{
variable string Continent
variable int INDEX_Continent
variable string Zone
variable int INDEX_Zone
This:Output["Initializing Regions"]
LavishNav.Tree:AddChild[universe,Azeroth,-unique]
;Add in a default Intance as a catch all for any zone we dont know about
LNavRegion[Azeroth]:AddChild[universe,"Instance",-unique,-coordinatesystem]
INDEX_Continent:Set[1]
do
{
Continent:Set[${WoWScript[GetMapContinents(),${INDEX_Continent}]}]
LNavRegion[Azeroth]:AddChild[universe,${Continent},-unique,-coordinatesystem]
INDEX_Zone:Set[1]
do
{
Zone:Set[${WoWScript[GetMapZones(${INDEX_Continent}),${INDEX_Zone}]}]
LNavRegion[${Continent}]:AddChild[universe,${Zone},-unique]
INDEX_Zone:Inc
}
while ${WoWScript[GetMapZones(${INDEX_Continent}),${INDEX_Zone}](exists)}
INDEX_Continent:Inc
}
while ${WoWScript[GetMapContinents(),${INDEX_Continent}](exists)}
}
method Pulse()
{
This.PreviousRegion:SetRegion[${This.CurrentRegion}]
This.CurrentRegion:SetRegion[${This.CurrentZone.BestContainer[${Me.Location}].ID}]
if (${This.CurrentZone.ID} != ${LNavRegion[${This.ZoneText}].ID})
{
This:Output["Zone Changed Updating!"]
This:ZoneChanged
}
; Do we have this mapped? If not map it
if !${This.IsMapped[${Me.Location}]} && !${Me.Flying} && !${This.Falling} && ${Topography.IsFlat}
{
This:MapLocation[${Me.Location}]
}
if ${This.MapPathway} != ${This.MapPathwayOld}
{
This.MapPathwayOld:Set[${This.MapPathway}]
if ${This.MapPathway}
{
variable guidlist list
variable int Index = 0
variable objectref o
list:Search[-gameobjects]
while ${list.GUID[${Index:Inc}](exists)} && !${This.FOUND}
{
o:Set[${list.GUID[${Index}]}]
if ${o.SubType.Equal[Transport]}
{
if ${Math.Calc[${o.X} - ${Me.X}]} < 10 && ${Math.Calc[${o.X} - ${Me.X}]} > -10 && ${Math.Calc[${o.Y} - ${Me.Y}]} < 10 && ${Math.Calc[${o.Y} - ${Me.Y}]} > -10
{
This.MyElevator:Set[${list.GUID[${Index}]}]
This.FOUND:Set[TRUE]
This:Output[START Creating Pathway for Transport: ${This.MyElevator.Name} ${This.MyElevator.GUID}]
This.el_TZ:Set[${o.Z}]
This.el_BZ:Set[${o.Z}]
This.el_X:Set[${o.X}]
This.el_Y:Set[${o.Y}]
This.el_TEX:Set[${Me.X}]
This.el_TEY:Set[${Me.Y}]
This.el_TEZ:Set[${Me.Z}]
This.el_BEX:Set[${Me.X}]
This.el_BEY:Set[${Me.Y}]
This.el_BEZ:Set[${Me.Z}]
}
}
}
}
else
{
if ${This.FOUND}
{
This:Output[FINISHED Creating Pathway for Transport: ${This.MyElevator.Name} ${This.MyElevator.GUID}]
if ${Me.Z} > ${This.el_TEZ}
{
This:Output[You went from Bottom to Top]
This.el_TEX:Set[${Me.X}]
This.el_TEY:Set[${Me.Y}]
This.el_TEZ:Set[${Me.Z}]
}
else
{
This:Output[You went from Top to Bottom]
This.el_BEX:Set[${Me.X}]
This.el_BEY:Set[${Me.Y}]
This.el_BEZ:Set[${Me.Z}]
}
Navigator:TransportMapped[${This.MyElevator.GUID}, ${This.el_X}, ${This.el_Y}, ${This.el_TZ}, ${This.el_BZ}, ${This.el_TEX}, ${This.el_TEY}, ${This.el_TEZ}, ${This.el_BEX}, ${This.el_BEY}, ${This.el_BEZ}]
This.FOUND:Set[FALSE]
This.MyElevator:Set[NULL]
}
}
}
else
{
if ${This.FOUND}
{
if ${MyElevator.Z} > ${This.el_TZ}
{
This.el_TZ:Set[${MyElevator.Z}]
}
if ${MyElevator.Z} < ${This.el_BZ}
{
This.el_BZ:Set[${MyElevator.Z}]
}
}
}
if ${CurrentRegion.FQN.NotEqual[${PreviousRegion.FQN}]}
{
if ${This.MapPathway}
{
This:Output["Marking Preferred Path from ${CurrentRegion.FQN} to ${PreviousRegion.FQN}"]
PreviousRegion.GetConnection[${CurrentRegion.FQN}]:SetDistance[1]
}
if ${This.PathwayReverse}
{
This:Output["Marking Preferred Path (reverse) from ${PreviousRegion.FQN} to ${CurrentRegion.FQN}"]
CurrentRegion.GetConnection[${PreviousRegion.FQN}]:SetDistance[1]
}
}
if ${Math.Calc[${LavishScript.RunningTime} - ${This.LastMapRend}]} > 100
{
MapEditor:MapRend
}
; Add in additional mapping items here
}
variable int LastFell = 0
member Falling()
{
if ${Me.Falling}
{
This.LastFell:Set[${LavishScript.RunningTime}]
return TRUE
}
if ${Math.Calc[${LavishScript.RunningTime}-${This.LastFell}]} < 1000
{
return TRUE
}
return FALSE
}
member IsMapped(float X, float Y, float Z)
{
if (${This.CurrentZone.ID} == ${This.CurrentRegion.ID})
{
return FALSE
}
return TRUE
}
method MapLocation(float X, float Y, float Z)
{
variable float X1
variable float X2
variable float Y1
variable float Y2
variable float Z1
variable float Z2
variable string RegionName
; Dont map if we are flying (On a flight path)
if ${Me.Flying} || ${This.MappingDisabled}
{
return
}
X1:Set[${Math.Calc[${X}-2.5]}]
X2:Set[${Math.Calc[${X}+2.5]}]
Y1:Set[${Math.Calc[${Y}-2.5]}]
Y2:Set[${Math.Calc[${Y}+2.5]}]
Z1:Set[${Math.Calc[${Z}-3]}]
Z2:Set[${Math.Calc[${Z}+3]}]
RegionName:Set["${CurrentZone.FQN}${Time.Timestamp}${CurrentZone.ChildCount}"]
CurrentZone:AddChild[box,${RegionName},-unique,${X1},${X2},${Y1},${Y2},${Z1},${Z2}]
This:Output["Area not found, Mapping! Added (${RegionName} ${X}, ${Y}, ${Z}"]
;Connect To Previous and Current
This:ConnectNeighbours[${RegionName}]
}
method ConnectNeighbours(string RegionName)
{
variable index:lnavregionref SurroundingRegions
variable int RegionsFound
variable int Shouldconnect = 0
variable int Index = 1
variable int Connected_To = 0
variable int Connected_From = 0
CurrentRegion:SetRegion[${RegionName}]
if ${This.ShouldConnect[${CurrentRegion.FQN},${PreviousRegion.FQN}]}
{
This:Debug["Connecting ${CurrentRegion.FQN} to ${PreviousRegion.FQN}"]
Region:Connect[${PreviousRegion.FQN}]
}
if ${This.ShouldConnect[${PreviousRegion.FQN},${CurrentRegion.FQN}]}
{
This:Debug["Connecting ${PreviousRegion.FQN} to ${CurrentRegion.FQN}"]
PreviousRegion:Connect[${CurrentRegion.FQN}]
}
; Need to add in Connect to Previous spot to current spot and current spot to previous spot if no collisions
; Scan all descendants within 5 feet of this area
RegionsFound:Set[${CurrentZone.ChildrenWithin[SurroundingRegions,10,${CurrentRegion.CenterPoint.X},${CurrentRegion.CenterPoint.Y},${CurrentRegion.CenterPoint.Z}]}]
if ${RegionsFound} > 0
{
do
{
if ${This.ShouldConnect[${CurrentRegion.FQN},${SurroundingRegions.Get[${Index}].FQN}]} && ${This.ShouldConnect[${SurroundingRegions.Get[${Index}].FQN},${CurrentRegion.FQN}]}
{
Connected_To:Inc
Connected_From:Inc
CurrentRegion:Connect[${SurroundingRegions.Get[${Index}].FQN}]
SurroundingRegions.Get[${Index}]:Connect[${CurrentRegion.FQN}]
}
}
while ${SurroundingRegions.Get[${Index:Inc}](exists)}
This:Output["Connections TO: ${Connected_To} and From: ${Connected_From}"]
}
}
member ShouldConnect(string RegionA, string RegionB)
{
variable lnavregionref RegionRefA
variable lnavregionref RegionRefB
if !${RegionA(exists)} || !${RegionB(exists)}
{
return FALSE
}
; If they are the same Region.. Dont connect them
if ${RegionA.Equal[${RegionB}]}
{
return FALSE
}
RegionRefA:SetRegion[${RegionA}]
RegionRefB:SetRegion[${RegionB}]
if !${This.RegionsIntersect[${RegionA},${RegionB}]}
{
return FALSE
}
if ${This.MapPathway}
{
if (${Math.Calc[${RegionRefA.CenterPoint.X} - ${RegionRefB.CenterPoint.X}]} == 0) && (${Math.Calc[${RegionRefA.CenterPoint.Y} - ${RegionRefB.CenterPoint.Y}]} == 0)
{
echo "Pathway, Moving vertically -- Go Go Map it !"
return TRUE
}
if !${This.CollisionTest[${RegionRefA.CenterPoint.X}, ${RegionRefA.CenterPoint.Y}, ${RegionRefA.CenterPoint.Z}, ${RegionRefB.CenterPoint.X}, ${RegionRefB.CenterPoint.Y}, ${RegionRefB.CenterPoint.Z}]}
{
echo "Pathway (smooth way) -- Go Go Map it !"
return TRUE
}
if !${This.CollisionTest[${RegionRefA.CenterPoint.X}, ${RegionRefA.CenterPoint.Y}, ${Math.Calc[${RegionRefA.CenterPoint.Z}+1.6]}, ${RegionRefB.CenterPoint.X}, ${RegionRefB.CenterPoint.Y}, ${Math.Calc[${RegionRefA.CenterPoint.Z}+1.6]}]}
{
echo "Pathway (rough way) -- Go Go Map it !"
return TRUE
}
}
if ${This.CollisionTest[${RegionRefA.CenterPoint.X}, ${RegionRefA.CenterPoint.Y}, ${RegionRefA.CenterPoint.Z}, ${RegionRefB.CenterPoint.X}, ${RegionRefB.CenterPoint.Y}, ${RegionRefB.CenterPoint.Z}]}
{
echo "Something in da way ! -- Not Connected"
return FALSE
}
if ${Topography.IsSteep[${RegionRefA.CenterPoint.X}, ${RegionRefA.CenterPoint.Y}, ${RegionRefA.CenterPoint.Z}, ${RegionRefB.CenterPoint.X}, ${RegionRefB.CenterPoint.Y}, ${RegionRefB.CenterPoint.Z}]}
{
echo "Too Fucking Steep! -- Not Connected"
return FALSE
}
return TRUE
}
member CollisionTest(float FromX, float FromY, float FromZ, float ToX, float ToY, float ToZ)
{
return ${Me.IsPathObstructed[${FromX},${FromY},${FromZ},20,${ToX},${ToY},${ToZ}]}
}
member RegionsIntersect(string RegionA, string RegionB)
{
variable lnavregionref RA
variable lnavregionref RB
RA:SetRegion[${RegionA}]
RB:SetRegion[${RegionB}]
if ${RA.Type.NotEqual["Box"]} || ${RB.Type.NotEqual["Box"]}
{
return FALSE
}
; Check Distance between if > 10 then it shouldnt connect
if ${Math.Distance[${RA.CenterPoint.X}, ${RA.CenterPoint.Y}, ${RB.CenterPoint.X}, ${RB.CenterPoint.Y}]}>10
{
return FALSE
}
return TRUE
}
member SubZoneText()
{
return ${ISXWoW.MinimapZoneText}
}
member ZoneText()
{
return ${ISXWoW.RealZoneText}
}
member Continent()
{
if ${WoWScript[IsInInstance(), 1]}
{
return "Instance"
}
WoWScript SetMapToCurrentZone()
if ${WoWScript[GetMapContinents(),${WoWScript[GetCurrentMapContinent()]}](exists)}
{
return ${WoWScript[GetMapContinents(),${WoWScript[GetCurrentMapContinent()]}]}
}
return "Instance"
}
method MapRend()
{
variable index:lnavregionref Regions
variable lnavregionref R
variable int Idx = 1
if !${UIElement["MapGUI"].Visible}
{
return
}
UIElement[rend@MapGUI]:SetMapSize[15,15]
UIElement[rend@MapGUI]:SetOrigin[${Me.X},${Me.Y},${Me.Z}]
UIElement[rend@MapGUI]:SetRotation[${Me.Heading}]
if ${This.CurrentZone.DescendantsWithin[Regions,25,${Me.X},${Me.Y},${Me.Z}]}
{
do
{
R:SetRegion[${Regions.Get[${Idx}].FQN}]
UIElement[rend@MapGUI]:AddBlip[${R.Name},${R.CenterPoint.X},${Math.Calc[((${R.CenterPoint.Y}-${Me.Y}) * -1) + ${Me.Y}]},${R.CenterPoint.Z},2,${R.Name},"mapped_blip",""]
This.LastMapRend:Set[${LavishScript.RunningTime}]
}
while ${Idx:Inc} <= ${Regions.Used}
}
UIElement[rend@MapGUI]:AddBlip[${Me.Name},${Me.X},${Me.Y},${Me.Z},2,${Me.Name},"me_blip",""]
}
}
objectdef oTopography inherits oBase
{
variable point3f TempLoc
variable int SlopeCheck = ${LavishScript.RunningTime}
method UpdateTemp()
{
if ${Math.Calc[${LavishScript.RunningTime}-${This.SlopeCheck}]} > 500
{
This.TempLoc:Set[${Me.X},${Me.Y},${Me.Z}]
This.SlopeCheck:Set[${LavishScript.RunningTime}]
}
}
member IsFlat()
{
if ${This.IsSteep[${This.TempLoc.X},${This.TempLoc.Y},${This.TempLoc.Z},${Me.X},${Me.Y},${Me.Z}]}
{
This:Debug["LIKE THE CLIFFS OF DOVER!!!!!!!"]
This:UpdateTemp
return FALSE
}
This:UpdateTemp
return TRUE
}
/* check slope to determine if two points should connect - assumes anything more than 45 degrees is impassable */
member IsSteep(float FromX, float FromY, float FromZ, float ToX, float ToY, float ToZ)
{
/* determine horizontal distance and vertical distance between points */
variable float slope = 0
variable float maxslope = 0.8
variable float horizontal = ${Math.Distance[${FromX}, ${FromY}, ${ToZ},${ToX}, ${ToY},${ToZ}]}
variable float vertical = ${Math.Distance[${ToX}, ${ToY}, ${FromZ}, ${ToX}, ${ToY}, ${ToZ}]}
/* did we move? */
if ${horizontal} < 1.5
{
return FALSE
}
/* adjust for greater distance */
if ${horizontal} > 5
{
maxslope:Set[0.65]
}
/* calculate slope by dividing vertical distance by horizontal */
slope:Set[${vertical}/${horizontal}]
/* if slope is greater than 1, the slope is greater than a 45 degree angle - lets not map it */
if ${slope} > ${maxslope}
{
return TRUE
}
return FALSE
}
}