rendered paste body#define MAPPER_NONE 0
#define MAPPER_MAP 1
objectdef oMapper inherits oBase
{
variable string ConfigDir = "c:/program files/innerspace/scripts/bytebot/map/"
variable int CurrentState = 0
variable point3f CurrentLocation
variable lnavregionref CurrentZone
variable lnavregionref CurrentSubZone
variable lnavregionref CurrentRegion
member SubZoneText()
{
return ${WoWScript[GetMinimapZoneText()]}
}
member ZoneText()
{
return ${WoWScript[GetRealZoneText()]}
}
member Continent()
{
WoWScript SetMapToCurrentZone()
if ${WoWScript[GetMapContinents(),${WoWScript[GetCurrentMapContinent()]}](exists)}
{
return ${WoWScript[GetMapContinents(),${WoWScript[GetCurrentMapContinent()]}]}
}
}
method InitializeRegions()
{
variable string Continent
variable int IdxContinent
variable string Zone
variable int IdxZone
if ${LNavRegion[Azeroth](exists)}
{
LNavRegion[Azeroth]:Remove
}
LavishNav.Tree:AddChild[universe,Azeroth,-unique]
IdxContinent:Set[1]
do
{
Continent:Set[${WoWScript[GetMapContinents(),${IdxContinent}]}]
LNavRegion[Azeroth]:AddChild[universe,${Continent},-unique,-coordinatesystem]
IdxZone:Set[1]
do
{
Zone:Set[${WoWScript[GetMapZones(${IdxContinent}),${IdxZone}]}]
LNavRegion[${Continent}]:AddChild[universe,${Zone},-unique]
IdxZone:Inc
}
while ${WoWScript[GetMapZones(${IdxContinent}),${IdxZone}](exists)}
IdxContinent:Inc
}
while ${WoWScript[GetMapContinents(),${IdxContinent}](exists)}
}
method Save()
{
variable lnavregionref CurrentContinent
variable lnavregionref CurrentZone
;-lso first
if ${LNavRegion[Azeroth].Children(exists)}
{
CurrentContinent:SetRegion[${LNavRegion[Azeroth].Children}]
do
{
if ${CurrentContinent.Children(exists)}
{
CurrentZone:SetRegion[${CurrentContinent.Children}]
do
{
if ${CurrentZone.ChildCount} > 0
{
CurrentZone:Export[-lso,"${This.ConfigDir}${CurrentContinent.Name}.${CurrentZone.Name}.lso"]
}
CurrentZone:SetRegion[${CurrentZone.Next}]
}
while ${CurrentZone.Region(exists)}
}
CurrentContinent:SetRegion[${CurrentContinent.Next}]
}
while ${CurrentContinent.Region(exists)}
}
}
method LoadZone(string Continent, string ZoneName)
{
variable filepath Dir = "${ConfigDir}"
variable lnavregionref ZoneRef
ZoneRef:SetRegion[${ZoneName}]
if ${Dir.FileExists["${Continent}.${ZoneRef.Name}.lso"]} && ${ZoneRef.ChildCount} <= 1
{
ZoneRef:Import[-lso,"${This.ConfigDir}${Continent}.${ZoneRef.Name}.lso"]
This:Debug["Importing file: ${Continent}.${ZoneRef.Name}.lso"]
}
}
/*
*
*
*
*
*/
method Map()
{
variable point3f C1
variable point3f C2
variable int ConnectionCount
variable string PointName
C1.X:Set[${This.CurrentLocation.X}]
C1.Y:Set[${This.CurrentLocation.Y}]
C1.Z:Set[${This.CurrentLocation.Z} - 0.1]
C2.X:Set[${This.CurrentLocation.X}]
C2.Y:Set[${This.CurrentLocation.Y}]
C2.Z:Set[${This.CurrentLocation.Z} + 0.1]
do
{
C1.X:Dec
C2.X:Inc
C1.Y:Dec
C2.Y:Inc
}
while !${This.BoxObstructed[${C1.X},${C1.Y},${C1.Z},${C2.X},${C2.Y},${C2.Z},FALSE]} && ${Math.Distance[${C1.X},${C2.X}]} < 16
C1.X:Inc
C2.X:Dec
C1.Y:Inc
C2.Y:Dec
do
{
C2.Z:Set[${Math.Calc[${C2.Z} + 1]}]
}
while !${This.BoxObstructed[${C1.X},${C1.Y},${C1.Z},${C2.X},${C2.Y},${C2.Z},FALSE]} && ${Math.Distance[${C1.Z},${C2.Z}]} < 16
C2.Z:Set[${Math.Calc[${C2.Z} - 1]}]
do
{
C1.Z:Set[${Math.Calc[${C1.Z} - 0.1]}]
}
while !${This.BoxObstructed[${C1.X},${C1.Y},${C1.Z},${C2.X},${C2.Y},${C2.Z},FALSE]} && ${Math.Distance[${C1.Z},${C2.Z}]} < 16
C1.Z:Set[${Math.Calc[${C1.Z} + 0.1]}]
if ${Math.Distance[${C1.X},${C2.X}]} > 0
{
PointName:Set["${This.CurrentSubZone.FQN}-${This.CurrentSubZone.ChildCount}"]
This.CurrentSubZone:AddChild[box, ${PointName}, -unique, ${C1.X}, ${C2.X}, ${C1.Y}, ${C2.Y}, ${C1.Z}, ${C2.Z}]
ConnectionCount:Set[${This.ConnectNeighbours[${PointName}]}]
This:Debug["Region Added: ${PointName} ${Math.Distance[${C1.X},${C2.X}]} ${Math.Distance[${C1.Y},${C2.Y}]} ${Math.Distance[${C1.Z},${C2.Z}]}, ${ConnectionCount} connections"]
if ${ConnectionCount} == 0
{
; WoWScript message("${PointName} has 0 connections")
}
}
}
member BoxObstructed(float X1, float Y1, float Z1, float X2, float Y2, float Z2, bool Contents = FALSE)
{
variable float MiddleX
variable float MiddleY
if ${Contents}
{
if ${X1} > ${X2}
{
MiddleX:Set[${Math.Calc[(${X1} - ${X2}) / 2]}]
MiddleX:Set[${Math.Calc[${MiddleX} + ${X2}]}]
}
else
{
MiddleX:Set[${Math.Calc[(${X2} - ${X1}) / 2]}]
MiddleX:Set[${Math.Calc[${MiddleX} + ${X1}]}]
}
if ${Y1} > ${Y2}
{
MiddleY:Set[${Math.Calc[(${Y1} - ${Y2}) / 2]}]
MiddleY:Set[${Math.Calc[${MiddleY} + ${Y2}]}]
}
else
{
MiddleY:Set[${Math.Calc[(${Y2} - ${Y1}) / 2]}]
MiddleY:Set[${Math.Calc[${MiddleY} + ${Y1}]}]
}
if ${This.CollisionTest[${X1},${Y1},${Z1},${X2},${Y2},${Z2}]}
{
return TRUE
}
if ${This.CollisionTest[${X1},${Y2},${Z1},${X2},${Y1},${Z2}]}
{
return TRUE
}
if ${This.CollisionTest[${MiddleX},${Y1},${Z1},${MiddleX},${Y2},${Z2}]}
{
return TRUE
}
if ${This.CollisionTest[${X1},${MiddleY},${Z1},${X2},${MiddleY},${Z2}]}
{
return TRUE
}
}
if ${This.CollisionTest[${X1},${Y1},${Z1},${X2},${Y1},${Z2}]}
{
return TRUE
}
if ${This.CollisionTest[${X1},${Y2},${Z1},${X2},${Y2},${Z2}]}
{
return TRUE
}
if ${This.CollisionTest[${X1},${Y1},${Z1},${X1},${Y2},${Z2}]}
{
return TRUE
}
if ${This.CollisionTest[${X2},${Y1},${Z1},${X2},${Y2},${Z2}]}
{
return TRUE
}
return FALSE
}
member CollisionTest(float FromX, float FromY, float FromZ, float ToX, float ToY, float ToZ)
{
return ${Me.IsPathObstructed[${ToX},${ToY},${ToZ},999,${FromX}, ${FromY}, ${FromZ}]}
}
member ConnectNeighbours(string RegionName)
{
variable index:lnavregionref SurroundingRegions
variable lnavregionref Region
variable int RegionsFound
variable int Index = 1
variable int ConnectionCount = 0
Region:SetRegion[${RegionName}]
RegionsFound:Set[${LNavRegion[${This.Continent}].DescendantsWithin[SurroundingRegions,${Math.Calc[${Math.Distance[${Region.X1},${Region.X2}]} * 2]},${Region.CenterPoint.X},${Region.CenterPoint.Y},${Region.CenterPoint.Z}]}]
if ${RegionsFound} > 0
{
do
{
if ${This.ShouldConnect[${Region.FQN},${SurroundingRegions.Get[${Index}].FQN}]}
{
ConnectionCount:Inc
Region:Connect[${SurroundingRegions.Get[${Index}].FQN}]
SurroundingRegions.Get[${Index}]:Connect[${Region.FQN}]
}
}
while ${SurroundingRegions.Get[${Index:Inc}](exists)}
}
return ${ConnectionCount}
}
member ShouldConnect(string RegionA, string RegionB)
{
variable lnavregionref RegionRefA
variable lnavregionref RegionRefB
if ${RegionA.Equal[${RegionB}]}
{
return FALSE
}
RegionRefA:SetRegion[${RegionA}]
RegionRefB:SetRegion[${RegionB}]
if ${This.RegionsObstructed[${RegionA},${RegionB}]}
{
return FALSE
}
return TRUE
}
member RegionsObstructed(string RegionA, string RegionB)
{
variable lnavregionref RegionRefA
variable lnavregionref RegionRefB
RegionRefA:SetRegion[${RegionA}]
RegionRefB:SetRegion[${RegionB}]
if ${RegionRefA.Type.NotEqual["Box"]} || ${RegionRefB.Type.NotEqual["Box"]}
{
return TRUE
}
if ${This.CollisionTest[${RegionRefA.X1},${RegionRefA.Y1},${RegionRefA.CenterPoint.Z},${RegionRefB.X1},${RegionRefB.Y1},${RegionRefB.CenterPoint.Z}]}
{
return TRUE
}
if ${This.CollisionTest[${RegionRefA.X2},${RegionRefA.Y1},${RegionRefA.CenterPoint.Z},${RegionRefB.X2},${RegionRefB.Y1},${RegionRefB.CenterPoint.Z}]}
{
return TRUE
}
if ${This.CollisionTest[${RegionRefA.X1},${RegionRefA.Y2},${RegionRefA.CenterPoint.Z},${RegionRefB.X1},${RegionRefB.Y2},${RegionRefB.CenterPoint.Z}]}
{
return TRUE
}
if ${This.CollisionTest[${RegionRefA.X2},${RegionRefA.Y2},${RegionRefA.CenterPoint.Z},${RegionRefB.X2},${RegionRefB.Y2},${RegionRefB.CenterPoint.Z}]}
{
return TRUE
}
return FALSE
}
/*
*
*
*
*
*/
method ZoneChanged()
{
This:Debug["Zone changed to ${This.ZoneText}"]
if !${LNavRegion[${This.ZoneText}](exists)}
{
LNavRegion[${This.Continent}]:AddChild[universe,${This.ZoneText},-unique]
}
This.CurrentZone:SetRegion[${LNavRegion[${This.ZoneText}].FQN}]
This:LoadZone[${This.Continent},${This.CurrentZone.Name}]
}
method SubZoneChanged()
{
This:Debug["SubZone changed to ${This.SubZoneText}"]
if !${LNavRegion[${This.SubZoneText}](exists)}
{
This.CurrentZone:AddChild[universe,${This.SubZoneText},-unique]
}
This.CurrentSubZone:SetRegion[${LNavRegion[${This.SubZoneText}].FQN}]
}
member ShouldMap()
{
if !${Me(exists)} || ${Me.Flying}
{
return FALSE
}
if ${This.CurrentSubZone.ID} != ${This.CurrentRegion.ID}
{
return FALSE
}
return TRUE
}
method SetCurrentRegion()
{
This.CurrentLocation.X:Set[${Me.X}]
This.CurrentLocation.Y:Set[${Me.Y}]
This.CurrentLocation.Z:Set[${Me.Z} + ${Math.Calc[${Me.Height} / 2]}]
This.CurrentRegion:SetRegion[${This.CurrentSubZone.BestContainer[${This.CurrentLocation.X},${This.CurrentLocation.Y},${This.CurrentLocation.Z}].ID}]
}
member State()
{
if ${This.ShouldMap}
{
return MAPPER_MAP
}
return MAPPER_NONE
}
method Pulse()
{
This:SetCurrentRegion
This.CurrentState:Set[${This.State}]
switch ${This.CurrentState}
{
case MAPPER_MAP
This:Map
break
case MAPPER_NONE
break
}
}
method Plugin()
{
This:InitializeRegions
This:ZoneChanged
This:SubZoneChanged
This:SetCurrentRegion
AddTrigger ${This.ObjectName}:ZoneChanged "[Event:204:ZONE_CHANGED]"
AddTrigger ${This.ObjectName}:SubZoneChanged "[Event:207:MINIMAP_ZONE_CHANGED]"
Event[CORE_EVENT_PULSE]:AttachAtom[${This.ObjectName}:Pulse]
}
method Shutdown()
{
Event[CORE_EVENT_PULSE]:DetachAtom[${This.ObjectName}:Pulse]
This:Save
}
}