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