Ru_Nan
대표칭호 없음
Ru_Nan 642a599e50ad442cab0e91c0d4d2252a
이해도 | 1.12 |
---|---|
게임버전 (JE) | 모드버킷 |
스크립트 버전 | 입문자(아무것도 몰라요) |
스크립트 애드온 | 2.2 dev36 |
options: c: &f[&2게임&f] command /귀금속추가 [<text>] [<number>] [<number>]: trigger: if player is op: if arg 1 is set: if arg 2 is set: delete {주식::목록::%arg 1%::*} set {주식::목록::%arg 1%} to type of player's tool set {주식::목록::%arg 1%::상장가} to arg 3 set {주식::목록::%arg 1%::매매가} to arg 3 set {주식::목록::%arg 1%::상한가} to arg 3 set {주식::목록::%arg 1%::하한가} to arg 3 set {주식::목록::%arg 1%::최대변동가} to arg 3 set {주식::목록::%arg 1%::최대갯수} to arg 2 set {주식::목록::%arg 1%::현재갯수} to arg 2 set {주식::목록::%arg 1%::기록::1} to "&f기록 없음" message "{@c} 주식을 생성하였습니다." message "{@c} 주식명 : &f%arg 1%" message "{@c} 가격 : &f%arg 3%원" message "{@c} 수 량 : &f%arg 2%개" else: message "{@c} &f - /주식추가 [주식이름] [주식갯수] [주식가격]" command /귀금속변수 [<text>] [<text>]: trigger: if arg 2 is not set: send "%{주식::목록::%arg 1%}%" if arg 2 is set: send "%{주식::목록::%arg 1%::%arg 2%}%" #귀금속가격의 변동시간을 설정하는 구문(단위:분) command /귀금속변동시간설정 [<integer>]: trigger: if player is op: if arg 1 is set: set {주식::변동시간} to arg 1 broadcast "{@c} 귀금속가격의 변동시간을 %arg 1%분으로 변경되었습니다." broadcast "{@c} 다음 쿨타임부터 변경된 시간으로 적용됩니다." else: message "&f - /귀금속변동시간설정 [분]" every 0.1 second: loop {주식::목록::*}: add 1 to {_슬롯} loop all players: if inventory name of current inventory of loop-player contains "&6귀금속목록": set {_item1} to clock named "&a[ &f남은 변동 시간 &a]" set line 1 of lore of {_item1} to "&cㄴ&f%{주식::변동시간::분}%분 &f%{주식::변동시간::초}%초" set slot 45 of current inventory of loop-player to {_item1} set {_등록귀금속} to {주식::목록::%loop-index%} named "&6%loop-index%" set line 1 of lore of {_등록귀금속} to "&6[개수] &f▶ %{주식::목록::%loop-index%::현재갯수}%/%{주식::목록::%loop-index%::최대갯수}%개" set line 2 of lore of {_등록귀금속} to "&6[가격정보] &e▶ 처음가격 : %{주식::목록::%loop-index%::상장가}% &f▶ 판매가격 : %{주식::목록::%loop-index%::매매가}%원" set line 3 of lore of {_등록귀금속} to "&6[변동기록] %{주식::목록::%loop-index%::기록::*}%" set slot {_슬롯}-1 of current inventory of loop-player to {_등록귀금속} stop command /귀금속: trigger: set {_a} to 0 set {_b} to 17 open chest with 6 row named "&6귀금속목록" to player set {_item1} to clock named "&a[ &f남은 변동 시간 &a]" set line 1 of lore of {_item1} to "&cㄴ&f%{주식::변동시간::분}%분 &f%{주식::변동시간::초}%초" set slot 45 of current inventory of player to {_item1} set {_item2} to sign named "&c[ &f도움말 &c]" set line 1 of lore of {_item2} to "&eㄴ &f좌클릭 시 &e주식&f을 &c구매&f합니다." set line 2 of lore of {_item2} to "&eㄴ &f우클릭 시 &e주식&f을 &c판매&f합니다." set slot 49 of current inventory of player to {_item2} set {_item3} to emerald named "&e[ &f돈 &e]" set line 1 of lore of {_item3} to "&cㄴ &f%player's money% &c원" set slot 53 of current inventory of player to {_item3} loop {주식::목록::*}: add 1 to {_슬롯} set {_등록귀금속} to {주식::목록::%loop-index%} named "&6%loop-index%" set line 1 of lore of {_등록귀금속} to "&6[개수] &f▶ %{주식::목록::%loop-index%::현재갯수}%/%{주식::목록::%loop-index%::최대갯수}%개" set line 2 of lore of {_등록귀금속} to "&6[가격정보] &e▶ 처음가격 : %{주식::목록::%loop-index%::상장가}% &f▶ 판매가격 : %{주식::목록::%loop-index%::매매가}%원" set line 3 of lore of {_등록귀금속} to "&6[변동기록] %{주식::목록::%loop-index%::기록::*}%" set slot {_슬롯}-1 of current inventory of player to {_등록귀금속} wait 1 tick #주식가격을 변동시키는 쿨타임 구문 every 1 second: if {주식::변동시간} is set: if {주식::변동시간::분} is set: if {주식::변동시간::초} is not set: subtract 1 from {주식::변동시간::분} set {주식::변동시간::초} to 59 else: if {주식::변동시간::초} > -1: subtract 1 from {주식::변동시간::초} if {주식::변동시간::초} = -1: if {주식::변동시간::분} >= 0: subtract 1 from {주식::변동시간::분} set {주식::변동시간::초} to 59 if {주식::변동시간::분} = -1: set {주식::변동시간::분} to {주식::변동시간}-1 set {주식::변동시간::완료} to true execute console command "가격변동" else: set {주식::변동시간::분} to {주식::변동시간} #주식가격을 변동시키는 명령어(수동으로 가능) command /가격변동: trigger: if {주식::변동시간::완료} is true: delete {주식::변동시간::완료} set {_a} to 1 loop {주식::목록::*}: set {_변동최대치} to {주식::목록::%loop-index%::최대변동가} #가격변동 확률 높을수로 가격↑확률 증가 chance of 50%: set {_변동가} to random integer between 1 and {_변동최대치}/6 add {_변동가} to {주식::목록::%loop-index%::매매가} if {주식::목록::%loop-index%::매매가} > {주식::목록::%loop-index%::상한가}: set {주식::목록::%loop-index%::상한가} to {주식::목록::%loop-index%::매매가} #변동 기록을 저장하는 구문 아래 임시변수({_b})의 값과 루프값의 따라 최대 저장한도 변경 set {_b} to 9 if {주식::목록::%loop-index%::기록::1} is not "&f기록 없음": loop 9 times: set {_c} to {_b}+1 set {주식::목록::%loop-index%::기록::%{_c}%} to {주식::목록::%loop-index%::기록::%{_b}%} subtract 1 from {_b} set {주식::목록::%loop-index%::기록::1} to "&a▲%{_변동가}%원" else: set {주식::목록::%loop-index%::기록::1} to "&a▲%{_변동가}%원" else: set {_변동가} to random integer between 1 and {주식::목록::%loop-index%::매매가} subtract {_변동가} from {주식::목록::%loop-index%::매매가} if {주식::목록::%loop-index%::매매가} < {주식::목록::%loop-index%::하한가}: set {주식::목록::%loop-index%::하한가} to {주식::목록::%loop-index%::매매가} #변동 기록을 저장하는 구문 아래 임시변수({_b})의 값과 루프값의 따라 최대 저장한도 변경 set {_b} to 9 if {주식::목록::%loop-index%::기록::1} is not "&f기록 없음": loop 9 times: set {_c} to {_b}+1 set {주식::목록::%loop-index%::기록::%{_c}%} to {주식::목록::%loop-index%::기록::%{_b}%} subtract 1 from {_b} set {주식::목록::%loop-index%::기록::1} to "&c▼%{_변동가}%원" else: set {주식::목록::%loop-index%::기록::1} to "&c▼%{_변동가}%원" loop all players: if inventory name of current inventory of loop-player contains "&6귀금속목록": close player's inventory broadcast "{@c} 귀금속의 가격이 변경되었습니다! 다시 귀금속 창을 열어주세요!" #주식을 사거나 파는 구문 on inventory click: if inventory name of player's current inventory contains "&6귀금속목록": loop {주식::목록::*}: if name of clicked item contains loop-index: if "%click type%" contains "LEFT": cancel event if {주식::목록::%loop-index%::현재갯수} >= 1: if money of player >= {주식::목록::%loop-index%::매매가}*1: remove 1 from {주식::목록::%loop-index%::현재갯수} remove {주식::목록::%loop-index%::매매가}*1 from player's money give {주식::목록::%loop-index%} named "&6%loop-index%" to player if "%click type%" contains "RIGHT": cancel event if player has {주식::목록::%loop-index%} named "&6%loop-index%": add 1 to {주식::목록::%loop-index%::현재갯수} add {주식::목록::%loop-index%::매매가} to player's money remove {주식::목록::%loop-index%} named "&6%loop-index%" from player's inventory else: cancel event #모든 주식정보를 초기화 하는구문 command /귀금속초기화: trigger: delete {주식::*}
스크립터브혼
2020.12.23아이템 지급 후 stop을 해주세요.
Ru_Nan
2020.12.25위 스크립트에서 가장마지막에 올린 주식만 실시간으로 갱신이 됩니다 어떻게 하면 등록된모든 주식을 실시간으로 갱신하나요?
스크립터브혼
2020.12.25갱신하는 코드 부분만 올려주세요. [저번]에 코드분석 방법 알려드린 대로 분석한 내용도 같이 올려주세요.
Ru_Nan
2020.12.25스크립터브혼
2020.12.25올려주신 코드의 흐름이 어떻게 되는지 설명해보시겠어요? 구현하려고 했던 알고리즘을 알려주세요.
Ru_Nan
2020.12.253.sk 각 구문마다 설명을 적어 놓았습니다. 이 스크립트는 주식스크립트 입니다. 플레이어가 들고 있는 아이템을 gui에 등록해서 정해진 시간마다 물품별 가격이 변하는 주식 스크립트 입니다. 제가 질문 드린 부분은 gui를 열었을때 gui안에서 lore에 적혀있는 설명들이 계속해서 갱신되는 것 입니다.
스크립터브혼
2020.12.25제가 질문드린건 알고리즘의 역할이 아니라 알고리즘의 구조적인 설명입니다.
예를들면, 인벤토리에 돌 아이템을 하나씩 가득 채운다고 하면
> 재료가 되는 돌 아이템과 인벤토리 생성
> 인벤토리를 열고
> 인벤토리 슬롯 갯수만큼 반복해서
> 0번슬롯부터 돌 아이템 세팅
이와 같은 구현된 기능의 논리적 흐름, 알고리즘에 구조적인 설명을 해달라는 겁니다.
저번 질문도 그렇고 이번 질문도 그렇고 저는 루난님이 올리신 코드를 재대로 이해하고 있다고 생각하지 않습니다.
자신 구현하고자하는 기능이 있다면 필연적으로 그 기능을 구현하기위한 알고리즘을 구성해야합니다.
알고리즘을 구성했다면 그때야 스크립트로 코딩을 하는겁니다.
직접 작성하지 않은 코드라 하더라도 똑같습니다. 코드를 읽고 그 코드의 알고리즘을 분석하고 나서
수정, 보안해야할 부분을 수정한 후 스크립트로 코딩하는 것입니다.
제가 루난님께 요청드리는 것은 구현할 기능이 아니라 구현을 위해 루난님이 설계한 알고리즘이 무엇인가 하는 것입니다.
또한, 루난님이 올리신 코드가 어떤 알고리즘을 구현한 것인지 알려달라는 겁니다.
"gui를 열었을때 gui안에서 lore에 적혀있는 설명들이 계속해서 갱신되는 것 "
> 로어를 어떻게 갱신하는건가요?
> 어떤 이벤트에서? 어떤 데이터로? 어떤 순서로?
Ru_Nan
2020.12.25every 0.1 second:
loop {주식::목록::*}: 를 통해서 lore에 적혀있는 {주식::목록::%loop-index%::현재갯수}%/%{주식::목록::%loop-index%::최대갯수}%개와 %{주식::목록::%loop-index%::기록::*}%를 계속 갱신해 주는 것 입니다
귀금속 추가를 통해서 {주식::목록::*}을 지정합니다 그다음 gui {주식::목록::*}을 등록합니다
그런 다음 가격변동이 일어나게 되면 gui lore에 있는 변수 값들을 변경해 줍니다. 또는 구매를 하게 되면 %{주식::목록::%loop-index%::현재갯수}%/%{주식::목록::%loop-index%::최대갯수}%개"를 하면 변수가 바뀌게 됩니다.
하지만 여기서 이렇게 만 하면 gui를 연 상태에서는 다른사람이 구매를 해도 알수가 없습니다 그래서 every 0.1 second:
loop {주식::목록::*}:를 추가해 여기서 gui의 등록되어있는 물품들의 lore을 갱신해 주는 것 입니다
스크립터브혼
2020.12.25덧글로 달아주신 코드에 대한 설명을 요구했던 겁니다...
every 0.1 second: loop {주식::목록::*}: add 1 to {_슬롯} loop all players: if inventory name of current inventory of loop-player contains "&6귀금속목록": # 인벤토리 세팅 stop
올려주신 코드에서 불필요한걸 제거하면 위와 같습니다.
위 코드의 흐름은 다음과 같습니다.
> 0.1초마다
> {주식::목록::*} 리스트를 루프합니다.
>> 루프마다 {_슬롯} 변수에 1을 더합니다.
>> 루프마다 온라인 플레이어를 루프합니다.
>>> 플레이어의 인벤토리이름이 "&6귀금속목록"을 포함한다면
>>> 인벤토리를 새롭게 세팅하고 멈춥니다.
이 알고리즘의 문제는 "가장마지막에 올린 주식만 실시간으로 갱신"되는 문제입니다.
1. 문제의 원인은 당연히 마지막 stop 이펙트 때문입니다.
루프한 온라인 플레이어가 특정한 인벤토리를 열고 있다면 멈추기 때문이죠.
또한 이중 루프에서 플레이어를 지정한 후 슬롯값은 변경되지 않기 때문입니다.
이중루프에 대해서는 3번에서 설명드립니다.
2. 또한 {_슬롯} 변수를 사용하여 슬롯을 지정하는데 해당 변수가 다시 0으로 리셋되는 곳이 없습니다.
아무값도 없으면 0부터 순차적으로 증가하겠지만,
두번째 플레이어부터는 첫번째 플레이어에서 더해진 값 그대로 증가하게 되는 문제가 있죠.
데이터의 생성과 변경, 소멸에 대해서 항상 고민하셔야 합니다.
{_슬롯} 변수는 플레이어가 지정되기 전에 0으로 초기화 되어야 합니다.
3. 마지막으로 루프 순서입니다. 이부분은 반드시 문제는 아니지만 짚고 넘어갈 부분이 있습니다.
이중 루프도 마찬가지로 데이터의 생성/변경/소멸에 대해서 더욱 꼼꼼하게 고민해야합니다.
코드의 이중 루프는 주식을 지정한 후, 플레이어를 지정합니다.
그런데 플레이어가 사용하게 될 {_슬롯}변수 플레이어 지정 이전에 변경됩니다.
다시말하면 지정된 플레이어의 인벤토리를 세팅할때 슬롯 한개만 변경하고 다음 플레이어로 넘어간다는 것입니다.
다음 슬롯값으로 변경하기 위해서는 플레이어 루프가 완전히 끝난 후 다시 주식 루프가 시작되어야 하기 때문입니다.
알고리즘 구성 할 때 모든 플레이어를 한개 슬롯씩 변경하는 것은 조금은 부자연스러운 생각입니다.
일반적으로 플레이어 한명에 대해서 인벤토리를 슬롯 갯수만큼 변경하는것으로 생각하는게 자연스럽죠.
슬롯은 플레이어보다 작은 개념이기 때문입니다.
Ru_Nan
2020.12.26이런식으로 하면 실시간으로 갱신이 되지 않습니다
every 0.1 second: loop {주식::목록::*}: add 1 to {_슬롯} loop all players: if inventory name of current inventory of loop-player contains "&6귀금속목록": # 인벤토리 세팅 stop
스크립터브혼
2020.12.26제가 단 덧글은 읽으신 건가요? 저는 그렇게 수정하라고 하지 않았습니다. 외국인인가요?
Ru_Nan
2020.12.26말하신데로 수정해서 지금은 잘 쓰고 있습니다. 위에서 불필요한것 들을 제거한 간단한 것이라길래 저렇게 수정했었습니다