You are not logged in.

/!\ We are moving to a new board. Come join us. This board will go into read-only mode on 20.06. /!\

Dear visitor, welcome to Runes of Magic EU. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Tuesday, December 14th 2010, 12:44pm

[Split-Off] Makro Befehle > DIYCE

Hallo zusammen,
ich hätt' da gern mal ein Problem ^^
Das aus dem US-Forum bekannte Makro-Addon DIYCE läuft zwar bei meiner Sek-Klasse, meinem Kundi, leider aber kriege ich es nicht für meine Main-Klasse, meinem Schurken, zum laufen.
Hat jemand vielleicht eine Idee woran es liegen könnte?

Hier das komplette Addon:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
-- 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

function RogueScout(arg1, arg2)
    local Skill = {}
    local i = 0
    local energy = UnitMana("player")
    local focus = UnitSkill("player")
    local friendly = (not UnitCanAttack("player", "target"))
    local combat = GetPlayerCombatState()
    local tspell,ttime,telapsed = UnitCastingTime("target")
    local pbuffs = BuffList("player")
    local tbuffs = BuffList("target")

    i=i+1; Skill[i] = { name = "Hinterhalt",     use = ((not friendly) and (energy >= 30) and (arg2 == "behind") and (not combat)) }
    i=i+1; Skill[i] = { name = "Toter Winkel",   use = ((not friendly) and (energy >= 25) and (arg2 == "behind")) }
    i=i+1; Skill[i] = { name = "Meucheln",       use = ((not friendly) and (energy >= 20) and (not string.find(tbuffs, "Blutende Wunde"))) }
    i=i+1; Skill[i] = { name = "Wunden angreifen", use = ((not friendly) and (energy >= 35) and string.find(tbuffs, "Blutende Wunde") and string.find(tbuffs, "Starke Blutung")) }
    i=i+1; Skill[i] = { name = "Gemeiner Schlag",  use = ((not friendly) and (energy >= 25) and string.find(tbuffs, "Blutende Wunde") and string.find(tbuffs, "Toter Winkel-Blutende Wunde") and string.find(tbuffs, "Hinterhalt-Blutende Wunde")) }
    i=i+1; Skill[i] = { name = "Bogenschuss",    use = (not friendly) }
    i=i+1; Skill[i] = { name = "Energiedieb  ",  use = ((not friendly) and (energy <= 20) }

MyCombat(Skill,arg1)
end


Aufrufen tue ich das Addon mit dem Ingame Makro
/run RogueScout()

Die Engine im oberen Teil ist Standard bei allen Klassen, mit denen dieses Addon ausgeführt werden kann, erst ab

function RogueScout(arg1, arg2)

fängt die Klassenspezifische Unterscheidung an.
Ich musste natürlich die Namen der Skills und Buffs ins Deutsche übersetzen, denke aber nicht, dass das der Fehler ist.

Leider, leider läuft es bei mir nicht, null, nada, niente, nix ^^

Ich würde mich sehr freuen, wenn der eine oder andere Lua-Spezialist hier im Forum da mal einen Blick drauf werfen würde und mir helfen könnte.

Vielen dank schon mal,

Gruß,
Bill
This post has already been reported.

2

Tuesday, December 14th 2010, 2:11pm

Also auf jeden Fall falsch:


Source code

1
i=i+1; Skill[i] = { name = "Energiedieb ", use = ((not friendly) and (energy <= 20) }



müsste sein:


Source code

1
i=i+1; Skill[i] = { name = "Energiedieb ", use = ((not friendly) and (energy <= 20)) }


Dann ist dir hoffentlich klar, dass die skills mit

Source code

1
(arg2 == "behind")

drin nur ausgelöst werden, wenn du /run RogueScout("","behind") als Makro benutzt?

3

Tuesday, December 14th 2010, 5:55pm

Quoted from "0v3rlord;2759794"

Also auf jeden Fall falsch:


Source code

1
i=i+1; Skill[i] = { name = "Energiedieb ", use = ((not friendly) and (energy <= 20) }
müsste sein:


Source code

1
i=i+1; Skill[i] = { name = "Energiedieb ", use = ((not friendly) and (energy <= 20)) }
Dann ist dir hoffentlich klar, dass die skills mit

Source code

1
(arg2 == "behind")
drin nur ausgelöst werden, wenn du /run RogueScout("","behind") als Makro benutzt?



Hey, vielen Dank Overlord, da ist mir doch tatsächlich eine Klammer abhanden gekommen. Wird sofort korrigiert ^^

Und ja, es ist mir klar, dass alle arg2 Codes nur mit dem "Behind-Makro" ausgelöst werden, darum habe ich auch 2 Makros im Gebrauch, eins wenn ich vor dem Boss stehe und eins, wenn ich dahinter stehe. Trotzdem nochmal danke für den Hinweis.

Und ich hätte dazu noch eine Frage:
Kann ich beide klassenspezifischen Codes, also für meinen Schurken UND meinem Kundi zusammen in EINEM gemeinsamen Code einbauen? Jetzt baue ich nämlich immer das ausgelagerte Makro um, wenn ich von meiner Main- auf meine Sek-Klasse gehe, was ein wenig umständlich ist. Aber eigentlich sollte doch mein Ingame-Makro jeweils nur seine klassenspezifischen Codes ausführen, oder liege ich da falsch?

Über weitere Hilfe und Tipps freue ich mich sehr.

Bis dahin,
Gruß,
Bill

4

Wednesday, December 15th 2010, 4:16am

Hallo nochmal,

Die Klammer hat's gebracht, thx Overlord.
Auch, dass ich beide klassenspezifischen Skill-Codes gemeinsam unterbringen konnte, hat hingehauen. Eine Sache funktioniert aber leider immer noch nicht:
"Wunden angreifen" wird nicht ausgelöst.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function RogueScout(arg1, arg2)
    local Skill = {}
    local i = 0
    local energy = UnitMana("player")
    local focus = UnitSkill("player")
    local friendly = (not UnitCanAttack("player", "target"))
    local combat = GetPlayerCombatState()
    local tspell,ttime,telapsed = UnitCastingTime("target")
    local pbuffs = BuffList("player")
    local tbuffs = BuffList("target")

    i=i+1; Skill[i] = { name = "Hinterhalt",     use = ((not friendly) and (energy >= 30) and (arg2 == "behind") and (not combat)) }
    i=i+1; Skill[i] = { name = "Toter Winkel",   use = ((not friendly) and (energy >= 25) and (arg2 == "behind")) }
    i=i+1; Skill[i] = { name = "Meucheln",       use = ((not friendly) and (energy >= 20) and (not string.find(tbuffs, "Blutende Wunde"))) }
    i=i+1; Skill[i] = { name = "Gemeiner Schlag",  use = ((not friendly) and (energy >= 25) and string.find(tbuffs, "Blutende Wunde") or string.find(tbuffs, "Toter Winkel-Blutende Wunde") or string.find(tbuffs, "Hinterhalt-Blutende Wunde") and (not string.find(tbuffs, "Starke Blutung"))) }
    i=i+1; Skill[i] = { name = "Wunden angreifen",  use = ((not friendly) and (energy >= 35) and string.find(tbuffs, "Blutende Wunde") and string.find(tbuffs, "Starke Blutung")) }
    i=i+1; Skill[i] = { name = "Bogenschuss",    use = (not friendly) }
    i=i+1; Skill[i] = { name = "Energiedieb",    use = ((not friendly) and (energy <= 20)) }

MyCombat(Skill,arg1)
end
Habe jetzt noch zusätzlich "and (not string.find(tbuffs, "Starke Blutung"))) }" in die Zeile von "Gemeiner Schlag" eingebaut, weil der sonst immer ausgeführt wurde, wenn eine "Blutende Wunde" lief, aber "Wunden angreifen" kam trotzdem nicht durch.

Außerdem habe ich noch die "and" Verknüpfungen in der "Gemeiner Schlag" Zeile gegen "or" Verknüpfungen ausgetauscht. Das sollte eigentlich richtiger sein, oder? Vorher wurde nämlich auch "Gemeiner Schlag" nicht ausgeführt ^^

Und noch eine Sache: "Bogenschuss" wird zu selten ausgeführt, ich stelle mir sowas in der Art vor, dass "Bogenschuss" immer dann ausgeführt wird, wenn beide Blutungen laufen UND "Wunden angreifen" im CD ist. Kann man nicht sowas einbauen? -->

Source code

1
CDduration, CDremaining = GetSkillCooldown(4,3); if CDremaining >= 0.1 then CastSpellByName("Bogenschuss")
wobei GetSkillCooldown(4,3) natürlich der CD von "Wunden angreifen" ist. Geht das und wenn ja, wie baue ich das ein? Vielleicht so -->

Source code

1
i=i+1; Skill[i] = { name = "Bogenschuss", use = ((not friendly) and (CDduration, CDremaining = GetSkillCooldown(4,3), CDremaining >= 0.1)) }
???

Wo ist mein Gedankenfehler? Warum wird "Wunden angreifen" nicht ausgeführt und wie kann ich "Bogenschuss" öfter auslösen lassen? Hat jemand eine Idee?

Vielen Dank schon mal und
Gruß,
Bill

5

Friday, December 17th 2010, 10:21am

@BillTscherno
Versuch es mal mit

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function RogueScout(arg1, arg2)
    local Skill = {}
    local i = 0
    local energy = UnitMana("player")
    local focus = UnitSkill("player")
    local friendly = (not UnitCanAttack("player", "target"))
    local combat = GetPlayerCombatState()
    local tspell,ttime,telapsed = UnitCastingTime("target")
    local pbuffs = BuffList("player")
    local tbuffs = BuffList("target")

    i=i+1; Skill[i] = { name = "Hinterhalt",     use = ((not friendly) and (energy >= 30) and (arg2 == "behind") and (not combat)) }
    i=i+1; Skill[i] = { name = "Toter Winkel",   use = ((not friendly) and (energy >= 25) and (arg2 == "behind")) }
    i=i+1; Skill[i] = { name = "Wunden angreifen",  use = ((not friendly) and (energy >= 35) and string.find(tbuffs, "Blutende Wunde") and string.find(tbuffs, "Starke Blutung")) }
    i=i+1; Skill[i] = { name = "Bogenschuss",    use = ((not friendly) and string.find(tbuffs, "Blutende Wunde") and string.find(tbuffs, "Starke Blutung")) }
    i=i+1; Skill[i] = { name = "Gemeiner Schlag",  use = ((not friendly) and (energy >= 25) and string.find(tbuffs, "Blutende Wunde")) }
    i=i+1; Skill[i] = { name = "Meucheln",       use = ((not friendly) and (energy >= 20)) }
    i=i+1; Skill[i] = { name = "Energiedieb",    use = ((not friendly) and (energy <= 20)) }

MyCombat(Skill,arg1)
end


DIYCE mach ja nix anderes, als alle Skills in der Reihenfolge abzuarbeiten, in der du sie übergibst. Dabei prüft es trotzdem, ob der jeweilige Skill benutzt werden kann.
In diesem Fall würde erst geschaut, ob beide Wunden auf dem Target sind. Wenn ja, wird Wunden angreifen ausgeführt. Wenn Wunden angreifen im CD ist, wird Bogenschuss ausgeführt.
Sofern du dich nicht verschrieben hast, kannst du

Source code

1
or string.find(tbuffs, "Toter Winkel-Blutende Wunde") or string.find(tbuffs, "Hinterhalt-Blutende Wunde")

weglassen, weil da ja eh das Wort Blutende Wunde drin ist es wird also schon vorher gefunden ;)

Ich habe da jetzt zwei mal (not string.find()) weggelassen ... Wenn sowohl Bogenschuss, als auch Wunden angreifen im CD sind, wird der nächste Skill übergeben und du könntest Fehler bekommen ... Ich weiß jetzt nicht so genau, wie der geringste CD von Bogenschuss bei dir ist. evtl. musst du das (not string.find()) wieder reinsetzen, musst du sehen ;)

6

Saturday, December 18th 2010, 2:43am

Vielen Dank Overlord, klappt alles prima jetzt.
Lag also wohl nur an der Reihenfolge der Skillabfrage, oder wie?
Jetzt läuft's auf jeden Fall.

Thx Overlord

Gruß,
Bill

7

Sunday, January 22nd 2012, 7:45pm

Diyce

Hallo, gibs bei Diyce einen Befehl, dass er nur meine eigenen Debuffs auf den Boss mit zählt? Also das es kein Wunden angreifen macht, wenn schon andere Schurken ne Blutung auf den Boss gemacht haben?
Kundschafter 70/Schurke 61

MarDiv

Professional

Posts: 1,957

Location: Cologne

Occupation: Dipl.-Math.

  • Send private message

8

Friday, November 2nd 2012, 4:35pm

Häng mich hier mal an.
Möchte ganz gerne Bufffood mit ins Diyce Makro packen, hauptsächlich Sandwich.
Es soll vorher überprüft werden, ob das Bufffood überhaupt im Bag liegt und wenn ja, nach Ablauf des Buffs automatisch nachgeworfen werden. Würde folgendes funktionieren?

Source code

1
local _,food = GetBagItemInfo();


So wie ich das verstanden habe, bräuchte GetBagItemInfo die Nummer im Rucksack. Praktischer wäre es, wenn man hier den Namen als Parameter angeben könnte oder eine Slotnummer im Interface. Habe das Food nicht immer an der gleichen Stelle im Rucksack liegen. Wenn der Parameter "food" (Menge von meinem Bufffood) soweit definiert ist, würde ich einfach in die Abfrage mit einfügen:

Source code

1
2
elseif food >0 and PBuffTime("Buffname von meinem Bufffood")==0)then
      UseAction("Slotnummer von meinem Bufffood";


Würde das funktionieren?
08.08.2012 - Ich habe fertig - 6079 Abzeichen der Prüfung - BK Beta abgeschlossen - Erlauchter Herzog
Aggromage - Kaufe Titel (# 657), Quests (# 6.638), Rezepte und Monsterkarten (# 1.643)

9

Friday, November 2nd 2012, 5:18pm

Quoted from "MarDiv;4413655"

Häng mich hier mal an.
Möchte ganz gerne Bufffood mit ins Diyce Makro packen, hauptsächlich Sandwich.
Es soll vorher überprüft werden, ob das Bufffood überhaupt im Bag liegt und wenn ja, nach Ablauf des Buffs automatisch nachgeworfen werden. Würde folgendes funktionieren?

Source code

1
local _,food = GetBagItemInfo();


So wie ich das verstanden habe, bräuchte GetBagItemInfo die Nummer im Rucksack. Praktischer wäre es, wenn man hier den Namen als Parameter angeben könnte oder eine Slotnummer im Interface. Habe das Food nicht immer an der gleichen Stelle im Rucksack liegen. Wenn der Parameter "food" (Menge von meinem Bufffood) soweit definiert ist, würde ich einfach in die Abfrage mit einfügen:

Source code

1
2
elseif food >0 and PBuffTime("Buffname von meinem Bufffood")==0)then
      UseAction("Slotnummer von meinem Bufffood";


Würde das funktionieren?


da bin ich mir zu 99% sicher, dass genau so eine funktion, wie du dir wünscht, schon jemand im us forum gepostet hat. bin ich jedenfalls schon mal drüber gestolpert.

hier ist auch der link: klick mich

MarDiv

Professional

Posts: 1,957

Location: Cologne

Occupation: Dipl.-Math.

  • Send private message

10

Friday, November 2nd 2012, 6:38pm

thx MoRainiraX, hab es hinbekommen. Die function macht zwar mehr als ich tatsächlich brauche, aber schadet sicher auch nicht.
08.08.2012 - Ich habe fertig - 6079 Abzeichen der Prüfung - BK Beta abgeschlossen - Erlauchter Herzog
Aggromage - Kaufe Titel (# 657), Quests (# 6.638), Rezepte und Monsterkarten (# 1.643)

MarDiv

Professional

Posts: 1,957

Location: Cologne

Occupation: Dipl.-Math.

  • Send private message

11

Saturday, November 10th 2012, 8:30am

Habe hier noch eine ältere Diyce function zur Buffabfrage (Laufzeit):

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function PBuffTime(whatBuff)

    if (whatBuff~=nil) and (whatBuff~="")then
    whatBuff=string.lower(whatBuff);
    local i = 1;
        repeat        
            local buffName,_,_ = UnitBuff("player",i);
            if (buffName~=nil) then
                buffName=string.lower(buffName);
                if(buffName==whatBuff)then
                    buffTime = UnitBuffLeftTime("player",i);
                    return buffTime;
                end    
                i=i+1;
            end    
        until (buffName==nil)
    return 0;    
    end
end


Als Parameter wird hier der Buffname übergeben. Hat denn wer einen Link oder kann mir kurz helfen, wie ich diese Funktion am einfachstens auf den Paramter BuffID umgeschrieben bekomme? Würde also ganz gerne eine function "P1BuffTime(BuffID)" ergänzen.
08.08.2012 - Ich habe fertig - 6079 Abzeichen der Prüfung - BK Beta abgeschlossen - Erlauchter Herzog
Aggromage - Kaufe Titel (# 657), Quests (# 6.638), Rezepte und Monsterkarten (# 1.643)

12

Saturday, November 10th 2012, 11:40am

Die neue Diyce 2.2x hat das doch von sich aus eingebaut ..

(pbuffs[503958].time <= 45) dient als abfrage und liefert in diesem Fall true zurück wenn das Gestrüppschild weniger als 45 sec Laufzeit hat.

Wenn du unbedingt die Zeit selber haben willst brauchst also nur P1Bufftime = pbuffs[buffid].time :)

geht dementsprechend auch mit tbuffs ....

MarDiv

Professional

Posts: 1,957

Location: Cologne

Occupation: Dipl.-Math.

  • Send private message

13

Saturday, November 10th 2012, 11:51am

Quoted from "Gentlemankiller;4425007"

Die neue Diyce 2.2x hat das doch von sich aus eingebaut ..


Hab aber keine Version 2.2, müsste noch 1.4 oder so sein. Wollte eigentlich nicht wechseln und erst noch bei der alten Version bissel rumspielen. Und wenn ich da meine function PBuffTime[COLOR=white !important][/COLOR] richtig verstanden habe, kann ich da nur den Buffnamen als Parameter übergeben, nicht die ID.
08.08.2012 - Ich habe fertig - 6079 Abzeichen der Prüfung - BK Beta abgeschlossen - Erlauchter Herzog
Aggromage - Kaufe Titel (# 657), Quests (# 6.638), Rezepte und Monsterkarten (# 1.643)

14

Saturday, November 10th 2012, 12:03pm

Sorry - war mir bei meinen vorangegangenen Antworten nicht klar, dass du noch mit 1.4 arbeitest. Dann können einige Dinge nicht funktionieren wie ich sie vorgeschlagen habe ... - zwischen 1.4 und 2.2 liegen mittlerweile Welten ... - an deiner Stelle würde ich mir den Aufwand nicht doppelt machen - erst 1.4 mit großen Mühen zum laufen zu bringen und es mit 2.2 einfacher haben können ...
ich poste dir mal den Abschnitt von Diyce der für die Buffs zuständig ist - vlt hilft dir das ja. Alle Buffs werden mit jedem Durchlauf in eine Table abgespeichert auf die du immer zugriff hast.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function BuffList(tgt)
    local list = {}
    local buffcmd = UnitBuff
    local infocmd = UnitBuffLeftTime

    if UnitCanAttack("player",tgt) then
        buffcmd = UnitDebuff
        infocmd = UnitDebuffLeftTime
    end

    -- There is a max of 100 buffs/debuffs per unit apparently
    for i = 1,100 do
        local buff, _, stackSize, ID = buffcmd(tgt, i)
        local timeRemaining = infocmd(tgt,i)
        if buff then
            -- Ad to list by name
            list[buff:gsub('(%()(.)(%))', '%2')] = { stack = stackSize, time = timeRemaining or 0, id = ID }
            -- We also list by ID in case two different buffs/debuffs have the same name.
            list[ID] = {stack = stackSize, time = timeRemaining or 0, name = buff:gsub("(%()(.)(%))", "%2") }
        else
            break
        end
    end

    return list
end


zugriff darauf mit local pbuffs = Bufflist("player") und tbuffs = Bufflist("target") abfragen erfolgen dann mit pbuffs['Name'] oder pbuffs[id] und liefert true oder false zurück ob der Buff in der entsprechenden Liste steht. Die .time funktion hab ich oben schon erklärt.

15

Saturday, November 10th 2012, 12:16pm

Quoted from "MarDiv;4424935"

Habe hier noch eine ältere Diyce function zur Buffabfrage (Laufzeit):

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function PBuffTime(whatBuff)

    if (whatBuff~=nil) and (whatBuff~="")then
    whatBuff=string.lower(whatBuff);
    local i = 1;
        repeat        
            local buffName,_,_ = UnitBuff("player",i);
            if (buffName~=nil) then
                buffName=string.lower(buffName);
                if(buffName==whatBuff)then
                    buffTime = UnitBuffLeftTime("player",i);
                    return buffTime;
                end    
                i=i+1;
            end    
        until (buffName==nil)
    return 0;    
    end
end


Als Parameter wird hier der Buffname übergeben. Hat denn wer einen Link oder kann mir kurz helfen, wie ich diese Funktion am einfachstens auf den Paramter BuffID umgeschrieben bekomme? Würde also ganz gerne eine function "P1BuffTime(BuffID)" ergänzen.


bei der ID kannste dir die umwandlung vom string ja sparen. dann müsste das so klappen:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function P1BuffTime(whatID)

    if (whatID~=nil) and (whatID~="")then
    local i = 1;
        repeat        
            local _,_,_,buffID = UnitBuff("player",i);
            if (buffID~=nil) then
                if buffID == whatID then
                    buffTime = UnitBuffLeftTime("player",i);
                    return buffTime;
                end    
                i=i+1;
            end    
        until (buffID==nil)
    return 0;    
    end
end

MarDiv

Professional

Posts: 1,957

Location: Cologne

Occupation: Dipl.-Math.

  • Send private message

16

Saturday, November 10th 2012, 12:40pm

@ Gentlemankiller Du hast eine PN :)

@ MoRainiraX Merci, funzt 1a, genau so wollte ich das haben. 1.000 Dank.
08.08.2012 - Ich habe fertig - 6079 Abzeichen der Prüfung - BK Beta abgeschlossen - Erlauchter Herzog
Aggromage - Kaufe Titel (# 657), Quests (# 6.638), Rezepte und Monsterkarten (# 1.643)

17

Wednesday, November 14th 2012, 5:33pm

Ich hab noch ne ganz andere Frage, und zwar ob es in der DIYCE 2.2 version die möglichkeit gibt cast spell zu überspringen während man sich bewegt und stattdessen instandspells raus haut ... Derzeit kommt während der bewegung nur cast ist während der Bewegung nicht möglich, und DIYCE macht aber nicht weiter... -.-


Quoted

if ((enemy) and (goat2 == "1")) then
Skill2 = {
{ name = "Saces' Zorn", use = ((boss) and (not pbuffs[621331])) },
{ name = "Schw\195\164chender Webefluch", use = ((EnergyBar1 >= 20) and (not tbuffs[501577])) },
{ name = "Verdrehte Ladung", use = ((EnergyBar1 >= 30) and (not pbuffs[501575])) },
{ name = "Verwirrendes R\195\164tsel", use = ((PsiPoints <= 5) and (not pbuffs[501571]) and (not pbuffs[501572])) },
{ name = "Woge der Boshaftigkeit", use = ((EnergyBar1 >= 20) and (not pbuffs[501571]) and (not pbuffs[501572])) },
{ name = "Willenskraftklinge", use = ((PsiPoints == 6) and (not pbuffs[501571]) and (not pbuffs[501572])) },
{ name = "Herzsammelhieb", use = ((true)) },
{ name = "Unbarmherziges Urteil", use = ((thealth <= 0.2) and (pbuffs [501571]) and (not pbuffs[501572]) and (PsiPoints >= 2)) },
{ name = "Saces' Ansporn", use = ((pbuffs [501571]) and (not pbuffs[501572]) and (not pbuffs[621407]) and (PsiPoints >= 2)) },
{ name = "Seelentrauma", use = ((EnergyBar1 >= 25) and (tbuffs[501577])) },
{ name = "Wahrnehmungsentzug", use = ((EnergyBar1 >= 15) and (not tbuffs[621701])) },
{ name = "Seelenpein", use = ((EnergyBar1 >= 15) and (not tbuffs[621188])) },
{ name = "Stromsto\195\159", use = ((EnergyBar2 >= 20) and (not tbuffs[621396])) },
{ name = "Energiezufuhrangriff", use = ((EnergyBar2 >= 30) and (tbuffs[621396])) },
{ name = "Abgetrenntes Bewusstsein", use = ((pbuffs [501571]) and (not pbuffs[501572]) and (PsiPoints >= 2)) },
{ name = "Psychische Pfeile", use = ((PsiPoints <= 6) and (not pbuffs[501571]) and (not pbuffs[501572])) },
}
elseif ((enemy) and (goat2 == "psi")) then
Skill2 = {
{ name = "Saces' Zorn", use = ((boss) and (not pbuffs[621331])) },
{ name = "Verdrehte Ladung", use = ((EnergyBar1 >= 30) and (not pbuffs[501575])) },
{ name = "Verwirrendes R\195\164tsel", use = ((PsiPoints <= 5) and (not pbuffs[501571]) and (not pbuffs[501572])) },
{ name = "Willenskraftkonstrukt", use = ((PsiPoints == 6) and (not pbuffs[501571]) and (not pbuffs[501572])) },
{ name = "Herzsammelhieb", use = ((true)) },
{ name = "Jenseitsgefl\195\188ster", use = ((pbuffs [501572]) and (not pbuffs[501571]) and (not pbuffs[621275]) and (PsiPoints >= 3)) },
{ name = "Wahrnehmungsentzug", use = ((EnergyBar1 >= 15) and (not tbuffs[621701])) },
{ name = "Seelenpein", use = ((EnergyBar1 >= 15) and (not tbuffs[621188])) },
{ name = "Stromsto\195\159", use = ((EnergyBar2 >= 20) and (not tbuffs[621396])) },
{ name = "Energiezufuhrangriff", use = ((EnergyBar2 >= 30) and (tbuffs[621396])) },
{ name = "Psychische Pfeile", use = ((PsiPoints <= 6) and (not pbuffs[501571]) and (not pbuffs[501572])) },
}
end


Danke schonmal

18

Wednesday, November 14th 2012, 7:48pm

stimmt - man muss diyce nur sagen, dass man sich bewegt .... und den Skills die eine Castzeit haben die zusätzliche Bedingung auflegen "stillstand" ;)

von sich aus kennt Diyce den Unterschied nicht - ich habe dafür eine anderes Addon ein wenig zweckentfremdet welches von sich aus schon die bewegung abfragt :oo:

19

Wednesday, November 14th 2012, 10:30pm

hmm ... iss auch ne möglichkeit...

leider funktioniert die bedingung "playermove == 0" nicht richtig... er überspringt die cast spells zwar, aber gibt die auch nicht wieder frei wenn man steht -.-

find ich sehr schade

20

Wednesday, November 14th 2012, 10:32pm

Quoted from "Gentlemankiller;4430395"

von sich aus kennt Diyce den Unterschied nicht - ich habe dafür eine anderes Addon ein wenig zweckentfremdet welches von sich aus schon die bewegung abfragt :oo:


;) mich würd mal interessieren welches ;)

1 user apart from you is browsing this thread:

1 member

TheKreed

Legend: Community Manager, Team Manager, Game Administrator, Eventmanagement Administrator, Board Administrator, Super Game Master, Super Eventmanagement, Super Boardmoderator, Game Master, Board Moderator, Eventmanagement, Trial Game Master, Trial Moderator, Trial Eventmanagement, Community Manager replacement, Gameforge Support, Quality Assurance, Senior Team, Junior Team, IRC Administrator