이 글에서는 레전드996 게임 개발 시 자주 사용하는 메시지 전송, 초보자 가이드, 버튼 추가, 인벤토리 처리, 맵 관련 유틸리티 함수를 정리한다.
메시지 출력
공지 메시지 출력
Lua에서 sendmsg 함수를 사용하여 다양한 범위로 메시지를 전송할 수 있다.
-- Lua 예제
-- 두 번째 인자: 1(자신), 2(전서버), 3(길드), 4(현재 맵), 5(파티)
-- JSON의 Type: 1(채팅창), 9(화면 팝업)
sendmsg(actor, ConstCfg.notice.own, '{"Msg":"<font color=\'#ff0000\'>곧 속성이 업데이트됩니다!!!</font>","Type":9}')
sendmsg(actor, 1, '{"Msg":"<font color=\'#ff0000\'>곧 속성이 업데이트됩니다!!!</font>","Type":9}')
TXT 스크립트에서는 다음과 같이 사용한다.
sendmsg 9 9999999999999999999999999999999999
sendmsg 1 1111111111111111111111111111111111
디버그 콘솔 출력
release_print 함수는 녹색 콘솔 출력에 사용된다.
release_print("attack", actor, hiter)
release_print("attack", actor)
release_print("attack")
고급 공지: 중앙 공지 & 러닝 라이트
서버 전체에 좋은 공지를 보내기 위한 함수들이다.
-- sendmsgnew: 중앙 공지 (축소 효과 포함)
sendmsgnew(actor, -1, 0, '{txttxttxt실행/FCOLOR=250}{이 함수 진입/FCOLOR=251}xt{실행 후 진입/FCOLOR=249}', 1, 1)
-- sendmsg: 특정 유형의 공지 (Type 13)
local day = 10
sendmsg(actor, ConstCfg.notice.own, '{"Msg":"<font color=\'#ff0000\'>목표 맵은 '..(10-day)..'일 후 오픈</font>","Type":13}')
-- sendmovemsg: 러닝 라이트(이동 공지)
sendmovemsg(actor, 1, 1, 1, 88, 1, 'txttxttxt이 함수 실행됨')
초보자 가이드 (Navigation)
TXT 스크립트에서 유저에게 UI 요소를 가리키는 가이드 표시.
Navigation 0 2000 "일괄 회수 시작"
; 첫 번째 인자: 인터페이스 ID (7은 인벤토리)
; 두 번째 인자: 버튼 ID
; 세 번째 인자: 표시 텍스트
버튼 추가 (ADDBUTTON)
게임 내 인터페이스에 커스텀 버튼을 동적으로 추가한다.
#if
#act
mov S$인벤버튼 <Button|id=1|x=318|y=458|nimg=public/001.png|mimg=public/002.png|link=@onbtnclick,정리>
INC S$인벤버튼 <Button|id=2|x=415|y=417|nimg=public/003.png|mimg=public/004.png|link=@onbtnclick,창고>
INC S$인벤버튼 <Button|id=3|x=318|y=417|nimg=public/007.png|mimg=public/008.png|link=@onbtnclick,장비회수>
INC S$인벤버튼 <Button|id=4|x=415|y=458|nimg=public/005.png|mimg=public/006.png|link=@onbtnclick,서비스창>
AddButton 7 1 <$STR(S$인벤버튼)>
; AddButton 인자 1: 인터페이스 ID (7=인벤토리)
; 인자 2: 아이콘 ID (여러 버튼을 그룹화하는 ID)
중요: AddButton의 두 번째 인자는 아이콘 ID이며, 버튼 id와는 별개로 여러 버튼을 하나의 아이콘으로 관리한다.
인벤토리 처리
인벤토리 전체 아이템 가져오기
getbagitems 함수는 테이블을 반환한다. 각 키는 순번이고 값은 아이템 객체다. getiteminfo로 상세 정보를 조회한다.
ConstCfg = {
iteminfo = {
id = 1, -- 고유 ID
idx = 2, -- 아이템 템플릿 ID
curdura = 3, -- 남은 내구도
maxdura = 4, -- 최대 내구도
overlap = 5, -- 중첩 수량
bind = 6, -- 귀속 상태
}
}
local _list = getbagitems(actor)
if _list then
for _, itemObj in ipairs(_list) do
local itemIdx = getiteminfo(actor, itemObj, ConstCfg.iteminfo.idx)
local itemCount = getiteminfo(actor, itemObj, ConstCfg.iteminfo.overlap)
-- itemIdx와 itemCount 사용
end
end
맵 이름 조회
getmapname 함수는 맵 ID로 이름을 반환한다. 존재하지 않는 맵 ID를 전달하면 nil도 문자열도 아닌 예외적인 값을 반환하여 오류를 유발할 수 있다.
안전한 방법: 직접 맵 테이블을 유지 관리하거나 or 연산자로 기본값을 제공한다.
-- 방법 1: or 연산자 사용
local mapName = getmapname(targetMapId) or "기타 맵"
sendmsg(actor, ConstCfg.notice.own, '{"Msg":"<font color=\'#ff0000\'>'..mapName..'로 이동하여 계속 진행하세요</font>","Type":9}')
-- 방법 2: 조건문 사용
local mapName = getmapname(targetMapId)
if not mapName then
mapName = "기타 맵"
end
-- 방법 3: 직접 관리하는 테이블 사용 (권장)
-- 수동으로 맵 ID와 이름을 매핑하는 FGetMapName 함수 구현
참고: getmapname이 잘못된 값을 반환할 때 type() 함수조차 실패할 수 있으므로, 안전한 대안을 사용하는 것이 좋다.