⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agentdbmsgparser.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "CommonDBMsgParser.h"
#include "AgentDBMsgParser.h"
#include "DataBase.h"
#include "UserTable.h"
#include "ServerTable.h"
#include "Console.h"
#include "Network.h"
#include "MsgTable.h"
#include "ServerSystem.h"
#include "GMPowerList.h"

//MSG_CHAT g_WisperTemp;
//MSG_CHAT g_MunpaTemp;
//MSG_CHAT g_PartyTemp;


//-----------------------------------------------------------------------
// DBÄõ¸® ¸®ÅÏ ÇÔ¼ö°¡ ´Ã¾î³¯¶§¸¶´Ù Ãß°¡
// enum Query ÀÇ ¼ø¼­°¡ ¹Ýµå½Ã!!!! ÀÏÄ¡ÇØ¾ß ÇÑ´Ù.
DBMsgFunc g_DBMsgFunc[MaxQuery] =
{
	NULL,
	RUserIDXSendAndCharacterBaseInfo,	// ij¸¯ÅÍ ¸®½ºÆ® Query
	RCreateCharacter,
	NULL,
	RDeleteCharacter,
	RCharacterNameCheck,
	NULL,
	NULL,
	RSearchWhisperUserAndSend, /// ij¸¯¸íÀ¸·Î Á¢¼Ó¿©ºÎ¹× ¸Ê¹øÈ£ ¾ò¾î¿À±â
	NULL,							//SavePoint 
	NULL,							/// ¸Ê¿¡¼­ ³ª°¡¸é ½ÇÇàÇÑ´Ù
	NULL,							/// ¸Ê¼­¹ö Á¾·á½Ã ½ÇÇà
	RFriendIsValidTarget,		//FriendGetUserIDXbyName
	RFriendAddFriend,
	RFriendIsValidTarget,
	RFriendDelFriend,
	RFriendDelFriendID,
	NULL, //Ä£±¸¸®½ºÆ® »èÁ¦(ij¸¯ÅÍ »èÁ¦½Ã)
	RFriendNotifyLogintoClient,
	RFriendGetFriendList,
	RFriendGetLoginFriends,
	RNoteIsNewNote,
	NULL,
	RNoteList,
	RNoteDelete,
	RWantedDelete,
	NULL,
//For GM-Tool	
	RGM_BanCharacter,
	RGM_UpdateUserLevel,			/// eGM_UpdateUserLevel,
	RGM_WhereIsCharacter,
	RGM_Login,
	RGM_GetGMPowerList,
//	
	NULL,
	NULL,
};	

// Ä´¸¯ÅÍ ¸®½ºÆ® °¡Á®¿À´Â DBÄõ¸®
void UserIDXSendAndCharacterBaseInfo(DWORD UserIDX, DWORD AuthKey, DWORD dwConnectionIndex)
{
	g_DB.FreeQuery(eCharacterBaseQuery, dwConnectionIndex, "EXEC MP_CHARACTER_SelectByUserIDX %d, %d", UserIDX, AuthKey);
}

void CheatLog(DWORD CharacterIDX,DWORD CheatKind)
{
	char txt[256];
	sprintf(txt,"INSERT TB_LogHacking (Character_idx,CheatKind,LogDate) values(%d,%d,getdate())",
				CharacterIDX,CheatKind);
	g_DB.LogQuery(eQueryType_FreeQuery,0,0,txt);
}

void CreateCharacter(CHARACTERMAKEINFO* pMChar, WORD ServerNo, DWORD dwConnectionIndex)
{
	CHARACTERMAKEINFO* pMsg = pMChar;
	char txt[512];

	WORD CheRyuk = 12;
	WORD SimMek = 12;
	WORD GenGol = 12;
	WORD MinChub = 12;
	char ip[16];
	WORD port;
	g_Network.GetUserAddress( dwConnectionIndex, ip, &port );

	int LoginPoint = 2018;
	sprintf(txt, "EXEC %s %d, %d, %d, %d, %d, \'%s\', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, \'%s\'", 
		"MP_CHARACTER_CreateCharacter", pMsg->UserID, 
		GenGol, MinChub, CheRyuk, SimMek, 
		pMsg->Name,	pMsg->FaceType, pMsg->HairType, pMsg->StartArea,
		pMsg->SexType, pMsg->WearedItemIdx[eWearedItem_Hat], pMsg->WearedItemIdx[eWearedItem_Weapon], pMsg->WearedItemIdx[eWearedItem_Dress], 
		pMsg->WearedItemIdx[eWearedItem_Shoes], pMsg->WearedItemIdx[eWearedItem_Ring1], pMsg->WearedItemIdx[eWearedItem_Ring2],
		pMsg->WearedItemIdx[eWearedItem_Cape], pMsg->WearedItemIdx[eWearedItem_Necklace],pMsg->WearedItemIdx[eWearedItem_Armlet], pMsg->WearedItemIdx[eWearedItem_Belt], LoginPoint, ServerNo,
		pMsg->Height, pMsg->Width, ip);
		
	if(g_DB.Query(eQueryType_FreeQuery, eCreateCharacter, dwConnectionIndex, txt) == FALSE)
	{
	}
/*	
	CharBasicStats* tmp = g_pListCollect->GetCharBasicStats();
	g_DB.FreeQuery(eCreateCharacter, dwConnectionIndex, 
		"EXEC %s %d, %d, %d, %d, %d, '%s', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
		"MP_CHARACTER_CreateCharacter", pMChar->UserID, tmp->wGenGol, tmp->wMinChub, tmp->wCheRyuk, 
		tmp->wSimMek, pMChar->Name,	pMChar->JobType, pMChar->FaceType, pMChar->HairType, pMChar->StartArea,
		pMChar->SexType, pMChar->WearedItemIdx[eWearedItem_Weapon], pMChar->WearedItemIdx[eWearedItem_Dress], 
		pMChar->WearedItemIdx[eWearedItem_Hat], pMChar->WearedItemIdx[eWearedItem_Shoes], pMChar->WearedItemIdx[eWearedItem_Armlet],
		pMChar->WearedItemIdx[eWearedItem_Cape], pMChar->WearedItemIdx[eWearedItem_Belt], pMChar->WearedItemIdx[eWearedItem_Necklace], 
		pMChar->WearedItemIdx[eWearedItem_Ring1], pMChar->WearedItemIdx[eWearedItem_Ring2]);
*/
}

void CharacterNameCheck(char* pName, DWORD dwConnectionIndex)
{
	g_DB.FreeQuery(eNewCharacterCheckName, dwConnectionIndex, "EXEC %s \'%s\'", "MP_CHARACTER_NameCheck", pName);
}

void LoginCheckDelete(DWORD UserID)//, DWORD dwConnectionIndex)
{
//	g_DB.FreeQuery(eLoginCheckDelete, 0, "EXEC %s %d", "MP_CHARACTER_LoginDelete", UserID);

	static char txt[128];
//	sprintf(txt, "EXEC %s %d", "Up_Member_CheckOut", UserID);
	sprintf(txt, "EXEC %s %d", "Up_GameLogOut", UserID);
	g_DB.LoginQuery(101, eLoginCheckDelete, 0, txt);
}

void SetUserCurAndMaxCount(DWORD CurCount, DWORD MaxCount)
{
	g_DB.FreeQuery(eSetCurMaxCount, 0, "EXEC %s %d, %d", "SetUserLogCount", CurCount, MaxCount);
}
void DeleteCharacter(DWORD dwPlayerID, WORD ServerNo, DWORD dwConnectionIndex)
{
	USERINFO* pinfo = g_pUserTable->FindUser(dwConnectionIndex);
	if(!pinfo)
		return;
	CHARSELECTINFO * SelectInfoArray = (CHARSELECTINFO*)pinfo->SelectInfoArray;
	
	for(int i = 0; i < MAX_CHARACTER_NUM; i++)
	{
		if(SelectInfoArray[i].dwCharacterID == dwPlayerID)
			break;
		if(i == MAX_CHARACTER_NUM - 1)	// À¯Àú°¡ °¡Áö°í Àִ ij¸¯°ú ´Ù¸¥ ij¸¯ÀÌ ¼±ÅõÊ
		{
			// ¿¬°áµÈ ij¸¯°ú Áö¿ïij¸¯ÀÌ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù
			return;
		}
	}

	char ip[16];
	WORD port;
	g_Network.GetUserAddress( dwConnectionIndex, ip, &port );

	//ÆÄƼ³ª ¹®ÆÄÀåÀÌ¸é  ¿¡·¯ÄÚµå ¸®ÅÏ
	g_DB.FreeQuery(eDeleteCharacter, dwConnectionIndex, "EXEC %s %d, %d, \'%s\'", "MP_CHARACTER_DeleteCharacter", dwPlayerID, ServerNo, ip );
}

void SearchWhisperUserAndSend( DWORD dwPlayerID, char* CharacterName, DWORD dwKey )
{
	g_DB.FreeQuery(eLoginMapInfoSearchForName, dwKey, "EXEC %s \'%s\', %d", "MP_LoginCharacterSearchForName", CharacterName, dwPlayerID );
}

/*
void SearchMunpaChatSendOnPlayer(DWORD dwPlayerID, DWORD dwKey )
{
	g_DB.FreeQuery(eMunpaChatSendOnPlayer, dwKey, "EXEC %s %d", "MP_MunpaChat_FindOnPlayer", dwPlayerID);
}
*/
void SaveMapChangePointUpdate(DWORD CharacterIDX, WORD MapChangePoint_Idx)
{
	g_DB.FreeQuery(eSavePoint, CharacterIDX, "EXEC  %s %d, %d", "MP_CHARACTER_MapchangePointUpdate", CharacterIDX, MapChangePoint_Idx);
	
}

void UnRegistLoginMapInfo(DWORD CharacterIDX)
{
	g_DB.FreeQuery(eUnRegistLoginMapInfo, CharacterIDX, "EXEC %s %d", "MP_LoginMapInfo_UnRegist", CharacterIDX);
}
/*
void MapUserUnRegistLoginMapInfo(WORD MapPort)
{
	g_DB.FreeQuery(eMapUserUnRegistMapInfo, 0, "EXEC %s %d", "MP_LoginMapInfo_MapUserUnRegist", MapPort);
}
*/
void FriendGetUserIDXbyName(DWORD CharacterIDX, char* TargetName)
{
	g_DB.FreeQuery(eFriendGetTargetMemeberIDX, CharacterIDX, "EXEC %s \'%s\', %u", "MP_FRIEND_GetTargetIDX", TargetName, CharacterIDX);
}

void FriendAddFriend(DWORD CharacterIDX, DWORD TargetID) //CharacterIDX : ½ÅûÀÎ, TargetID : ½Â³«ÀÎ
{
	g_DB.FreeQuery(eFriendAdd, CharacterIDX, "EXEC %s %u, %u", "MP_FRIEND_AddFriend", CharacterIDX, TargetID);
}

void FriendIsValidTarget(DWORD CharacterIDX, DWORD TargetID, char* FromName)
{
	g_DB.FreeQuery(eFriendIsValidTarget, CharacterIDX, "EXEC %s %d, %d, \'%s\'", "MP_FRIEND_IsValidTarget", CharacterIDX, TargetID, FromName);
}

void FriendDelFriend(DWORD CharacterIDX, char* TargetName)
{
	g_DB.FreeQuery(eFriendDel, CharacterIDX, "EXEC %s %u, \'%s\'", "MP_FRIEND_DelFriend", CharacterIDX, TargetName);
}

void FriendDelFriendID(DWORD CharacterIDX, DWORD TargetID, DWORD bLast)
{
	g_DB.FreeQuery(eFriendDelID, CharacterIDX, "EXEC %s %u, %u, %d", "MP_FRIEND_DelFriendID", CharacterIDX, TargetID, bLast);
}

void FriendNotifyLogintoClient(DWORD CharacterIDX)
{
	g_DB.FreeQuery(eFriendNotifyLogin, CharacterIDX, "EXEC %s %u", "MP_FRIEND_NotifyLogin", CharacterIDX); //³ª¸¦ µî·ÏÇÑ »ç¶÷µé
}

void FriendGetLoginFriends(DWORD CharacterIDX)
{
	g_DB.FreeQuery(eFriendGetLoginFriends, CharacterIDX, "EXEC %s %u", "MP_FRIEND_LoginFriend", CharacterIDX);//³»°¡ µî·ÏÇÑ »ç¶÷µé
}

void FriendGetFriendList(DWORD CharacterIDX)
{
	g_DB.FreeQuery(eFriendGetFriendList, CharacterIDX, "EXEC %s %u", "MP_FRIEND_GetFriendList", CharacterIDX);
}

void NoteIsNewNote(DWORD PlayerID)
{
	g_DB.FreeQuery(eNoteIsNewNote, PlayerID, "EXEC %s %u", "MP_NOTE_IsNewNote", PlayerID);
}

void NoteSendtoPlayer(DWORD FromIDX, char* FromName, char* ToName, char* Note)
{
	g_DB.FreeLargeQuery(RNoteSendtoPlayer, FromIDX, "EXEC %s \'%s\', \'%s\', \'%s\'", "MP_NOTE_SendNote", ToName, FromName, Note);	
}

void NoteSendtoPlayerID(DWORD FromIDX, char* FromName, DWORD ToIDX, char* Note)
{
	g_DB.FreeLargeQuery(RNoteSendtoPlayer, FromIDX, "EXEC %s %u, \'%s\', %u, \'%s\'", "MP_NOTE_SendNoteID", FromIDX, FromName, ToIDX, Note);
}

void NoteDelAll(DWORD CharacterIDX)
{
	g_DB.FreeQuery(eNoteDelAll, 0, "EXEC %s %u", "MP_NOTE_DelAllNote", CharacterIDX);
}

void NoteList(DWORD CharacterIDX, WORD Page)
{
	g_DB.FreeQuery(eNoteList, CharacterIDX, "EXEC %s %u, %d, %u", "MP_NOTE_GetNoteList", CharacterIDX, 10, Page); //10°³¾¿ ¹Þ¾Æ¿Â´Ù. 
}

void NoteRead(DWORD CharacterIDX, DWORD NoteIDX, DWORD IsFront)
{
	g_DB.FreeLargeQuery(RNoteRead, CharacterIDX, "EXEC %s %u, %u, %u", "MP_NOTE_ReadNote", CharacterIDX, NoteIDX, IsFront);
}

void NoteDelete(DWORD PlayerID, DWORD NoteID, BOOL bLast)
{	
	g_DB.FreeQuery(eNoteDelete, PlayerID, "EXEC %s %u, %u, %d", "MP_NOTE_DelNote", PlayerID, NoteID, bLast);
}

void WantedDelete(DWORD CharacterIDX)
{
	g_DB.FreeQuery(eWantedDelete, CharacterIDX, "EXEC %s %u", "MP_WANTED_Delete", CharacterIDX);
}

void WantedDelWantInfo(DWORD WantedIDX)
{
	g_DB.FreeQuery(eWantedDelWantInfo, 0, "EXEC %s %u", "MP_WANTED_DeleteWantedInfo", WantedIDX);
}

//---for GM_Tool
void GM_WhereIsCharacter(DWORD dwID, char* CharacterName, DWORD dwSeacherID )
{
	g_DB.FreeQuery(eGM_WhereIsCharacter, dwID, "EXEC %s \'%s\', %d", "MP_LoginCharacterSearchForName", CharacterName, dwSeacherID );
}

void GM_BanCharacter(DWORD dwID, char* CharacterName, DWORD dwSeacherID )
{
	g_DB.FreeQuery(eGM_BanCharacter, dwID, "EXEC %s \'%s\', %d", "MP_LoginCharacterSearchForName", CharacterName, dwSeacherID );
}

void GM_UpdateUserLevel(DWORD dwID, DWORD dwServerGroup, char* Charactername, BYTE UserLevel)
{
	char txt[128];
	sprintf(txt, "EXEC %s %d, \'%s\', %d", "MP_GMTOOL_UpdateUserLevel", dwServerGroup, Charactername, UserLevel);
	g_DB.LoginQuery(eQueryType_FreeQuery, eGM_UpdateUserLevel, dwID, txt);
}

void GM_Login( DWORD dwConnectionIdx, char* strID, char* strPW, char* strIP )
{
	char txt[128];
	sprintf(txt, "EXEC RP_OperatorLoginCheck \'%s\', \'%s\', \'%s\'", strID, strPW, strIP);	
	g_DB.LoginQuery(eQueryType_FreeQuery, eGM_Login, dwConnectionIdx, txt);
}

void GM_GetGMPowerList( DWORD dwStartIdx, DWORD dwFlag )
{
	char txt[128];
	sprintf(txt, "EXEC %s %d, %d", "RP_OperatorInfo", dwStartIdx, dwFlag );
	g_DB.LoginQuery(eQueryType_FreeQuery, eGM_GetGMPowerList, 0, txt);
}

/*
void GM_MoveToCharacter( DWORD dwTargetID, char* CharacterName, DWORD dwSeacherID )
{
	g_DB.FreeQuery(eGM_MoveToCharacter, dwSeacherID, "EXEC %s \'%s\', %d", "MP_LoginCharacterSearchForName", CharacterName, dwTargetID );
}
*/

//---------

//---------------------------------------------------------------------------------------------------------
//
// Qeury Result Function
//
//---------------------------------------------------------------------------------------------------------
void	RUserIDXSendAndCharacterBaseInfo(LPQUERY pData, LPDBMESSAGE pMessage)
{
	DWORD count = pMessage->dwResult;
	if(atoi((char*)pData[0].Data[0]) == 0)
		count = 0;
	DWORD AgentAuthKey = atoi((char*)pData[0].Data[eCL_AuthKey]);
	USERINFO* pInfo = g_pUserTable->FindUser(pMessage->dwID);
	if(pInfo == NULL)		// ÀÌ¹Ì ³ª°¬À½
		return;
	if(pInfo->dwUniqueConnectIdx != AgentAuthKey)	// ³ª°¡°í ´Ù¸¥³ÑÀÌ µé¾î¿È
		return;

	if(count > dMAXCHARACTER)	// ij¸¯ÅÍ Á¤º¸¹Þ±â ½ÇÆÐ
	{
		count = dMAXCHARACTER;
		char temp[256];
		sprintf(temp,"Äɸ¯ÅͰ¡ 5¸í ÀÌ»óÀ̾úÀ½!!! useridx : %d", pInfo->dwUserID );
		ASSERTMSG(0,temp);
	}


	SEND_CHARSELECT_INFO msg;
	msg.Category = MP_USERCONN;
	msg.Protocol = MP_USERCONN_CHARACTERLIST_ACK;

//---KES Crypt
#ifdef _CRYPTCHECK_ 
	msg.eninit = *pInfo->crypto.GetEnKey();
	msg.deinit = *pInfo->crypto.GetDeKey();
#endif
//--------
	if( !count ) /// ¾ÆÁ÷ ¸¸µç ij¸¯ÅͰ¡ ¾ø´Ù.
	{
		msg.CharNum = 0;			// ÀÌ Ä«¿îÆ®°¡ 0À̸é ij¸¯ÀÌ ÇϳªµÎ ¾ø´Â°ÍÀÌ´Ù
		
		g_Network.Send2User(pMessage->dwID, (char*)&msg, sizeof(SEND_CHARSELECT_INFO));
		
		pInfo->crypto.SetInit( TRUE );		// init on	
		return;
	}

	msg.CharNum = (BYTE)(count);
	/// Á¤º¸¸¦ º¸³¾ ±¸Á¶Ã¼¿¡ °ªµé ¼¼ÆÃ 
	for( DWORD i=0; i<count; i++)
	{
		// ij¸¯ÅÍ ±âº»Á¤º¸ ¼ÂÆÃÇϴ°÷
		msg.BaseObjectInfo[i].dwObjectID = atoi((char*)pData[i].Data[eCL_ObjectID]);
		msg.StandingArrayNum[i] = atoi((char*)pData[i].Data[eCL_StandIndex]);
//		strcpy(msg.BaseObjectInfo[i].ObjectName, (char*)pData[i].Data[eCL_ObjectName]);
		SafeStrCpy( msg.BaseObjectInfo[i].ObjectName, (char*)pData[i].Data[eCL_ObjectName], MAX_NAME_LENGTH+1 );
		msg.BaseObjectInfo[i].ObjectState = 0;
		msg.ChrTotalInfo[i].FaceType = atoi((char*)pData[i].Data[eCL_BodyType]);
		msg.ChrTotalInfo[i].HairType = atoi((char*)pData[i].Data[eCL_HeadType]);
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Hat] = atoi((char*)pData[i].Data[eCL_Hat]);
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Weapon] = atoi((char*)pData[i].Data[eCL_Weapon]);
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Dress] = atoi((char*)pData[i].Data[eCL_Dress]);
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Shoes] = atoi((char*)pData[i].Data[eCL_shoes]);
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Ring1] = 0;
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Ring2] = 0;
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Cape] = 0;
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Necklace] = 0;
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Armlet] = 0;
		msg.ChrTotalInfo[i].WearedItemIdx[eWearedItem_Belt] = 0;	
		msg.ChrTotalInfo[i].Level = atoi((char*)pData[i].Data[eCL_Grade]);
		msg.ChrTotalInfo[i].LoginMapNum = atoi((char*)pData[i].Data[eCL_Map]);
		msg.ChrTotalInfo[i].Gender = atoi((char*)pData[i].Data[eCL_Gender]);
		msg.ChrTotalInfo[i].Height = atof((char*)pData[i].Data[eCL_Height]);
		msg.ChrTotalInfo[i].Width = atof((char*)pData[i].Data[eCL_Width]);

			
		pInfo->SelectInfoArray[i].dwCharacterID = msg.BaseObjectInfo[i].dwObjectID;
		pInfo->SelectInfoArray[i].Level = msg.ChrTotalInfo[i].Level;
		pInfo->SelectInfoArray[i].MapNum = msg.ChrTotalInfo[i].LoginMapNum;
		pInfo->SelectInfoArray[i].Gender = msg.ChrTotalInfo[i].Gender;
	}
	
	// ¼ÂÆÃÇÑ Ä³¸¯ Á¤º¸¸¦ º¸³½´Ù.
	g_Network.Send2User(pMessage->dwID, (char*)&msg, sizeof(SEND_CHARSELECT_INFO));

	pInfo->crypto.SetInit( TRUE );		// init on	
}

void	RCreateCharacter(LPQUERY pData, LPDBMESSAGE pMessage)
{
	int result = atoi((char*)pData->Data[0]);
	DWORD dwConnectionIndex = pMessage->dwID;

	switch(result)
	{
	case 0:
		{
			USERINFO* pInfo = g_pUserTable->FindUser(dwConnectionIndex);
			if(!pInfo)
			{
				MSGBASE msg;
				msg.Category = MP_USERCONN;
				msg.Protocol = MP_USERCONN_CHARACTER_MAKE_NACK;
				g_Network.Send2User(dwConnectionIndex, (char*)&msg, sizeof(msg));
				return;
			}

			ASSERT(pInfo->dwUserID);

			if(pInfo->dwUserID == 0)
			{
				ASSERTMSG(0, "UserID°¡ 0ÀÌ´Ù.");

				MSGBASE msg;
				msg.Category = MP_USERCONN;
				msg.Protocol = MP_USERCONN_CHARACTER_MAKE_NACK;
				g_Network.Send2User(dwConnectionIndex, (char*)&msg, sizeof(msg));
				return;
			}
			
			UserIDXSendAndCharacterBaseInfo(pInfo->dwUserID,pInfo->dwUniqueConnectIdx,dwConnectionIndex);
		}
		break;
	case 1:
		{
			// ij¸¯ÅͰ¡ ²Ëá´Ù.
			MSGBASE msg;
			msg.Category = MP_USERCONN;
			msg.Protocol = MP_USERCONN_CHARACTER_MAKE_NACK;
			g_Network.Send2User(dwConnectionIndex, (char*)&msg, sizeof(msg));
		}
		break;
	case 2:
		{
			// À̸§ÀÌ Áߺ¹µÊ ¿À·ù
			MSG_WORD msg;
			msg.Category = MP_USERCONN;
			msg.Protocol = MP_USERCONN_CHARACTER_NAMECHECK_NACK;
			msg.wData = result;
			g_Network.Send2User(dwConnectionIndex, (char*)&msg, sizeof(msg));
		}
		break;
	case 3:
		{
			// À̸§ÀÌ NULLÀ϶§

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -