디아블로 시스템
아래 소스 적용시 미확인 아이템 습득 후 확인 주문서를 바르면 17가지의 옵션이 20% 확률로 추가 생성되며
한 아이템당 최대 5가지의 옵션이 추가 됩니다...
추가 옵션 내용 : hp,mp,hpr,mpr,min dmg,max dmg,hit,추타,마방,4대 속성방어,헤이스트옵션 유무,마법데미지등이 생성
L1Attack.java
public L1Attack(L1Character attacker , L1Character target) { // 검색
_weaponAddHit = weapon.getItem().getHitModifier() + (weapon.getUhit());
_weaponAddDmg = weapon.getItem().getDmgModifier() + (weapon.getUdmg());
_weaponSmall = weapon.getItem().getDmgSmall() + (weapon.getUmd());
_weaponLarge = weapon.getItem().getDmgLarge() + (weapon.getUmxd());
// 무기 정보의 취득 주석아래
// _weaponSmall과 _weaponLarge를 검색 후 위와같이 변경
L1ItemInstance.java
// 파일 상단의 선언부에 추가
private int _ulevel; //숙련도
private int _uhp; //hp
private int _ump; //mp
private int _uhpr; //hpr
private int _umpr; //mpr
private int _umd; //min dmg
private int _umxd; //max dmg
private int _udmg; //dmg
private int _uhit; //hit
private int _umdef; //mdef
private int _ufdef; //불 속성 방어
private int _uedef; //땅 속성 방어
private int _uwadef; //물 속성 방어
private int _uwdef; //바람 속성방어
private int _uh; //헤이스트 옵션
private int _umdmg; //magic dmg
private int _allcode; //체크 코드
// 파일 상단의 set, get 메소드 선언부에 추가
public void setUlevel(int ulevel) { // 숙련도
_ulevel = ulevel;
}
public int getUlevel() {
return _ulevel;
}
public void setUhp(int uhp) { // 추가 hp
_uhp = uhp;
}
public int getUhp() {
return _uhp;
}
public void setUmp(int ump) { // 추가 Mp
_ump = ump;
}
public int getUmp() {
return _ump;
}
public void setUhpr(int uhpr) { // 추가 hpr
_uhp = uhpr;
}
public int getUhpr() {
return _uhpr;
}
public void setUmpr(int umpr) { // 추가 mpr
_umpr = umpr;
}
public int getUmpr() {
return _umpr;
}
public void setUmd(int umd) { // 추가 md
_umd = umd;
}
public int getUmd() {
return _umd;
}
public void setUmxd(int umxd) { // 추가 mxd
_umxd = umxd;
}
public int getUmxd() {
return _umxd;
}
public void setUdmg(int udmg) { // 추가 dmg
_udmg = udmg;
}
public int getUdmg() {
return _udmg;
}
public void setUhit(int uhit) { // 추가 hit
_uhit = uhit;
}
public int getUhit() {
return _uhit;
}
public void setUmdef(int umdef) { // 추가 mdef
_umdef = umdef;
}
public int getUmdef() {
return _umdef;
}
public void setUfdef(int ufdef) { // 불속성
_ufdef = ufdef;
}
public int getUfdef() {
return _ufdef;
}
public void setUedef(int uedef) { // 땅속성
_uedef = uedef;
}
public int getUedef() {
return _uedef;
}
public void setUwadef(int uwadef) { // 물속성
_uwadef = uwadef;
}
public int getUwadef() {
return _uwadef;
}
public void setUwdef(int uwdef) { // 바람속성
_uwdef = uwdef;
}
public int getUwdef() {
return _uwdef;
}
public void setUh(int uh) { // 헤이옵
_uh = uh;
}
public int getUh() {
return _uh;
}
public void setUmdmg(int umdmg) { // 마법데미지 추가
_umdmg = umdmg;
}
public int getUmdmg() {
return _umdmg;
}
public void setAllcode(int allcode) { // 체크 코드
_allcode = allcode;
}
public int getAllcode() {
return _allcode;
}
public String getViewMessageName() // 검색
String ulevel = "";
String umdmg = ""; <==추가
return enchantLevel + itemName; // 검색 후 아래와 같이 변경
return enchantLevel + itemName + ulevel + umdmg;
return enchantLevel + itemName; 윗줄에 추가
if (getUlevel() > 0) {
if (itemType2 == 1) {
ulevel = "";
ulevel += " [숙련:" + getUlevel() + "%]"; // 숙련도
}
}
if (getUmdmg() > 0) {
if (itemType2 == 1) {
umdmg = "";
umdmg += " [MDmg:+" + getUmdmg() + "]"; // 추가 마법데미지
}
}
// 가방이나 창고에서 표시되는 이름 // 검색
String ulevel = "";
String umdmg = ""; <==추가
return enchantLevel + itemName + count + equippe; // 검색후 아래와 같이 변경
return enchantLevel + itemName + count + equippe + ulevel + umdmg;
return enchantLevel + itemName + count + equippe; // 윗줄에 추가
if (getUlevel() > 0) {
if (itemType2 == 1) {
ulevel = "";
ulevel += " [숙련:" + getUlevel() + "%]"; // 숙련도
}
}
if (getUmdmg() > 0) {
if (itemType2 == 1) {
umdmg = "";
umdmg += " [MDmg:+" + getUmdmg() + "]"; // 추가 마법데미지
}
}
MySqlCharactersItemStorage.java
public ArrayList<L1ItemInstance> loadItems(int objId) throws Exception { // 검색
items.add(item); // 검색 후 윗줄에 아래 구문 추가.
item.setUlevel(rs.getInt("ulvl"));
item.setUhp(rs.getInt("uhp"));
item.setUmp(rs.getInt("ump"));
item.setUhpr(rs.getInt("uhpr"));
item.setUmpr(rs.getInt("umpr"));
item.setUmd(rs.getInt("umd"));
item.setUmxd(rs.getInt("umxd"));
item.setUdmg(rs.getInt("udmg"));
item.setUhit(rs.getInt("uhit"));
item.setUmdef(rs.getInt("umdef"));
item.setUfdef(rs.getInt("ufdef"));
item.setUedef(rs.getInt("uedef"));
item.setUwadef(rs.getInt("uwadef"));
item.setUwdef(rs.getInt("uwdef"));
item.setUh(rs.getInt("uh"));
item.setUmdmg(rs.getInt("umdmg"));
item.setAllcode(rs.getInt("allcode"));
public void storeItem(int objId, L1ItemInstance item) throws Exception { // 검색
INSERT INTO character_items SET id = ?, item_id = ?, char_id = ?, item_name = ?, count = ?, is_equipped = 0, enchantlvl = ?, is_id = ?, durability = ?, last_used = ?, ulvl = ?, uhp = ?, ump = ?" +
", uhpr = ?, umpr = ?, umd = ?, umxd = ?, udmg = ?" +
", uhit = ?, umdef = ?, ufdef = ?, uedef = ?, uwadef = ?, uwdef = ?" +
", uh = ?, umdmg = ?, allcode = ?
// prepareStatement 뒤의 괄호안에 있는 SQL 구문을 위와같이 변경 ("" 안에 넣어야함.)
pstm.execute(); // 검색 후 윗줄에 아래 구문 추가.
pstm.setInt(10, item.getUlevel());
pstm.setInt(11, item.getUhp());
pstm.setInt(12, item.getUmp());
pstm.setInt(13, item.getUhpr());
pstm.setInt(14, item.getUmpr());
pstm.setInt(15, item.getUmd());
pstm.setInt(16, item.getUmxd());
pstm.setInt(17, item.getUdmg());
pstm.setInt(18, item.getUhit());
pstm.setInt(19, item.getUmdef());
pstm.setInt(20, item.getUfdef());
pstm.setInt(21, item.getUedef());
pstm.setInt(22, item.getUwadef());
pstm.setInt(23, item.getUwdef());
pstm.setInt(24, item.getUh());
pstm.setInt(25, item.getUmdmg());
pstm.setInt(26, item.getAllcode());
파일 하단의 @Override 선언부에 아래 메소드 추가
public void updateItemUlevel(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET ulvl = ? WHERE id = ?",
item.getUlevel());
}
public void updateItemUhp(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET uhp = ? WHERE id = ?",
item.getUhp());
}
public void updateItemUmp(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET ump = ? WHERE id = ?",
item.getUmp());
}
public void updateItemUhpr(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET uhpr = ? WHERE id = ?",
item.getUhpr());
}
public void updateItemUmpr(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET umpr = ? WHERE id = ?",
item.getUmpr());
}
public void updateItemUmd(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET umd = ? WHERE id = ?",
item.getUmd());
}
public void updateItemUmxd(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET umxd = ? WHERE id = ?",
item.getUmxd());
}
public void updateItemUdmg(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET udmg = ? WHERE id = ?",
item.getUdmg());
}
public void updateItemUhit(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET uhit = ? WHERE id = ?",
item.getUhit());
}
public void updateItemUmdef(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET umdef = ? WHERE id = ?",
item.getUmdef());
}
public void updateItemUfdef(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET ufdef = ? WHERE id = ?",
item.getUfdef());
}
public void updateItemUedef(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET uedef = ? WHERE id = ?",
item.getUedef());
}
public void updateItemUwadef(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET uwadef = ? WHERE id = ?",
item.getUwadef());
}
public void updateItemUwdef(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET uwdef = ? WHERE id = ?",
item.getUwdef());
}
public void updateItemUh(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET uh = ? WHERE id = ?",
item.getUh());
}
public void updateItemUmdmg(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET umdmg = ? WHERE id = ?",
item.getUmdmg());
}
public void updateItemAllcode(L1ItemInstance item) throws Exception {
executeUpdate(item.getId(),
"UPDATE character_items SET allcode = ? WHERE id = ?",
item.getAllcode());
}
L1DwarfForClanInventory.java
_items.add(item); // 검색 후 윗줄에 아래 구문 추가
item.setUlevel(rs.getInt("ulvl"));
item.setUhp(rs.getInt("uhp"));
item.setUmp(rs.getInt("ump"));
item.setUhpr(rs.getInt("uhpr"));
item.setUmpr(rs.getInt("umpr"));
item.setUmd(rs.getInt("umd"));
item.setUmxd(rs.getInt("umxd"));
item.setUdmg(rs.getInt("udmg"));
item.setUhit(rs.getInt("uhit"));
item.setUmdef(rs.getInt("umdef"));
item.setUfdef(rs.getInt("ufdef"));
item.setUedef(rs.getInt("uedef"));
item.setUwadef(rs.getInt("uwadef"));
item.setUwdef(rs.getInt("uwdef"));
item.setUh(rs.getInt("uh"));
item.setUmdmg(rs.getInt("umdmg"));
item.setAllcode(rs.getInt("allcode"));
INSERT INTO clan_warehouse SET id = ?, clan_name = ?, item_id = ?, item_name = ?, count = ?, is_equipped=0, enchantlvl = ?, is_id= ?, durability = ?, last_used = ?, ulvl = ?, uhp = ?, ump = ?" +
", uhpr = ?, umpr = ?, umd = ?, umxd = ?, udmg = ?" +
", uhit = ?, umdef = ?, ufdef = ?, uedef = ?, uwadef = ?, uwdef = ?" +
", uh = ?, umdmg = ?, allcode = ? "
// prepareStatement 뒤의 괄호안에 있는 쿼리문을 위와같이 변경. ("" 안에 넣어야함.)
pstm.execute(); // 검색 후 윗줄에 아래구문 추가
pstm.setInt(10, item.getUlevel());
pstm.setInt(11, item.getUhp());
pstm.setInt(12, item.getUmp());
pstm.setInt(13, item.getUhpr());
pstm.setInt(14, item.getUmpr());
pstm.setInt(15, item.getUmd());
pstm.setInt(16, item.getUmxd());
pstm.setInt(17, item.getUdmg());
pstm.setInt(18, item.getUhit());
pstm.setInt(19, item.getUmdef());
pstm.setInt(20, item.getUfdef());
pstm.setInt(21, item.getUedef());
pstm.setInt(22, item.getUwadef());
pstm.setInt(23, item.getUwdef());
pstm.setInt(24, item.getUh());
pstm.setInt(25, item.getUmdmg());
pstm.setInt(26, item.getAllcode());
L1PcInventory.java
// DB의 character_items를 갱신 // 검색 후 아래와 같이 변경
public static final int COL_DELAY_EFFECT = 4194304;
public static final int COL_COUNT = 2097152;
public static final int COL_EQUIPPED = 1048576;
public static final int COL_ENCHANTLVL = 524288;
public static final int COL_IS_ID = 262144;
public static final int COL_DURABILITY = 131072;
public static final int COL_allcode = 65536;
public static final int COL_umdmg = 32768;
public static final int COL_uh = 16384;
public static final int COL_uwdef = 8192;
public static final int COL_uwadef = 4096;
public static final int COL_uedef = 2048;
public static final int COL_ufdef = 1024;
public static final int COL_umdef = 512;
public static final int COL_uhit = 256;
public static final int COL_udmg = 128;
public static final int COL_umxd = 64;
public static final int COL_umd = 32;
public static final int COL_umpr = 16;
public static final int COL_uhpr = 8;
public static final int COL_ump = 4;
public static final int COL_uhp = 2;
public static final int COL_ulvl = 1;
if (column >= COL_DURABILITY) // 내구성 // 검색 후 if 문이 끝나면 아래 추가
if (column >= COL_ULVL)
{
storage.updateItemUlevel(item);
column -= COL_ULVL;
}
if (column >= COL_UHP)
{
storage.updateItemUhp(item);
column -= COL_UHP;
}
if (column >= COL_UMP)
{
storage.updateItemUmp(item);
column -= COL_UMP;
}
if (column >= COL_UHPR)
{
storage.updateItemUhpr(item);
column -= COL_UHPR;
}
if (column >= COL_UMPR)
{
storage.updateItemUmpr(item);
column -= COL_UMPR;
}
if (column >= COL_UMD)
{
storage.updateItemUmd(item);
column -= COL_UMD;
}
if (column >= COL_UMXD)
{
storage.updateItemUmxd(item);
column -= COL_UMXD;
}
if (column >= COL_UDMG)
{
storage.updateItemUdmg(item);
column -= COL_UDMG;
}
if (column >= COL_UHIT)
{
storage.updateItemUhit(item);
column -= COL_UHIT;
}
if (column >= COL_UMDEF)
{
storage.updateItemUmdef(item);
column -= COL_UMDEF;
}
if (column >= COL_UFDEF)
{
storage.updateItemUfdef(item);
column -= COL_UFDEF;
}
if (column >= COL_UEDEF)
{
storage.updateItemUedef(item);
column -= COL_UEDEF;
}
if (column >= COL_UWADEF)
{
storage.updateItemUwadef(item);
column -= COL_UWADEF;
}
if (column >= COL_UWDEF)
{
storage.updateItemUwdef(item);
column -= COL_UWDEF;
}
if (column >= COL_UH)
{
storage.updateItemUh(item);
column -= COL_UH;
}
if (column >= COL_UMDMG)
{
storage.updateItemUmdmg(item);
column -= COL_UMDMG;
}
if (column >= COL_ALLCODE)
{
storage.updateItemAllcode(item);
column -= COL_ALLCODE;
}
CharacterItemStorage.java
public static CharactersItemStorage create() { // 검색후 윗줄에 아래 추가
public abstract void updateItemUlevel(L1ItemInstance item)
throws Exception;
public abstract void updateItemUhp(L1ItemInstance item)
throws Exception;
public abstract void updateItemUmp(L1ItemInstance item)
throws Exception;
public abstract void updateItemUhpr(L1ItemInstance item)
throws Exception;
public abstract void updateItemUmpr(L1ItemInstance item)
throws Exception;
public abstract void updateItemUmd(L1ItemInstance item)
throws Exception;
public abstract void updateItemUmxd(L1ItemInstance item)
throws Exception;
public abstract void updateItemUdmg(L1ItemInstance item)
throws Exception;
public abstract void updateItemUhit(L1ItemInstance item)
throws Exception;
public abstract void updateItemUmdef(L1ItemInstance item)
throws Exception;
public abstract void updateItemUfdef(L1ItemInstance item)
throws Exception;
public abstract void updateItemUedef(L1ItemInstance item)
throws Exception;
public abstract void updateItemUwadef(L1ItemInstance item)
throws Exception;
public abstract void updateItemUwdef(L1ItemInstance item)
throws Exception;
public abstract void updateItemUh(L1ItemInstance item)
throws Exception;
public abstract void updateItemUmdmg(L1ItemInstance item)
throws Exception;
public abstract void updateItemAllcode(L1ItemInstance item)
throws Exception;
L1DwarfInventory.java
_items.add(item); // 검색 후 윗줄에 아래 구문 추가
item.setUlevel(rs.getInt("ulvl"));
item.setUhp(rs.getInt("uhp"));
item.setUmp(rs.getInt("ump"));
item.setUhpr(rs.getInt("uhpr"));
item.setUmpr(rs.getInt("umpr"));
item.setUmd(rs.getInt("umd"));
item.setUmxd(rs.getInt("umxd"));
item.setUdmg(rs.getInt("udmg"));
item.setUhit(rs.getInt("uhit"));
item.setUmdef(rs.getInt("umdef"));
item.setUfdef(rs.getInt("ufdef"));
item.setUedef(rs.getInt("uedef"));
item.setUwadef(rs.getInt("uwadef"));
item.setUwdef(rs.getInt("uwdef"));
item.setUh(rs.getInt("uh"));
item.setUmdmg(rs.getInt("umdmg"));
item.setAllcode(rs.getInt("allcode"));
INSERT INTO clan_warehouse SET id = ?, clan_name = ?, item_id = ?, item_name = ?, count = ?, is_equipped=0, enchantlvl = ?, is_id= ?, durability = ?, last_used = ?, ulvl = ?, uhp = ?, ump = ?" +
", uhpr = ?, umpr = ?, umd = ?, umxd = ?, udmg = ?" +
", uhit = ?, umdef = ?, ufdef = ?, uedef = ?, uwadef = ?, uwdef = ?" +
", uh = ?, umdmg = ?, allcode = ? "
// prepareStatement 뒤의 괄호안에 있는 쿼리문을 위와같이 변경. ("" 안에 넣어야함.)
pstm.execute(); // 검색 후 윗줄에 아래구문 추가
pstm.setInt(10, item.getUlevel());
pstm.setInt(11, item.getUhp());
pstm.setInt(12, item.getUmp());
pstm.setInt(13, item.getUhpr());
pstm.setInt(14, item.getUmpr());
pstm.setInt(15, item.getUmd());
pstm.setInt(16, item.getUmxd());
pstm.setInt(17, item.getUdmg());
pstm.setInt(18, item.getUhit());
pstm.setInt(19, item.getUmdef());
pstm.setInt(20, item.getUfdef());
pstm.setInt(21, item.getUedef());
pstm.setInt(22, item.getUwadef());
pstm.setInt(23, item.getUwdef());
pstm.setInt(24, item.getUh());
pstm.setInt(25, item.getUmdmg());
pstm.setInt(26, item.getAllcode());
Config.java
/** Rate control */ // 검색
public static double RATE_SHOP_PURCHASING_PRICE; // 검색
public static double SCODE;
public static double GMCODE; // 아랫줄에 추가
RATE_SHOP_PURCHASING_PRICE = Double.parseDouble(rateSettings
.getProperty("RateShopPurchasingPrice", "1.0")); // 검색
SCODE = Double.parseDouble(rateSettings
.getProperty("scode", "2"));
GMCODE = Double.parseDouble(rateSettings
.getProperty("gmcode", "200")); // 추가
} else if (pName.equalsIgnoreCase("Weightrate")) {
RATE_WEIGHT_LIMIT = Byte.parseByte(pValue); // 검색
} else if (pName.equalsIgnoreCase("Scode")) {
SCODE = Integer.parseInt(pValue);
} else if (pName.equalsIgnoreCase("Gmcode")) {
GMCODE = Integer.parseInt(pValue);
} // 추가
서버 config 폴더 내의 rates.properties 파일에 다음과 같은 내용 추가
# 치팅 방지용 시크릿 코드 (무작위 숫자 기입)
Scode = 2
# 치팅 방지용 운영자 코드 (기입한 코드가 운영자 코드가 됨)
Gmcode = 300
아래는 DB 수정 내용입니다.
character_items에 필드 추가 : 필드명 (default : 0) - int(11)
character_warehouse에 필드 추가 : 필드명 (default : 0) - int(11)
clan_warehouse에 필드 추가 : 필드명 (default : 0) - int(11)
리퀘스트아이템유즈.자바
} else if (itemId == 40126 || itemId == 40098) { // 확인 스크롤 <==검색
내용 모두 아래와 같이 변경
} else if (itemId == 40126 || itemId == 40098) { // 확인 스크롤
pc.getInventory()
.removeItemOnlyInventory(l1iteminstance, 1);
String item_bless = "";
if (l1iteminstance1.getItem().getBless() == 0) {
item_bless = "$227 ";
} else if (l1iteminstance1.getItem().getBless() == 2) {
item_bless = "$228 ";
}
if (!l1iteminstance1.isIdentified()) {
l1iteminstance1.setIdentified(true);
pc.getInventory().updateItem(l1iteminstance1, 2);
// pc.sendPackets(new S_DeleteInventoryItem(pc, //########## (넬) A10 인벤토리 아이템 바로 갱신 관련 원본 소스 주석 처리 ##########
// l1iteminstance1)); //#####
// pc.sendPackets(new S_InvList(pc, l1iteminstance1)); //#####
pc.sendPackets(new S_SendInvStatusUpdate(pc,
l1iteminstance1));
Random random = new Random();
int chance = random.nextInt(100) + 1;
int c1 = random.nextInt(25) + 5; //hp
int c2 = random.nextInt(25) + 5; //mp
int c3 = random.nextInt(5) + 1; //hpr
int c4 = random.nextInt(5) + 1; //mpr
int c5 = random.nextInt(5) + 1; //md
int c6 = random.nextInt(5) + 1; //mxd
int c7 = random.nextInt(5) + 1; // dmg
int c8 = random.nextInt(5) + 1; //hit
int c9 = random.nextInt(10) + 1; //mdef
int c10 = random.nextInt(30) + 1; //fdef
int c11 = random.nextInt(30) + 1; //edef
int c12 = random.nextInt(30) + 1; //wadef
int c13 = random.nextInt(30) + 1; //wdef
if (chance < 20){
for (int j = 0; j < random.nextInt(5) + 1; j++)
switch (chance) {
case 1: // hp
int z1 = random.nextInt(10) + 1;
if (z1 < 5) {
c1 = c1 - (c1 * 2);
}
int newuhp = l1iteminstance1.getUhp() + c1;
l1iteminstance1.setUhp(newuhp);
client.getActiveChar().getInventory().updateItem(l1iteminstance1,L1PcInventory.COL_UHP);
case 2: //mp
int z2 = random.nextInt(10) + 1;
if (z2 < 5) {
c2 = c2 - (c2 * 2);
}
int newump = l1iteminstance1.getUmp() + c2;
l1iteminstance1.setUmp(newump);
client.getActiveChar().getInventory().updateItem(l1iteminstance1,L1PcInventory.COL_UMP);
case 3: //hpr
int z3 = random.nextInt(10) + 1;
if (z3 < 5) {
c3 = c3 - (c3 * 2);
}
출처 : 린프리

찰떡01 님의 최근 댓글
ㄳ 2023 06.17 ㄱㅅ 2020 12.19 클라 공유 부탁드립니다. 2020 12.19 ㄱㅅ 2020 11.26 ㄱㅅ 2020 11.05