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

📄 synworldshell.cpp

📁 魔域的服务端源代码。Visual C++编译的版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SynWorldShell.cpp: implementation of the CSyndicateWorld class.
//
//////////////////////////////////////////////////////////////////////

#define	_WINSOCKAPI_		// 阻止加载winsock.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	SYNMONEY_LIMIT		= 2000000000;		// 基金的限制额
const int	MEMBERLIST_SIZE		= 18;				// 帮众列表的每次数量
const int	MEMBERLIST_LIMIT	= 1234567890;		// 帮众列表的限制额

MYHEAP_IMPLEMENTATION(CSyndicateWorld,s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSyndicateWorld::CSyndicateWorld()
{
	m_pData	= NULL;
	m_ptrMsgBd	= CMessageBoard::CreateNew(_TXTATR_MSG_SYN);
}

//////////////////////////////////////////////////////////////////////
CSyndicateWorld::~CSyndicateWorld()
{
	if(m_pData)
	{
		m_pData->Update();
		m_pData->Release();
	}
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::Create(IRecordset* pRes)
{
	ASSERT(!m_pData);

	m_pData = CSynWorldBase::CreateNew();
	CHECKF(m_pData);
	IF_NOT(m_pData->Create(pRes))
		return false;

	if(m_pData->GetInt(SYNDATA_DEL_FLAG) != 0)		// 已删除的帮派
		return false;

	// 统计帮派人数
	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT COUNT(*) FROM %s as s LEFT JOIN %s AS u ON u.id=s.id WHERE s.syn_id=%u && u.id IS NOT NULL", _TBL_SYNATTR, _TBL_USER, m_pData->GetID());
	IRecordset* pStatRes = GameWorld()->GetDatabase()->CreateNewRecordset(szSQL);
	if(pStatRes)
	{
		m_pData->SetInt(SYNDATA_AMOUNT, pStatRes->GetInt(0));	// 0: count
		m_pData->Update();
		pStatRes->Release();
	}

	// 载入帮众列表
	sprintf(szSQL, "SELECT u.name, s.rank FROM %s as s LEFT JOIN %s AS u ON u.id=s.id WHERE s.syn_id=%u && u.id IS NOT NULL ORDER BY s.rank DESC, u.name LIMIT %d",
			_TBL_SYNATTR, _TBL_USER, m_pData->GetID(), MEMBERLIST_LIMIT);
	 pStatRes = GameWorld()->GetDatabase()->CreateNewRecordset(szSQL);
	if(pStatRes)
	{
		for(int i = 0; i < pStatRes->RecordCount(); i++,pStatRes->MoveNext())
		{
			m_setMember.push_back(MemberInfo(pStatRes->GetStr(0), pStatRes->GetInt(1)));	// 0: name, 1: rank
		}
		pStatRes->Release();
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::Create(IRecordset* pDefault, const CreateSyndicateInfo* pInfo, bool bSave)
{
	ASSERT(!m_pData);

	OBJID idSyn = bSave ? ID_NONE : pInfo->idSyn;
	m_pData = CSynWorldBase::CreateNew();
	CHECKF(m_pData);
	IF_NOT(m_pData->Create(pDefault, idSyn))
		return false;

	m_pData->SetInt(SYNDATA_ID, idSyn);
	m_pData->SetStr(SYNDATA_NAME, pInfo->szName, _MAX_NAMESIZE);
	m_pData->SetStr(SYNDATA_TENET, pInfo->szTenet, MAX_TENETSIZE);
	m_pData->SetStr(SYNDATA_ANNOUNCE, pInfo->szLeaderTitle, MAX_TENETSIZE);
	m_pData->SetStr(SYNDATA_MEMBERTITLE, pInfo->szMemberTitle, _MAX_NAMESIZE);
	m_pData->SetInt(SYNDATA_LEADERID, pInfo->idLeader);
	m_pData->SetStr(SYNDATA_LEADERNAME, pInfo->szLeader, _MAX_NAMESIZE);
	m_pData->SetInt(SYNDATA_MONEY, pInfo->nMoney);
	m_pData->SetInt(SYNDATA_FEALTY, pInfo->idFealty);
	m_pData->SetInt(SYNDATA_MANTLE_FALG, pInfo->nMantle);
	m_pData->SetInt(SYNDATA_RANK, 1);
	m_pData->SetInt(SYNDATA_REPUTE, 0);
	if(bSave)
	{
		return m_pData->InsertRecord() != ID_NONE;
	}
	else
	{
		m_pData->ClearUpdateFlags();
		return true;
	}
}

//////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::Demise(OBJID idOldLeader,int nOldSynMemberLevel,OBJID idNewLeader, LPCTSTR szNewLeader, int nNewSynMemberLevel, OBJID idBackSyn, bool bSave)	
{
	if(!( idOldLeader==(OBJID)m_pData->GetInt(SYNDATA_LEADERID) || (OBJID)m_pData->GetInt(SYNDATA_LEADERID)==ID_NONE ))	//? 兼容于旧数据
		return false;
	NAMESTR	szOldLeader;
	SafeCopy(szOldLeader, m_pData->GetStr(SYNDATA_LEADERNAME), _MAX_NAMESIZE);
	m_pData->SetInt(SYNDATA_LEADERID, idNewLeader);
	m_pData->SetStr(SYNDATA_LEADERNAME, szNewLeader, _MAX_NAMESIZE);
	if(bSave)
		m_pData->Update();
	else
		m_pData->ClearUpdateFlags();

	int	RANK_NEWBIE		= 20;
	int RANK_LEADER		=100;
	SQLBUF	szSQL;
	sprintf(szSQL, "UPDATE %s SET syn_id=%u,rank=%d WHERE id=%u LIMIT 1",
			_TBL_SYNATTR, idBackSyn, RANK_NEWBIE, idOldLeader);
	GameWorld()->GetDatabase()->ExecuteSQL(szSQL);

	// synchro member list
	if(GetID() != idBackSyn)
	{
		CSyndicateWorld * pBackSyn = SynWorldManager()->QuerySyndicate(idBackSyn);
		IF_OK(pBackSyn)
		{
			DelMember(szOldLeader);
			pBackSyn->AddMember(szOldLeader, RANK_NEWBIE);
			pBackSyn->DelMember(szNewLeader);
			AddMember(szNewLeader, RANK_LEADER);
		}
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::SetTenet(LPCTSTR szTenet, bool bSave)		
{
	CHECKF(strlen(szTenet)<MAX_TENETSIZE);
	
	m_pData->SetStr(SYNDATA_TENET, szTenet, MAX_TENETSIZE);
	if(bSave)
		m_pData->Update();
	else
		m_pData->ClearUpdateFlags();
	return true; 
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::SetLeaderTitle(LPCTSTR szLeaderTitle, bool bSave)		
{
	m_pData->SetStr(SYNDATA_ANNOUNCE, szLeaderTitle, MAX_TENETSIZE);
	if(bSave)
		m_pData->Update();
	else
		m_pData->ClearUpdateFlags();
	return true; 
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::SetMemberTitle(LPCTSTR szMemberTitle, bool bSave)		
{
	m_pData->SetStr(SYNDATA_MEMBERTITLE, szMemberTitle, _MAX_NAMESIZE);
	if(bSave)
		m_pData->Update();
	else
		m_pData->ClearUpdateFlags();
	return true; 
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::AddData(SYNDATA idx, int nData, bool bSave)
{
	int nAllData = ::AddToTop(m_pData->GetInt(idx), nData, SYNMONEY_LIMIT);		// 用于金钱和帮众数量
	m_pData->SetInt(idx, nAllData);
	if(bSave)
		m_pData->Update();
	else
		m_pData->ClearUpdateFlags();
	return true; 
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::SetData(SYNDATA idx, int nData, bool bSave)
{
	m_pData->SetInt(idx, nData);
	if(bSave)
		m_pData->Update();
	else
		m_pData->ClearUpdateFlags();
	return true; 
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::PresentMoney(OBJID idSyn, int nMoney, bool bSave)
{
	if(nMoney <= 0 || m_pData->GetInt(SYNDATA_MONEY) < nMoney)
		return false;
	CSyndicateWorld* pTarget = GameWorld()->QuerySynManager()->QuerySyndicate(idSyn);
	if(!pTarget)
		return false;

	m_pData->SetInt(SYNDATA_MONEY, m_pData->GetInt(SYNDATA_MONEY)-nMoney);
	pTarget->m_pData->SetInt(SYNDATA_MONEY, pTarget->m_pData->GetInt(SYNDATA_MONEY)+nMoney);
	if(bSave)
	{
		m_pData->Update();
		pTarget->m_pData->Update();
	}
	else
	{
		m_pData->ClearUpdateFlags();
		pTarget->m_pData->ClearUpdateFlags();
	}
	::GmLogSave("EVENT: 帮派[%s]向帮派[%s]划拨基金[%d]两银子。", GetStr(SYNDATA_NAME), pTarget->GetStr(SYNDATA_NAME), nMoney);
	return true; 
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::SetSynName(LPCTSTR szSynName, bool bSave)		
{
	m_pData->SetStr(SYNDATA_NAME, szSynName, MAX_TENETSIZE);
	if(bSave)
		m_pData->Update();
	else
		m_pData->ClearUpdateFlags();
	return true; 
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::ChangeSyndicate(const SynFuncInfo0* pFuncInfo)
{
	bool ret = false;
	switch(pFuncInfo->ucFuncType)
	{
	case	SYNFUNC_DEMISE:
		ret = Demise(pFuncInfo->IntParam[0], pFuncInfo->IntParam[3],pFuncInfo->IntParam[1], (LPCTSTR)&pFuncInfo->IntParam[5], pFuncInfo->IntParam[2],pFuncInfo->IntParam[4], pFuncInfo->ucSaveFlag!=0);
		break;
	case	SYNFUNC_SETTENET:
		ret = (SetTenet(pFuncInfo->StrParam, pFuncInfo->ucSaveFlag!=0)
				&& SetData(SYNDATA_PUBLISHTIME, pFuncInfo->dwData[0], pFuncInfo->ucSaveFlag!=0));
		break;
	case	SYNFUNC_SETLEADERTITLE:
		ret = SetLeaderTitle(pFuncInfo->StrParam, pFuncInfo->ucSaveFlag!=0);
		break;
	case	SYNFUNC_SETMEMBERTITLE:
		ret = SetMemberTitle(pFuncInfo->StrParam, pFuncInfo->ucSaveFlag!=0);
		break;
	case	SYNFUNC_ADDDATA:
		ret = AddData((SYNDATA)pFuncInfo->IntParam[0], pFuncInfo->IntParam[1], pFuncInfo->ucSaveFlag!=0);
		break;
	case	SYNFUNC_SETDATA:
		ret = SetData((SYNDATA)pFuncInfo->IntParam[0], pFuncInfo->IntParam[1], pFuncInfo->ucSaveFlag!=0);
		break;
	case	SYNFUNC_PRESENT:
		ret = PresentMoney(pFuncInfo->IntParam[0], pFuncInfo->IntParam[1], pFuncInfo->ucSaveFlag!=0);
		break;
	case	SYNFUNC_SETSYNNAME:
		ret = SetSynName(pFuncInfo->StrParam, pFuncInfo->ucSaveFlag!=0);
		break;
	case	SYNFUNC_ADD_MEMBER:
		ret = AddMember(pFuncInfo->StrParam, pFuncInfo->nRank);
		return ret;		// not broadcast
		break;
	case	SYNFUNC_DEL_MEMBER:
		ret = DelMember(pFuncInfo->StrParam);
		return ret;		// not broadcast
		break;
	default:
		ASSERT(!"switch CSynShell::ChangeSyndicate()");
		return false;
		break;
	}

	if(ret)
	{
		// broadcast
		MESSAGESTR	buf;
		SynFuncInfo0*	pInfo = (SynFuncInfo0*)buf;
		memcpy(buf, pFuncInfo, MAX_MESSAGESIZE);
		pInfo->ucSaveFlag	= (unsigned char)false;
		GameWorld()->QuerySynMessage()->ChangeSyndicate(pInfo);
	}

	return ret;
}

//////////////////////////////////////////////////////////////////////
bool CSyndicateWorld::AddMember(LPCTSTR szName, int nUserRank)
{
	CHECKF(szName);
	ASSERT(!DelMember(szName));

	m_setMember.push_back(MemberInfo(szName, nUserRank));
	return true;

⌨️ 快捷键说明

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