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

📄 objectplayer.cpp

📁 真正的传奇源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                  Dispose (pmi);
                  if RaceServer = RC_USERHUMAN then begin
                     if self is TUserHuman then begin
                        hum := TUserHuman(self);
                        TUserHuman(hum).SendAddItem (pu^);
                     end;
                  end;
                  Result := TRUE;
               end else begin
                  Dispose (pu);
                  PEnvir.AddToMap (CX, CY, OS_ITEMOBJECT, TObject(pmi));
               end;
            end;
         end;
   end;
end;
*/

int CPlayerObject::UpdateItemToDB(_LPTUSERITEMRCD lpMakeItemRcd, int nAction)
{
	char	szQuery[1024];

	char	szMakeDay[7];
	char	szMakeIndex[6];

	ZeroMemory(szMakeDay, sizeof(szMakeDay));
	ZeroMemory(szMakeIndex, sizeof(szMakeIndex));

	memcpy(szMakeDay, &lpMakeItemRcd->szMakeIndex[1], 6);
	memcpy(szMakeIndex, &lpMakeItemRcd->szMakeIndex[7], 5);

	if (atoi(szMakeDay) == 0 && atoi(szMakeIndex) == 0)
	{
		_TMAKEITEMRCD	tMakeItemRcd;

		tMakeItemRcd.szStdType	= lpMakeItemRcd->szMakeIndex[0];
		tMakeItemRcd.nDura		= lpMakeItemRcd->nDura;
		tMakeItemRcd.nDuraMax	= lpMakeItemRcd->nDuraMax;
		tMakeItemRcd.nStdIndex	= lpMakeItemRcd->nStdIndex;
		memcpy(tMakeItemRcd.btValue, lpMakeItemRcd->btValue, sizeof(lpMakeItemRcd->btValue));

		_TDEFAULTMESSAGE	Def;
		char				szEncodeMsg1[24];
		char				szEncodeMsg2[128];

		fnMakeDefMessage(&Def, DB_MAKEITEMRCD2, (int)this, 0, 0, 0);

		int nPos	= fnEncodeMessageA(&Def, szEncodeMsg1, sizeof(szEncodeMsg1));
		szEncodeMsg1[nPos] = '\0';
		
		nPos	= fnEncode6BitBufA((unsigned char *)lpMakeItemRcd, szEncodeMsg2, sizeof(_LPTMAKEITEMRCD), sizeof(szEncodeMsg2));
		
		strcpy(&szEncodeMsg2[nPos], m_pUserInfo->m_szUserID);
		strcat(szEncodeMsg2, "/");
		strcat(szEncodeMsg2, m_pUserInfo->m_szCharName);

		SendRDBSocket(2, szEncodeMsg1, szEncodeMsg2, strlen(szEncodeMsg2));

		return 1;
	}

	switch (nAction)
	{
		case _ITEM_ACTION_CREATE:
		{
/*			sprintf(szQuery, "INSERT TBL_CHARACTER_ITEM (FLD_LOGINID, FLD_CHARNAME, FLD_STDTYPE, FLD_MAKEDATE, FLD_MAKEINDEX, "
								"FLD_STDINDEX, FLD_DURA, FLD_DURAMAX, FLD_VALUE1, FLD_VALUE2, FLD_VALUE3, FLD_VALUE4, FLD_VALUE5, "
								"FLD_VALUE6, FLD_VALUE7, FLD_VALUE8, FLD_VALUE9, FLD_VALUE10, FLD_VALUE11, FLD_VALUE12, FLD_VALUE13, "
								"FLD_VALUE14, FLD_LASTOWNER, FLD_LASTACTION) "
								"VALUES( '%s', '%s', '%c', '%s', '%05d', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %s, %d )", 
								pszUserID, pszCharName, lpMakeItemRcd->szMakeIndex[0], g_szYesterDay, g_nItemIndexCnt,
								lpMakeItemRcd->nStdIndex, lpMakeItemRcd->nDura,	lpMakeItemRcd->nDuraMax, 
								lpMakeItemRcd->btValue[0], lpMakeItemRcd->btValue[1], lpMakeItemRcd->btValue[2], lpMakeItemRcd->btValue[3], 
								lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[6], lpMakeItemRcd->btValue[7], 
								lpMakeItemRcd->btValue[8], lpMakeItemRcd->btValue[9], lpMakeItemRcd->btValue[10], lpMakeItemRcd->btValue[11], 
								lpMakeItemRcd->btValue[12], lpMakeItemRcd->btValue[13], pszCharName, _ITEM_ACTION_CREATE);
*/			break;
		}
		case _ITEM_ACTION_THROW:
		{
			sprintf(szQuery, "UPDATE TBL_CHARACTER_ITEM SET FLD_LOGINID='%s', FLD_CHARNAME='%s', "
								"FLD_DURA=%d, FLD_DURAMAX=%d, FLD_VALUE1=%d, FLD_VALUE2=%d, FLD_VALUE3=%d, FLD_VALUE4=%d, FLD_VALUE5=%d, "
								"FLD_VALUE6=%d, FLD_VALUE7=%d, FLD_VALUE8=%d, FLD_VALUE9=%d, FLD_VALUE10=%d, FLD_VALUE11=%d, FLD_VALUE12=%d, FLD_VALUE13=%d, "
								"FLD_VALUE14=%d, FLD_LASTOWNER='%s', FLD_LASTACTION=%d "
								"WHERE FLD_STDTYPE='%c' AND FLD_MAKEDATE='%s' AND FLD_MAKEINDEX='%s' AND FLD_STDINDEX=%d",
								"0", "WEMADE", lpMakeItemRcd->nDura, lpMakeItemRcd->nDuraMax, 
								lpMakeItemRcd->btValue[0], lpMakeItemRcd->btValue[1], lpMakeItemRcd->btValue[2], lpMakeItemRcd->btValue[3], 
								lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[6], lpMakeItemRcd->btValue[7], 
								lpMakeItemRcd->btValue[8], lpMakeItemRcd->btValue[9], lpMakeItemRcd->btValue[10], lpMakeItemRcd->btValue[11], 
								lpMakeItemRcd->btValue[12], lpMakeItemRcd->btValue[13], m_pUserInfo->m_szCharName, _ITEM_ACTION_THROW,
								lpMakeItemRcd->szMakeIndex[0], szMakeDay, szMakeIndex, lpMakeItemRcd->nStdIndex);
			break;
		}
		case _ITEM_ACTION_PICKUP:
		{
			sprintf(szQuery, "UPDATE TBL_CHARACTER_ITEM SET FLD_LOGINID='%s', FLD_CHARNAME='%s', "
								"FLD_DURA=%d, FLD_DURAMAX=%d, FLD_VALUE1=%d, FLD_VALUE2=%d, FLD_VALUE3=%d, FLD_VALUE4=%d, FLD_VALUE5=%d, "
								"FLD_VALUE6=%d, FLD_VALUE7=%d, FLD_VALUE8=%d, FLD_VALUE9=%d, FLD_VALUE10=%d, FLD_VALUE11=%d, FLD_VALUE12=%d, FLD_VALUE13=%d, "
								"FLD_VALUE14=%d, FLD_LASTOWNER='%s', FLD_LASTACTION=%d "
								"WHERE FLD_STDTYPE='%c' AND FLD_MAKEDATE='%s' AND FLD_MAKEINDEX='%s' AND FLD_STDINDEX=%d",
								m_pUserInfo->m_szUserID, m_pUserInfo->m_szCharName, lpMakeItemRcd->nDura, lpMakeItemRcd->nDuraMax, 
								lpMakeItemRcd->btValue[0], lpMakeItemRcd->btValue[1], lpMakeItemRcd->btValue[2], lpMakeItemRcd->btValue[3], 
								lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[6], lpMakeItemRcd->btValue[7], 
								lpMakeItemRcd->btValue[8], lpMakeItemRcd->btValue[9], lpMakeItemRcd->btValue[10], lpMakeItemRcd->btValue[11], 
								lpMakeItemRcd->btValue[12], lpMakeItemRcd->btValue[13], "WEMADE", _ITEM_ACTION_PICKUP,
								lpMakeItemRcd->szMakeIndex[0], szMakeDay, szMakeIndex, lpMakeItemRcd->nStdIndex);
			break;
		}
		case _ITEM_ACTION_UPDATE:
		{
			sprintf(szQuery, "UPDATE TBL_CHARACTER_ITEM SET "
								"FLD_DURA=%d, FLD_DURAMAX=%d, FLD_VALUE1=%d, FLD_VALUE2=%d, FLD_VALUE3=%d, FLD_VALUE4=%d, FLD_VALUE5=%d, "
								"FLD_VALUE6=%d, FLD_VALUE7=%d, FLD_VALUE8=%d, FLD_VALUE9=%d, FLD_VALUE10=%d, FLD_VALUE11=%d, FLD_VALUE12=%d, FLD_VALUE13=%d, "
								"FLD_VALUE14=%d, FLD_LASTOWNER='%s', FLD_LASTACTION=%d, FLD_PREFIXNAME='%s' "
								"WHERE FLD_STDTYPE='%c' AND FLD_MAKEDATE='%s' AND FLD_MAKEINDEX='%s' AND FLD_STDINDEX=%d",
								lpMakeItemRcd->nDura, lpMakeItemRcd->nDuraMax, 
								lpMakeItemRcd->btValue[0], lpMakeItemRcd->btValue[1], lpMakeItemRcd->btValue[2], lpMakeItemRcd->btValue[3], 
								lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[6], lpMakeItemRcd->btValue[7], 
								lpMakeItemRcd->btValue[8], lpMakeItemRcd->btValue[9], lpMakeItemRcd->btValue[10], lpMakeItemRcd->btValue[11], 
								lpMakeItemRcd->btValue[12], lpMakeItemRcd->btValue[13], m_pUserInfo->m_szCharName, _ITEM_ACTION_UPDATE, lpMakeItemRcd->szPrefixName,
								lpMakeItemRcd->szMakeIndex[0], szMakeDay, szMakeIndex, lpMakeItemRcd->nStdIndex);
			break;
		}

		default:
			return 0;
	}

	CRecordset *pRec = g_pConnGame->CreateRecordset();

	if ( !pRec->Execute( szQuery ) || pRec->GetRowCount() <= 0 )
	{
		InsertLogMsg(_T("UpdateItemToDB : 盎脚 坷幅"));
		g_pConnGame->DestroyRecordset( pRec );

		return 0;
	}

	g_pConnGame->DestroyRecordset( pRec );

	return 2;
}

void CPlayerObject::WeightChanged()
{
	if (m_pUserInfo)
	{
		m_WAbility.Weight = m_pUserInfo->CalcBagWeight();
		UpdateProcess(this, RM_WEIGHTCHANGED, 0, 0, 0, 0, NULL); 
	}
}

void CPlayerObject::Whisper(char *pszChar, char *pszMsg)
{
	char	szChatMsg[512];
	int		nLen;

	CPlayerObject* pPlayerObject = GetUserHuman(pszChar);

	if (pPlayerObject)
	{
		nLen = memlen(m_pUserInfo->m_szCharName);

		memmove(szChatMsg, m_pUserInfo->m_szCharName, (nLen - 1));
		memmove(&szChatMsg[nLen - 1], "=> ", 3);
		memmove(&szChatMsg[nLen + 2], pszMsg, memlen(pszMsg));

		pPlayerObject->AddProcess(this, RM_WHISPER, 0, 0, 0, 0, szChatMsg);
	}
	else
	{
		TCHAR	wszMsg[64];

		nLen = memlen(pszChar);

		LoadString(g_hInst, IDS_CANTFIND_HUMAN, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));

		memmove(szChatMsg, pszChar, (nLen - 1));
		WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, &szChatMsg[nLen - 1], sizeof(szChatMsg) - nLen, NULL, NULL);

		SysMsg(szChatMsg, 0);
	}
}
/*procedure TUserHuman.Whisper (whostr, saystr: string);
var
   hum: TUserHuman;
   svidx: integer;
begin
   hum := TUserHuman (UserEngine.GetUserHuman (whostr));
   if hum <> nil then begin
      if not hum.ReadyRun then begin
         SysMsg (whostr + '丛俊霸 皋技瘤甫 傈崔 且 荐 绝嚼聪促.', 0);
         exit;
      end;
      if not hum.BoHearWhisper or hum.IsBlockWhisper (UserName) then begin
         SysMsg (whostr + '丛篮 庇加富 芭何吝 涝聪促.', 0);
         exit;
      end;
      hum.SendMsg (self, RM_WHISPER, 0, 0, 0, 0, UserName + '=> ' + saystr);
   end else begin
      if UserEngine.FindOtherServerUser (whostr, svidx) then begin
         UserEngine.SendInterMsg (ISM_WHISPER, svidx, whostr + '/' + UserName + '=> ' + saystr);
      end else
         SysMsg (whostr + '丛阑 茫阑 荐 绝嚼聪促.', 0);
   end;
end;
}
*/

int CPlayerObject::CalcGetExp(int nTagLevel, int nTagHP)
{
	int nExp;

	if (m_Ability.Level < nTagLevel + 10) nExp = nTagHP;
	else
		nExp = nTagHP - ROUND((nTagHP / 15) * (m_Ability.Level - (nTagLevel + 10)));

	if (nExp <= 0)
		nExp = 1;

	return nExp;
}

void CPlayerObject::AddBodyLuck(double fLuck)
{
/*	if (fLuck > 0) && (
   if (r > 0) and (BodyLuck < 5 * BODYLUCKUNIT) then
      BodyLuck := BodyLuck + r;
   if (r < 0) and (BodyLuck > -(5 * BODYLUCKUNIT)) then
      BodyLuck := BodyLuck + r;

   n := Trunc (BodyLuck / BODYLUCKUNIT);
   if n > 5 then n := 5;
   if n < -10 then n := -10;
   BodyLuckLevel := n;
end;
*/
}

void CPlayerObject::WinExp(int nExp)
{
	m_Ability.Exp += nExp;

	AddBodyLuck (nExp * 0.002);

	AddProcess(this, RM_WINEXP, 0, nExp, 0, 0);

	if (m_Ability.Exp >= m_Ability.MaxExp)
	{
		m_Ability.Exp	-= m_Ability.MaxExp;
		m_Ability.Level++;
		HasLevelUp(m_Ability.Level - 1);

		AddBodyLuck (100);
/*      AddUserLog ('肪诀_' +
                  UserName + '_' +
                  IntToStr(Abil.Level) + '_' +
                  IntToStr(Abil.Exp)); */
	}
}

void CPlayerObject::GainExp(int nExp)
{
	WinExp(nExp);
}
/*
procedure TCreature.GainExp (exp: longword);
var
   i, n, sumlv, dexp: integer;
   cret: TCreature;
const
   bonus: array[0..GROUPMAX] of Real = (1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2);
begin
   try
      if GroupOwner <> nil then begin
         sumlv := 0;
         n := 0;
         for i:=0 to GroupOwner.GroupMembers.Count-1 do begin
            cret := TCreature(GroupOwner.GroupMembers.Objects[i]);
            if not cret.Death and (PEnvir = cret.PEnvir) and (abs(CX-cret.CX) <= 12) and (abs(CY-cret.CY) <= 12) then begin
               sumlv := sumlv + cret.Abil.Level;
               Inc (n);
            end;
         end;
         if (sumlv > 0) and (n > 1) then begin
            if n in [0..GROUPMAX] then
               exp := Round (exp * bonus[n]);
            for i:=0 to GroupOwner.GroupMembers.Count-1 do begin
               cret := TCreature(GroupOwner.GroupMembers.Objects[i]);
               if not cret.Death and (PEnvir = cret.PEnvir) and (abs(CX-cret.CX) <= 12) and (abs(CY-cret.CY) <= 12) then
                  cret.WinExp (Round (exp / sumlv * cret.Abil.Level));
            end;
         end else
            WinExp (exp);
      end else
         WinExp (exp);
   except
      MainOutMessage ('[Exception] TCreature.GainExp');
   end;
end;
*/

void CPlayerObject::HasLevelUp(int nPrevLevel)
{
   m_Ability.MaxExp = NEEDEXPS[m_Ability.Level];

   RecalcLevelAbilitys();
/*
{$IFDEF FOR_ABIL_POINT}
//4/16老 何磐 利侩
   if prevlevel + 1 = Abil.Level then begin
      BonusPoint := BonusPoint + GetBonusPoint (Job, Abil.Level);  //肪诀俊 蝶弗 焊呈胶
      SendMsg (self, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
   end else begin
      if prevlevel <> Abil.Level then begin
         //焊呈胶 器牢飘甫 贸澜何磐 促矫 拌魂茄促.
         BonusPoint := GetLevelBonusSum (Job, Abil.Level);
         FillChar (BonusAbil, sizeof(TNakedAbility), #0);
         FillChar (CurBonusAbil, sizeof(TNakedAbility), #0);
         //if prevlevel <> 0 then begin
         RecalcLevelAbilitys;  //饭骇俊 蝶弗 瓷仿摹甫 拌魂茄促.
         //end else begin
         //   RecalcLevelAbilitys_old;
         //   BonusPoint := 0;
         //end;
         SendMsg (self, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
      end;
   end;
{$ENDIF}
*/
	RecalcAbilitys();
	
	AddProcess(this, RM_LEVELUP, 0, m_Ability.Exp, 0, 0, NULL);
}

void CPlayerObject::RecalcHitSpeed()
{
	m_nHitDouble = 0;

	/*HitPoint := DEFHIT + BonusAbil.Hit;*/
	m_btHitPoint = 5;

   /*case Job of
      2: SpeedPoint := DEFSPEED + BonusAbil.Speed + 3;  //档荤绰 扁夯 刮酶捞 臭促.
      else SpeedPoint := DEFSPEED + BonusAbil.Speed;
   end;*/
	if (m_pUserInfo->GetJob() == 2)
		m_btSpeedPoint = DEFSPEED + 3;
	else
		m_btSpeedPoint = DEFSPEED;

	m_pUserInfo->m_lpTMagicErgumSkill		= NULL;
	m_pUserInfo->m_lpTMagicBanwolSkill		= NULL;
	m_pUserInfo->m_lpTMagicFireSwordSkill	= NULL;
	m_pUserInfo->m_lpTMagicOneSwordSkill	= NULL;
	m_pUserInfo->m_lpTMagicIlkwangSkill		= NULL;
	m_pUserInfo->m_lpTMagicPowerHitSkill	= NULL;

	PLISTNODE pListNode = m_pUserInfo->m_lpTMagicRcd.GetHead();

	while (pListNode)
	{
		_LPTHUMANMAGICRCD	lptUserMagicRcd = m_pUserInfo->m_lpTMagicRcd.GetData(pListNode);

		switch (lptUserMagicRcd->btMagicID)
		{
			case _SKILL_ILKWANG:
			{
				m_pUserInfo->m_lpTMagicIlkwangSkill = lptUserMagicRcd;

				if (lptUserMagicRcd->btLevel > 0)
					m_btHitPoint += ROUND(8 / 3 * lptUserMagicRcd->btLevel);

				break;
			}
			case _SKILL_ERGUM:
				m_pUserInfo->m_lpTMagicErgumSkill = lptUserMagicRcd;
				break;
			case _SKILL_BANWOL:
				m_pUserInfo->m_lpTMagicBanwolSkill = lptUserMagicRcd;
				break;
			case _SKILL_FIRESWORD:
			{
				m_pUserInfo->m_lpTMagicFireSwordSkill = lptUserMagicRcd;
				m_nHitDouble = 4 + lptUserMagicRcd->btLevel * 4;  //+40% ~ +160%
				break;
			}
			case _SKILL_ONESWORD:
			{
				m_pUserInfo->m_lpTMagicOneSwordSkill = lptUserMagicRcd;

				if (lptUserMagicRcd->btLevel > 0)
					m_btHitPoint += ROUND(9 / 3 * lptUserMagicRcd->btLevel);

				break;
			}
			case _SKILL_YEDO:
			{
				m_pUserInfo->m_lpTMagicPowerHitSkill = lptUserMagicRcd;

				if (lptUserMagicRcd->btLevel > 0)
					m_btHitPoint += ROUND(3 / 3 * lptUserMagicRcd->btLevel);

				m_btHitPlus = 5 + lptUserMagicRcd->btLevel;

				m_pUserInfo->m_btAttackSkillCount		= 7 - lptUserMagicRcd->btLevel;
				m_pUserInfo->m_btAttackSkillPointCount	= rand() % m_pUserInfo->m_btAttackSkillCount;

				break;
			}
		}

		pListNode = m_pUserInfo->m_lpTMagicRcd.GetNext(pListNode);
	}
}

void CPlayerObject::RecalcAbilitys()
{
	BOOL fCGHI[4];

	m_btAntiPoison		= 0;
	m_btPoisonRecover	= 0;
	m_btHealthRecover	= 0;
	m_btSpellRecover	= 0;
	m_btAntiMagic		= 1;   //扁夯 10%
	
	m_sHitSpeed			= 0;

⌨️ 快捷键说明

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