게임강의
기타게임 분류

기타게임 스크립트 정리및 해석

컨텐츠 정보

본문

[출처: Gamezone]
작성자: 작성자 없음

 


일단 이전의 스크립트를 컴파일 하셨다면


npc와 아이템을 몇가지 추가하여야 하는데


 


 


해당 구문은 본 게시글에 첨부 했습니다.


 


 


쿼리문이야 내용보면 아실 분들이 많을테니 필요한 경우에만 설명하고자 합니다.


 


 


자세한 설명에 앞서 한말씀 드리자면


타인이 제작 및 수정한 스크립트의 내용을 이해하지 못하면


결국 내 것으로 만들지 못합니다.


무수한 실패를 경험하시고 각자의 방법들을 찾으시길 바랍니다.


(제가 원래 잡소리를 많이하니 대충 이해하시기를 바랍니다.)


 


 


====================================================================


설명은 위쪽부터 보이는 대로 대충 합니다.  '';;


====================================================================


 


 


스크립트는 크게 5부분으로 나뉘며


warp npc, buff npc, heal npc, morph npc, item buff


입니다.


 


  미리 설명 드리자면


"//내용" 이나 "/* 내용 */" 의 경우는 주석(나중에 찾기 쉽게 포스트잇 붙인다 생각하세요)을 의미하며


//의 경우에는 그 줄에서 //라고 되어 있는 뒷부분을 무조건 주석처리 한다는 의미이며


/*  */의 경우는 /*에서 */ 사이의 내용만 주석으로 인정한다는 의미입니다.


 


 


 


 


1. 연합 구분


 


        if (Plr->GetTeam() > 0) {


            Menu->AddItem(3, "호드 중요지역 및 비행 조련사", 1);


        }else{


            Menu->AddItem(3, "얼라 중요지역 및 비행 조련사", 2);


        }


 


위의 내용으로 얼라는 team 이 0이고 호드는 그 이상이라는 것을 알 수 있습니다.


위의 스크립트는 게임상에서 호드는 호드메뉴만, 얼라는 얼라메뉴만 보여주는 구문입니다.


각각의 함수는 ascent 소스 안에 있는 내용을 끌어다 쓰고 있다고 대충 들었습니다.


 


 


 


 


 


2. additem


 


additem은 npc나 아이템을 클릭했을때 목록을 구성하는 개체를 생성합니다


구조는 (3, "호드 중요지역 및 비행 조련사", 1)


맨 앞의 3은 아이콘 번호(예전에 올린 적이 있습니다. 참조하시길)


http://mangos.servebbs.net:8180/bbs/board.php?bo_table=bbs_9&wr_id=25&page=4


"호드 중요지역 및 비행 조련사"는 목록에 보여지는 멘트


맨뒤의 1은 case 번호를 의미합니다.


case 번호는 스크립트를 쭉 훑어보시면 알겁니다.


 


 


 


 


 


3. npc의 대사


①의 설명중 if (Plr->GetTeam() > 0) {의 윗부분을 보시면


objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 80000, Plr);


라는 내용이 있습니다. 다른건 다 모르겠고


뒤쪽의 80000부분은 world디비의 npc_text테이블과 연계하여


해당 목록에서의 npc메뉴에 출력되는 대사(상단부)를 표시합니다.


내용에 대해서는 해당 테이블을 보시거나


첨부된 sql 파일을 참고하시기를 바랍니다.


 


 


 


 


 


4. 무료 텔레포트


 


case 10: {Plr->EventTeleport(530, -1887.51001, 5359.379883, -12.4273);} break;  /* 샤트라스 */


위와같은 내용을 찾으셨기를 바라며


 


위의 내용중 Plr->EventTeleport라는 부분이 플레이어를 해당 위치로 이동시켜 준다는 내용입니다.


Plr->EventTeleport이후의 관호 안의 내용은


(맵번호, x좌표, y좌표, 좌표 입니다.


 


좌표 추출에 대해서는 게임 내부에서 gm계정으로 .gps 타이필 해보시면 아실겁니다.


 


 


 


 


 


 


5. 부활 후유증 제거


    case 14: /* 부휴 제거 */


        {


            objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);


            uint32 price=100000;        /* 10G, 가격 설정하는 부분 */


            uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE); 


            if (currentgold>=price)     // 플레이어이게 돈이 있는지를 구별하는 함수


// 돈이 있을 시에는 가진돈에서 설정된 금액만큼을 차감한 후 부활 후유증을 없애줌과 동시에 멘트를 날리고


                {   


                int32 newgold = currentgold - price;


                Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);


                Plr->addSpell(15007);   // 부활 후유증 알려주기(플레이어의 마법책에 등록)


                Plr->removeSpell(15007,0,0,0);      // 부활 후유증 지우기(플레이어의 마법책에서 삭제)


                pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, ConvertToUTF8("햐~ 오지게 두드려 맞았네~ 마이 아파?") );  // npc에게 대화 형식으로 멘트 날리라는 구문


                Plr->Gossip_Complete(); // npc의 대화창을 닫는 구문


                }else{  


 // 돈이 없을 시에는 멘트만 날림


                pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, ConvertToUTF8("돈을 먼저 벌어 오셔야 하겠는걸요? .$N.") ); // npc에게 대화 형식으로 멘트 날리라는 구문


                Plr->Gossip_Complete(); 


                }


        }break;


몇가지의 함수가 조합된 내용인데 설명된 정도의 내용으로 이해를 하셨기를...


 


 


 


 


 


 


6. 돈받고 텔레포트


case 91: {   /* 줄굽 */     

uint32 price=100000;    /* 10G */   

uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE); 

if (currentgold>=price){    

int32 newgold = currentgold - price;    

Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);   

Plr->EventTeleport(0, -11915.74, -874.156, 31.637);    

pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, ConvertToUTF8("열심히 사냥하세요^^") );    

Plr->Gossip_Complete(); 

}else{  

pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, ConvertToUTF8("돈을 먼저 벌어 오셔야 하겠는걸요? .$N.") ); 

Plr->Gossip_Complete(); 

}     

}break;


위의 내용들과 조합해 보시면 돈을 요구하게 하는 구문이 어떤 부분인지 아실거라 믿고

또한 돈을 요하지 않는 스크립트의 경우에 어떤 구문을 추가하면 돈을 받게 만들 수 있는지

이해하실 수 있으리라 봅니다.


 


 


 


 


 


 


7. 버프 주기


        case 8:     // Strength

            {

        uint32 price=0;// 0G

        uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);

        if (currentgold>=price){

        int32 newgold = currentgold - price; 

        Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
                pCreature->CastSpell(Plr, 8118, 0);

        pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, ConvertToUTF8("열심히 사냥하세요^^") );

Plr->Gossip_Complete();

        }else{

            pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, ConvertToUTF8("돈을 먼저 벌어 오셔야 하겠는걸요? .$N.") );

Plr->Gossip_Complete();

        }

        }

            break;


위의 내용을 보시면 텔레포트와 별반 다를 것이 없다는 것을 알 수 있습니다.


pCreature->CastSpell(Plr, 8118, 0);

이 함수가 크리쳐(npc, 몹 등)가 마법을 시전하는 함수이며

Plr (대소문자 주의{PLR, plr, pLr 등으로 사용시 정상 동작 하지 않음)이 대상 플레이어를 의미합니다.


8118은 스펠 번호이며 맨 뒤의 0은 모릅니다. ;;


 


 


 


 


 


 


 


8. 종족 구분


        if(Plr->getRace() == 6) Menu->AddItem(3, "타우렌 종족특성 (재배) 배우기", 2);


또는


        if(Plr->getRace() == 6) { Menu->AddItem(3, "타우렌 종족특성 (재배) 배우기", 2); }


race는 종족을 의미합니다


위의 스크립트를 풀어보면 race 즉 종족이 6(타우렌) 일 경우에 해당메뉴를 보여준다는 의미입니다.


위와 아래의 구문의 차이는


아래 구문의 경우 {} 즉 중괄호 안에만 해당 함수의 영향을 미치게 하는 것으로


혹시 발생할지 모르는 간섭에 대한 예방 혹은 해결 방법일 겁니다 ;;


여러줄에 함수의 영향을 주기 위해서도 사용합니다.


race=종족 (1.인간 2.오크 3.드웦 4.나엘 5.언데 6.타우렌 7.노움 8.트롤 10.블엘 11.드레)


 


 


 


 


 


 


9. 레벨 구분


if(Plr->getLevel() >= 58) { Menu->AddItem(7, "아웃랜드 파티 인던 I", 7);


또는


if((Plr->getLevel() >= 11)&&(Plr->getLevel() <= 22))


위의 두 구문은 플레이어의 레벨값을 가져오는 내용입니다


if(Plr->getLevel() >= 58)는 플레이어의 레벨이 58 이상일 때에만 이라는 의미이고


if((Plr->getLevel() >= 11)&&(Plr->getLevel() <= 22))는 레벨이 11~22일때에만을 의미합니다.


 


 


 


 


 


 


 


10. 직업구분


if(Plr->getClass() == 1)    Menu->AddItem(2, "뉴퀴엠 버프 메뉴", 13); 

내용을 쉽게 이해하셨으리라고 보며

class 뒤의 1은 직업번호입니다.


class=직업 (1: 전사, 2: 성기사, 3: 냥꾼, 4:도적, 5:사제, 7:주술, 8: 법사, 9:흑마, 11: 드루)


 


 


 


 


 


 


 


11. 외관 변경


case 4: // 눈사람

{

uint32 price = 100000;

uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);

if(currentgold>=price)

{

int32 newgold = currentgold - price;

Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);

pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Hahaha! Never gets old.");

pCreature->Emote(EMOTE_ONESHOT_CHEER);

Plr->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15671);

Plr->Gossip_Complete();

}

else

{

pCreature->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Sorry you don't have enough money, a Hogger's Morph is worth 10 gold.");

Plr->Gossip_Complete();

}

}

break;


눈여겨 볼 부분은 노란색 부분입니다.


pCreature->Emote(EMOTE_ONESHOT_CHEER);는 크리쳐가 취하게 되는


행동에 대한 함수로 EMOTE_ONESHOT_CHEER부분에 원하는 내용을 넣어주면 됩니다.


Emotes.dbc를 참조하시면 됩니다.


 


Plr->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15671);는 플레이어의 외관을 변경해주는 함수로


15671이 DISPLAYID입니다. DISPLAYID에 대해서는


CreatureDisplayInfo.dbc나 creature_names테이블의 `male_displayid`, `female_displayid`등에서 참조하실 수 있습니다.


 


 


 


 


 


 


 


12. 초기 지원


        case 1:    

            {

            if(Plr->getRace() == 1 ){   // 인간

            if(Plr->HasSpell( 23229 )) // 해당스펠이 있는지 확인한다.

                {

                    Plr->BroadcastMessage( ConvertToUTF8("이미 지급 받으셨네요.") );

                    Plr->Gossip_Complete();


                }else{


                    Plr->addSpell( 23229 );

                    uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE); // 50골드 지원

                    uint32 amount = 500000; 

                    int32 newgold = currentgold + amount;

                    Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);

                    Item * pItem1 = objmgr.CreateItem(21876, Plr);  // 마법불꽃 가방 2개 지원

                    Plr->GetItemInterface()->AddItemToFreeSlot(pItem1);

                    Item * pItem2 = objmgr.CreateItem(21876, Plr);

                    Plr->GetItemInterface()->AddItemToFreeSlot(pItem2);

                    for (uint8 i=0; i<8; i++)   // 택시 경로 오픈
                    Plr->SetTaximask(i, 0xFFFFFFFF);

                    Plr->BroadcastMessage( ConvertToUTF8("비행경로와 천골마, 가방과 약간의 돈을 드렸습니다.") );

                    Plr->Gossip_Complete();

                }

}


연합서버의 안내책자를 보고 개인적으로 따라 만들어 봤는데


뭐 워낙에 실력이 안되다 보니 소스가 난잡해 지는 건 어쩔 수가 없더군요


각 부분에 주석이 달려있으니 이해는 쉬우실 겁니다.


 


전체적인 스크립트는 연합서버와 같이 안내책자의 기능중 하나로


각 종족별 탈것의 지급 + 골드지원 + 아이템지원 + 비행경로(와이번, 그리핀 등)을 한번의 클릭으로 제공합니다.


 


 


 


 


 


 


 


13. 특성 초기화


    case 2: // 특성 초기화

        {

            Plr->SendTalentResetConfirm();

            Plr->Gossip_Complete();

        }break;


노란색 부분이 특성 초기화를 위한 구문이며


따로 가격을 정하지 않은 이유는 어차피 특성 초기화는 돈을 내기 때문입니다.


 


 


 


 


 


 


14. 평판 초기화


        case 5: // 평판 초기화

            {

            uint32 price=10000000;// 1000G

            uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);

            if (currentgold>=price){

                int32 newgold = currentgold - price; 

                Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);

                Plr->_InitialReputation();

                Plr->BroadcastMessage( ConvertToUTF8("모든 평판을 초기화해 드렸습니다.") );

                Plr->BroadcastMessage(ConvertToUTF8("버프와 디버프를 모두 지워드렸습니다.") );

                Plr->Gossip_Complete();

            }else{

                Plr->BroadcastMessage(ConvertToUTF8("돈이 부족하신걸요? .$N.님.") );

                Plr->Gossip_Complete();

            }

            }

        break;


 


마찬가지로 노란색 부분이 평판 초기화를 해주는 구문이며


경우에 따라 초기화를 위해 재접속을 해야하는 불편함이 있습니다.


이 스크립트도 연합서버의 안내책자를 보고 따라 만들어 본 것입니다.


 


 


 


 


 


 


 


15. 모든 버프 및 디버프 제거


        case 6:     // remove aura

            {

            uint32 price=1000000;// 100G

            uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);

            if (currentgold>=price){

            int32 newgold = currentgold - price; 

            Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);

            for(uint32 i = 0; i < MAX_AURAS; ++i)

                {

                if(Plr->m_auras[i] != 0) Plr->m_auras[i]->Remove();

                }

            Plr->BroadcastMessage(ConvertToUTF8("버프와 디버프를 모두 지워드렸습니다.") );

            Plr->Gossip_Complete();

            }else{

            Plr->BroadcastMessage( ConvertToUTF8("돈이 부족하신걸요? .$N.님.") );

            Plr->Gossip_Complete();

            }

        }

        break;


만들고 나서도 항상 아쉬운 부분중 한곳인데


디버프만 지우는 방법은 모르겠더군요 ㅋ


역시나 노란색 부분이 주 스크립트입니다.


의미 전혀 모릅니다. 어센트 코어소스 뒤져서 붙인 스크립트중 하나인데


된다는거 확인하고 덮어뒀습니다.


 


 


 


 


 


 


16. 망고스의 maxskill과 같은 기능 구현


    case 7:

{

            uint32 price=500000;// 50G

            uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);

            if (currentgold>=price){

            int32 newgold = currentgold - price; 

            Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);

        if(Plr->_HasSkillLine(95))      Plr->_AdvanceSkillLine( 95, 350 );  // 방어

        if(Plr->_HasSkillLine(162))     Plr->_AdvanceSkillLine( 162, 350 ); // 맨손전투

        if(Plr->_HasSkillLine(228))     Plr->_AdvanceSkillLine( 228, 350 ); // 마법봉

        if(Plr->_HasSkillLine(173))     Plr->_AdvanceSkillLine( 173, 350 ); // 단검

        if(Plr->_HasSkillLine(54))      Plr->_AdvanceSkillLine( 54, 350 );  // 둔기

        if(Plr->_HasSkillLine(136))     Plr->_AdvanceSkillLine( 136, 350 ); // 지팡이

        if(Plr->_HasSkillLine(43))      Plr->_AdvanceSkillLine( 43, 350 );  // 도검

        if(Plr->_HasSkillLine(44))      Plr->_AdvanceSkillLine( 44, 350 );  // 도끼

        if(Plr->_HasSkillLine(45))      Plr->_AdvanceSkillLine( 45, 350 );  // 활

        if(Plr->_HasSkillLine(46))      Plr->_AdvanceSkillLine( 46, 350 );  // 총기

        if(Plr->_HasSkillLine(176))     Plr->_AdvanceSkillLine( 176, 350 ); // 투척무기

        if(Plr->_HasSkillLine(55))      Plr->_AdvanceSkillLine( 55, 350 );  // 양손도검

        if(Plr->_HasSkillLine(160))     Plr->_AdvanceSkillLine( 160, 350 ); // 양손둔기

        if(Plr->_HasSkillLine(172))     Plr->_AdvanceSkillLine( 172, 350 ); // 양손도끼

        if(Plr->_HasSkillLine(229))     Plr->_AdvanceSkillLine( 229, 350 ); // 장창

        if(Plr->_HasSkillLine(226))     Plr->_AdvanceSkillLine( 226, 350 ); // 석궁

        if(Plr->_HasSkillLine(473))     Plr->_AdvanceSkillLine( 473, 350 ); // 장착무기

            Plr->BroadcastMessage(ConvertToUTF8("배우신 모든 무기 및 방어 숙련도를 올려 드렸습니다.") );

            Plr->Gossip_Complete();

            }else{

            Plr->BroadcastMessage( ConvertToUTF8("돈이 부족하신걸요? .$N.님.") );

            Plr->Gossip_Complete();

            }

}

}

            break;


어센트 코어의 아쉬운 부분중 하나죠..


광명님의 켈타스서버에서 increaseweaponskill이라는 명령어를 사용가능하게 해둔걸 보고


힌트를 얻었습니다.


if(Plr->_HasSkillLine(95))는 플레이어가 해당 스킬 95 즉 방어라는 숙련을 가지고 있는지를 확인합니다.


Plr->_AdvanceSkillLine( 95, 350 );는 해당스킬의 숙련도를 350으로 설정하는 함수입니다만은.....


숙련도가 350이 되지 않을 시에는 해당 플레이어의 최대 숙련도까지만 설정합니다.


이유는 AdvanceSkill명령어의 함수를 사용하기 때문입니다.


350이라는 숙련도는 70레벨을 기준으로한 것이므로 80레벨의 경우 400, 90레벨의 경우 450등으로 설정하시면 됩니다.


 


 


 


 


 


 


 


 


대략 각 함수에 대한 설명은 한 듯 합니다.


additem한글화에 대한 부분이 적용 되었을 시에 대한 스크립트이며


이에 대한 내용은 red처, 쥑saw, 쥑sawr, redshow 등의 아이디를 사용하시는 처리님의 글을 통해


확인 하실 수 있을 거라 생각합니다.


물론 통팩은 이미 몰리님께서 친히 코어에 작업하신 듯 하던데 소스를 모르니 패스합니다.


여튼 통팩은 additem한글화 안해도 되더라는 얘깁니다.


 


컴파일시에 lua폴더가 없으니 내놓으삼~ 요러면서 에러가 뜰 수 있습니다.


정상적으로 수순을 밟으셨다면


[어센트소스\src\scripts\src\LUAscripting]폴더 안에 lua라는 폴더가 있는걸 확인하실 수 있으실 겁니다.


없으면 moon++소스 폴더 뒤지면 나옵니다.


암튼 그걸 복사해서(필히 복사하셔야 합니다. 잘라내기하면 ㅈ됩니다.)


[어센트소스\src\game]폴더안에 넣어주신 후 컴파일 하면


vs가 알아서 닥(치고)컴파일 합니다.


 


각각의 스크립트는 예전에 광명님이 올려주신 버프npc관련 소스를 참조하시면


여러개의 소스로 나누어서 필요한 부분만 발췌하여 사용하실 수 있습니다.


 


 


 


 


스크립트의 구조는 대충


주 스크립트.cpp파일에서는


================================================================


class scRIPT_DECL WarpNPC : public Gossipscript


 - 내가 WarpNPC라는 스크립트를 사용할거다.


void WarpNPC::GossipHello(Object * pObject, Player* Plr, bool AutoSend)


  - 근데 그 스크립트의 처음에 요런 내용을 넣을거다.


void WarpNPC::GossipSelectOption(Object * pObject, Player* Plr, uint32 Id, uint32 IntId, const char * Code)


  - 그 안에 요러요러한 내용을 사용하기도 한다.


void SetupJCustom(scriptMgr * mgr)


  - 근데 setup.cpp나 setup.h에서 알아볼 수 있게  JCustom이라고 묶어놓자.


        Gossipscript * warp = (Gossipscript*) new WarpNPC();


         - WarpNPC라는 놈을 gossipscript형식의 warp라는 놈으로 부를 것이며


              mgr->register_gossip_script(400000, warp);  // 이동술사


               - 400000번의 npc한테 warp라고 부르기로 한 놈을 등록하거나


              mgr->register_item_gossip_script(80000, item);  // 그냥 히밤이


               - 80000번을 가진 아이템에 item이라고 부르기로 한 놈을 등록해줘라.


=====================================================================


 


 


Setup.cpp에서는


=====================================================================


extern "C" scRIPT_DECL void _exp_script_register(scriptMgr* mgr)

{

    SetupJCustom(mgr);

}


아까 JCustom이라는 놈을 불러와서 처리해라.


=====================================================================


 


 


Setup.h에서는


=====================================================================


void SetupJCustom(scriptMgr * mgr);


너도 같이 해라.


=====================================================================


 


 


 


요정도로 이해 하시면 됩니다.


저도 요정도로 이해했으므로 이부분에 대해서는 따로 뭔가 바라지 맙시다.;;


 


잘 이해 안가는 부분, 따로 설명이 필요 할 것 같은 부분은 리플로 달아 주세요.


제가 아니어도 스크립트 잘아시는 분들 많으니 그분들이 답변해주실 겁니다.


 


궂이 질문게시판에 질문하셔서 뒷분들 검색하게 만드는 것보다는 편하지 않을까 싶네요..


 


이상 ㅈ나게 허접한 스크립트 강의 였습니다. 


 


※ 스크립트를 만든지 오래되어 동작하지 않는 부분이 있을지도 모릅니다.


 


-출처 : 자바존

관련자료

댓글 0
등록된 댓글이 없습니다.
기타게임 122 / 6 페이지
번호
제목
이름

강의실

🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 82,042
2 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,280
3 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 32,591
4 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 23,416
6 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 22,310
7 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 13,822
8 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 13,500
9 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 13,246
10 no_profile 하늘2쪽지보내기 자기소개 아이디로 검색 전체게시물 13,239
알림 0