개인 자료란 (JE)

  서버 커뮤니티

Profile useu 대표칭호 없음
Profile

자료 자바 에디션(JE) 플러그인 스크립트

창고 스크립트 [비동기 / 파일저장]

2024.06.04 조회 수 590 추천 수 0
장르 그 외에 장르 
게임버전 모든버전 
API 스피곳, 페이퍼 
원산지 국산 
개발자 본인(useu) 
저작권 스크립트 파일 내 제작자 표시만 남기고 자유롭게 이용 
자료 출처 https://본인 







# 제작자: useu / 디스코드: o1_o2
# Tested in
#   Skript: 2.8.5
#   Minecraft: 1.20.4

options:
    PERM_OPEN_CHEST: uchest.open
    PERM_MANAGE_CHEST: uchest.manage

import:
    org.bukkit.Bukkit
    org.bukkit.Material
    org.bukkit.inventory.ItemStack
    org.bukkit.configuration.file.YamlConfiguration

    java.io.File
    java.util.UUID
    java.lang.Runnable

    ch.njol.skript.Skript

on unload:
    set {-chest.unloadBySystem} to true
    loop {-chest::*}:
        unloadChestFromUUID(loop-index)
    delete {-chest::*}
    delete {-chest.unloadBySystem}

on load:
    loop all players:
        loadChestFromPlayer(loop-value)

function onAsyncChestLoaded(uuid: string):
    delete {-chest.running::%{_uuid}%}
    set {_p} to Bukkit.getOfflinePlayer(UUID.fromString({_uuid}))
    send "[창고] 로딩 완료" to {_p}
    if {_p} is not online:
        runAsnycUnloadChestFromUUID({_uuid})

function onAsyncChestUnloaded(uuid: string):
    delete {-chest.running::%{_uuid}%}
    if Bukkit.getOfflinePlayer(UUID.fromString({_uuid})) is online:
        runAsnycLoadChestFromUUID({_uuid})

function loadChestFromPlayer(p: player):
    loadChestFromUUID(uuid of {_p})

function loadChestFromUUID(uuid: string):
    set {_file} to loadPlayerChestDataFile({_uuid})
    set {_config} to YamlConfiguration.loadConfiguration({_file})
    set {_inv} to chest inventory with 6 rows named "창고"
    loop integers between 0 and 53:
        continue if {_config}.isSet("%loop-number%") is false
        set slot loop-number of {_inv} to {_config}.getItemStack("%loop-number%", new ItemStack(Material.AIR)) 
    set {-chest::%{_uuid}%} to {_inv}

function unloadChestFromPlayer(p: player):
    unloadChestFromUUID(uuid of {_p})

function unloadChestFromUUID(uuid: string):
    saveChestFromUUID({_uuid})
    delete {-chest::%{_uuid}%}

function saveChestFromPlayer(p: player):
    saveChestFromUUID(uuid of {_p})

function saveChestFromUUID(uuid: string):
    if {-chest::%{_uuid}%} is not set:
        exit
    set {_file} to loadPlayerChestDataFile({_uuid})
    set {_config} to new YamlConfiguration()
    loop integers between 0 and 53:
        continue if slot loop-number of {-chest::%{_uuid}%} is air
        set {_item} to slot loop-number of {-chest::%{_uuid}%}
        {_config}.set("%loop-number%", {_item})
    {_config}.save({_file})

function loadPlayerChestDataFile(uuid: string) :: object:
    set {_scriptsPath} to Skript.getInstance().getScriptsFolder().getAbsolutePath()
    set {_folder} to new File("%{_scriptsPath}%\UChest")
    {_folder}.mkdirs()
    set {_file} to new File({_folder}, "%{_uuid}%.yaml")
    if {_file}.exists() is false:
        try {_file}.createNewFile()
        if last java exception is set:
            Skript.error("[ERROR] 0001 (in %script name%)")
            (last java exception).printStackTrace()
            stop
    return {_file}

function runAsnycLoadChestFromUUID(uuid: string):
    create new section stored in {_function::run}:
        loadChestFromUUID({_uuid})
        create section stored in {_function::run}:
            onAsyncChestLoaded({_uuid})
        set {_proxy} to new proxy instance of Runnable using {_function::*}
        Bukkit.getScheduler().runTask(Skript.getInstance(), {_proxy})
    set {_proxy} to new proxy instance of Runnable using {_function::*}
    set {-chest.running::%{_uuid}%} to Bukkit.getScheduler().runTaskAsynchronously(Skript.getInstance(), {_proxy})

function runAsnycUnloadChestFromUUID(uuid: string):
    create new section stored in {_function::run}:
        unloadChestFromUUID({_uuid})
        create section stored in {_function::run}:
            onAsyncChestUnloaded({_uuid})
        set {_proxy} to new proxy instance of Runnable using {_function::*}
        Bukkit.getScheduler().runTask(Skript.getInstance(), {_proxy})
    set {_proxy} to new proxy instance of Runnable using {_function::*}
    set {-chest.running::%{_uuid}%} to Bukkit.getScheduler().runTaskAsynchronously(Skript.getInstance(), {_proxy})

function checkChestTaskRunning(uuid: string) :: boolean:
    if {-chest.running::%{_uuid}%} is not set:
        return false
    if Bukkit.getScheduler().isCurrentlyRunning({-chest.running::%{_uuid}%}.getTaskId()) is false:
        return false
    return true

command /창고:
    permission: {@PERM_OPEN_CHEST}
    aliases: ckdrh, chest, 상자, tkdwk
    executable by: players
    trigger:
        if {-chest::%uuid of player%} is not set:
            send "[창고] 창고가 아직 로딩되지 않았습니다."
            exit
        if {-chest.running::%uuid of player%} is set:
            send "[창고] 창고가 아직 로딩되지 않았습니다."
            exit
        open {-chest::%uuid of player%} to player

command /창고관리 :
    permission: {@PERM_MANAGE_CHEST}
    executable by: players
    trigger:
        if {-chest::%uuid of arg 1%} is not set:
            send "[창고] 창고가 아직 로딩되지 않았습니다."
            exit
        if {-chest.running::%uuid of arg 1%} is set:
            send "[창고] 창고가 아직 로딩되지 않았습니다."
            exit
        open {-chest::%uuid of arg 1%} to player

on join:
    stop if checkChestTaskRunning(uuid of player) is true
    send "[창고] 로딩 시작"
    runAsnycLoadChestFromUUID(uuid of player)

on quit:
    stop if checkChestTaskRunning(uuid of player) is true
    runAsnycUnloadChestFromUUID(uuid of player)


창고 스크립트를 비동기, 파일 저장 방식으로 만들어봤습니다.


[비동기] 유저 접속시 해당 유저의 창고 정보 파일을 읽어 인벤토리 생성 및 변수에 저장합니다.

[비동기] 유저 퇴장시 현재 변수에 저장된 인벤토리의 내용물을 파일에 저장합니다. / 인벤토리 변수를 삭제합니다.


해당 스크립트는 유저 접속시 아이템이 담긴 인벤토리 객체를 변수에 저장하는 방식으로 구현했습니다.

그냥 개인적인 궁금증으로 만들어본거라 이 방식이 문제가 있을지 확인해보진 않았습니다.


UChest.sk

Warning
댓글이 없습니다.

새로운 댓글을 등록해 주세요!

뉴스 및 창작물
/files/thumbnails/483/916/003/262x150.crop.jpg?20241127115329

레드스톤

[노트블럭 커버] 뉴진스 - ETA 2

노트블럭전문가

2024-11-27

0

/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ?

팀뉴일리시

2024-11-23

4

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 6

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 5

물귀신

2024-10-06

3

/files/thumbnails/839/895/003/262x150.crop.jpg?20241006021227

SRV레코드는 보안도메인이 아닙니다. [서버오픈시 필독]

물귀신

2024-10-05

4

/files/thumbnails/648/892/003/262x150.crop.jpg?20241002184058

아티클

마인크래프트 라이브 2024 후기: 무성의가 느껴졌던 '절망편' 라이브

라비

2024-10-02

4

/files/thumbnails/693/890/003/262x150.crop.jpg?20241007140310

소식

[방송인 필독] 시참 컨텐츠 방송인분들께 DDoS(디도스) 공격을 퍼붓는 용의자 특정중, 예방 & 대처법 정리 9

해그

2024-10-01

1

사진이 없습니다.

레드스톤

[노트블럭 패러디] 신창섭 - 모장이 다해줬잖아

노트블럭전문가

2024-09-28

0

/files/thumbnails/677/856/003/262x150.crop.jpg?20240913205849

아티클

마인크래프트 개발의 미래

학교가기싫다

2024-09-13

2