사용자 도구

사이트 도구


ko:scripting

스크립트


클라이언트 스크립트

클라이언트 스크립트는 프로젝트폴더/Scripts 에 Hello.lua 와 같은 파일이름으로 존재해야 읽어집니다.

Client.width : 화면의 가로 크기를 가져온다.
Client.height : 화면의 세로 크기를 가져온다.
Client.ShowAlert(text, callback) : 알림 메세지를 띄운다.
Client.ShowYesNoAlert(text, callback) : 알림 Yes/No 메세지를 띄운다.
Client.ShowBuyItem(id, amount, callback) : 특정 아이템을 구매하는 메세지를 띄운다.
Client.Quit() : 클라이언트를 닫는다.

ScriptEventPublisher Client.GetTopic(topic) : 서버와 메세지를 주고받기 위해, 특정 주제를 등록한다. Client.FireEvent(topic, args…) : 서버에게 특정 topic으로 메세지를 전송한다.

Client.RunLater(callback, t) : t 초 이후에 callback 함수를 실행한다.

Camera : 카메라를 컨트롤하는 객체
Point : x,y 좌표를 담은 클래스
Rect : x, y, width, height 사각형을 담은 클래스
Image : 이미지를 출력하는 클래스
Text : 글씨를 출력하는 클래스
Slider : 조절 컨트롤러를 출력하는 클래스
Button : 버튼을 출력하는 클래스
Panel : 패널을 출력하는 클래스
ScrollPanel : 스크롤 되는 패널을 출력하는 클래스
GridPanel : Grid로 배열되는 패널을 출력하는 클래스

서버 스크립트

서버 스크립트는 프로젝트폴더/ServerScripts 에 Hello.lua 와 같은 파일이름으로 존재해야 읽어집니다.

Server.onJoinPlayer(unit) : 새로운 유저가 접속했다.
Server.onLeavePlayer(unit) : 특정 유저가 게임을 나갔다.
Server.SendCenterLabel(text) : 가운데 라벨을 표시한다.
Server.SendSay(text, color) : 채팅창에 메세지를 표시한다.

ScriptEventPublisher Server.GetTopic(topic) : 클라이언트와 메세지를 주고받기 위해, 특정 주제를 등록한다.
Server.FireEvent(topic, args…) : 클라이언트에게 특정 topic으로 메세지를 전송한다.

Server.players : 유저들의 목록을 가져온다.
Server.fields : 전체 맵 목록을 가져온다.
Server.CreateEventUnit(name, imageID) : 이벤트 유닛을 만든다.
Server.GetField(dataID) : 특정 아이디의 맵을 가져온다.
ScriptUnit : 몬스터나 플레이어와 같은 객체이다.

unit.type = 유닛의 타입(0=플레이어, 1=이벤트, 2=몬스터)

예제) 서버 스크립트 - 플레이어 레벨업시, 메세지 출력, 특정 레벨 달성시 아이템지급

파일 : Scripts/Servers/Hello.lua

function onUnitLevelUp(target, level)
    if target.level == 50 then --타겟이 50레벨을 달성했으면 서버 전체에 알림을 띄우고 1번 아이템을 지급한다.
        Server.SendCenterLabel(target.name .. '님이 ' .. level .. '이 되었습니다!')
        target.AddItem(1) 
    elseif target.level == 55 then  --55레벨을 달성했으면 5번스킬과 5000게임머니를 지급한다. 
        target.AddSkill(5)
        target.AddGameMoney(5000)
    end
end
 
Server.onUnitLevelUp.Add(onUnitLevelUp)

예제) 서버 스크립트 - PVP로 유저를 죽였을때, 서버전체 메시지 출력 및 보상지급

파일 : Scripts/Servers/Hello.lua

function onUnitDead(target, attacker) --target은 죽은자, attacker는 공격자
    if (target.type==0 and attacker.type==0) then --PlayerUnit일 경우
        Server.SendCenterLabel(target.name..'을(를) \n'..attacker.name..'이(가) 죽였다.')
        attacker.AddGameMoney(100) --공격자에게 100골드을 준다.
        if math.random(1, 100) <= 50 then
            attacker.AddItem(100) --공격자에게 50% 확률로 1번 아이템을 준다.
        end
    end
end
Server.onUnitDead.Add(onUnitDead) -- Server.onUnitDead에 onUnitDead함수를 추가한다.

onJoinField 활용방법 - 특정 맵에 입장시 이름 출력, 서버전체 메세지 보내기

파일 : Scripts/Servers/Hello.lua

function onJoinField()
    function onJoinField_1(Field)
        unit.SendCenterLabel(Field.name) -- 유닛에게 잠시 필드이름을 표시한다.
        if #Field.playerUnits > 10 then -- #은 테이블의 길이를 의미한다.
            Server.SendSay(Field.name.."에 11명 이상의 유저가 모였습니다!!")
        end
    end
    Server.GetField(1).onJoinField.Add(onJoinField_1)--1번 필드에 입장시 onJoinField_1 함수를 호출한다. 
end
Server.RunLater(onJoinField,1) -- 1초후 onJoinField 함수를 실행한다.
-- 1초후 실행하는 이유는 서버 실행 후 맵이 생성되지 않았을 수 있기 떄문에 nil을 참조하는 것을 방지하기 위함입니다.

onLeaveField -특정맵에 나갈시 처리

인자 map - ScriptField
인자 unit - ScriptUnit

파일 : 해당맵에서 스크립트로 작성 사용예시 : 맵에서 나갈시 월드변수의 값을 1 감소시킨다.

function onLeaveField(map,unit)
  print('떠난다 : ' .. map.name .. ' ' ..unit.name)
  Server.SetWorldVar(10, Server.GetWorldVar(10)-1)
end

Server.GetField(5).onLeaveField.Add(onLeaveField)

사용예시 : 플레이어가 가진 특정 아이템 옵션 제거

-- 해당 id의 아이템 가져오기 (아이템 고유 ID)
local item = unit.roomPlayer.GetItem(unit.GetVar(0))

-- 해당 아이템의 모든 옵션 돌기
for i=#item.options,1,-1 do
local option = item.options[i]
-- 특정 옵션일 경우, 삭제!
if option.type == 10 then
table.remove(item.options, i)
end
end

사용예시 : 아이템 사용, 구매, 판매시 발생되는 이벤트

Server.onUseItem.Add(
        function(unit,item) 
                print(unit.name) print(item.dataID) 
        end)
Server.onBuyGameMoneyItem.Add(
        function(unit,itemID,count) 
                print(string.format("%s ,%s ,%s",unit.name,itemID,count)) 
        end)
Server.onSellGameMoneyItem.Add(
        function(unit,itemID,count)
                 print(string.format("%s,%s,%s",unit.name,itemID,count)) 
        end)
ko/scripting.txt · 마지막으로 수정됨: 2019/05/23 07:48 저자 리크