⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameaction.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -