Çözüldü boss ring

  • Konuyu açan Konuyu açan TheAdmin33
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 7
  • Gösterim Gösterim 139
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

TheAdmin33

Ah, bu şarkıların gözü kör olsun
Geliştirici
Yardımsever Üye
Usta Üye
Editör
Mesaj
1.313
Çözümler
74
Beğeni
4.929
Puan
1.859
Ticaret Puanı
0
boss ring sisteminin yanına çağırmalı versiyonları var, bu versiyona sahip paylaşılan bir files biliyormusunuz? eğer elinizde mevcutsa bossarena.cpp dosyasını atabilirmisiniz.
 
Çözüm
istediğimi buldum, yeni bir SpawnMobb fonksiyonu oluşturmuşlar boss ring te bu fonksiyonu kullanıyorlar ve her seferinde çağrılan boss u ve çağıran kişiyi vectore atıyorlar. EncodeInsertPacket te de bu vectorden kontrol yapıp mob un sadece çağıran kişiye gözükmesini sağlıyorlar.

char.h:
Genişlet Daralt Kopyala
class Table {
public:
    struct Row {
        const char* col1;
        DWORD col2;
    };

    void addRow(const char* c1, DWORD c2) {
        if (!c1) {
            return;
        }
        rows.push_back({c1, c2});
    }

    bool find(const char* value1, DWORD value2) const {
        if (!value1) {
            return false;
        }

        for (const auto& row : rows) {
            if (strcmp(row.col1, value1) == 0 && row.col2 == value2) {...
istediğimi buldum, yeni bir SpawnMobb fonksiyonu oluşturmuşlar boss ring te bu fonksiyonu kullanıyorlar ve her seferinde çağrılan boss u ve çağıran kişiyi vectore atıyorlar. EncodeInsertPacket te de bu vectorden kontrol yapıp mob un sadece çağıran kişiye gözükmesini sağlıyorlar.

char.h:
Genişlet Daralt Kopyala
class Table {
public:
    struct Row {
        const char* col1;
        DWORD col2;
    };

    void addRow(const char* c1, DWORD c2) {
        if (!c1) {
            return;
        }
        rows.push_back({c1, c2});
    }

    bool find(const char* value1, DWORD value2) const {
        if (!value1) {
            return false;
        }

        for (const auto& row : rows) {
            if (strcmp(row.col1, value1) == 0 && row.col2 == value2) {
                return true;
            }
        }
        return false;
    }

private:
    std::vector<Row> rows;
};

extern Table globalTable;

char.cpp:
Genişlet Daralt Kopyala
void CHARACTER::EncodeInsertPacket(LPENTITY entity)
{
    LPDESC d;
    if (!(d = entity->GetDesc()))
        return;

    LPCHARACTER ch = (LPCHARACTER) entity;

    if ((this->IsStone() || ch->IsStone()) && IsDead())
        return;

    ch->SendGuildName(GetGuild());

    TPacketGCCharacterAdd pack;

    pack.header        = HEADER_GC_CHARACTER_ADD;
    pack.dwVID        = m_vid;

    #ifdef ENABLE_SHOW_MOB_INFO
    if (IsMonster() || IsStone())
    {
        pack.dwLevel    = GetLevel();
        pack.dwAIFlag    = IsMonster() ? GetAIFlag() : 0;
    }
    else
    {
        pack.dwLevel    = 0;
        pack.dwAIFlag    = 0;
    }
    #endif

    pack.bType        = GetCharType();
    pack.angle        = GetRotation();
    pack.x            = GetX();
    pack.y            = GetY();
    pack.z            = GetZ();
    pack.wRaceNum    = GetRaceNum();
    if(IsBoss()){
        bool result = globalTable.find(ch->GetName(), pack.dwVID);
        if (result == false) {
            return;
        }
    }
    if (IsPet()
        #ifdef NEW_PET_SYSTEM
         || IsNewPet()
        #endif
        )
    {
        pack.bMovingSpeed    = 200;
    }
    else
    {
        pack.bMovingSpeed    = GetLimitPoint(POINT_MOV_SPEED);
    }

    pack.bAttackSpeed = GetLimitPoint(POINT_ATT_SPEED);
    pack.dwAffectFlag[0] = m_afAffectFlag.bits[0];
    pack.dwAffectFlag[1] = m_afAffectFlag.bits[1];

    pack.bStateFlag = m_bAddChrState;

    int iDur = 0;

    if (m_posDest.x != pack.x || m_posDest.y != pack.y)
    {
        iDur = (m_dwMoveStartTime + m_dwMoveDuration) - get_dword_time();

        if (iDur <= 0)
        {
            pack.x = m_posDest.x;
            pack.y = m_posDest.y;
        }
    }

    d->Packet(&pack, sizeof(pack));

    if (IsPC() == true || m_bCharType == CHAR_TYPE_NPC)
    {
        TPacketGCCharacterAdditionalInfo addPacket;
        memset(&addPacket, 0, sizeof(TPacketGCCharacterAdditionalInfo));

        addPacket.header = HEADER_GC_CHAR_ADDITIONAL_INFO;
        addPacket.dwVID = m_vid;

        addPacket.awPart[CHR_EQUIPPART_ARMOR] = GetPart(PART_MAIN);
        addPacket.awPart[CHR_EQUIPPART_WEAPON] = GetPart(PART_WEAPON);
        addPacket.awPart[CHR_EQUIPPART_HEAD] = GetPart(PART_HEAD);
        addPacket.awPart[CHR_EQUIPPART_HAIR] = GetPart(PART_HAIR);
#ifdef ENABLE_SASH_SYSTEM OR ENABLE_COSTUME_HIDE_SYSTEM
        addPacket.awPart[CHR_EQUIPPART_SASH] = GetQuestFlag("game_option.hide_sash") ? 0 : GetPart(PART_SASH);
#endif
#ifdef ENABLE_AURA_SYSTEM
        addPacket.awPart[CHR_EQUIPPART_AURA] = GetPart(PART_AURA);
#endif
#ifdef ENABLE_EQUIPMENT_WING
        addPacket.awPart[CHR_EQUIPPART_CAPE] = GetPart(PART_CAPE);
#endif
#ifdef ENABLE_REBIRT_SYSTEM
        addPacket.bRebirt = (IsPC()) ? GetRebirt() : 0;
#endif
#ifdef ENABLE_RANK_SYSTEM
        addPacket.bRank = (IsPC()) ? GetRank() : 0;
#endif
        addPacket.bPKMode = m_bPKMode;
        addPacket.dwMountVnum = GetMountVnum();
        addPacket.bEmpire = m_bEmpire;

        if (IsPC() == true
            #ifdef NEW_PET_SYSTEM
            || IsNewPet() == true
            #endif
            #ifdef OFFLINE_SHOP
            || IsPrivShop()
            #endif
            )
        {
            addPacket.dwLevel = GetLevel();
#ifdef TIMING_BONUS_SYSTEM
            if (IsPC() == true)
            {
                addPacket.RaidCallLevel = GetRaidcallLevel();
            }
            else
            {
                addPacket.RaidCallLevel = 0;
            }
#endif
        }
        else
        {
            addPacket.dwLevel = 0;
#ifdef TIMING_BONUS_SYSTEM
            addPacket.RaidCallLevel = 0;
#endif
        }


        LPITEM weapon = GetWear(WEAR_WEAPON);
        if (weapon)
            addPacket.dwWeaponEvolution = weapon->GetEvolution();
        else
            addPacket.dwWeaponEvolution = 0;


        if (false)
        {
            LPCHARACTER ch = (LPCHARACTER) entity;

            if (GetEmpire() == ch->GetEmpire() || ch->GetGMLevel() > GM_PLAYER || m_bCharType == CHAR_TYPE_NPC)
            {
                goto show_all_info;
            }
            else
            {
                memset(addPacket.name, 0, CHARACTER_NAME_MAX_LEN);
                addPacket.dwGuildID = 0;
                addPacket.sAlignment = 0;
#ifdef ENABLE_TITLE_SYSTEM
                addPacket.sPrestige = 0;
#endif
#ifdef ENABLE_TITLE_RUTBE_SYSTEM
                addPacket.sRutbe = 0;
#endif
            }
        }
        else
        {
        show_all_info:
            strlcpy(addPacket.name, GetName(), sizeof(addPacket.name));


            if (GetGuild() != NULL
                #ifdef OFFLINE_SHOP
                 && !IsPrivShop()
                #endif
                )
            {
                addPacket.dwGuildID = GetGuild()->GetID();
                CGuild* pGuild = this->GetGuild();
                if (pGuild && pGuild->GetMasterPID() == GetPlayerID())
                    addPacket.dwNewIsGuildName = 3;
                else if (pGuild && pGuild->NewIsGuildGeneral(GetPlayerID()) == true)
                    addPacket.dwNewIsGuildName = 2;
                else
                    addPacket.dwNewIsGuildName = 1;
            }
            #ifdef OFFLINE_SHOP
            else if (IsPrivShop())
            {
                LPCHARACTER owner = CHARACTER_MANAGER::instance().FindByPID(GetPrivShopOwner());
                if (owner)
                {
                    CGuild* pGuild = owner->GetGuild();
                    if (pGuild)
                    {
                        addPacket.dwGuildID = pGuild->GetID();
                        if (pGuild->GetMasterPID() == owner->GetPlayerID())
                            addPacket.dwNewIsGuildName = 3;
                        else if (pGuild->NewIsGuildGeneral(owner->GetPlayerID()) == true)
                            addPacket.dwNewIsGuildName = 2;
                        else
                            addPacket.dwNewIsGuildName = 1;
                    }
                    else
                    {
                        addPacket.dwGuildID = 0;
                        addPacket.dwNewIsGuildName = 0;
                    }
                }
                else
                {
                    CGuild* pGuild = GetGuild();
                    if (pGuild)
                    {
                        addPacket.dwGuildID = pGuild->GetID();
                        addPacket.dwNewIsGuildName = GetGuildPosition();
                    }
                    else
                    {
                        addPacket.dwGuildID = 0;
                        addPacket.dwNewIsGuildName = 0;
                    }
                }
            }
            #endif
            else
            {
                addPacket.dwGuildID = 0;
                addPacket.dwNewIsGuildName = 0;
            }

            addPacket.sAlignment = m_iAlignment / 10;
#ifdef ENABLE_TITLE_SYSTEM
            addPacket.sPrestige = m_iPrestige;
#endif
#ifdef ENABLE_TITLE_RUTBE_SYSTEM
            addPacket.sRutbe = m_iRutbe;
#endif
        }

        d->Packet(&addPacket, sizeof(TPacketGCCharacterAdditionalInfo));
    }

    if (iDur)
    {
        TPacketGCMove pack;
        EncodeMovePacket(pack, GetVID(), FUNC_MOVE, 0, m_posDest.x, m_posDest.y, iDur, 0, (BYTE) (GetRotation() / 5));
        d->Packet(&pack, sizeof(pack));

        TPacketGCWalkMode p;
        p.vid = GetVID();
        p.header = HEADER_GC_WALK_MODE;
        p.mode = m_bNowWalking ? WALKMODE_WALK : WALKMODE_RUN;

        d->Packet(&p, sizeof(p));
    }

    if (entity->IsType(ENTITY_CHARACTER) && GetDesc())
    {
        LPCHARACTER ch = (LPCHARACTER) entity;
        if (ch->IsWalking())
        {
            TPacketGCWalkMode p;
            p.vid = ch->GetVID();
            p.header = HEADER_GC_WALK_MODE;
            p.mode = ch->m_bNowWalking ? WALKMODE_WALK : WALKMODE_RUN;
            GetDesc()->Packet(&p, sizeof(p));
        }
    }

    if (GetMyShop())
    {
        TPacketGCShopSign p;

        p.bHeader = HEADER_GC_SHOP_SIGN;
        p.dwVID = GetVID();
        strlcpy(p.szSign, m_stShopSign.c_str(), sizeof(p.szSign));
#ifdef __ENABLE_SHOP_DECORATION_SYSTEM__
        p.bShopKasmirTitle = m_bKasmirPaketBaslik;
#endif

        d->Packet(&p, sizeof(TPacketGCShopSign));
    }

    if (entity->IsType(ENTITY_CHARACTER))
    {
        sys_log(3, "EntityInsert %s (RaceNum %d) (%d %d) TO %s",
                GetName(), GetRaceNum(), GetX() / SECTREE_SIZE, GetY() / SECTREE_SIZE, ((LPCHARACTER)entity)->GetName());
    }
}

char_manager.cpp:
Genişlet Daralt Kopyala
LPCHARACTER CHARACTER_MANAGER::SpawnMobb(const char* me, DWORD dwVnum, long lMapIndex, long x, long y, long z, bool bSpawnMotion, int iRot, bool bShow)
{
    const CMob * pkMob = CMobManager::instance().Get(dwVnum);
    if (!pkMob)
    {
        //sys_err("SpawnMob: no mob data for vnum %u", dwVnum);
        sys_err("SpawnMob: no mob data for vnum %u (map %u)", dwVnum, lMapIndex); // FixmeMara Detailed log.
        return NULL;
    }

    if (!(pkMob->m_table.bType == CHAR_TYPE_NPC || pkMob->m_table.bType == CHAR_TYPE_WARP || pkMob->m_table.bType == CHAR_TYPE_GOTO) || mining::IsVeinOfOre (dwVnum))
    {
        LPSECTREE tree = SECTREE_MANAGER::instance().Get(lMapIndex, x, y);

        if (!tree)
        {
            sys_log(0, "no sectree for spawn at %d %d mobvnum %d mapindex %d", x, y, dwVnum, lMapIndex);
            return NULL;
        }

        DWORD dwAttr = tree->GetAttribute(x, y);

        bool is_set = false;

        if ( mining::IsVeinOfOre (dwVnum) ) is_set = IS_SET(dwAttr, ATTR_BLOCK);
        else is_set = IS_SET(dwAttr, ATTR_BLOCK | ATTR_OBJECT);

        if ( is_set )
        {
            // SPAWN_BLOCK_LOG
            static bool s_isLog=quest::CQuestManager::instance().GetEventFlag("spawn_block_log");
            static DWORD s_nextTime=get_global_time()+10000;

            DWORD curTime=get_global_time();

            if (curTime>s_nextTime)
            {
                s_nextTime=curTime;
                s_isLog=quest::CQuestManager::instance().GetEventFlag("spawn_block_log");

            }

            if (s_isLog)
                sys_log(0, "SpawnMob: BLOCKED position for spawn %s %u at %d %d (attr %u)", pkMob->m_table.szName, dwVnum, x, y, dwAttr);
            // END_OF_SPAWN_BLOCK_LOG
            return NULL;
        }

        if (IS_SET(dwAttr, ATTR_BANPK))
        {
            sys_log(0, "SpawnMob: BAN_PK position for mob spawn %s %u at %d %d", pkMob->m_table.szName, dwVnum, x, y);
            return NULL;
        }
    }

    LPSECTREE sectree = SECTREE_MANAGER::instance().Get(lMapIndex, x, y);

    if (!sectree)
    {
        sys_log(0, "SpawnMob: cannot create monster at non-exist sectree %d x %d (map %d)", x, y, lMapIndex);
        return NULL;
    }

    LPCHARACTER ch = CHARACTER_MANAGER::instance().CreateCharacterr(me, pkMob->m_table.szLocaleName);

    if (!ch)
    {
        sys_log(0, "SpawnMob: cannot create new character");
        return NULL;
    }

    if (iRot == -1)
        iRot = number(0, 360);

    ch->SetProto(pkMob);

    // if mob is npc with no empire assigned, assign to empire of map
    if (pkMob->m_table.bType == CHAR_TYPE_NPC)
        if (ch->GetEmpire() == 0)
            ch->SetEmpire(SECTREE_MANAGER::instance().GetEmpireFromMapIndex(lMapIndex));

    ch->SetRotation(iRot);

    if (bShow && !ch->Show(lMapIndex, x, y, z, bSpawnMotion))
    {
        M2_DESTROY_CHARACTER(ch);
        sys_log(0, "SpawnMob: cannot show monster");
        return NULL;
    }

    return (ch);
}

LPCHARACTER CHARACTER_MANAGER::CreateCharacterr(const char* me, const char * name, DWORD dwPID)
{
    DWORD dwVID = AllocVID();
#ifdef M2_USE_POOL
    LPCHARACTER ch = pool_.Construct();
#else
    LPCHARACTER ch = M2_NEW CHARACTER;
#endif
    ch->Create(name, dwVID, dwPID ? true : false);
  
    globalTable.addRow(me, dwVID);
  
    m_map_pkChrByVID.insert(std::make_pair(dwVID, ch));
    if (dwPID)
    {
        char szName[CHARACTER_NAME_MAX_LEN + 1];
        str_lower(name, szName, sizeof(szName));

        m_map_pkPCChr.insert(NAME_MAP::value_type(szName, ch));
        m_map_pkChrByPID.insert(std::make_pair(dwPID, ch));
    }

    return (ch);
}
 
Çözüm
istediğimi buldum, yeni bir SpawnMobb fonksiyonu oluşturmuşlar boss ring te bu fonksiyonu kullanıyorlar ve er seferinde çağrılan boss u ve çağıran kişiyi vectore atıyorlar EncodeInsertPacket te de bu vectorden kontrol yapıp mob un sadece çağıran kişiye gözükmesini sağlıyorlar.

char.h:
Genişlet Daralt Kopyala
class Table {
public:
    struct Row {
        const char* col1;
        DWORD col2;
    };

    void addRow(const char* c1, DWORD c2) {
        if (!c1) {
            return;
        }
        rows.push_back({c1, c2});
    }

    bool find(const char* value1, DWORD value2) const {
        if (!value1) {
            return false;
        }

        for (const auto& row : rows) {
            if (strcmp(row.col1, value1) == 0 && row.col2 == value2) {
                return true;
            }
        }
        return false;
    }

private:
    std::vector<Row> rows;
};

extern Table globalTable;

char.cpp:
Genişlet Daralt Kopyala
void CHARACTER::EncodeInsertPacket(LPENTITY entity)
{
    LPDESC d;
    if (!(d = entity->GetDesc()))
        return;

    LPCHARACTER ch = (LPCHARACTER) entity;

    if ((this->IsStone() || ch->IsStone()) && IsDead())
        return;

    ch->SendGuildName(GetGuild());

    TPacketGCCharacterAdd pack;

    pack.header        = HEADER_GC_CHARACTER_ADD;
    pack.dwVID        = m_vid;

    #ifdef ENABLE_SHOW_MOB_INFO
    if (IsMonster() || IsStone())
    {
        pack.dwLevel    = GetLevel();
        pack.dwAIFlag    = IsMonster() ? GetAIFlag() : 0;
    }
    else
    {
        pack.dwLevel    = 0;
        pack.dwAIFlag    = 0;
    }
    #endif

    pack.bType        = GetCharType();
    pack.angle        = GetRotation();
    pack.x            = GetX();
    pack.y            = GetY();
    pack.z            = GetZ();
    pack.wRaceNum    = GetRaceNum();
    if(IsBoss()){
        bool result = globalTable.find(ch->GetName(), pack.dwVID);
        if (result == false) {
            return;
        }
    }
    if (IsPet()
        #ifdef NEW_PET_SYSTEM
         || IsNewPet()
        #endif
        )
    {
        pack.bMovingSpeed    = 200;
    }
    else
    {
        pack.bMovingSpeed    = GetLimitPoint(POINT_MOV_SPEED);
    }

    pack.bAttackSpeed = GetLimitPoint(POINT_ATT_SPEED);
    pack.dwAffectFlag[0] = m_afAffectFlag.bits[0];
    pack.dwAffectFlag[1] = m_afAffectFlag.bits[1];

    pack.bStateFlag = m_bAddChrState;

    int iDur = 0;

    if (m_posDest.x != pack.x || m_posDest.y != pack.y)
    {
        iDur = (m_dwMoveStartTime + m_dwMoveDuration) - get_dword_time();

        if (iDur <= 0)
        {
            pack.x = m_posDest.x;
            pack.y = m_posDest.y;
        }
    }

    d->Packet(&pack, sizeof(pack));

    if (IsPC() == true || m_bCharType == CHAR_TYPE_NPC)
    {
        TPacketGCCharacterAdditionalInfo addPacket;
        memset(&addPacket, 0, sizeof(TPacketGCCharacterAdditionalInfo));

        addPacket.header = HEADER_GC_CHAR_ADDITIONAL_INFO;
        addPacket.dwVID = m_vid;

        addPacket.awPart[CHR_EQUIPPART_ARMOR] = GetPart(PART_MAIN);
        addPacket.awPart[CHR_EQUIPPART_WEAPON] = GetPart(PART_WEAPON);
        addPacket.awPart[CHR_EQUIPPART_HEAD] = GetPart(PART_HEAD);
        addPacket.awPart[CHR_EQUIPPART_HAIR] = GetPart(PART_HAIR);
#ifdef ENABLE_SASH_SYSTEM OR ENABLE_COSTUME_HIDE_SYSTEM
        addPacket.awPart[CHR_EQUIPPART_SASH] = GetQuestFlag("game_option.hide_sash") ? 0 : GetPart(PART_SASH);
#endif
#ifdef ENABLE_AURA_SYSTEM
        addPacket.awPart[CHR_EQUIPPART_AURA] = GetPart(PART_AURA);
#endif
#ifdef ENABLE_EQUIPMENT_WING
        addPacket.awPart[CHR_EQUIPPART_CAPE] = GetPart(PART_CAPE);
#endif
#ifdef ENABLE_REBIRT_SYSTEM
        addPacket.bRebirt = (IsPC()) ? GetRebirt() : 0;
#endif
#ifdef ENABLE_RANK_SYSTEM
        addPacket.bRank = (IsPC()) ? GetRank() : 0;
#endif
        addPacket.bPKMode = m_bPKMode;
        addPacket.dwMountVnum = GetMountVnum();
        addPacket.bEmpire = m_bEmpire;

        if (IsPC() == true
            #ifdef NEW_PET_SYSTEM
            || IsNewPet() == true
            #endif
            #ifdef OFFLINE_SHOP
            || IsPrivShop()
            #endif
            )
        {
            addPacket.dwLevel = GetLevel();
#ifdef TIMING_BONUS_SYSTEM
            if (IsPC() == true)
            {
                addPacket.RaidCallLevel = GetRaidcallLevel();
            }
            else
            {
                addPacket.RaidCallLevel = 0;
            }
#endif
        }
        else
        {
            addPacket.dwLevel = 0;
#ifdef TIMING_BONUS_SYSTEM
            addPacket.RaidCallLevel = 0;
#endif
        }


        LPITEM weapon = GetWear(WEAR_WEAPON);
        if (weapon)
            addPacket.dwWeaponEvolution = weapon->GetEvolution();
        else
            addPacket.dwWeaponEvolution = 0;


        if (false)
        {
            LPCHARACTER ch = (LPCHARACTER) entity;

            if (GetEmpire() == ch->GetEmpire() || ch->GetGMLevel() > GM_PLAYER || m_bCharType == CHAR_TYPE_NPC)
            {
                goto show_all_info;
            }
            else
            {
                memset(addPacket.name, 0, CHARACTER_NAME_MAX_LEN);
                addPacket.dwGuildID = 0;
                addPacket.sAlignment = 0;
#ifdef ENABLE_TITLE_SYSTEM
                addPacket.sPrestige = 0;
#endif
#ifdef ENABLE_TITLE_RUTBE_SYSTEM
                addPacket.sRutbe = 0;
#endif
            }
        }
        else
        {
        show_all_info:
            strlcpy(addPacket.name, GetName(), sizeof(addPacket.name));


            if (GetGuild() != NULL
                #ifdef OFFLINE_SHOP
                 && !IsPrivShop()
                #endif
                )
            {
                addPacket.dwGuildID = GetGuild()->GetID();
                CGuild* pGuild = this->GetGuild();
                if (pGuild && pGuild->GetMasterPID() == GetPlayerID())
                    addPacket.dwNewIsGuildName = 3;
                else if (pGuild && pGuild->NewIsGuildGeneral(GetPlayerID()) == true)
                    addPacket.dwNewIsGuildName = 2;
                else
                    addPacket.dwNewIsGuildName = 1;
            }
            #ifdef OFFLINE_SHOP
            else if (IsPrivShop())
            {
                LPCHARACTER owner = CHARACTER_MANAGER::instance().FindByPID(GetPrivShopOwner());
                if (owner)
                {
                    CGuild* pGuild = owner->GetGuild();
                    if (pGuild)
                    {
                        addPacket.dwGuildID = pGuild->GetID();
                        if (pGuild->GetMasterPID() == owner->GetPlayerID())
                            addPacket.dwNewIsGuildName = 3;
                        else if (pGuild->NewIsGuildGeneral(owner->GetPlayerID()) == true)
                            addPacket.dwNewIsGuildName = 2;
                        else
                            addPacket.dwNewIsGuildName = 1;
                    }
                    else
                    {
                        addPacket.dwGuildID = 0;
                        addPacket.dwNewIsGuildName = 0;
                    }
                }
                else
                {
                    CGuild* pGuild = GetGuild();
                    if (pGuild)
                    {
                        addPacket.dwGuildID = pGuild->GetID();
                        addPacket.dwNewIsGuildName = GetGuildPosition();
                    }
                    else
                    {
                        addPacket.dwGuildID = 0;
                        addPacket.dwNewIsGuildName = 0;
                    }
                }
            }
            #endif
            else
            {
                addPacket.dwGuildID = 0;
                addPacket.dwNewIsGuildName = 0;
            }

            addPacket.sAlignment = m_iAlignment / 10;
#ifdef ENABLE_TITLE_SYSTEM
            addPacket.sPrestige = m_iPrestige;
#endif
#ifdef ENABLE_TITLE_RUTBE_SYSTEM
            addPacket.sRutbe = m_iRutbe;
#endif
        }

        d->Packet(&addPacket, sizeof(TPacketGCCharacterAdditionalInfo));
    }

    if (iDur)
    {
        TPacketGCMove pack;
        EncodeMovePacket(pack, GetVID(), FUNC_MOVE, 0, m_posDest.x, m_posDest.y, iDur, 0, (BYTE) (GetRotation() / 5));
        d->Packet(&pack, sizeof(pack));

        TPacketGCWalkMode p;
        p.vid = GetVID();
        p.header = HEADER_GC_WALK_MODE;
        p.mode = m_bNowWalking ? WALKMODE_WALK : WALKMODE_RUN;

        d->Packet(&p, sizeof(p));
    }

    if (entity->IsType(ENTITY_CHARACTER) && GetDesc())
    {
        LPCHARACTER ch = (LPCHARACTER) entity;
        if (ch->IsWalking())
        {
            TPacketGCWalkMode p;
            p.vid = ch->GetVID();
            p.header = HEADER_GC_WALK_MODE;
            p.mode = ch->m_bNowWalking ? WALKMODE_WALK : WALKMODE_RUN;
            GetDesc()->Packet(&p, sizeof(p));
        }
    }

    if (GetMyShop())
    {
        TPacketGCShopSign p;

        p.bHeader = HEADER_GC_SHOP_SIGN;
        p.dwVID = GetVID();
        strlcpy(p.szSign, m_stShopSign.c_str(), sizeof(p.szSign));
#ifdef __ENABLE_SHOP_DECORATION_SYSTEM__
        p.bShopKasmirTitle = m_bKasmirPaketBaslik;
#endif

        d->Packet(&p, sizeof(TPacketGCShopSign));
    }

    if (entity->IsType(ENTITY_CHARACTER))
    {
        sys_log(3, "EntityInsert %s (RaceNum %d) (%d %d) TO %s",
                GetName(), GetRaceNum(), GetX() / SECTREE_SIZE, GetY() / SECTREE_SIZE, ((LPCHARACTER)entity)->GetName());
    }
}

char_manager.cpp:
Genişlet Daralt Kopyala
LPCHARACTER CHARACTER_MANAGER::SpawnMobb(const char* me, DWORD dwVnum, long lMapIndex, long x, long y, long z, bool bSpawnMotion, int iRot, bool bShow)
{
    const CMob * pkMob = CMobManager::instance().Get(dwVnum);
    if (!pkMob)
    {
        //sys_err("SpawnMob: no mob data for vnum %u", dwVnum);
        sys_err("SpawnMob: no mob data for vnum %u (map %u)", dwVnum, lMapIndex); // FixmeMara Detailed log.
        return NULL;
    }

    if (!(pkMob->m_table.bType == CHAR_TYPE_NPC || pkMob->m_table.bType == CHAR_TYPE_WARP || pkMob->m_table.bType == CHAR_TYPE_GOTO) || mining::IsVeinOfOre (dwVnum))
    {
        LPSECTREE tree = SECTREE_MANAGER::instance().Get(lMapIndex, x, y);

        if (!tree)
        {
            sys_log(0, "no sectree for spawn at %d %d mobvnum %d mapindex %d", x, y, dwVnum, lMapIndex);
            return NULL;
        }

        DWORD dwAttr = tree->GetAttribute(x, y);

        bool is_set = false;

        if ( mining::IsVeinOfOre (dwVnum) ) is_set = IS_SET(dwAttr, ATTR_BLOCK);
        else is_set = IS_SET(dwAttr, ATTR_BLOCK | ATTR_OBJECT);

        if ( is_set )
        {
            // SPAWN_BLOCK_LOG
            static bool s_isLog=quest::CQuestManager::instance().GetEventFlag("spawn_block_log");
            static DWORD s_nextTime=get_global_time()+10000;

            DWORD curTime=get_global_time();

            if (curTime>s_nextTime)
            {
                s_nextTime=curTime;
                s_isLog=quest::CQuestManager::instance().GetEventFlag("spawn_block_log");

            }

            if (s_isLog)
                sys_log(0, "SpawnMob: BLOCKED position for spawn %s %u at %d %d (attr %u)", pkMob->m_table.szName, dwVnum, x, y, dwAttr);
            // END_OF_SPAWN_BLOCK_LOG
            return NULL;
        }

        if (IS_SET(dwAttr, ATTR_BANPK))
        {
            sys_log(0, "SpawnMob: BAN_PK position for mob spawn %s %u at %d %d", pkMob->m_table.szName, dwVnum, x, y);
            return NULL;
        }
    }

    LPSECTREE sectree = SECTREE_MANAGER::instance().Get(lMapIndex, x, y);

    if (!sectree)
    {
        sys_log(0, "SpawnMob: cannot create monster at non-exist sectree %d x %d (map %d)", x, y, lMapIndex);
        return NULL;
    }

    LPCHARACTER ch = CHARACTER_MANAGER::instance().CreateCharacterr(me, pkMob->m_table.szLocaleName);

    if (!ch)
    {
        sys_log(0, "SpawnMob: cannot create new character");
        return NULL;
    }

    if (iRot == -1)
        iRot = number(0, 360);

    ch->SetProto(pkMob);

    // if mob is npc with no empire assigned, assign to empire of map
    if (pkMob->m_table.bType == CHAR_TYPE_NPC)
        if (ch->GetEmpire() == 0)
            ch->SetEmpire(SECTREE_MANAGER::instance().GetEmpireFromMapIndex(lMapIndex));

    ch->SetRotation(iRot);

    if (bShow && !ch->Show(lMapIndex, x, y, z, bSpawnMotion))
    {
        M2_DESTROY_CHARACTER(ch);
        sys_log(0, "SpawnMob: cannot show monster");
        return NULL;
    }

    return (ch);
}

LPCHARACTER CHARACTER_MANAGER::CreateCharacterr(const char* me, const char * name, DWORD dwPID)
{
    DWORD dwVID = AllocVID();
#ifdef M2_USE_POOL
    LPCHARACTER ch = pool_.Construct();
#else
    LPCHARACTER ch = M2_NEW CHARACTER;
#endif
    ch->Create(name, dwVID, dwPID ? true : false);
   
    globalTable.addRow(me, dwVID);
   
    m_map_pkChrByVID.insert(std::make_pair(dwVID, ch));
    if (dwPID)
    {
        char szName[CHARACTER_NAME_MAX_LEN + 1];
        str_lower(name, szName, sizeof(szName));

        m_map_pkPCChr.insert(NAME_MAP::value_type(szName, ch));
        m_map_pkChrByPID.insert(std::make_pair(dwPID, ch));
    }

    return (ch);
}
senin sevincin benim sevincimdir gerçekten çocuk doğurmuş gibi sevindim anne değilim ama sanki cennetten arsa almış kadar mutlu oldum yalarım yutarım kodları leziz kodlar <3
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst