스크립팅

클라이언트 스크립트

클라이언트 스크립트는 프로젝트 폴더 혹은 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로 배열되는 패널을 출력하는 클래스

서버 스크립트

서버 스크립트는 프로젝트 폴더 혹은 Scripts에 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: 몬스터나 플레이어와 같은 객체다.

 

Server.playerLeavePartyCallback(scriptRoomPlayer,scriptParty): 플레이어가 파티를 떠날 때 호출됩니다.

Server.playerJoinPartyCallback(scriptRoomPlayer,scriptParty): 플레이어가 파티에 들어갈 때 호출됩니다.

Server.onAddItem(scriptUnit,titem): 유저가 아이템을 획득할 때 호출됩니다.

Server.onRemoveItem(scriptUnit,titem): 유저의 아이템을 제거 및 사용할 때 호출됩니다.

 

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

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

파일: Scripts/Servers/Hello.lua

1 2 3 4 5 6 7 8 9 10 11 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번 스킬과 5,000게임 머니를 지급한다. target.AddSkill(5) target.AddGameMoney(5000) end end Server.onUnitLevelUp.Add(onUnitLevelUp)

예제) 서버 스크립트 - PVP로 플레이어 처치 시 서버 전체 메시지 출력 및 보상 지급

파일: Scripts/Servers/Hello.lua

1 2 3 4 5 6 7 8 9 10 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 rand(1, 100) <= 50 then attacker.AddItem(100) --공격자에게 50% 확률로 1번 아이템을 준다. end end end Server.onUnitDead.Add(onUnitDead) -- Server.onUnitDead에 onUnitDead 함수를 추가한다.

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

파일: Scripts/Servers/Hello.lua

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

onLeaveField -특정 맵 퇴장 시 처리

인자 map - ScriptField
인자 unit - ScriptUnit

파일: 해당 맵에서 스크립트로 작성 사용 예시) 맵 퇴장 시 월드 변수의 값이 1 감소한다.

1 2 3 4 5 6 function onLeaveField(map,unit) print('떠난다: ' .. map.name .. ' ' ..unit.name) Server.SetWorldVar(10, Server.GetWorldVar(10)-1) end Server.GetField(5).onLeaveField.Add(onLeaveField)

예) 아이템 사용(onUseItem), 구매(onBuyGameMoneyItem), 판매(onSellGameMoneyItem)시 발생하는 이벤트

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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)

예) 아이템 옵션 추가, 제거, 변경(ScriptUtility 참고)

코드에 적용된 주석(--)을지워가면서 테스트 해보시길 바랍니다. 밑의 스크립트는 터치 시 이벤트 - 스크립트로 실행했습니다.

1 2 3 4 5 6 7 8 -- 인벤토리에서 첫번째 아이템의 정보를 가져옵니다. local item = unit.player.GetItems()[1] local option1 = item.options[1] --Utility.SetItemOption(option1,option1.type,option1.statID,option1.value+1) --Server.SendItemUpdated(item) Utility.AddItemOption(unit.player.GetItems()[1],1,3,5) --unit.player.RemoveItemOption(item,1) unit.player.SendItemUpdated(item)

예) 파티 입장 시 발생하는 이벤트(playerJoinPartyCallback)

1 2 3 4 5 6 7 Server.playerJoinPartyCallback = function(scriptRoomPlayer,scriptParty) print(scriptRoomPlayer.unit.name) print(scriptParty.maxPlayer) -- return 을 true 로해야 파티가 생성됩니다. 조건에 따라서 return true,false를 지정하면 됩니다. return true end

예) 파티 퇴장 시 발생하는 이벤트(playerLeavePartyCallback)

1 2 3 4 5 Server.playerLeavePartyCallback = function(scriptRoomPlayer,scriptParty) print(scriptRoomPlayer.unit.name) print(scriptParty.maxPlayer) end

예) 아이템 획득 시 이벤트(onAddItem)

1 2 3 4 5 Server.onAddItem.Add( function(scriptUnit,titem) print(scriptUnit.name) print(titem.dataID) end)

예) 아이템 제거 시 이벤트(onRemoveItem)

1 2 3 4 5 6 Server.onRemoveItem.Add( function(scriptUnit,titem) print(scriptUnit.name) print(titem.id) print(titem.dataID) end)

예) 피해 적용 시 발생하는 이벤트(damageCallback)

1 2 3 4 5 6 7 8 9 -- 피해량이 0일 경우 피해량 출력 안 됨 -- a,b ScriptUnit Server.damageCallback = function(a, b, damage, skillDataID, critical, visible) damage = a.atk - b.def if damage <= 0 then visible = false end return damage, critical, visible; end

예) 거래 완료 시 발생하는 이벤트(onTradeDone)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function Trade(sender,receiver,senderItems,receiverItems) print("sender: ") print(sender.unit.name) print("receiver: ") print(receiver.unit.name) print("senderItems: ") print(senderItems) for i=1 , #senderItems do print(i..": ") print(Server.GetItem(senderItems[i].dataID).name) end print("receiverItems: ") print(receiverItems) for j=1 , #receiverItems do print(j..": ") print(Server.GetItem(receiverItems[j].dataID).name) end end Server.onTradeDone.Add(Trade)

 

SUPERCAT Inc. All Rights Reserved.