📄 gameaction.cpp
字号:
case ACTION_MAP_SETSTATUS:
{
OBJID idMap;
int nStatus;
int nFlag;
if (3 == sscanf(szParam, "%u %d %d", &idMap, &nStatus, &nFlag))
{
CGameMap* pMap = MapManager()->QueryMap(idMap);
if (pMap)
{
pMap->SetStatus(nStatus, nFlag != 0);
return true;
}
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
break;
case ACTION_MAP_DROPITEM:
{
OBJID idItemType = ID_NONE, idMap = ID_NONE;
POINT pos;
if (4 == sscanf(szParam, "%u %u %d %d", &idItemType, &idMap, &pos.x, &pos.y))
{
CGameMap* pMap = MapManager()->QueryMap(idMap);
if (pMap && pMap->IsLayItemEnable(pos.x, pos.y))
{
CMapItem* pMapItem = CMapItem::CreateNew();
if (pMapItem)
{
if(pMapItem->Create(MapManager()->SpawnMapItemID(), pMap, pos, idItemType, ID_NONE))
{
MapManager()->QueryMapItemSet()->AddObj(pMapItem);
return true;
}
else
pMapItem->ReleaseByOwner();
}
}
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
break;
case ACTION_MAP_MAPEFFECT:
{
OBJID idMap = ID_NONE;
int nPosX = 0, nPosY = 0;
char szEffect[256] = "";
if (4 == sscanf(szParam, "%u %d %d %s", &idMap, &nPosX, &nPosY, szEffect))
{
CGameMap* pMap = MapManager()->QueryMap(idMap);
if (pMap)
{
CMsgName msg;
IF_OK (msg.Create(NAMEACT_MAPEFFECT, szEffect, nPosX, nPosY))
pMap->BroadcastBlockMsg(nPosX, nPosY, &msg);
return true;
}
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
break;
case ACTION_MAP_MOVENPC:
{
CNpc* pNpc;
IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
{
IF_NOT(!pNpc->IsDynaNpc())
{
LOGERROR("ACTION_MAP_MOVENPC 仅用于固定NPC[%d]", pNpc->GetID());
return false;
}
OBJID idMap = ID_NONE;
int nPosX = 0, nPosY = 0;
if (3 == sscanf(szParam, "%u %d %d", &idMap, &nPosX, &nPosY))
{
if (pNpc->ChangePos(idMap, nPosX, nPosY))
return true;
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
}
break;
case ACTION_MAP_MAPUSER:
{
char szCmd[256] = "", szOpt[256] = "";
int nData = 0;
if (3 == sscanf(szParam, "%s %s %d", szCmd, szOpt, &nData))
{
OBJID idMap = pAction->GetInt(ACTIONDATA_DATA);
vector<CUser*> setUser;
if (0 == stricmp("map_user", szCmd))
{
CUserManager::Iterator pUser = UserManager()->NewEnum();
while(pUser.Next())
{
if (pUser && pUser->GetMapID() == idMap)
setUser.push_back(pUser);
}
}
else if (0 == stricmp("alive_user", szCmd))
{
CUserManager::Iterator pUser = UserManager()->NewEnum();
while(pUser.Next())
{
if (pUser && pUser->GetMapID() == idMap && pUser->IsAlive())
setUser.push_back(pUser);
}
}
else
{
LOGERROR("ACTION %u: 错误的param参数", pAction->GetID());
return false;
}
if (0 == stricmp(szOpt, "=="))
{
if (setUser.size() == nData)
return true;
}
else if (0 == stricmp(szOpt, "<="))
{
if (setUser.size() <= nData)
return true;
}
else if (0 == stricmp(szOpt, ">="))
{
if (setUser.size() >= nData)
return true;
}
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
break;
case ACTION_MAP_BROCASTMSG:
{
CMsgTalk msg;
IF_OK (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szParam, NULL, 0x0ffffff, _TXTATR_SYSTEM))
UserManager()->BroadcastMapMsg(pAction->GetInt(ACTIONDATA_DATA), &msg);
return true;
}
break;
case ACTION_MAP_CHANGEWEATHER:
{
CHECKF(pUser);
int nType, nIntensity, nDir, nColor, nKeepSecs;
if (5 == sscanf(szParam, "%d %d %d %d %d", &nType, &nIntensity, &nDir, &nColor, &nKeepSecs))
{
pUser->SetWeather(nType, nIntensity, nDir, nColor, nKeepSecs, 10);
return true;
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
break;
case ACTION_MAP_CHANGELIGHT:
{
DWORD dwRGB;
OBJID idMap = ID_NONE;
int nSecs = 0;
if (3 == sscanf(szParam, "%u %u %d", &idMap, &dwRGB, &nSecs))
{
CGameMap* pMap = MapManager()->QueryMap(idMap);
if (pMap)
{
if(nSecs == 0) // keep light
pMap->SetLight(dwRGB);
CMsgAction msg;
IF_OK(msg.Create(1, 0, 0, nSecs, actionMapARGB, dwRGB))
UserManager()->BroadcastMapMsg(pMap->GetID(), &msg, NULL);
return true;
}
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
break;
case ACTION_MAP_ATTRIB:
{
PARAMBUF szField;
PARAMBUF szOpt;
int nData;
OBJID idMap = ID_NONE;
if (sscanf(szParam, "%s %s %d %u", szField, szOpt, &nData, &idMap) < 3)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
return false;
}
CGameMap* pTaskMap = NULL;
if(idMap != ID_NONE)
{
pTaskMap = MapManager()->QueryMap(idMap);
}
else
{
CNpc* pNpc = NULL;
if(pUser)
pTaskMap = pUser->GetMap();
else if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
pTaskMap = pNpc->GetMap();
}
CHECKF(pTaskMap);
if(stricmp(szField, "synid") == 0)
{
if(strcmp(szOpt, "==") == 0)
{
if(pTaskMap->GetSynID() == nData)
return true;
}
else if(strcmp(szOpt, "=") == 0)
{
pTaskMap->SetSynID(nData, true); // with all map npc
return true;
}
}
else if(stricmp(szField, "status") == 0)
{
if(strcmp(szOpt, "test") == 0)
{
if((pTaskMap->GetStatus() & nData) != 0)
return true;
}
else if(strcmp(szOpt, "set") == 0)
{
pTaskMap->SetStatus(nData, true);
return true;
}
else if(strcmp(szOpt, "reset") == 0)
{
pTaskMap->SetStatus(nData, false);
return true;
}
}
else if(stricmp(szField, "type") == 0)
{
if(strcmp(szOpt, "test") == 0)
{
if((pTaskMap->GetType() & nData) != 0)
return true;
}
}
else if(stricmp(szField, "res_lev") == 0)
{
if(strcmp(szOpt, "==") == 0)
{
if(pTaskMap->GetResLev() == nData)
return true;
}
else if(strcmp(szOpt, "<") == 0)
{
if(pTaskMap->GetResLev() < nData)
return true;
}
else if(strcmp(szOpt, "=") == 0)
{
pTaskMap->SetResLev(nData, true);
return true;
}
}
else if(stricmp(szField, "mapdoc") == 0)
{
if(strcmp(szOpt, "==") == 0)
{
if(pTaskMap->GetDocID() == nData)
return true;
}
else if(strcmp(szOpt, "=") == 0)
{
pTaskMap->ChangeMapDoc(nData);
return true;
}
}
else if(stricmp(szField, "portal0_x") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pTaskMap->SetPortal0X(nData, UPDATE_TRUE);
return true;
}
}
else if(stricmp(szField, "portal0_y") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pTaskMap->SetPortal0Y(nData, UPDATE_TRUE);
return true;
}
}
else if(stricmp(szField,"castle") == 0) //add huang 2003.12.30
{
if(stricmp(szOpt, "==") == 0)
{
if(pTaskMap->GetID() == nData)
return true;
}
}
}
break;
case ACTION_MAP_REGION_MONSTER:
{
PARAMBUF szOpt;
OBJID idMap, idType;
int nRegionX, nRegionY, nRegionCX, nRegionCY, nData;
if(sscanf(szParam, "%u %d %d %d %d %u %s %d",
&idMap, &nRegionX, &nRegionY, &nRegionCX, &nRegionCY, &idType, szOpt, &nData) < 8)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
if(idMap == ID_NONE)
{
if(pUser)
{
idMap = pUser->GetMapID();
}
else
{
CNpc* pNpc = NULL;
if(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
idMap = pNpc->GetMapID();
}
}
if(idMap == ID_NONE)
{
LOGERROR("ACTION %u: 没有找到地图", pAction->GetID());
break;
}
int nCount = 0;
CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
while(pRole.Next())
{
CMonster* pMonster;
if(pRole && pRole->QueryObj(OBJ_MONSTER, IPP_OF(pMonster))
&& pMonster->GetMap()->GetID() == idMap
&& pRole->GetPosX() >= nRegionX && pRole->GetPosX() < nRegionX + nRegionCX
&& pRole->GetPosY() >= nRegionY && pRole->GetPosY() < nRegionY + nRegionCY
&& (idType == ID_NONE || pMonster->GetType() == idType) )
{
nCount++;
}
}
if(strcmp(szOpt, "==") == 0)
{
if(nCount == nData)
return true;
}
else if(strcmp(szOpt, "<") == 0)
{
if(nCount < nData)
return true;
}
}
break;
case ACTION_MAP_CREATEMAP:
{
CHECKF(pUser && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pNpc->IsLinkNpc());
PARAMBUF szName;
OBJID idOwner, idRebornMap;
int nOwnerType, nMapDoc, nType, nPortalX, nPortalY, nRebornPortal, nResLev;
if(sscanf(szParam, "%s %d %u %d %d %d %d %u %d %d",
szName, &nOwnerType, &idOwner, &nMapDoc, &nType, &nPortalX, &nPortalY, &idRebornMap, &nRebornPortal, &nResLev) < 10)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
NewMapInfo info;
memset(&info, 0, sizeof(NewMapInfo));
SafeCopy(info.szName, szName, _MAX_NAMESIZE);
info.nMapDoc = nMapDoc;
info.nType = nType;
info.nOwnerType = nOwnerType;
info.idOwner = idOwner;
info.nMapGroup = MapGroup(PID)->GetMapGroup();
info.idLikeMap = pUser->GetMapID();
info.nLinkX = pUser->GetPosX();
info.nLinkY = pUser->GetPosY();
info.nPortalX = nPortalX;
info.nPortalY = nPortalY;
info.idRebornMap = idRebornMap;
info.nRebornPortal = nRebornPortal;
info.nResLev = nResLev;
OBJID idMap = MapManager()->CreateDynaMap(&info);
if(idMap == ID_NONE)
return false;
pNpc->QueryLinkMap()->SetLinkMap(idMap);
return true;
}
break;
default:
LOGERROR("不支持的ACTION[%u]类型[%u]", pAction->GetKey(), pAction->GetInt(ACTIONDATA_TYPE));
}
return false;
}
//////////////////////////////////////////////////////////////////////
bool CGameAction::ProcessActionItemOnly(CActionData* pAction, LPCTSTR szParam, CUser* pUser, IRole* pRole, CItem* pItem, LPCTSTR pszAccept)
{
CHECKF(pAction && pUser && pItem);
switch(pAction->GetInt(ACTIONDATA_TYPE))
{
case ACTION_ITEM_REQUESTLAYNPC:
{
OBJID idNextTask;
int nType, nSort, nLookFace, nRegion=0;
if(sscanf(szParam, "%u %d %d %d %d %d", &idNextTask, &nType, &nSort, &nLookFace, &nRegion) < 4)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
CHECKF(idNextTask != ID_NONE);
pUser->SetTaskItemActionID(idNextTask);
CMsgNpc msg;
IF_OK(msg.Create(EVENT_LAYNPC, nRegion, nType, nLookFace))
pUser->SendMsg(&msg);
return true;
}
break;
case ACTION_ITEM_COUNTNPC:
{
PARAMBUF szField;
PARAMBUF szData;
PARAMBUF szOpt;
int nNum;
IF_NOT_(sscanf(szParam, "%s %s %s %d", szField, szData, szOpt, &nNum) == 4)
return false;
int nCount = 0;
if(stricmp(szField, "all") == 0)
{
nCount = RoleManager()->CountAllNpc(pUser->GetMapID());
}
else if(stricmp(szField, "furniture") == 0)
{
nCount = RoleManager()->CountFurnitureNpc(pUser->GetMapID());
}
else if(stricmp(szField, "name") == 0)
{
nCount = RoleManager()->CountNpcByName(pUser->GetMapID(), szData);
}
else if(stricmp(szField, "type") == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -