레전드996 개발: sendmsg 함수 및 유틸리티 인터페이스 완벽 가이드

이 글에서는 레전드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() 함수조차 실패할 수 있으므로, 안전한 대안을 사용하는 것이 좋다.

태그: sendmsg Lua 996 게임 엔진 게임 개발 ADDBUTTON

7월 16일 21:44에 게시됨