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

📄 synattr.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if(bDeleteRecord)
		m_pData->DeleteRecord();
	m_pData->Release();
	m_pData	= NULL;

	if(bSynchro)
	{
		CSyndicate* pSyn = SynManager()->QuerySyndicate(idOldSyn);
		IF_OK(pSyn && pSyn->GetInt(SYNDATA_AMOUNT) > 0)
		{
			pSyn->QueryModify()->AddData(SYNDATA_AMOUNT, -1);
			if (bKickout)
			{
				pSyn->QueryModify()->AddData(SYNDATA_REPUTE, -1*REPUTE_KICKOUT);		// 踢出帮派扣声望
				pSyn->QueryModify()->AddData(SYNDATA_MONEY, -1*MONEY_KICKOUT);			// 踢出帮派扣的基金
			}
			else
			{
				pSyn->QueryModify()->AddData(SYNDATA_REPUTE, -1*REPUTE_PER_MEMBER_OUT);		// 主动脱离帮派扣帮派的声望
				pSyn->QueryModify()->AddData(SYNDATA_MONEY, -1*MONEY_PER_MEMBER_OUT);		// 主动脱离帮派减少的基金
			}
		}

		DelMemberList(idOldSyn, m_pUser->GetName());
		SynchroInfo();
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::DelMemberList(OBJID idOldSyn, LPCTSTR szName)
{
	MESSAGESTR	buf;
	SynFuncInfo0*	pInfo = (SynFuncInfo0*)&buf;
	pInfo->idSyn		= idOldSyn;
	pInfo->nRank		= this->GetSynRank();
	pInfo->nSynMemberLevel = this->GetSynMemberLevel();

	pInfo->ucFuncType	= SYNFUNC_DEL_MEMBER;
	SafeCopy(pInfo->StrParam, szName, _MAX_NAMESIZE);
	pInfo->ucSaveFlag		= true;
	pInfo->nSize		= sizeof(SynFuncInfo0) + _MAX_NAMESIZE;
	MapGroup(PID)->QuerySynMessage()->ChangeSyndicate(pInfo);

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::DonateMoney(int nMoney)
{
	if(!m_pData)
		return false;

	if(nMoney <= 0)
		return false;

	// 检查帮派
	CSynPtr pSyn = SynManager()->QuerySyndicate(GetSynID());
	// 检查同步
	if(!pSyn)
		return false;
	pSyn = pSyn->GetMasterSyn();
	CHECKF(pSyn);

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

	if(pSyn->QueryModify()->AddData(SYNDATA_MONEY, nMoney))
	{
		m_pUser->SpendMoney(nMoney, SYNCHRO_TRUE);
		AddProffer(nMoney);

		MSGBUF szMsg;
		sprintf(szMsg, STR_DONATE_ssd, m_pUser->GetName(), nMoney);
		CMsgTalk	msg;
		IF_OK (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szMsg, NULL, 0xFFFFFF, _TXTATR_SYNDICATE))
			pSyn->BroadcastSynMsg(&msg);

		if(nMoney >= CHANGELEADER_MONEY)
			ChangeLeader();

		SynchroInfo();
		return true;
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::AddProffer(int nData)
{
	CHECKF(m_pData && nData > 0);

	int	nProffer = ::AddToTop(m_pData->GetInt(SYNATTRDATA_PROFFER), nData, SYNPROFFER_LIMIT);
	m_pData->SetInt(SYNATTRDATA_PROFFER, nProffer);

	//---jinggy---添加贡献值的累加值---begin
	nProffer = ::AddToTop(m_pData->GetInt(SYNATTRDATA_PROFFERINC), nData, SYNPROFFER_LIMIT);
	m_pData->SetInt(SYNATTRDATA_PROFFERINC, nProffer);

	m_nProfferInc += nData;
	if(m_nProfferInc>=200)
	{
		AddProfferToLeader(m_nProfferInc);
		m_nProfferInc =0;
	}
	//---jinggy---添加贡献值的累加值---end
	// synchro
	CMsgUserAttrib	msg;
	IF_OK(msg.Create(m_pUser->GetID(), _USERATTRIB_PROFFER, nProffer))
		m_pUser->SendMsg(&msg);
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::DecProffer(int nData)
{
	CHECKF(m_pData && nData > 0);

	int	nProffer = __max(0, (int)m_pData->GetInt(SYNATTRDATA_PROFFER) - nData);
	m_pData->SetInt(SYNATTRDATA_PROFFER, nProffer);

	// synchro
	CMsgUserAttrib	msg;
	IF_OK(msg.Create(m_pUser->GetID(), _USERATTRIB_PROFFER, nProffer))
		m_pUser->SendMsg(&msg);

	return true;
}

//////////////////////////////////////////////////////////////////////
void CSynAttr::SetProffer(int nData)
{
	CHECK (m_pData && nData > 0);
	nData = __min(nData, SYNPROFFER_LIMIT);

	m_pData->SetInt(SYNATTRDATA_PROFFER, nData);

	// synchro
	CMsgUserAttrib	msg;
	IF_OK(msg.Create(m_pUser->GetID(), _USERATTRIB_PROFFER, nData))
		m_pUser->SendMsg(&msg);
}

//////////////////////////////////////////////////////////////////////
// 帮主不在时,代替帮主
bool CSynAttr::ChangeLeader()
{
	CHECKF(m_pData);

	CSynPtr pSyn = SynManager()->QuerySyndicate(GetSynID());
	CHECKF(pSyn);

	OBJID idOldLeader = pSyn->GetInt(SYNDATA_LEADERID);
	if(UserManager()->GetUser(idOldLeader))
		return false;

	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT * FROM %s WHERE rank=%d && syn_id=%u", _TBL_SYNATTR, RANK_LEADER, pSyn->GetID());
	IRecordset* pRes = Database()->CreateNewRecordset(szSQL);		// VVVVVVVVVVVVVVVVVV
	if(pRes)
	{
		IF_NOT_(pRes->RecordCount() <= 1 && pRes->LoadDWord("id") == idOldLeader)
		{
			pRes->Release();		// AAAAAAAAAAAAAAAAAAAAAAAAAA
			return false;
		}
		sprintf(szSQL, "SELECT * FROM %s WHERE id=%u", _TBL_USER, idOldLeader);
		IRecordset* pUserRes = Database()->CreateNewRecordset(szSQL);
		if(pUserRes)
		{
			int nLastLogin = pUserRes->LoadDWord("last_login");
			pUserRes->Release();

			if(::DateStamp() <= ::DateStampPass(nLastLogin, CHANGELEADER_DAYS))
			{
				pRes->Release();		// AAAAAAAAAAAAAAAAAAAAAAAAAA
				return false;
			}

			pRes->SetInt(SYNATTRDATA_RANK, RANK_NEWBIE);
			pRes->UpdateRecord();
		}

		pRes->Release();		// AAAAAAAAAAAAAAAAAAAAAAAAAA
	}

	MSGBUF	szMsg;
	sprintf(szMsg, STR_SYN_LEADER_LOSE_uss, pSyn->GetID(), pSyn->GetStr(SYNDATA_NAME), m_pUser->GetName());
	::GmLogSave(szMsg);
	LOGMSG(szMsg);

	sprintf(szSQL, "SELECT * FROM %s WHERE rank=%d && syn_id=%u", _TBL_SYNATTR, RANK_LEADER, pSyn->GetID());
	IRecordset* pTempRes = Database()->CreateNewRecordset(szSQL);		//??? 有共享冲突。此时检查,下面修改,可能会出多个帮主
	if(pTempRes)
	{
		pTempRes->Release();
		return false;
	}
	CUser * pUser = UserManager()->GetUser(idOldLeader);
	pSyn->QueryModify()->Demise(idOldLeader, pUser->QuerySynAttr()->GetSynMemberLevel(),m_pUser->GetID(), m_pUser->GetName(),m_pUser->QuerySynAttr()->GetSynMemberLevel(), GetSynID(), true);
//	m_pData->SetInt(SYNATTRDATA_RANK, RANK_LEADER);
//	m_pData->Update();		//??? 有共享冲突。此时修改,上面检查
//	SynchroInfo();

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::SetRank(int nRank, bool bLeader /*= false*/)
{
	CHECKF(nRank != RANK_LEADER && m_pData->GetInt(SYNATTRDATA_RANK) != RANK_LEADER || bLeader);

	m_pData->SetInt(SYNATTRDATA_RANK, nRank);
	if(bLeader)
		m_pData->Update();

	SynchroInfo();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::SetIdRank(OBJID idSyn, int nRank, bool bSynchro)
{
	m_pData->SetInt(SYNATTRDATA_SYNID, idSyn);
	m_pData->SetInt(SYNATTRDATA_RANK, nRank);
	m_pData->Update();

	if(bSynchro)
		SynchroInfo();
	return true;
}

//////////////////////////////////////////////////////////////////////
int CSynAttr::GetAssistantCount()
{
	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 && s.rank=%d && u.id IS NOT NULL", _TBL_SYNATTR, _TBL_USER, GetSynID(), RANK_SUBLEADER);
	CAutoPtr<IRecordset> pStatRes = Database()->CreateNewRecordset(szSQL);
	IF_OK(pStatRes)
		return pStatRes->GetInt(0);

	ASSERT(!"GetAssistantCount");
	return MAX_ASSISTANTSIZE;			// prevent add assistant
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::KickoutMember(LPCTSTR szTarget)
{
	CHECKF(szTarget);

	OBJID idSyn = GetSynID();

	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT id FROM %s WHERE name='%s' LIMIT 1", _TBL_USER, szTarget);
	IRecordset* pRes = Database()->CreateNewRecordset(szSQL);
	if(!pRes)
		return false;		// not this name
	OBJID idUser = pRes->GetInt(0);			// 0: id
	pRes->Release();

	sprintf(szSQL, "DELETE FROM %s WHERE id=%u && syn_id=%u && rank!=%u LIMIT 1", _TBL_SYNATTR, idUser, idSyn, RANK_LEADER);
	Database()->ExecuteSQL(szSQL);

	// remote call
	char	buf[1024];
	REMOTE_CALL0* pInfo = (REMOTE_CALL0*)&buf;
	pInfo->idUser		= idUser;
	pInfo->ucFuncType	= REMOTE_CALL_LEAVE_SYN;
	pInfo->IntParam[0]	= GetSynID();
	SafeCopy((char*)&pInfo->IntParam[1], m_pUser->GetName(), _MAX_NAMESIZE);
	pInfo->nSize		= sizeof(REMOTE_CALL0) + sizeof(int) + _MAX_NAMESIZE;
	MapGroup(PID)->QueryIntraMsg()->RemoteCall(pInfo);

	OBJID	idOldSyn = GetSynID();
	{
		CSyndicate* pSyn = SynManager()->QuerySyndicate(idOldSyn);
		IF_OK(pSyn && pSyn->GetInt(SYNDATA_AMOUNT) > 0)
		{
			pSyn->QueryModify()->AddData(SYNDATA_AMOUNT, -1);
			pSyn->QueryModify()->AddData(SYNDATA_REPUTE, -1*REPUTE_KICKOUT);	// 踢人出帮派扣声望
			pSyn->QueryModify()->AddData(SYNDATA_MONEY, -1*MONEY_KICKOUT);			// 踢出帮派扣的基金
		}
	}
	DelMemberList(idOldSyn, szTarget);
	return true;
}

//////////////////////////////////////////////////////////////////////
DWORD CSynAttr::GetSynRankShow		()
{
	if(GetSynID() != ID_NONE)
	{
		int nRankShow = m_pData->GetInt(SYNATTRDATA_RANK);
		if(nRankShow > RANK_NEWBIE)
		{
			CSynPtr pSyn = SynManager()->QuerySyndicate(GetSynID());
			while (pSyn && pSyn->GetInt(SYNDATA_FEALTY) != ID_NONE)
			{
				nRankShow	-= RANK_SUB;
				pSyn = SynManager()->QuerySyndicate(pSyn->GetInt(SYNDATA_FEALTY));
//				if(pSyn->GetInt(SYNDATA_AMOUNT) < MINI_SUB_SYN)
//					nRankShow		-= RANK_PRE;
			}
		}
		return nRankShow;
	}
	return RANK_NONE;
}

/*
//////////////////////////////////////////////////////////////////////
int CSynAttr::SumSynMember()
{
	int nSum = 0;
	CSynSet::Iterator pSyn = SynManager()->QuerySynSet()->NewEnum();
	while(pSyn.Next())
	{
		if(pSyn && pSyn->GetMasterSynID() == GetMasterSynID())
		{
			nSum += pSyn->GetInt(SYNDATA_AMOUNT);
		}
	}
	return nSum;
}
*/

//////////////////////////////////////////////////////////////////////
LPCTSTR CSynAttr::GetRankTitle()
{
	switch(GetSynRankShow())
	{
	case	100:
		return STR_SYNDICATE_LEADER;
		break;
	case	90:
		return STR_SYNDICATE_LEADER2;
		break;
	case	80:
		return STR_SYNDICATE_LEADER3;
		break;
	case	70:
		return STR_SYNDICATE_LEADER4;
		break;
	case	60:
		return STR_SYNDICATE_LEADER5;
		break;
	case	50:
		return STR_SYNDICATE_MEMBER;
		break;
	}
	return STR_ERROR;
}

//////////////////////////////////////////////////////////////////////
bool CSynAttr::ChangeSyn(CSyndicate *pSyn, CSyndicate *pTarget)
{
	CHECKF(pSyn && pTarget);
	CHECKF(m_pData->GetInt(SYNATTRDATA_RANK) != RANK_LEADER);

	if(pSyn->GetMasterSynID() != pTarget->GetMasterSynID())
		return false;

	pSyn->QueryModify()->AddData(SYNDATA_AMOUNT, -1);
	DelMemberList(pSyn->GetID(), m_pUser->GetName());

	pTarget->QueryModify()->AddData(SYNDATA_AMOUNT, 1);
	AddMemberList(pTarget->GetID(), m_pUser->GetName(), m_pUser->GetLev());

	this->SetIdRank(pTarget->GetID(), RANK_NEWBIE);
	//---jinggy---2004-12-7---刚加入帮派时,在线时间默认为 TIMEONLINE_FIRSTJOIN ---begin
//	m_pData->SetInt(SYNATTRDATA_TIMEONLINE, TIMEONLINE_FIRSTJOIN);
	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

	return true;
}

//////////////////////////////////////////////////////////////////////
CSyndicate* CSynAttr::QuerySyndicate()
{
	if(GetSynID() == ID_NONE)
		return NULL;

	if(m_linkSyn && m_linkSyn->GetID() == GetSynID())
		return m_linkSyn;

	CSyndicate* pSyn = SynManager()->QuerySyndicate(GetSynID());
	if(pSyn)
	{
		m_linkSyn	= pSyn->QueryLink();
	}

	return m_linkSyn;
}

//---jinggy---2004-12-7---获得帮派成员的连续在线时间
unsigned int CSynAttr::GetTimeOnline()
{
	DEBUG_TRY

	if(m_pData) 
		return m_pData->GetInt(SYNATTRDATA_TIMEONLINE); 

	DEBUG_CATCH(" CSynAttr::GetTimeOnline()")

	return ID_NONE; 
}
//增加帮派成员的连续在线时间
void CSynAttr::IncTimeOnline(unsigned short usTimeInc)
{
	DEBUG_TRY

	unsigned int uiTimeOnline = GetTimeOnline(); //在线时间到60*10后就 不在增加

	if( uiTimeOnline >= TIMEONLINE_FIRSTJOIN ) //10*60分钟
		return ;

	unsigned int uiTimeSum = uiTimeOnline + usTimeInc;

	m_pData->SetInt(SYNATTRDATA_TIMEONLINE,uiTimeSum);
	m_pData->Update();

	//检测是否背叛帮派
	DetectIsBetrySyn();

	DEBUG_CATCH("void CSynAttr::IncTimeOnline(UINT8 uiTimeInc)")

}
/*
派的正式成员必须每两个月必须上线10小时,如果没有达到要求,则视为背叛帮派处理。
*/
bool CSynAttr::DetectIsBetrySyn()
{   
	DEBUG_TRY

	//上次的记录时间,将现在的时间和记录的时间进行比较,看是否过了2个月,若过了2个月在线时间没有达到 10个小时,则
	//背叛帮派
	int nTimeDetected = m_pData->GetInt(SYNATTRDATA_TIMEDETECTED);
	time_t tDetected = (time_t) nTimeDetected;
	tm*	pTmDetected	= localtime(&tDetected);
	
	//将时间格式转换为2个月后的值
	tm	tmE;	
	memset(&tmE, 0, sizeof(tm));	

⌨️ 快捷键说明

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