Düello "3-2-1 GO" Geri Sayım Sistemi

Aethre

www.pvpers.gg
Katılım
19 Haz 2024
Konular
389
Mesajlar
486
Beğeniler
873
GG Coin
15,703
Ticaret Değeri - 0%
0   0   0
Discord
pvpers.gg
Metin2 PvP serverınızda düello için 3-2-1 geri sayımı ekleyebilirsiniz.



service.h
Kod:
#define ENABLE_3_2_1_GO

pvp.cpp
Kod:
# Arat

void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
 
# Üstüne Ekle
 
#ifdef ENABLE_3_2_1_GO
EVENTINFO(start_duel_efect_info)
{
    LPCHARACTER ch1;
    LPCHARACTER ch2;
    CPVP * pkPVP;
    BYTE state;

    start_duel_efect_info()
    : ch1( NULL )
    ,ch2( NULL )
    ,pkPVP( NULL )
    ,state( 0 )
    {
    }
};

EVENTFUNC(start_duel_efect)
{
    start_duel_efect_info * info = dynamic_cast<start_duel_efect_info *>(event->info);

    if ((info == NULL) || (info->ch1 == NULL) || (info->ch2 == NULL) || (info->pkPVP == NULL)) return 0;

    switch (info->state)
    {
        case 0:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 1:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 2:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 3:
    {
        info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse");
        info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse");
        if (info->pkPVP->Agree(info->ch1->GetPlayerID()))
        {
            info->ch2->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch1->GetName());
            info->ch1->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch2->GetName());
        }
        return 0;
        break;
    }
}
    return 0;
}
#endif

# Arat

void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
 
# Değiştir
 
#ifdef ENABLE_3_2_1_GO
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    if (pkChr->IsDead() || pkVictim->IsDead() || pkChr->FindAffect(AFFECT_PVP_START))
        return;

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

    CPVP * pkPVP;

    if (pkPVP = Find(kPVP.m_dwCRC))
    {
        start_duel_efect_info * info = AllocEventInfo<start_duel_efect_info>();
        info->ch1 = pkChr;
        info->ch2 = pkVictim;
        info->pkPVP = pkPVP;
        info->state = 0;
        pkChr->AddAffect(AFFECT_PVP_START, APPLY_NONE, 0, 0, 5, 0, false);
        event_create(start_duel_efect, info, 0);
        return;
    }

    pkPVP = M2_NEW CPVP(kPVP);

    pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
    pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

    m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

    m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
    m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

    pkPVP->Packet();

    char msg[CHAT_MAX_LEN + 1];
    snprintf(msg, sizeof(msg), "Ai fost provocat la duel de: %s.", pkChr->GetName()); //e el

    pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
    pkChr->ChatPacket(CHAT_TYPE_INFO, "L-ai provocat la duel pe: %s.", pkVictim->GetName()); //is eu

    // NOTIFY_PVP_MESSAGE
    LPDESC pkVictimDesc = pkVictim->GetDesc();
    if (pkVictimDesc)
    {
        TPacketGCWhisper pack;

        int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);

        pack.bHeader = HEADER_GC_WHISPER;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        pack.bType = WHISPER_TYPE_SYSTEM;
        strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));

        TEMP_BUFFER buf;

        buf.write(&pack, sizeof(TPacketGCWhisper));
        buf.write(msg, len);

        pkVictimDesc->Packet(buf.read_peek(), buf.size());
    }
    // END_OF_NOTIFY_PVP_MESSAGE
}
#else
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    if (pkChr->IsDead() || pkVictim->IsDead())
        return;

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

    CPVP * pkPVP;

    if ((pkPVP = Find(kPVP.m_dwCRC)))
    {
        // ???oC? ?o ?O?c¬c¬e ??!¤I c©I??!
        if (pkPVP->Agree(pkChr->GetPlayerID()))
        {
            pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkChr->GetName());
            pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkVictim->GetName());
        }
        return;
    }

    pkPVP = M2_NEW CPVP(kPVP);

    pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
    pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

    m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

    m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
    m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

    pkPVP->Packet();

    char msg[CHAT_MAX_LEN + 1];
    snprintf(msg, sizeof(msg), LC_TEXT("%scYO?? cYe!Aac©??!í?!í C©¬c©?cY?cY?. c©A©©!iC?!¤Ac¬e cYe!AaYi??Cc¬| C????a."), pkChr->GetName());

    pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
    pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s?c§!AO cYe!Aac©??!í?!í C©¬c©?cY?cY?."), pkVictim->GetName());

    // NOTIFY_PVP_MESSAGE
    LPDESC pkVictimDesc = pkVictim->GetDesc();
    if (pkVictimDesc)
    {
        TPacketGCWhisper pack;

        int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);

        pack.bHeader = HEADER_GC_WHISPER;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        pack.bType = WHISPER_TYPE_SYSTEM;
        strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));

        TEMP_BUFFER buf;

        buf.write(&pack, sizeof(TPacketGCWhisper));
        buf.write(msg, len);

        pkVictimDesc->Packet(buf.read_peek(), buf.size());
    }
    // END_OF_NOTIFY_PVP_MESSAGE
}
#endif

# Arat

bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)

# Değiştir
 
#ifdef ENABLE_3_2_1_GO
bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return false;

    bool found = false;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID == dwKillerPID)
        {
            if (pkPVP->IsFight())
            {
                pkPVP->SetLastFightTime();
                pkPVP->Win(dwKillerPID);
                found = true;
                break;
            }
            else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000)
            {
                found = true;
                break;
            }
        }
    }

    LPCHARACTER pkChrW = CHARACTER_MANAGER::instance().FindByPID(dwKillerPID);
    pkChrW->SpecificEffectPacket("d:/ymir work/effect/pvp/win.mse");

    return found;
}
#else
bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return false;

    bool found = false;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID == dwKillerPID)
        {
            if (pkPVP->IsFight())
            {
                pkPVP->SetLastFightTime();
                pkPVP->Win(dwKillerPID);
                found = true;
                break;
            }
            else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000)
            {
                found = true;
                break;
            }
        }
    }

    return found;
}
#endif

affect.h
Kod:
# Arat

AFFECT_DRAGON_SOUL_DECK_1 = 542,

# Altına Ekle

#ifdef ENABLE_3_2_1_GO
    AFFECT_PVP_START = 543,
    AFFECT_PVP_WIN = 544,
#endif

# Arat

AFF_BITS_MAX

# Üstüne Ekle

#ifdef ENABLE_3_2_1_GO
    AFF_PVP_START,
    AFF_PVP_WIN,
#endif

Aşağıdaki efekt dosyası, tercihe bağlı olarak bir klasör içine eklenip kapatıldıktan sonra pack dosyasına dahil edilebilir. Son olarak, indexe eklenmesi yeterlidir.
Alternatif olarak, mevcut pack içine doğrudan eklenip kapatılarak da kullanılabilir.

Efekt dosyası:
Gizlenmiş içeriği görüntüleyebilmek için Giriş Yap ya da Kayıt Ol
Bu işlem, 15 saniyeden az sürer.
 
Metin2 PvP serverınızda düello için 3-2-1 geri sayımı ekleyebilirsiniz.



service.h
Kod:
#define ENABLE_3_2_1_GO

pvp.cpp
Kod:
# Arat

void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
 
# Üstüne Ekle
 
#ifdef ENABLE_3_2_1_GO
EVENTINFO(start_duel_efect_info)
{
    LPCHARACTER ch1;
    LPCHARACTER ch2;
    CPVP * pkPVP;
    BYTE state;

    start_duel_efect_info()
    : ch1( NULL )
    ,ch2( NULL )
    ,pkPVP( NULL )
    ,state( 0 )
    {
    }
};

EVENTFUNC(start_duel_efect)
{
    start_duel_efect_info * info = dynamic_cast<start_duel_efect_info *>(event->info);

    if ((info == NULL) || (info->ch1 == NULL) || (info->ch2 == NULL) || (info->pkPVP == NULL)) return 0;

    switch (info->state)
    {
        case 0:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 1:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 2:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 3:
    {
        info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse");
        info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse");
        if (info->pkPVP->Agree(info->ch1->GetPlayerID()))
        {
            info->ch2->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch1->GetName());
            info->ch1->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch2->GetName());
        }
        return 0;
        break;
    }
}
    return 0;
}
#endif

# Arat

void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
 
# Değiştir
 
#ifdef ENABLE_3_2_1_GO
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    if (pkChr->IsDead() || pkVictim->IsDead() || pkChr->FindAffect(AFFECT_PVP_START))
        return;

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

    CPVP * pkPVP;

    if (pkPVP = Find(kPVP.m_dwCRC))
    {
        start_duel_efect_info * info = AllocEventInfo<start_duel_efect_info>();
        info->ch1 = pkChr;
        info->ch2 = pkVictim;
        info->pkPVP = pkPVP;
        info->state = 0;
        pkChr->AddAffect(AFFECT_PVP_START, APPLY_NONE, 0, 0, 5, 0, false);
        event_create(start_duel_efect, info, 0);
        return;
    }

    pkPVP = M2_NEW CPVP(kPVP);

    pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
    pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

    m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

    m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
    m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

    pkPVP->Packet();

    char msg[CHAT_MAX_LEN + 1];
    snprintf(msg, sizeof(msg), "Ai fost provocat la duel de: %s.", pkChr->GetName()); //e el

    pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
    pkChr->ChatPacket(CHAT_TYPE_INFO, "L-ai provocat la duel pe: %s.", pkVictim->GetName()); //is eu

    // NOTIFY_PVP_MESSAGE
    LPDESC pkVictimDesc = pkVictim->GetDesc();
    if (pkVictimDesc)
    {
        TPacketGCWhisper pack;

        int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);

        pack.bHeader = HEADER_GC_WHISPER;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        pack.bType = WHISPER_TYPE_SYSTEM;
        strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));

        TEMP_BUFFER buf;

        buf.write(&pack, sizeof(TPacketGCWhisper));
        buf.write(msg, len);

        pkVictimDesc->Packet(buf.read_peek(), buf.size());
    }
    // END_OF_NOTIFY_PVP_MESSAGE
}
#else
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    if (pkChr->IsDead() || pkVictim->IsDead())
        return;

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

    CPVP * pkPVP;

    if ((pkPVP = Find(kPVP.m_dwCRC)))
    {
        // ???oC? ?o ?O?c¬c¬e ??!¤I c©I??!
        if (pkPVP->Agree(pkChr->GetPlayerID()))
        {
            pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkChr->GetName());
            pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkVictim->GetName());
        }
        return;
    }

    pkPVP = M2_NEW CPVP(kPVP);

    pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
    pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

    m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

    m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
    m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

    pkPVP->Packet();

    char msg[CHAT_MAX_LEN + 1];
    snprintf(msg, sizeof(msg), LC_TEXT("%scYO?? cYe!Aac©??!í?!í C©¬c©?cY?cY?. c©A©©!iC?!¤Ac¬e cYe!AaYi??Cc¬| C????a."), pkChr->GetName());

    pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
    pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s?c§!AO cYe!Aac©??!í?!í C©¬c©?cY?cY?."), pkVictim->GetName());

    // NOTIFY_PVP_MESSAGE
    LPDESC pkVictimDesc = pkVictim->GetDesc();
    if (pkVictimDesc)
    {
        TPacketGCWhisper pack;

        int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);

        pack.bHeader = HEADER_GC_WHISPER;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        pack.bType = WHISPER_TYPE_SYSTEM;
        strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));

        TEMP_BUFFER buf;

        buf.write(&pack, sizeof(TPacketGCWhisper));
        buf.write(msg, len);

        pkVictimDesc->Packet(buf.read_peek(), buf.size());
    }
    // END_OF_NOTIFY_PVP_MESSAGE
}
#endif

# Arat

bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)

# Değiştir
 
#ifdef ENABLE_3_2_1_GO
bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return false;

    bool found = false;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID == dwKillerPID)
        {
            if (pkPVP->IsFight())
            {
                pkPVP->SetLastFightTime();
                pkPVP->Win(dwKillerPID);
                found = true;
                break;
            }
            else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000)
            {
                found = true;
                break;
            }
        }
    }

    LPCHARACTER pkChrW = CHARACTER_MANAGER::instance().FindByPID(dwKillerPID);
    pkChrW->SpecificEffectPacket("d:/ymir work/effect/pvp/win.mse");

    return found;
}
#else
bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return false;

    bool found = false;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID == dwKillerPID)
        {
            if (pkPVP->IsFight())
            {
                pkPVP->SetLastFightTime();
                pkPVP->Win(dwKillerPID);
                found = true;
                break;
            }
            else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000)
            {
                found = true;
                break;
            }
        }
    }

    return found;
}
#endif

affect.h
Kod:
# Arat

AFFECT_DRAGON_SOUL_DECK_1 = 542,

# Altına Ekle

#ifdef ENABLE_3_2_1_GO
    AFFECT_PVP_START = 543,
    AFFECT_PVP_WIN = 544,
#endif

# Arat

AFF_BITS_MAX

# Üstüne Ekle

#ifdef ENABLE_3_2_1_GO
    AFF_PVP_START,
    AFF_PVP_WIN,
#endif

Aşağıdaki efekt dosyası, tercihe bağlı olarak bir klasör içine eklenip kapatıldıktan sonra pack dosyasına dahil edilebilir. Son olarak, indexe eklenmesi yeterlidir.
Alternatif olarak, mevcut pack içine doğrudan eklenip kapatılarak da kullanılabilir.

Efekt dosyası:
<b>[Gizli içerik]</b>

Teşekkürler
 
Metin2 PvP serverınızda düello için 3-2-1 geri sayımı ekleyebilirsiniz.



service.h
Kod:
#define ENABLE_3_2_1_GO

pvp.cpp
Kod:
# Arat

void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
 
# Üstüne Ekle
 
#ifdef ENABLE_3_2_1_GO
EVENTINFO(start_duel_efect_info)
{
    LPCHARACTER ch1;
    LPCHARACTER ch2;
    CPVP * pkPVP;
    BYTE state;

    start_duel_efect_info()
    : ch1( NULL )
    ,ch2( NULL )
    ,pkPVP( NULL )
    ,state( 0 )
    {
    }
};

EVENTFUNC(start_duel_efect)
{
    start_duel_efect_info * info = dynamic_cast<start_duel_efect_info *>(event->info);

    if ((info == NULL) || (info->ch1 == NULL) || (info->ch2 == NULL) || (info->pkPVP == NULL)) return 0;

    switch (info->state)
    {
        case 0:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 1:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 2:
        {
            info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse");
            info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 3:
    {
        info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse");
        info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse");
        if (info->pkPVP->Agree(info->ch1->GetPlayerID()))
        {
            info->ch2->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch1->GetName());
            info->ch1->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch2->GetName());
        }
        return 0;
        break;
    }
}
    return 0;
}
#endif

# Arat

void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
 
# Değiştir
 
#ifdef ENABLE_3_2_1_GO
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    if (pkChr->IsDead() || pkVictim->IsDead() || pkChr->FindAffect(AFFECT_PVP_START))
        return;

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

    CPVP * pkPVP;

    if (pkPVP = Find(kPVP.m_dwCRC))
    {
        start_duel_efect_info * info = AllocEventInfo<start_duel_efect_info>();
        info->ch1 = pkChr;
        info->ch2 = pkVictim;
        info->pkPVP = pkPVP;
        info->state = 0;
        pkChr->AddAffect(AFFECT_PVP_START, APPLY_NONE, 0, 0, 5, 0, false);
        event_create(start_duel_efect, info, 0);
        return;
    }

    pkPVP = M2_NEW CPVP(kPVP);

    pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
    pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

    m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

    m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
    m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

    pkPVP->Packet();

    char msg[CHAT_MAX_LEN + 1];
    snprintf(msg, sizeof(msg), "Ai fost provocat la duel de: %s.", pkChr->GetName()); //e el

    pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
    pkChr->ChatPacket(CHAT_TYPE_INFO, "L-ai provocat la duel pe: %s.", pkVictim->GetName()); //is eu

    // NOTIFY_PVP_MESSAGE
    LPDESC pkVictimDesc = pkVictim->GetDesc();
    if (pkVictimDesc)
    {
        TPacketGCWhisper pack;

        int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);

        pack.bHeader = HEADER_GC_WHISPER;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        pack.bType = WHISPER_TYPE_SYSTEM;
        strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));

        TEMP_BUFFER buf;

        buf.write(&pack, sizeof(TPacketGCWhisper));
        buf.write(msg, len);

        pkVictimDesc->Packet(buf.read_peek(), buf.size());
    }
    // END_OF_NOTIFY_PVP_MESSAGE
}
#else
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    if (pkChr->IsDead() || pkVictim->IsDead())
        return;

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

    CPVP * pkPVP;

    if ((pkPVP = Find(kPVP.m_dwCRC)))
    {
        // ???oC? ?o ?O?c¬c¬e ??!¤I c©I??!
        if (pkPVP->Agree(pkChr->GetPlayerID()))
        {
            pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkChr->GetName());
            pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkVictim->GetName());
        }
        return;
    }

    pkPVP = M2_NEW CPVP(kPVP);

    pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
    pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

    m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

    m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
    m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

    pkPVP->Packet();

    char msg[CHAT_MAX_LEN + 1];
    snprintf(msg, sizeof(msg), LC_TEXT("%scYO?? cYe!Aac©??!í?!í C©¬c©?cY?cY?. c©A©©!iC?!¤Ac¬e cYe!AaYi??Cc¬| C????a."), pkChr->GetName());

    pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
    pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s?c§!AO cYe!Aac©??!í?!í C©¬c©?cY?cY?."), pkVictim->GetName());

    // NOTIFY_PVP_MESSAGE
    LPDESC pkVictimDesc = pkVictim->GetDesc();
    if (pkVictimDesc)
    {
        TPacketGCWhisper pack;

        int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);

        pack.bHeader = HEADER_GC_WHISPER;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        pack.bType = WHISPER_TYPE_SYSTEM;
        strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));

        TEMP_BUFFER buf;

        buf.write(&pack, sizeof(TPacketGCWhisper));
        buf.write(msg, len);

        pkVictimDesc->Packet(buf.read_peek(), buf.size());
    }
    // END_OF_NOTIFY_PVP_MESSAGE
}
#endif

# Arat

bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)

# Değiştir
 
#ifdef ENABLE_3_2_1_GO
bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return false;

    bool found = false;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID == dwKillerPID)
        {
            if (pkPVP->IsFight())
            {
                pkPVP->SetLastFightTime();
                pkPVP->Win(dwKillerPID);
                found = true;
                break;
            }
            else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000)
            {
                found = true;
                break;
            }
        }
    }

    LPCHARACTER pkChrW = CHARACTER_MANAGER::instance().FindByPID(dwKillerPID);
    pkChrW->SpecificEffectPacket("d:/ymir work/effect/pvp/win.mse");

    return found;
}
#else
bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return false;

    bool found = false;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID == dwKillerPID)
        {
            if (pkPVP->IsFight())
            {
                pkPVP->SetLastFightTime();
                pkPVP->Win(dwKillerPID);
                found = true;
                break;
            }
            else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000)
            {
                found = true;
                break;
            }
        }
    }

reso trovato;
}
#endif[/CODICE]

[B]affect.h[/B]
[CODICE]# Ricerca

AFFECT_DRAGON_SOUL_DECK_1 = 542,

# Aggiungi in fondo

#ifdef ENABLE_3_2_1_GO
    AFFECT_PVP_START = 543,
    AFFECT_PVP_WIN = 544,
#endif

# Cerca

AFF_BITS_MAX

# Aggiungi in cima

#ifdef ENABLE_3_2_1_GO
    AFF_PVP_START,
    AFF_PVP_WIN,
#endif[/CODICE]

Il seguente file dell'effetto può essere facoltativamente aggiunto a una cartella e incluso nel file del pacchetto dopo che è stato chiuso. Infine, è sufficiente aggiungerlo all'indice.
In alternativa, può essere utilizzato aggiungendolo direttamente al pacchetto esistente e spegnendolo.

[B]File degli effetti:[/B]
<b>[Contenuto nascosto]</b>
[/QUOTE]
ksNat

Grazie!
 
Geri
Üst Alt