MR-2: Auto-revert POS_FIGHTING after inactivity + Realtime character level updates + Macros removed
This commit is contained in:
@@ -7,11 +7,6 @@
|
||||
#define __PET_SYSTEM__
|
||||
#define __UDP_BLOCK__
|
||||
|
||||
#define FIX_BOOK_READING_FOR_MAX_LEVEL // Disable experience point deduction for reading a book when in max level
|
||||
#define FIX_BATTLE_INACTIVITY_TIMEOUT // by #tw1x1: Add battle mode inactivity timeout and reset to standing
|
||||
#define __BL_LEVEL_FIX__ // Live character level updates
|
||||
//#define FIX_POS_SYNC // Fix position synching between clients
|
||||
|
||||
// #define TW1X1_TEST // tw1x1 test server features
|
||||
|
||||
#endif
|
||||
|
||||
@@ -4096,6 +4096,7 @@ void CHARACTER::UpdateStateMachine(DWORD dwPulse)
|
||||
if (IsDead())
|
||||
return;
|
||||
|
||||
// tw1x1: POS_FIGHTING timer fix
|
||||
if (IsPC() && IsPosition(POS_FIGHTING))
|
||||
{
|
||||
const DWORD now = get_dword_time();
|
||||
@@ -4107,6 +4108,7 @@ void CHARACTER::UpdateStateMachine(DWORD dwPulse)
|
||||
if (now - m_dwLastCombatTime >= 10000)
|
||||
SetVictim(NULL); // triggers battle_end() -> POS_STANDING
|
||||
}
|
||||
// tw1x1: end
|
||||
|
||||
Update();
|
||||
m_dwNextStatePulse = dwPulse + m_dwStateDuration;
|
||||
@@ -5924,11 +5926,7 @@ void CHARACTER::ResetPoint(int iLv)
|
||||
{
|
||||
BYTE bJob = GetJob();
|
||||
|
||||
#if defined(__BL_LEVEL_FIX__)
|
||||
PointChange(POINT_LEVEL, iLv - GetLevel(), false, true);
|
||||
#else
|
||||
PointChange(POINT_LEVEL, iLv - GetLevel());
|
||||
#endif
|
||||
|
||||
SetRealPoint(POINT_ST, JobInitialPoints[bJob].st);
|
||||
SetPoint(POINT_ST, GetRealPoint(POINT_ST));
|
||||
|
||||
@@ -2048,6 +2048,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
|
||||
int m_iLastPMPulse;
|
||||
int m_iPMCounter;
|
||||
|
||||
// tw1x1: POS_FIGHTING timer fix
|
||||
public:
|
||||
void EnterCombat();
|
||||
void UpdateLastCombatTime() { m_dwLastCombatTime = get_dword_time(); }
|
||||
@@ -2055,6 +2056,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
|
||||
|
||||
private:
|
||||
DWORD m_dwLastCombatTime;
|
||||
// tw1x1: end
|
||||
};
|
||||
|
||||
ESex GET_SEX(LPCHARACTER ch);
|
||||
|
||||
@@ -1600,22 +1600,6 @@ void CHARACTER::SendDamagePacket(LPCHARACTER pAttacker, int Damage, BYTE DamageF
|
||||
}
|
||||
}
|
||||
|
||||
void CHARACTER::EnterCombat()
|
||||
{
|
||||
if (!IsPC())
|
||||
return;
|
||||
|
||||
if (!IsPosition(POS_FIGHTING))
|
||||
{
|
||||
SetPosition(POS_FIGHTING);
|
||||
SetNextStatePulse(1);
|
||||
}
|
||||
|
||||
// Start the 10s window if it hasn't started yet.
|
||||
if (m_dwLastCombatTime == 0)
|
||||
m_dwLastCombatTime = get_dword_time();
|
||||
}
|
||||
|
||||
//
|
||||
// CHARACTER::Damage 메소드는 this가 데미지를 입게 한다.
|
||||
//
|
||||
@@ -1629,7 +1613,6 @@ void CHARACTER::EnterCombat()
|
||||
// false : not dead yet
|
||||
//
|
||||
|
||||
#ifdef FIX_BATTLE_INACTIVITY_TIMEOUT
|
||||
// tw1x1: POS_FIGHTING timer fix
|
||||
void CHARACTER::EnterCombat()
|
||||
{
|
||||
@@ -1642,7 +1625,6 @@ void CHARACTER::EnterCombat()
|
||||
SetNextStatePulse(1);
|
||||
}
|
||||
// tw1x1: end
|
||||
#endif
|
||||
|
||||
bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // returns true if dead
|
||||
{
|
||||
@@ -2331,8 +2313,6 @@ bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // retu
|
||||
if (GetHP() - dam <= 0)
|
||||
dam = GetHP();
|
||||
|
||||
dam = std::min<int32_t>(GetHP(), dam);
|
||||
|
||||
// tw1x1: POS_FIGHTING timer fix
|
||||
// REAL combat activity only: final damage > 0
|
||||
if (dam > 0)
|
||||
|
||||
@@ -445,11 +445,7 @@ bool CHARACTER::LearnSkillByBook(DWORD dwSkillVnum, BYTE bProb)
|
||||
{
|
||||
need_exp = 20000;
|
||||
|
||||
#ifdef FIX_BOOK_READING_FOR_MAX_LEVEL
|
||||
if (GetExp() < need_exp && GetLevel() < gPlayerMaxLevel)
|
||||
#else
|
||||
if (GetExp() < need_exp)
|
||||
#endif
|
||||
{
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("경험치가 부족하여 책을 읽을 수 없습니다."));
|
||||
return false;
|
||||
@@ -2489,11 +2485,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
|
||||
if (!pkSk)
|
||||
return false;
|
||||
|
||||
if (IsPC() && IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))
|
||||
{
|
||||
EnterCombat();
|
||||
}
|
||||
|
||||
if (bCanUseHorseSkill && pkSk->dwType != SKILL_TYPE_HORSE)
|
||||
return BATTLE_NONE;
|
||||
|
||||
@@ -2655,14 +2646,12 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
|
||||
AddChainLightningExcept(pkVictim);
|
||||
}
|
||||
|
||||
#ifdef FIX_BATTLE_INACTIVITY_TIMEOUT
|
||||
// tw1x1: POS_FIGHTING timer fix
|
||||
if (IsPC() && IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))
|
||||
{
|
||||
EnterCombat();
|
||||
}
|
||||
// tw1x1: end
|
||||
#endif
|
||||
|
||||
if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
|
||||
ComputeSkill(dwVnum, this);
|
||||
|
||||
@@ -864,11 +864,7 @@ namespace quest
|
||||
ch->PointChange(POINT_SUB_SKILL, newLevel < 10 ? 0 : newLevel - MAX(ch->GetLevel(), 9));
|
||||
ch->PointChange(POINT_STAT, ((MINMAX(1, newLevel, 90) - ch->GetLevel()) * 3) + ch->GetPoint(POINT_LEVEL_STEP));
|
||||
//레벨
|
||||
#if defined(__BL_LEVEL_FIX__)
|
||||
ch->PointChange(POINT_LEVEL, newLevel - ch->GetLevel(), false, true);
|
||||
#else
|
||||
ch->PointChange(POINT_LEVEL, newLevel - ch->GetLevel());
|
||||
#endif
|
||||
//HP, SP
|
||||
ch->SetRandomHP((newLevel - 1) * number(JobInitialPoints[ch->GetJob()].hp_per_lv_begin, JobInitialPoints[ch->GetJob()].hp_per_lv_end));
|
||||
ch->SetRandomSP((newLevel - 1) * number(JobInitialPoints[ch->GetJob()].sp_per_lv_begin, JobInitialPoints[ch->GetJob()].sp_per_lv_end));
|
||||
|
||||
Reference in New Issue
Block a user