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