Paste #40233: Untitled Paste

Date: 2017/02/23 22:18:41 UTC-08:00
Type: Denizen Script

View Raw Paste Download This Paste
Copy Link


## 수매 퀘스트 셋업
PurchaseQuestDefaultSetup:
    type: yaml data
    configpath: ../JemrQuest/purchase.yml
#    sellerpath: ../JemrQuest/sellerlist.yml
    logpath: ./plugins/JemrQuest/trade.log



## 수매 시작
warehouse_Purchase_start:
    type: task
    script:
    - yaml load:<s@purchasequestdefaultsetup.yaml_key[configpath]> id:purchase
    - wait 1s
    - define npc <yaml[purchase].read[default.setting.npc]>
    ### 수매중이라면 실행 중지
    - if <def[npc].has_flag[quantity]> == true {
        - narrate "지금은 수매중입니다."
        - queue clear
    }

    - if <yaml[purchase].list_keys[purchase_list].random[1].get[1]||null> == null {
        - narrate "최소한 하나 이상의 아이템이 등록되어 있어야 합니다."
        - log "하나 이상의 아이템 등록 필요" type:warning file:<s@purchasequestdefaultsetup.yaml_key[logpath]>
        - queue clear
    }
    - define npc <yaml[purchase].read[default.setting.npc]>
    - define item <yaml[purchase].list_keys[purchase_list].random[1].get[1]>
    - define item_name <yaml[purchase].read[purchase_list.<def[item]>.name]>
    - define price <yaml[purchase].read[purchase_list.<def[item]>.current.price]>
    - define quantity <yaml[purchase].read[purchase_list.<def[item]>.current.quantity]>
    - flag <def[npc]> item:<def[item]>
    - flag <def[npc]> item_name:<def[item_name]>
    - flag <def[npc]> price:<def[price]>
    - flag <def[npc]> quantity:<def[quantity]>
    - flag <def[npc]> timeout:<util.date.time>:<util.date.time.second> duration:<yaml[purchase].read[default.setting.time_limit]>

    - log "Purchaing statred!" type:fine file:<s@purchasequestdefaultsetup.yaml_key[logpath]>

    ## 안내시작
    - title "title: " "subtitle:<&c>창고에서 수매를 시작합니다" targets:<server.list_online_players> stay:5s
    - narrate target:<server.list_online_players> "지금부터 수매를 시작합니다!     <server.current_time_millis>"

    - bossbar create purchasing players:<server.list_online_players> "title:창고에서 <def[item_name]> 수매중... " color:red progress:0



## 수매 종/료
warehouse_Purchase_end:
    type: task
    speed: 1t
    script:
    - yaml load:<s@purchasequestdefaultsetup.yaml_key[configpath]> id:purchase
    - wait 1s
    - define npc <yaml[purchase].read[default.setting.npc]>
    ### 수매중이지 않다면 실행 중지
    - if <def[npc].has_flag[quantity]||false> == false {
        - narrate "수매중이 아닙니다."
        - queue clear
    }
        ### 플래그에서 그간 저장된 변수 가져오기 시작
    - define item <def[npc].flag[item]>
    - define price <def[npc].flag[price]>
    - define quantity <yaml[purchase].read[purchase_list.<def[item]>.current.quantity].sub[<def[npc].flag[quantity]>]>
    - define expenditure <yaml[purchase].read[purchase_list.<def[item]>.current.price].mul[<def[quantity]>]>

    ### 하나도 안팔린 경우 이벤트 그냥 종료하기
    - if <def[npc].flag[quantity]||0> >= <yaml[purchase].read[purchase_list.<def[item]>.current.quantity]> {
        - narrate "아무도 구매하지 않았습니다."
    }
    else {
        ## 수매정보를 업데이트
        - yaml id:purchase set purchase_list.<def[item]>.history.total.procurement:+:1
        - yaml id:purchase set purchase_list.<def[item]>.history.total.purchased_expenditure:+:<def[expenditure]>
        - yaml id:purchase set purchase_list.<def[item]>.history.total.purchased_quantity:+:<def[quantity]>

        #평균 수매량과, 평균가 계산
        - define total_expenditure <yaml[purchase].read[purchase_list.<def[item]>.history.total.purchased_expenditure]>
        - define total_quantity <yaml[purchase].read[purchase_list.<def[item]>.history.total.purchased_quantity]>
        - define procurement <yaml[purchase].read[purchase_list.<def[item]>.history.total.procurement]>
        - yaml id:purchase set purchase_list.<def[item]>.history.average.quantity:<def[total_expenditure].div[<def[procurement]>]>
        - yaml id:purchase set purchase_list.<def[item]>.history.average.price:<def[total_expenditure].div[<def[total_quantity]>]>

        ## 수매 목표량 계산
        - define target_quantity <yaml[purchase].read[purchase_list.<def[item]>.current.quantity]||1>
        - define achievement <def[quantity].div[<def[target_quantity]>]>
        - narrate "<def[achievement].mul[100].round_to[2]>%입니다. <def[achievement]>"

        ##수매 결과에 따라 가격 갱신  # 계산식, y=2mx+(1-m)

        ### q갱신 q_delta, achievement
        - define q_delta <yaml[purchase].read[default.quantity.delta]>
        - define p_delta <yaml[purchase].read[default.price.delta]>

        ## 최소 최대값 불러오기
        - define p_min <yaml[purchase].read[default.price.min]>
        - define p_max <yaml[purchase].read[default.price.max]>
        - define q_min <yaml[purchase].read[default.quantity.min]>
        - define q_max <yaml[purchase].read[default.quantity.max]>

        # 랜덤 변화를 위한... # gauss 70%가 -2에서 +2사이에 존재함.
        - define ran <util.random.gauss.div[80]>
        - yaml id:purchase set purchase_list.<def[item]>.current.quantity:*:<def[q_delta].mul[2].mul[<def[achievement]>].add[1].sub[<def[q_delta]>].add[<def[ran]>]>
        - yaml id:purchase set purchase_list.<def[item]>.current.quantity:<yaml[purchase].read[purchase_list.<def[item]>.current.quantity].round.max[<def[q_min]>].min[<def[q_max]>]>

        - define ran <util.random.gauss.div[80]>
        - yaml id:purchase set purchase_list.<def[item]>.current.price:*:<def[p_delta].mul[-2].mul[<def[achievement]>].add[1].add[<def[p_delta]>].add[<def[ran]>]>
        - yaml id:purchase set purchase_list.<def[item]>.current.price:<yaml[purchase].read[purchase_list.<def[item]>.current.price].round_to[2].max[<def[p_min]>].min[<def[p_max]>]>
        ### 수매 결과를 로그에 기록하기
            ## 수매결과
        - narrate "수매를 종료합니다."
        - log "Result:<def[item]>, TQ:<yaml[purchase].read[purchase_list.<def[item]>.current.quantity]> purchased:<def[quantity]>, <def[achievement].mul[100].round_to[2]>%, expenditure:<def[expenditure]>, percost:<def[price]>" type:info file:<s@purchasequestdefaultsetup.yaml_key[logpath]>
        ## 개인별 참여여부 기록
        - foreach <def[npc].list_flags> {
            - if <def[value].is_player||null> {
                - log "<def[value].name> <def[npc].flag[<def[value]>]>" type:none file:<s@purchasequestdefaultsetup.yaml_key[logpath]>
                - flag <def[npc]> <def[value]>:!
            }
        }
    }

    - yaml savefile:<s@purchasequestdefaultsetup.yaml_key[configpath]> id:purchase

    ## 이벤트 마감 공지
    - title "title: " "subtitle:<&c>수매를 종료합니다" targets:<server.list_online_players> stay:5s
    - narrate target:<server.list_online_players> "수매가 종료되었습니다!"
    - bossbar remove purchasing

    ### npc 플래그 삭제하기
    - flag <def[npc]> item:!
    - flag <def[npc]> item_name:!
    - flag <def[npc]> price:!
    - flag <def[npc]> timeout:!
    - flag <def[npc]> purchasing:!
    - flag <def[npc]> quantity:!



### 수매시간 마감 시 종료하기
"purchase_timer":
    type: world
    events:
        on system time hourly:
        # 세명 이상이라면 매시간 수매 이벤트 시작하기
        - if <server.list_online_players.size> >= 3 run warehouse_Purchase_start instantly

        # 보스바 업데이트로 공지하기
        on system time minutely:

        # 진행중이지 않다면, 공지x
        - ~define npc <yaml[purchase].read[default.setting.npc]>
            # q가 0이거나 플래그가 없다면 => 수매가 끝났다면
        - if <def[npc].flag[quantity]||0> <= 0 {
            - run warehouse_Purchase_end instantly
            - queue clear
        }

        #수매가 진행중이라면 보스바로 공지

        - define item_name <yaml[purchase].read[default.setting.npc].flag[item_name]>
            #progress calc
        - define item <def[npc].flag[item]>
        - define target_q <yaml[purchase].read[purchase_list.<def[item]>.current.quantity]>
        - define remain_q <def[npc].flag[quantity]>
        - define current_q <def[target_q].sub[<def[remain_q]>]>
        - define progress <def[current_q].div[<def[target_q]>]>
        - narrate target:<server.list_online_players> "<def[npc]><n><def[item]><n><def[remain_q]><n><def[current_q]><n><def[target_q]>"
        - bossbar update purchasing players:<server.list_online_players> progress:<def[progress]>