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

📄 supermanlist.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
字号:
// SupermanList.cpp: implementation of the CSupermanList class.
//
//////////////////////////////////////////////////////////////////////

#define	_WINSOCKAPI_		// 阻止加载winsock.h
#include "SupermanList.h"
#include "AllMsg.h"
#include "I_MessagePort.h"
#include "define.h"
#include "MessageBoard.h"
#include "UserList.h"
#include "SynWorldShell.h"
#include "WorldKernel.h"

const int	SUPERMAN_GROUP1			= 3;
const int	SUPERMAN_GROUP2			= 50;
const int	SUPERMAN_SIZE			= 100;
enum { 
		RANK_0	= 0,
		RANK_3	= 1,
		RANK_2	= 2,
		RANK_1	= 3,
};
//////////////////////////////////////////////////////////////////////
int RankOfIndex(int nPos)
{
	int nRank = RANK_0;
	if(nPos >= 0 && nPos < SUPERMAN_GROUP1)
		nRank = RANK_1;
	else if(nPos >= SUPERMAN_GROUP1 && nPos < SUPERMAN_GROUP2)
		nRank = RANK_2;
	else if(nPos >= SUPERMAN_GROUP2 && nPos < SUPERMAN_SIZE)
		nRank = RANK_3;

	return nRank;
}

MYHEAP_IMPLEMENTATION(CSupermanList,s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSupermanList::CSupermanList()
{

}

//////////////////////////////////////////////////////////////////////
CSupermanList::~CSupermanList()
{

}

//////////////////////////////////////////////////////////////////////
bool CSupermanList::Create(IDatabase* pDb)
{
	char szSQL[1024];
	sprintf(szSQL, "SELECT s.id,s.number,u.name FROM %s AS s LEFT JOIN %s AS u ON u.id=s.id ORDER BY number DESC LIMIT 100", _TBL_SUPERMAN, _TBL_USER);
	IRecordset* pRes = pDb->CreateNewRecordset(szSQL, false);

	if (pRes)
	{
		int	nAmount = pRes->RecordCount();
		for(int i = 0; i < nAmount; i++,pRes->MoveNext())
		{
			SUPERMAN_INFO	info;
			info.id			= pRes->LoadDWord("id");
			info.dwNumber	= pRes->LoadDWord("number");
			pRes->LoadString(info.szName, "name", _MAX_NAMESIZE);
			m_setUser.push_back(info);
		}
		pRes->Release();
	}
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSupermanList::AddMember(OBJID idUser, int nNumber)
{
	CPlayer* pUser = UserList()->GetPlayer(idUser);
	CHECKF(pUser);

	if(m_setUser.size() >= SUPERMAN_SIZE)
	{
		int nMin = m_setUser[m_setUser.size() - 1].dwNumber;
		if(nNumber <= nMin)
			return false;
	}

	int nOldPos = -1, nNewPos = -1;
	int nAmount = m_setUser.size();
	for(int i = 0; i < nAmount; i++)
	{
		if(nOldPos == -1 && m_setUser[i].id == idUser)
			nOldPos	= i;
		if(nNewPos == -1 && m_setUser[i].dwNumber < nNumber)
			nNewPos	= i;
	}

	int nOldRank = RankOfIndex(nOldPos);
	if(nOldPos != -1)
	{
		m_setUser.erase(m_setUser.begin() + nOldPos);
		if(nOldPos < nNewPos)
			nNewPos--;
	}

	if(nNewPos == -1)
		nNewPos	= m_setUser.size();
	int nNewRank = RankOfIndex(nNewPos);

	SUPERMAN_INFO	info;
	info.id			= idUser;
	info.dwNumber	= nNumber;
	SafeCopy(info.szName, pUser->szName, _MAX_NAMESIZE);
	m_setUser.insert(m_setUser.begin() + nNewPos, info);

	if(m_setUser.size() > SUPERMAN_SIZE)
	{
		SynchroInfo(m_setUser[SUPERMAN_SIZE].id, RANK_0);
		DeleteInfo(m_setUser[SUPERMAN_SIZE].id);
		m_setUser.resize(SUPERMAN_SIZE);
	}

	if(nOldRank != nNewRank)
	{
		SynchroInfo(idUser, nNewRank);

		if(nNewRank == RANK_1 && m_setUser.size() > SUPERMAN_GROUP1)
			SynchroInfo(m_setUser[SUPERMAN_GROUP1].id, RANK_2);
		if((nNewRank == RANK_1 && nOldRank < RANK_2 || nNewRank == RANK_2) && m_setUser.size() > SUPERMAN_GROUP2)
			SynchroInfo(m_setUser[SUPERMAN_GROUP2].id, RANK_3);
	}
	if(nOldRank == RANK_0)
		InsertInfo(idUser, nNumber, pUser->szName);
	else
		UpdateInfo(idUser, nNumber);

	if(nNewRank > nOldRank)
	{
		MSGBUF	szMsg;
		sprintf(szMsg, STR_SUPERMAN_BROADCAST_sddd, pUser->szName, nNumber, nNewPos+1, nNewRank);		// +1: 0 base to 1 base
		CMsgTalk	msg;
		IF_OK(msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szMsg))
			UserList()->BroadcastMsg(&msg);
	}
	else //if(nNewPos < nOldPos)
	{
		MSGBUF	szMsg;
		sprintf(szMsg, STR_SUPERMAN_BROADCAST_sddd, pUser->szName, nNumber, nNewPos+1, nNewRank);		// +1: 0 base to 1 base
		CMsgTalk	msg;
		IF_OK(msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szMsg))
			pUser->SendMsg(&msg);
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
void CSupermanList::QueryMember(OBJID idUser)
{
	int nAmount = m_setUser.size();
	for(int i = 0; i < nAmount; i++)
	{
		if(m_setUser[i].id == idUser)
		{
			SynchroInfo(idUser, RankOfIndex(i));
			return ;
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CSupermanList::SynchroInfo(OBJID idUser, int nRank)
{
	char	buf[sizeof(long)*2];
	VARIANT_SET0* pInfo = (VARIANT_SET0*)buf;
	pInfo->IntParam(0)	= idUser;
	pInfo->IntParam(1)	= nRank;

	IMessagePort* pPort = GameWorld()->GetMsgPort();
	for(int i = MSGPORT_MAPGROUP_FIRST; i < pPort->GetSize(); i++)
	{
		pPort->Send(i, KERNEL_SUPERMANLIST, STRUCT_TYPE(buf), buf);
	}
}

//////////////////////////////////////////////////////////////////////
void CSupermanList::InsertInfo(OBJID idUser, int nNumber, LPCTSTR szName)
{
	SQLBUF	szSQL;
	sprintf(szSQL, "INSERT %s SET id=%u,number=%d,name='%s'", _TBL_SUPERMAN, idUser, nNumber, szName);
	GameWorld()->GetDatabase()->ExecuteSQL(szSQL);
}

//////////////////////////////////////////////////////////////////////
void CSupermanList::UpdateInfo(OBJID idUser, int nNumber)
{
	SQLBUF	szSQL;
	sprintf(szSQL, "UPDATE %s SET number=%d WHERE id=%u LIMIT 1", _TBL_SUPERMAN, nNumber, idUser);
	GameWorld()->GetDatabase()->ExecuteSQL(szSQL);
}

//////////////////////////////////////////////////////////////////////
void CSupermanList::DeleteInfo(OBJID idUser)
{
	SQLBUF	szSQL;
	sprintf(szSQL, "DELETE FROM %s WHERE id=%u LIMIT 1", _TBL_SUPERMAN, idUser);
	GameWorld()->GetDatabase()->ExecuteSQL(szSQL);
}

//////////////////////////////////////////////////////////////////////
void CSupermanList::SendList(OBJID idUser, int idx, int nNumber, OBJID idxTask)
{
	CHECK(idx >= 0);

	CPlayer* pUser = UserList()->GetPlayer(idUser);
	if(!pUser)
		return ;

	// title
	{
		int		nData = 0;
		CMsgDialog	msg;
		IF_OK(msg.Create(MSGDIALOG_TEXT, STR_KO_LIST_TITLE, INDEX_NONE, nData))
			pUser->SendMsg(&msg);
		IF_OK_(msg.Create(MSGDIALOG_TEXT, "-------------------------", INDEX_NONE, nData))
			pUser->SendMsg(&msg);
	}
	for(int i = idx; i < idx+nNumber && i < m_setUser.size(); i++)
	{
		{
			char	szMsg[256];
			sprintf(szMsg, "%3d %-16s %d", i+1, m_setUser[i].szName, m_setUser[i].dwNumber);
			int		nData = 0;
			CMsgDialog	msg;
			IF_OK(msg.Create(MSGDIALOG_TEXT, szMsg, INDEX_NONE, nData))
				pUser->SendMsg(&msg);
		}
	}

	{
		int		nData = 0;
		CMsgDialog	msg;
		IF_OK_(msg.Create(MSGDIALOG_TEXT, "-------------------------", INDEX_NONE, nData))
			pUser->SendMsg(&msg);
	}
	if(i >= idx+nNumber)
	{
		int		nData = 0;
		CMsgDialog	msg;
		IF_OK(msg.Create(MSGDIALOG_LINK, STR_NEXT_PAGE, idxTask, nData))
			pUser->SendMsg(&msg);
	}
	{
		int		nData = 0;
		CMsgDialog	msg;
		IF_OK(msg.Create(MSGDIALOG_LINK, STR_CLOSE_BUTTON, INDEX_NONE, nData))
			pUser->SendMsg(&msg);
	}

	CMsgDialog	msg;
	IF_OK(msg.Create(MSGDIALOG_CREATE, INDEX_NONE))
		pUser->SendMsg(&msg);
}




⌨️ 快捷键说明

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