// TO-DO: Update this. It's VERY dated. void CUser::GetUserInfo(Packet & pkt) { pkt.SByte(); pkt << m_pUserData->m_id << getNation() << m_pUserData->m_bCity // probably isn't this, but it'll at least serve as filler if it's not << m_pUserData->m_bKnights << m_pUserData->m_bFame; CKnights *pKnights = m_pMain->m_KnightsArray.GetData(m_pUserData->m_bKnights); if (pKnights == NULL || m_pUserData->m_bKnights <= 0) { pkt << uint32(0); } else { pkt << pKnights->m_strName << pKnights->m_byGrade << pKnights->m_byRanking; } pkt << getLevel() << m_pUserData->m_bRace << m_pUserData->m_sClass << GetSPosX() << GetSPosZ() << GetSPosY() << m_pUserData->m_bFace << uint32(m_pUserData->m_nHair) << m_bResHpType << uint32(m_bAbnormalType) << m_bNeedParty << m_pUserData->m_bAuthority << m_pUserData->m_sItemArray[BREAST].nNum << m_pUserData->m_sItemArray[BREAST].sDuration << m_pUserData->m_sItemArray[LEG].nNum << m_pUserData->m_sItemArray[LEG].sDuration << m_pUserData->m_sItemArray[HEAD].nNum << m_pUserData->m_sItemArray[HEAD].sDuration << m_pUserData->m_sItemArray[GLOVE].nNum << m_pUserData->m_sItemArray[GLOVE].sDuration << m_pUserData->m_sItemArray[FOOT].nNum << m_pUserData->m_sItemArray[FOOT].sDuration << m_pUserData->m_sItemArray[SHOULDER].nNum << m_pUserData->m_sItemArray[SHOULDER].sDuration << m_pUserData->m_sItemArray[RIGHTHAND].nNum << m_pUserData->m_sItemArray[RIGHTHAND].sDuration << m_pUserData->m_sItemArray[LEFTHAND].nNum << m_pUserData->m_sItemArray[LEFTHAND].sDuration; }
// TO-DO: Update this. It's VERY dated. void CUser::GetUserInfo(Packet & pkt) { CKnights *pKnights = NULL; pkt.SByte(); pkt << m_pUserData->m_id << uint16(getNation()) << m_pUserData->m_bKnights << uint16(m_pUserData->m_bFame); if (isInClan()) pKnights = m_pMain->m_KnightsArray.GetData(m_pUserData->m_bKnights); if (pKnights == NULL) { // should work out to be 11 bytes, 6-7 being cape ID. pkt << uint32(0) << uint16(0) << uint16(-1) << uint16(0) << uint8(0); } else { pkt << uint8(0) // grade type << pKnights->m_strName << pKnights->m_byGrade << pKnights->m_byRanking << uint16(0) // symbol/mark version << uint16(-1) // cape ID << uint8(0) << uint8(0) << uint8(0); // cape RGB } pkt << getLevel() << m_pUserData->m_bRace << m_pUserData->m_sClass << GetSPosX() << GetSPosZ() << GetSPosY() << m_pUserData->m_bFace << m_pUserData->m_nHair << m_bResHpType << uint32(m_bAbnormalType) << m_bNeedParty << m_pUserData->m_bAuthority << m_pUserData->m_sItemArray[BREAST].nNum << m_pUserData->m_sItemArray[BREAST].sDuration << m_pUserData->m_sItemArray[LEG].nNum << m_pUserData->m_sItemArray[LEG].sDuration << m_pUserData->m_sItemArray[BREAST].nNum << m_pUserData->m_sItemArray[BREAST].sDuration << uint8(0) << m_pUserData->m_sItemArray[LEG].nNum << m_pUserData->m_sItemArray[LEG].sDuration << uint8(0) << m_pUserData->m_sItemArray[HEAD].nNum << m_pUserData->m_sItemArray[HEAD].sDuration << uint8(0) << m_pUserData->m_sItemArray[GLOVE].nNum << m_pUserData->m_sItemArray[GLOVE].sDuration << uint8(0) << m_pUserData->m_sItemArray[FOOT].nNum << m_pUserData->m_sItemArray[FOOT].sDuration << uint8(0) << m_pUserData->m_sItemArray[SHOULDER].nNum << m_pUserData->m_sItemArray[SHOULDER].sDuration << uint8(0) << m_pUserData->m_sItemArray[RIGHTHAND].nNum << m_pUserData->m_sItemArray[RIGHTHAND].sDuration << uint8(0) << m_pUserData->m_sItemArray[LEFTHAND].nNum << m_pUserData->m_sItemArray[LEFTHAND].sDuration << uint8(0) << m_pUserData->m_sItemArray[CWING].nNum << m_pUserData->m_sItemArray[CWING].sDuration << uint8(0) << m_pUserData->m_sItemArray[CTOP].nNum << m_pUserData->m_sItemArray[CTOP].sDuration << uint8(0) << m_pUserData->m_sItemArray[CHELMET].nNum << m_pUserData->m_sItemArray[CHELMET].sDuration << uint8(0) << m_pUserData->m_sItemArray[CRIGHT].nNum << m_pUserData->m_sItemArray[CRIGHT].sDuration << uint8(0) << m_pUserData->m_sItemArray[CLEFT].nNum << m_pUserData->m_sItemArray[CLEFT].sDuration << uint8(0) << getZoneID() << uint8(-1) << uint8(-1) << uint16(0) << uint16(0) << uint16(0); }
void CUser::PartyBBSRegister(char *pBuf) { CUser* pUser = NULL; int index = 0, send_index = 0; // Basic Initializations. BYTE result = 0; short bbs_len = 0; char send_buff[256]; memset(send_buff, NULL, 256); int i = 0, counter = 0; if (m_sPartyIndex != -1) goto fail_return; // You are already in a party! if (m_bNeedParty == 2) goto fail_return; // You are already on the BBS! m_bNeedParty = 2; // Success! Now you officially need a party!!! result = 1; SetByte(send_buff, 2, send_index); // Send new 'Need Party Status' to region!!! SetByte(send_buff, m_bNeedParty, send_index); StateChange(send_buff); send_index = 0; memset(send_buff, NULL, 256); // Now, let's find out which page the user is on. for (i = 0 ; i < MAX_USER ; i++) { pUser = m_pMain->GetUnsafeUserPtr(i); if (pUser == NULL || pUser->getNation() != getNation() || pUser->m_bNeedParty == 1) continue; if( !( ( pUser->m_pUserData->m_bLevel <= (int)(m_pUserData->m_bLevel * 1.5) && pUser->m_pUserData->m_bLevel >= (int)(m_pUserData->m_bLevel * 1.5)) || ( pUser->m_pUserData->m_bLevel <= (m_pUserData->m_bLevel+8) && pUser->m_pUserData->m_bLevel >= ((int)(m_pUserData->m_bLevel)-8) ) ) ) continue; if (pUser->GetSocketID() == GetSocketID()) break; counter++; } SetShort(send_buff, counter / MAX_BBS_PAGE, send_index); PartyBBSNeeded(send_buff, PARTY_BBS_REGISTER); return; fail_return: SetByte(send_buff, WIZ_PARTY_BBS, send_index); SetByte(send_buff, PARTY_BBS_REGISTER, send_index); SetByte(send_buff, result, send_index); Send(send_buff, send_index); return; }
void CUser::PartyRequest(int memberid, BOOL bCreate) { int index = 0, send_index = 0, result = -1, i=0; CUser* pUser = NULL; _PARTY_GROUP* pParty = NULL; char send_buff[256]; memset( send_buff, 0x00, 256 ); pUser = m_pMain->GetUserPtr(memberid); if (pUser == NULL || pUser->m_sPartyIndex != -1) goto fail_return; if (getNation() != pUser->getNation()) { result = -3; goto fail_return; } if( !( ( pUser->m_pUserData->m_bLevel <= (int)(m_pUserData->m_bLevel * 1.5) && pUser->m_pUserData->m_bLevel >= (int)(m_pUserData->m_bLevel * 1.5)) || ( pUser->m_pUserData->m_bLevel <= (m_pUserData->m_bLevel+8) && pUser->m_pUserData->m_bLevel >= ((int)(m_pUserData->m_bLevel)-8) ) ) ) { result = -2; goto fail_return; } if( !bCreate ) { // ????? ????? ?????? ??? pParty = m_pMain->m_PartyArray.GetData(m_sPartyIndex); if( !pParty ) goto fail_return; for(i=0; i<8; i++) { if( pParty->uid[i] < 0 ) break; } if( i==8 ) goto fail_return; // ??? ??? Full } if( bCreate ) { if( m_sPartyIndex != -1 ) goto fail_return; // can't create a party ifw e're already in one if (!m_pMain->CreateParty(this)) goto fail_return; // AI Server send_index = 0; memset( send_buff, 0x00, 256 ); SetByte( send_buff, AG_USER_PARTY, send_index ); SetByte( send_buff, PARTY_CREATE, send_index ); SetShort( send_buff, pParty->wIndex, send_index ); SetShort( send_buff, pParty->uid[0], send_index ); //SetShort( send_buff, pParty->sHp[0], send_index ); //SetByte( send_buff, pParty->bLevel[0], send_index ); //SetShort( send_buff, pParty->sClass[0], send_index ); m_pMain->Send_AIServer(m_pUserData->m_bZone, send_buff, send_index); } pUser->m_sPartyIndex = m_sPartyIndex; /* ??? BBS?? ??? ???... if (pUser->m_bNeedParty == 2 && pUser->m_sPartyIndex != -1) { pUser->m_bNeedParty = 1; // ?? ?? ??? ????? ??????? ??? ^^; memset( send_buff, 0x00, 256 ); send_index = 0; SetByte(send_buff, 2, send_index); SetByte(send_buff, pUser->m_bNeedParty, send_index); pUser->StateChange(send_buff); } if (m_bNeedParty == 2 && m_sPartyIndex != -1) { m_bNeedParty = 1; // ?? ?? ??? ????? ??????? ??? ^^; memset( send_buff, 0x00, 256 ); send_index = 0; SetByte(send_buff, 2, send_index); SetByte(send_buff, m_bNeedParty, send_index); StateChange(send_buff); } */ send_index = 0; memset( send_buff, 0x00, 256 ); SetByte( send_buff, WIZ_PARTY, send_index ); SetByte( send_buff, PARTY_PERMIT, send_index ); SetShort( send_buff, m_Sid, send_index ); SetKOString(send_buff, m_pUserData->m_id, send_index); pUser->Send( send_buff, send_index ); return; fail_return: SetByte( send_buff, WIZ_PARTY, send_index ); SetByte( send_buff, PARTY_INSERT, send_index ); SetShort( send_buff, result, send_index ); Send( send_buff, send_index ); }
void CUser::PartyBBSNeeded(char *pBuf, BYTE type) { CUser* pUser = NULL; // Basic Initializations. int index = 0, send_index = 0; BYTE result = 0; short bbs_len = 0; char send_buff[256]; memset( send_buff, NULL, 256 ); short page_index = 0; short start_counter = 0; BYTE valid_counter = 0 ; int i = 0, j = 0; short BBS_Counter = 0; page_index = GetShort(pBuf, index); start_counter = page_index * MAX_BBS_PAGE; if ( start_counter < 0 ) goto fail_return; if ( start_counter > MAX_USER ) goto fail_return; result = 1; SetByte(send_buff, WIZ_PARTY_BBS, send_index); SetByte(send_buff, type, send_index); SetByte(send_buff, result, send_index); for (i = 0 ; i < MAX_USER ; i++) { pUser = m_pMain->GetUnsafeUserPtr(i); if (pUser == NULL || pUser->getNation() != getNation() || pUser->m_bNeedParty == 1) continue; if( !( ( pUser->m_pUserData->m_bLevel <= (int)(m_pUserData->m_bLevel * 1.5) && pUser->m_pUserData->m_bLevel >= (int)(m_pUserData->m_bLevel * 1.5)) || ( pUser->m_pUserData->m_bLevel <= (m_pUserData->m_bLevel+8) && pUser->m_pUserData->m_bLevel >= ((int)(m_pUserData->m_bLevel)-8) ) ) ) continue; BBS_Counter++; if (i < start_counter) continue; // Range check codes. if (valid_counter >= MAX_BBS_PAGE) continue; SetKOString(send_buff, pUser->m_pUserData->m_id, send_index); SetByte(send_buff, pUser->m_pUserData->m_bLevel, send_index); SetShort(send_buff, pUser->m_pUserData->m_sClass, send_index); valid_counter++; // Increment counters. // BBS_Counter++; } if ( valid_counter < MAX_BBS_PAGE ) { // You still need to fill up ten slots. for (j = valid_counter ; j < MAX_BBS_PAGE ; j++) { SetShort(send_buff, 0, send_index); SetString(send_buff, NULL, 0, send_index); SetByte(send_buff, 0, send_index); SetShort(send_buff, 0, send_index); } } SetShort(send_buff, page_index, send_index); SetShort(send_buff, BBS_Counter, send_index); Send(send_buff, send_index); return; fail_return: SetByte(send_buff, WIZ_PARTY_BBS, send_index); SetByte(send_buff, PARTY_BBS_NEEDED, send_index); SetByte(send_buff, result, send_index); Send(send_buff, send_index); return; }
void CUser::Chat(Packet & pkt) { Packet result(WIZ_CHAT); uint8 type = pkt.read<uint8>(); char finalstr[1024] = ""; std::string buff, chatstr; if (isMuted()) return; pkt >> chatstr; if (chatstr.empty() || chatstr.size() > 128) return; // Process GM commands if (isGM() && ProcessChatCommand(chatstr)) return; #if 0 // Removed this - all it seems to do is cause chat to break for GMs (is it 19xx+ only?) if( isGM() && type == GENERAL_CHAT) type = 0x14; #endif uint8 bNation = getNation(); uint16 sessID = GetSocketID(); // Handle GM notice & announcement commands if (type == PUBLIC_CHAT || type == ANNOUNCEMENT_CHAT) { // Trying to use a GM command without authorisation? Bad player! if (!isGM()) return; bNation = KARUS; // arbitrary nation sessID = -1; } result.SByte(); result << type << bNation << sessID; if (type == PUBLIC_CHAT || type == ANNOUNCEMENT_CHAT) { result << uint8(0); // GM notice/announcements show no name (so specify length of 0) // This is horrible, but we'll live with it for now. // Pull the notice string (#### NOTICE : %s ####) from the database. CString noticeText = g_pMain->GetServerResource(IDP_ANNOUNCEMENT); // Format the chat string around it, so our chat data is within the notice sprintf_s(finalstr, sizeof(finalstr), noticeText, chatstr.c_str()); result.DByte(); result << finalstr; // now tack on the formatted message from the user } else { result << m_pUserData->m_id; // everything else provides a name result.DByte(); result << chatstr; // now tack on the chat message from the user } switch (type) { case GENERAL_CHAT: g_pMain->Send_NearRegion(&result, GetMap(), m_RegionX, m_RegionZ, m_pUserData->m_curx, m_pUserData->m_curz); break; case PRIVATE_CHAT: { if (m_sPrivateChatUser == GetSocketID()) break; CUser *pUser = g_pMain->GetUserPtr(m_sPrivateChatUser); if (pUser == NULL) break; pUser->Send(&result); } break; case PARTY_CHAT: if (isInParty()) g_pMain->Send_PartyMember(m_sPartyIndex, &result); break; case SHOUT_CHAT: if (m_pUserData->m_sMp < (m_iMaxMp / 5)) break; // Characters under level 35 require 3,000 coins to shout. if (!isGM() && getLevel() < 35 && !GoldLose(SHOUT_COIN_REQUIREMENT)) break; MSpChange(-(m_iMaxMp / 5)); g_pMain->Send_Region(&result, GetMap(), m_RegionX, m_RegionZ); break; case KNIGHTS_CHAT: if (isInClan()) g_pMain->Send_KnightsMember(m_pUserData->m_bKnights, &result); break; case PUBLIC_CHAT: case ANNOUNCEMENT_CHAT: if (isGM()) g_pMain->Send_All(&result); break; case COMMAND_CHAT: if (getFame() == COMMAND_CAPTAIN) g_pMain->Send_CommandChat(&result, m_pUserData->m_bNation, this); break; case MERCHANT_CHAT: if (isMerchanting()) g_pMain->Send_Region(&result, GetMap(), m_RegionX, m_RegionZ); break; //case WAR_SYSTEM_CHAT: // g_pMain->Send_All(&result); // break; } }