📄 objectplayer.cpp
字号:
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 + -