📄 msgtalk.cpp
字号:
IMapThing* pTheMapThing = pSet->GetObjByIndex(i);
if (pTheMapThing &&
pTheMapThing->GetObjType() == OBJ_NPC &&
pTheMapThing->GetPosX() == nPosX && pTheMapThing->GetPosY() == nPosY)
{
pMapThing = pTheMapThing;
break;
}
}
if (!pMapThing)
pUser->FlyMap(ID_NONE, nPosX, nPosY);
else
pUser->SendSysMsg(STR_CAN_STAND);
}
}
}
}
else if (stricmp(szCmd, "chgmap") == 0)
{
if (pUser && pUser->IsGM())
{
MSGBUF szCmd = "NO_CMD";
OBJID idMap = ID_NONE;
int nPosX = 0, nPosY = 0;
if (4 == sscanf(szWords+1, "%s %u %d %d", szCmd, &idMap, &nPosX, &nPosY))
{
CMapPtr pMap = MapManager()->QueryMap(idMap);
if (pMap)
{
#ifdef LOCAL_DEBUG
if(!pMap->IsValidPoint(nPosX, nPosY))
#else
if(!pMap->IsStandEnable(nPosX, nPosY))
#endif
{
pUser->SendSysMsg(STR_CAN_STAND);
return;
}
IMapThing* pMapThing = NULL;
IThingSet* pSet = pMap->QueryBlock(nPosX, nPosY).QuerySet();
CHECK(pSet);
for(int i = 0; i < pSet->GetAmount(); i++)
{
IMapThing* pTheMapThing = pSet->GetObjByIndex(i);
if (pTheMapThing &&
pTheMapThing->GetObjType() == OBJ_NPC &&
pTheMapThing->GetPosX() == nPosX && pTheMapThing->GetPosY() == nPosY)
{
pMapThing = pTheMapThing;
break;
}
}
if (!pMapThing)
pUser->FlyMap(idMap, nPosX, nPosY);
else
pUser->SendSysMsg(STR_CAN_STAND);
}
else
{
pUser->FlyMap(idMap, nPosX, nPosY);
}
}
}
}
else if (stricmp(szCmd, "千里传音") == 0)
{
if (pUser->IsGM())
{
char szMsg[256] = "";
if (2 == sscanf(szWords+1, "%s %s", szCmd, szMsg))
{
char szBuf[300] = "";
sprintf(szBuf, "%s:%s", pUser->GetName(), szMsg);
UserManager()->BroadcastMsg(szBuf, NULL, NULL, 0xffffff, _TXTATR_GM);
}
}
}
else if (stricmp(szCmd, "reloadaction") == 0)
{
OBJID idAction=0;
if (2 == sscanf(szWords+1, "%s %u", szCmd, &idAction))
{
if(idAction == ID_NONE)
{
if (pUser->IsPM())
{
pUser->SendSysMsg(STR_WARNING_CRASH);
extern IActionSet* g_setAction;
if(g_setAction)
g_setAction->Release();
char szSQL[1024];
sprintf(szSQL, "SELECT * FROM %s", _TBL_ACTION);
g_setAction = CActionSet::CreateNew(true);
IF_OK_(g_setAction && g_setAction->Create(szSQL, Database()))
pUser->SendSysMsg("[ACTION UPDATE。]");
LOGMSG("★process command: %s★", szCmd);
}
}
else
{
if (pUser->IsGM())
{
extern IActionSet* g_setAction;
SQLBUF szSQL;
sprintf(szSQL, "SELECT * FROM %s WHERE id=%u LIMIT 1", _TBL_ACTION, idAction);
CAutoPtr<IRecordset> pRes = Database()->CreateNewRecordset(szSQL);
CActionData* pData = CActionData::CreateNew();
if(pData)
{
IF_OK(pData->Create(pRes))
{
DEBUG_TRY // VVVVVVVVVVVVVV
g_setAction->DelObj(pData->GetKey()); // BUG: don't safe in multi thread
g_setAction->AddObj(pData);
pUser->SendSysMsg("[AN ACTION UPDATE。]");
DEBUG_CATCH("reloadaction") // AAAAAAAAAAAAA
}
else
pData->Release();
}
LOGMSG("%s process command: %s %d", pUser->GetName(), szCmd, idAction);
}
}
}
}
else if (stricmp(szCmd, "reloadmagictype") == 0)
{
if (pUser->IsPM())
{
pUser->SendSysMsg(STR_WARNING_CRASH);
extern IMagicTypeSet* g_setMagicType;
if(g_setMagicType)
g_setMagicType->Release();
g_setMagicType = CMagicTypeSet::CreateNew(true);
char szSQL[1024];
sprintf(szSQL, "SELECT * FROM %s", _TBL_MAGIC);
IF_NOT_(g_setMagicType && g_setMagicType->Create(szSQL, Database()))
pUser->SendSysMsg("[ERROR: MAGICTYPE UPDATE ERROR]");
extern IMagicTypeSet* g_setAutoMagicType;
if(g_setAutoMagicType)
g_setAutoMagicType->Release();
g_setAutoMagicType = CMagicTypeSet::CreateNew(true);
sprintf(szSQL, "SELECT * FROM %s WHERE auto_learn!=0", _TBL_MAGIC);
IF_NOT_(g_setAutoMagicType && g_setAutoMagicType->Create(szSQL, Database()))
pUser->SendSysMsg("[ERROR: MAGICTYPE UPDATE ERROR]");
CUserManager::Iterator pUser = UserManager()->NewEnum();
while(pUser.Next())
{
if(pUser)
pUser->QueryMagic()->DebugReloadAll();
}
LOGMSG("★process command: %s★", szCmd);
}
}
else if (stricmp(szCmd, "查询") == 0)
{
CUserPtr pTarget = UserManager()->GetUser(szParam);
if(pTarget)
{
OBJID idSyn = pUser->QuerySynAttr()->GetSynID();
OBJID idTargetSyn = pTarget->QuerySynAttr()->GetSynID();
if(idSyn != ID_NONE && idTargetSyn == idSyn)
{
pUser->SendSysMsg("贡献度:%d。", pTarget->QuerySynAttr()->GetInt(SYNATTRDATA_PROFFER));
}
}
}
else if (stricmp(szCmd, "奖品") == 0)
{
if (!pUser->DoBonus())
{
pUser->SendSysMsg(STR_NO_BONUS);
}
}
else if (stricmp(szCmd, "attach") == 0)
{
if (pUser->IsPM())
{
int nStatus, nPower, nSecs, nTimes;
if (5 == sscanf(szWords+1, "%s %d %d %d %d", szCmd, &nStatus, &nPower, &nSecs, &nTimes))
{
pUser->AttachStatus(pUser->QueryRole(), nStatus, nPower, nSecs, nTimes);
}
else
pUser->SendSysMsg("Invalid arguments.");
}
}
else if (stricmp(szCmd, "statuslist") == 0)
{
if (pUser->IsPM())
{
IStatusSet* pStatusSet = pUser->QueryStatusSet();
if (pStatusSet)
{
pUser->SendSysMsg(_TXTATR_NORMAL, "================ Status info =================");
for (int i=0; i<pStatusSet->GetAmount(); i++)
{
IStatus* pStatus = pStatusSet->GetObjByIndex(i);
if (pStatus)
{
StatusInfoStruct info;
pStatus->GetInfo(&info);
pUser->SendSysMsg(_TXTATR_NORMAL, "Status=%d, power=%d, remain secs=%d, times=%d",
info.nStatus, info.nPower, info.nSecs, info.nTimes);
}
}
pUser->SendSysMsg(_TXTATR_NORMAL, "==============================================");
}
}
}
#ifdef _DEBUG
else if (stricmp(szCmd, "task_list") == 0)
{
pUser->SendSysMsg("===== mercenary task list =====");
for (int i=0; i<MercenaryTask()->GetTaskAmount(); i++)
{
CMercenaryTaskData* pData = MercenaryTask()->QueryTaskDataByIndex(i);
if (pData)
pUser->SendSysMsg("[%u] [%s] [%s]", pData->GetID(), pData->GetStr(MTASKDATA_TITLE), pData->GetStr(MTASKDATA_USER_NAME));
}
pUser->SendSysMsg("===============================");
}
else if (stricmp(szCmd, "task_new") == 0)
{
if (MercenaryTask()->QueryTaskDataByOwner(pUser->GetID()))
{
pUser->SendSysMsg("您不能发布多个任务。");
}
else
{
ST_MTASK_DATA tTaskData;
memset(&tTaskData, 0L, sizeof(ST_MTASK_DATA));
if (7 == sscanf(szWords+1, "%s %u %s %s %s %u %u", szCmd,
&tTaskData.ucType, tTaskData.szTitle, tTaskData.szDetail, tTaskData.szTargetName, &tTaskData.dwPrizeMoney, &tTaskData.ucRankReq))
{
tTaskData.idUser = pUser->GetID();
::SafeCopy(tTaskData.szUserName, pUser->GetName(), _MAX_NAMESIZE);
if (MercenaryTask()->CreateNewTask(&tTaskData))
{
pUser->SendSysMsg("任务发布成功。");
}
}
}
}
else if (stricmp(szCmd, "task_del") == 0)
{
CMercenaryTaskData* pData = MercenaryTask()->QueryTaskDataByOwner(pUser->GetID());
if (pData)
{
if (MercenaryTask()->DeleteTask(pData->GetID()))
pUser->SendSysMsg("任务删除成功");
else
pUser->SendSysMsg("任务删除失败");
}
else
pUser->SendSysMsg("您还没有发布任务。");
}
else if (stricmp(szCmd, "magicattack") == 0)
{
int nType = 0;
char szName[256];
if (3 == sscanf(szWords+1, "%s %d %s", szCmd, &nType, szName))
{
CUser* pTarget = UserManager()->GetUser(szName);
if (pTarget)
{
pUser->SendSysMsg("Magic attack [type=%d, target=%s]", nType, szName);
pUser->MagicAttack(nType, pTarget->GetID(), pTarget->GetPosX(), pTarget->GetPosY());
}
}
}
else if (stricmp(szCmd, "chgpos") == 0)
{
int nPosX=0, nPosY = 0;
if (3 == sscanf(szWords+1, "%s %d %d", szCmd, &nPosX, &nPosY))
{
if(pUser->GetMap()->IsStandEnable(nPosX, nPosY))
{
// pUser->ProcessOnMove(MOVEMODE_TRACK);
// pUser->JumpPos(nPosX, nPosY); //? may be optimize to JumpPos(,)
// pUser->Synchro();
pUser->SyncTrackTo(nPosX, nPosY, 0, 0);
}
// pUser->ProcessOnMove(MOVEMODE_TRACK);
// pUser->JumpPos(nPosX, nPosY);
// pUser->Synchro();
}
}
else if (stricmp(szCmd, "callpet") == 0)
{
OBJID idType = ID_NONE;
int nSecs = 0;
if (3 == sscanf(szWords+1, "%s %u %d", szCmd, &idType, &nSecs))
{
pUser->CallPet(idType, pUser->GetPosX(), pUser->GetPosY(), nSecs);
}
}
else if (stricmp(szCmd, "showid") == 0)
{
pUser->SendSysMsg("AccountID=%u, UserID=%u", pUser->GetAccountID(), pUser->GetID());
}
else if (stricmp(szCmd, "attacheudemon") == 0)
{
if (pUser->GetEudemonAmount() > 0)
{
// CMonster* pMonster = pUser->QueryEudemonByIndex(0);
}
}
#endif
DEBUG_CATCH2("CMsgTalk CMD:[%s] error.", szCmd) // AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
return;
}
// 鬼频道
if(pUser && pUser->IsGhost() && m_pInfo->unTxtAttribute != _TXTATR_TEAM)
{
m_pInfo->unTxtAttribute = _TXTATR_GHOST;
pUser->BroadcastRoomMsg(this, EXCLUDE_SELF);
return ;
}
// 普通TALK
switch(m_pInfo->unTxtAttribute)
{
case _TXTATR_GLOBAL:
{
if(pRole->GetLev() < 30)
{
pRole->SendSysMsg(STR_NO_ENOUGH_LEVEL);
break;
}
if(pUser && pUser->GetMana() < 200)
{
pRole->SendSysMsg(STR_NO_ENOUGH_POWER);
break;
}
pRole->AddAttrib(_USERATTRIB_MANA, -200, SYNCHRO_TRUE);
RoleManager()->BroadcastMsg(this);
}
break;
case _TXTATR_PRIVATE:
{
CUserPtr pTarget = UserManager()->GetUser(szReceiver);
if(pTarget)
pTarget->SendMsg(this);
else
MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this, szReceiver);
}
break;
case _TXTATR_TEAM:
{
if (pUser)
{
CTeam* pTeam = pUser->GetTeam();
if (pTeam)
pTeam->BroadcastTeamMsg(this, pUser);
}
}
break;
case _TXTATR_FRIEND:
{
if (pUser)
pUser->BroadcastFriendsMsg(this);
}
break;
case _TXTATR_SYNDICATE:
{
if (pUser)
{
OBJID idSyn = pUser->GetSynID();
CSyndicate* pSyn = SynManager()->QuerySyndicate(idSyn);
if (pSyn)
{
if(pSyn->GetInt(SYNDATA_MONEY) < SYN_MONEY_BASELINE)
{
pUser->SendSysMsg(STR_TOO_LOWER_SYN_MONEY);
break;
}
pSyn->BroadcastSynMsg(this, pUser);
m_pInfo->idTransmit = pSyn->GetID();
MapGroup(PID)->QueryIntraMsg()->TransmitMsg(this, GetSocketID(), GetNpcID());
}
}
}
break;
case _TXTATR_LEAVEWORD:
{
if (pUser)
{
if(!::TalkStrCheck(szWords, true)) // true: enable new line character
{
pUser->SendSysMsg(STR_INVALID_CHARACTER);
return ;
}
pUser->AddLeaveWord(szReceiver, szWords);
}
}
break;
case _TXTATR_SYNANNOUNCE:
{
LPCTSTR pAnnounce = szWords;
if(!pUser || pUser->GetSynID() == ID_NONE || pUser->GetSynRankShow() != RANK_LEADER)
return ;
if(!::TalkStrCheck(szWords, true)) // true: enable new line character
{
pUser->SendSysMsg(STR_INVALID_CHARACTER);
return ;
}
CSyndicate* pSyn = SynManager()->QuerySyndicate(pUser->GetSynID());
IF_OK(pSyn)
{
pSyn->QueryModify()->SetTenet(pAnnounce);
pSyn->BroadcastSubSynMsg(GetSocketID(), GetNpcID(), pAnnounce, NULL, NULL, 0xFFFFFF, _TXTATR_SYNANNOUNCE);
}
}
break;
case _TXTATR_CRYOUT:
{
if (pUser && pUser->QueryBooth())
{
if(!::TalkStrCheck(szWords, true))
{
pUser->SendSysMsg(STR_INVALID_MSG);
return ;
}
pUser->QueryBooth()->SetCryOut(szWords);
pUser->BroadcastRoomMsg(this, false);// add by arhun
}
}
break;
case _TXTATR_MSG_TRADE:
case _TXTATR_MSG_FRIEND:
case _TXTATR_MSG_TEAM:
case _TXTATR_MSG_SYN:
case _TXTATR_MSG_OTHER:
{
CUser* pUser = UserManager()->GetUser(this);
if(!pUser)
return ;
if(pUser->GetLev() < LOGIN_FREE_LEVEL)
{
pUser->SendSysMsg(STR_LOW_LEVEL);
return ;
}
if(!::TalkStrCheck(szWords, true)) // true: enable new line character
{
pUser->SendSysMsg(STR_INVALID_CHARACTER);
return ;
}
if(m_pInfo->unTxtAttribute == _TXTATR_MSG_SYN)
{
OBJID idSyn = pUser->GetSynID();
if(idSyn == ID_NONE)
return ;
SetTransData(idSyn);
}
MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this);
}
break;
case _TXTATR_MSG_SYSTEM:
{
ASSERT(!"_TXTATR_MSG_OTHER");
}
break;
case _TXTATR_SERVE:
{
CUser* pUser = UserManager()->GetUser(this);
if (!pUser)
return;
if (pUser->IsGM()) // game service
{
CUserPtr pTarget = UserManager()->GetUser(szReceiver);
if (pTarget)
pTarget->SendMsg(this);
else
MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this, szReceiver);
}
else // client ask service
{
// 发给服务频道GM的消息全部通过世界核心处理,以保证唯一性和正确性 -- zlong 2004.5.18
// CUserPtr pTarget = UserManager()->GetGM();
// if (pTarget)
// pTarget->SendMsg(this);
// else
MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this); //, szReceiver);
}
}
break;
case _TXTATR_REJECT:
{
CUserPtr pTarget = UserManager()->GetUser(szReceiver);
if(pTarget)
{
pTarget->SendMsg(this);
// 上面是从信仰继承过来的处理方式
// 存在一个BUG,就是没有清除CUser的请求,需要以下修改:
if (strcmp(szWords, "a") == 0) // REJECT_FRIEND
pTarget->FetchApply(CUser::APPLY_FRIEND, pUser->GetID());
else if (strcmp(szWords, "b") == 0) // REJECT_TRADE
pTarget->FetchApply(CUser::APPLY_TRADE, pUser->GetID());
else if (strcmp(szWords, "c") == 0) // REJECT_TEAM
pTarget->FetchApply(CUser::APPLY_TEAMAPPLY, pUser->GetID());
else if (strcmp(szWords, "d") == 0) // REJECT_TEACHERAPPLY
pTarget->FetchApply(CUser::APPLY_TEACHERAPPLY, pUser->GetID());
else if (strcmp(szWords, "e") == 0) // REJECT_STUDENGAPPLY
pTarget->FetchApply(CUser::APPLY_STUDENTAPPLY, pUser->GetID());
}
}
break;
default:
{
pRole->BroadcastRoomMsg(this, EXCLUDE_SELF);
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -