Kundschafter



Makros

Pfeile herstellen

/use Runen-Katapult
/wait 0.5
/script UseEquipmentItem(10);
/wait 0.5
/script UseEquipmentItem(10);
/wait 0.5
/use Zorn der Hüterin des Dschungels
/wait 1.0
/use Runendorn


Do-It-Yourself Combat Engine (DIYCE) Kampfscript für Kundschafter


Link zum DIYCE(externer Link)

1. Macro-Buttons anlegen:

  • für PvP: /run ScoutRogueCombat("pvp"])
  • für PvE: /run ScoutRogueCombat("pve"])
  • für Inis: /run ScoutRogueCombat("ini"])

2. DIYCE Kundi/Schurke Script, speichern als Interface\Addons\DIYCE\scoutrogue.lua

-- /run ScoutRogueCombat(["pvp", "pve", "ini"], "v2") oder /run ScoutRogueCombat()
-- ---------------------------------------------------------------------------------------------
function ScoutRogueCombat(arg1, arg2)
   local Skill = {}
   local i = 0
   local solo = ((GetNumPartyMembers() == 0) and (GetNumRaidMembers() == 0))
   local focus = UnitMana("player")
   local enemy = UnitCanAttack("player","target")
   local friendly = (not UnitCanAttack("player","target"))
   local combat = GetPlayerCombatState()
   local pbuffs = BuffList("player")
   local tbuffs = BuffList("target")
   local LockedOn = UnitExists("target")
   local tDead = UnitIsDeadOrGhost("target")

-- Button Nummern zuordnen:
   local a1,a2,a3,a4,a5,ASon = GetActionInfo(63)  -- # Button mit Automatischer Schuss
   a1,a2,a3,a4,a5,VArr = GetActionInfo(4)  -- # Button mit Vampirpfeil
   a1,a2,a3,a4,a5,Quer = GetActionInfo(7)  -- # Button mit Querschläger
   a1,a2,a3,a4,a5,PArr = GetActionInfo(8)  -- # Button mit Durchdringender pfeil

   if (arg1 == "") then
      arg1 = "pve"
   end

   if (arg1 == "pvp") then
      i=i+1; Skill[i] = { name = "Vampirpfeil",             use = (enemy and (focus >= 20) and (not VArr)) }
      i=i+1; Skill[i] = { name = "T\195\182dlicher Giftbiss", use = (enemy and (focus >= 30)) }
      i=i+1; Skill[i] = { name = "Salve",                   use = enemy }
      i=i+1; Skill[i] = { name = "Bogenschuss",             use = enemy }
      i=i+1; Skill[i] = { name = "Durchdringender Pfeil",   use = (enemy and (not PArr)) }
      i=i+1; Skill[i] = { name = "Querschl\195\164ger",     use = (enemy and (not Quer)) }
      i=i+1; Skill[i] = { name = "Windpfeil",               use = (enemy and (focus >= 15)) }
      i=i+1; Skill[i] = { name = "Automatischer Schuss",    use = ((not friendly) and (not ASon)) }
   end
   if (arg1 == "ini") then
      i=i+1; Skill[i] = { name = "Schussfeld",              use = ((solo) and (not string.find(pbuffs,"Schussfeld")) and (focus > 20)) }
      i=i+1; Skill[i] = { name = "Frostpfeil",              use = ((solo) and (not ChkBuff("player","Frostpfeil"))) }
      i=i+1; Skill[i] = { name = "Konzentration",           use = ((solo) and (not ChkBuff("player","Konzentration")) and (focus <= 30)) }
      i=i+1; Skill[i] = { name = "Schw\195\164chungspfeil", use = (enemy and (focus >= 30)) }
      i=i+1; Skill[i] = { name = "Salve",                   use = enemy }
      i=i+1; Skill[i] = { name = "Automatischer Schuss",    use = ((not friendly) and (not ASon)) }
      i=i+1; Skill[i] = { name = "Bogenschuss",             use = enemy }
      i=i+1; Skill[i] = { name = "T\195\182dlicher Giftbiss", use = (enemy and (focus >= 30)) }
      i=i+1; Skill[i] = { name = "Windpfeil",               use = (enemy and (focus >= 15)) }
      i=i+1; Skill[i] = { name = "Manaraubender Pfeil",     use = (enemy and (focus >= 20)) }
   end
   if (arg1 == "pve") then
      i=i+1; Skill[i] = { name = "Schussfeld",              use = ((not string.find(pbuffs,"Schussfeld")) and (focus > 20)) }
      i=i+1; Skill[i] = { name = "Frostpfeil",              use = (not ChkBuff("player","Frostpfeil")) }
      i=i+1; Skill[i] = { name = "Konzentration",           use = ((not ChkBuff("player","Konzentration")) and (focus <= 30)) }
      i=i+1; Skill[i] = { name = "Salve",                   use = enemy }
      i=i+1; Skill[i] = { name = "Automatischer Schuss",    use = ((not friendly) and (not ASon)) }
      i=i+1; Skill[i] = { name = "Schw\195\164chungspfeil", use = (enemy and (focus >= 30)) }
      i=i+1; Skill[i] = { name = "T\195\182dlicher Giftbiss", use = (enemy and (focus >= 30)) }
      i=i+1; Skill[i] = { name = "Bogenschuss",             use = enemy }
      i=i+1; Skill[i] = { name = "Durchdringender Pfeil",   use = (enemy and (not PArr)) }
      i=i+1; Skill[i] = { name = "Querschl\195\164ger",     use = (enemy and (not Quer)) }
      i=i+1; Skill[i] = { name = "Windpfeil",               use = (enemy and (focus >= 15)) }
      i=i+1; Skill[i] = { name = "Manaraubender Pfeil",     use = (enemy and (focus >= 20)) }
   end
   MyCombat(Skill,arg2)

   -- in pvp automatically target next enemy if the last one dropped down dead:
   if (arg1 == "pvp") then
      if tDead then
          TargetNearestEnemy()
      end
      if (not LockedOn) then
          TargetNearestEnemy()
      end
   end
end


3. DIYCE Table of Contents Script, speichern als Interface\Addons\DIYCE\diyce.toc

DIYCE.lua
scoutrogue.lua


4. DIYCE Script, speichern als Interface\Addons\DIYCE\diyce.lua

-- DIY Combat Engine version 1.4

g_skill = {}

function Msg(outstr,a1,a2,a3)
    DEFAULT_CHAT_FRAME:AddMessage(tostring(outstr),a1,a2,a3)
end

function ReadSkills()
    g_skill = {}
    local skillname,slot

    Msg("- Reading Class Skills")
    for page = 1,4 do
        slot = 1
        skillname = GetSkillDetail(page,slot)
        repeat
            local a1,a2,a3,a4,a5,a6,a7,a8,skillusable = GetSkillDetail(page,slot)
            if skillusable then
                g_skill[skillname] = { ["page"] = page, ["slot"] = slot }
            end
            slot = slot + 1
            skillname = GetSkillDetail(page,slot)
        until skillname == nil
    end
end
ReadSkills() -- Read skills into g_skill table at login

function PctH(tgt)
    return (UnitHealth(tgt)/UnitMaxHealth(tgt))
end

function PctM(tgt)
    return (UnitMana(tgt)/UnitMaxMana(tgt))
end

function PctS(tgt)
    return (UnitSkill(tgt)/UnitMaxSkill(tgt))
end

function CancelBuff(buffname)
    local i = 1
    local buff = UnitBuff("player",i)

    while buff ~= nil do
        if buff == buffname then
            CancelPlayerBuff(i)
            return true
        end

        i = i + 1
        buff = UnitBuff("player",i)
    end
    return false
end

function BuffTimeLeft(tgt, buffname)
    local cnt = 1
    local buffcmd, bufftimecmd, buff

    if UnitCanAttack("player", tgt) then
        buffcmd = UnitDebuff
        bufftimecmd = UnitDebuffLeftTime
    else
        buffcmd = UnitBuff
        bufftimecmd = UnitBuffLeftTime
    end

    buff = buffcmd(tgt, cnt)

    while buff ~= nil do
        if string.find(buff, buffname) then
            return bufftimecmd(tgt, cnt)
        end
        cnt = cnt + 1
        buff = buffcmd(tgt, cnt)
    end

    return 0
end

function ChkBuff(tgt,buffname)
    local cnt = 1
    local buffcmd = UnitBuff

    if UnitCanAttack("player",tgt) then
        buffcmd = UnitDebuff
    end
    local buff = buffcmd(tgt,cnt)

    while buff ~= nil do
        if string.gsub(buff, "(%()(.)(%))", "%2") == buffname then
            return true
        end
        cnt = cnt + 1
        buff = buffcmd(tgt,cnt)
    end
    return false
end

function BuffList(tgt)
    local cnt = 1
    local buffcmd = UnitBuff
    local buffstr = "/"

    if UnitCanAttack("player",tgt) then
        buffcmd = UnitDebuff
    end
    local buff = buffcmd(tgt,cnt)

    while buff ~= nil do
        buffstr = buffstr..buff.."/"
        cnt = cnt + 1
        buff = buffcmd(tgt,cnt)
    end

    return string.gsub(buffstr, "(%()(.)(%))", "%2")
end

function CD(skillname)
    local firstskill = GetSkillDetail(2,1)
    if (g_skill[firstskill] == nil) or (g_skill[firstskill].page ~= 2) then
        ReadSkills()
    end

    if g_skill[skillname] ~= nil then
        local tt,cd = GetSkillCooldown(g_skill[skillname].page,g_skill[skillname].slot)
        return cd==0
    elseif skillname == nil then
        return false
    else
        Msg("Skill not available: "..skillname)
        return false
    end
end

function MyCombat(Skill, arg1)
    local spell_name = UnitCastingTime("player")
    local talktome = ((arg1 == "v1") or (arg1 == "v2"))
    local action,actioncd,actiondef,actioncnt
    
    if spell_name ~= nil then
        if (arg1 == "v2") then Msg("- ["..spell_name.."]", 0, 1, 1) end
        return true
    end

    for x,tbl in ipairs(Skill) do
        if Skill[x].use then
            if string.find(Skill[x].name, "Action:") then
                action = tonumber((string.gsub(Skill[x].name, "(Action:)( *)(%d+)(.*)", "%3")))
                _1,actioncd = GetActionCooldown(action)
                actiondef,_1,actioncnt = GetActionInfo(action)
                if GetActionUsable(action) and (actioncd == 0) and (actiondef ~= nil) and (actioncnt > 0) then
                    if talktome then Msg("- "..Skill[x].name) end
                    UseAction(action)
                    return true
                end
            elseif string.find(Skill[x].name, "Custom:") then
                action = string.gsub(Skill[x].name, "(Custom:)( *)(.*)", "%3")
                if CustomAction(action) then
                    return true
                end
            elseif string.find(Skill[x].name, "Item:") then
                action = string.gsub(Skill[x].name, "(Item:)( *)(.*)", "%3")
                if talktome then Msg("- "..Skill[x].name) end
                UseItemByName(action)
                return true
            elseif CD(Skill[x].name) then
                if talktome then Msg("- "..Skill[x].name) end
                CastSpellByName(Skill[x].name)
                return true
            end
        end
    end
    if (arg1 == "v2") then Msg("- [IDLE]", 0, 1, 1) end

    return false
end


Kampfrotation


1. Salve
2. Automatischer Schuß (nur 1x nötig)
3. Bogenschuß
4. Windpfeil
und dann 1, 3 und 4 abwechselnd, so wie sie wieder nutzbar sind.

Set-Fertigkeiten



Ausrüstung

Vorbemerkung

Bevorzugt werden sollten Ausrüstung und Stats, die folgende Attribute erhöhen:

  • physischer Angriff (40k+)
  • Geschick (10k+)
  • Ausdauer (Richtung 6k+)

Zusätzlich sollte Phyische kritische Trefferrate und Kritischer Schaden maximiert werden

Stats


Stats die man sich besorgen sollte für die Ausrüstung:

  • Wächter der Gruft
  • Wächter des Tempels
  • Triumph der Gruft
  • Triumph des Tempels
  • Wache der Gruft
  • Kern der Gruft

Ausrüstungsempfehlung (Level 62+):


  • Handschützer von Yawaka (aus Tempel Diamant)
  • Gurt von Yawaka (aus Tempel Diamant)
  • Beinschützer von Yawaka (aus Tempel Diamant)
  • Ohrring von Yawaka (aus Tempel Diamant)

ergibt zusammen folgende Setboni: +95 Geschicklichkeit, +1200 Physischer Angriff, +150 Physische kritische Trefferrate, +100 Stärke, +45 Schaden

  • Einhornrüstzeug des Kundschafters (aus ZF/DF)
  • Einhornschulterschützer des Kundschafters (aus ZF/DF)
  • Einhornstiefel des Kundschafters (aus ZF/DF)
ergibt folgende Setboni: +200 Geschicklichkeit, +130 Präzision, +240 Physische kritische Trefferrate

  • Reißzahn-Helm (Tempel)

Aus Arena:
  • Arena-Umhang (aus Arena, ach! ;))

Schmuck


  • Flammendrachenherz-Kette der Macht (herstellbar)
  • 2x Flammendrachenzahn-Ring der Macht (herstellbar) oder 1x Zentaurenstern
ergibt folgende Setboni: +1000 Maximale LP


Waffen + Statswaffen


  • Armbrust: Zorn der Hüterin des Dschungels (aus Tempel Diamant)
  • 1-2 mal Dorn von Yawaka, je nach Sekundärklasse (aus Tempel Diamant)

Interessante Ausrüstung

Lederrüstung


Level 55:

Level 58:


Level 60:

Schmuck


Level 55: