void CAISocket::RecvNpcInfo(Packet & pkt) { std::string strName; uint8 Mode, byDirection; uint16 sNid; pkt.SByte(); pkt >> Mode >> sNid; CNpc *pNpc = g_pMain->m_arNpcArray.GetData(sNid); if (pNpc == NULL) return; pkt >> pNpc->m_sSid >> pNpc->m_sPid >> pNpc->m_sSize >> pNpc->m_iWeapon_1 >> pNpc->m_iWeapon_2 >> pNpc->m_bZone >> strName >> pNpc->m_bNation >> pNpc->m_bLevel >> pNpc->m_curx >> pNpc->m_curz >> pNpc->m_cury >> byDirection >> pNpc->m_NpcState >> pNpc->m_tNpcType >> pNpc->m_iSellingGroup >> pNpc->m_iMaxHP >> pNpc->m_iHP >> pNpc->m_byGateOpen >> pNpc->m_sTotalHitrate >> pNpc->m_sTotalEvasionrate >> pNpc->m_sTotalAc >> pNpc->m_byObjectType >> pNpc->m_byTrapNumber; if (strName.empty() || strName.length() > MAX_NPC_SIZE) { pNpc->DecRef(); return; } pNpc->m_byDirection = byDirection; strcpy(pNpc->m_strName, strName.c_str()); if (pNpc->GetMap() == NULL) return; pNpc->InsertRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); pNpc->SetRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); if (pNpc->m_byObjectType == SPECIAL_OBJECT) { _OBJECT_EVENT *pEvent = pNpc->GetMap()->GetObjectEvent( pNpc->m_sSid ); if (pEvent != NULL) pEvent->byLife = 1; } if (Mode == 0) { TRACE("RecvNpcInfo - dead monster nid=%d, name=%s\n", pNpc->GetID(), pNpc->m_strName); return; } pNpc->SendInOut(INOUT_IN, pNpc->GetX(), pNpc->GetZ(), pNpc->GetY()); }
void CAISocket::RecvNpcInfo(Packet & pkt) { std::string strName; uint8 Mode, byDirection; uint16 sNid; pkt.SByte(); pkt >> Mode >> sNid; CNpc *pNpc = g_pMain->m_arNpcArray.GetData(sNid); if (pNpc == NULL) return; pkt >> pNpc->m_sSid >> pNpc->m_sPid >> pNpc->m_sSize >> pNpc->m_iWeapon_1 >> pNpc->m_iWeapon_2 >> pNpc->m_bZoneID >> strName >> pNpc->m_byGroup >> pNpc->m_byLevel >> pNpc->m_fCurX >> pNpc->m_fCurZ >> pNpc->m_fCurY >> byDirection >> pNpc->m_NpcState >> pNpc->m_tNpcType >> pNpc->m_iSellingGroup >> pNpc->m_iMaxHP >> pNpc->m_iHP >> pNpc->m_byGateOpen >> pNpc->m_sTotalHitrate >> pNpc->m_sTotalEvasionrate >> pNpc->m_sTotalAc >> pNpc->m_byObjectType; if (strName.empty() || strName.length() > MAX_NPC_SIZE) { delete pNpc; return; } pNpc->m_byDirection = byDirection; strcpy(pNpc->m_strName, strName.c_str()); // Bug? Test? // pNpc->m_NpcState = NPC_DEAD; if (pNpc->m_NpcState == NPC_LIVE) { char strLog[256]; CTime t = CTime::GetCurrentTime(); sprintf_s(strLog, sizeof(strLog), "## time(%d:%d-%d) npc regen check(%d) : nid=%d, name=%s, x=%d, z=%d, rx=%d, rz=%d ## \r\n", t.GetHour(), t.GetMinute(), t.GetSecond(), pNpc->m_NpcState, pNpc->GetID(), pNpc->m_strName, (int)pNpc->m_fCurX, (int)pNpc->m_fCurZ, pNpc->GetRegionX(), pNpc->GetRegionZ()); EnterCriticalSection( &g_LogFile_critical ); g_pMain->m_RegionLogFile.Write( strLog, strlen(strLog) ); LeaveCriticalSection( &g_LogFile_critical ); TRACE(strLog); // to-do: replace with g_pMain->WriteRegionLog(...); } if (pNpc->GetMap() == NULL) return; pNpc->InsertRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); pNpc->SetRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); if (pNpc->m_byObjectType == SPECIAL_OBJECT) { _OBJECT_EVENT *pEvent = pNpc->GetMap()->GetObjectEvent( pNpc->m_sSid ); if (pEvent != NULL) pEvent->byLife = 1; } if (Mode == 0) { TRACE("RecvNpcInfo - dead monster nid=%d, name=%s\n", pNpc->GetID(), pNpc->m_strName); return; } pNpc->SendInOut(INOUT_IN, pNpc->GetX(), pNpc->GetZ(), pNpc->GetY()); }