Yardım x süresi geçince oyuncuya pm gönderme

  • Konuyu açan Konuyu açan Tengrist
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 3
  • Gösterim Gösterim 74
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Tengrist

Yardımsever Üye
Yardımsever Üye
MT Üye
Mesaj
941
Çözümler
36
Beğeni
663
Puan
909
Ticaret Puanı
0
dungeon info cpp dosyam:
Genişlet Daralt Kopyala
#include "../../common/service.h"
#ifdef ENABLE_DUNGEON_INFO_SYSTEM
#include "stdafx.h"
#include "constants.h"
#include "utils.h"
#include "desc.h"
#include "char.h"
#include "db.h"
#include "config.h"
#include "dungeon_info.h"
#include "affect.h"
#include "item.h"
#include "questmanager.h"
#include <boost/algorithm/string.hpp>

struct DungeonInfoTable {
    int type; // Dungeon type [ 0 (Unkown), 1 (Private), 2 (Global) ] Bizdeki dungeonlar bireysel olduğu için 1 kullanıcaksın 1. veriyi
    int organization; // Dungeon organization [ 0 (None), 1 (Party), 2 (Guild) ] Bizdeki dungeonlar bireysel olduğu için 0 kullanıcaksın 2. veriyi
    int min_level;  // Dungeon level limit [ min_level ] Burada zindanın alt level limitini yazıcaksın 3. veriye
    int party_members;  // Dungeon party members [ max_members (0) Unlimited ] Burada dungeona grubunla girebilecek max kişi sayısını yazıcaksın. 4. veriye
    int map_index;  // Dungeon map index // Dungeonun map indexini yazıcaksın 5. veriye
    char map_name[64]; // Map Name // Zindanın ismini yazıcaksın 6. veriye
    char map_entrance[64]; // Map Name Entrance // Zindanın giriş haritasının ismini yazıcaksın 7. veriye
    int map_coords[2]; // Map Coords (X,Y) // ışınlan tuşuna basınca hangi koordinata ışınlansın onu yazıcakın 8. veriye
    int cooldown;  // [ 0 (None) ] | Ex: 60 * 60 * 3 = 3 hours // Soğuma süresini yazıcaksın 9. veriye saniye cinsi
    int duration;  // [ 0 (None) ] | Ex: 60 * 60 * 3 = 3 hours // Dungeonda en fazla ne kadar durabilir onun süresini yazıcaksın 10. veriye saniye cinsi
    int max_level; // Dungeon level min [ max_level ] //  Burada zindanın üst level limitini yazıcaksın 11. veriye
    int strength_bonus;  // Strength bonus id against dungeon monsters // Hangi bonus bu dungeon canavarlarına karşı güçlü bunun lenght.h 'taki karşılığı 12. veriye
    int resistance_bonus; // Resistance bonus id against dungeon monsters  // Hangi bonus bu dungeon canavarlarına karşı dayanıklı bunun lenght.h 'taki karşılığı 13. veriye
    int item_vnum;  // Required dungeon item // Dungeona girmek için gerekli eşyayı yazacaksın 14. veriye
    int boss_vnum; // Boss Vnum // dungeonun bossu hangisiyse vnumunu yazıcaksın 15. veriye
};

DungeonInfoTable dungeonTable[8] = { // Buradaki rakamı kaç tane dungeon girersen o sayıyı yazıcaksın.

    {1, 0, 40, 8 , 66, "Şeytan Kulesi", "Hwang Tapınağı" , {5906, 1108}, 0, 3600 , 105, 22, 89, 0, 1093}, // Dungeon 0
    {1, 0, 55, 8 , 364, "Ork Zindanı", "Seungryong Vadisi" , {3352, 7549}, 900, 3600 , 75, 19, 88, 828, 694}, // Dungeon 1
    {1, 0, 55, 8 , 362, "Örümcek Barones", "Örümcek Zindanı 3.Kat" , {692, 6110}, 900, 3600 , 75, 116, 38, 30325, 2092}, // Dungeon 2
    {1, 0, 75, 8 , 79, "Mavi Ejderha", "Sürgün Zindanı 2.Kat" , {1817, 12207}, 900, 3600 , 105, 105, 36, 30179, 2493}, // Dungeon 3
    {1, 0, 75, 8 , 216, "Şeytan Katakombu", "Hwang Tapınağı" , {5919, 996}, 900, 3600 , 105, 22, 89, 30319, 2598}, // Dungeon 4
    {1, 0, 90, 8 , 351, "Razadör", "Doyyumhwan" , {5998, 7075}, 900, 3600 , 105, 100, 35, 817, 6091}, // Dungeon 5
    {1, 0, 90, 8 , 352, "Nemere", "Sohan Dağı" , {4324, 1648}, 900, 3600 , 105, 101, 87, 818, 6191}, // Dungeon 6
    {1, 0, 75, 8 , 55, "Paskalya Mağarası", "Kızıl Orman" , {11171, 535}, 0, 2400 , 105, 119, 120, 30787, 4103}, // Dungeon 6

};

DungeonInfo::DungeonInfo()
{
}

DungeonInfo::~DungeonInfo()
{
}

bool DungeonInfo::IsValidTeleportLocation(int x, int y) const
{
    for (const auto& entry : dungeonTable)
    {
        if (entry.map_coords[0] == x && entry.map_coords[1] == y)
            return true;
    }
    return false;
}

void DungeonInfo::Update(LPCHARACTER ch)
{
    if (ch == NULL)
        return;

    if (!ch->IsPC())
        return;

    if (sizeof(dungeonTable) == 0)
        return;

    ch->ChatPacket(CHAT_TYPE_COMMAND, "CleanDungeonInfo");
    int size = *(&dungeonTable + 1) - dungeonTable;
    for (int i = 0; i <= size - 1; i++)
    {
        std::string mapName(dungeonTable[i].map_name);
        boost::algorithm::replace_all(mapName, " ", "_");

        std::string mapEntrance(dungeonTable[i].map_entrance);
        boost::algorithm::replace_all(mapEntrance, " ", "_");

        ch->ChatPacket(CHAT_TYPE_COMMAND, "UpdateDungeonInfo %d %d %d %d %d %s %s %d %d %d %d %d %d %d %d %d %d %d %d",
            dungeonTable[i].type,
            dungeonTable[i].organization,
            dungeonTable[i].min_level,
            dungeonTable[i].party_members,
            dungeonTable[i].map_index,
            mapName.c_str(),
            mapEntrance.c_str(),
            dungeonTable[i].map_coords[0],
            dungeonTable[i].map_coords[1],
            dungeonTable[i].cooldown,
            dungeonTable[i].duration,
            dungeonTable[i].max_level,
            dungeonTable[i].strength_bonus,
            dungeonTable[i].resistance_bonus,
            dungeonTable[i].item_vnum,
            dungeonTable[i].boss_vnum
        );
    }
}
#endif

bu dosyaya server switch bot sistemindeki gibi zindan süresi bitince pm göndertmek istiyorum,
zindanların süresini int cooldown değişkeni belirliyor bu zaman süresi geçtiğinde pm atması da sanırım bu kodla oluyor:
switch bot pm:
Genişlet Daralt Kopyala
            LPDESC desc = pkOwner->GetDesc();
            if (desc)
            {
                char buf[255];
                int len = snprintf(buf, sizeof(buf), LC_TEXT("Bonuschange of %s (Slot: %d) successfully finished."), pkItem->GetName(), bSlot + 1);

                TPacketGCWhisper pack;
                pack.bHeader = HEADER_GC_WHISPER;
                pack.bType = WHISPER_TYPE_SYSTEM;
                pack.wSize = sizeof(TPacketGCWhisper) + len;
                strlcpy(pack.szNameFrom, "[Switchbot]", sizeof(pack.szNameFrom));
                pkOwner->GetDesc()->BufferedPacket(&pack, sizeof(pack));
                pkOwner->GetDesc()->Packet(buf, len);
            }

if conditionını nasıl yazmam gerekir buradaki
 
dungeon info cpp dosyam:
Genişlet Daralt Kopyala
#include "../../common/service.h"
#ifdef ENABLE_DUNGEON_INFO_SYSTEM
#include "stdafx.h"
#include "constants.h"
#include "utils.h"
#include "desc.h"
#include "char.h"
#include "db.h"
#include "config.h"
#include "dungeon_info.h"
#include "affect.h"
#include "item.h"
#include "questmanager.h"
#include <boost/algorithm/string.hpp>

struct DungeonInfoTable {
    int type; // Dungeon type [ 0 (Unkown), 1 (Private), 2 (Global) ] Bizdeki dungeonlar bireysel olduğu için 1 kullanıcaksın 1. veriyi
    int organization; // Dungeon organization [ 0 (None), 1 (Party), 2 (Guild) ] Bizdeki dungeonlar bireysel olduğu için 0 kullanıcaksın 2. veriyi
    int min_level;  // Dungeon level limit [ min_level ] Burada zindanın alt level limitini yazıcaksın 3. veriye
    int party_members;  // Dungeon party members [ max_members (0) Unlimited ] Burada dungeona grubunla girebilecek max kişi sayısını yazıcaksın. 4. veriye
    int map_index;  // Dungeon map index // Dungeonun map indexini yazıcaksın 5. veriye
    char map_name[64]; // Map Name // Zindanın ismini yazıcaksın 6. veriye
    char map_entrance[64]; // Map Name Entrance // Zindanın giriş haritasının ismini yazıcaksın 7. veriye
    int map_coords[2]; // Map Coords (X,Y) // ışınlan tuşuna basınca hangi koordinata ışınlansın onu yazıcakın 8. veriye
    int cooldown;  // [ 0 (None) ] | Ex: 60 * 60 * 3 = 3 hours // Soğuma süresini yazıcaksın 9. veriye saniye cinsi
    int duration;  // [ 0 (None) ] | Ex: 60 * 60 * 3 = 3 hours // Dungeonda en fazla ne kadar durabilir onun süresini yazıcaksın 10. veriye saniye cinsi
    int max_level; // Dungeon level min [ max_level ] //  Burada zindanın üst level limitini yazıcaksın 11. veriye
    int strength_bonus;  // Strength bonus id against dungeon monsters // Hangi bonus bu dungeon canavarlarına karşı güçlü bunun lenght.h 'taki karşılığı 12. veriye
    int resistance_bonus; // Resistance bonus id against dungeon monsters  // Hangi bonus bu dungeon canavarlarına karşı dayanıklı bunun lenght.h 'taki karşılığı 13. veriye
    int item_vnum;  // Required dungeon item // Dungeona girmek için gerekli eşyayı yazacaksın 14. veriye
    int boss_vnum; // Boss Vnum // dungeonun bossu hangisiyse vnumunu yazıcaksın 15. veriye
};

DungeonInfoTable dungeonTable[8] = { // Buradaki rakamı kaç tane dungeon girersen o sayıyı yazıcaksın.

    {1, 0, 40, 8 , 66, "Şeytan Kulesi", "Hwang Tapınağı" , {5906, 1108}, 0, 3600 , 105, 22, 89, 0, 1093}, // Dungeon 0
    {1, 0, 55, 8 , 364, "Ork Zindanı", "Seungryong Vadisi" , {3352, 7549}, 900, 3600 , 75, 19, 88, 828, 694}, // Dungeon 1
    {1, 0, 55, 8 , 362, "Örümcek Barones", "Örümcek Zindanı 3.Kat" , {692, 6110}, 900, 3600 , 75, 116, 38, 30325, 2092}, // Dungeon 2
    {1, 0, 75, 8 , 79, "Mavi Ejderha", "Sürgün Zindanı 2.Kat" , {1817, 12207}, 900, 3600 , 105, 105, 36, 30179, 2493}, // Dungeon 3
    {1, 0, 75, 8 , 216, "Şeytan Katakombu", "Hwang Tapınağı" , {5919, 996}, 900, 3600 , 105, 22, 89, 30319, 2598}, // Dungeon 4
    {1, 0, 90, 8 , 351, "Razadör", "Doyyumhwan" , {5998, 7075}, 900, 3600 , 105, 100, 35, 817, 6091}, // Dungeon 5
    {1, 0, 90, 8 , 352, "Nemere", "Sohan Dağı" , {4324, 1648}, 900, 3600 , 105, 101, 87, 818, 6191}, // Dungeon 6
    {1, 0, 75, 8 , 55, "Paskalya Mağarası", "Kızıl Orman" , {11171, 535}, 0, 2400 , 105, 119, 120, 30787, 4103}, // Dungeon 6

};

DungeonInfo::DungeonInfo()
{
}

DungeonInfo::~DungeonInfo()
{
}

bool DungeonInfo::IsValidTeleportLocation(int x, int y) const
{
    for (const auto& entry : dungeonTable)
    {
        if (entry.map_coords[0] == x && entry.map_coords[1] == y)
            return true;
    }
    return false;
}

void DungeonInfo::Update(LPCHARACTER ch)
{
    if (ch == NULL)
        return;

    if (!ch->IsPC())
        return;

    if (sizeof(dungeonTable) == 0)
        return;

    ch->ChatPacket(CHAT_TYPE_COMMAND, "CleanDungeonInfo");
    int size = *(&dungeonTable + 1) - dungeonTable;
    for (int i = 0; i <= size - 1; i++)
    {
        std::string mapName(dungeonTable[i].map_name);
        boost::algorithm::replace_all(mapName, " ", "_");

        std::string mapEntrance(dungeonTable[i].map_entrance);
        boost::algorithm::replace_all(mapEntrance, " ", "_");

        ch->ChatPacket(CHAT_TYPE_COMMAND, "UpdateDungeonInfo %d %d %d %d %d %s %s %d %d %d %d %d %d %d %d %d %d %d %d",
            dungeonTable[i].type,
            dungeonTable[i].organization,
            dungeonTable[i].min_level,
            dungeonTable[i].party_members,
            dungeonTable[i].map_index,
            mapName.c_str(),
            mapEntrance.c_str(),
            dungeonTable[i].map_coords[0],
            dungeonTable[i].map_coords[1],
            dungeonTable[i].cooldown,
            dungeonTable[i].duration,
            dungeonTable[i].max_level,
            dungeonTable[i].strength_bonus,
            dungeonTable[i].resistance_bonus,
            dungeonTable[i].item_vnum,
            dungeonTable[i].boss_vnum
        );
    }
}
#endif

bu dosyaya server switch bot sistemindeki gibi zindan süresi bitince pm göndertmek istiyorum,
zindanların süresini int cooldown değişkeni belirliyor bu zaman süresi geçtiğinde pm atması da sanırım bu kodla oluyor:
switch bot pm:
Genişlet Daralt Kopyala
            LPDESC desc = pkOwner->GetDesc();
            if (desc)
            {
                char buf[255];
                int len = snprintf(buf, sizeof(buf), LC_TEXT("Bonuschange of %s (Slot: %d) successfully finished."), pkItem->GetName(), bSlot + 1);

                TPacketGCWhisper pack;
                pack.bHeader = HEADER_GC_WHISPER;
                pack.bType = WHISPER_TYPE_SYSTEM;
                pack.wSize = sizeof(TPacketGCWhisper) + len;
                strlcpy(pack.szNameFrom, "[Switchbot]", sizeof(pack.szNameFrom));
                pkOwner->GetDesc()->BufferedPacket(&pack, sizeof(pack));
                pkOwner->GetDesc()->Packet(buf, len);
            }

if conditionını nasıl yazmam gerekir buradaki

Kod:
Genişlet Daralt Kopyala
if (dungeonTable[i].cooldown == 0)
{
    LPDESC desc = pkOwner->GetDesc();
    if (desc)
    {
        char buf[255];
        int len = snprintf(buf, sizeof(buf), LC_TEXT("%s cooldown resetlendi."), dungeonTable[i].map_name);


        TPacketGCWhisper pack;
        pack.bHeader = HEADER_GC_WHISPER;
        pack.bType = WHISPER_TYPE_SYSTEM;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        strlcpy(pack.szNameFrom, "[System]", sizeof(pack.szNameFrom));

        pkOwner->GetDesc()->BufferedPacket(&pack, sizeof(pack));
        pkOwner->GetDesc()->Packet(buf, len);
    }
}

gibi bişey olacak, ama cooldown'u tam olarak nasıl 0 yapıyor onu doğrulayıp if değişkenini ona göre ayarlaman gerekiyor dungeonTable.cooldown == 0 bu yazdığım şekilde dene bi
 
bunu for döngüsünün altına atmak lazım gibi sanki hocam orada update packet ile sıfırlandığında gönderebilir gibi duruyor(?), c++ çok anlamıyorum java öğrendim az buçuk
 
Aşağıdaki haliyle deneyebilirsin.

C++:
Genişlet Daralt Kopyala
    for (int i = 0; i <= size - 1; i++)
    {
        std::string mapName(dungeonTable[i].map_name);
        boost::algorithm::replace_all(mapName, " ", "_");

        std::string mapEntrance(dungeonTable[i].map_entrance);
        boost::algorithm::replace_all(mapEntrance, " ", "_");

        ch->ChatPacket(CHAT_TYPE_COMMAND, "UpdateDungeonInfo %d %d %d %d %d %s %s %d %d %d %d %d %d %d %d %d %d %d %d",
            dungeonTable[i].type,
            dungeonTable[i].organization,
            dungeonTable[i].min_level,
            dungeonTable[i].party_members,
            dungeonTable[i].map_index,
            mapName.c_str(),
            mapEntrance.c_str(),
            dungeonTable[i].map_coords[0],
            dungeonTable[i].map_coords[1],
            dungeonTable[i].cooldown,
            dungeonTable[i].duration,
            dungeonTable[i].max_level,
            dungeonTable[i].strength_bonus,
            dungeonTable[i].resistance_bonus,
            dungeonTable[i].item_vnum,
            dungeonTable[i].boss_vnum
        );
        if (dungeonTable[i].cooldown == 0)
        {
            // chate yaz
            ch->ChatPacket(CHAT_TYPE_INFO, "%s icin sure sifirlandi!", mapName.c_str());
            
            // PM Gonder
            {
                char buf[255];
                int len = snprintf(buf, sizeof(buf), LC_TEXT("%s icin sure sifirlandi!"), mapName.c_str());

                TPacketGCWhisper pack;
                pack.bHeader = HEADER_GC_WHISPER;
                pack.bType = WHISPER_TYPE_SYSTEM;
                pack.wSize = sizeof(TPacketGCWhisper) + len;
                strlcpy(pack.szNameFrom, "[Zindan Bilgi]", sizeof(pack.szNameFrom));
                ch->GetDesc()->BufferedPacket(&pack, sizeof(pack));
                ch->GetDesc()->Packet(buf, len);
            }
        }
    }
 
Geri
Üst