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

📄 synattr.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// SynAttr.cpp: implementation of the CSynAttr class.
//
//////////////////////////////////////////////////////////////////////

#include "allmsg.h"
#include "common.h"
#include "SynAttr.h"
#include "MapGroup.h"
#include "AutoPtr.h"

//////////////////////////////////////////////////////////////////////
const int	MINI_SUB_SYN			= 20;				// 20人以下的子帮派,算迷你子帮派,堂主为“准堂主”


MYHEAP_IMPLEMENTATION(CSynAttr,s_heap)
char	szSynAttrTable[]	= _TBL_SYNATTR;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSynAttr::CSynAttr()
{
	m_pData	= NULL;
	m_nProfferInc=0;
}

//////////////////////////////////////////////////////////////////////
CSynAttr::~CSynAttr()
{
	SaveInfo();
	if(m_pData)
		m_pData->Release();
}

//////////////////////////////////////////////////////////////////////
CSynAttr* CSynAttr::CreateNew(PROCESS_ID idProcess, CUser* pUser)
{
	CSynAttr* pSynAttr = new CSynAttr;
	CHECKF(pSynAttr);

	pSynAttr->m_idProcess	= idProcess;
	pSynAttr->m_pUser		= pUser;

	return pSynAttr;
}

//////////////////////////////////////////////////////////////////////
// login
//////////////////////////////////////////////////////////////////////
bool CSynAttr::Create()
{
	CHECKF(CMapGroup::IsValidMapGroupProcessID(m_idProcess));
	CHECKF(!m_pData);
	CHECKF(m_pUser);

	m_pData	= CSynAttrData::CreateNew();
	CHECKF(m_pData);

	// 是否加入了帮派
	if(!m_pData->Create(m_pUser->GetID(), Database()))
	{
		SAFE_RELEASE (m_pData);			// 未加入帮派时,m_pData为NULL
		return true;
	}

	// 是否帮派删除了
	if(SynManager()->QuerySyndicate(GetSynID()) == NULL)
	{
		SAFE_RELEASE (m_pData);			// 未加入帮派时,m_pData为NULL
		return true;
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::SendInfoToClient()
{
	SynAttrInfoStruct	info;
	GetInfo(&info);

	CSyndicate* pSyn = SynManager()->QuerySyndicate(GetSynID());	// 可能为空
	if (pSyn)
		pSyn = pSyn->GetMasterSyn();

	CMsgSynAttrInfo msg;
	IF_OK(msg.Create(&info, pSyn))		// pSyn may be null
		m_pUser->SendMsg(&msg);

	return true;
}

//////////////////////////////////////////////////////////////////////
// MapGroup
//////////////////////////////////////////////////////////////////////
bool CSynAttr::SaveInfo()
{
	if(m_pData)
		return m_pData->Update();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::GetInfo(SynAttrInfoStruct* pInfo)
{
	CHECKF(pInfo);

	memset(pInfo, 0, sizeof(SynAttrInfoStruct));
	pInfo->id			= m_pUser->GetID();
	if(m_pData)
	{
		pInfo->idSyn		= m_pData->GetInt(SYNATTRDATA_SYNID);
		pInfo->ucRank		= m_pData->GetInt(SYNATTRDATA_RANK);
		pInfo->ucRankShow	= GetSynRankShow();
		pInfo->nProffer		= m_pData->GetInt(SYNATTRDATA_PROFFER);
		pInfo->nProfferInc	= m_pData->GetInt(SYNATTRDATA_PROFFERINC);
		pInfo->usMantle		= 0;
		pInfo->ucLevel		= m_pData->GetInt(SYNATTRDATA_MEMBERLEVEL);

	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::AppendSynAttr(SynAttrInfoStruct* pInfo)
{
	CHECKF(!m_pData);
	if(pInfo->idSyn != ID_NONE)
	{
		m_pData = CSynAttrData::CreateNew();
		CHECKF(m_pData);
		IF_NOT(m_pData->Create(GameDataDefault()->GetSynAttrData(), pInfo->id))
			return false;

		m_pData->SetInt(SYNATTRDATA_SYNID, pInfo->idSyn);
		m_pData->SetInt(SYNATTRDATA_RANK, pInfo->ucRank);
		m_pData->SetInt(SYNATTRDATA_PROFFER, pInfo->nProffer);
		m_pData->SetInt(SYNATTRDATA_PROFFERINC, pInfo->nProfferInc);
		m_pData->SetInt(SYNATTRDATA_MEMBERLEVEL, pInfo->ucLevel);
		m_pData->ClearUpdateFlags();
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::CreateSyndicate(LPCTSTR szName, int nLevel, int nMoney, int nMoneyLeave)
{
	CHECKF(!m_pData);

	if(m_pUser->GetLev() < nLevel)
	{
		m_pUser->SendSysMsg(STR_NOT_ENOUGH_LEV, nLevel);
		return false;
	}

	if(m_pUser->GetMoney() < nMoney)
	{
		m_pUser->SendSysMsg(STR_NOT_ENOUGH_MONEY, nMoney);
		return false;
	}

	CreateSyndicateInfo	info;
	info.idSyn	= ID_NONE;
	SafeCopy(info.szName, szName, _MAX_NAMESIZE);
	SafeCopy(info.szTenet, DEFAULT_TENET, MAX_TENETSIZE);
	SafeCopy(info.szLeaderTitle, DEFAULT_LEADERTITLE, _MAX_NAMESIZE);
	SafeCopy(info.szMemberTitle, DEFAULT_MEMBERTITLE, _MAX_NAMESIZE);
	info.idLeader	= m_pUser->GetID();
	SafeCopy(info.szLeader, m_pUser->GetName(), _MAX_NAMESIZE);
	info.nMoney		= nMoneyLeave;
	info.idFealty	= ID_NONE;
	info.nMantle	= 0;
	info.nSynFlag	= 0;

	OBJID idSyn = SynManager()->QueryModify()->CreateSyndicate(&info);
	if(idSyn == ID_NONE)
	{
		m_pUser->SendSysMsg(STR_FORBIDDEN_GUILD_NAME);
		return false;
	}

	if(!JoinSyn(idSyn, RANK_LEADER, nMoneyLeave))
	{
		::GmLogSave("错误:玩家[%s]创帮成功,但无法创建帮主记录!", m_pUser->GetName());
		LOGERROR("错误:玩家[%s]创帮成功,但无法创建帮主记录!", m_pUser->GetName());
	}
	CHECKF(m_pData);
	m_pUser->SpendMoney(nMoney, SYNCHRO_TRUE);
//	m_pData->SetInt(SYNATTRDATA_RANK, RANK_LEADER);
//	m_pData->Update();

	return true;
}

//////////////////////////////////////////////////////////////////////
//bool CSynAttr::CreateSubSyn(LPCTSTR szName, int nLevel, int nProffer, int nMoney, int nMoneyLeave)
//{
//	CHECKF(m_pData);
//
//	if(m_pUser->GetLev() < nLevel)
//	{
//		m_pUser->SendSysMsg(STR_NOT_ENOUGH_LEV, nLevel);
//		return false;
//	}
//	if (m_pUser->QuerySynProffer()<nProffer)
//	{
//		m_pUser->SendSysMsg(STR_SYN_SETSUBLEADER_NOPROFFER,nProffer);
//		return false;
//	}
//
//	CSyndicate* pFealty = SynManager()->QuerySyndicate(GetSynID());
//	CHECKF(pFealty);
//	if(pFealty->GetInt(SYNDATA_MONEY) < nMoney)
//	{
//		m_pUser->SendSysMsg(STR_GUILD_FUND_NOT_ENOUGH, nMoney);
//		return false;
//	}
//
//	CreateSyndicateInfo	info;
//	info.idSyn	= ID_NONE;
//	SafeCopy(info.szName, szName, _MAX_NAMESIZE);
//	SafeCopy(info.szTenet, DEFAULT_TENET, MAX_TENETSIZE);
//	SafeCopy(info.szLeaderTitle, DEFAULT_LEADERTITLE, _MAX_NAMESIZE);
//	SafeCopy(info.szMemberTitle, DEFAULT_MEMBERTITLE, _MAX_NAMESIZE);
//	info.idLeader	= m_pUser->GetID();
//	SafeCopy(info.szLeader, m_pUser->GetName(), _MAX_NAMESIZE);
//	info.nMoney		= nMoneyLeave;
//	info.idFealty	= GetSynID();
//
//	OBJID idNewSyn = SynManager()->QueryModify()->CreateSyndicate(&info);
//	if(idNewSyn == ID_NONE)
//	{
//		m_pUser->SendSysMsg(STR_FORBIDDEN_GUILD_NAME);
//		return false;
//	}
//
//	// update new leader
//	DelMemberList(GetSynID(), m_pUser->GetName());
//	AddMemberList(idNewSyn, m_pUser->GetName(), m_pUser->GetLev());
//	m_pData->SetInt(SYNATTRDATA_SYNID, idNewSyn);
//	m_pData->SetInt(SYNATTRDATA_RANK, RANK_LEADER);
////	m_pData->Update();
//// update later	SynchroInfo();
///*
//	// update syndicate
//	pFealty->QueryModify()->AddData(SYNDATA_MONEY, -1*nMoney);
//	pFealty->QueryModify()->AddData(SYNDATA_AMOUNT, -1);
//*/
//	// synchro relation
//	CMsgSyndicate	msg;
//	IF_OK(msg.Create(SET_SUBSYN, idNewSyn))
//		pFealty->BroadcastSynMsg(&msg);
//
//	return true;
//}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::ChangeLeader(LPCTSTR szSyn, int nLevel)
{
	CHECKF(m_pData);

	if(m_pUser->GetLev() < nLevel)
	{
		m_pUser->SendSysMsg(STR_NOT_ENOUGH_LEV, nLevel);
		return false;
	}

	CSyndicate* pSyn = SynManager()->QuerySyndicate(GetSynID());
	CHECKF(pSyn);

	CSyndicate* pTargetSyn = SynManager()->QuerySynByName(szSyn);
	if(!pTargetSyn)
	{
		m_pUser->SendSysMsg(STR_GUILD_INEXIST);
		return false;
	}

	// leave old leader
	OBJID idOldLeader = pTargetSyn->GetInt(SYNDATA_LEADERID);
/*	CUser* pOldLeader = UserManager()->GetUser(idOldLeader);
	if(pOldLeader)
	{
		pOldLeader->QuerySynAttr()->SetRank(RANK_NEWBIE, true);
	}
	else
	{
		SQLBUF	szSQL;
		sprintf(szSQL, "UPDATE %s SET syn_id=%u,rank=%d WHERE id=%u LIMIT 1", 
				_TBL_SYNATTR,
				pSyn->GetID(), RANK_NEWBIE, idOldLeader);
		Database()->ExecuteSQL(szSQL);

		char	buf[1024];
		REMOTE_CALL0* pInfo = (REMOTE_CALL0*)&buf;
		pInfo->idUser		= idOldLeader;
		pInfo->ucFuncType	= REMOTE_CALL_DROP_LEADER;
		pInfo->IntParam[0]	= pSyn->GetID();
		pInfo->IntParam[1]	= RANK_NEWBIE;
		pInfo->nSize		= sizeof(REMOTE_CALL0) + sizeof(int)*2;
		MapGroup(PID)->QueryIntraMsg()->RemoteCall(pInfo);
	}
*/
	// update new leader
//	m_pData->SetInt(SYNATTRDATA_SYNID, pTargetSyn->GetID());
//	m_pData->SetInt(SYNATTRDATA_RANK, RANK_LEADER);
//	m_pData->Update();
//	SynchroInfo();

	// update syndicate
//	pTargetSyn->QueryModify()->Demise(idOldLeader, m_pUser->GetID(), m_pUser->GetName(), pSyn->GetID(), true);
	CUser * pUser = UserManager()->GetUser(idOldLeader);
	pSyn->QueryModify()->Demise(idOldLeader, pUser->QuerySynAttr()->GetSynMemberLevel(),m_pUser->GetID(), m_pUser->GetName(),m_pUser->QuerySynAttr()->GetSynMemberLevel(), GetSynID(), true);

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::DestroySyndicate()
{
	CHECKF(m_pData);
	CHECKF(GetInt(SYNATTRDATA_RANK) == RANK_LEADER);

	SynManager()->QueryModify()->DestroySyndicate(GetSynID());
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::JoinSyn(OBJID idSyn, int nRank, int nProffer)
{
	CHECKF(!m_pData);

	m_pData	= CSynAttrData::CreateNew();
	CHECKF(m_pData);
	IF_NOT(m_pData->Create(GameDataDefault()->GetSynAttrData(), m_pUser->GetID()))
	{
		m_pData->Release();
		m_pData = NULL;
		return false;
	}
	// 注意:必须复写所有属性,以复盖旧记录。
	m_pData->SetInt(SYNATTRDATA_ID, m_pUser->GetID());
	m_pData->SetInt(SYNATTRDATA_SYNID, idSyn);
	m_pData->SetInt(SYNATTRDATA_RANK, nRank);
	m_pData->SetInt(SYNATTRDATA_PROFFER, nProffer);
	m_pData->SetInt(SYNATTRDATA_PROFFERINC, nProffer);
	//---jinggy---2004-12-7---刚加入帮派时,在线时间默认为 TIMEONLINE_FIRSTJOIN ---begin

	//刚加入时在线时间累加和为0,以后随着在线时间进行增加
	m_pData->SetInt(SYNATTRDATA_TIMEONLINE, 0);
	//加入帮派的时间
	time_t tm = time(NULL);
	m_pData->SetInt(SYNATTRDATA_TIMEDETECTED, (int)tm);

	//---jinggy---2004-12-7---刚加入帮派时,在线时间默认为 TIMEONLINE_FIRSTJOIN ---end

	if(m_pData->InsertRecord() != m_pUser->GetID())		//? 已有记录,改为UPDATE
	{
		m_pData->SetInt(SYNATTRDATA_SYNID, idSyn);
		m_pData->SetInt(SYNATTRDATA_RANK, nRank);
		m_pData->SetInt(SYNATTRDATA_PROFFER, nProffer);
		m_pData->SetInt(SYNATTRDATA_PROFFERINC, nProffer);
		m_pData->Update();
	}

	CSyndicate* pSyn = SynManager()->QuerySyndicate(GetSynID());
	if(pSyn)
	{
		pSyn->QueryModify()->AddData(SYNDATA_AMOUNT, 1);
		if (nRank!=RANK_LEADER || nRank!=RANK_RESERVED) //帮主创建帮派除外;预备团员也除外
		{
			pSyn->QueryModify()->AddData(SYNDATA_REPUTE, REPUTE_PER_MEMBER);	// 招一个人增加1000声望
			pSyn->QueryModify()->AddData(SYNDATA_MONEY, MONEY_PER_MEMBER);		// 招一个人增加10000基金
		}
	}

	AddMemberList(idSyn, m_pUser->GetName(), m_pUser->GetLev());

	// synchro
	SynchroInfo(true);
	if(pSyn)
		pSyn->SendInfoToClient(m_pUser);
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::AddMemberList(OBJID idSyn, LPCTSTR szName, int nLevel)
{
	MESSAGESTR	buf;
	SynFuncInfo0*	pInfo = (SynFuncInfo0*)&buf;
	pInfo->idSyn		= idSyn;
	pInfo->nRank		= this->GetSynRank();
	pInfo->nSynMemberLevel = this->GetSynMemberLevel();
	pInfo->ucFuncType	= SYNFUNC_ADD_MEMBER;
	SafeCopy(pInfo->StrParam, szName, _MAX_NAMESIZE);
	pInfo->ucSaveFlag		= true;
	pInfo->nSize		= sizeof(SynFuncInfo0) + _MAX_NAMESIZE;
	MapGroup(PID)->QuerySynMessage()->ChangeSyndicate(pInfo);

	return true;
}

//////////////////////////////////////////////////////////////////////
void CSynAttr::UpLevel(int nLevel)
{
	CHECK(GetSynID());

	MESSAGESTR	buf;
	SynFuncInfo0*	pInfo = (SynFuncInfo0*)&buf;
	pInfo->idSyn		= GetSynID();
	pInfo->ucFuncType	= SYNFUNC_UP_LEVEL;
	pInfo->IntParam[0]	= m_pUser->GetLev();
	SafeCopy((char*)&pInfo->IntParam[1], m_pUser->GetName(), _MAX_NAMESIZE);
	pInfo->ucSaveFlag		= true;
	pInfo->nSize		= sizeof(SynFuncInfo0) + sizeof(int) + _MAX_NAMESIZE;
	MapGroup(PID)->QuerySynMessage()->ChangeSyndicate(pInfo);
}

//////////////////////////////////////////////////////////////////////
void CSynAttr::SynchroInfo(BOOL bAnnounce)		// 修改后,广播自己的属性
{
	SynAttrInfoStruct	info;
	GetInfo(&info);
	CSyndicate* pSyn = SynManager()->QuerySyndicate(GetSynID());
	CMsgSynAttrInfo msg;
	IF_OK(msg.Create(&info, pSyn))		// pSyn may be null
		m_pUser->SendMsg(&msg);

	CMsgPlayer msgPlayer;
	IF_OK(msgPlayer.Create(m_pUser->QueryRole()))
		m_pUser->BroadcastRoomMsg(&msgPlayer, INCLUDE_SELF);
	
	if(bAnnounce)
	{
		LPCTSTR pAnnounce = "";
		if(pSyn)
		{
			CSyndicate* pMaster = pSyn->GetMasterSyn();
			ASSERT(pMaster);
			pAnnounce = pMaster->GetStr(SYNDATA_ANNOUNCE);
		}
		m_pUser->SendSysMsg(_TXTATR_SYNANNOUNCE, pAnnounce);
	}
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::LeaveSyn(bool bKickout/*=false*/, bool bDeleteRecord/*=true*/, bool bSynchro/*=true*/)		// false: 用于帮派解散
{
	CHECKF(m_pData);

	OBJID idOldSyn = GetSynID();

⌨️ 快捷键说明

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