mrbot/osa/osa.iss
2023-12-08 15:07:11 -06:00

148 lines
4.7 KiB
Plaintext

objectdef ActorToMonitor
{
variable string ID
variable string Name
variable int Health
variable string TargetName
variable int ThreatToNext
variable float Distance
method Initialize(string id, string name, int health, string targetName, int threatToNext, float distance)
{
ID:Set["${id}"]
Name:Set["${name}"]
Health:Set[${health}]
TargetName:Set["${targetName}"]
ThreatToNext:Set[${threatToNext}]
Distance:Set[${distance}]
}
method FromJSON(jsonvalueref jo)
{
ID:Set["${jo.Get[ID]~}"]
Name:Set["${jo.Get[Name]~}"]
Health:Set["${jo.Get[Health]~}"]
TargetName:Set["${jo.Get[Health]~}"]
ThreatToNext:Set["${jo.Get[ThreatToNext]~}"]
Distance:Set["${jo.Get[Distance]~}"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="{}"
jo:SetString[ID, "${ID~}"]
jo:SetString[Name, "${Name~}"]
jo:SetString[Health, "${Health~}"]
jo:SetString[TargetName, "${TargetName~}"]
jo:SetString[ThreatToNext, "${ThreatToNext~}"]
jo:SetString[Distance, "${Distance}"]
return jo
}
}
objectdef OSAController
{
variable string SelectedItem
variable collection:ActorToMonitor ActorsWithTarget
variable string locationStorageFile = "${LavishScript.HomeDirectory}/Scripts/mr/saves/osa/location.json"
variable string windowName = "mr.osa.window"
method Initialize()
{
variable jsonvalue location
location:ParseFile["${locationStorageFile}"]
LGUI2:LoadPackageFile[osa.json]
LGUI2.Element["${windowName}"]:ApplyStyleJSON["${location.AsJSON~}"]
}
method Shutdown()
{
variable jsonvalue location = ${LGUI2.Element["${windowName}"].StorePlacement[1]}
location:WriteFile["${locationStorageFile}"]
LGUI2:UnloadPackageFile[osa.json]
}
method OnClose()
{
Script:End
}
method OnChangeTarget()
{
Actor[${SelectedItem}]:DoTarget
Context:SetHandled[1]
}
method RefreshMobs()
{
variable index:actor Actors
variable iterator ActorIterator
variable set CurrentActors
variable bool FireRefreshEvent=FALSE
EQ2:QueryActors[Actors, Type =- "NPC" && Target != NULL]
Actors:GetIterator[ActorIterator]
if ${ActorIterator:First(exists)}
{
do
{
if ${ActorIterator.Value.Target.Name.NotNULLOrEmpty}
{
; TODO: Maybe implement group/raid only checkbox instead of that being the default?
if ${Me.Name.Equal[${ActorIterator.Value.Target.Name}]} || ${Me.Group[${ActorIterator.Value.Target.Name}](exists)} || ${Me.Raid[${ActorIterator.Value.Target.Name}](exists)}
{
if !${ActorsWithTarget.Element[${ActorIterator.Value.ID}](exists)}
{
ActorsWithTarget:Set["${ActorIterator.Value.ID}", "${ActorIterator.Value.ID}", "${ActorIterator.Value.Name}", ${ActorIterator.Value.Health}, "${ActorIterator.Value.Target.Name}", ${ActorIterator.Value.ThreatToNext}, ${ActorIterator.Value.Distance}]
}
else
{
ActorsWithTarget.Element["${ActorIterator.Value.ID}"].TargetName:Set["${ActorIterator.Value.Target.Name}"]
ActorsWithTarget.Element["${ActorIterator.Value.ID}"].Health:Set["${ActorIterator.Value.Health}"]
ActorsWithTarget.Element["${ActorIterator.Value.ID}"].ThreatToNext:Set["${ActorIterator.Value.ThreatToNext}"]
ActorsWithTarget.Element["${ActorIterator.Value.ID}"].Distance:Set["${ActorIterator.Value.Distance}"]
}
FireRefreshEvent:Set[TRUE]
CurrentActors:Add["${ActorIterator.Value.ID}"]
}
}
}
while ${ActorIterator:Next(exists)}
}
if ${ActorsWithTarget.FirstKey(exists)}
{
do
{
if !${CurrentActors.Contains[${ActorsWithTarget.CurrentKey}]}
{
ActorsWithTarget:Erase[${ActorsWithTarget.CurrentKey}]
FireRefreshEvent:Set[TRUE]
}
}
while ${ActorsWithTarget.NextKey(exists)}
}
if ${FireRefreshEvent}
{
LGUI2.Element[MrOSAController.events]:FireEventHandler[onUpdateActors]
}
}
}
variable(global) OSAController MrOSAController
function main()
{
while 1
{
MrOSAController:RefreshMobs
wait 5
}
}