/giant beatle00.gif) °Ô½ÃÆÇ °ü¸®ÀÚ

°¡ÀÔÀÏ: 2003³â 12¿ù 28ÀÏ °Ô½Ã¹°: 12
|
1. ¹«¾ùÀ» ¸¸µé°ÍÀΰ¡?
Àοë±Û : |
Äɸ¯ÅÍÀÇ ½ºÅÈ¿¡ Àα⵵¸¦ Ãß°¡½Ã۰í [ÃßõÀ» ¹ÞÀ¸¸é Àα⵵°¡ ¿Ã¶ó°¡°í [ºñÃßõÀ» ¹ÞÀ¸¸é Àα⵵°¡ ³»·Á°¡°Ô¿ä. ÇÏ·ç¿¡ Çѹø [Ãßõ [ºñÃßõ ¸í·ÉÀ» ¾µ ¼ö ÀÖ°Ô ÇØÁÖ¼¼¿ä. |
Áï, ÀÏÁ¾ÀÇ °Ô½Ã¹°¿¡¼ÀÇ Ãßõ ºñÃßõÀÇ °³³äÀ» µµÀÔÇϽ÷Á ÇÏ´Â°Í °°½À´Ï´Ù.
»ç¿ëÀÚ¿¡°Ô ³ª¸§´ë·ÎÀÇ Æ÷ÀÎÆ®¸¦ ºÎ¿©ÇÏ¿© ±×°ÍÀ» ÀÌ¿ëÇÏ¿© ¾î¶² °ÍÀ»
ÇϽ÷Á´Â°Í. ¸Â½À´Ï±î? ¹¹ »ç¿ëó´Â ¾î¶µç ÁÁ½À´Ï´Ù. ±×·³ ¾î¶»°Ô ±¸ÇöÇØ¾ß ÇÒ±î¿ä?
2. ±¸ÇöÇØ¾ß ÇÏ´Â ±â´ÉÀº ¹«¾ùÀΰ¡?
¿ì¼± Å©°Ô 2°¡Áö °üÁ¡¿¡¼ »ý°¢À» ÇØº¾½Ã´Ù.
ù°, »ç¿ëÀÚ°¡ ¸í·É¾î¸¦ÀÌ¿ëÇÏ¿© ´Ù¸¥ »ç¿ëÀÚ¿¡°Ô Æ÷ÀÎÆ®¸¦ ºÎ¿©ÇÑ´Ù´ÂÁ¡.
µÑ°, »ç¿ëÀÚ´Â ÇÏ·ç¿¡ Çѹø¸í·É¾î¸¦ ÀÌ¿ëÇÒ¼ö Àִٴ°Í.
±âº»ÀûÀ¸·Î´Â ÀÌ·¯ÇÑ ±â´ÉÀÌ ÇÙ½ÉÀûÀ¸·Î ÇÊ¿äÇÏ°Ô µË´Ï´Ù. ºÎ¼öÀûÀ¸·Î ´Ù¸¥ ¿©·¯ ±â´Éµé(Æ÷ÀÎÆ®¸¦ º¸¿©ÁشٴøÁö, Æ÷ÀÎÆ®¿¡ ÀÇÇØ ¾î¶² ÇൿÀ» ÇÑ´Ù´øÁö) ÇÏ´Â ºÎºÐ¿¡ À־ »ý·«Çϱâ·Î Çϰí, °á·ÐÀûÀ¸·Î´Â Àú µÎ°¡Áö ±â´É¿¡ ÀÇÇØ¼ °ÀǸ¦ ¿äûÇϽŠºÐ²²¼ ¿øÇϽô ±â´ÉÀÌ ÀÌ·ç¾îÁø´Ù ÇϰڽÀ´Ï´Ù.
3. ¾î¶»°Ô ±¸ÇöÇÒ °ÍÀΰ¡?
Step #1 º¯¼ö ¸¸µé±â
¿ì¼± ¿ì¸®°¡ ´Ù·ç¾î¾ßÇÒ ÆÄÀÏÀ» »ìÆì º¾½Ã´Ù.
¿ì¸®°¡ ´Ù·ç¾î¾ßÇÒ ÆÄÀÏÀº, PlayerMobile.cs¶ó´Â ÆÄÀÏÀÔ´Ï´Ù.
Ç÷¹À̾îÀÇ ±¸¼º°ú ¿î¿ë¿¡ ´ëÇÑ Äڵ带 ´ã°í ÀÖÀ¸¸ç, »ó´çÈ÷ ±âÀÎ~
ÄÚµåÀΰÍÀ» º¸½Ç¼ö ÀÖ½À´Ï´Ù. ¿ì¸®´Â ¿©±â¿¡ ¿ì¸®°¡ ¿øÇÏ´Â ±â´ÉÀ» Ãß°¡ÇÏ¿©
»õ·Î¿î ±â´ÉÀ» ±¸ÇöÇØ³¾¼ö ÀÖ½À´Ï´Ù.
PlayerMobile.cs(ÀÌÇÏ ¸ð¹ÙÀÏ ÄÚµå)´Â ±âº»ÀûÀ¸·Î Mobile Ŭ·¡½º¿¡¼ »ó¼ÓÀ» ¹ÞÀº ¼ºê Ŭ·¡½º·Î, »ç¿ëÀÚÀÇ ¸ö¿¡ ´ëÇÑ ºÎºÐ¸¸À» ƯÈÀûÀ¸·Î ´Ù·ç°í ÀÖ½À´Ï´Ù. ¿©±â¿¡¼´Â »ç¿ëÀÚ¿¡ °üÇÏ¿© °¢Á¾ µ¥ÀÌÅ͸¦ ó¸®Çϰí ÀÖ´Â ºÎºÐÀ¸·Î½á ¿ì¸®°¡ ¿øÇÏ´Â ±â´ÉÀÎ 'Æ÷ÀÎÆ®'¸¦ °ü¸®Çϱâ À§Çؼ± º°µµÀÇ º¯¼ö°¡ ÇÊ¿äÇѹÙ, ÀÌ Äڵ忡¼ ÀÛ¾÷À» ÇÏ°Ô µÇ°Ú½À´Ï´Ù.
ÄÚµå : |
in PlayerMobile.cs class PalyerMobile()
[CommandProperty( AccessLevel.GameMaster )]
public bool PublicMyRunUO
{
get{ return GetFlag( PlayerFlag.PublicMyRunUO ); }
set{ SetFla(PlayerFlag.PublicMyRunUO,value );InvalidateMyRunUO(); }
}
|
À§ Äڵ带 ¿ì¼± »ìÆì º¸°Ú½À´Ï´Ù. ±âº»ÀûÀ¸·Î MyRunUO¸¦ ÅëÇØ¼
Äɸ¯ÅÍ ÀڷḦ Á¢±ÙÇÒ¼ö ÀÖ°Ô ÇÏ´ÂÁöÀÇ ¿©ºÎ¸¦ ¼±ÅÃÇÏ´Â Ç÷¡±× ÀÔ´Ï´Ù.
¿ì¼± ´ë°ýÈ£([])·Î ¹¿©ÀÖ´Â ºÎºÐÀº. Attribute¶ó°í Çϴ°ÍÀ¸·Î½á,
ÀÚ¼¼ÇÑ ¾ð¾îÀûÀÎ ¼³¸íÀº »ý·«ÇϰڽÀ´Ï´Ù.
´Ù¸¸ ¿©±â¿¡¼´Â, °ÔÀÓ³»¿¡¼ °ª¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ±ÇÇÑ, Áï [props ¸í·É¾î µîÀ» ÅëÇÏ¿© °ªÀ» º¯°æÇÒ¼ö ÀÖ´Â ±ÇÇÑÀÇ ÃÖ¼Ò°ªÀ» ÁöÁ¤Çϴ°ÍÀ̶ó°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù. À§ÀÇ °ªÀº °ÔÀÓ¸¶½ºÅÍ ÀÌ»ó¸¸ÀÌ Á¢±ÙÇÒ¼ö ÀÖµµ·Ï µÇ¾î Àִ°ÍÀ» º¼¼ö ÀÖ½À´Ï´Ù. ¿ì¸®°¡ ±¸ÇöÇÏ·Á´Â ±â´É ¿ª½Ã Ư¼º»ó °ÔÀÓ¸¶½ºÅÍ ÀÌ»ó¸¸ÀÌ °ªÀ» º¯°æÇÒ¼ö ÀÖµµ·Ï ÇØ¾ßÇϱ⿡ µ¿ÀÏÇÏ°Ô Ã³¸®ÇϰڽÀ´Ï´Ù.
public bool PublicMyRunUOÀÌ ºÎºÐÀÌ °ÔÀÓ»ó¿¡¼µç ÄÚµå»ó¿¡¼µç °ªÀ» ÀÌ¿ëÇÒ¼ö ÀÖ´Â º¯¼ö¸íÀ» ÁöÁ¤Çϰí ÀÖ´Â ¼±¾ðºÎ ÀÔ´Ï´Ù. boolÇüÅÂ(Âü/°ÅÁþ)À¸·Î ÁöÁ¤µÇ Àִ°ÍÀ» ¾Ë¼ö ÀÖÀ¸¸ç ±ÇÇÑÀº publicÁï, ¿ÜºÎ Äڵ忡¼µµ (playermobile ¿Ü¿¡¼µµ)Á¢±ÙÇÒ¼ö ÀÖµµ·Ï µÇ¾îÀÖÀ¸¸ç À̸§Àº PublicMyRunUO¶ó°í µÇ¾îÀÖ½À´Ï´Ù. ¾ð¾îÀûÀÎ ¸éÀ̱⿡ ±×¸® Å« ¾î·Á¿òÀº ¾øÀ¸½Ç°ÍÀÔ´Ï´Ù.
ÀÌ ±¸ºÐ¿¡¼´Â º¯¼ö°¡ get-set ÇüÅ·ΠÁöÁ¤µÇ¾î ÀÖ½À´Ï´Ù. ¾î·Á¿î °ÍÀÌ ¾Æ´Ï¶ó, ¹®ÀÚ ±×´ë·Î get Àº º¯¼ö¿¡¼ °ªÀ» ¾òÀ» ¶§ ÃëÇÒ ÇൿµéÀÌ µÇ´Â°ÍÀ̸ç, set´Â º¯¼ö¿¡ °ªÀ» ¼³Á¤ÇÒ¶§ ÃëÇÏ´Â ÇൿµéÀÌ µË´Ï´Ù. À§ Äڵ忡¼´Â Ç÷¹±× ¿©ºÎ¸¦ ¸®ÅÏÇϰųª ÁöÁ¤Çϵµ·Ï Çß½À´Ï´Ù. ¿ì¸®´Â ´Ü¼øÈ÷ º¯¼ö¸¦ Çϳª ¼±¾ðÇÏ¿© ±× º¯¼ö¸¦ ÀÌ¿ëÇϵµ·Ï ÇÒ°ÍÀÔ´Ï´Ù.
±×¸®ÇÏ¿©, ¾Æ·¡¿Í °°Àº Äڵ尡 ±¸¼ºµÈ´Ù°í ÇÒ¼ö ÀÖ½À´Ï´Ù.
(ÀÚ¼¼ÇÑ ¼³¸íÀº ÁÖ¼® Âü°í)
ÄÚµå : |
private int m_VotebyPl; //³»ºÎ¿¡¼ ÀÌ¿ëµÉ º¯¼ö¸íÀÔ´Ï´Ù.
[CommandProperty( AccessLevel.GameMaster )]
public int VoteByPlayer
{
get
{
return m_VotebyPl; //³»ºÎ º¯¼ö¸¦ ¸®ÅÏÇÕ´Ï´Ù.
}
set
{
m_VotebyPl = value; //¿ÜºÎ¿¡¼ ¼³Á¤ÇÑ °ªÀ» ÁöÁ¤ÇÕ´Ï´Ù
}
}
private DateTime m_NextVotebyPl; //ÇÏ·ç¿¡ Çѹø ÅõÇ¥Çϱâ À§ÇÑ º¯¼ö
[CommandProperty( AccessLevel.GameMaster )]
public DateTime NextVoteByPlayer
{
get
{
return m_NextVotebyPl;
}
set
{
m_NextVotebyPl = value;
}
}
|
ÇÏ·ç¿¡ Çѹø ÅõÇ¥¸¦ ÇÏ°Ô ÇØ¾ßÇϱâ 떄¹®¿¡ ¿À´Ã Çѹø ÅõÇ¥ Çß´Ù! ¶ó´Â »ç½ÇÀ»
±â·ÏÇØµÑ Çʿ䰡 ÀÖ½À´Ï´Ù. ¿©±â¼´Â »ç¿ëÀÚ°¡ ÅõÇ¥ÇÑÈķκÎÅÍ 24½Ã°£ ÈÄ¿¡ ´Ù½Ã ÅõÇ¥°¡ °¡´ÉÇϵµ·Ï ó¸®Çغ¸°Ú½À´Ï´Ù.
Step #2 º¯¼ö ÀúÀåÇϱâ(Serialize / DeSerialize)
º¯¼ö¸¦ ¸¸µé¾ú´Ù¸é, ±× º¯¼ö¸¦ °è¼Ó ÀÌ¿ëÇϱâ À§Çؼ± µ¥ÀÌÅÍ ÆÄÀÏ¿¡ ÀúÀåÀ»
ÇØ¾ßÇÕ´Ï´Ù. ¸¸¾à ¼¹ö¸¦ ´Ù½Ã ų¶§¸¶´Ù µ¥ÀÌÅͰ¡ »ç¶óÁø´Ù¸é, ÀÌ´Â ¹«ÀǹÌÇѰÍÀ̰ÚÁÒ. ±×·¯Çϱâ À§Çؼ µ¥ÀÌÅ͸¦ ÀúÀåÇØ¾ßÇϴµ¥, ¿©±â¼ ÀúÀåÀ» À§ÇÑ Serialize¿Í ºÒ·¯¿À±â¸¦ À§ÇÑ DeSerialize¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸°Ú½À´Ï´Ù.
Serialize
PlayerMobile.cs ÆÄÀÏÀ» º¸½Ã¸é ¾Æ·¡¿Í °°Àº ºÎºÐÀÌ ÀÖÀ»²¯ÀÔ´Ï´Ù.
ÄÚµå : | public override void Serialize( GenericWriter writer ) |
¹Ù·Î À§ÀÇ ºÎºÐÀÌ ÀúÀåÀ» ´ã´çÇÏ´Â ºÎºÐ! ¿©·¯ºÎºÐÀÌ ÀÖ½À´Ï´Ù¸¸, ¿ì¸®°¡ ÁÖ¸ñÇØ¾ßÇÒ ºÎºÐÀº ¾Æ·¡ ºÎºÐºÎÅÍÀÔ´Ï´Ù.
ÄÚµå : |
base.Serialize( writer );
writer.Write( (int) 18 ); // version
writer.WriteEncodedInt( (int) m_SolenFriendship );
|
¾Æ ¸ÕÀú Âü°í·Î, ÀúÀå°ú ºÒ·¯¿À±âÀÇ ¼ø¼´Â Á¤È®È÷ ÀÏÄ¡ÇØ¾ßÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦µé¾î, A->B->CÀÇ ¼øÀ¸·Î ÀúÀåÀ» Çß´Ù¸é ºÒ·¯¿Ã떄 ¿ª½Ã A->B->C¿©¾ß ÇÑ´Ù´ÂÁ¡ÀÔ´Ï´Ù. µû¶ó¼ ³ªÁß¿¡ Ãß°¡µÈ ³»¿ëÀϼö·Ï °¡Àå ¸ÕÀú ÀúÀåÇÏ°í °¡Àå ¸ÕÀú ºÒ·¯¿Â´Ù°í º¼¼öÀÖÀ¸¸ç, À§¿¡¼ m_SolenFriendshipÀ̶ó´Â ºÎºÐÀÌ ¹öÀü 18¿¡ Ãß°¡µÈ °¡Àå ¸¶Áö¸· ³»¿ëÀÓÀ» ÃßÃøÇØ º¼¼ö ÀÖ½À´Ï´Ù.
¹öÀüÀÌ ÇÊ¿äÇÑ ÀÌÀ¯´ÂÁö±Ý ¿ì¸®°¡ ½ÃµµÇÏ´Â ÀÛ¾÷°ú °°ÀÌ »õ·Î¿î ³»¿ëÀÌ Ãß°¡µÇ¾úÀ»¶§, °ú°ÅÀÇ ³»¿ë°ú ºñ±³ÇÏ¿© »õ·Î¿î ³»¿ëÀ» Àû¿ëÇϱâ À§Çؼ ÀÔ´Ï´Ù.
¸¸¾à ¹öÀüÀÌ ¾ø´Ù¸é, ¾Æ±î ºÐ¸í ÀúÀåÇϴ°Ͱú ºÒ·¯¿À´Â ¼øÀÌ ¶È°°¾Æ¾ß µÈ´Ù°í Çߴµ¥ À̰Ϳ¡ Âø¿À°¡ ¿Ã¼ö ÀÖ½À´Ï´Ù. Áï A->B->C¼øÀ¸·Î ÀúÀåÀ» Çߴµ¥, D¶ó´Â ³»¿ëÀÌ Ãß°¡µÇ¾î D->A->B->C ¼øÀ¸·Î ºÒ·¯¿À°Ô µÇ´Â »çŸ¦ ¸·±â À§ÇÔÀ̶ó°í »ý°¢ÇÏ½Ã¸é µÇ°Ú½À´Ï´Ù.
±×·³ ¿ì¸®´Â, ¹öÀüÀ» Çϳª ³ô¿©¼ 19·Î ¼³Á¤ÇÏ°í °ªÀ» ÀÔ·ÂÇϵµ·Ï ÇϰڽÀ´Ï´Ù. ±âº»ÀûÀ¸·Î, RunUO¿¡¼´Â ÀڷḦ ¹ÙÀ̳ʸ® ¹æ½ÄÀ¸·Î ÀúÀåÇϱâ 떄¹®¿¡, ÀڷḦ ÀÔ·ÂÇÒ¶§ Encode¸¦ ½ÃÄÑ¾ß Çϴµ¥ ÀÌ´Â °ü·Ã c#°Á¸¦ Âü°íÇϽñ⠹ٶó¸ç ¿©±â¼´Â ±×Àú ±×·¯ÇѰ¡ º¸´Ù Çϰí À̿븸 ÇϰڽÀ´Ï´Ù.
ÄÚµå : |
base.Serialize( writer );
writer.Write( (int) 19 ); // version
//ver 19
writer.WriteEncodedInt( (int) m_VotebyPl );
writer.Write( (DateTime) m_NextVotebyPl );
//ver 19 end
writer.WriteEncodedInt( (int) m_SolenFriendship );
|
ÀÚ, ÀÌÁ¦ ÀúÀåÇϱⰡ ³¡³µ½À´Ï´Ù. ºÒ·¯¿À±â¸¦ »ìÆìº¸µµ·Ï ÇÏÁö¿ä.
DeSerialize
ÄÚµå : |
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 18:
|
À§ÀÇ Äڵ带 ã¾Æº¸½Ç¼ö ÀÖ½À´Ï´Ù. ¾Æ±î ¸»¾¸µå·Çµç, ¼·Î ´Ù¸¥ ¹öÀüÀÌ Á¸ÀçÇÒ °¡´É¼ºÀÌ Àֱ⠶§¹®¿¡ »óÀ§¹öÀüºÎÅÍ Ã³¸®Çϰí ÀÖ½À´Ï´Ù. ±×·¸´Ù¸é ¿ì¸®µµ ±×·¸°Ô ÇØ¾ß°ÚÁö¿ä? case 18: À ºÎºÐ¿¡ case 19: ¸¦ Ãß°¡ÇÏ¿© ¿ì¸®°¡ ÀúÀåÇÑ °ªÀ» ºÒ·¯¿Àµµ·Ï ÇØº¸°Ú½À´Ï´Ù.
ÄÚµå : |
case 19:
{
m_VotebyPl = reader.ReadEncodedInt();
m_NextVotebyPl = reader.ReadDateTime();
goto case 18;
}
case 18:
|
¾Æ±î ¿ì¸®´Â, m_VotebyPl->m_NextVotebyPl¼øÀ¸·Î ÀúÀåµÇµµ·Ï Äڵ带 ¸¸µé¾ú°í, Àоîµå¸±¶§µµ ¿ª½Ã ¸¶Âù°¡Áö·Î ÇϰíÀÖ½À´Ï´Ù. ±×¸®ÇÏ¿© ¹öÀü 19ÀÇ Ã³¸®°¡ ³¡³ª´Âµ¥·Î ¹öÀü 18·Î À̵¿, ´ÙÀ½ 󸮸¦ Çϵµ·Ï Çϰí ÀÖ½À´Ï´Ù. Áï ÀÌ·± ¹æ½ÄÀ» ÅëÇÏ¿© ÇÏÀ§ ȣȯ¼ºÀ» À¯ÁöÇÑ´Ù°í »ý°¢ÇÏ½Ã¸é µÇ°Ú½À´Ï´Ù. ÀÌ·¯ÇÑ ¹ø°Å·Î¿î ÀýÂ÷°¡ ÇÊ¿äÇÑ ÀÌÀ¯´Â ´Ù½Ã °Á¶ µå¸®Áö¸¸ ¹Ýµå½Ã ÀúÀåÇÑ ¼ø¼ ±×´ë·Î Àоîµå·Á¾ß Çϱâ 떄¹®ÀÔ´Ï´Ù.(¼øÂ÷ÀûÀÎ ¹æ½ÄÀ̶ó°í »ý°¢ÇÏ½Ã¸é µÇ°Ú½À´Ï´Ù.).
ReadEncodedInt(); ReadDateTime(); µÎ ÇÔ¼ö´Â °¢°¢, ¿£ÄÚµùµÈ Á¤¼öÇü ÀÚ·á°ªÀ» Àоî¿À´Â ÇÔ¼ö¿Í, ³¯Àڽð£ ÀڷḦ Àоî¿À´Â ÇÔ¼öÀÔ´Ï´Ù. GenericReader Ŭ·¡½º ³»ÀÇ ÇÔ¼öÀ̹ǷÎ, ÀúÀåÇÑ ÀÚ·á°ªÀ» µ¿ÀÏ Çü½ÄÀ¸·Î Àоî¿Ã¶§ »ç¿ëµË´Ï´Ù.
Step #3 ¸í·É¾î¸¦ ¸¸µé¾î º¾½Ã´Ù!
ÀÌÁ¦ »ç¿ëÀÚ¿¡°Ô Æ÷ÀÎÆ®¸¦ º¸°üÇÒ¼ö ÀÖ´Â º¯¼öµµ ¸¸µé¾ú°í, ±×°ÍÀ» ÀúÀåÇÏ°í ºÒ·¯µå¸®´Â ºÎºÐÀÇ Ã³¸® ¶ÇÇÑ ±¸ÇöÇÏ¿´½À´Ï´Ù. ±×·¸´Ù¸é ÀÌÁ¦ »ç¿ëÀÚ°¡ ÇÏ·ç¿¡ Çѹø ¸í·É¾î¸¦ ÀÌ¿ëÇÏ¿© ó¸®ÇÒ¼ö ÀÖ°Ô ÇÏ´Â ºÎºÐÀÌ ÇÊ¿äÇØÁý´Ï´Ù.
º°µµÀÇ ÆÄÀÏÀ» Çϳª ¸¸µé¾î¼ °Å±â¿¡¼ ó¸®Çغ¸µµ·Ï ÇϰڽÀ´Ï´Ù.
¿©±â¿¡¼´Â VoteByPlayer.cs ¶ó´Â º°µµÀÇ ÆÄÀÏ¿¡¼ ÁøÇàÇØ º¸°Ú½À´Ï´Ù.
Step #3-1 ±âÃÊ Å¬·¡½º ¼³°è!
±âº»ÀûÀ¸·Î ¿ì¸®°¡ ±¸ÇöÇØ¾ßÇÒ ±â´ÉÀº °£´ÜÇÑ ¼³°è·Î½á ¸¶¹«¸® ÇÒ¼ö ÀÖ½À´Ï´Ù.
¿ì¼± Äڵ忡¼ ÁÖ¼®À» ÅëÇØ ¼³¸íÇØº¸°Ú½À´Ï´Ù.
ÄÚµå : |
using System; //System ³×ÀÓ½ºÆäÀ̽º¸¦ Æ÷ÇÔÇÕ´Ï´Ù. ±âº»ÀÔ´Ï´Ù.
using Server; //RunUO ³×ÀÓ½ºÆäÀ̽º¸¦ Æ÷ÇÔÇÕ´Ï´Ù. ±âº»ÀÔ´Ï´Ù.
using Server.Mobiles; //RunUO¿¡¼ NPC³ª »ç¿ëÀÚ °ü·Ã ºÎºÐÀ» Æ÷ÇÔÇÕ´Ï´Ù.
using Server.Targeting; // Ÿ°ÙÀ» ÀÌ¿ëÇϱâ À§Çؼ Æ÷ÇÔÇØ¾ß ÇÕ´Ï´Ù.
namespace Server // ÀÌ Å¬·¡½º°¡ Server ³×ÀÓ½ºÆäÀ̽º¿¡ Æ÷ÇÔµÊÀ» ÀǹÌÇÕ´Ï´Ù.
{
public class VoteByPlayer
{
public static void Initialize() //¼¹ö ºÎÆÃ½Ã 1ȸ È£ÃâµÇ´Â ÃʱâÈ ÇÔ¼öÀÔ´Ï´Ù. ¿©±â¼ ¸í·É¾î¸¦ µî·ÏÇÏ¸é µË´Ï´Ù.
{
// ¼¹ö¿¡ ¸í·É¾î¸¦ µî·ÏÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù.ÇÔ¼öÀÇ Çü½ÄÀº Register(¸í·É¾î,Á¢±Ù±ÇÇÑ,new CommandEventHandler(ó¸® ÇÔ¼ö));ÀÇ Çü½ÄÀ» µû¸¨´Ï´Ù.
Server.Commands.Register("̵̧",AccessLevel.Player,new CommandEventHandler( CmdVote) );
Server.Commands.Register("ºñÃßõ",AccessLevel.Player,new CommandEventHandler( CmdDeVote) );
}
// Usage Attribute´Â ¸í·É¾îÀÇ ÀÌ¿ë¹æ¹ý¿¡ ´ëÇÑ ¼³¸íÀ»,
// Description Attribute´Â ¸í·É¾î¿¡ ´ëÇÑ ¼³¸íÀÔ´Ï´Ù.
// ¹®¼ ÀÚµ¿È¿¡ ÀÌ¿ëµÇ´Â ºÎºÐÀ¸·Î ¼±ÅûçÇ×ÀÔ´Ï´Ù.
[Usage("̵̧")]
[Description("ÇØ´ç »ç¿ëÀÚ¸¦ 1ȸ ÃßõÇÕ´Ï´Ù.")]
public static void CmdVote( CommandEventArgs e)
{
// ¿©±â¿¡¼ Ãßõ¿¡ °üÇÑ ¸í·É¾î¸¦ ó¸®ÇÕ´Ï´Ù.
}
[Usage("ºñÃßõ")]
[Description("ÇØ´ç »ç¿ëÀÚ¸¦ 1ȸ ºñÃßõÇÕ´Ï´Ù.")]
public static void CmdDeVote( CommandEventArgs e)
{
// ¿©±â¿¡¼ ºñÃßõ¿¡ °üÇÑ ¸í·É¾î¸¦ ó¸®ÇÕ´Ï´Ù.
}
}
|
Ŭ·¡½º ±¸Á¶ ÀÚü´Â Æò¹üÇϱ⠱×Áö ¾ø´Â Áö±ØÈ÷ °£´ÜÇÑ Å¬·¡½º ÇüÅÂÀÔ´Ï´Ù.
Step #3-2 º»°ÝÀûÀÎ ±â´É ±¸Çö!
Ÿ°ÙÆÃ
ÀÚ, ÀÌÁ¦ µåµð¾î º»°ÝÀûÀ¸·Î ±â´ÉÀ» ±¸ÇöÇÒ ½Ã°£ÀÔ´Ï´Ù.
ÀÏ´Ü ¿ì¸®´Â ¿©±â¼ 'Ÿ°Ù'À» »ç¿ëÇØ¾ß ÇÔÀ» »ý°¢ÇØ º¼¼ö ÀÖ½À´Ï´Ù.
Áï ÀÚ±â ÀÚ½ÅÀ» ÃßõÇϴ°ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡, Ÿ°ÙÀ» ÀÌ¿ëÇØ¼ »ó´ë¹æÀ»
ÁöÁ¤ÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. Äڵ忡¼ Ÿ°ÙÀ» ¾î¶»°Ô ÀÌ¿ëÇØ¾ß ÇÒ±î¿ä?
Ÿ°ÙÆÃ(Ÿ°ÙÀ» ÁöÁ¤Çϵµ·Ï Ŭ¶óÀÌ¾ðÆ®¿¡ Ÿ°ÙÀ» ¶ÙÀ¸´Â°ÍÀ» ¸»ÇÔ.)À» ±¸ÇöÇϱâ À§Çؼ´Â ¾à°£ º¹ÀâÇÑ ÀýÂ÷¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù¸¸. ±×´ÙÁö Èûµç°Ç ¾Æ´Õ´Ï´Ù. ´Ù¸¸ Ŭ·¡½º¿¡ ´ëÇÑ ±âÃÊÀûÀÎ °³³ä¸¸ ÀÖÀ¸½Ã´Ù¸é ¾Æ¹« ¹®Á¦ ¾ø´ä´Ï´Ù.¹é¹®ÀÌ ºÒ¿©Àϰß! Äڵ带 ÅëÇØ¼ º¼±î¿ä?
ÄÚµå : |
(in code)
public static void Cmd( CommandEventArgs e )
{
// Ÿ°ÙÀ» È£Ãâ.
e.Mobile.Target = new VoteTarget();
}
private class VoteTarget : Target
{
// Target(Çã¿ë°Å¸®,¶¥ÁöÁ¤¿©ºÎ,Ÿ°Ù ¼Ó¼º(À̷οî,ÇØ·Î¿î,ÀϹÝ)
public VoteTarget() : base(5, false, TargetFlags.None )
{
}
// Ÿ°Ù ¼±Åýà ȣÃâµÇ´Â ÇÔ¼ö·Î ¿À¹ö¶óÀ̵å ÇÏ¿© »ç¿ëÇÕ´Ï´Ù.
protected override void OnTarget( Mobile from, object targ )
{
//Ÿ°Ù¿¡ ´ëÇÑ ÀڷḦ ó¸®ÇÕ´Ï´Ù.
//from: Ÿ°ÙÀ» ÁöÁ¤ÇÑ »ç¶÷
//targ: ÁöÁ¤µÈ Ÿ°Ù. objectÇüÀ̹ǷΠ¿øÇÏ´Â ÇüÅ·ΠÄɽºÆÃÇØ »ç¿ë
}
}
|
³»ºÎ¿¡ Target Ŭ·¡½º¸¦ »ó¼Ó¹Þ¾Æ¼ Ŭ·¡½º¸¦ Çϳª ¸¸µçÈÄ OnTargetÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å ÇØ¼ Ÿ°Ù 󸮸¦ Çϰí ÀÖ½À´Ï´Ù. ¾ð¾îÀû ÀÌÇØ°¡ ÀÖÀ¸½Ã´Ù¸é ±×¸® ¾î·Á¿î ºÎºÐÀÌ ¾Æ´Ï¸ç, Àß ÀÌÇØ°¡ ¾ÈµÇ½Å´Ù¸é c# °ü·Ã °ÀǸ¦ Âü°íÇÏ½Ã´Â°Ô ÁÁ°Ú½À´Ï´Ù.
CommandEventArgs
À§¿¡¼ Àá½Ã ÇÔ¼ö ÇüŸ¦ º¸µµ·Ï ÇÒ±î¿ä?
ÄÚµå : | public static void CmdVote( CommandEventArgs e ) |
ÇÔ¼ö¿¡¼ ÀÎÀÚ·Î CommandEventAgrs ¶ó´Â Ŭ·¡½º¸¦ ³Ñ°Ü ¹Þ°í ÀÖ½À´Ï´Ù. °ú¿¬ ¾î¶² Ŭ·¡½º Àϱî¿ä?
CommandEventArgs´Â .netÀÇ EventArgs Ŭ·¡½ºÀÇ ÀÚ½Ä Å¬·¡½º·Î½á, ¸í·É¾î°¡ È£ÃâµÉ¶§ °Å±â¿¡ °ü·ÃµÈ ¸î°¡Áö Á¤º¸¸¦ Æ÷ÇÔÇϰí ÀÖ½À´Ï´Ù. À̸¦ ÅëÇÏ¿© ¸í·É¾î¸¦ ÀÌ¿ëÇÑ ÀÌ¿ëÀÚ°¡ ´©±¸ÀÎÁö, ¾î¶² ÀÎÀÚ°¡ Àü´ÞµÇ°í ÀÖ´ÂÁö¸¦ È®ÀÎÇÒ¼ö Àִ°ÍÀÌÁÒ. ±¸Á¶´Â ´ÙÀ½°ú °°½À´Ï´Ù.
ÄÚµå : |
public string ArgString; //ÀÎÀÚµéÀÇ ¹®ÀÚ¿ ¹è¿À» ÇϳªÀÇ ¹®ÀÚ¿·Î ¸®ÅÏÇÕ´Ï´Ù.
public string[] Arguments; //ÀÎÀÚµéÀÇ ¹®ÀÚ¿ ¹è¿ÀÔ´Ï´Ù.
public string Command; //½ÇÇàµÈ ¸í·É¾î¸¦ ´ãÀ½ÀÔ´Ï´Ù.
public int Length; //ÀÎÀÚÀÇ ÃÑ °³¼ö ÀÔ´Ï´Ù. ÀÎÀÚ¶õ [¸í·É¾î x y z ¿¡¼ x,y,z¸¦ ¸»ÇÔÀÌÁÒ. ÀÎÀÚÀÇ °³¼ö´Â ¾ó¸¶µçÁö °¡´ÉÇÕ´Ï´Ù. µû¶ó¼ ÃÑ ¸î°³ÀÇ ÀÎÀÚ°¡ ÀÖ´ÂÁö ÀÌ º¯¼ö·Î Àü´ÞÇϴ°ÅÁÒ
public Server.Mobile Mobile; // ¸í·É¾î¸¦ È£ÃâÇÑ ÀÌ¿ëÀÚ
|
½Ã°£ °ü·Ã Ŭ·¡½º,ÇÔ¼ö ÀÌ¿ë
°ÔÀÓ³»¿¡¼ ½Ã°£À̶õ ÂüÀ¸·Î Áß¿äÇÑ ¹®Á¦ÀÔ´Ï´Ù. À̹ø ±â´É ±¸Çö¿¡¼ ¿ª½Ã 'ÇÏ·ç¿¡ Çѹø'À̶ó´Â ±â´ÉÀ» ±¸ÇöÇϱâ À§Çؼ± ½Ã°£ °ü¸®ÀÇ ¹®Á¦¼ºÀÌ Áß¿ä½Ã µË´Ï´Ù. ´ÙÇàÈ÷ c#¿¡¼´Â ¸Å¿ì Æí¸®ÇÑ ½Ã°£°ü¸® Ŭ·¡½ºÀÎ DateTimeÀ» Á¦°øÇϴµ¥, À̰ÍÀÌ Æí¸®ÇÏ´Ù ÇÑ ÀÌÀ¯´Â [B½Ã°£¿¡ ´ëÇÑ »çÄ¢¿¬»ê,ºñ±³[/B]°¡ °¡´ÉÇϱ⠶§¹®ÀÔ´Ï´Ù.
À̹ø ¿ª½Ã ¿¹Á¦ ÄÚµå·Î »ìÆìº¸°Ú½À´Ï´Ù.
ÄÚµå : |
// ÇöÀç ½Ã°£¿¡ ÇϷ縦 ´õÇÕ´Ï´Ù. +-*/ ¸ðµÎ °¡´ÉÇÕ´Ï´Ù.
// TimeSpan Àº ½Ã°£ °£°ÝÀ» Á¶ÀýÇÕ´Ï´Ù.
// FromDays, FromHours, FromMinutesµîµî.. ´Ù¾çÇÑ ÇÔ¼ö°¡ Á¦°øµË´Ï´Ù.
DateTime.Now + TimeSpan.FromDays(1);
// ÀúÀåµÇ¾î ÀÖ´Â ½Ã°£°ú ÇöÀç ½Ã°£ÀÇ ¾Õ¼°í µÞ¼°í¸¦ ºñ±³ÇÕ´Ï´Ù.
// Áï.. Å« ÂÊÀÌ Á»´õ ¹Ì·¡ÀÇ ½Ã°£À̶ó°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù.
if ( pm.NextVoteByPlayer > DateTime.Now )
|
ÀÚ, ÀÌÁ¦ º»°ÝÀûÀ¸·Î ±¸ÇöÇØ º¾½Ã´Ù
ÄÚµåÀÇ ¿¹Á¦¸¦ ÅëÇØ ¼³¸íÇϵµ·Ï ÇϰڽÀ´Ï´Ù.
VoteByPlayer.cs
ÄÚµå : |
using System;
using Server;
using Server.Mobiles;
using Server.Targeting; // Ÿ°ÙÆÃÀ» À§Çؼ
namespace Server
{
public class VoteByPlayer
{
public static void Initialize() //¼¹ö ºÎÆÃ½Ã ´Ü Çѹø ½ÇÇà. ¸í·É¾î¸¦ µî·ÏÇÕ´Ï´Ù.
{
Server.Commands.Register("̵̧",AccessLevel.Player,new CommandEventHandler( CmdVote) );
Server.Commands.Register("ºñÃßõ",AccessLevel.Player,new CommandEventHandler( CmdDeVote) );
}
[Usage("̵̧")]
[Description("ÇØ´ç »ç¿ëÀÚ¸¦ 1ȸ ÃßõÇÕ´Ï´Ù.")]
public static void CmdVote( CommandEventArgs e)
{
Mobile m = e.Mobile; // ¸í·É¾î¸¦ ½ÇÇàÇÑ ÀÌ¿ëÀÚ
m.SendMessage("´©±¸¸¦ ÃßõÇϽðڽÀ´Ï±î?");
//Ÿ°Ù »ý¼º VoteTarget(Ãßõ=true,ºñÃßõ=false)
m.Target = new VoteTarget(true);
}
[Usage("ºñÃßõ")]
[Description("ÇØ´ç »ç¿ëÀÚ¸¦ 1ȸ ºñÃßõÇÕ´Ï´Ù.")]
public static void CmdDeVote( CommandEventArgs e)
{
Mobile m = e.Mobile;
m.SendMessage("´©±¸¸¦ ºñÃßõÇϽðڽÀ´Ï±î?");
m.Target = new VoteTarget(false);
}
private class VoteTarget : Target // Target Ŭ·¡½º¿¡¼ »ó¼Ó¹Þ½À´Ï´Ù.
{
bool m_Vote = true; // Ãßõ,ºñÃßõ ¿©ºÎ
// Target(Çã¿ë°Å¸®,¶¥ÁöÁ¤¿©ºÎ,Ÿ°Ù ¼Ó¼º(À̷οî,ÇØ·Î¿î,ÀϹÝ)
// ÀÚ¼¼ÇÑ°Ç c#°ü·Ã °ÁÂÀÇ Å¬·¡½º¿Í Ŭ·¡½ºÀÇ »ó¼ÓºÎºÐÀ» Âü°íÇϼ¼¿ä.
public VoteTarget(bool Vote) : base(5, false, TargetFlags.None )
{
m_Vote = Vote;
}
// Ÿ°Ù ¼±Åýà ȣÃâµÇ´Â ÇÔ¼ö·Î ¿À¹ö¶óÀ̵å ÇÏ¿© »ç¿ëÇÕ´Ï´Ù.
protected override void OnTarget( Mobile from, object targ )
{
//Ÿ°Ù¿¡ ´ëÇÑ ÀڷḦ ó¸®ÇÕ´Ï´Ù.
//from: Ÿ°ÙÀ» ÁöÁ¤ÇÑ »ç¶÷
//targ: ÁöÁ¤µÈ Ÿ°Ù. objectÇüÀ̹ǷΠ¿øÇÏ´Â ÇüÅ·ΠÄɽºÆÃÇØ »ç¿ë
if ( m_Vote == true) // ¸¸¾à ÃßõÀ̶ó¸é,
{
//CanVote(PlayerMobile) ½Ã°£À» ºñ±³ÇÏ¿© ¸¶Áö¸· ÅõÇ¥·ÎºÎÅÍ
//24½Ã°£ÀÌ Áö³µ´ÂÁö ÆÄ¾Ç
if ( !CanVote((PlayerMobile)from) )
{
from.SendMessage("24½Ã°£¿¡ Çѹø¸¸ ÅõÇ¥°¡´ÉÇÕ´Ï´Ù!");
return;
}
//(PlayerMobile)targ
//:: objectÇüÀ¸·Î ³Ñ¾î¿Â ÀڷḦ ÄɽºÆÃÇÏ¿© ÇüÀ»
//º¯È¯ ½Ã۴°ÍÀÔ´Ï´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº c#°ü·Ã °Á Âü°í.
PlayerMobile pm = (PlayerMobile)targ;
pm.VoteByPlayer++;
//{0},{1}µîÀº c¿¡¼ÀÇ %s %s ÇÏ´Â ½Ä°ú ºñ½ÁÇÕ´Ï´Ù.
//Áï, {0},{1}Àº ¾ÆÁ÷ Á¤ÇØÁöÁö ¾ÊÀº °ªµéÀ̸ç, À̰ÍÀ» ,,, ·Î °è¼Ó
//º¯¼ö¸¦ ÁöÁ¤ÇÏ¿© ³ªÁß¿¡ ½ÇÇà½Ã¿¡´Â ¾Ë¸ÂÀº °ªµé·Î ä¿öÁý´Ï´Ù.
pm.SendMessage("´ç½ÅÀÌ Ãßõ¹ÞÀº ÃÑ È¸¼ö´Â {0}ȸ ÀÔ´Ï´Ù.",pm.VoteByPlayer);
PlayerMobile fromp = (PlayerMobile)from;
//Áö±ÝÀÇ ½Ã°£¿¡ 24½Ã°£À» ´õÇÕ´Ï´Ù.
fromp.NextVoteByPlayer = DateTime.Now + TimeSpan.FromDays(1);
}
else
{
if ( !CanVote((PlayerMobile)from) )
{
from.SendMessage("24½Ã°£¿¡ Çѹø¸¸ ÅõÇ¥°¡´ÉÇÕ´Ï´Ù!");
return;
}
PlayerMobile pm = (PlayerMobile)targ;
//0ÀÌÇϷδ ¼³Á¤µÉ¼ö ¾ø±â 떄¹®¿¡ ±× ºÎºÐ¿¡ ´ëÇÑ Ã¼Å©¸¦
//ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù.
if ( (pm.VoteByPlayer - 1 ) <= 0 )
pm.VoteByPlayer = 0;
else
pm.VoteByPlayer--;
pm.SendMessage("´ç½ÅÀÌ Ãßõ¹ÞÀº ÃÑ È¸¼ö´Â {0}ȸ ÀÔ´Ï´Ù.",pm.VoteByPlayer);
PlayerMobile fromp = (PlayerMobile)from;
fromp.NextVoteByPlayer = DateTime.Now + TimeSpan.FromDays(1);
}
}
private bool CanVote(PlayerMobile pm)
{
// ÀúÀåµÇ ÀÖ´Â ´ÙÀ½ ÅõÇ¥°¡´É ½Ã°£°ú ºñ±³ÇÏ¿©
// ¸¸¾à ÅõÇ¥ °¡´É½Ã°£ÀÌ ´õ ¹Ì·¡¶ó¸é
// ÅõÇ¥°¡ ºÒ°¡´ÉÇÏ´Ù°í ¸®ÅÏÇÏ´Â ±¸Á¶ÀÔ´Ï´Ù.
if ( pm.NextVoteByPlayer > DateTime.Now )
{
return false;
}
else
{
return true;
}
}
}
}
}
|
Áö±Ý±îÁö ³ª´©¾î¼ ¼³¸íÇß´ø ºÎºÐÀ» Çϳª·Î ¹¾ú°í, ¶Ç ¸î°¡Áö ÇÊ¿äÇÏ´Ù ½ÍÀº
¼³¸íÀº ÁÖ¼®³»¿¡ Æ÷ÇÔÇÏ¿´½À´Ï´Ù.
¸¶Ä¡¸ç..
¿Â¶óÀÎ »ó¿¡¼ Á÷Á¢ Äڵ带 ¸¸µé°í ¹Ù·Î ¼³¸íÇØ °¡¸é¼ ¾´ ±ÛÀ̶ó Äڵ忡 ¿¡·¯°¡ ÀÖÀ»Áöµµ ¸ð¸£°Ú½À´Ï´Ù. ´Ù¸¸ ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ´Ù ¶ó´Â ¹æ¹ýÀ» ¼³¸íÇϱâ À§Çؼ ³ë·ÂÇß°í, ¸í·É¾î¸¦ Ãß°¡ÇÏ´Â ¹ý, Ÿ°ÙÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý µîµî¿¡ ´ëÇÑ ¼³¸íÀ» ´ã°íÀÚ ³ë·ÂÇßÀ¸³ª ÇÊ·ÂÀÌ ¸ðÀÚ¶õ °ü°è·Î ¾î¶»°Ô Àß º¸¼Ì³ª ¸ð¸£°Ú½À´Ï´Ù.
»ç½Ç RunUO¿¡¼ µµÀÔÇϰí ÀÖ´Â ¹æ½ÄÀº ½ºÅ©¸³ÆÃ(Scripting)À̶ó°í º¸±â¿¡´Â ¹«¸®°¡ ÀÖ´Ù°í »ý°¢ÇÕ´Ï´Ù. ±×·¡¼ Á¦ ±Û¿¡¼µµ ÀǵµÀûÀ¸·Î ½ºÅ©¸³À̶õ Ç¥ÇöÀº ¹èÁ¦ÇÏ¿´½À´Ï´Ù. RunUO¿¡¼ »ç¿ëÇÑ°Ç Â÷¶ó¸® Ç÷¯±×ÀÎ ¹æ½ÄÀÌ¶ó º¸´Â°Ô Ÿ´çÇϸç, µû¶ó¼ ¼ÒÀ§ ¸»ÇÏ´Â RunUO ½ºÅ©¸³¿¡´Â ¾ð¾îÀûÀÎ Áö½Ä°ú ¹æ¹ýÀ¸·Î¼ÀÇ Á¢±ÙÀÌ ÇÊ¿äÇÕ´Ï´Ù. ½ºÇǾ ´Ù¸¥ ¿¹¹°·¹ÀÌÅÍ ½ÄÀ¸·Î ±×Àú ¸í·É¾î ¸î°³, ÇÔ¼ö ¸î°³ ÀÍÇô¼ µÇ´Â°ÍÀÌ ¾Æ´Ï¶ó´Â ¸»¾¸À» µå¸®°í ½Í½À´Ï´Ù. ¹Ù¶÷ÀÌ ÀÖ´Ù¸é, RunUO¸¦ ÅëÇØ¼ c#¿¡ °ü½ÉÀ» °¡Áö½Ã°í, ³ª¾Æ°¡ c#À» ÅëÇØ ÇÁ·Î±×·¡¹Ö¿¡ °ü½ÉÀ» °¡Áö¼ÌÀ¸¸é Çϴ°ÍÀÌ ¹Ù¶÷ÀÔ´Ï´Ù¸¸.
¸ðÂÉ·Ï °Ç³´Ô¿¡°Ô ºÎŹ¹Þ¾Æ ³ª¸§´ë·Î °ü¸®ÀÚÀÇ ÇÑ ÀÚ¸®¸¦ Â÷ÁöÇϰí ÀÖ¾ú½À´Ï´Ù¸¸ ±×µ¿¾È ÀÌ·¸´ÙÇÒ ½ÇÀûµµ ¾ø°í ÇØ¼ ÀÌ·¸°Ô ºÎÁ·Çϳª¸¶ Çѹø ½áº¸¾Ò½À´Ï´Ù. ¸ðÂÉ·Ï µµ¿òµé µÇ¼Ì±æ ¹Ù¶ó¸ç, ¹°·¯°©´Ï´Ù.
º» ±Û¿¡ °üÇÑ ¹®ÀÇ »çÇ×Àº irc³»¿¡¼ÀÇ #ultimax ä³ÎÀÇ kkungÀ̳ª,
kkungkkung@gmail.comÀ¸·Î ÁÖ½Ã¸é ºü¸¥ ½ÃÀϳ»¿¡ ´äº¯ÇØ µå¸®°Ú½À´Ï´Ù. ¸ðÂÉ·Ï ºÎÁ·ÇÑ °ÀÇ Âü°íÇÏ¿©Áּż °¨»çÇÕ´Ï´Ù.
|
|