11 Commits

Author SHA1 Message Date
rtw1x1
7a59fdd7b4 fix: Better support UTF8 & Arabic
Increase CHARACTER_NAME_MAX_LEN from 24 to 64 for better support with UTF8 Arabic
2025-12-27 19:00:42 +00:00
rtw1x1
11ba72d2e2 Merge pull request #46 from MindRapist/mr-4
Fixed PK mode bugs, fixed logout cancellation from using skills
2025-12-27 08:25:29 +00:00
Mind Rapist
3b712002a9 Fixed PK mode bugs, fixed logout cancellation from using skills 2025-12-27 10:23:45 +02:00
Mind Rapist
11ef2f5780 Fixed PK mode bugs, fixed logout cancellation from using skills 2025-12-27 10:17:04 +02:00
rtw1x1
7a69f13439 Merge pull request #42 from savisxss/main
Guard netinet/tcp.h include for non-Windows platforms
2025-12-27 07:15:41 +00:00
rtw1x1
baa4d7dd69 Merge pull request #45 from rtw1x1/main
Update item_length.h
2025-12-27 07:15:28 +00:00
rtw1x1
1003dffdd6 Update item_length.h 2025-12-27 07:10:38 +00:00
savis
0f21118ad7 Guard netinet/tcp.h include for non-Windows platforms 2025-12-27 01:19:42 +01:00
rtw1x1
db097e3ba2 Merge pull request #41 from rtw1x1/main
TCP_NODELAY undeclared
2025-12-26 07:28:34 +00:00
rtw1x1
366d97dbac TCP_NODELAY undeclared 2025-12-26 07:27:50 +00:00
rtw1x1
1b46b8cc26 Merge pull request #40 from d1str4ught/rtw1x1-patch-1 2025-12-26 07:11:59 +00:00
6 changed files with 38 additions and 79 deletions

View File

@@ -3,7 +3,7 @@
enum EItemMisc enum EItemMisc
{ {
ITEM_NAME_MAX_LEN = 24, ITEM_NAME_MAX_LEN = 64,
ITEM_VALUES_MAX_NUM = 6, ITEM_VALUES_MAX_NUM = 6,
ITEM_SMALL_DESCR_MAX_LEN = 256, ITEM_SMALL_DESCR_MAX_LEN = 256,
ITEM_LIMIT_MAX_NUM = 2, ITEM_LIMIT_MAX_NUM = 2,

View File

@@ -10,7 +10,7 @@ enum EMisc
PASSWD_MAX_LEN = 16, PASSWD_MAX_LEN = 16,
PLAYER_PER_ACCOUNT = 4, PLAYER_PER_ACCOUNT = 4,
ACCOUNT_STATUS_MAX_LEN = 8, ACCOUNT_STATUS_MAX_LEN = 8,
CHARACTER_NAME_MAX_LEN = 24, CHARACTER_NAME_MAX_LEN = 64,
SHOP_SIGN_MAX_LEN = 32, SHOP_SIGN_MAX_LEN = 32,
INVENTORY_MAX_NUM = 90, INVENTORY_MAX_NUM = 90,
ABILITY_MAX_NUM = 50, ABILITY_MAX_NUM = 50,

View File

@@ -1659,6 +1659,14 @@ void CHARACTER::EnterCombat()
if (!IsPosition(POS_FIGHTING)) if (!IsPosition(POS_FIGHTING))
SetPosition(POS_FIGHTING); SetPosition(POS_FIGHTING);
// MR-3: Cancel logout on use skill
if (m_pkTimedEvent)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("전투가 시작 되어 취소 되었습니다."));
event_cancel(&m_pkTimedEvent);
}
// MR-3: -- END OF -- Cancel logout on use skill
SetNextStatePulse(1); SetNextStatePulse(1);
} }
// tw1x1: end // tw1x1: end

View File

@@ -2525,14 +2525,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
ComputeSkill(dwVnum, pkVictim); ComputeSkill(dwVnum, pkVictim);
RemoveAffect(dwVnum); RemoveAffect(dwVnum);
// MR-3: Cancel logout on use skill
if (m_pkTimedEvent)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다."));
event_cancel(&m_pkTimedEvent);
}
// MR-3: -- END OF -- Cancel logout on use skill
return true; return true;
} }
} }
@@ -2551,14 +2543,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
// Toggle 할 때는 SP를 쓰지 않음 (SelfOnly로 구분) // Toggle 할 때는 SP를 쓰지 않음 (SelfOnly로 구분)
if ((0 != pkSk->dwAffectFlag || pkSk->dwVnum == SKILL_MUYEONG) && (pkSk->dwFlag & SKILL_FLAG_TOGGLE) && RemoveAffect(pkSk->dwVnum)) if ((0 != pkSk->dwAffectFlag || pkSk->dwVnum == SKILL_MUYEONG) && (pkSk->dwFlag & SKILL_FLAG_TOGGLE) && RemoveAffect(pkSk->dwVnum))
{ {
// MR-3: Cancel logout on use skill
if (m_pkTimedEvent)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다."));
event_cancel(&m_pkTimedEvent);
}
// MR-3: -- END OF -- Cancel logout on use skill
return true; return true;
} }
@@ -2657,6 +2641,14 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
} }
} }
// MR-3: Cancel logout on use skill
if (IsPC() && m_pkTimedEvent)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다."));
event_cancel(&m_pkTimedEvent);
}
// MR-3: -- END OF -- Cancel logout on use skill
if (dwVnum == SKILL_CHAIN) if (dwVnum == SKILL_CHAIN)
{ {
ResetChainLightningIndex(); ResetChainLightningIndex();
@@ -2670,14 +2662,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
// prevent POS_FIGHTING from expiring when skills deal 0 damage (miss, block, imun, etc.) // prevent POS_FIGHTING from expiring when skills deal 0 damage (miss, block, imun, etc.)
UpdateLastCombatTime(); UpdateLastCombatTime();
EnterCombat(); EnterCombat();
// MR-3: Cancel logout on use skill
if (pkVictim->m_pkTimedEvent)
{
pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다."));
event_cancel(&pkVictim->m_pkTimedEvent);
}
// MR-3: -- END OF -- Cancel logout on use skill
} }
// tw1x1: end // tw1x1: end
@@ -2692,14 +2676,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
m_dwLastSkillTime = get_dword_time(); m_dwLastSkillTime = get_dword_time();
// MR-3: Cancel logout on use skill
if (m_pkTimedEvent)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다."));
event_cancel(&m_pkTimedEvent);
}
// MR-3: -- END OF -- Cancel logout on use skill
return true; return true;
} }

View File

@@ -464,80 +464,52 @@ bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{ {
if (g_protectNormalPlayer) if (g_protectNormalPlayer)
{ {
// 범법자는 평화모드인 착한사람을 공격할 수 없다. // 범법자는 평화모드인 착한사람을 공격할 수 없다.
if (PK_MODE_PEACE == pkVictim->GetPKMode()) if (PK_MODE_PEACE == pkVictim->GetPKMode())
return false; return false;
} }
} }
// MR-4: Fix PK mode logic
switch (pkChr->GetPKMode()) switch (pkChr->GetPKMode())
{ {
case PK_MODE_PEACE: case PK_MODE_PEACE:
case PK_MODE_REVENGE: case PK_MODE_REVENGE:
// Cannot attack same guild
if (pkVictim->GetGuild() && pkVictim->GetGuild() == pkChr->GetGuild())
break;
if (pkChr->GetPKMode() == PK_MODE_REVENGE)
{ {
//if (!g_iUseLocale) if (
if (1) (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild())) &&
{ pkChr->GetPKMode() == PK_MODE_REVENGE && pkVictim->GetAlignment() < 0
if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() >= 0) )
{ return true;
pkChr->SetKillerMode(true);
return true;
}
else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() < 0)
return true;
}
else
{
if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0)
break;
else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() >= 0)
break;
beKillerMode = true;
}
} }
break; break;
case PK_MODE_GUILD: case PK_MODE_GUILD:
// Same implementation from PK_MODE_FREE except for attacking same guild
if (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild()))
{ {
if (1) // Same implementation from PK_MODE_FREE except for attacking same guild
//if (!g_iUseLocale) if (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild()))
{ {
if (pkVictim->GetAlignment() >= 0) // Only set killer mode if victim is not already attackable
pkChr->SetKillerMode(true); if (!pkVictim->IsKillerMode())
else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0)
pkChr->SetKillerMode(true); pkChr->SetKillerMode(true);
return true; return true;
} }
else
beKillerMode = true;
} }
break; break;
case PK_MODE_FREE: case PK_MODE_FREE:
//if (!g_iUseLocale)
if (1)
{ {
if (pkVictim->GetAlignment() >= 0) // Same as GUILD, but allows attacking same guild members
pkChr->SetKillerMode(true); // Only set killer mode if victim is not already attackable
else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0) if (!pkVictim->IsKillerMode())
pkChr->SetKillerMode(true); pkChr->SetKillerMode(true);
return true; return true;
} }
else
beKillerMode = true;
break; break;
} }
// MR-4: -- END OF -- Fix PK mode logic
} }
CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID()); CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

View File

@@ -1,4 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#ifndef OS_WINDOWS
#include <netinet/tcp.h>
#endif
/* Forwards */ /* Forwards */
void socket_lingeron(socket_t s); void socket_lingeron(socket_t s);