📄 gameaction.cpp
字号:
// GameAction.cpp: implementation of the CGameAction class.
//
//////////////////////////////////////////////////////////////////////
#include <ctype.h>
#include "define.h"
#include "windows.h"
#include "I_Role.h"
#include "User.h"
#include "Item.h"
#include "GameAction.h"
#include "MapGroup.h"
#include "AllMsg.h"
#include "ActionDefine.h"
#include "WantedList.h"
#include "PoliceWanted.h"
#include "NpcLink.h"
#include "MapTrap.h"
#include "DeadLoop.h"
#include "string.h"
#include "EventPack.h"
#include "NpcTable.h"
#include "TaskDetailData.h"
#include "TaskDetail.h"
//////////////////////////////////////////////////////////////////////
const int PRESENTMONEY_LIMIT = 10000; // 基金划拨不少于10000
const int ENTER_HOME_TEAM_DISTANCE = 5; // 组队进入家庭的距离
const int MAX_UNLEARN_NUMBER = 20; // 忘却MAGIC最多支持条数
const int SUBSYN_NAMESIZE = 16; // 子帮派名字长度
const int MAX_ACCEPTSTR = 4; // 分析4个子串
MYHEAP_IMPLEMENTATION(CGameAction,s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////////////////////
void CGameAction::ReplaceAttrStr(char* pszTarget, const char* pszSource, CUser* pUser, IRole* pRole, CItem* pItem, LPCTSTR pszAccept/*=NULL*/)
{
if(!pszTarget || !pszSource)
{
ASSERT(!"CJobNpc::ReplaceAttrStr");
return;
}
if(strchr(pszSource, '%') == NULL)
{
SafeCopy(pszTarget, pszSource);
return;
}
CNpc* pNpc = NULL;
if(pRole)
pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc));
const char* ptr = pszSource;
char* ptr2 = pszTarget;
while(*ptr)
{
if(*ptr == '%')
{
ptr++;
// width
int nWidth = 0;
if(isdigit(*ptr))
nWidth = nWidth*10 + (*(ptr++))-'0';
if(isdigit(*ptr))
nWidth = nWidth*10 + (*(ptr++))-'0'; // 仅支持2位数
const char* pNext = ptr2 + nWidth;
if(*(ptr) == '%')
{
*ptr2 = '%';
ptr += 2;
ptr2++;
// continue;
}
if (strnicmp(ptr, PARAM_DATE_STAMP, sizeof(PARAM_DATE_STAMP)-1) == 0)
{
char szString[256] = "(err)";
sprintf(szString, "%d", ::DateStamp());
strcpy(ptr2, szString);
ptr += sizeof(PARAM_DATE_STAMP)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARAM_TIME, sizeof(PARAM_TIME)-1) == 0)
{
char szString[256] = "(err)";
sprintf(szString, "%d", time(NULL));
strcpy(ptr2, szString);
ptr += sizeof(PARAM_TIME)-1;
ptr2 += strlen(szString);
// continue;
}
else if(strnicmp(ptr, ACCEPT_STR_, sizeof(ACCEPT_STR_)-1) == 0
&& *(ptr+sizeof(ACCEPT_STR_)-1) >= '0' && *(ptr+sizeof(ACCEPT_STR_)-1) < '0'+ MAX_ACCEPTSTR)
{
char szNum[256] = "(err)";
int nSize = strlen(szNum);
int idx = *(ptr+sizeof(ACCEPT_STR_)-1) - '0';
if(pszAccept && idx >= 0 && idx < MAX_ACCEPTSTR)
{
char szStr[4][256] = {0};
sscanf(pszAccept, "%s %s %s %s", szStr[0], szStr[1], szStr[2], szStr[3]);
strcpy(szNum, szStr[idx]);
}
strcpy(ptr2, szNum);
ptr += sizeof(ACCEPT_STR_)-1 + 1; //+1 : index
ptr2 += strlen(szNum);
// continue;
}
if(pUser)
{
if (strnicmp(ptr, PARA_ITER_GAME_CARD2, sizeof(PARA_ITER_GAME_CARD2)-1) == 0)
{
char szString[256] = "--";
sprintf(szString, "%d", pUser->CountCard2());
strcpy(ptr2, szString);
ptr += sizeof(PARA_ITER_GAME_CARD2)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARA_AVAILABLE_FUND, sizeof(PARA_AVAILABLE_FUND)-1) == 0)
{
//帮派基金
char szString[256] = "--";
sprintf(szString, "%d", pUser->GetAvailableSynFund());
strcpy(ptr2, szString);
ptr += sizeof(PARA_AVAILABLE_FUND)-1;
ptr2 += strlen(szString);
}
else if (strnicmp(ptr, PARA_ITER_GAME_CARD, sizeof(PARA_ITER_GAME_CARD)-1) == 0)
{
char szString[256] = "--";
sprintf(szString, "%d", pUser->CountCard());
strcpy(ptr2, szString);
ptr += sizeof(PARA_ITER_GAME_CARD)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARA_ITER_COST_DURRECOVER, sizeof(PARA_ITER_COST_DURRECOVER)-1) == 0)
{
char szString[256] = "--";
if (pUser->TaskIterator() != 0)
{
CItem* pItem = pUser->GetEquipItemByPos(pUser->TaskIterator());
if (pItem)
sprintf(szString, "%d", pItem->GetRecoverDurCost());
}
strcpy(ptr2, szString);
ptr += sizeof(PARA_ITER_COST_DURRECOVER)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARA_ITER_GEMSUPQUALITY, sizeof(PARA_ITER_GEMSUPQUALITY)-1) == 0)
{
char szString[256] = "--";
if (pUser->TaskIterator() != 0)
{
int nChance = pUser->GetChanceUpEpQuality(pUser->TaskIterator());
int nGemCost = 0;
if (nChance >= 0)
nGemCost = 100/__max(1, nChance) + 1;
sprintf(szString, "%d", nGemCost);
}
strcpy(ptr2, szString);
ptr += sizeof(PARA_ITER_GEMSUPQUALITY)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARA_ITER_GEMSUPLEVEL, sizeof(PARA_ITER_GEMSUPLEVEL)-1) == 0)
{
char szString[256] = "--";
if (pUser->TaskIterator() != 0)
{
int nChance = pUser->GetChanceUpEpLevel(pUser->TaskIterator());
int nGemCost = 0;
if (nChance >= 0)
nGemCost = (100/__max(1, nChance) + 1)*12/10;
sprintf(szString, "%d", nGemCost);
}
strcpy(ptr2, szString);
ptr += sizeof(PARA_ITER_GEMSUPLEVEL)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARA_ITER_POLICEWANTED, sizeof(PARA_ITER_POLICEWANTED)-1) == 0)
{
char szString[256] = "--";
//if (pUser->TaskIterator() != 0)
{
PoliceWantedStruct* pWanted = PoliceWanted().GetWantedByIndex(pUser->TaskIterator());
if (pWanted)
{
sprintf(szString, "%03u %-15s %-15s %03d %d",
pUser->TaskIterator(),
pWanted->strName.c_str(),
pWanted->strSynName.c_str(),
pWanted->nLev,
pWanted->nPk);
}
}
strcpy(ptr2, szString);
ptr += sizeof(PARA_ITER_POLICEWANTED)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARA_ITER_WANTED, sizeof(PARA_ITER_WANTED)-1) == 0)
{
char szString[256] = "--";
//if (pUser->TaskIterator() != 0)
{
CWantedData* pWanted = CWantedList::s_WantedList.GetWantedByIndex(pUser->TaskIterator());
if (pWanted)
{
sprintf(szString, "%06u %-15s %u", pWanted->GetInt(DATA_ID), pWanted->GetStr(DATA_TARGET_NAME), pWanted->GetInt(DATA_BOUNTY));
}
}
strcpy(ptr2, szString);
ptr += sizeof(PARA_ITER_WANTED)-1;
ptr2 += strlen(szString);
// continue;
}
else if (strnicmp(ptr, PARA_TUTOREXP_, sizeof(PARA_TUTOREXP_)-1) == 0)
{
char szNum[256] = "0";
sprintf(szNum, "%d", pUser->GetTutorExp());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_TUTOREXP_)-1;
ptr2 += strlen(szNum);
// continue;
}
else if (strnicmp(ptr, PARA_STUDENT_EXP_, sizeof(PARA_STUDENT_EXP_)-1) == 0)
{
char szNum[256] = "0";
CTutorexpData* pExpData;
pExpData = CTutorexpData::CreateNew();
if (pExpData)
{
if (pExpData->Create(pUser->GetID(), Database()))
{
sprintf(szNum, "%u", pExpData->GetInt(TUTOREXPDATA_EXP));
}
SAFE_RELEASE (pExpData);
}
strcpy(ptr2, szNum);
ptr += sizeof(PARA_STUDENT_EXP_)-1;
ptr2 += strlen(szNum);
// continue;
}
else if (strnicmp(ptr, PARA_EXPLOIT_, sizeof(PARA_EXPLOIT_)-1) == 0)
{
char szNum[256] = "0";
sprintf(szNum, "%u", pUser->GetExploit());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_EXPLOIT_)-1;
ptr2 += strlen(szNum);
}
else if(strnicmp(ptr, PARA_ENEMY_SYN_, sizeof(PARA_ENEMY_SYN_)-1) == 0
&& *(ptr+sizeof(PARA_ENEMY_SYN_)-1) >= '0' && *(ptr+sizeof(PARA_ENEMY_SYN_)-1) < '0'+ MAX_SYNENEMYSIZE)
{
char szNum[256] = "--";
int idx = *(ptr+sizeof(PARA_ENEMY_SYN_)-1) - '0';
if(idx >= 0 && idx < MAX_SYNENEMYSIZE)
{
CSynPtr pSyn = SynManager()->QuerySyndicate(pUser->GetSynID());
if(pSyn)
{
CSynPtr pTarget = SynManager()->QuerySyndicate(pSyn->GetInt((SYNDATA)(SYNDATA_ENEMY0+idx)));
if(pTarget)
sprintf(szNum, "%s", pTarget->GetStr(SYNDATA_NAME));
}
}
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ENEMY_SYN_)-1 + 1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ALLY_SYN_, sizeof(PARA_ALLY_SYN_)-1) == 0
&& *(ptr+sizeof(PARA_ALLY_SYN_)-1) >= '0' && *(ptr+sizeof(PARA_ALLY_SYN_)-1) < '0'+ MAX_SYNALLYSIZE)
{
char szNum[256] = "--";
int idx = *(ptr+sizeof(PARA_ALLY_SYN_)-1) - '0';
if(idx >= 0 && idx < MAX_SYNALLYSIZE)
{
CSynPtr pSyn = SynManager()->QuerySyndicate(pUser->GetSynID());
if(pSyn)
{
CSynPtr pTarget = SynManager()->QuerySyndicate(pSyn->GetInt((SYNDATA)(SYNDATA_ALLY0+idx)));
if(pTarget)
sprintf(szNum, "%s", pTarget->GetStr(SYNDATA_NAME));
}
}
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ALLY_SYN_)-1 + 1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_USER_ID, sizeof(PARA_USER_ID)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pUser->GetID());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_USER_ID)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_USER_MAPID, sizeof(PARA_USER_MAPID)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pUser->GetMapID());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_USER_MAPID)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_USER_MAPX, sizeof(PARA_USER_MAPX)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pUser->GetPosX());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_USER_MAPX)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_USER_MAPY, sizeof(PARA_USER_MAPY)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pUser->GetPosY());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_USER_MAPY)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_USER_HOME, sizeof(PARA_USER_HOME)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pUser->GetHomeID());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_USER_HOME)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_SYN_ID, sizeof(PARA_SYN_ID)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pUser->GetMasterSynID());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_SYN_ID)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_SYN_NAME, sizeof(PARA_SYN_NAME)-1) == 0)
{
const char* pName = SYNNAME_NONE;
if(pUser->GetSynID() != ID_NONE)
{
CSynPtr pSyn = SynManager()->QuerySyndicate(pUser->GetSynID());
if(pSyn)
pName = pSyn->GetStr(SYNDATA_NAME);
}
strcpy(ptr2, pName);
ptr += sizeof(PARA_SYN_NAME)-1;
ptr2 += strlen(pName);
// continue;
}
else if(strnicmp(ptr, PARA_USER_NAME, sizeof(PARA_USER_NAME)-1) == 0)
{
strcpy(ptr2, pUser->GetName());
ptr += sizeof(PARA_USER_NAME)-1;
ptr2 += strlen(pUser->GetName());
// continue;
}
else if(strnicmp(ptr, PARA_MATE_NAME, sizeof(PARA_MATE_NAME)-1) == 0)
{
strcpy(ptr2, pUser->GetMate());
ptr += sizeof(PARA_MATE_NAME)-1;
ptr2 += strlen(pUser->GetMate());
// continue;
}
else if(strnicmp(ptr, PARA_MAP_OWNER_ID, sizeof(PARA_MAP_OWNER_ID)-1) == 0)
{
char szNum[256] = "0"; // 缺省OWNERID为0
sprintf(szNum, "%u", pUser->GetMap()->GetOwnerID());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_MAP_OWNER_ID)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_MAP_OWNER_TYPE, sizeof(PARA_MAP_OWNER_TYPE)-1) == 0)
{
char szNum[256] = "0"; // 缺省OWNERID为0
sprintf(szNum, "%u", pUser->GetMap()->GetOwnerType());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_MAP_OWNER_TYPE)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_VALUE, sizeof(PARA_ITER_VALUE)-1) == 0)
{
char szNum[256] = "0"; // 缺省OWNERID为0
sprintf(szNum, "%u", pUser->TaskIterator());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITER_VALUE)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_SYN_NAME, sizeof(PARA_ITER_SYN_NAME)-1) == 0)
{
const char* pName = "--";
if(pUser->TaskIterator() != ID_NONE)
{
CSynPtr pSyn = SynManager()->QuerySyndicate((OBJID)pUser->TaskIterator());
if(pSyn)
pName = pSyn->GetStr(SYNDATA_NAME);
}
strcpy(ptr2, pName);
ptr += sizeof(PARA_ITER_SYN_NAME)-1;
ptr2 += strlen(pName);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_SYN_LEADER, sizeof(PARA_ITER_SYN_LEADER)-1) == 0)
{
const char* pName = "--";
if(pUser->TaskIterator() != ID_NONE)
{
CSynPtr pSyn = SynManager()->QuerySyndicate((OBJID)pUser->TaskIterator());
if(pSyn)
pName = pSyn->GetStr(SYNDATA_LEADERNAME);
}
strcpy(ptr2, pName);
ptr += sizeof(PARA_ITER_SYN_LEADER)-1;
ptr2 += strlen(pName);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_SYN_MONEY, sizeof(PARA_ITER_SYN_MONEY)-1) == 0)
{
char szNum[256] = "--"; // 缺省OWNERID为0
if(pUser->TaskIterator() != ID_NONE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -