📄 objectengine.cpp
字号:
}
}
*/
if (nWeaponDamage > 0)
{
if (m_pUserInfo->GetWeapon())
DoDamageWeapon(nWeaponDamage);
}
if (nPower > 0)
{
pObject->StruckDamage(nPower);
// Debug Code
#ifdef _DEBUG
char szMsg[64];
if (m_wObjectType & _OBJECT_HUMAN)
{
sprintf(szMsg, "%s 嘎澜 - PW:%d HP:%d, 公扁郴备粹澜:%d", pObject->m_szName, nPower, pObject->m_WAbility.HP, nWeaponDamage);
SysMsg(szMsg, 0);
}
else if (pObject->m_wObjectType & _OBJECT_HUMAN)
{
sprintf(szMsg, "%s 嘎澜 - PW:%d HP:%d", pObject->m_szName, nPower, pObject->m_WAbility.HP);
pObject->SysMsg(szMsg, 0);
}
// Debug Code
#endif
AddDelayProcess(pObject, RM_STRUCK, nPower, pObject->m_WAbility.HP, pObject->m_WAbility.MaxHP, (LONG)this, NULL, 550);
if (!(pObject->m_wObjectType & _OBJECT_HUMAN))
pObject->AddProcess(pObject, RM_STRUCK, nPower, pObject->m_WAbility.HP, pObject->m_WAbility.MaxHP, (LONG)this, NULL);
return TRUE;
}
}
return FALSE;
}
BOOL CCharObject::HitXY(WORD wIdent, int nX, int nY, int nDir, int nHitStyle)
{
if ((GetTickCount() - m_dwLatestHitTime) < 600)
m_nHitTimeOverCount++;
else
m_nHitTimeOverCount = 0;
if (m_nHitTimeOverCount < 2)
{
if (m_nCurrX == nX && m_nCurrY == nY)
{
if (wIdent == CM_WIDEHIT && m_pUserInfo->m_lpTMagicBanwolSkill)
{
if (m_WAbility.MP > 0)
{
int nLevel = m_pUserInfo->GetMagicRcdByID(_SKILL_BANWOL)->btLevel;
int nSpellPoint = GetMagicInfo(_SKILL_BANWOL)->GetSpellPoint(nLevel);
DamageSpell(nSpellPoint);
HealthSpellChanged();
}
else
wIdent = CM_HIT;
}
m_nDirection = nDir;
m_dwLatestHitTime = GetTickCount();
CCharObject* pObject = GetFrontObject();
if (pObject)
{
if (_Attack(wIdent, pObject))
{
SelectTarget(pObject);
m_dwHealthTick -= 100;
m_dwSpellTick -= 100;
m_dwSpellTick = _MAX(0, m_dwSpellTick);
m_btPerHealth -= 2;
m_btPerSpell -= 2;
}
}
if (m_wObjectType & _OBJECT_HUMAN)
{
switch (wIdent)
{
case CM_HIT:
AddRefMsg(RM_HIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
break;
case CM_WIDEHIT:
AddRefMsg(RM_WIDEHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
break;
case CM_LONGHIT:
AddRefMsg(RM_LONGHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
break;
case CM_FIREHIT:
AddRefMsg(RM_FIREHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
break;
case CM_POWERHIT:
AddRefMsg(RM_POWERHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
break;
}
}
if (m_pUserInfo->m_lpTMagicPowerHitSkill) // 抗档 八过
{
m_pUserInfo->m_btAttackSkillCount--;
if (m_pUserInfo->m_btAttackSkillCount == m_pUserInfo->m_btAttackSkillPointCount)
{
m_pUserInfo->m_fPowerHitSkill = TRUE;
SendSocket(NULL, "+PWR");
}
if (m_pUserInfo->m_btAttackSkillCount <= 0)
{
m_pUserInfo->m_btAttackSkillCount = 7 - m_pUserInfo->m_lpTMagicPowerHitSkill->btLevel;
m_pUserInfo->m_btAttackSkillPointCount = rand() % m_pUserInfo->m_btAttackSkillCount;
}
}
return TRUE;
}
}
return FALSE;
}
void CCharObject::DoPushed(int nDirection)
{
int nFrontX, nFrontY;
m_nDirection = nDirection;
GetFrontPosition(nFrontX, nFrontY);
if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
{
AddRefMsg(RM_PUSH, GetBack(nDirection), m_nCurrX, m_nCurrY, 0, NULL);
m_nCurrX = nFrontX;
m_nCurrY = nFrontY;
}
}
void CCharObject::GoldChanged()
{
if (m_wObjectType & _OBJECT_HUMAN)
UpdateProcess(this, RM_GOLDCHANGED, 0, 0, 0, 0, NULL);
}
void CCharObject::HealthSpellChanged()
{
if (m_wObjectType & _OBJECT_HUMAN)
UpdateProcess(this, RM_HEALTHSPELLCHANGED, 0, 0, 0, 0, NULL);
if (m_fOpenHealth)
AddRefMsg(RM_HEALTHSPELLCHANGED, 0, 0, 0, 0, NULL);
}
CCharObject* CCharObject::AddCreatureSysop(int nX, int nY, CMonRaceInfo* pMonRaceInfo, BOOL fSearch)
{
CMonsterObject* pMonObject = AddCreature(m_pMap, nX, nY, pMonRaceInfo->nIndex, fSearch);
if (pMonObject)
{
if (g_pMonGenInfo)
g_pMonGenInfo[g_nNumOfMonGenInfo].xMonsterObjList.AddNewNode(pMonObject);
}
return (CCharObject*)pMonObject;
}
void CCharObject::DoMotaebo()
{
int nFrontX, nFrontY;
CCharObject* pCharObject = GetFrontObject();
if (pCharObject)
{
for (int i = 0; i < 5; i++)
{
pCharObject->DoPushed(m_nDirection);
GetFrontPosition(nFrontX, nFrontY);
if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
{
AddRefMsg(RM_RUSH, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
m_nCurrX = nFrontX;
m_nCurrY = nFrontY;
if (!(pCharObject = GetFrontObject()))
break;
}
else
break;
}
}
else
{
for (int i = 0; i < 5; i++)
{
GetFrontPosition(nFrontX, nFrontY);
if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
{
AddRefMsg(RM_RUSH, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
m_nCurrX = nFrontX;
m_nCurrY = nFrontY;
}
else
break;
}
}
}
/* **************************************************************************************
沤扁颇楷
************************************************************************************** */
BOOL CCharObject::DoShowHP(CCharObject* pObject, CMagicInfo* pMagicInfo, int nLevel)
{
if (pObject)
{
if (!pObject->m_fOpenHealth)
{
if ((rand() % 6) <= (3 + m_Ability.Level))
{
pObject->m_dwOpenHealthStart = GetTickCount();
pObject->m_dwOpenHealthTime = pMagicInfo->GetPower13(30 + GetRPow(m_WAbility.SC) * 2, nLevel) * 1000;
pObject->AddDelayProcess(pObject, RM_DOOPENHEALTH, 0, 0, 0, 0, NULL, 3000);
return TRUE;
}
}
}
return FALSE;
}
void CCharObject::MakeOpenHealth()
{
m_fOpenHealth = TRUE;
m_nCharStatusEx |= STATE_OPENHEATH;
m_nCharStatus = GetCharStatus();
AddRefMsg(RM_OPENHEALTH, 0, m_WAbility.HP/*lparam1*/, m_WAbility.MaxHP/*lparam2*/, 0, NULL);
}
void CCharObject::BreakOpenHealth()
{
m_fOpenHealth = FALSE;
m_nCharStatusEx ^= STATE_OPENHEATH;
m_nCharStatus = GetCharStatus();
AddRefMsg(RM_CLOSEHEALTH, 0, 0, 0, 0, NULL);
}
/* **************************************************************************************
公怕焊
************************************************************************************** */
int CCharObject::CharPushed(int nDir, int nPushCount)
{
int nFrontX, nFrontY;
int nResult = 0;
for (int i = 0; i < nPushCount; i++)
{
GetFrontPosition(nFrontX, nFrontY);
if (m_pMap->CanMove(nFrontX, nFrontY, FALSE))
{
if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
{
m_nCurrX = nFrontX;
m_nCurrY = nFrontY;
AddRefMsg(RM_PUSH, GetBack(nDir), m_nCurrX, m_nCurrY, 0, NULL);
nResult++;
}
}
}
m_nDirection = GetBack(nDir);
return nResult;
/*function TCreature.CharPushed (ndir, pushcount: integer): integer; //绢恫 塞俊 狼秦辑 剐妨唱促.
var
i, nx, ny, olddir, oldx, oldy: integer;
begin
Result := 0;
olddir := Dir;
oldx := CX;
oldy := CY;
Dir := ndir;
for i:=0 to pushcount-1 do begin
GetFrontPosition (self, nx, ny);
if PEnvir.CanWalk (nx, ny, FALSE{扳魔倾侩救窃}) then begin
if PEnvir.MoveToMovingObject (CX, CY, self, nx, ny, FALSE) > 0 then begin
CX := nx;
CY := ny;
SendRefMsg (RM_PUSH, GetBack(ndir), CX, CY, 0, '');
Inc (Result);
if RaceServer >= RC_ANIMAL then
WalkTime := WalkTime + 800; //剐府搁辑 词霸 锭赴促.
end else
break;
end else
break;
end;
Dir := GetBack(ndir); //olddir;
end;
*/
}
/* **************************************************************************************
拳堪浅
************************************************************************************** */
int CCharObject::MagPushArround(int nPushLevel)
{
int nLevelGap, nPush,nDir;
int nResult = 0;
if (m_xVisibleObjectList.GetCount())
{
PLISTNODE pListNode = m_xVisibleObjectList.GetHead();
CVisibleObject* pVisibleObject;
while (pListNode)
{
if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
{
if (abs(m_nCurrX - pVisibleObject->pObject->m_nCurrX) <= 1 && abs(m_nCurrY - pVisibleObject->pObject->m_nCurrY) <= 1)
{
if (!pVisibleObject->pObject->m_fIsDead && pVisibleObject->pObject != this)
{
if (m_Ability.Level > pVisibleObject->pObject->m_Ability.Level)
{
nLevelGap = m_Ability.Level - pVisibleObject->pObject->m_Ability.Level;
if ((rand() % 20) < 6 + nPushLevel * 3 + nLevelGap)
{
if (IsProperTarget(pVisibleObject->pObject))
{
nPush = 1 + _MAX(0, nPushLevel - 1) + rand() % 2;
nDir = GetNextDirection (pVisibleObject->pObject->m_nCurrX, pVisibleObject->pObject->m_nCurrY);
pVisibleObject->pObject->CharPushed(nDir, nPush);
nResult++;
}
}
}
}
}
} // if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
pListNode = m_xVisibleObjectList.GetNext(pListNode);
} // while (pListNode)
}
return nResult;
/*function TMagicManager.MagPushArround (user: TCreature; pushlevel: integer): integer;
var
i, ndir, levelgap, push: integer;
cret: TCreature;
begin
Result := 0;
for i:=0 to user.VisibleActors.Count-1 do begin
cret := TCreature (PTVisibleActor(user.VisibleActors[i]).cret);
if (abs(user.CX-cret.CX) <= 1) and (abs(user.CY-cret.CY) <= 1) then begin
if (not cret.Death) and (cret <> user) then begin
if (user.Abil.Level > cret.Abil.Level) and (not cret.StickMode) then begin
levelgap := user.Abil.Level - cret.Abil.Level;
if (Random(20) < 6+pushlevel*3+levelgap) then begin //荐访沥档俊 蝶扼辑
if user.IsProperTarget(cret) then begin
push := 1 + _MAX(0,pushlevel-1) + Random(2);
ndir := GetNextDirection (user.CX, user.CY, cret.CX, cret.CY);
cret.CharPushed (ndir, push);
Inc (Result);
end;
end;
end;
end;
end;
end;
end;
*/
}
/* **************************************************************************************
堪荤厘, 汾牢厘
************************************************************************************** */
int CCharObject::MagPassThroughMagic(int nStartX, int nStartY, int nTargetX, int nTargetY, int nDir, int nPwr, BOOL fUndeadAttack)
{
int nResult = 0;
CCharObject* pObject;
for (int i = 0; i < 12; i++)
{
pObject = m_pMap->GetObject(nStartX, nStartY);
if (pObject)
{
if (IsProperTarget(pObject))
{
if (pObject->m_btAntiMagic <= rand() % 10)
{
if (fUndeadAttack)
nPwr = ROUND(nPwr * 1.5);
pObject->AddDelayProcess(this, RM_MAGSTRUCK, 0, nPwr, 0, 0, NULL, 600);
nResult++;
}
}
}
if (!((abs(nStartX - nTargetX) <= 0) && (abs(nStartY - nTargetY) <= 0)))
{
nDir = GetNextDirection(nStartX, nStartY, nTargetX, nTargetY);
if (!(GetNextPosition(nStartX, nStartY, nDir, 1, nStartX, nStartY)))
break;
}
else
break;
}
return nResult;
/*
function TCreature.MagPassThroughMagic (sx, sy, tx, ty, ndir, magpwr: integer; undeadattack: Boolean): integer;
var
i, tcount, acpwr: integer;
cret: TCreature;
begin
tcount := 0;
for i:=0 to 12 do begin
cret := TCreature (PEnvir.GetCreature (sx, sy, TRUE));
if cret <> nil then begin
//if (RaceServer = RC_USERHUMAN) and (cret.RaceServer = RC_USERHUMAN) and ((cret.InSafeZone) or (InSafeZone)) then
// continue; //救傈瘤措
if IsProperTarget (cret) then begin
if cret.AntiMagic <= Random(10) then begin //付过 雀乔啊 乐澜
if undeadattack then //攫单靛 阁胶磐俊霸 傍拜仿 碍拳牢 版快
acpwr := Round (magpwr * 1.5)
else
acpwr := magpwr;
cret.SendDelayMsg (self, RM_MAGSTRUCK, 0, acpwr, 0, 0, '', 600);
Inc (tcount);
end;
end;
end;
if not ((abs(sx-tx) <= 0) and (abs(sy-ty) <= 0)) then begin
ndir := GetNextDirection (sx, sy, tx, ty);
if not GetNextPosition (PEnvir, sx, sy, ndir, 1, sx, sy) then
break;
end else
break;
end;
Result := tcount;
end; */
}
/* **************************************************************************************
林贱狼阜
************************************************************************************** */
BOOL CCharObject::MagBubbleDefenceUp(int nLevel, int nSec)
{
if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] == 0)
{
UINT nOldStatus = m_nCharStatus;
m_wStatusArr[STATE_BUBBLEDEFENCEUP] = (WORD)nSec;
m_dwStatusTime[STATE_BUBBLEDEFENCEUP] = GetTickCount();
m_nCharStatus = GetCharStatus();
if (nOldStatus != m_nCharStatus)
AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
m_fAbilMagBubbleDefence = TRUE;
m_btMagBubbleDefenceLevel = nLevel;
return TRUE;
}
return FALSE;
}
void CCharObject::DamageBubbleDefence()
{
if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] > 0)
{
if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] > 3)
m_wStatusArr[STATE_BUBBLEDEFENCEUP] -= 3;
else
m_wStatusArr[STATE_BUBBLEDEFENCEUP] = 1;
}
}
/* **************************************************************************************
瘤堪贱
*************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -