iMod 99 Posted March 10, 2017 Share Posted March 10, 2017 Hello, I'm looking for some ideas how you would create or what you expect from a heal engine. We got a list with player objects that will be updated async so we allways have an updated list of party or raid member. Now it comes to the point we have to priorize the ppl. What would you expect from it? I never wrote such stuff so it would be helpfull if someone could explain what and why he would add some functions. Also samples are welcome if you know a existing heal engine. Thanks iMod Link to comment Share on other sites More sharing options...
Runaro 160 Posted March 11, 2017 Share Posted March 11, 2017 9 hours ago, iMod said: Hello, I'm looking for some ideas how you would create or what you expect from a heal engine. We got a list with player objects that will be updated async so we allways have an updated list of party or raid member. Now it comes to the point we have to priorize the ppl. What would you expect from it? I never wrote such stuff so it would be helpfull if someone could explain what and why he would add some functions. Also samples are welcome if you know a existing heal engine. Thanks iMod Prioritize lowest health %, but if a tank is low too, prioritize him first. ( if there are multiple tanks, then prioritize the lowest one ) Every tank will have different healing settings. ( spells and % ) Check threat, so if a tank loses his aggro for X milliseconds, you can set a focus heal on the non tank player with the highest threat. ( shield, bubble, barkskin, quick heal etc. ) Pre hots and shields, if there are encounters of a boss, which will give players a decent amount of damage. ( debuffs, or a cast of the boss ) Check debuffs of all players and if you can dispell it. ( prioritize tank ofc. and avoid overheal, if there's a 100% healing reduced debuff, which can't get removed by overheal ) At some boss encounters, a certain healer will have to use his cooldown, which will get choosed before. ( example: At the 5th charge of the boss i have to use tranquility ) Different settings and spells at high and low mana %. Possibility of only healing certain groups and players, in a raid. ( if they're not alive anymore, switch to the other groups ) iMod 1 Link to comment Share on other sites More sharing options...
Mykoplazma 24 Posted March 13, 2017 Share Posted March 13, 2017 The easiest way is to copy something that was working quite well ( top hps on raids ) from the pqr engine files. Nova_CustomT = { } PQR_WriteToChat("Custom Table is empty!", "Alert") function CalculateHP(t) incomingheals = UnitGetIncomingHeals(t) and UnitGetIncomingHeals(t) or 0 return 100 * ( UnitHealth(t) + incomingheals ) / UnitHealthMax(t) end function CanHeal(t) if UnitExists(t) and UnitInRange(t) and UnitIsFriend("player", t) and UnitIsConnected(t) and not UnitIsEnemy("player",t) and not UnitIsCharmed(t) and not UnitIsDeadOrGhost(t) and not PQR_IsOutOfSight(t) and not UnitDebuffID(t,104451) -- Ice Tomb and not UnitDebuffID(t,76577) -- Smoke Bomb then return true end end function SheuronEngine() local group, size = nil, nil lowhpmembers = 0 members = { { Unit = "player", HP = CalculateHP("player") } } -- Check if the Player is apart of the Custom Table for i=1, #Nova_CustomT do if UnitGUID("player") == Nova_CustomT[i].GUID then Nova_CustomT[i].Unit = "player" Nova_CustomT[i].HP = CalculateHP("player") end end --Find the Group Type and Size if GetNumRaidMembers() > 0 then group = "raid" size = GetNumRaidMembers() else group = "party" size = GetNumPartyMembers() end for i = 1, size, 1 do local member, memberhp = group..i, CalculateHP(group..i) if CanHeal(member) then if UnitGroupRolesAssigned(member) == "TANK" then memberhp = memberhp - 1 end if UnitThreatSituation(member) == 3 then memberhp = memberhp - 3 end if UnitBuffID(member, 53563) then memberhp = memberhp + 3 end -- Searing Plasma Check for i = 1, #PQ_SP do if UnitDebuffID(member, PQ_SP[i]) then memberhp = memberhp - 9 end end for i=1, #Nova_CustomT do if UnitGUID(member) == Nova_CustomT[i].GUID then Nova_CustomT[i].Unit = member Nova_CustomT[i].HP = memberhp end end -- If they are in the Custom Table add their info in table.insert(members, { Unit = member, HP = CalculateHP(member) } ) end if CanHeal(group..i.."pet") then local memberpet, memberpethp = nil, nil if UnitAffectingCombat("player") then memberpet = group..i.."pet" memberpethp = CalculateHP(group..i.."pet") * 2 else memberpet = group..i.."pet" memberpethp = CalculateHP(group..i.."pet") end for i=1, #Nova_CustomT do if UnitGUID(memberpet) == Nova_CustomT[i].GUID then Nova_CustomT[i].Unit = memberpet Nova_CustomT[i].HP = memberpethp end end table.insert(members, { Unit = memberpet, HP = memberpethp } ) end end table.sort(Nova_CustomT, function(x, y) return x.HP < y.HP end) table.sort(members, function(x,y) return x.HP < y.HP end) for i=1,#members do if members[i].HP < 85 then lowhpmembers = lowhpmembers + 1 end end if CanHeal("target") then table.sort(members, function(x) return UnitIsUnit("target",x.Unit) end) end end I it looks like that - SheuronEngine() ( that was the standard system to calculate hp in pqr heal bot up to pandas and pqr ban ) will make global variable that will hold the lowest hp player with priority on tank with incoming heal counted in. I translated it partially to c# and it's working quite well. ( a bit hacky whacky tho ) . In wrobot there is no translated function like unit threat situation and roles assigned and calling lua from c# is very power hogging process. Idk why but calling lua is eating a lot of power. Something like that for example is working but sometimes bugging out ( the name of players sometime canno't be read from memory and you will get Unknown ) public WoWPlayer FindLowestHealth() { Dictionary<WoWPlayer, double> players = new Dictionary<WoWPlayer, double>(); int playerHp = Convert.ToInt32(ObjectManager.Me.HealthPercent); if (playerHp < 100) { if (UnitThreatSituation(ObjectManager.Me.Name) == 3) { playerHp = playerHp - 3; } if (UnitGroupRolesAssigned(ObjectManager.Me.Name) == "TANK") { playerHp = playerHp - 1; } } players.Add(ObjectManager.Me, playerHp); foreach (var wowPlayer in ObjectManager.GetObjectWoWPlayer()) { if (wowPlayer.Name != null && wowPlayer.GetDistance < 40 && wowPlayer.IsAlive && !TraceLine.TraceLineGo(wowPlayer.Position) && UnitIsFriend(wowPlayer.Name) && UnitIsConnected(wowPlayer.Name) && !UnitIsEnemy(wowPlayer.Name) && !UnitIsCharmed(wowPlayer.Name)) { int otherPlayerHp = Convert.ToInt32(wowPlayer.HealthPercent); if (playerHp < 100) { if (UnitThreatSituation(wowPlayer.Name) == 3) { otherPlayerHp = otherPlayerHp - 3; } if (UnitGroupRolesAssigned(wowPlayer.Name) == "TANK") { otherPlayerHp = otherPlayerHp - 1; } } players.Add(wowPlayer, otherPlayerHp); } } WoWPlayer minHpPlayer = players.Aggregate((l, r) => l.Value < r.Value ? l : r).Key; players = null; return minHpPlayer; } Calling FindLowestHealth() will return player with lowest hp. ( buggy and not the last version what I'm using now ) iMod 1 Link to comment Share on other sites More sharing options...
iMod 99 Posted March 13, 2017 Author Share Posted March 13, 2017 Thanks for your comment. For the others, all ideas are welcome. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now