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

📄 objectengine.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			m_dwHealthTick += HEALTHFILLTICK;

			HealthSpellChanged();
		}
	}

	return FALSE;
}

/*
procedure TCreature.ScatterGolds;
const
   ONEDROP = 10000;
var
   i, ngold: integer;
begin
   if Gold > 0 then begin
      for i:=0 to 8 do begin
         if Gold > ONEDROP then begin
            ngold := ONEDROP;
            Gold := Gold - ONEDROP;
         end else begin
            ngold := Gold;
            Gold := 0;
         end;
         if ngold > 0 then begin
            if not DropGoldDown (ngold, TRUE) then begin
               Gold := Gold + ngold;
               break;
            end;
         end else break;
      end;
      GoldChanged;
   end;
end;
*/
BOOL CCharObject::DropItemDown(_LPTUSERITEMRCD lpTItemRcd, int nRange, BOOL fIsGenItem)
{
	CMapItem* xpMapItem = new CMapItem;

	xpMapItem->nCount = 1;

	if (fIsGenItem)
	{
		_LPTGENERALITEMRCD lpTGenItemRcd = NULL;
		
		lpTGenItemRcd = (_LPTGENERALITEMRCD)lpTItemRcd;

		xpMapItem->wLooks		= (WORD)g_pStdItemEtc[lpTGenItemRcd->nStdIndex].dwLooks;
		xpMapItem->btAniCount	= (BYTE)0;
		
		xpMapItem->pItem		= (LONG)lpTGenItemRcd;
		memmove(xpMapItem->szName, g_pStdItemEtc[lpTGenItemRcd->nStdIndex].szName, memlen(g_pStdItemEtc[lpTGenItemRcd->nStdIndex].szName));
	}
	else
	{
		xpMapItem->wLooks		= (WORD)g_pStdItemSpecial[lpTItemRcd->nStdIndex].dwLooks;
		xpMapItem->btAniCount	= (BYTE)g_pStdItemSpecial[lpTItemRcd->nStdIndex].wAniCount;
		
		xpMapItem->pItem		= (LONG)lpTItemRcd;
		
		if (strlen(lpTItemRcd->szPrefixName))
		{
			strcpy(xpMapItem->szName, lpTItemRcd->szPrefixName);
			strcat(xpMapItem->szName, " ");
			strcat(xpMapItem->szName, g_pStdItemSpecial[lpTItemRcd->nStdIndex].szName);
		}
		else
			strcpy(xpMapItem->szName, g_pStdItemSpecial[lpTItemRcd->nStdIndex].szName);
	}

	int nX, nY;

	m_pMap->GetDropPosition(m_nCurrX, m_nCurrY, nRange, nX, nY);
	m_pMap->AddNewObject(nX, nY, OS_ITEMOBJECT, (VOID *)xpMapItem);

	AddRefMsg(RM_ITEMSHOW, xpMapItem->wLooks, (int)xpMapItem, nX, nY, xpMapItem->szName);

	return TRUE;
}
/*
function  TCreature.DropItemDown (ui: TUserItem; scatterrange: integer; diedrop: Boolean): Boolean;
var
   dx, dy, idura: integer;
   pmi, pr: PTMapItem;
   ps: PTStdItem;
   logcap: string;
begin
   Result := FALSE;
   ps := UserEngine.GetStdItem (ui.Index);
   if ps <> nil then begin

      if ps.StdMode = 40 then begin //绊扁甫 顶俊 冻绢哆赴 版快 绊扁 前龙捞 冻绢柳促.
         idura := ui.Dura; //word捞骨肺.
         idura := idura - 2000; //绊扁 前龙捞 冻绢柳促.
         if idura < 0 then idura := 0;
         ui.Dura := idura;
      end;

      new (pmi);
      pmi.UserItem := ui;
      pmi.Name := ps.Name;
      pmi.Looks := ps.Looks;
      if ps.StdMode = 45 then begin  //林荤困, 格犁
         pmi.Looks := GetRandomLook (pmi.Looks, ps.Shape);
      end;
      pmi.AniCount := ps.AniCount;
      pmi.Reserved := 0;
      pmi.Count := 1;
      GetDropPosition (CX, CY, scatterrange, dx, dy);
      pr := Penvir.AddToMap (dx, dy, OS_ITEMOBJECT, TObject (pmi));  //茄伎俊 5俺 捞惑狼 酒捞袍捞 乐栏搁 角菩茄促.
      if pr = pmi then begin
         //酒捞袍篮 眠啊 酒聪搁 角菩..
         SendRefMsg (RM_ITEMSHOW, pmi.Looks, integer(pmi), dx, dy, pmi.Name);
         //冻绢哆覆
         if diedrop then logcap := '冻崩_'
         else logcap := '滚覆_';
         if not IsCheapStuff (ps.StdMode) then
            AddUserLog (logcap +
                        MapName + '_' +
                        IntToStr(CX) + '_' +
                        IntToStr(CY) + '_' +
                        BoolToStr(RaceServer = RC_USERHUMAN) + '_' +
                        UserName + '_' +
                        UserEngine.GetStdItemName (ui.Index) + '_' +
                        IntToStr(ui.MakeIndex));
         Result := TRUE;
      end else begin
         //角菩牢版快
         Dispose (pmi);
      end;
   end;
end;
}
*/

void CCharObject::Run()
{
	if (m_fOpenHealth)
	{
		if (GetTickCount() - m_dwOpenHealthStart > m_dwOpenHealthTime)
			BreakOpenHealth();
	}

	BOOL fChg = FALSE;
	BOOL fNeedRecalc = FALSE;

	for (int i = 0; i < MAX_STATUS_ATTRIBUTE; i++)
	{
		if (m_wStatusArr[i] > 0 && m_wStatusArr[i] < 60000)
		{
			if (GetTickCount() - m_dwStatusTime[i] > 1000)
			{
				m_wStatusArr[i]		-= 1;
				m_dwStatusTime[i]	+= 1000;

				if (m_wStatusArr[i] == 0)
				{
					fChg = TRUE;

					switch (i)
					{
						case STATE_DEFENCEUP:
							fNeedRecalc = TRUE;
							SysMsg("规绢仿 惑铰 秦力", 1);
							break;
                        case STATE_MAGDEFENCEUP:
							fNeedRecalc = TRUE;
							SysMsg("付亲仿 惑铰 秦力", 1);
							break;
/*                        case STATE_TRANSPARENT:
                           begin
                              BoHumHideMode := FALSE;
                           end; */
                        case STATE_BUBBLEDEFENCEUP:
							m_fAbilMagBubbleDefence = FALSE;
							break;
					}
				}
			}
		}
	}

	if (fChg)
	{
		m_nCharStatus = GetCharStatus();
		AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
	}

	if (fNeedRecalc)
	{
		((CPlayerObject*)this)->RecalcAbilitys();
		AddProcess(this, RM_ABILITY, 0, 0, 0, 0, NULL);
	}
}

void CCharObject::Die()
{
	if (m_fIsNeverDie) return;

	m_IncHealing	= 0;
	m_IncHealth		= 0;
	m_IncSpell		= 0;

	m_dwDeathTime	= GetTickCount();

	if (m_wObjectType & (_OBJECT_ANIMAL | _OBJECT_HUMAN))
		AddRefMsg(RM_DEATH, m_nDirection, m_nCurrX, m_nCurrY, 1, NULL);

	m_fIsDead		= TRUE;
/*
   try
      boPK := FALSE;
      if (not BoVentureServer) and (not PEnvir.FightZone) and (not PEnvir.Fight3Zone) then begin
         //PK陛瘤 备开牢 版快
         if (RaceServer = RC_USERHUMAN) and (LastHiter <> nil) and (PKLevel < 2) then begin
            //磷篮磊啊 荤恩, 锭赴磊 乐澜, 磷篮磊啊 PK酒丛
            if LastHiter.RaceServer = RC_USERHUMAN then
               boPK := TRUE;
            if LastHiter.Master <> nil then
               if LastHiter.Master.RaceServer = RC_USERHUMAN then begin
                  LastHiter := LastHiter.Master; //林牢捞 锭赴 巴栏肺 埃林
                  boPK := TRUE;
               end;
         end;
      end;

      if boPK and (LastHiter <> nil) then begin
         //荤恩捞 磷篮 版快, 葛氰辑滚俊辑绰 秦寸救凳
         //荤恩捞 急樊茄 荤恩阑 磷烙.

         //巩颇傈栏肺 磷澜
         guildwarkill := FALSE;
         if (MyGuild <> nil) and (LastHiter.MyGuild <> nil) then begin
            //笛促 巩颇俊 啊涝等 惑怕俊辑
            if GetGuildRelation (self, LastHiter) = 2 then  //巩颇傈 吝烙
               guildwarkill := TRUE;  //巩颇傈栏肺 磷澜, 弧盎捞 救凳
         end;

         //傍己傈栏肺 磷澜
         if UserCastle.BoCastleUnderAttack then
            if (BoInFreePKArea) or (UserCastle.IsCastleWarArea (PEnvir, CX, CY)) then
               guildwarkill := TRUE;

         if not guildwarkill then begin //巩颇傈栏肺 磷澜
            if not LastHiter.IsGoodKilling(self) then begin
               LastHiter.IncPkPoint (100); //
               LastHiter.SysMsg ('寸脚篮 混牢阑 窍看嚼聪促.', 0);
               //混牢茄 荤恩 青款 皑家
               LastHiter.AddBodyLuck (-500);
               if PkLevel < 1 then //磷篮 荤恩捞 馒茄 荤恩
                  if Random(5) = 0 then //混牢阑 窍搁 公扁啊 历林甫 罐绰促.
                     LastHiter.MakeWeaponUnlock;
            end else
               LastHiter.SysMsg ('[沥寸规绢 痹蘑俊 狼秦 焊龋凳]', 1);
         end;

      end;
   except
      MainOutMessage ('[Exception] TCreature.Die 2');
   end;

   try
      if (not PEnvir.FightZone) and
         (not PEnvir.Fight3Zone) and
         (not BoAnimal) then begin //悼拱捞搁 戒绢具 绊扁啊 唱柯促.
         DropUseItems;
         if (Master = nil) and (not BoNoItem) then
            ScatterBagItems;  //林牢乐绰 各篮 拱扒阑 汝府瘤 臼澜
         if (RaceServer >= RC_ANIMAL) and (Master = nil) and (not BoNoItem) then
            ScatterGolds;
         //磷篮 版快 青款摹 皑家
         AddBodyLuck ( - (50 - (50 - Abil.Level * 5)));
      end;

      //巩颇 措傈 吝
      if PEnvir.Fight3Zone then begin
         //3锅 磷绢档 登绰 措访牢 版快
         Inc (FightZoneDieCount);
         if MyGuild <> nil then begin
            TGuild(MyGuild).TeamFightWhoDead (UserName);
         end;

         //痢荐 拌魂
         if (LastHiter <> nil) then begin
            if (LastHiter.MyGuild <> nil) and (MyGuild <> nil) then begin
               TGuild(LastHiter.MyGuild).TeamFightWhoWinPoint (LastHiter.UserName, 100);  //matchpoint 刘啊, 俺牢己利 扁废
               str := TGuild(LastHiter.MyGuild).GuildName + ':' +
                      IntToStr(TGuild(LastHiter.MyGuild).MatchPoint) + '  ' +
                      TGuild(MyGuild).GuildName + ':' +
                      IntToStr(TGuild(MyGuild).MatchPoint);
               UserEngine.CryCry (RM_CRY, PEnvir, CX, CY, 10000, '- ' + str);  //泅甘 傈眉俊霸 舅赴促.
            end;
         end;
      end;

      //肺弊甫 巢变促.
      if RaceServer = RC_USERHUMAN then begin
         if LastHiter <> nil then begin
            if LastHiter.RaceServer = RC_USERHUMAN then str := LastHiter.UserName
            else str := '#' + LastHiter.UserName;
         end else str := '####';
         AddUserLog ('磷澜_' +
                     MapName + '_' +
                     IntToStr(CX) + '_' +
                     IntToStr(CY) + '_' +
                     UserName + '_' +
                     str + '_' +
                     'FZ-' + BoolToStr(PEnvir.FightZone) + '_' +
                     'F3-' + BoolToStr(PEnvir.Fight3Zone));
      end;

      SendRefMsg (RM_DEATH, Dir, CX, CY, 1, '');
   except
      MainOutMessage ('[Exception] TCreature.Die 3');
   end;
end;
*/
}

BOOL CCharObject::GetAvailablePosition(CMirMap* pMap, int &nX, int &nY, int nRange)
{
	if (pMap->CanMove(nX, nY))
		return TRUE;

	int nOrgX		= nX;
	int nOrgY		= nY;
	int nLoonCnt	= (4 * nRange) * (nRange + 1);

	for (int i = 0; i < nLoonCnt; i++)
	{
		nX = nOrgX + g_SearchTable[i].x;
		nY = nOrgY + g_SearchTable[i].y;

		if (pMap->CanMove(nX, nY))
			return TRUE;
	}
	
	nX = nOrgX;
	nY = nOrgY;

	return FALSE;
}

BOOL CCharObject::GetNextPosition(int nSX, int nSY, int nDir, int nDistance, int& nX, int& nY)
{
	nX = nSX;
	nY = nSY;

	switch (nDir)
	{
		case DR_UP:
			if (nY > (nDistance - 1)) nY -= nDistance;
			break;
		case DR_DOWN:
			if (nY < m_pMap->m_stMapFH.shHeight - nDistance) nY += nDistance;
			break;
		case DR_LEFT:
			if (nX > (nDistance - 1)) nX -= nDistance;
			break;
		case DR_RIGHT:
			if (nX < m_pMap->m_stMapFH.shWidth - nDistance) nX += nDistance;
			break;
		case DR_UPLEFT:
		{
			if ((nX > nDistance - 1) && (nY > nDistance - 1))
			{
				nX -= nDistance;
				nY -= nDistance;
			}

			break;
		}
		case DR_UPRIGHT:
		{
			if ((nX > nDistance - 1) && (nY < m_pMap->m_stMapFH.shHeight - nDistance))
			{
				nX += nDistance;
				nY -= nDistance;
			}

			break;
		}
		case DR_DOWNLEFT:
		{
			if ((nX < m_pMap->m_stMapFH.shWidth - nDistance) && (nY > nDistance - 1))
			{
				nX -= nDistance;
				nY += nDistance;
			}

			break;
		}
		case DR_DOWNRIGHT:
		{
			if ((nX < m_pMap->m_stMapFH.shWidth - nDistance) && (nY < m_pMap->m_stMapFH.shHeight - nDistance))
			{
				nX += nDistance;
				nY += nDistance;
			}

			break;
		}
	}

	if ((m_nCurrX == nX) && (m_nCurrY == nY))
		return FALSE;

	return TRUE;
}

int	CCharObject::GetNextDirection(int nStartX, int nStartY, int nTargetX, int nTargetY)
{
	int nFlagX, nFlagY;

	if (nStartX < nTargetX) nFlagX = 1;
	else if (nStartX == nTargetX) nFlagX = 0;
	else
		nFlagX = -1;

	if (abs(nStartY - nTargetY) > 2)
	{
		if ((nStartY >= nTargetY - 1) && (nStartY <= nTargetY + 1))
			nFlagX = 0;
	}

	if (nStartY < nTargetY) nFlagY = 1;
	else if (nStartY == nTargetY) nFlagY = 0;
	else
		nFlagY = -1;

	if (abs(nStartX - nTargetX) > 2)
	{
		if ((nStartX >= nTargetX - 1) && (nStartX <= nTargetX + 1))
			nFlagY = 0;
	}

	if ((nFlagX == 0) && (nFlagY == -1)) return DR_UP;
	else if ((nFlagX == 1) && (nFlagY == -1)) return DR_UPRIGHT;
	else if ((nFlagX == 1) && (nFlagY == 0)) return DR_RIGHT;
	else if ((nFlagX == 1) && (nFlagY == 1)) return DR_DOWNRIGHT;
	else if ((nFlagX == 0) && (nFlagY == 1)) return DR_DOWN;
	else if ((nFlagX == -1) && (nFlagY == 1)) return DR_DOWNLEFT;
	else if ((nFlagX == -1) && (nFlagY == 0)) return DR_LEFT;
	else if ((nFlagX == -1) && (nFlagY == -1)) return DR_UPLEFT;

	return DR_DOWN;
}

CCharObject* CCharObject::GetFrontObject()
{
	int nX, nY;

	GetFrontPosition(nX, nY);

	CCharObject* pCharObject = m_pMap->GetObject(nX, nY);

	if (pCharObject)
		return pCharObject;

	return NULL;
}

void CCharObject::UpdateDelayProcessCheckParam1(CCharObject* pCharObject, WORD wIdent, WORD wParam, DWORD lParam1, DWORD lParam2, DWORD lParam3, char *pszData, int nDelay)
{
	_LPTPROCESSMSG	lpProcessMsg;

	int nCount = m_DelayProcessQ.GetCount();

	if (nCount)
	{
		for (int i = 0; i < nCount; i++)
		{
			lpProcessMsg = (_LPTPROCESSMSG)m_DelayProcessQ.PopQ();

			if (lpProcessMsg)
			{
				if (lpProcessMsg->wIdent == wIdent && lpProcessMsg->lParam1 == lParam1)
				{
					if (lpProcessMsg->pszData)
					{
						delete [] lpProcessMsg->pszData;
						lpProcessMsg->pszData = NULL;
					}
					
					delete lpProcessMsg;
					lpProcessMsg = NULL;
				}
				else
					m_DelayProcessQ.PushQ((BYTE *)lpProcessMsg);
			}
		}
	}

	AddDelayProcess(pCharObject, wIdent, wParam, lParam1, lParam2, lParam3, pszData, nDelay);
}

void CCharObject::UpdateProcess(CCharObject* pCharObject, WORD wIdent, WORD wParam, DWORD lParam1, DWORD lParam2, DWORD lParam3, char *pszData)
{
	_LPTPROCESSMSG	lpProcessMsg;

//	EnterCriticalSection(&m_cs);

	int nCount = m_ProcessQ.GetCount();

	if (nCount)
	{
		for (int i = 0; i < nCount; i++)
		{
			lpProcessMsg = (_LPTPROCESSMSG)m_ProcessQ.PopQ();

			if (lpProcessMsg)
			{
				if (lpProcessMsg->wIdent == wIdent)
				{
					if (lpProcessMsg->pszData)
					{
						delete [] lpProcessMsg->pszData;
						lpProcessMsg->pszData = NULL;
					}
					
					delete lpProcessMsg;
					lpProcessMsg = NULL;
				}
				else
					m_ProcessQ.PushQ((BYTE *)lpProcessMsg);
			}
		}
	}

//	LeaveCriticalSection(&m_cs);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -