📄 synattr.cpp
字号:
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 + -