PROJECT ZOMBOID · Build 42.20.2

Project Zomboid · 모드 / 서버 기술 작업

차량 스킨 · 차량 스크립트 · 모드 패키징 · 데디서버 검증

만든 걸 보여주는 게 아니라, 만든 게 실제로 로드되는지 서버 로그로 증명하는 방식으로 작업합니다.

대상 빌드
42.20.2
제작 스킨
8종
서버 검증
스킨 1 → 9
스크립트 오류
0건
CAPABILITIES

할 수 있는 작업

차량 스킨 / 텍스처

  1. 바닐라 shell 텍스처의 알파 채널을 도색 영역으로 사용해 창문·시트·그릴·하부 디테일을 원본 그대로 보존
  2. 미사용 레거시 색상 텍스처에서 명암 배율맵을 뽑아 새 색상에 적용 → 새 도색도 바닐라와 같은 광원 아래 있는 것처럼 보임
  3. 색상은 설정 파일의 hex 값 하나로 관리, 스킨 추가는 항목 한 줄

차량 스크립트

  1. B42 에서 바닐라 차량 스크립트가 media/scripts/generated/vehicles 로 옮겨진 점 확인
  2. template 파일과 vehicle 파일의 2층 구조를 읽고 skin 블록이 어디에 정의되는지 파악
  3. 스킨 세트 JSON 하나에서 텍스처와 스크립트를 동시에 생성 → 손으로 고치다 빠뜨리는 경우 자체를 제거

모드 패키징 / 워크샵

  1. B42 멀티버전 구조 (common/ + 42.20/) 로 패키징, 버전 폴더마다 versionMin 이 들어간 mod.info 생성
  2. 워크샵 스테이징 구조와 workshop.txt 를 자동 생성하고, 재업로드 시 기존 id 를 보존
  3. 게임이 실제로 검사하는 조건(썸네일 256x256·1000KB, 금지 확장자, Contents 하위 폴더 제한, 허용 태그)을 업로드 전에 먼저 검사

데디서버 구성 / 검증

  1. 데디서버를 헤드리스로 기동해 모드 로딩과 스크립트 파싱을 로그로 확인
  2. 서버 ini 의 Mods 항목을 스크립트로 다루고, 준비 신호를 감지하면 자동으로 종료
  3. 모드 없이 한 번, 모드 적용 후 한 번 돌려서 차이만 본다 (바닐라가 원래 뱉는 경고를 모드 탓으로 오인하지 않기 위함)
CASE 01

Knox Paintworks

바닐라 웨스트포인트 세단(ModernCar02) 공장 도색 8종

바닐라 차량에 새 도색을 얹되, 기존 차량과 나란히 뒀을 때 이질감이 없어야 한다는 걸 기준으로 잡았습니다.

기존 도색은 지우지 않고 그대로 두기 때문에, 차는 바닐라 색으로도 계속 스폰됩니다.

01
도색 영역 추출
shell 텍스처의 알파 0 구간이 곧 도색 자리. 실측 100,923px
02
명암 배율맵 생성
레거시 텍스처 휘도 ÷ 중앙값. 확보율 100%, 미달 시 자동 실패
03
색상 합성
목표색 × 배율. 고정 디테일 픽셀은 건드리지 않음
04
스크립트 생성
스킨 세트 JSON → skin 블록 8개 자동 생성
05
패키징
common/ + 42.20/ 구조로 조립, 배포본 md5 13개 전량 대조
06
서버 검증
헤드리스 기동 → 스킨 등록 수 실측
미드나이트 퍼플
미드나이트 퍼플#4B2F7A
선버스트 오렌지
선버스트 오렌지#C86A1E
딥 틸
딥 틸#1F6F7A
버건디
버건디#6D1F2C
샴페인 골드
샴페인 골드#BFA268
포레스트 그린
포레스트 그린#33512F
슬레이트 블루
슬레이트 블루#40567A
러스트 브라운
러스트 브라운#7A4A2B
PIPELINE

실제 작업 과정

아래는 이 모드를 만들 때 실제로 실행한 명령과 출력입니다.

실행 기록 재생
VERIFICATION

검증을 이렇게 합니다

기준선을 먼저 잡는다

모드 없이 서버를 한 번 돌려 ModernCar02 스킨 수가 1개인 걸 확인한 뒤, 모드를 켜고 9개가 되는 걸 확인했습니다. 숫자 하나로 '적용됐다'가 아니라 '몇 개가 어떻게 붙었다'까지 나옵니다.

문서에 없으면 실측한다

모드에서 바닐라 차량을 다시 정의하면 스킨이 덮어써지는지 덧붙는지 자료가 없었습니다. 검증용 임시 모드를 따로 만들어 서버 로그로 확인했고, 덧붙는다는 결과가 나와 중복으로 넣었던 바닐라 스킨 항목을 뺐습니다.

대조군을 둔다

텍스처 존재 확인이 전부 실패로 나왔을 때, 바닐라 텍스처도 같이 확인해 봤더니 그것도 실패였습니다. 모드 문제가 아니라 헤드리스 서버가 텍스처를 아예 안 읽는 것이어서, 실패가 아니라 '이 환경에서는 판정 불가'로 처리했습니다.

바닐라가 원래 내는 오류를 구분한다

최종 로그에 남은 오류 3건은 모드 없이 돌린 로그에도 똑같이 있는 베이스 게임 오류였습니다. 차량 관련 오류는 양쪽 다 0건입니다.

TOOLING

직접 만든 도구

같은 작업을 다른 차종·다른 모드에 반복할 때 손으로 다시 하지 않기 위해 만들었습니다.

extract_paint_mask.py
색상 변형 텍스처를 비교해 도색 영역 자동 추출
reskin.py
shell 합성 방식 리스킨. 명암 확보율 미달 시 실패 처리
gen_vehicle_script.py
스킨 세트 → 차량 스크립트 + 검증 기대값 동시 생성
build_mod.py
B42 멀티버전 패키징 · 배포 · md5 대조
make_poster.py
포스터 · 워크샵 썸네일(규격 검사 포함) · 개별 크롭 생성
stage_workshop.py
워크샵 스테이징 조립 + 업로드 전 규격 검사
run_server.py
데디서버 헤드리스 기동 · 로그 수집 · 자동 종료

수치 기준(임계값·크롭 좌표·캔버스 크기·경로)은 전부 설정 파일에 있습니다. 차종이 바뀌어도 코드는 그대로 두고 설정만 바꿉니다.