콘텐츠로 이동

플레이어 거래

플레이어 거래는 프로토콜 v30에서 추가되었습니다. 플레이어 대 플레이어로 아이템과 골드를 직접 주고받는 시스템으로, LLM 상인과의 흥정과는 완전히 다른 별개의 시스템입니다(상점과 경제 참고).

채팅창에:

/trade <이름>
  • 상대는 요청 알림창을 받습니다. 동의 절차는 /party와 동일합니다 — 30초 TTL, 동시 최대 5건의 대기 요청, 거절된 요청도 TTL이 끝날 때까지 남아 있습니다. /block 목록에 있는 상대는 자동으로 거래 요청이 거부됩니다.
  • 근접은 시작 조건일 뿐 아니라 유지 조건이기도 합니다 — 거래 도중 거리를 벗어나면 세션 전체가 취소됩니다. 거래를 눈에 보이는 물리적 행위로 만들고, 원거리에서 요청을 도배하는 것을 구조적으로 막습니다.
  • 한 사람당 동시에 하나의 거래 세션만 가질 수 있습니다.

다른 플레이어가 펼쳐둔 좌판을 클릭해도 이 문서가 설명하는 플레이어 거래창은 열리지 않습니다 — 그 경로는 애초에 작동한 적이 없습니다(상인 클래스가 operator 전용이라 플레이어가 펼친 좌판은 존재한 적이 없었습니다). 프로토콜 v68에서 이 경로를 없애고, 실제로 작동하는 위탁 좌판으로 바꿨습니다: 행상 좌판을 사서 NPC가 /lay_stall로 펼치는 것과 같은 탁자를 펼치고, 배낭 속 물건에 값을 매겨 올려둡니다. 손님은 흥정 없이 붙은 값을 내며, /trade가 쓰는 잠금·확인 단계도 없습니다.

  • 아이템은 소모되지 않습니다. 한 번 사용해 펼치고, 다시 사용하면 접습니다 — 버스킹 모자와 같은 토글 방식입니다.
  • 올려둔 물건은 배낭에 그대로 남는 소프트 예약 상태입니다 — 내리거나 팔기 전까지는 판매·버리기·사용·장착·거래가 막히고, 그 무게는 계속 주인이 짊어집니다. 동시에 최대 12개까지 올릴 수 있습니다.
  • 탁자를 펼치고 있는 그 행상 좌판 아이템 자체는 올릴 수도, 팔 수도, 버릴 수도 없습니다 — 팔면 접을 방법이 없는 탁자가 남기 때문입니다.
  • 판매가 성사될 때마다 **판매세 5%**를 걷어 소멸시키며, 세금은 판매자 수입에서만 빠지고 구매자는 붙은 값 그대로 냅니다.
  • 주인은 좌판 10m 이내에 머물러야 하며, 벗어나거나 층을 바꾸거나 로그아웃하면 자동으로 접힙니다.
  • 주인은 최대 32자의 간판을 직접 쓸 수 있고, 그 밑에는 항상 주인 이름이 붙습니다. /mute 중에는 간판을 보거나 설정할 수 없고, /block 대상의 간판은 차단한 사람에게만 가려집니다.
  • NPC는 좌판에서 구매하지 않습니다.

잠금 후 확인(사기 방지의 핵심)

섹션 제목: “잠금 후 확인(사기 방지의 핵심)”

이 설계 전체는 “수락을 누르는 순간 상대가 물건을 바꿔치기하는” 고전적인 사기 수법을 막기 위한 것입니다.

  • 양쪽 모두 잠금(lock) → 확인(confirm) 두 단계를 거칩니다. 어느 한쪽이라도 제안 내용을 바꾸면 양쪽의 확인 상태가 모두 리셋됩니다 — 잠근 뒤에는 내용이 바뀔 수 없으므로 “확인했다”는 곧 “실제로 본 그 내용”이라는 뜻이 됩니다.
  • 제안이 바뀔 때마다 revision 번호가 올라갑니다. 확인 패킷은 자신이 본 revision을 반드시 포함해야 하며, 서버는 오래된 revision을 담은 확인을 거부합니다 — 리셋 알림이 도착하기 전에 이미 전송된 클릭이 통과하는 경합을 막습니다.
  • 제안 상태는 변경마다 전체를 통째로 전송하며, 델타 방식이 아닙니다. 패킷 하나를 놓쳐도 양쪽 화면이 영구히 어긋나지 않습니다.

아이템의 강화 등급(+7 철검)은 거래창 안 아이템 이름에 직접 표기되고, 확인 화면에서 한 번 더 나열됩니다. +0+7은 아이콘과 모델이 완전히 같습니다 — 강화 수치가 툴팁에만 있다면 서둘러 거래를 끝내려는 사람은 굳이 확인하지 않는 경우가 많습니다. 가장 깨끗한 사기 경로이기 때문에, 플레이어가 직접 찾아보게 두지 않고 숫자를 눈앞에 내놓습니다.

  • 부분 스택을 지원하며, 드래그가 아니라 다른 곳과 같은 클릭 + 수량 입력 방식을 씁니다.
  • 스택의 단위는 아이템에 강화 등급까지 더한 값이라, 강화 수치가 다른 같은 아이템은 한 줄로 합쳐지지 않습니다.
  • 금액은 탑햇(버스커 모자) 팁과 같은 자유 입력 방식을 씁니다 — 1g20s30c, 2s, 또는 순수 숫자는 구리로 취급합니다(음악과 바드 참고).
  • 잠금 전에는 Esc로 거래창을 정상적으로 닫을 수 있습니다.
  • 잠금 후에는 Esc가 동작하지 않습니다 — 여기까지 온 거래는 명시적인 취소 버튼을 요구합니다. 반사적인 키 입력 하나가 이미 진지하게 진행 중인 협상을 날려버리지 않도록 하기 위함입니다.
  • 거리 이탈, 로그아웃·접속 종료, 사망은 즉시 세션을 취소합니다.
  • 전투 중이라는 이유만으로는 취소되지 않습니다 — 그렇지 않으면 상대를 한 대만 때려도 거래를 강제로 끊을 수 있어 그리핑이 너무 쉬워집니다.
  • 양쪽 모두 아무 반응이 없으면, 거래창은 누군가 확인을 누르거나 유휴 타임아웃(분 단위, 활동이 있으면 갱신)이 올 때까지 열려 있습니다.

탁자 위 아이템은 여전히 내 가방 안에(소프트 예약)

섹션 제목: “탁자 위 아이템은 여전히 내 가방 안에(소프트 예약)”

제안에 올린 아이템은 가방에서 빠지지 않고, 소프트 예약 상태로만 표시됩니다:

  • 예약된 아이템을 판매·버리기·사용·장착하려 하면 거래가 열려 있는 동안 서버가 거부합니다.
  • “전부 판매”, “전부 버리기” 같은 정의 단위의 일괄 명령은 예약분을 피해가려 하지 않고 거래 중에는 통째로 거부됩니다 — 오류 메시지가 먼저 거래를 끝내라고 안내합니다.
  • 펼쳐둔 버스커 모자도 예약으로 취급되므로, 거래에 쓰려면 먼저 회수해야 합니다.
  • 성사된 거래는 전부 아니면 전무로 한 번에 이동합니다 — 확인 후 어느 한쪽이 소지 중량을 초과하거나 상태가 바뀌었다면 거래 전체가 중단되고 양쪽에 사유가 전달됩니다. 성공한 거래는 평소의 주기적 저장이 아니라 즉시 데이터베이스에 기록되며, 그 기록이 끝난 뒤에야 성공을 통보받습니다. 완료 후에는 양쪽 채팅창에 각각 무엇이 오갔는지 적힌 개인 기록 한 줄이 남습니다.
  • 장착 중인 아이템은 탁자에 올릴 수 없습니다 — 먼저 해제해야 합니다.
  • 시작 무기 세 가지 — 낡은 철검, 타다 남은 횃불, 낡은 만돌린 — 은 명시적으로 거래 불가로 지정되어, 무료 시작 장비를 캐릭터 사이에 넘겨 골드로 바꾸는 통로가 되지 않도록 막습니다.
  • 최소 레벨 제한은 없습니다 — 거래는 상인 거래와 마찬가지로 완전히 개방되어 있습니다.
  • NPC는 플레이어 거래에 참여하지 않습니다 — 서버가 NPC를 대상으로 한 거래 요청을 그대로 거부하며, 이는 동시에 경비병 Karl의 창 같은 NPC 전용 지급 장비가 거래를 통해 유출되는 것도 함께 막습니다.
  • 잠긴 아이템은 거래 테이블에 올릴 수 없습니다 — 먼저 잠금을 해제해야 합니다. 아이템 잠금 참고.