Yeni Regen Düzenlemesi

  • Konuyu açan Konuyu açan Tengrist
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 3
  • Gösterim Gösterim 669

Tengrist

Mapper
Mapper
Yardımsever Üye
MT Üye
Mesaj
1.490
Çözümler
43
Beğeni
1.410
Puan
1.309
Ticaret Puanı
0
Öncelikle kendi dosyalarımdaki halini paylaşıyorum sizinkinde farklılık varsa bu konu altından birbirimize yardım ederek çözebiliriz.

Service.h:
Genişlet Daralt Kopyala
#define __NEW_SPAWN_SYSTEM__
//herhangi bir yere ekle
regen.h:
Genişlet Daralt Kopyala
//bul:
typedef struct regen
{

//içinde bul:
    int     vnum;

//üstüne ekle:
#ifdef __NEW_SPAWN_SYSTEM__
    time_t next_boss_spawn;
    bool bBoss;
#endif

Bul ve değiştir:
extern bool    regen_load(const char *filename, long lMapIndex, int base_x, int base_y);

#ifdef __NEW_SPAWN_SYSTEM__
extern bool    regen_load(const char *filename, long lMapIndex, int base_x, int base_y, bool bBoss = false);
extern time_t get_seconds_since_midnight();
extern time_t get_global_seconds();
extern int get_next_spawn_delay(int respawn_time, time_t current_time = get_seconds_since_midnight());
extern std::string get_time_string(int seconds_to_add = 0);
#else
extern bool    regen_load(const char *filename, long lMapIndex, int base_x, int base_y);
#endif
regen.cpp:
Genişlet Daralt Kopyala
//BUL:
EVENTFUNC(regen_event)
//içinde bul:
    regen_spawn(regen, false);
//üstüne ekle:
#ifdef __NEW_SPAWN_SYSTEM__
    if(regen_time && regen->bBoss)
    {
        auto next_spawn_time = regen->next_boss_spawn;
        auto global_seconds = get_global_seconds();

        // boss spawned too fast...
        if(global_seconds < next_spawn_time)
        {
            auto difference = next_spawn_time - global_seconds;

            if(is_important_spawn)
                sys_log(0, "BOSS SPAWN TOO FAST | VNUM %u REGEN_TIME %d | RECALCULATED SPAWN %s SHIFTED %d", regen->vnum, regen->time, get_time_string(difference).c_str(), difference );
        
            return PASSES_PER_SEC(difference);
        }
    }
#endif

//deminki     regen_spawn(regen, false); altına ekle:
#ifdef __NEW_SPAWN_SYSTEM__

    if (regen_time && regen->bBoss)
    {
        // Calculate spawn time
        auto next_spawn_delay = get_next_spawn_delay(regen->time);

        // Log boss spawn
        if(is_important_spawn)
        {
            sys_log(!test_server, "SPAWNED BOSS | VNUM %u REGEN_TIME %d | NEXT SPAWN TIME %s", regen->vnum, regen->time, get_time_string(next_spawn_delay).c_str());
            // LogManager::instance().BossSpawnLog(regen->vnum);
        }
    
        regen->next_boss_spawn = get_global_seconds() + next_spawn_delay;

        // Set regen time
        regen_time = next_spawn_delay;
    }
#endif

//bul ve değiştir bulacağın:
bool regen_load(const char* filename, long lMapIndex, int base_x, int base_y)
//değiştir:
#ifdef __NEW_SPAWN_SYSTEM__
bool regen_load(const char* filename, long lMapIndex, int base_x, int base_y, bool bBoss)
#else
bool regen_load(const char* filename, long lMapIndex, int base_x, int base_y)
#endif

//Bul ve üstüne ekle bulacağın:
            if (regen->time != 0)
//üstüne ekleyeceğin:
#ifdef __NEW_SPAWN_SYSTEM__
            regen->bBoss = bBoss; //Default false
#endif

//Bul ve Değiştir bulacağın kod bloğu:
                regen_spawn(regen, false);

                regen_event_info* info = AllocEventInfo<regen_event_info>();

                info->regen = regen;

                regen->event = event_create(regen_event, info, PASSES_PER_SEC(random_number(0, 16)) + PASSES_PER_SEC(regen->time));
//değiştir:
#ifdef __NEW_SPAWN_SYSTEM__
                if (bBoss)
                {
                    sys_log(0, "**LOAD NEW SPAWN SYSTEM**");

                    // Calculate spawn time
                    auto next_spawn_delay = get_next_spawn_delay(regen->time);

                    regen->next_boss_spawn = get_global_seconds() + next_spawn_delay;

                    // Create regen info
                    regen_event_info* info = AllocEventInfo<regen_event_info>();

                    info->regen = regen;

                    // Start the event
                    regen->event = event_create(regen_event, info, PASSES_PER_SEC(next_spawn_delay));

                    sys_log(!test_server, "LOAD BOSS | VNUM %u REGEN_TIME %d | SPAWN_DELAY_SECONDS %d NEXT SPAWN %s", regen->vnum, regen->time, next_spawn_delay, get_time_string(next_spawn_delay).c_str() );
                }
                else
                {
                    regen_spawn(regen, false);

                    regen_event_info* info = AllocEventInfo<regen_event_info>();

                    info->regen = regen;

                    regen->event = event_create(regen_event, info, PASSES_PER_SEC(random_number(0, 16)) + PASSES_PER_SEC(regen->time));
                }
#else
                // 처음엔 무조건 리젠 해준다.
                regen_spawn(regen, false);

                regen_event_info* info = AllocEventInfo<regen_event_info>();

                info->regen = regen;

                regen->event = event_create(regen_event, info, PASSES_PER_SEC(random_number(0, 16)) + PASSES_PER_SEC(regen->time));
#endif

sectree_manager.cpp:
Genişlet Daralt Kopyala
//Bul ve değiştir; bulacağın:
            if (!pvp_server)
                regen_load(szFilename, setting.iIndex, setting.iBaseX, setting.iBaseY);

//deminki blokla bunu değiş:
#ifdef __NEW_SPAWN_SYSTEM__
            if (!pvp_server)
                regen_load(szFilename, setting.iIndex, setting.iBaseX, setting.iBaseY, true);
#else
            if (!pvp_server)
                regen_load(szFilename, setting.iIndex, setting.iBaseX, setting.iBaseY);
#endif
 
Uyarı: Bu konu açıldığından bu yana baya zaman geçmiş.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.
Geri
Üst