시장 동작 원리
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 국제 라이선스에 따라 이용할 수 있습니다.
댓글
댓글 쓰기