From 20b77c91680690018781eda21ac961930fc4e5e4 Mon Sep 17 00:00:00 2001 From: srose Date: Sat, 28 Sep 2024 18:51:47 -0400 Subject: [PATCH] Updated hunter mark routine --- assets/spells/hunter/general/ArcaneShot.jpg | Bin 2081 -> 2319 bytes assets/spells/hunter/general/HuntersMark.jpg | Bin 1655 -> 1874 bytes .../spells/hunter/marksmanship/BlackArrow.jpg | Bin 2143 -> 2209 bytes bots/components/spell.py | 26 +++++++++++++++--- bots/fighting/FightingAgent.py | 15 +++++----- bots/fighting/hunter/marksmanship/Routine.py | 8 ++++-- core/Player.py | 2 +- 7 files changed, 37 insertions(+), 14 deletions(-) diff --git a/assets/spells/hunter/general/ArcaneShot.jpg b/assets/spells/hunter/general/ArcaneShot.jpg index 9302b52927ad0fa6f84010a7d29c618c0049bc11..42db1272477212afec4496d440de5ef28819547c 100644 GIT binary patch delta 1724 zcmV;t21EIw5RVd&qysAeDY2)>0e|_Y{t6xYaa?HHhP$W#0L0!a=-`em4Q#|~X&i!d z5_#bK+dP3FU7YXRo-<07NuNv%aqdUsUGMx9cE>(HnoJF` zxzDy*zIX5^gYSHQ<1HUa)8mdy&0hH|Y$K9Di#@||pp(E=Bo-%tJ;(>{cz+Lra!eNv z)5l{W7kJ-WY1I0xM7^7Hn>}QH)_)Kd(iMQn_m>N}$BtlA_dy@uVaQR=2tCDp+4}P>BPZfvB9EmO;8oe?2f_w8+-VtL>8 z&%s~%9zSC*{1aVQZSe2mbYC5QEqLR`TJEu9;tve?mrJ_RwQYCCQC`b0_64&f*ZPoa zTdP?kNlaT7HDX>f6n{*Ac_w~S{{V!$;4l3fW{3X(el@@TT~=63b{7juIBQDjUe>!w zw`;ww?Y8~;UxO3wO{q%$Wxx0+_KzmB@f=t!%vQU%>KcvQ;FzsqQdqlf1n{}w0$G?S z1dt6M*yqC*J`(u5@ZLxyjz1Cj()A&LUnmjyKf`6)?OK$lJAXyQ$RuIcWI{$DZ;h+n z{{U%EfcE}8_?LAit7mLRJ3&34YA_ zhr@4&{{RuZUE`I}BKU=>+1%Lb(8F@3&%%~TX()$Jj!4NxnrRv%v@-z>zmf=v1um z(0F+KPk;4a&)yBn2q}!A0Yk%6wcjZ=%`lzP$ZJvER9B1##`u?{+ zd%SbuF9ZA^@W9kOTMmL~fzoc4X1TqRNaT*)V@U8-|h@)D3DqiuG0!1%Yp z-W&L(`*Zwn)im8btvoZ~&lp-+X)7J;8(k*ttYeLuI{=oVQ*CD_ow{!$%ePjJHKEqXr-dW%3wwBisGqS9)w4xSMw2%2_N@Q{YAXlP%O|rJoegk-J zYa2To8=H$$q`k$ptZ>{5HD+OKvM3I)=XPV2Mzu*P?0i$)D?;9_|pB-vmEBM0JSNeU8?79%K(RHn6 zdvg?5nqaslHHOL1$#HQ$Az}0HWhxuwU)qQM3Z3!0;(x*2YvG;8j@!hx8ic+^zv3M~ zPKwULX!b7aJ5rFOhAqLvNX$a@Rsf72!D3~ delta 1484 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 delta 1054 zcmV+(1mXMA4)+X@qyr}aBC)5*0e_wFcZ0kK<4aq6IJA2mKUIz}g4*duZV2jQla0sO zx#p?(+u`?xyf`Dbi$>XfzcLvuP(l|Rs^ny_BxLlg`+FGgZIxv0f(ZM{dk}jO>t5aa zG3tIE_@CnVJUiotzL8`>YZcwJfn;FJi5$)t5an3xe2=>M!Nq*`ZSC^vi+>SLPE`8E zx262`y8Ks~+xt6)aCuI9gn4!&4N8_JrOQ$@<7p+UPAc59veBo@B$~8kZf_6LbRP|- zp$FRZTWKx#fhxso7nsBSoQ!6>E3bt<3(_o_{`*hU?6mv>k9BAgX^#hDM!78GI3Q#K zI@i-5wAbwQ;6K@8!fP~h>VKDdwdU!fbx2`IAw~i7u>%%u!4v`kEKgu7WbqO99a(n&KW<3#YE+9dKUd}$0jkCuyms(+}xfE!K#9kOVx zZ?S!7udn)zFF(DXj!Q45-Tjq6{1p%KHNF;EzO$>`#T-$~EH=heR!!%I0F_hJjOP`# z;C~P5`Ui_FZmq;KLklo@B9%sCDn{+BLvV0$j-$PD9vnlyIiZ?sdE@3ep?$JOeL)>7 z(DV-+{{X^CaUGtluz%a?(gL=(v8u-v^L9x9`?9upAOL!Cz^|I(Osg9eQoS#F5>{&0 zwwAxAUG(0^>^>aknMG(}u(-!6b*ayq5=|)0^CqI(O(|U@lU9pN-U)o;A%huCbat*vAEWx19cNMmu&-Bl~|H*Vb5llZ^K8mEk>j!i;n z);LG*ZEe%bwzu`#zNggWpQjb``5q4+Rw|r**ePARJGPzdyX|Y~ZMCyU+3~h_k>F(O z)lQ}*({PL~oPT1PX*p=QR;{S}&R4ooQc@|lqw{nWRwG=#V`*x(V7>`3=DvoFR^4_(?cZGE+f`CG`7Dti&~^#=xuD@fyN^76fp z%W(W#kE0$~+TLmZ0GN2QUEkfSr?@-*<_UjU4Dm?u6`xy z4V|}}zL7sar4&~!6&g@f=_HcbBd;*ytk)e{Sd3JZr!8A)-SqF#B$s58JwwBPvERmT z8hCe4)-u8w%TT=Zw>vG zt=53BT3fH$e}5|dsywqWWC}|uL$$ER-^UO5C4Y*(7W^lh#@cMwy7z{()i9kyOubu} zrblI1{QG8(CW|cJ>to-ya+Vu6F!djezA9e;{?k|9E7JbUvh!26*6pl6wSOhC({)&{ zZN%0Z%=as{V_*_jS)q->nQfVJp^C0Ag}yNA3F7Y;wY|o@t@t;`8cwC5+<3BK_7&CU zk}oZNAU;5Zw}k(-X0zk)Fr&}tk=5ct8OQ`x{dFyp^n{dqaSH_QCd7K zVHf84jd*^;F<7`#!zIZzc_}Y-O{V0pzWSt};EoD-IwoVM-)a6JzP^v_@MUc5XO7<5C3Xfly!HlG0pw!G0X7OK_^GH) z{{RSd{{RHVV3FI{>-Re1U5SY;=UUp^`CeY$HvOA+?Z-Ruv|}W%9sekF#lQ@*yi-8-f+KD#I zyTJ0;WHPQ+z02W_y{vo?@gIu338VOec{z44-}KP$PpH_k2N`Rtu?y8MzvmgJ15;-^f-Q=BM(#Rc$d4; zwQDu1e>++JS3fuAfpv9~)GFU%=jG3OE7hl);in#Inm_CDTYo<@^a^srO>TJp37oRj_=QdwEF`+ewm0cwI<2 zI3(u1@4@9hLVxd^R~zGR34iI%?i$q_YLW{QNc?kL8KxT-Mn2Y*lU=2E z`0x0$>G3&jcTG+$HNB;F{{ZkU*WS;&zu>N4vm*Rk@qUr2&@b%= z+6;^&k#DW!ggw38tb#oKq6s8JB#cR2>WWvwU$gJ+k?~9RR@ZeqABX-p*St5UO+LJ} zlr#CZyO^e2Lm+6wovJs5-GPkbiYwu(XA~+;%5G78RBYAOom%{lo2i^(r8ei!7qd~b LS6Xh`{Ez?HLh)Ws delta 1546 zcmV+l2KD)&5#JDyqys7dD6yx=0e|`5!~Xyk{w06GPJSs`c$)9T9x(WA;Eh5tZQ<)* z4eDQGOFMYvC6aZF9(;)8Wf=V{r+(U1DtUQaH z?3N+rV(KgcOIx#mxH$ooo_YI^3UyxRh{TUENN>6bInOxySJZzH{uDpQ{{Y(O z{t^!rG*ExSZQ=WW4^JK1`QWiPVKl~IU;s@;A@gcPhTVL@PjWipC5o&sNv8X-Vo>1h;1ISLt zT#{EiTyStgGL_^%6MsB9`bEXtW99Os#s)arXs^k5!+`R*UA2B{{Tp`f_N@1Pn{9mib!bN3<%B+)7PLQ8T7A#{{R;JYw%A`TN9?~o;UD%t1Zo> zWD@Aykm%TA!z8bmg_QlmxUbkU$YN#VfmRnp$q|^*p>i7c}Y0 z{Icw?_pdJf4}Y{gF{x`G5qw{9;5|-TxhC-zqdd1h8PukoFLdkMg3&lmb2_U#6!Le< z5oJb9o^gNRqMr(NkBJ`*bdQWnq~2Qii@|qtcwgcbxIo#ufe~KikKO|260!ozwOtHA z<}yz!@bmVZ@CU`%^xq0!{foo8RMR3I8^(WWj^58XS$_?lpsh8ejri>YcYuJ#Fi;`G4bvhhOkM zp)_aAHh*x)p|Oqe>?I!^c^}BpU6<`i`#);mvY*C3h~EzNg_b$AJ4yb=C5*=R7KKYe zCezraag5+?1wgu>GLLhz6RD-2MmlbRhKG31Xo$3d{D&uu750imm_ODK(67>2lM@F>OYP?5Yl{E z;C~5TYMNf1sa>bqt=4<1WST{de5Oq@+EFg)uim7tT3K6P#@(ZAtV_-Fow%?JMg z1@V9JHO+iN_-o-oj)_c}^o{_1$Tij_+30WbXE+l^<7~}#(K5E4u znJTIx;Z(0g{h2%=r1*2-HPdPOUY%mvr;K##3&U@0ksG^mGGUWw8{;RPjgg+zSLXT8 w7GrT3$;OSN7} None: + def __init__(self, monitor, path, name, castTime = 0, cooldown = 2) -> None: + self.spellName = name + self.castTime = castTime + self.logger = Logger("Spell") + self.cooldown = cooldown self.monitor = monitor self.spellIcon = cv.imread("assets/spells/" + path, cv.IMREAD_GRAYSCALE) + self.lastUsed = None - def click(): - self.monitor.findMatchAndClickIfAvailable(self.spellIcon) \ No newline at end of file + def isOnCooldown(self): + if self.lastUsed is None: + return False + return time.time() - self.lastUsed <= self.cooldown + + def cast(self): + if self.isOnCooldown() is False: + self.logger.log("Casting " + self.spellName) + lastCursorPosition = pyautogui.position() + self.monitor.findMatchAndClickIfAvailable(self.spellIcon) + time.sleep(self.castTime) + pyautogui.moveTo(lastCursorPosition) + self.lastUsed = time.time() \ No newline at end of file diff --git a/bots/fighting/FightingAgent.py b/bots/fighting/FightingAgent.py index deffcd1..9d65b2c 100644 --- a/bots/fighting/FightingAgent.py +++ b/bots/fighting/FightingAgent.py @@ -12,24 +12,25 @@ class FightingAgent: self.logger = Logger("Combat Agent", player.debug) self.hasTarget = False self.combatClass = self.loadCombatClass() - self.getRoutine() def loadCombatClass(self): return 42 def getRoutine(self): - if (self.player.playerClass == CLASSES.HUNTER and self.player.player.playerSpe == SPE.MARKSMANSHIP): + if (self.player.playerClass == CLASSES.HUNTER.name and self.player.playerSpe == SPE.MARKSMANSHIP.name): from bots.fighting.hunter.marksmanship.Routine import Routine + self.classRoutine = Routine(self.monitor, self.player) else: self.logger.log("Cannot find a Routine for your class and spe") - self.classRoutine = Routine(self.monitor, self.player) def startFighting(self): + self.getRoutine() self.player.checkConnection() - self.classRoutine.start() - self.isCombatModeEnabled = True - while self.isCombatModeEnabled is True: - time.sleep(0.1) + if self.classRoutine is not None: + self.isCombatModeEnabled = True + while self.isCombatModeEnabled is True : + self.classRoutine.start() + time.sleep(0.1) self.logger.log("Combat mode is now disabled...") def stopFighting(self): diff --git a/bots/fighting/hunter/marksmanship/Routine.py b/bots/fighting/hunter/marksmanship/Routine.py index f51dec7..801cff2 100644 --- a/bots/fighting/hunter/marksmanship/Routine.py +++ b/bots/fighting/hunter/marksmanship/Routine.py @@ -4,10 +4,14 @@ class Routine: def __init__(self, monitor, player) -> None: self.player = player self.monitor = monitor - self.arcaneShotSpell = Spell(monitor, "hunter/general/ArcaneShot.jpg") + self.arcaneShotSpell = Spell(monitor, "hunter/general/ArcaneShot.jpg", "Arcane shot") + self.hunterMarkSpell = Spell(monitor, "hunter/general/HuntersMark.jpg", "Hunter's Mark", 0, 20) + self.blackArrowSpell = Spell(monitor, "hunter/marksmanship/BlackArrow.jpg", "Black Arrow", 0, 30) def hasTarget(self): pass def start(self): - print("Starting fight routine") \ No newline at end of file + self.hunterMarkSpell.cast() + self.blackArrowSpell.cast() + self.arcaneShotSpell.cast() \ No newline at end of file diff --git a/core/Player.py b/core/Player.py index c5016ba..c2d96ea 100644 --- a/core/Player.py +++ b/core/Player.py @@ -24,7 +24,7 @@ class Player: self.playerName = self.config.file["name"] self.enterWorldButton = cv.imread("assets/" + self.lang + "/menus/EnterWorldButton.jpg", cv.IMREAD_GRAYSCALE) self.reconnectButton = cv.imread("assets/" + self.lang + "/menus/Reconnect.jpg", cv.IMREAD_GRAYSCALE) - self.logger.log("Connected with " + self.playerName + " (" + self.playerClass + ")") + self.logger.log("Connected with " + self.playerName + " (" + self.playerClass + " - " + self.playerSpe + ")") def connectButtonFound(self): self.isConnected = CONNECT_STATUS.DISCONNECTED