/* Regular merchants */ void CUser::MerchantOpen() { int16 errorCode = 0; if (isDead()) errorCode = MERCHANT_OPEN_DEAD; else if (isStoreOpen()) errorCode = MERCHANT_OPEN_SHOPPING; else if (isTrading()) errorCode = MERCHANT_OPEN_TRADING; else if (getZoneID() > 21 || getZoneID() <= ELMORAD) errorCode = MERCHANT_OPEN_INVALID_ZONE; else if (getLevel() < 30) errorCode = MERCHANT_OPEN_UNDERLEVELED; else if (isMerchanting()) errorCode = MERCHANT_OPEN_MERCHANTING; else errorCode = MERCHANT_OPEN_SUCCESS; Packet result(WIZ_MERCHANT, uint8(MERCHANT_OPEN)); result << errorCode; Send(&result); // If we're already merchanting, user may be desynced // so we need to close our current merchant first. if (errorCode == MERCHANT_OPEN_MERCHANTING) MerchantClose(); }
void CNpc::NpcInOut(BYTE Type, float fx, float fz, float fy) { int send_index = 0; char buff[1024]; memset( buff, 0x00, 1024 ); C3DMap *pMap = m_pMain->GetZoneByID(getZoneID()); if (pMap == NULL) return; m_pMap = pMap; if( Type == NPC_OUT ) { pMap->RegionNpcRemove( m_sRegion_X, m_sRegion_Z, m_sNid ); } else { pMap->RegionNpcAdd( m_sRegion_X, m_sRegion_Z, m_sNid ); m_fCurX = fx; m_fCurZ = fz; m_fCurY = fy; } SetByte( buff, WIZ_NPC_INOUT, send_index ); SetByte( buff, Type, send_index ); SetShort( buff, m_sNid, send_index ); if( Type == NPC_OUT ) { m_pMain->Send_Region(buff, send_index, GetMap(), m_sRegion_X, m_sRegion_Z); return; } GetNpcInfo(buff, send_index); m_pMain->Send_Region(buff, send_index, GetMap(), m_sRegion_X, m_sRegion_Z); }
void CNpc::SendGateFlag(BYTE bFlag /*= -1*/, bool bSendAI /*= true*/) { char send_buff[6]; int send_index = 0; // If there's a flag to set, set it now. if (bFlag >= 0) m_byGateOpen = bFlag; // Tell the AI server our new status if (bSendAI) { SetByte(send_buff, AG_NPC_GATE_OPEN, send_index); SetShort(send_buff, GetID(), send_index); SetByte(send_buff, m_byGateOpen, send_index ); m_pMain->Send_AIServer(getZoneID(), send_buff, send_index); } // Tell everyone nearby our new status. send_index = 0; SetByte(send_buff, WIZ_OBJECT_EVENT, send_index ); SetByte(send_buff, OBJECT_FLAG_LEVER, send_index ); SetByte(send_buff, 1, send_index ); SetShort(send_buff, GetID(), send_index ); SetByte(send_buff, m_byGateOpen, send_index ); m_pMain->Send_Region(send_buff, send_index, GetMap(), m_sRegion_X, m_sRegion_Z, NULL, false); }
VOID Obj_Monster::SendCharBaseDirectForHP() { __ENTER_FUNCTION GCCharBaseAttrib msgPublicAttr; GCCharBaseAttrib msgProtectedAttr; BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setObjID( GetID() ); msgPublicAttr.setHPPercent( yHPPercent ); msgProtectedAttr.setObjID( GetID() ); msgProtectedAttr.setHPPercent( yHPPercent ); m_AttrBackUp.m_HP = GetHP(); if (GetHP() <= 0) // add by gh 2010/04/09 { BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); m_AttrBackUp.m_MP = GetMP(); } // end of add HUMANLIST listHuman; getScene()->ScanHuman( getZoneID(), MAX_REFESH_OBJ_ZONE_RADIUS, &(listHuman) ); BYTE i; for ( i = 0; i < listHuman.m_Count; i++ ) { Obj_Human *pTargetHuman = listHuman.m_aHuman[i]; if ( IsCanViewMe( pTargetHuman ) ) { ENUM_REFESH_ATTR_TYPE eType = CalcRefeshAttrType( this, pTargetHuman ); switch( eType ) { case REFESH_ATTR_TYPE_NONE: break; case REFESH_ATTR_TYPE_PUBLIC: case REFESH_ATTR_TYPE_PUBLIC_AND_LEVEL: { pTargetHuman->GetPlayer()->SendPacket( &msgPublicAttr ); } break; case REFESH_ATTR_TYPE_PROTECTED: { pTargetHuman->GetPlayer()->SendPacket( &msgProtectedAttr ); } break; default: break; } } } __LEAVE_FUNCTION }
// 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::ZoneChange(int zone, float x, float z) { m_bZoneChangeFlag = TRUE; int send_index = 0, zoneindex = 0; char send_buff[128]; C3DMap* pMap = NULL; _ZONE_SERVERINFO *pInfo = NULL; if( g_serverdown_flag ) return; pMap = m_pMain->GetZoneByID(zone); if (!pMap) return; m_pMap = pMap; if( pMap->m_bType == 2 ) { // If Target zone is frontier zone. if( m_pUserData->m_bLevel < 20 && m_pMain->m_byBattleOpen != SNOW_BATTLE) return; } if( m_pMain->m_byBattleOpen == NATION_BATTLE ) { // Battle zone open if( m_pUserData->m_bZone == BATTLE_ZONE ) { if( pMap->m_bType == 1 && m_pUserData->m_bNation != zone ) { // ???? ?????? ???? ????.. if( m_pUserData->m_bNation == KARUS && !m_pMain->m_byElmoradOpenFlag ) { TRACE("#### ZoneChange Fail ,,, id=%s, nation=%d, flag=%d\n", m_pUserData->m_id, m_pUserData->m_bNation, m_pMain->m_byElmoradOpenFlag); return; } else if( m_pUserData->m_bNation == ELMORAD && !m_pMain->m_byKarusOpenFlag ) { TRACE("#### ZoneChange Fail ,,, id=%s, nation=%d, flag=%d\n", m_pUserData->m_id, m_pUserData->m_bNation, m_pMain->m_byKarusOpenFlag); return; } } } else if( pMap->m_bType == 1 && m_pUserData->m_bNation != zone ) { // ???? ?????? ???? ????.. return; } // else if( pMap->m_bType == 2 && zone == ZONE_FRONTIER ) { // You can't go to frontier zone when Battlezone is open. int temp_index = 0; char temp_buff[3]; SetByte( temp_buff, WIZ_WARP_LIST, temp_index ); SetByte( temp_buff, 2, temp_index ); SetByte( temp_buff,0, temp_index ); Send(temp_buff, temp_index); // return; } // } else if( m_pMain->m_byBattleOpen == SNOW_BATTLE ) { // Snow Battle zone open if( pMap->m_bType == 1 && m_pUserData->m_bNation != zone ) { // ???? ?????? ???? ????.. return; } else if( pMap->m_bType == 2 && (zone == ZONE_FRONTIER || zone == ZONE_BATTLE ) ) { // You can't go to frontier zone when Battlezone is open. return; } } else { // Battle zone close if( pMap->m_bType == 1 && m_pUserData->m_bNation != zone && (zone < 10 || zone > 20)) // ???? ?????? ???? ????.. return; } m_bWarp = 0x01; UserInOut( USER_OUT ); if( m_pUserData->m_bZone == ZONE_SNOW_BATTLE ) { //TRACE("ZoneChange - name=%s\n", m_pUserData->m_id); SetMaxHp( 1 ); } m_pUserData->m_bZone = zone; m_pUserData->m_curx = m_fWill_x = x; m_pUserData->m_curz = m_fWill_z = z; if( m_pUserData->m_bZone == ZONE_SNOW_BATTLE ) { //TRACE("ZoneChange - name=%s\n", m_pUserData->m_id); SetMaxHp(); } PartyRemove(m_Sid); // ??????? Z?????? ó?? //TRACE("ZoneChange ,,, id=%s, nation=%d, zone=%d, x=%.2f, z=%.2f\n", m_pUserData->m_id, m_pUserData->m_bNation, zone, x, z); if( m_pMain->m_nServerNo != pMap->m_nServerNo ) { pInfo = m_pMain->m_ServerArray.GetData( pMap->m_nServerNo ); if( !pInfo ) return; UserDataSaveToAgent(); CTime t = CTime::GetCurrentTime(); m_pMain->WriteLog("[ZoneChange : %d-%d-%d] - sid=%d, acname=%s, name=%s, zone=%d, x=%d, z=%d \r\n", t.GetHour(), t.GetMinute(), t.GetSecond(), m_Sid, m_strAccountID, m_pUserData->m_id, zone, (int)x, (int)z); m_pUserData->m_bLogout = 2; // server change flag SendServerChange(pInfo->strServerIP, 2); return; } m_pUserData->m_sBind = -1; // Bind Point Clear... m_RegionX = (int)(m_pUserData->m_curx / VIEW_DISTANCE); m_RegionZ = (int)(m_pUserData->m_curz / VIEW_DISTANCE); SetByte( send_buff, WIZ_ZONE_CHANGE, send_index ); SetByte( send_buff, 0x03, send_index ); SetByte( send_buff, m_pUserData->m_bZone, send_index ); SetShort( send_buff, (WORD)m_pUserData->m_curx*10, send_index ); SetShort( send_buff, (WORD)m_pUserData->m_curz*10, send_index ); SetShort( send_buff, (short)m_pUserData->m_cury*10, send_index ); SetByte( send_buff, m_pMain->m_byOldVictory, send_index ); Send( send_buff, send_index ); if (!m_bZoneChangeSameZone) { m_sWhoKilledMe = -1; m_iLostExp = 0; m_bRegeneType = 0; m_fLastRegeneTime = 0.0f; m_pUserData->m_sBind = -1; InitType3(); InitType4(); } if (m_bZoneChangeSameZone) { m_bZoneChangeSameZone = FALSE; } send_index = 0; SetByte( send_buff, AG_ZONE_CHANGE, send_index ); SetShort( send_buff, m_Sid, send_index ); SetByte( send_buff, getZoneID(), send_index ); m_pMain->Send_AIServer(send_buff, send_index); m_bZoneChangeFlag = FALSE; }
VOID Obj_Monster::SendMsg_RefeshAttrib( VOID ) { __ENTER_FUNCTION BOOL bPublicAttrModified ; bPublicAttrModified = FALSE; GCCharBaseAttrib msgPublicAttr, msgProtectedAttr; msgPublicAttr.setObjID( GetID() ); msgProtectedAttr.setObjID( GetID() ); //msgPublicAttr.setName( GetName() ); //msgProtectedAttr.setName( GetName() ); //msgPublicAttr.setTitle( GetTitle() ); //msgProtectedAttr.setTitle( GetTitle() ); if(m_AttrBackUp.m_HP != GetHP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_HP = GetHP(); BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setHPPercent( yHPPercent ); msgProtectedAttr.setHPPercent( yHPPercent ); } if(m_AttrBackUp.m_MaxHp != GetMaxHP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MaxHp = GetMaxHP(); BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setHPPercent( yHPPercent ); msgProtectedAttr.setHPPercent( yHPPercent ); } // add by gh 2010/03/30 if(m_AttrBackUp.m_MP != GetMP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MP = GetMP(); BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); msgProtectedAttr.setMPPercent( yMPPercent ); } if(m_AttrBackUp.m_MaxMp != GetMaxMP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MaxMp = GetMaxMP(); BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); msgProtectedAttr.setMPPercent( yMPPercent ); } // end of add if(fabs(m_AttrBackUp.m_MoveSpeed-GetMoveSpeed()) > 0.001f) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MoveSpeed = GetMoveSpeed(); msgPublicAttr.setMoveSpeed( GetMoveSpeed() ); msgProtectedAttr.setMoveSpeed( GetMoveSpeed() ); } if(m_AttrBackUp.m_nDataID != GetDataID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nDataID = GetDataID(); } const _CAMP_DATA *pCampData = GetCampData(); if ( pCampData != NULL ) { if(m_AttrBackUp.m_CampData != *pCampData) { bPublicAttrModified = TRUE; m_AttrBackUp.m_CampData = *pCampData; msgPublicAttr.setCampData( pCampData ); msgProtectedAttr.setCampData( pCampData ); } } if(m_AttrBackUp.m_OwnerID != GetOwnerID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_OwnerID = GetOwnerID(); msgPublicAttr.setOwnerID( GetOwnerID() ); msgProtectedAttr.setOwnerID( GetOwnerID() ); } if(m_AttrBackUp.m_OccupantGUID != GetOccupantGUID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_OccupantGUID = GetOccupantGUID(); msgPublicAttr.setOccupantGUID( GetOccupantGUID() ); msgProtectedAttr.setOccupantGUID( GetOccupantGUID() ); } if(m_AttrBackUp.m_nModelID != GetModelID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nModelID = GetModelID(); msgPublicAttr.setModelID( GetModelID() ); msgProtectedAttr.setModelID( GetModelID() ); } if(m_AttrBackUp.m_nMountID != GetMountID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nMountID = GetMountID(); msgPublicAttr.setMountID( GetMountID() ); msgProtectedAttr.setMountID( GetMountID() ); } if (m_AttrBackUp.m_nAIType != GetAIType() ) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nAIType = GetAIType(); INT nRet = GetMonsterAIType(); msgPublicAttr.setAIType(nRet); msgProtectedAttr.setAIType(nRet); } if(m_AttrBackUp.m_nStealthLevel != GetStealthLevel()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nStealthLevel = GetStealthLevel(); msgPublicAttr.setStealthLevel( GetStealthLevel() ); msgProtectedAttr.setStealthLevel( GetStealthLevel() ); } if(m_AttrBackUp.m_nMoodState != GetMoodState()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nMoodState = GetMoodState(); msgPublicAttr.setMoodState( GetMoodState() ); msgProtectedAttr.setMoodState( GetMoodState() ); } //if( m_AttrBackUp.m_iWeaponID != GetWeaponID() ) //{ // bPublicAttrModified = TRUE; // m_AttrBackUp.m_iWeaponID = GetWeaponID(); // //msgPublicAttr.setWeaponID( m_AttrBackUp.m_iWeaponID ); // msgProtectedAttr.setWeaponID( m_AttrBackUp.m_iWeaponID ); //} if( m_AttrBackUp.m_iHorseID != GetHorseID() ) { bPublicAttrModified = TRUE; m_AttrBackUp.m_iHorseID = GetHorseID(); msgPublicAttr.setMountID( m_AttrBackUp.m_iHorseID ); msgProtectedAttr.setMountID( m_AttrBackUp.m_iHorseID ); } if ( bPublicAttrModified ) { if ( bPublicAttrModified ) { m_PublicAttrVersion++; } if ( bPublicAttrModified || m_ProtectedAttrVersion ) { m_ProtectedAttrVersion++; } HUMANLIST listHuman; getScene()->ScanHuman( getZoneID(), MAX_REFESH_OBJ_ZONE_RADIUS, &(listHuman) ); BOOL bSendPublicMsg = bPublicAttrModified; BOOL bSendProtectedMsg = (BOOL)(bPublicAttrModified || m_ProtectedAttrVersion); BYTE i; for ( i = 0; i < listHuman.m_Count; i++ ) { Obj_Human *pTargetHuman = listHuman.m_aHuman[i]; if ( IsCanViewMe( pTargetHuman ) ) { ENUM_REFESH_ATTR_TYPE eType = CalcRefeshAttrType( this, pTargetHuman ); switch( eType ) { case REFESH_ATTR_TYPE_NONE: break; case REFESH_ATTR_TYPE_PUBLIC: case REFESH_ATTR_TYPE_PUBLIC_AND_LEVEL: if ( bSendPublicMsg ) { pTargetHuman->GetPlayer()->SendPacket( &msgPublicAttr ); } break; case REFESH_ATTR_TYPE_PROTECTED: if ( bSendProtectedMsg ) { pTargetHuman->GetPlayer()->SendPacket( &msgProtectedAttr ); } break; default: break; } } } } __LEAVE_FUNCTION }
void CUser::SelectCharacter(char *pBuf) { int index = 0, send_index = 0, zoneindex = -1, retvalue = 0; char send_buff[MAX_SEND_SIZE]; memset(send_buff, NULL, sizeof(send_buff)); BYTE result, bInit; C3DMap* pMap = NULL; _ZONE_SERVERINFO *pInfo = NULL; CKnights* pKnights = NULL; result = GetByte( pBuf, index ); bInit = GetByte( pBuf, index ); if (result == 0 || !getZoneID()) goto fail_return; pMap = m_pMap = m_pMain->GetZoneByID(getZoneID()); if (pMap == NULL) goto fail_return; if( m_pMain->m_nServerNo != pMap->m_nServerNo ) { pInfo = m_pMain->m_ServerArray.GetData( pMap->m_nServerNo ); if( !pInfo ) goto fail_return; SetByte( send_buff, WIZ_SERVER_CHANGE, send_index ); SetKOString(send_buff, pInfo->strServerIP, send_index); SetByte( send_buff, bInit, send_index ); SetByte( send_buff, m_pUserData->m_bZone, send_index ); SetByte( send_buff, m_pMain->m_byOldVictory, send_index ); Send( send_buff, send_index ); return; } if( m_pUserData->m_bAuthority == 0xff ) { Close(); return; } if( m_pMain->m_byBattleOpen == NO_BATTLE && m_pUserData->m_bFame == COMMAND_CAPTAIN ) { m_pUserData->m_bFame = CHIEF; } if(m_pUserData->m_bZone != m_pUserData->m_bNation && m_pUserData->m_bZone < 3 && !m_pMain->m_byBattleOpen) { NativeZoneReturn(); Close(); return; } if(m_pUserData->m_bZone == ZONE_BATTLE && ( m_pMain->m_byBattleOpen != NATION_BATTLE) ) { NativeZoneReturn(); Close(); return; } if(m_pUserData->m_bZone == ZONE_SNOW_BATTLE && ( m_pMain->m_byBattleOpen != SNOW_BATTLE) ) { NativeZoneReturn(); Close(); return; } if(m_pUserData->m_bZone == ZONE_FRONTIER && m_pMain->m_byBattleOpen) { NativeZoneReturn(); Close(); return; } // SetLogInInfoToDB(bInit); // Write User Login Info To DB for Kicking out or Billing SetByte( send_buff, WIZ_SEL_CHAR, send_index ); SetByte( send_buff, result, send_index ); SetByte( send_buff, getZoneID(), send_index ); SetShort( send_buff, (WORD)m_pUserData->m_curx*10, send_index ); SetShort( send_buff, (WORD)m_pUserData->m_curz*10, send_index ); SetShort( send_buff, (short)m_pUserData->m_cury*10, send_index ); SetByte( send_buff, m_pMain->m_byOldVictory, send_index ); m_bSelectedCharacter = true; Send( send_buff, send_index ); SetDetailData(); //TRACE("SelectCharacter 111 - id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); if( m_pUserData->m_bZone > 2) { if( m_pUserData->m_bKnights == -1) { // ???? ??? m_pUserData->m_bKnights = 0; m_pUserData->m_bFame = 0; //TRACE("SelectCharacter - id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); return; } else if( m_pUserData->m_bKnights != 0 ) { pKnights = m_pMain->m_KnightsArray.GetData( m_pUserData->m_bKnights ); if( pKnights ) { m_pMain->m_KnightsManager.SetKnightsUser( m_pUserData->m_bKnights, m_pUserData->m_id ); } else { //TRACE("SelectCharacter - ???? ????T ??û,, id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); memset( send_buff, 0x00, 256); send_index = 0; SetByte( send_buff, WIZ_KNIGHTS_PROCESS, send_index ); SetByte( send_buff, KNIGHTS_LIST_REQ+0x10, send_index ); SetShort( send_buff, GetSocketID(), send_index ); SetShort( send_buff, m_pUserData->m_bKnights, send_index ); retvalue = m_pMain->m_LoggerSendQueue.PutData( send_buff, send_index ); if (retvalue >= SMQ_FULL) DEBUG_LOG("KNIGHTS_LIST_REQ Packet Drop!!!"); pKnights = m_pMain->m_KnightsArray.GetData( m_pUserData->m_bKnights ); if( pKnights ) { //TRACE("SelectCharacter - ???? ????T ???,, id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); m_pMain->m_KnightsManager.SetKnightsUser( m_pUserData->m_bKnights, m_pUserData->m_id ); } } } } else { if( m_pUserData->m_bKnights == -1) { // ???? ??? m_pUserData->m_bKnights = 0; m_pUserData->m_bFame = 0; //TRACE("SelectCharacter - id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); return; } else if( m_pUserData->m_bKnights != 0 ) { pKnights = m_pMain->m_KnightsArray.GetData( m_pUserData->m_bKnights ); if( pKnights ) { m_pMain->m_KnightsManager.SetKnightsUser( m_pUserData->m_bKnights, m_pUserData->m_id ); } else { // ?????? ?i???? ??????.. m_pUserData->m_bKnights = 0; m_pUserData->m_bFame = 0; } } } //TRACE("SelectCharacter - id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); return; fail_return: SetByte( send_buff, WIZ_SEL_CHAR, send_index ); SetByte( send_buff, 0x00, send_index ); Send( send_buff, send_index ); }
void CMapGenerator::createDirectConnections() { for (auto connection : mapGenOptions->getMapTemplate()->getConnections()) { auto zoneA = connection.getZoneA(); auto zoneB = connection.getZoneB(); //rearrange tiles in random order auto tilesCopy = zoneA->getTileInfo(); std::vector<int3> tiles(tilesCopy.begin(), tilesCopy.end()); int3 guardPos(-1,-1,-1); auto otherZoneTiles = zoneB->getTileInfo(); int3 posA = zoneA->getPos(); int3 posB = zoneB->getPos(); // auto zoneAid = zoneA->getId(); auto zoneBid = zoneB->getId(); if (posA.z == posB.z) { std::vector<int3> middleTiles; for (auto tile : tilesCopy) { if (isBlocked(tile)) //tiles may be occupied by subterranean gates already placed continue; foreachDirectNeighbour (tile, [&guardPos, tile, &otherZoneTiles, &middleTiles, this, zoneBid](int3 &pos) //must be direct since paths also also generated between direct neighbours { if (getZoneID(pos) == zoneBid) middleTiles.push_back(tile); }); } //find tiles with minimum manhattan distance from center of the mass of zone border size_t tilesCount = middleTiles.size() ? middleTiles.size() : 1; int3 middleTile = std::accumulate(middleTiles.begin(), middleTiles.end(), int3(0, 0, 0)); middleTile.x /= tilesCount; middleTile.y /= tilesCount; middleTile.z /= tilesCount; //TODO: implement division operator for int3? boost::sort(middleTiles, [middleTile](const int3 &lhs, const int3 &rhs) -> bool { //choose tiles with both corrdinates in the middle return lhs.mandist2d(middleTile) < rhs.mandist2d(middleTile); }); //remove 1/4 tiles from each side - path should cross zone borders at smooth angle size_t removedCount = tilesCount / 4; //rounded down middleTiles.erase(middleTiles.end() - removedCount, middleTiles.end()); middleTiles.erase(middleTiles.begin(), middleTiles.begin() + removedCount); RandomGeneratorUtil::randomShuffle(middleTiles, rand); for (auto tile : middleTiles) { guardPos = tile; if (guardPos.valid()) { setOccupied(guardPos, ETileType::FREE); //just in case monster is too weak to spawn zoneA->addMonster(this, guardPos, connection.getGuardStrength(), false, true); //zones can make paths only in their own area zoneA->crunchPath(this, guardPos, posA, true, zoneA->getFreePaths()); //make connection towards our zone center zoneB->crunchPath(this, guardPos, posB, true, zoneB->getFreePaths()); //make connection towards other zone center zoneA->addRoadNode(guardPos); zoneB->addRoadNode(guardPos); break; //we're done with this connection } } } if (!guardPos.valid()) connectionsLeft.push_back(connection); } }