refactor some code to prevent possible crashes and bugs
This commit is contained in:
@@ -6010,13 +6010,13 @@ void CHARACTER::EffectPacket(int enumEffectType)
|
|||||||
PacketAround(&p, sizeof(TPacketGCSpecialEffect));
|
PacketAround(&p, sizeof(TPacketGCSpecialEffect));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHARACTER::SpecificEffectPacket(const char filename[MAX_EFFECT_FILE_NAME])
|
void CHARACTER::SpecificEffectPacket(const std::string& stEffectName)
|
||||||
{
|
{
|
||||||
TPacketGCSpecificEffect p;
|
TPacketGCSpecificEffect p;
|
||||||
|
|
||||||
p.header = HEADER_GC_SPECIFIC_EFFECT;
|
p.header = HEADER_GC_SPECIFIC_EFFECT;
|
||||||
p.vid = GetVID();
|
p.vid = GetVID();
|
||||||
memcpy (p.effect_file, filename, MAX_EFFECT_FILE_NAME);
|
strlcpy(p.effect_file, stEffectName.c_str(), sizeof(p.effect_file));
|
||||||
|
|
||||||
PacketAround(&p, sizeof(TPacketGCSpecificEffect));
|
PacketAround(&p, sizeof(TPacketGCSpecificEffect));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1091,7 +1091,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
|
|||||||
|
|
||||||
// void PotionPacket(int iPotionType);
|
// void PotionPacket(int iPotionType);
|
||||||
void EffectPacket(int enumEffectType);
|
void EffectPacket(int enumEffectType);
|
||||||
void SpecificEffectPacket(const char filename[128]);
|
void SpecificEffectPacket(const std::string& stEffectName);
|
||||||
|
|
||||||
// ADD_MONSTER_REFINE
|
// ADD_MONSTER_REFINE
|
||||||
bool DoRefine(LPITEM item, bool bMoneyOnly = false);
|
bool DoRefine(LPITEM item, bool bMoneyOnly = false);
|
||||||
|
|||||||
@@ -3195,7 +3195,7 @@ LPCHARACTER CHARACTER::GetNearestVictim(LPCHARACTER pkChr)
|
|||||||
|
|
||||||
LPCHARACTER pAttacker = CHARACTER_MANAGER::instance().Find(c_VID);
|
LPCHARACTER pAttacker = CHARACTER_MANAGER::instance().Find(c_VID);
|
||||||
|
|
||||||
if (!pAttacker)
|
if (!pAttacker || pAttacker->IsDead())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pAttacker->IsAffectFlag(AFF_EUNHYUNG) ||
|
if (pAttacker->IsAffectFlag(AFF_EUNHYUNG) ||
|
||||||
|
|||||||
@@ -4082,28 +4082,28 @@ ACMD (do_item_full_set)
|
|||||||
{
|
{
|
||||||
|
|
||||||
item = ITEM_MANAGER::instance().CreateItem(11699);
|
item = ITEM_MANAGER::instance().CreateItem(11699);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(13049);
|
item = ITEM_MANAGER::instance().CreateItem(13049);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(189 );
|
item = ITEM_MANAGER::instance().CreateItem(189 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(12529 );
|
item = ITEM_MANAGER::instance().CreateItem(12529 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(17209 );
|
item = ITEM_MANAGER::instance().CreateItem(17209 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(16209 );
|
item = ITEM_MANAGER::instance().CreateItem(16209 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -4111,28 +4111,28 @@ ACMD (do_item_full_set)
|
|||||||
{
|
{
|
||||||
|
|
||||||
item = ITEM_MANAGER::instance().CreateItem(11299);
|
item = ITEM_MANAGER::instance().CreateItem(11299);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(13049);
|
item = ITEM_MANAGER::instance().CreateItem(13049);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(3159 );
|
item = ITEM_MANAGER::instance().CreateItem(3159 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(12249 );
|
item = ITEM_MANAGER::instance().CreateItem(12249 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(17109 );
|
item = ITEM_MANAGER::instance().CreateItem(17109 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(16109 );
|
item = ITEM_MANAGER::instance().CreateItem(16109 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -4140,28 +4140,28 @@ ACMD (do_item_full_set)
|
|||||||
{
|
{
|
||||||
|
|
||||||
item = ITEM_MANAGER::instance().CreateItem(11899);
|
item = ITEM_MANAGER::instance().CreateItem(11899);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(13049);
|
item = ITEM_MANAGER::instance().CreateItem(13049);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(7159 );
|
item = ITEM_MANAGER::instance().CreateItem(7159 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(12669 );
|
item = ITEM_MANAGER::instance().CreateItem(12669 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(17209 );
|
item = ITEM_MANAGER::instance().CreateItem(17209 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(16209 );
|
item = ITEM_MANAGER::instance().CreateItem(16209 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -4169,31 +4169,35 @@ ACMD (do_item_full_set)
|
|||||||
{
|
{
|
||||||
|
|
||||||
item = ITEM_MANAGER::instance().CreateItem(11499);
|
item = ITEM_MANAGER::instance().CreateItem(11499);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(13049);
|
item = ITEM_MANAGER::instance().CreateItem(13049);
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
item = ITEM_MANAGER::instance().CreateItem(15189 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(1139 );
|
item = ITEM_MANAGER::instance().CreateItem(1139 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(12389 );
|
item = ITEM_MANAGER::instance().CreateItem(12389 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
item = ITEM_MANAGER::instance().CreateItem(14109 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(17189 );
|
item = ITEM_MANAGER::instance().CreateItem(17189 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
item = ITEM_MANAGER::instance().CreateItem(16189 );
|
item = ITEM_MANAGER::instance().CreateItem(16189 );
|
||||||
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
|
if (item && !item->EquipTo(ch, item->FindEquipCell(ch)))
|
||||||
M2_DESTROY_ITEM(item);
|
M2_DESTROY_ITEM(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ch->ChatPacket(CHAT_TYPE_INFO, "Full set is not available for your job");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -428,6 +428,13 @@ void DESC::Packet(const void * c_pvData, int iSize)
|
|||||||
if (m_iPhase == PHASE_CLOSE) // 끊는 상태면 보내지 않는다.
|
if (m_iPhase == PHASE_CLOSE) // 끊는 상태면 보내지 않는다.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!m_lpOutputBuffer)
|
||||||
|
{
|
||||||
|
sys_err("DESC::Packet: Trying to send packet but output buffer is NULL! (DESC: %p)", this);
|
||||||
|
SetPhase(PHASE_CLOSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_stRelayName.length() != 0)
|
if (m_stRelayName.length() != 0)
|
||||||
{
|
{
|
||||||
// Relay 패킷은 암호화하지 않는다.
|
// Relay 패킷은 암호화하지 않는다.
|
||||||
|
|||||||
@@ -2013,13 +2013,13 @@ void CGuild::Invite( LPCHARACTER pchInviter, LPCHARACTER pchInvitee )
|
|||||||
|
|
||||||
TPacketGCGuild p;
|
TPacketGCGuild p;
|
||||||
p.header = HEADER_GC_GUILD;
|
p.header = HEADER_GC_GUILD;
|
||||||
p.size = sizeof(p) + sizeof(DWORD) + GUILD_NAME_MAX_LEN + 1;
|
p.size = sizeof(p) + sizeof(DWORD) + GUILD_NAME_MAX_LEN;
|
||||||
p.subheader = GUILD_SUBHEADER_GC_GUILD_INVITE;
|
p.subheader = GUILD_SUBHEADER_GC_GUILD_INVITE;
|
||||||
|
|
||||||
TEMP_BUFFER buf;
|
TEMP_BUFFER buf;
|
||||||
buf.write( &p, sizeof(p) );
|
buf.write( &p, sizeof(p) );
|
||||||
buf.write( &gid, sizeof(DWORD) );
|
buf.write( &gid, sizeof(DWORD) );
|
||||||
buf.write( GetName(), GUILD_NAME_MAX_LEN + 1 );
|
buf.write( GetName(), GUILD_NAME_MAX_LEN );
|
||||||
|
|
||||||
pchInvitee->GetDesc()->Packet( buf.read_peek(), buf.size() );
|
pchInvitee->GetDesc()->Packet( buf.read_peek(), buf.size() );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -469,21 +469,31 @@ void ITEM_MANAGER::SaveSingleItem(LPITEM item)
|
|||||||
|
|
||||||
void ITEM_MANAGER::Update()
|
void ITEM_MANAGER::Update()
|
||||||
{
|
{
|
||||||
std::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.begin();
|
for (auto it = m_set_pkItemForDelayedSave.begin(); it != m_set_pkItemForDelayedSave.end();)
|
||||||
std::unordered_set<LPITEM>::iterator this_it;
|
|
||||||
|
|
||||||
while (it != m_set_pkItemForDelayedSave.end())
|
|
||||||
{
|
{
|
||||||
this_it = it++;
|
LPITEM item = *it;
|
||||||
LPITEM item = *this_it;
|
if (!item)
|
||||||
|
{
|
||||||
// SLOW_QUERY 플래그가 있는 것은 종료시에만 저장한다.
|
sys_err("nullptr item, erasing from delayed save.");
|
||||||
if (item->GetOwner() && IS_SET(item->GetFlag(), ITEM_FLAG_SLOW_QUERY))
|
it = m_set_pkItemForDelayedSave.erase(it);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FindByVID(item->GetVID()))
|
||||||
|
{
|
||||||
|
sys_err("Invalid item(%u), erasing from delayed save.", item->GetVID());
|
||||||
|
it = m_set_pkItemForDelayedSave.erase(it);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item->GetOwner() && IS_SET(item->GetFlag(), ITEM_FLAG_SLOW_QUERY))
|
||||||
|
{
|
||||||
|
++it; // just skip don't erase
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SaveSingleItem(item);
|
SaveSingleItem(item);
|
||||||
|
it = m_set_pkItemForDelayedSave.erase(it);
|
||||||
m_set_pkItemForDelayedSave.erase(this_it);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -619,28 +629,29 @@ TItemTable * ITEM_MANAGER::GetTable(DWORD vnum)
|
|||||||
|
|
||||||
int ITEM_MANAGER::RealNumber(DWORD vnum)
|
int ITEM_MANAGER::RealNumber(DWORD vnum)
|
||||||
{
|
{
|
||||||
int bot, top, mid;
|
if (m_vec_prototype.empty())
|
||||||
|
return -1;
|
||||||
|
|
||||||
bot = 0;
|
int left = 0;
|
||||||
top = m_vec_prototype.size();
|
int right = m_vec_prototype.size() - 1;
|
||||||
|
|
||||||
TItemTable * pTable = &m_vec_prototype[0];
|
while (left <= right)
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
{
|
||||||
mid = (bot + top) >> 1;
|
int mid = (left + right) / 2;
|
||||||
|
|
||||||
if ((pTable + mid)->dwVnum == vnum)
|
if (mid < 0 || mid >= static_cast<int>(m_vec_prototype.size()))
|
||||||
return (mid);
|
return -1;
|
||||||
|
|
||||||
if (bot >= top)
|
if (m_vec_prototype[mid].dwVnum == vnum)
|
||||||
return (-1);
|
return mid;
|
||||||
|
|
||||||
if ((pTable + mid)->dwVnum > vnum)
|
if (m_vec_prototype[mid].dwVnum > vnum)
|
||||||
top = mid - 1;
|
right = mid - 1;
|
||||||
else
|
else
|
||||||
bot = mid + 1;
|
left = mid + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ITEM_MANAGER::GetVnum(const char * c_pszName, DWORD & r_dwVnum)
|
bool ITEM_MANAGER::GetVnum(const char * c_pszName, DWORD & r_dwVnum)
|
||||||
|
|||||||
Reference in New Issue
Block a user