스티브코딩

NPC 상점과 퀘스트

NPC 버튼·hasitem·점수판·태그로 상점, 보상, 퀘스트, 투표 만들기

도구·명령어2026-10-20 갱신

NPC 상인 첫걸음: 명령 버튼으로 물건 주기

  • /wb로 월드 빌더를 켜고 NPC 이름·대화(“선택하려면 에메랄드 하나가 필요하다네”)를 씁니다.
  • 고급 설정 → 명령 추가 → 버튼 모드 켜고 버튼 이름 입력. NPC 명령은 앞의 / 없이 씁니다.
  • 한 버튼에 두 줄: clear @p emerald 0 1(에메랄드 1개 가져가기) · give @p arrow 1(화살 주기)
  • 대상은 @p(가장 가까운 플레이어). @s로 쓰면 NPC 자신이 대상이 됩니다.
  • 한계: 에메랄드가 없어도 화살을 받습니다 → 다음 장의 커맨드 블록이나 hasitem으로 막습니다.
‘위엄있게 인사’ 버튼의 clear·give (04:28)
‘위엄있게 인사’ 버튼의 clear·give (04:28)

커맨드 블록으로 보완: 에메랄드가 있어야 사는 상인

  • NPC 버튼은 정해진 자리에 레드스톤 블록만 놓고, 옆의 커맨드 블록 3개가 거래를 처리합니다.
위치 설정 명령
NPC 버튼 ‘친절하게(화살10개)’ 버튼 모드 `setblock 24 62 53 redstone_block`
① 커맨드 블록 임펄스·무조건·레드스톤 필요 `/clear @p emerald 0 1`
② 커맨드 블록 체인·**조건부**·항상 활성화 `give @p arrow 10`
③ 커맨드 블록 체인·무조건·항상 활성화 `setblock 24 62 53 air`
① NPC 버튼은 레드스톤 블록만 놓기 (02:15)
① NPC 버튼은 레드스톤 블록만 놓기 (02:15)
② 조건부 체인 블록의 give (04:04)
② 조건부 체인 블록의 give (04:04)

조건이 맞을 때만 거래하는 NPC 상점

예: 썩은 고기 10개 → 다이아 1개 (NPC 버튼 한 개에 네 줄, hasitem)

/execute as @initiator[hasitem={item=rotten_flesh, quantity=..9}] at @s run say 썩은 고기가 부족하다…
/execute as @initiator[hasitem={item=rotten_flesh, quantity=10..}] at @s run say 썩은 고기 10개를 다이아 1개로 바꿨다.
/execute as @initiator[hasitem={item=rotten_flesh, quantity=10..}] at @s run give @s diamond
/clear @initiator[hasitem={item=rotten_flesh, quantity=10..}] rotten_flesh 0 10
  • 순서: 부족 안내(맨 위) → 성공 안내 → 주기 → 값 받기(맨 아래)
  • 조건 바꿔 쓰기: 아이템 개수 hasitem={item=…,quantity=10..} · 점수 scores={happy=5..} · 진행 상태 tag=!m1 · tag=m1
영상 속 명령 네 줄 (01:59)
영상 속 명령 네 줄 (01:59)

hasitem 더 알기: 개수·칸까지 조건으로

  • hasitem은 베드락 1.18.30에서 정식으로 들어온 대상 선택 인자입니다. NPC 하나와 두 줄로 상점이 됩니다.
  • quantity=2..는 2개 이상, ..9는 9개 이하, 2..10은 2~10개
옵션 뜻
item · quantity 아이템 이름 · 개수(범위)
data 아이템 데이터 값
location · slot 있는 곳(예: `slot.hotbar`) · 칸 번호(0부터, 핫바 마지막 칸 = 8)
- 예: 핫바 마지막 칸에 사과가 있을 때만 → `hasitem={item=apple, location=slot.hotbar, slot=8}`
location·slot을 쓴 hasitem (03:06)
location·slot을 쓴 hasitem (03:06)

시세 상점: 가진 돈에 따라 다른 상인 연결

에메랄드 2~10개 11~20개 21개 이상
연결 상인 상인1 상인2 상인3
황금사과 값 1개 3개 6개
- `execute as @initiator[hasitem={item=emerald,quantity=2..10}] at @s run dialogue open @e[type=npc,name=상인1,c=1] @s` - 상인1·2·3은 스폰 알이 아니라 `/summon npc 상인1`처럼 **이름을 붙여 소환**하고 숨겨 둡니다. 보이는 이름·스킨은 같게 바꿔도 됩니다.
입구 NPC의 dialogue open 세 줄 (02:40, 옛 문법)
입구 NPC의 dialogue open 세 줄 (02:40, 옛 문법)

퀴즈 NPC: 보상은 한 번만

  • 정답을 아는 학생이 다시 풀어 보상을 또 받는 문제 → 태그로 막습니다.
  • 정답 버튼(‘13개’)에 두 줄:
give @initiator[tag=!q8] black_wool
tag @initiator add q8
  • 처음 맞히면 태그가 없으니 양털을 받고 곧바로 q8 태그를 얻습니다. 다시 맞혀도 태그가 있어 받지 못합니다.
  • 오답 버튼에는 명령을 넣지 않습니다. 교육용 에디션은 월드 빌더 권한, 베드락은 크리에이티브 모드에서 NPC를 편집합니다.
태그를 다는 명령을 더한 정답 버튼 (01:03)
태그를 다는 명령을 더한 정답 버튼 (01:03)

퀘스트 NPC: 진행은 태그로, 보상은 한 번만

  1. q1_0 인사: 첫 대화
  2. q1_1 부탁: 썩은 고기 5개 가져와
  3. q1_2 성공·보상: 음반 지급, 완료 태그
  4. q1_3 이미 완료: 다시 와도 보상 없음
  • 핵심: hasitem(가졌는지) · tag(어디까지 했는지) · dialogue open(다음 장면 열기) 세 가지로 퀘스트를 만듭니다.

퀘스트 NPC 명령

q1_0 [대화하기] 버튼 — 완료 여부로 갈림

execute as @initiator[tag=!q1_c] at @s run dialogue open @e[name=촌장] @s q1_1
execute as @initiator[tag=q1_c] at @s run dialogue open @e[name=촌장] @s q1_3

q1_1 [가져왔어요] 버튼 — 주고, 보상 장면 열고, 마지막에 값 받기

execute as @initiator[tag=!q1_c,hasitem={item=rotten_flesh,quantity=5..}] at @s run give @s music_disc_11 1
execute as @initiator[tag=!q1_c,hasitem={item=rotten_flesh,quantity=5..}] at @s run dialogue open @e[name=촌장] @s q1_2
execute as @initiator[tag=!q1_c,hasitem={item=rotten_flesh,quantity=5..}] at @s run clear @s rotten_flesh 0 5

q1_2 장면을 닫을 때

tag @initiator add q1_c

점수판 화폐로 파는 상점

준비(커맨드 블록, 한 번)

scoreboard objectives add Money dummy 골드
scoreboard players set @a Money 1000
scoreboard objectives setdisplay sidebar Money

NPC 버튼 ‘케이크(100골드)’

give @p cake 1
scoreboard players remove @p Money 100
say 케이크를 구입했습니다.
  • 골드가 0이어도 사져서 마이너스가 됩니다 → 반복 커맨드 블록(항상 사용, 지연 200틱 = 10초)으로 kill @a[scores={Money=..-1}]
NPC 버튼의 give·remove·say (02:10)
NPC 버튼의 give·remove·say (02:10)

골드 벌기: 코드 작성기 이벤트로

  • 레드스톤으로 돈을 주는 대신, 게임 속 행동으로 벌게 합니다. 코드 작성기에서는 실행하는 사람이 플레이어 자신이라 대상이 @s
  • 블록 부수기: ‘블록이 깨지면 실행’ → scoreboard players add @s Money 100(블록마다 1~700)
  • 동물·몬스터 잡기: ‘동물이 죽었다면 실행’ → 몹마다 금액 다르게(예: 거미 150)
  • 달리기: ‘플레이어가 달리고 있으면 실행’ → 만보계 1 증가 → 만보계를 5로 나눈 나머지가 0이면 scoreboard players add @s Money 5 → 1000ms 일시중지
① 블록별 금액 (01:41)
① 블록별 금액 (01:41)
② 달리면 5골드 (03:16)
② 달리면 5골드 (03:16)

NPC로 만드는 학급 경제 월드: 설계 예시

구성 운영 방법 핵심 명령
행복 점수판 칭찬·활동 결과를 점수로 쌓고 순위 표시 `scoreboard objectives add happy dummy 행복` `scoreboard objectives setdisplay sidebar happy`
은행 NPC 행복 ↔ 다이아를 1개·5개 단위로 교환 `execute as @initiator[scores={happy=1..}] at @s run give @s diamond 1` `scoreboard players remove @initiator[scores={happy=1..}] happy 1`
개인 거주 구역 출석하면 1~20번지 땅과 주인 태그를 받음 `tag @initiator add s1` (s1~s20)
미션 보상 파쿠르·방탈출·등대 미션마다 다이아 보상 `give @initiator[tag=!m1] diamond 5` `tag @initiator[tag=!m1] add m1`
외부인 내보내기 반복 커맨드 블록이 주인 태그 없는 사람을 밖으로 `execute as @a[x=100,y=-60,z=200,dx=22,dy=100,dz=22,tag=!s1] at @s run tp @s 95 -60 195`
교사용 메모 · 학급 경제 월드 메모
  • 학급 경제 월드는 점수판(행복)과 NPC 버튼, 태그, 반복 커맨드 블록만으로 만듭니다. 출석·미션·건축이 하나의 경제 흐름으로 이어지도록 설계합니다.
  • 은행 NPC는 행복 점수와 다이아를 1개·5개 단위로 바꾸는 버튼을 둡니다.
  • 미션 보상 예: m1 파쿠르 다이아 5개, m2 역사 방탈출 다이아 15개, m4 등대 다이아 5개. 리스폰 NPC는 spawnpoint @initiator ~ ~ ~ 로 부활 지점을 정합니다.
  • 외부인 내보내기 명령의 좌표·크기(dx·dy·dz)는 각 구역에 맞게 바꿉니다. 원문의 tag =! s1처럼 띄어 쓰면 오류가 나므로 tag=!s1로 붙여 씁니다.
  • 명령은 노션의 옛 execute 문법(execute <대상> ~~~ <명령>)을 현재 교육용(베드락) 문법 execute as <대상> at @s run <명령>으로 바꿔 실었습니다(2026-10 공식 execute 문서 기준). 보상을 한 번만 주는 태그 방식(give @initiator[tag=!m1] … → tag @initiator add m1)은 영상 확인(youtu.be/3J3dsAurdQU?t=49).
  • 점수판 화폐 상점(Money)은 스코어보드와 NPC로 상인 만들기 화면 그대로입니다. 두 번째 버튼 예: /give @p bread 3 · scoreboard players remove @p Money 30. 마이너스 처리는 가장 간단한 방법일 뿐이고, 골드가 부족하면 아예 못 사게 하려면 scores={Money=100..} 조건을 붙입니다. 예: give @initiator[scores={Money=100..}] cake 1 다음 줄에 scoreboard players remove @initiator[scores={Money=100..}] Money 100(주는 줄을 먼저, 빼는 줄을 나중에 — 위 은행 NPC와 같은 꼴).
  • 골드 벌기 블록별 금액은 화면에서 100·700·400·1·1·2가 보이고, 자막으로는 석탄·다이아·레드스톤·돌(조약돌)·풀을 깨면 돈이 오른다고 합니다. 블록과 금액의 짝은 영상 01:41 화면, 거미 150 외의 동물별 금액은 02:32 화면에서 확인합니다.

점수판 + NPC로 학급 투표

  • 준비: 후보에게 태그 "1"·"2"·"3"… → 점수판 Number·Vote·Result(dummy) 만들기 → scoreboard players set @a Vote 1, scoreboard players set @a Result 0
  • 투표 NPC의 번호 버튼(1~30번)마다 두 줄:
scoreboard players add @a[tag="1"] Result 1
scoreboard players remove @p Vote 1
  • @p는 NPC에서 가장 가까운 사람이라, 한 명씩 투표하고 근처에 다른 학생이 없게 합니다.
  • 결과: scoreboard objectives setdisplay sidebar Result / 다시 하기: Vote 1, Result 0으로 set
투표 NPC 버튼 1번의 명령 (04:48)
투표 NPC 버튼 1번의 명령 (04:48)

명령어 없이 주민 상인의 거래 바꾸기

  1. 주민 상인이 든 .mcstructure를 /give @s structure_block으로 받은 구조물 블록의 ‘불러오기’로 꺼내기
  2. NBT Studio(GitHub에서 받기)에 파일을 끌어 넣고 Structure → Entity → Offers → Recipes 열기
  3. buyA·buyB(내는 아이템, buyCountA·buyCountB 개수) · sell(주는 아이템) · tier(0이면 처음부터, 1이면 상인 레벨이 올라야) · maxUses(재고)
  4. 아이템 이름은 sell → tag → display → Name, 마법 부여는 ench(id·lvl). ‘다른 이름으로 저장’(영어 이름) → 다시 불러오기
① 레벨 2에 열리는 거래 (00:51)
① 레벨 2에 열리는 거래 (00:51)
② NBT Studio의 buyA·buyB·tier (03:59)
② NBT Studio의 buyA·buyB·tier (03:59)

더 나아가기: 스크립트 API·애드온 상점

하고 싶은 것 방법 볼 페이지
관리자가 상품·가격·재고를 직접 입력하는 상점 스크립트 API UI 상점(관리자는 admin 태그) 스크립트 API 상점·경제
아이템을 넣은 셜커 상자를 세트로 판매 스크립트 API, `!상점`으로 열기 스크립트 API 상점·경제
나침반으로 여는 퀘스트 목록 스크립트 API, 퀘스트 상태는 태그로 스크립트 API 서버 운영
나만의 거래 목록을 가진 새 주민 상인 bridge.로 trading 파일(`wants`·`gives`·`max_uses`) 애드온 만들기
- 명령어만으로 할 때는 이 페이지의 태그·hasitem 방식, 더 큰 상점·퀘스트는 위 페이지의 코드를 씁니다.
교사용 메모 · NPC 상점 메모
  • NPC 버튼에 여러 줄을 넣으면 위에서부터 차례로 실행됩니다. 그래서 줄 순서가 중요합니다.
  • 부족 안내를 맨 위에 둡니다. 거래 뒤에 두면 방금 값을 치러 개수가 줄어든 학생에게도 "부족" 안내가 뜹니다.
  • 아이템을 주는 줄(give)을 먼저, 값을 빼는 줄(clear·scoreboard remove)을 나중에 둡니다. clear가 먼저 실행되면 다음 줄의 hasitem 조건이 거짓이 됩니다.
  • 채팅 대신 화면에만 안내하려면 say 대신 tellraw @s {"rawtext":[{"text":"부족해요!"}]}를 씁니다. clear도 execute as @initiator[…] at @s run clear @s rotten_flesh 0 10처럼 execute 안에 넣을 수 있습니다.
  • clear @p emerald 0 1의 0은 아이템 데이터 값, 1은 없앨 개수입니다. give에서 개수를 빼면 1개를 줍니다.
  • 커맨드 블록 상인: ②를 조건부로 해야 ①(에메랄드 빼기)이 성공했을 때만 화살을 줍니다. ③이 레드스톤 블록을 공기로 바꿔야 다음 손님이 다시 쓸 수 있습니다. 화살 1개 버튼은 setblock 22 62 53 redstone_block으로 다른 묶음을 켭니다. 크리에이티브 모드여야 커맨드 블록을 얻습니다(/give @s command_block).
  • 첫 상인 영상의 버튼: ‘친절하게 인사’ 화살 10개, ‘불쌍하게 인사’ 화면에는 give @p arrow 20(자막의 ‘30개가 들어왔다’는 앞서 받은 10개와 합친 개수, 05:05 화면에 화살 10개), ‘위엄있게 인사’ 1개. 버튼 모드가 꺼져 있으면 대화를 마칠 때 실행됩니다.
  • hasitem 두 줄 상점(영상 설명란 원문, 옛 문법): /execute @initiator[hasitem={item=emerald, quantity=2..}] ~~~ give @s golden_apple · /clear @initiator[hasitem={item=emerald, quantity=2..}] emerald 0 2. 지금 문법은 execute as @initiator[…] at @s run give @s golden_apple(썩은 고기 상점 영상과 같은 꼴).
  • 시세 상점: 입구 NPC가 가진 에메랄드 양에 따라 다른 상인의 대화를 엽니다. 상인마다 같은 황금사과를 다른 값에 팝니다(clear @s emerald 0 1·3·6). "돈이 많을수록 비싸게 파는 상점은 공정한가?"로 가격·수요·공급 토론을 엽니다. 에메랄드는 가진 것만 셀 수 있으므로 돈을 점수판 값으로 하는 방법도 있습니다(설명란).
  • 상인 NPC는 이름을 상인1·상인2·상인3으로 지정해 두고, 입구 NPC 가까이에 둡니다(c=1은 가장 가까운 하나).
  • 명령은 노션의 옛 execute 문법을 현재 교육용(베드락) 문법 execute as … at … run …으로 바꿔 실었습니다(2026-10 공식 execute 문서 기준). 썩은 고기 10개 → 다이아 1개 상점은 영상 화면 그대로(youtu.be/1W3wTc8Vhhc?t=119). 시세 상점의 구간(2..10 / 11..20 / 21..)은 영상 화면에서 확인(youtu.be/JuCgrg7BeIg?t=160, 옛 문법 /execute @initiator[…] ~~~ dialogue open @e[name=상인1] @s). 상인 거래 버튼(영상, 옛 문법): /execute @initiator[hasitem={item=emerald, quantity=6..}] ~~~ give @s golden_apple · /clear @initiator[hasitem={item=emerald, quantity=6..}] emerald 0 6. 이 6개 버튼은 상인3이고(02:04), 상인2는 quantity=3..·emerald 0 3·버튼 이름 ‘황금사과(3에메랄드)’입니다(01:57). 상인1은 1개입니다.
  • NBT Studio: GitHub 배포 페이지에서 받고, 실행이 안 되면 같은 페이지에 안내된 .NET Desktop Runtime 6.0을 설치합니다(01:26). 아이콘이 낯설면 보기 설정에서 NBT Explorer 아이콘으로 바꿉니다. 두 번째 거래 예: 다이아 30개 + 에메랄드 1개 → 네더라이트 검(이름 ‘의천검’, 마법 부여 4개), maxUses: 10000. 마법 부여 id는 베드락 기준으로 찾습니다(예: 밀치기 id 12, 최대 레벨 2). 그냥 저장하면 반영이 잘 안 되어 ‘다른 이름으로 저장’을 씁니다.
교사용 메모 · 퀘스트 NPC 메모
  • 노션 원본은 장면마다 NPC를 하나씩(q1_0~q1_3 이름) 두고 dialogue open @e[name=q1_1] @s로 연결합니다. 여기서는 한 NPC(이름: 촌장)의 대화 파일에 장면 4개를 넣고 장면 태그로 여는 방식으로 정리했습니다. 장면 NPC를 따로 두는 방식도 그대로 쓸 수 있습니다.
  • 장면이 많은 대화 파일은 NPC메이커나 행동팩 dialogue 파일로 만들면 편합니다.
  • 완료 태그(q1_c)는 보상 장면을 닫을 때 붙입니다. 같은 버튼에서 clear 뒤에 붙이면 hasitem 조건이 이미 거짓이라 붙지 않습니다.
  • 퀘스트가 여러 개면 q2_0, q2_c처럼 번호만 바꿔 복사합니다. 태그 확인: tag @s list
  • 같은 원리로 방탈출 정답 NPC(tp @initiator ~ ~ ~8), 층별 미션(PART 05 역사 방탈출)을 만들 수 있습니다.
  • 퀴즈 NPC 영상의 설명란은 give @initiator[tag =! q8] black_wool로 띄어 썼지만, 오류를 막으려면 tag=!q8로 붙여 씁니다. 화면(01:03)에는 태그 조건을 붙이기 전 give @initiator black_wool / tag @initiator add q8이 보입니다.
  • 명령은 노션의 옛 execute 문법을 현재 교육용(베드락) 문법 execute as … at … run …으로 바꿔 실었습니다(2026-10 공식 execute 문서 기준). 완료 태그로 보상을 한 번만 주는 원리는 영상 확인(youtu.be/3J3dsAurdQU?t=49).

관련 영상

관련 공식 자료

함께 보기

출처

  • 유튜브 「NPC를 상인으로 만들어보자! #마인크래프트가이드」(2020-08-08)