From 9a2185ca4b9b877b49488b5e3944561a640dd4e0 Mon Sep 17 00:00:00 2001 From: 21in7 Date: Wed, 25 Mar 2026 21:24:13 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=8B=A4=ED=8C=A8=ED=95=9C=20=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + __pycache__/action_executor.cpython-311.pyc | Bin 23369 -> 23916 bytes action_executor.py | 18 +++++++++++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3494dfa..66cd9d4 100644 --- a/README.md +++ b/README.md @@ -114,3 +114,4 @@ planner.set_goal( - AI가 "move 먼저 → 작업" 패턴을 학습하도록 프롬프트가 설계되어 있습니다 - `agent_log.jsonl`에 모든 행동과 타임스탬프가 기록됩니다 - `mine_resource`에서 실패한 채굴 타일 제외(`exclude`)는 Lua와 Python 양쪽에서 정수 타일 좌표(`tx, ty`) 키로 통일해, 제외한 좌표가 반복 선택되지 않도록 합니다. +- 또한 채굴 시작(`mining_state`) 좌표는 정수 타일이 아니라, Lua가 찾은 실제 자원 엔티티의 `e.position`(정확 실수 좌표)을 사용해 “플레이어가 타일 위에 있는데도 즉시 채굴 감지 실패”를 줄입니다. diff --git a/__pycache__/action_executor.cpython-311.pyc b/__pycache__/action_executor.cpython-311.pyc index dc3d2d175ac6c93309489cea065d2e59b0b1b4c1..950cbd752865c8c526bf532df56f6123afda02c3 100644 GIT binary patch delta 1936 zcmaJ=drVVT7(eIs0o7h8LMfL=xxJ-8M`@|x0~HVvW&&<(MK*j9;w=P-g_WzLY7Mc%GzlK}mmV??*;I@pUy-Io%HBO86I zyDxVud8J>0u1eKesjTKa0l+1^=htp5xk+~dPtJRwF-Db?$f+0X0Pu+{L|?4}MJ^}(8 z=#?~q4A~df>4~EOcwcDd(lJiEfIMEyM!AYL}vI z1$(Z!)6p)Sh0NxYakVs`f~oGfCZz-dE_*SuL$x5Y%u)NgS`iQXcx+P&N;Y6uH(os%P`UIEt4Y$C82O^D5RjEENwa%HI%=rZm$R_i96q z)&Cn;5beN(9_OlI^e7}aH%iPaD0|VB4R|ES`gj=&V_lI;x-aAjJOi^&-b&c;6^qWr zB37d)66azAMyoKIw+9m6Nrb=ieMEm@A-%ud(e7w#?%`TE``pnJbolV0kZ+O>`G-OS z-lyY-=+MxSxxs-s-=v8Sojeg99LI0S=cO6!5oy~MDl;Mf{rbma&FukKINsu-u|J`pl<`sY~p%NoU5GQWbZZEUFFORXXm~y zhq>F??%?u!ILzA2tzFLjEnGfhU`+;=H<*iCO(J1TG{&Ggm+7Tq%viHnn%QMEE&|)R z15SrE%;lGr)qERjdApor3#~D7p0?;qSf#QYAY&_Z-a_z_zbk6 zD@D84P=(TIsEkN3j{r<&ckPYH7CxeyXMi$FG0BiU7s)_vqy&{)pY$upYB;SmKGa$s zXe|M)HK?_ER!$p=9vap@FsvQ#nWzjH%7cdTfQs?Nd-JC$-Kh4o_M#*}nSzwbBY#9? zdK>+fBTc8YBibv;7aPYbFE@Rry{z?Y@es4GdFyih2QRjaxdJ+CP-nfqX4ORMEjUR9 zimQUfRbIIVKd626Z>1@uHUcp5NT*dPCln{iF(-F{i1XP_t zRp*qd6CEx7To#doG`+B{WE8I0Qc$BNZmShFj4-<Qvp&4x=d z#aVn(Mxw@f4*gJ(3s0jzDt17nux&FhRgH$Ovy&|3b(| zu)fcS?v>RFA8*T*LLa(ZM?*ilS4YL2!L}ObC<@nY#2Jm-tKeE;|Mss4?8MX;!t1EM zUX72lwSFDkEu5*hh=%*`mXp_UoKfP87gOFul&uu9g3VR|Nv~)i<_(i*w803wg}V)# zAV!xrZh#!BZ0skmiD82137r$dy~a=Awu4aC0wW;G{K+w4LLU=u9k|mlWox|C6nyi& lm}+_E6o%g~B;ajycV}fqs|->RusnSh)j$6at8*nT?qB!vE+hZ| delta 1499 zcmaJ>ZA@EL7(Va)pmgK57y5DAu|lCxsI@?0W3s|F*a|2*5()^&SfF>riRtu$agy6C zW^qwNVz;BR33d2~F~Mzc)fj&`=QNpr91xO`CC2%~L=$3)l9-s7cuos0AbN7obKdiQ zp7%K?cja^V_ERui5riFxj4O+`PyYG%tl_LvpRPk_6sc$e&vIsb&DjGvSjfB1GLdia z&Ajh$t*aT?K*A(SS*>U|OAT&*8Y5+ZJ2EOIC_zbFX zk|8!SQ=^+mQ8AjSii6%wHFm3+I9ecqK;xVwuAkYOH3lPRWr$`yWFpILl8sUG5WkV0 z9M-Wp>oBsR_JG~ zsukZYtda^S5C8JD;#{|7Utyf1tin30s#P@&aI}J=OZH%mn&gbAIl`-1ginF6l0_sp z9&pz{0lw-E>db?O)U=5t9~Im3v5CJT)gTv-arBmwtB2lAAUm$xdcH{c|HeI{^5kZ{ zaUFiOz?8ZTmQ=^Li@e5vdJ3T!JL1HD71=G1stob>#nbwk5P4B5kX;F_tuLhvgpj99 z3l$#&=0`@G^TZj057n4=FCulgmtv)l(Ka8>z%^y8op!YVqB z&y;uXm3-VXWF%O!CJ=!K&-5htjZIRsiX;z5Ae&#K@Oo3C42u=N)Nw)(mTj(kHqWBX zvtaWs*}V5`{zaSrhHJrAxn!%1@!#8bUu>K3k9S;hj5|JJr-C=~W*V;wGeWE`#>5!> z=ANIcOhQfq5r}ciqWNw8sBl4u_s-|{&9}BwBwttex{%+ukkhvyhL^zmS(>3-n2g@ig;{3n@jNr9E5PsA4S5Nc$_b5+Hy)uq}t#t#& zmby0Jw1GO66XV3ByiegWg$eveeFeORy$$uSOH&$tV$$9r`r$ZE9Bk62o^W&UF1~xz z372rWl1?+XQfQ-a9lz1C4_dWb zEv3|Pwe^6IbYxSGbGW*#O4m((AA{!+K2&YiVr_*WoTs^%l*=dht9B1OtF5$G1F7rj z*bmQRx#Ns5P4mxCPf%vHM8`R3i~!#Y36xwWOzXmDu65zdm+rLAhuZISE;T&8uG)U- g)4u5PF>n*Fbk`p2;lZ9j+v93dzxE$iWhXh@-xvpd2><{9 diff --git a/action_executor.py b/action_executor.py index 2525b80..946d75b 100644 --- a/action_executor.py +++ b/action_executor.py @@ -161,7 +161,9 @@ for _, e in ipairs(res) do local ty = math.floor(e.position.y + 0.5) local key = string.format("%d,%d", tx, ty) if not exclude[key] then - rcon.print(key) + -- mining_state는 타일 정수가 아니라, 엔티티의 "정확한 e.position"을 주는 게 안정적 + -- 반환 형식: "|" + rcon.print(string.format("%d,%d|%.3f,%.3f", tx, ty, e.position.x, e.position.y)) return end end @@ -179,8 +181,13 @@ rcon.print("ALL_EXCLUDED") return False, f"{ore} 근처 타일 {len(failed_positions)}개 모두 접근 불가 — 다른 위치로 이동 필요" try: - parts = find_result.strip().split(",") - ox, oy = int(parts[0]), int(parts[1]) + find_result = find_result.strip() + key_part, pos_part = find_result.split("|", 1) + key_xy = key_part.split(",") + ox, oy = int(key_xy[0]), int(key_xy[1]) # move 타겟(정수 타일) + + pos_xy = pos_part.split(",") + mine_x, mine_y = float(pos_xy[0]), float(pos_xy[1]) # mining 타겟(엔티티 정확 좌표) except: return False, f"좌표 파싱 실패: {find_result}" @@ -198,7 +205,7 @@ rcon.print("ALL_EXCLUDED") mined_this_tile = False for tick in range(300): # 최대 30초 - self.rcon.lua(P + f"p.mining_state = {{mining = true, position = {{{ox}, {oy}}}}}") + self.rcon.lua(P + f"p.mining_state = {{mining = true, position = {{{mine_x}, {mine_y}}}}}") time.sleep(0.1) if tick % 8 == 7: @@ -215,7 +222,8 @@ rcon.print("ALL_EXCLUDED") else: stall_count += 1 - if stall_count >= 2: + # 채굴은 "바로 아이템 카운트가 오르지" 않을 수 있어 너무 빨리 포기하지 않도록 완충 + if stall_count >= 5: break self.rcon.lua(P + "p.mining_state = {mining = false}")