fix: 실패한 타일 제외
This commit is contained in:
@@ -114,3 +114,4 @@ planner.set_goal(
|
|||||||
- AI가 "move 먼저 → 작업" 패턴을 학습하도록 프롬프트가 설계되어 있습니다
|
- AI가 "move 먼저 → 작업" 패턴을 학습하도록 프롬프트가 설계되어 있습니다
|
||||||
- `agent_log.jsonl`에 모든 행동과 타임스탬프가 기록됩니다
|
- `agent_log.jsonl`에 모든 행동과 타임스탬프가 기록됩니다
|
||||||
- `mine_resource`에서 실패한 채굴 타일 제외(`exclude`)는 Lua와 Python 양쪽에서 정수 타일 좌표(`tx, ty`) 키로 통일해, 제외한 좌표가 반복 선택되지 않도록 합니다.
|
- `mine_resource`에서 실패한 채굴 타일 제외(`exclude`)는 Lua와 Python 양쪽에서 정수 타일 좌표(`tx, ty`) 키로 통일해, 제외한 좌표가 반복 선택되지 않도록 합니다.
|
||||||
|
- 또한 채굴 시작(`mining_state`) 좌표는 정수 타일이 아니라, Lua가 찾은 실제 자원 엔티티의 `e.position`(정확 실수 좌표)을 사용해 “플레이어가 타일 위에 있는데도 즉시 채굴 감지 실패”를 줄입니다.
|
||||||
|
|||||||
Binary file not shown.
@@ -161,7 +161,9 @@ for _, e in ipairs(res) do
|
|||||||
local ty = math.floor(e.position.y + 0.5)
|
local ty = math.floor(e.position.y + 0.5)
|
||||||
local key = string.format("%d,%d", tx, ty)
|
local key = string.format("%d,%d", tx, ty)
|
||||||
if not exclude[key] then
|
if not exclude[key] then
|
||||||
rcon.print(key)
|
-- mining_state는 타일 정수가 아니라, 엔티티의 "정확한 e.position"을 주는 게 안정적
|
||||||
|
-- 반환 형식: "<tx,ty>|<ex,ey>"
|
||||||
|
rcon.print(string.format("%d,%d|%.3f,%.3f", tx, ty, e.position.x, e.position.y))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -179,8 +181,13 @@ rcon.print("ALL_EXCLUDED")
|
|||||||
return False, f"{ore} 근처 타일 {len(failed_positions)}개 모두 접근 불가 — 다른 위치로 이동 필요"
|
return False, f"{ore} 근처 타일 {len(failed_positions)}개 모두 접근 불가 — 다른 위치로 이동 필요"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
parts = find_result.strip().split(",")
|
find_result = find_result.strip()
|
||||||
ox, oy = int(parts[0]), int(parts[1])
|
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:
|
except:
|
||||||
return False, f"좌표 파싱 실패: {find_result}"
|
return False, f"좌표 파싱 실패: {find_result}"
|
||||||
|
|
||||||
@@ -198,7 +205,7 @@ rcon.print("ALL_EXCLUDED")
|
|||||||
mined_this_tile = False
|
mined_this_tile = False
|
||||||
|
|
||||||
for tick in range(300): # 최대 30초
|
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)
|
time.sleep(0.1)
|
||||||
|
|
||||||
if tick % 8 == 7:
|
if tick % 8 == 7:
|
||||||
@@ -215,7 +222,8 @@ rcon.print("ALL_EXCLUDED")
|
|||||||
else:
|
else:
|
||||||
stall_count += 1
|
stall_count += 1
|
||||||
|
|
||||||
if stall_count >= 2:
|
# 채굴은 "바로 아이템 카운트가 오르지" 않을 수 있어 너무 빨리 포기하지 않도록 완충
|
||||||
|
if stall_count >= 5:
|
||||||
break
|
break
|
||||||
|
|
||||||
self.rcon.lua(P + "p.mining_state = {mining = false}")
|
self.rcon.lua(P + "p.mining_state = {mining = false}")
|
||||||
|
|||||||
Reference in New Issue
Block a user