no image
[Level 1] 없는 숫자 더하기
제한사항으로 숫자가 정해져있어서 그냥 10칸 짜리 배열을 만들고 숫자가 있으면 해당하는 인덱스를 증가시키고 나중에 0인 인덱스만 구하는 방법으로 만들었다. 범위기반 for문을 사용했기 때문에 인덱스를 구할 때를 유의해야한다. #include #include #include using namespace std; int solution(vector numbers) { int answer = 0; vector arr(10); for(auto & n : numbers) { arr[n]++; } for(auto & n : arr) { if(n == 0) answer += &n - &*arr.begin(); // range based for에서 인덱스를 구하는 방법 } return answer; }
2022.07.03
no image
[Level 1] 신규 아이디 추천
프로그래머스 연습 문제 레벨 1 신규 아이디 추천 친구가 풀어보라고 추천해준 문제이다. 단계별 원하는 조건을 하나 하나 맞추다 보니 풀어지는 문제였다. #include #include #include using namespace std; void step_1(string &str) { transform(str.begin(), str.end(), str.begin(), ::tolower); } void step_2(string &str) { string temp; for (char& c : str) { if (islower(c) || isdigit(c) || c == '-' || c == '_' || c == '.') temp.push_back(c); } str = temp; } void step_3(st..
2022.07.03
no image
[C++] fill, fill_n 배열을 초기화 하는 방법, 2차원, 3차원 배열 초기화
c++에서 배열을 초기화하는 방법으로 다음과 같은 초기화 방법이 있다 int a[3] = { 1, 2, 3 }; int b[3] = { 0 }; int c[] = { 0, 0, 0 }; 이것은 정수형 배열을 초기화 하는 방법이고 정수형 배열에서 배열의 모든 값을 0이외의 숫자로 초기화 하는 방법은 어떤것이 있을까 int d[3] = { 5 }; 나는 처음에 이렇게 적으면 모든 값이 5로 초기화 되는 줄 알았다 하지만 결과는 그렇지 않았고 저렇게 적으면 0번째 요소에는 5가 들어가고 나머지 인덱스값에는 0으로 초기화 되는거였는데 이걸 제대로 알지 못했던것이었다 fill과 fill_n 함수 그러다가 fill과 fill_n이라는 함수를 알게되었다 fill과 fill_n 함수는 아래 홈페이지에서 영어로 자세히 ..
2022.04.11
[C언어] 하샤드수 구하기, int 각 자릿수 더하기
#include #include #include int main(Void) { int number; int sum=0; char c_number[10000]; printf("하샤드수인지 확인할 숫자를 입력하시오: "); scanf("%d", &number); sprintf(c_number, "%d", number); for (int i = 0; i < strlen(c_number); i++) { sum += c_number[i] - 48; } if (number % sum == 0) { printf("%d는 하샤드수입니다.", number); } else { printf("%d는 하샤드수가 아닙니다.", number); } return 0; } 하샤드수구하기
2022.02.23
no image
마인크래프트 스크립트 공유 - 아이템 스탯 강화 스크립트(플러그인) 1.3
마인크래프트 스크립트 공유 - 아이템 스탯 강화 스크립트 1.3 아이템 스탯 강화 스크립트 1.3 다운로드 ▼ 위 첨부파일을 받아서 적용하면 되는데 첨부하고 갑자기 생각났네요. 명령어에 행운석과 주문서 같은 얻는 아이템에 OP체크를 안넣었습니다. /강화 오피 부분이랑 비슷하게 알아서 만드시면 됩니다. ※ 사용법 ※ - 명령어 - /강화 확률 강화 확률을 봅니다. /강화 강화석 레벨 수량 해당 레벨의 강화석을 얻습니다. /강화 오피 강화 확률을 100%로 고정합니다. /강화 행운석 확률 해당 확률의 행운석을 얻습니다. /강화 주문서 파괴 방지 주문서를 얻습니다. /강화 인챈트이름 해당 인챈트 강화석을 얻습니다. /인챈트 인챈트이름 레벨 들고있는 아이템을 해당 인챈트로 인챈트합니다. 사용법은 지난 버전이랑 ..
2020.04.02
no image
마인크래프트 스크립트 - 아이템 강화 4 (행운석, 파괴방지)
마인크래프트 스크립트 - 아이템 강화 4 (행운석, 파괴방지) 드디어 행운석과 파괴방지 시스템을 넣어보려고 합니다. 아이템강화 3편이랑 ui도 다르긴하지만 기본 스크립트는 똑같으니 보실분은 보고 나중에 배포하면 가져가셔도 됩니다. :: 목표 :: 행운석과 파괴방지를 넣어보자 일단 무기 강화창이 많이 바뀌었습니다. 1번에는 강화석을 넣고 2번에 행운석 3번에 파괴 방지 주문서를 넣을 생각입니다. 그럼 일단 행운석과 파괴 방지 주문서를 만들어 봅시다. 디자인은 구리지만 상관없! 강화 행운석 확률은 명령어로 조정 가능하도록 만들었습니다. 그럼 행운석 정보를 얻어보는 코드를 짜봅시다. set {_행운석스탯::*} to uncolored lore of slot 31 of current inventory of pl..
2020.04.02
no image
마인크래프트 스크립트 - 인챈트 강화 4
마인크래프트 스크립트 - 인챈트 강화 4 전에 인챈트 강화 스크립트를 다 만들었다고 생각했는데 한계치를 정해놓는걸 까먹었네요... 인챈트 한계치는 각각 정해놔야 하기 때문에 꽤 귀찮게 하나하나 설정해야합니다. :: 목표 :: 인챈트 한계치를 만들어보자 전에 인챈트 강화 창에 아이템과 인챈트 강화석을 놓고 강화 버튼을 누르면 이렇게 인챈트가 되는 스크립트를 만들었죠 근데 문제가 강화석만 얻으면 한계치 없이 인챈트를 할 수 있단 말이죠 제가 원하는건 내구3정도는 아쉬우니 인챈트 강화석을 통해 추가로 인챈트를 할 수 있게 만드는게 본래 의도이지만 또 너무 높으면 그것도 문제란말이죠 그러니 각 인챈트별로 한계를 정하고 그 이상 넘어가면 못하도록 해보려고 합니다. else: set {_enc} to transEn..
2020.04.02
no image
마인크래프트 스크립트 - 1개 없애기 amount of, 아이템 갯수 얻기
마인크래프트 스크립트 - 1개 없애기 amount of, 아이템 갯수 얻기 안녕하세요~ 저번에 아이템 인챈트 강화를 하다가 강화석 1개를 없애고 싶은데 remove를 사용하니 아이템이 아니라며 안되었는데 다른 방법으로 1개를 없앴어요. 어떻게 하는지 한번 자세히 알아봅시다~ :: 목표 :: 원하는 아이템 수량을 얻고 없애보자 https://skriptlang.github.io/Skript/expressions.html#ExprAmountOfItems amount of ~ in ~ 여기서 중요한 구문입니다. on rightclick on sign: if line 1 is "test": open chest with 1 rows named "test" to player set slot 0 of current ..
2020.03.25
728x90
반응형

제한사항으로 숫자가 정해져있어서 그냥 10칸 짜리 배열을 만들고 숫자가 있으면 해당하는 인덱스를 증가시키고 나중에 0인 인덱스만 구하는 방법으로 만들었다.

범위기반 for문을 사용했기 때문에 인덱스를 구할 때를 유의해야한다.

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(vector<int> numbers) {
    int answer = 0;
    vector<int> arr(10);
    for(auto & n : numbers)
    {
        arr[n]++;
    }
    for(auto & n : arr)
    {
        if(n == 0)
            answer += &n - &*arr.begin();   // range based for에서 인덱스를 구하는 방법
    }

    return answer;
}

 

 

728x90
반응형
728x90
반응형

프로그래머스 연습 문제 레벨 1 신규 아이디 추천


친구가 풀어보라고 추천해준 문제이다. 단계별 원하는 조건을 하나 하나 맞추다 보니 풀어지는 문제였다.

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

void step_1(string &str) {
    transform(str.begin(), str.end(), str.begin(), ::tolower);
}
void step_2(string &str) {
    string temp;
    for (char& c : str) {
        if (islower(c) || isdigit(c) || c == '-' || c == '_' || c == '.') temp.push_back(c);
    }
    str = temp;
}
void step_3(string &str) {
    vector<int> count;
    char pre_char = str[0];
    for (int i = 1; i < str.length(); i++) {
        if (str[i] == '.') {
            if (pre_char == str[i]) {
                count.push_back(i);
            }
        }
        pre_char = str[i];
    }
    for (int i = count.size() - 1; i >= 0; i--) {
        str.erase(str.begin() + count[i]);
    }
}
void step_4(string &str) {
    if (str.front() == '.') str.erase(str.begin());
    if (!str.empty()) {
        if (str.back() == '.') str.erase(str.begin() + str.length() - 1);
    }
}
void step_5(string &str) {
    if(str.empty()) str.push_back('a');
}
void step_6(string &str) {
    while (str.length() > 15) {
        str.pop_back();
    }
    while (str.back() == '.') {
        str.pop_back();
    }
}
void step_7(string &str) {
    while (str.length() < 3) {
        str.push_back(str[str.length() - 1]);
    }
}


string solution(string new_id) {
    string answer = new_id;
    if (!answer.empty()) step_1(answer);
    if (!answer.empty()) step_2(answer);
    if (!answer.empty()) step_3(answer);
    if (!answer.empty()) step_4(answer);
    step_5(answer);
    step_6(answer);
    step_7(answer);
    return answer;
}

 

1단계 부터 7단계 가지 순차적으로 동작하도록 만들었는데 다른 사람들 풀이를 보니 굳이 그렇게 하지 않아도 됐던 것 같다.

 

728x90
반응형
728x90
반응형

c++에서 배열을 초기화하는 방법으로 다음과 같은 초기화 방법이 있다

 

int a[3] = { 1, 2, 3 };
int b[3] = { 0 };
int c[] = { 0, 0, 0 };

 

 

이것은 정수형 배열을 초기화 하는 방법이고

정수형 배열에서 배열의 모든 값을 0이외의 숫자로 초기화 하는 방법은 어떤것이 있을까

 

 int d[3] = { 5 };

 

나는 처음에 이렇게 적으면 모든 값이 5로 초기화 되는 줄 알았다

 

 

하지만 결과는 그렇지 않았고 저렇게 적으면 0번째 요소에는 5가 들어가고 나머지 인덱스값에는 0으로 초기화 되는거였는데 이걸 제대로 알지 못했던것이었다

 

 

fill과 fill_n 함수

 

그러다가 fill과 fill_n이라는 함수를 알게되었다

fill과 fill_n 함수는 아래 홈페이지에서 영어로 자세히 설명되어있다

 

https://en.cppreference.com/w/cpp/algorithm/fill_n

https://en.cppreference.com/w/cpp/algorithm/fill

 

 

fill과 fill_n의 차이는

fill은 시작하는곳 부터 끝나는곳까지 채운다는것이고

fill_n은 시작하는곳 부터 얼마만큼 채울것인지로 이해했다

 

fill과 fill_n을 배열에서 사용하려면 다음과 같이 하면 된다

 

일단 fill과 fill_n은 <algorithm> 헤더에 정의되어있고 네임스페이스는 std라고 한다

내가 사용하는 비쥬얼스튜디오에서는 #include를 쓸필요는 없고 using namespace std;만 적으면 사용이된다

만약 오류가 난다면 #include <algorithm>를 입력해야할거같다

 

1차원 배열에서의 fill과 fill_n은 다음의 방법으로 사용할 수 있다

 

fill을 사용하는 방법

 

fill(시작 주소, 끝 주소, 변경 값);
int int_arr_1[9];

fill(int_arr_1, int_arr_1 + 9, 5);
fill(int_arr_1, int_arr_1 + sizeof int_arr_1 / sizeof int_arr_1[0], 5);

fill(&int_arr_1[0], &int_arr_1[9], 5);
fill(&int_arr_1[0], &int_arr_1[sizeof int_arr_1 / sizeof int_arr_1[0]], 5);

 

fill_n을 사용하는 방법

 

fill_n(시작 주소, 몇 번 할지, 변경 값);
int int_arr_1[9];

fill_n(int_arr_1, 9, 5);
fill_n(int_arr_1, sizeof int_arr_1 / sizeof int_arr_1[0], 5);

fill_n(&int_arr_1[0], 9, 5);
fill_n(&int_arr_1[0], sizeof int_arr_1 / sizeof int_arr_1[0], 5);

 

 

모두 동일한 결과가 나온다

 

여기서 만약 어디부터 어디까지 예를들면 두번째 인덱스부터 4번째 까지만 초기화를 한다면 다음 코드 처럼 하면된다

fill(&int_arr_1[1], &int_arr_1[4], 5);
fill_n(&int_arr_1[1], 3, 5);

 

 

2번째부터 4번째 까지만 초기화 하여 나머지 인덱스에는 이상한 값이 들어가 있다

 

그렇다면 2차원이나 3차원 배열에선 어떻게 하면될까

fill의 주소를 사용하려면 인덱스 끝을 잘 봐야한다

[인덱스-1][인덱스] 이렇게 해야 작동을 한다

 

int int_arr_2[9][6];

fill(&int_arr_2[0][0], &int_arr_2[8][6], 5);
fill_n(&int_arr_2[0][0], 9 * 6, 5);

 

 

3차원도 마찬가지로 2차원 하는것 처럼 하면 된다

 

int int_arr_3[3][4][2];

fill(&int_arr_3[0][0][0], &int_arr_3[2][3][2], 5);
fill_n(&int_arr_3[0][0][0], 3 * 4 * 2, 5);

 

 

상황에 맞게 fill과 fill_n을 구분해서 사용하면 될것같다

단순 모든 값을 초기화 할때는 fill_n이 편한것 같다

 

728x90
반응형
728x90
반응형
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(Void)
{
	int number;
	int sum=0;
	char c_number[10000];

	printf("하샤드수인지 확인할 숫자를 입력하시오: ");
	scanf("%d", &number);

	sprintf(c_number, "%d", number);

	for (int i = 0; i < strlen(c_number); i++)
	{
		sum += c_number[i] - 48;
	}

	if (number % sum == 0)
	{
		printf("%d는 하샤드수입니다.", number);
	}
	else
	{
		printf("%d는 하샤드수가 아닙니다.", number);
	}
	
	return 0;
}

하샤드수구하기

728x90
반응형
728x90
반응형

 

마인크래프트 스크립트 공유 - 아이템 스탯 강화 스크립트 1.3

 


 

아이템 스탯 강화 스크립트 1.3 다운로드 ▼

 

EnhanceItem.sk
0.04MB

 

위 첨부파일을 받아서 적용하면 되는데

첨부하고 갑자기 생각났네요.

명령어에 행운석과 주문서 같은 얻는 아이템에

OP체크를 안넣었습니다.

/강화 오피 부분이랑 비슷하게

알아서 만드시면 됩니다.

 


 

※ 사용법 ※

 

- 명령어 -

 

/강화 확률

강화 확률을 봅니다.

 

/강화 강화석 레벨 수량

해당 레벨의 강화석을 얻습니다.

 

/강화 오피

강화 확률을 100%로 고정합니다.

 

/강화 행운석 확률

해당 확률의 행운석을 얻습니다.

 

/강화 주문서

파괴 방지 주문서를 얻습니다.

 

/강화 인챈트이름

해당 인챈트 강화석을 얻습니다.

 

/인챈트 인챈트이름 레벨

들고있는 아이템을 해당 인챈트로 인챈트합니다.

 


 

사용법은 지난 버전이랑 별다를게 없습니다.

시티즌으로 무기 대장장이 NPC를 생성하고

 

 

원하는 목록을 선택해서

 

 

강화 하시면 됩니다.

예를 들어 인챈트 강화를 해보겠습니다.

 

 

먼저 명령어로 날카로움 인챈트 강화석을 얻어줍니다.

 

 

이게 인챈트 강화석입니다.

LORE로 구분이 가능합니다.

 

 

NPC를 눌러 인챈트 강화를 켭니다.

왼쪽에 아이템 오른쪽에 강화석을 놓고

가온데 모루를 클릭하면

 

 

아이템에 인챈트가 붙습니다.

 

이번에 업데이트된건

행운석, 무기 파괴 방지 주문서, 인챈트 강화

이 세가지입니다.

다음에 제련이라는걸 추가하고 마치겠습니다.

 

 

※ 설치법 ※

 

먼저 스크립트 플러그인을 다운받아주시고

 

https://docs.skunity.com/downloads/

 

서버를 한번 돌려준 뒤 스크립트 풀더 안의 또다른 스크립트 풀더에

제가 만든 스크립트를 넣어주시면 됩니다.

 

그리고 버킷구동기에 sk reload 스크립트이름.sk를 입력해주시면 적용됩니다.

 

! 추가 애드온이 필요합니다 !

 

아래 서버에서 사용된 애드온을 꼭 넣어주셔야 작동합니다.

1.15.2를 기준으로 만들어졌기 때문에 감안하고 다운로드 하시길 바랍니다.

 

애드온 다운로드 ▼

 

https://drive.google.com/open?id=16_m2JYXYKgU5N3KR3e-NtjVhOSlonEd7

 


 

:: 해당 서버에서 사용된 애드온 ::

 

Skript

GomSK

InvSk

GameAPI

HolographicDisplaysAddon

MarSK

QuarSk

SharpSK

SkChoke

Skellett

SkExtras

SkQuery

skRayFall

skript-yaml

SkRPG

SkStuff

skUtilities

TuSKe

Umbaska

Vault

 

만약 코드를 적용했는데 서버에서 에러가 뜨면 애드온 미적용 때문일 확률이 높습니다.

 

 

 

 

:: 이 글은 원 출처만 남기면 언제든 퍼가고 수정하셔도 좋습니다. ::

728x90
반응형
728x90
반응형

 

마인크래프트 스크립트 - 아이템 강화 4 (행운석, 파괴방지)

 


 

드디어 행운석과 파괴방지 시스템을 넣어보려고 합니다.

아이템강화 3편이랑 ui도 다르긴하지만 기본 스크립트는 똑같으니

보실분은 보고 나중에 배포하면 가져가셔도 됩니다.

 

:: 목표 ::

 

행운석과 파괴방지를 넣어보자

 


 

 

일단 무기 강화창이 많이 바뀌었습니다.

1번에는 강화석을 넣고 2번에 행운석 3번에 파괴 방지 주문서를 넣을 생각입니다.

그럼 일단 행운석과 파괴 방지 주문서를 만들어 봅시다.

 

 

디자인은 구리지만 상관없!

강화 행운석 확률은 명령어로 조정 가능하도록 만들었습니다.

 

 

그럼 행운석 정보를 얻어보는 코드를 짜봅시다.

 

set {_행운석스탯::*} to uncolored lore of slot 31 of current inventory of player
replace all " " and "강화" and "확률을" and "%" and "올려줍니다." with "" in {_행운석스탯::1}
set {_행운석스탯} to {_행운석스탯::1} parsed as number

 

이렇게 해주면 확률만 {_행운석스탯::1}에 저장되겠죠

그럼 행운석이 아닌 다른 아이템을 올렸을 때 진행이 안되야겠죠

 

if slot 31 of current inventory of player is not air:
                    if {_행운석스탯::3} is not "행운석":
                        message "[무기대장장이]: 행운석 자리에 이상한걸 넣었군" to player
                        exit

 

 

# 행운석 정보를 변수에 대입
                set {_행운석스탯::*} to uncolored lore of slot 31 of current inventory of player
                replace all " " and "강화" and "확률을" and "%%" and "올려줍니다." with "" in {_행운석스탯::1}
                set {_행운석스탯} to {_행운석스탯::1} parsed as number
                set {_luckitem} to slot 31 of current inventory of player
                
                if {_luckitem} is not air:
                    if {_행운석스탯::3} is not "행운석":
                        message "[무기대장장이]: 행운석 자리에 이상한걸 넣었군" to player
                        exit

 

 

코드를 수정해서 원하는대로 만들었습니다.

행운석 자리에 행운석이 아닌 아이템을 넣으면 안되도록 했고

넣으면 의도한대로 되야겠죠

 

set {_강화확률} to {_강화확률} + {_행운석스탯}

 

이거 한줄과

 

play sound "BLOCK_ANVIL_DESTROY" with volume 1 and pitch 1 at player
                        launch burst colored white at player timed 0.1
                        
                        chance of 10%:
                            message "[무기대장장이]: 이런, 강화 단계가 내려갔다..." to player
                            delete slot 20 of current inventory of player
                            set slot 24 of current inventory of player to {_아이템} with lore " " and "&b%{_강화단계} - 1%단계" and "&e==========" and "&a + 체력 %{_강화체력} - 0.5%" and "&c + 공격력 %{_강화공격력} - 1%" and "&9 + 방어력 %{_강화방어력} - 0.8%" and "&e=========="
                            exit


                        else:
                            message "[무기대장장이]: 으음, 강화에 실패했군. 다음엔 성공하길 바래" to player
                            exit

 

실패했을 때 구문을 수정하면 실패했을 때 10%확률로 단계가 내려가게끔 할 수 있습니다.

 

 

되긴 했는데 저는 꽤 확률이 낮아서 밸런스 패치만 잘 되면 상관없겠네요.

 

이제 파괴 방지 주문서 구문을 만들어봅시다.

그냥 똑같이 아이템 정보받고 실패하면 확률에따라 없애버리면 되겠네요 ㅎㅎ

 

 

그냥 뭐 잘 되네요 ㅋㅋ

아직 제련 시스템은 못만들었고

나중에 시간날 때 만들어보겠습니다.

그리고 여기까지 만든건 공유 카테고리에서 배포하겠습니다.

 

 

 

※ 스크립트 다운로드 ※

 

공유 카테고리

 


 

:: 해당 서버에서 사용된 애드온 ::

 

Skript

GomSK

InvSk

GameAPI

HolographicDisplaysAddon

MarSK

QuarSk

SharpSK

SkChoke

Skellett

SkExtras

SkQuery

skRayFall

skript-yaml

SkRPG

SkStuff

skUtilities

TuSKe

Umbaska

Vault

 

만약 코드를 적용했는데 서버에서 에러가 뜨면 애드온 미적용 때문일 확률이 높습니다.

애드온은 아래 사이트에서 대부분 받을 수 있으며 없는 애드온은

아마 한국인 개발자가 만든 애드온일 확률이 높습니다.

구글이나 네이버에 애드온 모음을 검색하면 나와있으니 찾아서 다운로드 하시거나

제 블로그 마인크래프트 항목 처음 글에 다운로드 링크가 걸려있으니 확인하시길 바랍니다.

 

 

 

 

:: 이 글은 원 출처만 남기면 언제든 퍼가고 수정하셔도 좋습니다 ::

 

 

 

728x90
반응형
728x90
반응형

 

마인크래프트 스크립트 - 인챈트 강화 4

 


 

전에 인챈트 강화 스크립트를 다 만들었다고 생각했는데

한계치를 정해놓는걸 까먹었네요...

인챈트 한계치는 각각 정해놔야 하기 때문에

꽤 귀찮게 하나하나 설정해야합니다.

 

:: 목표 ::

 

인챈트 한계치를 만들어보자

 


 

 

전에 인챈트 강화 창에 아이템과 인챈트 강화석을 놓고 강화 버튼을 누르면

 

 

이렇게 인챈트가 되는 스크립트를 만들었죠

근데 문제가 강화석만 얻으면 한계치 없이 인챈트를 할 수 있단 말이죠

제가 원하는건 내구3정도는 아쉬우니 인챈트 강화석을 통해 추가로

인챈트를 할 수 있게 만드는게 본래 의도이지만

또 너무 높으면 그것도 문제란말이죠

그러니 각 인챈트별로 한계를 정하고 그 이상 넘어가면 못하도록 해보려고 합니다.

 

else:
                    set {_enc} to transEnchant({_enclore::1}) parsed as enchantment
                    set {_pitemenlv} to enchant level of {_enc} of {_pitem}
                    set {_isMax} to isMaxEnchant({_enclore::1}, {_pitemenlv}, player)

                    if {_isMax} is false:
                        delete slot 20 of current inventory of player
                        delete slot 24 of current inventory of player
                        wait 12 tick
                        set {_amount} to {_am} - 1
                        set slot 24 of current inventory of player to {_amount} of {_encitem}
                        enchant {_pitem} with "%{_enc}% %{_pitemenlv} + 1%" parsed as enchantment type
                        set slot 20 of current inventory of player to {_pitem}
                        subtract 50000 from player's money
                        message "[무기대장장이]: 아이템의 인챈트가 강화되었다. 잘쓰라고!" to player
                        play sound "BLOCK_ANVIL_USE" with volume 1 and pitch 1 at player
                        launch flickering ball colored red and yellow and green at player's location timed 0.8
                        exit
                    
                    else:
                        message "[무기대장장이]: 음, 이 무기의 %{_enclore::1}% 인챈트는 더이상 올릴 수 없어." to player
                        exit
# 인챈트 한계치
function isMaxEnchant(s: string, i: number, p: player) :: boolean:
    #message "%{_s}%, %{_i}%" to {_p}
    if {_s} is "보호" or "화염 보호":
        if {_i} = 6:
            return true
        else:
            return false

 

한계치인지 아닌지 확인하는 함수를 만들어봤습니다.

일단 보호나 화염 보호레벨이 6이면 true를 줘서

강화하는 스크립트에 true면 할 수 없다고 뜨게하고 false면 그대로 진행하도록 했습니다.

 

 

이제 남은건 저 목록을 일일이 정하는거죠

 

# 인챈트 한계치
function isMaxEnchant(s: string, i: number, p: player) :: boolean:
    #message "%{_s}%, %{_i}%" to {_p}
    if {_s} is "수선":
        if {_i} = 2:
            return true
        else:
            return false

    else if {_s} is "차가운 걸음":
        if {_i} = 3:
            return true
        else:
            return false
    
    else if {_s} is "호흡" or "발화" or "빠른 장전" or "충절" or "행운" or "바다의 행운" or "미끼":
        if {_i} = 4:
            return true
        else:
            return false

    else if {_s} is "약탈" or "밀치기" or "휘몰아치는 칼날" or "밀어내기" or "관통" or "급류" or "가시" or "가벼운 착지" or "내구성":
        if {_i} = 5:
            return true
        else:
            return false

    else if {_s} is "보호" or "화염으로부터 보호" or "폭발로부터 보호" or "발사체로부터 보호":
        if {_i} = 6:
            return true
        else:
            return false
        
    else if {_s} is "날카로움" or "강타" or "살충" or "힘" or "찌르기" or "효율":
        if {_i} = 7:
            return true
        else:
            return false

 

저는 이렇게 밸런스를 줘봤는데 대충 준거라 제대로 맞지도 않겠죠 ㅋㅋ

일단 여기까지 한계값 정하기 완성!!!!

부위별로 맞지않는 인챈트를 할경우 안되게 하고싶긴한데

어차피 적용되지도 않으니 그냥 넘어가겠습니다.

 

 

 

 

 

※ 스크립트 다운로드 ※

 

 

 


 

:: 해당 서버에서 사용된 애드온 ::

 

Skript

GomSK

InvSk

GameAPI

HolographicDisplaysAddon

MarSK

QuarSk

SharpSK

SkChoke

Skellett

SkExtras

SkQuery

skRayFall

skript-yaml

SkRPG

SkStuff

skUtilities

TuSKe

Umbaska

Vault

 

만약 코드를 적용했는데 서버에서 에러가 뜨면 애드온 미적용 때문일 확률이 높습니다.

애드온은 아래 사이트에서 대부분 받을 수 있으며 없는 애드온은

아마 한국인 개발자가 만든 애드온일 확률이 높습니다.

구글이나 네이버에 애드온 모음을 검색하면 나와있으니 찾아서 다운로드 하시거나

제 블로그 마인크래프트 항목 처음 글에 다운로드 링크가 걸려있으니 확인하시길 바랍니다.

 

 

 

 

:: 이 글은 원 출처만 남기면 언제든 퍼가고 수정하셔도 좋습니다 ::

 

 

 

728x90
반응형
728x90
반응형

 

마인크래프트 스크립트 - 1개 없애기 amount of, 아이템 갯수 얻기

 


 

안녕하세요~ 저번에 아이템 인챈트 강화를 하다가 강화석 1개를 없애고 싶은데

remove를 사용하니 아이템이 아니라며 안되었는데 다른 방법으로 1개를 없앴어요.

어떻게 하는지 한번 자세히 알아봅시다~

 

:: 목표 ::

 

원하는 아이템 수량을 얻고 없애보자

 


 

https://skriptlang.github.io/Skript/expressions.html#ExprAmountOfItems

 

amount of ~ in ~

여기서 중요한 구문입니다.

 

on rightclick on sign:
    if line 1 is "test":
        open chest with 1 rows named "test" to player
        set slot 0 of current inventory of player to anvil named "test"

on inventory click:
    if iname contains "test":
        if click type is left mouse button with shift or right mouse button with shift or right mouse button:
            cancel event
        else:
            if clicked raw slot is 0:
                cancel event
                set {_x} to slot 8 of current inventory of player
                message "%{_x}%"

 

일단 대충 스크립트를 짰어요.

 

 

 

창을 열어서 0번 슬롯을 클릭하면 8번 슬롯의 아이템 정보를 불러오도록 했습니다.

누르니 5 ~ 아이템 이름이 뜨네요.

5는 아이템 수량인데 우리는 1개만큼 차감시킬테니 아이템 수량 - 1만큼 set하면 되겠네요.

전에는 remove라는 문법을 사용해보려고 했는데 안되더라구요.

 

 

위 사진처럼 amount of ~ in ~을 이용해서 적어봤습니다.

{_i}에다가 {_x}의 현재 8 slot의 아이템 수량을 대입합니다.

 

 

채팅으로 출력하니 제대로 나옵니다. 이게 현재 창의 해당 아이템과 동일한 갯수가 아니라

먼저 {_x}에 slot 8의 아이템 정보를 넣었고 amount of 로 {_x}의 양을 가져왔으니 slot 8에 있는

아이템의 수량만 가져오는건데 왜 전에 이상하게 생각했을까요 ㅋㅋㅋ

 

delete slot 8 of current inventory of player

 

만약 이렇게 써버리면 slot 8의 아이템은 통째로 삭제됩니다. 복구도 못해요.

보통 게임에서 원하는 수량만 없애지 통으로 없애지는 않죠

remove라는 문법이 있다고 하는데 저는 사용하지 않겠습니다.

오류가 떠서 잘 안되요. 제가 이해를 못하는건지...

여튼 제가 하려는 방법은 delete로 다 없애고

{_i} - 1만큼 set으로 다시 설정하는겁니다.

그럼 결과적으로 1만큼 없어진거죠.

 

set {_i} to amount of {_x} in current inventory of player - 1

 

위 사진의 코드 뒤에 - 1을 붙혔습니다.

이렇게 안하면 코드를 한줄 더 적어야하니까 미리 -1을 해놓는거죠.

 

set {_x} to slot 8 of current inventory of player
set {_i} to amount of {_x} in current inventory of player - 1
delete slot 8 of current inventory of player
wait 4 tick
set slot 8 of current inventory of player to {_i} of {_x}

 

시각적인 효과와 오류 방지를 위해 wait 4 tick을 주고

set slot 8 of current inventory of player to {_i} of {_x}

을 입력하여 원래 있던 수량 - 1 만큼 재설정하는 효과를 줬습니다.

 

 

만약 계속 버튼을 눌러 없애면 0 이하로 내려가 음수가 되는게 아니라

그냥 없어지고 air로 바뀝니다.

이걸 응용하면 수량을 요구하는 스크립트, 교환 등등 스크립트를 만들 수 있겠네요.

 

 

 

 

 

※ 스크립트 다운로드 ※

 

on rightclick on sign:
    if line 1 is "test":
        open chest with 1 rows named "test" to player
        set slot 0 of current inventory of player to anvil named "test"

on inventory click:
    if iname contains "test":
        if click type is left mouse button with shift or right mouse button with shift or right mouse button:
            cancel event
        else:
            if clicked raw slot is 0:
                cancel event
                set {_x} to slot 8 of current inventory of player
                set {_i} to amount of {_x} in current inventory of player - 1
                delete slot 8 of current inventory of player
                wait 4 tick
                set slot 8 of current inventory of player to {_i} of {_x}
                

 


 

:: 해당 서버에서 사용된 애드온 ::

 

Skript

GomSK

InvSk

GameAPI

HolographicDisplaysAddon

MarSK

QuarSk

SharpSK

SkChoke

Skellett

SkExtras

SkQuery

skRayFall

skript-yaml

SkRPG

SkStuff

skUtilities

TuSKe

Umbaska

Vault

 

만약 코드를 적용했는데 서버에서 에러가 뜨면 애드온 미적용 때문일 확률이 높습니다.

애드온은 아래 사이트에서 대부분 받을 수 있으며 없는 애드온은

아마 한국인 개발자가 만든 애드온일 확률이 높습니다.

구글이나 네이버에 애드온 모음을 검색하면 나와있으니 찾아서 다운로드 하시거나

제 블로그 마인크래프트 항목 처음 글에 다운로드 링크가 걸려있으니 확인하시길 바랍니다.

 

 

 

 

:: 이 글은 원 출처만 남기면 언제든 퍼가고 수정하셔도 좋습니다 ::

 

 

 

728x90
반응형