시장 동작 원리
1. Map initalization 이벤트- InitBlizzard() 호출
- InitNeutralBuildings() 호출
- 1회 실행되는 120초 타이머 실행: StartStockUpdates()
2. StartStockUpdates 함수
- PerformStockUpdates() 호출
- 반복 실행되는 30초 타이머 실행: PerformStockUpdates()
3. PerformStockUpdates 함수
- 활성화된 아이템 유형(Permanent, Charged, Artifact), 레벨(0~9) 선택
※ 크립에 아이템 드롭이 설정되지 않았다면 시장에 아이템이 생성되지 않음
- 모든 시장 선택: UpdateEachStockBuilding() 호출
- 랜덤 아이템 추가: UpdateEachStockBuildingEnum() 호출
- 배열변수명: bj_stockAllowedPermanent, bj_stockAllowedCharged, bj_stockAllowedArtifact
4. UnitDropItem 함수
- "Unit Properties" > Item Dropped탭 > "Items Dropped on Death"가 설정된 경우 동작
- UpdateStockAvailability() 호출
5. UpdateStockAvailability 함수
- 드롭된 아이템의 유형과 레벨을 활성화
활용법 (시장에 아이템이 생성되면 채팅 메시지 받기)
1. World Editor에서 "Northern Isles" 지도 열기2. Scenario > Map Options > Script Language > "Lua" 선택 > OK 버튼
3. Trigger Editor 열기
4. "New Global Variable" 실행
- 변수 유형은 Player 선택
5. "New Custom Script" 실행
- "Blizzard.j"에 UpdateEachStockBuildingEnum가 정의되어 있음
- UpdateEachStockBuildingEnum과 같은 이름으로 함수 작성
(기본 기능은 그대로 구현하고 생성된 아이템 정보를 유저만 볼 수 있는 채팅 메시지로 전송)
- CustomInit 함수 작성
(Player전역 변수에 유저를 할당)
6. "New Trigger" 실행
- Events에 Map initalization 생성
- Actions에 Custom Script "CustomInit()" 생성
7. 저장 후 Test Map 실행
채팅 메시지
월드 에디터
커스텀 스크립트
function DisplayItemID(v)
local s = ""
for i = 0, 3 do
s = string.char((v >> (i * 8)) & 0xFF) .. s
end
DisplayTextToForce(udg_GV_Player, "(" .. s .. ") " .. GetObjectName(v))
end
function UpdateEachStockBuildingEnum()
local iteration = 0
local pickedItemId = 0
repeat
pickedItemId = ChooseRandomItemEx(bj_stockPickedItemType, bj_stockPickedItemLevel)
iteration = iteration + 1
if (iteration > bj_STOCK_MAX_ITERATIONS) then return end
until IsItemIdSellable(pickedItemId) == true
DisplayItemID(pickedItemId)
AddItemToStock(GetEnumUnit(), pickedItemId, 1, 1)
end
function CustomInit()
local indexPlayer = nil
local index = 0
repeat
indexPlayer = Player(index)
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) and
(GetPlayerController(indexPlayer) == MAP_CONTROL_USER) then
udg_GV_Player = CreateForce()
ForceAddPlayer(udg_GV_Player, indexPlayer)
break
end
index = index + 1
until index >= bj_MAX_PLAYERS
if (udg_GV_Player == nil) then
udg_GV_Player = bj_FORCE_ALL_PLAYERS
end
end
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.
댓글
댓글 쓰기