[C++]Maximum szint

Indította masodikbela, 2015-07-13, 21:07:50

2015-07-13, 21:07:50 Utolsó szerkesztés: 2015-11-22, 18:38:41 Szerző: masodikbela
Valószínűleg, mivel ismét új témát kényszerültem nyitni, így ez sem lesz sokkal rövidebb, mint az előző (a kereskedőházas ;)), és mivel annyira szeretek beszélni, ezért fogjunk is hozzá.

A napokban egyre többen kerestek meg, hogy segítsek nekik a maximum szint kibővítésében, illetve láttam felbukkanni néhány ezzel kapcsolatos témát is, plusz amúgy is tervezgettem, hogy írok erről egy tutorialt, ezért elérkezettnek láttam az időt arra, hogy ma elkészítsem.

A tutorial mellett eszembe jutott az is, hogy miért is ne vegyem fel videóra, hogy hogyan készült ez az egész. Már készülődéskor biztos voltam benne, hogy olyan hosszú lesz a videó, hogy egyrészt senki nem fogja végignézni az egészet, és én sem kényszerítenék senkit arra, hogy az átírogatást videóból oldja meg, ezért csupán csak azért készítettem el, hogy egyrészt látszódjon az, hogy mennyi meló is volt vele (na persze, átírni 20 változó típusát BYTE-ról int-re... pls Béla), illetve hátha néhány embernek segítségére lesz, és eltanul néhány trükköt.
A videó hossza nagyjából 45-50 perc (5x-ös gyorsítással (itt-ott az érdekesebb részeknél le van lassítva 2.5x-ösre)), a téma alján megtalálható.

Nah szóval...

Én részemről a szint változóit int típusúra választottam, 2 okból:

  • bőven elég a max 2147483647-es szint
  • a karakter által kiosztott sebzés (és elég sok minden más is) kapcsolatban van a karakter szintjével, amelyeknek int típusú a változója (éppen ezért is nem unsigned int-et használtam)
  • Éppen ezek miatt ajánlom mindenki másnak is, hogy intet használjon ;)

    game/src

    char.cpp
    Keress rá:
    void CHARACTER::SetLevel(BYTE level)

    Cseréld erre:
    void CHARACTER::SetLevel(int level)

    char.h
    Keress rá:
    void SetLevel(BYTE level);

    Cseréld erre:
    void SetLevel(int level);

    Keress rá:
    BYTE level;
    (ez alatt van: typedef struct character_point)

    Cseréld erre:
    int level;

    party.cpp
    Keress rá:
    void CParty::P2PSetMemberLevel(DWORD pid, BYTE level)

    Cseréld le:
    void CParty::P2PSetMemberLevel(DWORD pid, int level)

    Majd ezt:
    BYTE CParty::GetMemberMaxLevel()
    {
    BYTE bMax = 0;


    Erre:
    int CParty::GetMemberMaxLevel()
    {
    int bMax = 0;


    Valamint ezt:
    BYTE CParty::GetMemberMinLevel()
    {
    BYTE bMin = PLAYER_MAX_LEVEL_CONST;


    Erre:
    int CParty::GetMemberMinLevel()
    {
    int bMin = PLAYER_MAX_LEVEL_CONST;


    És végül ezt:
    void CParty::RequestSetMemberLevel(DWORD pid, BYTE level)

    Erre:
    void CParty::RequestSetMemberLevel(DWORD pid, int level)

    party.h
    Ezt:
    BYTE bLevel;
    Ez alatt van: typedef struct SMember

    Erre:
    int bLevel;

    Ezeket:
    BYTE GetMemberMaxLevel();
    BYTE GetMemberMinLevel();


    Erre:
    int GetMemberMaxLevel();
    int GetMemberMinLevel();


    És végül ezeket:
    void RequestSetMemberLevel(DWORD pid, BYTE level);
    void P2PSetMemberLevel(DWORD pid, BYTE level);


    Erre:
    void RequestSetMemberLevel(DWORD pid, int level);
    void P2PSetMemberLevel(DWORD pid, int level);


    char_battle.cpp
    Keressünk rá erre:
    struct FPartyTotaler
    {
    int total;


    Majd cseréljük le erre:
    struct FPartyTotaler
    {
    long total;


    Illetve ezt:
    struct FPartyDistributor
    {
    int total;
    LPCHARACTER c;
    int x, y;
    DWORD _iExp;
    int m_iMode;
    int m_iMemberCount;

    FPartyDistributor(LPCHARACTER center, int member_count, int total, DWORD iExp, int iMode)


    Erre:
    struct FPartyDistributor
    {
    long total;
    LPCHARACTER c;
    int x, y;
    DWORD _iExp;
    int m_iMode;
    int m_iMemberCount;

    FPartyDistributor(LPCHARACTER center, int member_count, long total, DWORD iExp, int iMode)


    config.h
    Ezt:
    extern BYTE PK_PROTECT_LEVEL;

    Erre:
    extern int PK_PROTECT_LEVEL;

    locale_service.cpp
    Ezt:
    BYTE PK_PROTECT_LEVEL

    Erre:
    int PK_PROTECT_LEVEL

    constants.cpp
    Nah, itt el kell döntened, hogy mennyi szintet akarsz, és az alapján a következő táblákat úgy kell kitöltened, hogy annyi darab adat legyen benne. Alapjáraton 120-ig vannak az exp-k megírva.
    const DWORD exp_table_euckr[PLAYER_EXP_TABLE_MAX + 1]
    const DWORD exp_table_common[PLAYER_EXP_TABLE_MAX + 1]
    const DWORD exp_table_newcibn[PLAYER_EXP_TABLE_MAX + 1 ]
    const DWORD party_exp_distribute_table[PLAYER_MAX_LEVEL_CONST + 1]
    const int aiExpLossPercents[PLAYER_EXP_TABLE_MAX + 1]

    Elég, ha csak lemásolod az előző 10-et annyiszor, ahányszor akarod. Csupán csak nem szeretném, hogy ezzel teljen be a 20k karakternyi helyem, mivel lehet így sem lesz elég.

    log.h
    Ezt:
    void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime);

    Erre:
    void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime);

    log.cpp
    Ezt:
    void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime)

    Erre:
    void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime)

    guild.h
    Ezt:
    typedef struct SGuildMemberPacketData
    {   
    DWORD pid;
    BYTE grade;
    BYTE is_general;
    BYTE job;
    BYTE level;
    DWORD offer;
    BYTE name_flag;
    char name[CHARACTER_NAME_MAX_LEN+1];
    } TGuildMemberPacketData;


    Cseréld le erre:
    typedef struct SGuildMemberPacketData
    {   
    DWORD pid;
    BYTE byGrade;
    BYTE byIsGeneral;
    BYTE byJob;
    int byLevel;
    DWORD dwOffer;
    BYTE byNameFlag;
    } TGuildMemberPacketData;


    Majd ezt:
    void ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade);

    Erre:
    void ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade);

    Ezután ezt:
    SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name);

    Erre:
    SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name);

    Majd ezt:
    DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key
    BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ)
    BYTE is_general;
    BYTE job;
    BYTE level;
    DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ
    BYTE _dummy;


    Erre:
    DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key
    BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ)
    BYTE is_general;
    BYTE job;
    int level;
    DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ
    BYTE _dummy;


    És végül ezt:
    void LevelChange(DWORD pid, BYTE level);

    Erre:
    void LevelChange(DWORD pid, int level);

    guild.cpp
    Nos, itt újra kellett írnom a tagok szintjének küldését, mivel alapjáraton "kissé el volt barmolva".

    Keress rá erre:
    BYTE level = (BYTE)strtoul(row[4], (char**) NULL, 10);

    Írd át erre:
    int level = (int)strtoul(row[4], (char**) NULL, 10);

    Keress rá erre:
    sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %u, offer %u, name %s ptr %p",

    És írd át erre:
    sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %d, offer %u, name %s ptr %p",

    Ezt a funkciót:
    void CGuild::ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade)

    Teljes egészében cseréld le erre:
    void CGuild::ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade)
    {
    TGuildMemberContainer::iterator cit = m_member.find(pid);

    if (cit == m_member.end())
    return;

    cit->second.offer_exp = offer;
    cit->second.level = level;
    cit->second.grade = grade;
    cit->second._dummy = 0;

    TPacketGCGuild pack;
    TGuildMemberPacketData mbData;
    pack.header = HEADER_GC_GUILD;
    pack.subheader = GUILD_SUBHEADER_GC_LIST;
    pack.size = sizeof(TPacketGCGuild);
    pack.size += sizeof(TGuildMemberPacketData);

    for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
    {
    LPDESC d = (*it)->GetDesc();
    if (d)
    {
    TEMP_BUFFER buf;

    buf.write(&pack, sizeof(pack));

    mbData.byNameFlag = 0;
    mbData.byGrade = cit->second.grade;
    mbData.byIsGeneral = cit->second.is_general;
    mbData.byJob = cit->second.job;
    mbData.byLevel = cit->second.level;
    mbData.dwOffer = cit->second.offer_exp;
    mbData.pid = cit->second.pid;
    buf.write(&mbData, sizeof(TGuildMemberPacketData));

    d->Packet(buf.read_peek(), buf.size());
    }
    }
    }


    Ezen kívül ezt a funkciót:
    void CGuild::LevelChange(DWORD pid, BYTE level)

    Erre:
    void CGuild::LevelChange(DWORD pid, int level)
    {
    TGuildMemberContainer::iterator cit = m_member.find(pid);

    if (cit == m_member.end())
    return;

    cit->second.level = level;

    TPacketGuildChangeMemberData gd_guild;

    gd_guild.guild_id = GetID();
    gd_guild.pid = pid;
    gd_guild.offer = cit->second.offer_exp;
    gd_guild.grade = cit->second.grade;
    gd_guild.level = level;

    db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild));

    TPacketGCGuild pack;
    TGuildMemberPacketData mbData;
    pack.header = HEADER_GC_GUILD;
    pack.subheader = GUILD_SUBHEADER_GC_LIST;
    pack.size = sizeof(TPacketGCGuild);
    pack.size += sizeof(TGuildMemberPacketData);
    cit->second._dummy = 0;

    for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
    {
    LPDESC d = (*it)->GetDesc();

    if (d)
    {
    TEMP_BUFFER buf;

    buf.write(&pack, sizeof(pack));

    mbData.byNameFlag = 0;
    mbData.byGrade = cit->second.grade;
    mbData.byIsGeneral = cit->second.is_general;
    mbData.byJob = cit->second.job;
    mbData.byLevel = cit->second.level;
    mbData.dwOffer = cit->second.offer_exp;
    mbData.pid = cit->second.pid;
    buf.write(&mbData, sizeof(TGuildMemberPacketData));

    d->Packet(buf.read_peek(), buf.size());
    }
    }
    }


    Ezt a funkciót:
    bool CGuild::OfferExp(LPCHARACTER ch, int amount)

    Erre:
    bool CGuild::OfferExp(LPCHARACTER ch, int amount)
    {
    TGuildMemberContainer::iterator cit = m_member.find(ch->GetPlayerID());

    if (cit == m_member.end())
    return false;

    if (m_data.exp+amount < m_data.exp)
    return false;

    if (amount < 0)
    return false;

    if (ch->GetExp() < (DWORD) amount)
    {
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> Á¦°řÇĎ°íŔÚ ÇĎ´Â °ćÇčġ°ˇ ł˛Ŕş °ćÇčġş¸´Ů ¸ą˝Ŕ´Ď´Ů."));
    return false;
    }

    if (ch->GetExp() - (DWORD) amount > ch->GetExp())
    {
    sys_err("Wrong guild offer amount %d by %s[%u]", amount, ch->GetName(), ch->GetPlayerID());
    return false;
    }

    ch->PointChange(POINT_EXP, -amount);

    TPacketGuildExpUpdate guild_exp;
    guild_exp.guild_id = GetID();
    guild_exp.amount = amount / 100;
    db_clientdesc->DBPacket(HEADER_GD_GUILD_EXP_UPDATE, 0, &guild_exp, sizeof(guild_exp));
    GuildPointChange(POINT_EXP, amount / 100, true);

    cit->second.offer_exp += amount / 100;
    cit->second._dummy = 0;

    TPacketGCGuild pack;
    TGuildMemberPacketData mbData;
    pack.header = HEADER_GC_GUILD;
    pack.subheader = GUILD_SUBHEADER_GC_LIST;
    pack.size = sizeof(TPacketGCGuild);
    pack.size += sizeof(TGuildMemberPacketData);

    for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
    {
    LPDESC d = (*it)->GetDesc();
    if (d)
    {

    TEMP_BUFFER buf;

    buf.write(&pack, sizeof(pack));

    mbData.byNameFlag = 0;
    mbData.byGrade = cit->second.grade;
    mbData.byIsGeneral = cit->second.is_general;
    mbData.byJob = cit->second.job;
    mbData.byLevel = cit->second.level;
    mbData.dwOffer = cit->second.offer_exp;
    mbData.pid = cit->second.pid;
    buf.write(&mbData, sizeof(TGuildMemberPacketData));

    d->Packet(buf.read_peek(), buf.size());
    }
    }

    SaveMember(ch->GetPlayerID());

    TPacketGuildChangeMemberData gd_guild;

    gd_guild.guild_id = GetID();
    gd_guild.pid = ch->GetPlayerID();
    gd_guild.offer = cit->second.offer_exp;
    gd_guild.level = ch->GetLevel();
    gd_guild.grade = cit->second.grade;

    db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild));
    return true;
    }


    Ezt a funkciót:
    void CGuild::SendListPacket(LPCHARACTER ch)

    Erre:
    void CGuild::SendListPacket(LPCHARACTER ch)
    {
    /*
       List Packet

       Header
       Count (byte)
       [
       ...
       name_flag 1 - Ŕ̸§Ŕ» ş¸ł»´ŔłÄ ľČş¸ł»´ŔłÄ
       name CHARACTER_NAME_MAX_LEN+1
       ] * Count

    */
    LPDESC d;
    if (!(d=ch->GetDesc()))
    return;

    TPacketGCGuild pack;
    pack.header = HEADER_GC_GUILD;
    pack.size = sizeof(TPacketGCGuild);
    pack.subheader = GUILD_SUBHEADER_GC_LIST;

    pack.size += sizeof(TGuildMemberPacketData) * m_member.size();
    pack.size += (CHARACTER_NAME_MAX_LEN + 1) * m_member.size();

    TEMP_BUFFER buf;

    TGuildMemberPacketData mbData;

    buf.write(&pack,sizeof(pack));

    char c[CHARACTER_NAME_MAX_LEN+1];

    for (TGuildMemberContainer::iterator it = m_member.begin(); it != m_member.end(); ++it)
    {
    it->second._dummy = 1;

    mbData.byNameFlag = 1;
    mbData.byGrade = it->second.grade;
    mbData.byIsGeneral = it->second.is_general;
    mbData.byJob = it->second.job;
    mbData.byLevel = it->second.level;
    mbData.dwOffer = it->second.offer_exp;
    mbData.pid = it->second.pid;

    buf.write(&mbData, sizeof(TGuildMemberPacketData));

    strlcpy(c, it->second.name.c_str(), MIN(sizeof(c), it->second.name.length() + 1));

    buf.write(c, CHARACTER_NAME_MAX_LEN+1 );

    if ( test_server )
    sys_log(0 ,"name %s job %d  ", it->second.name.c_str(), it->second.job );
    }

    d->Packet(buf.read_peek(), buf.size());

    for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
    {
    SendLoginPacket(ch, *it);
    }

    for (TGuildMemberP2POnlineContainer::iterator it = m_memberP2POnline.begin(); it != m_memberP2POnline.end(); ++it)
    {
    SendLoginPacket(ch, *it);
    }

    }


    Majd ezt a funkciót:
    void CGuild::SendListOneToAll(DWORD pid)

    Erre cseréld le:
    void CGuild::SendListOneToAll(DWORD pid)
    {

    TPacketGCGuild pack;
    pack.header = HEADER_GC_GUILD;
    pack.size = sizeof(TPacketGCGuild);
    pack.subheader = GUILD_SUBHEADER_GC_LIST;

    pack.size += sizeof(TGuildMemberPacketData);

    TGuildMemberPacketData mbData;

    char c[CHARACTER_NAME_MAX_LEN+1];
    memset(c, 0, sizeof(c));

    TGuildMemberContainer::iterator cit = m_member.find(pid);
    if (cit == m_member.end())
    return;

    for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it!= m_memberOnline.end(); ++it)
    {
    LPDESC d = (*it)->GetDesc();
    if (!d)
    continue;

    TEMP_BUFFER buf;

    buf.write(&pack, sizeof(pack));

    cit->second._dummy = 1;

    mbData.byNameFlag = 1;
    mbData.byGrade = cit->second.grade;
    mbData.byIsGeneral = cit->second.is_general;
    mbData.byJob = cit->second.job;
    mbData.byLevel = cit->second.level;
    mbData.dwOffer = cit->second.offer_exp;
    mbData.pid = cit->second.pid;
    //buf.write(&(cit->second), sizeof(DWORD) * 3 +1);
    buf.write(&mbData, sizeof(TGuildMemberPacketData));
    buf.write(cit->second.name.c_str(), cit->second.name.length());
    buf.write(c, CHARACTER_NAME_MAX_LEN + 1 - cit->second.name.length());
    d->Packet(buf.read_peek(), buf.size());
    }
    }


    Végül a tetején a fájlnak ezt:
    SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name)

    Erre:
    SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name)

    common

    tables.h
    Ezt:
    BYTE byLevel;

    Erre:
    int byLevel;

    Ezt:
    BYTE level;

    Erre:
    int level;

    Illetve ezt:
    BYTE level;

    Erre:
    int level;

    Majd ezt:
    BYTE bLevel;
    ez alatt van: typedef struct SPacketPartySetMemberLevel
    Erre:
    int bLevel;

    És végül ezt:
    BYTE bLevel;
    ez alatt van: typedef struct SPacketDGGuildMember

    Erre:
    int bLevel;

    lenght.h
    Ezeknél írd át a szintet arra, amit szeretnél maximumnak:
    PLAYER_EXP_TABLE_MAX = 120,
    PLAYER_MAX_LEVEL_CONST = 120,


    db/src

    ClientManager.h
    Ezt cseréld le:
    struct TPartyInfo
    {
        BYTE bRole;
        BYTE bLevel;


    Erre:
    struct TPartyInfo
    {
        BYTE bRole;
        int bLevel;


    ClientManager.cpp
    Ezt: (void CClientManager::SendPartyOnSetup(CPeer* pkPeer) funkción belül van)
    pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE));

    Erre:
    pkPeer->Encode(&it_member->second.bLevel, sizeof(int));

    ClientManagerPlayer.cpp
    Ezt:
    "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"

    Erre:
    "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"

    És legvégül ezt:
    "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"
    2x is benne van, mind a 2x cseréld le!

    Erre:
    "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"




    Indító

    packet.h
    Ezt:
    BYTE                byLevel;

    Erre:
    int                byLevel;

    Ezt:
    BYTE byLevel;

    Erre:
    int byLevel;

    PythonGuild.h
    És végül utolsó műveletként ezt:
    BYTE byLevel;

    Erre:
    int byLevel;




    Ezen kívül mysqlben a player táblában a "level" oszlop típusát állítsuk át tinyintről pl 300-as max szint esetén smallintre, a lenghtet pedig vegyük 3-ra.
    Nos meg is volnánk.

    Ez lenne pedig a videó, ahogy az egész készült. Aki végignézi az a vendégem egy sörre (vagy valami folyékonyra) :)

    Ahogy szoktam mondani, ha kérdés/észrevétel/probléma van, használjátok a segítség topicot vagy dobjatok meg egy pm-el, és megnézzük mit lehet tenni.

    További szép estét:
    ~masodikbela
    Ha nem látod a válaszom, valamit elrontottál:

    2015-09-18, 21:39:57 #1 Utolsó szerkesztés: 2015-09-18, 21:48:55 Szerző: masodikbela
    A mai nap volt egy kis szabadidőm, ezért megcsináltam a fixet a céhproblémára. A leírást már frissítettem, de amennyiben már megcsináltad a leírást, tehát bent van a maximum szint növelés, akkor a következőt kell csak tenned:

    guild.cpp-ben, azon belül pedig SendListPacket funkcióban rákeresel erre:pack.size += sizeof(TGuildMemberPacketData) * m_member.size();
    és közvetlenül alá beilleszted ezt:pack.size += (CHARACTER_NAME_MAX_LEN + 1) * m_member.size();

    Elnézést a kellemetlenségért, és köszönöm a türelmet.
    Ha nem látod a válaszom, valamit elrontottál:

    Néhány hete találtam még egy apró problémát, alapjáraton ez nem befolyásolja a játékosokat/játékmenetet, legfeljebb csak kissé idegesítő lehet néhány helyzetben. Ha van létrehozva csoport a ch-kon, és leállítod azokat (vagy egyet, a lényeg hogy a db-t nem), majd pedig újraindítod őket, akkor becrashel a ch (windowson) vagy pedig csak nem lehet belépni (BSD) az adott ch-ra.

    Mint legutóbb is, ha már megcsináltad a leírást, itt a javítás/kiegészítés (ha még nem, a leírás már frissítve van):

    ClientManager.cpp
    Ezt: (void CClientManager::SendPartyOnSetup(CPeer* pkPeer) funkción belül van)
    pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE));

    Erre:
    pkPeer->Encode(&it_member->second.bLevel, sizeof(int));
    Ha nem látod a válaszom, valamit elrontottál: