워크래프트 3 - 시장 사용법 / Warcraft 3 - Marketplace Usage

워크래프트 3 - 시장 사용법


시장 동작 원리

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 실행

채팅 메시지

워크래프트 3 - 시장 사용법

월드 에디터

워크래프트 3 - 시장 사용법
워크래프트 3 - 시장 사용법

커스텀 스크립트

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



Creative Commons Licenses
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.

댓글