Domanda Max level?

Stato
Discussione chiusa ad ulteriori risposte.

Portmapper

Utente Iron
2 Febbraio 2018
5
3
0
19
Salve ragazzi, vorrei porvi la seguente domanda.
Si potrebbe bloccare l'exp ad un determinato livello in una determinata mappa?
Es: covo1 da lvl 80 a lvl 90. Posso fare in modo che a lvl 90 non si prenda più nessun exp?
Grazie per la vostra attenzione.
 
Ultima modifica:
se ti interessa qualcosa di più articolato del consiglio dato da Ale (iltizio) ti propongo questo mini-system che ti ho scritto in 5 minuti di pausa che ho fatto...
spero non ti dia troppi errori di compilazione , non ho il tempo di compilartelo e testarlo ma son poche righe e quindi dovrebbe andare..
se ottieni errori che non sai come risolvere ovviamente puoi tranquillamente chiede qui a me.

da mettere in config.h (dove vuoi ma mettilo bene)
C++:
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
extern boost::unordered_map <int,int> g_map_level_cap_by_map;
#endif


da mettere in config.cpp (occhio alle indicazione della posizione in cui mettere le line)
C++:
//alle prime righe del file , magari alla fine degli include

#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
boost::unordered_map <int,int> g_map_level_cap_by_map;
#endif





//cerca questo punto del codice e modificalo in questo modo
//ps , spero che sia cosi anche da te... io uso i file martysama
//il metodo in cui trovi questo codice si chiama config_init

// LOCALE_SERVICE
    LocaleService_LoadLocaleStringFile();
    LocaleService_TransferDefaultSetting();
    LocaleService_LoadEmpireTextConvertTables();
    // END_OF_LOCALE_SERVICE
 
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
    if(!LoadLevelCapToExpIntoMap())
        exit(1);
#endif

    std::string st_cmdFileName("CMD");





//questa parte puoi mettera dove vuoi (non in mezzo a altri metodi però..) anche a fine file va bene

#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
static bool LoadLevelCapToExpIntoMap()
{
    const char* clevelCapFilename = "locale/germany/map/map_level_cap.conf";
 
    FILE* pFile = fopen(clevelCapFilename,"r");
 
    if(!pFile)
    {
        fprinf(stderr, "CAN NOT FIND FILE [%s]\n",clevelCapFilename);
        return false;
    }
 
    char buffer[100] = "\0";
 
    char szMapIndex[20] = "\0";
    char szLevelCap[20] = "\0";
 
    int iLine = 0;
 
    while(fgets(buffer,sizeof(buffer),pFile))
    {
        iLine++;
        two_arguments(buffer , szMapIndex , sizeof(szMapIndex) , szLevelCap,sizeof(szLevelCap));
     
        if(szMapIndex[0] == '\0' || szLevelCap[0] == '\0')
        {
            fprintf(stderr, "Error during file loading [%s] at line [%d]!!\n",clevelCapFilename,iLine);
            fclose(pFile);
            return false;
        }
     
        else
        {
            int iMapIndex =0 , iLevelCap = 0;
            str_to_number(iMapIndex,szMapIndex);
            str_to_number(iLevelCap,szLevelCap);
         
            g_map_level_cap_by_map.insert(std::make_pair(iMapIndex,iLevelCap));
        }
    }
 
    fprintf(stdout,"LOAD LEVEL CAP MAP CONFIG :: COUNT OF CAP [%d]\n",g_map_level_cap_by_map.size());
return true;
}
#endif


da mettere in char_manager.h
dove ti pare basta che sia nella classe CHARACTER_MANAGER sotto public member

Codice:
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
        bool         IsTheRightLevelForExp( LPCHARACTER ch );
#endif



da mettere in char_manager.cpp
anche questo dove vuoi (ma non nel bel mezzo di un altro metodo) anche se io per questione di ordine lo metterei tra un metodo e un altro della classe CHARACTER_MANAGER , ma in ogni caso anche a fine file andrà bene...
C++:
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
bool CHARACTER_MANAGER::IsTheRightLevelForExp( LPCHARACTER ch )
{
    if(!ch)
        return false;
 
    itertype(g_map_level_cap_by_map) it = g_map_level_cap_by_map.find(ch->GetMapIndex());
    if(g_map_level_cap_by_map.end() == it)
        return true;
 
    return (it->second >= ch->GetLevel());
}
#endif


infine... in char_battle.cpp trovi il metodo

C++:
static void GiveExp(LPCHARACTER from, LPCHARACTER to, int iExp)

subito dopo (all'inizio del metodo) ci va il nostro nuovo check , quindi il risultato finale sarà

C++:
static void GiveExp(LPCHARACTER from, LPCHARACTER to, int iExp)
{
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
    if(!CHARACTER_MANAGER::instance().IsTheRightLevelForExp(to))
        return;
#endif


ovviamente poi c'è da aggiungere
#define __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
dove generalmente metti i define dei system che installi...
in genere si usa service.h che trovi in common...

dai un bel clean prima di ricompilare ;)


spiegazione:
ho aggiunto il loading (sullo start dei core) di un nuovo file di config che servirà a impostare i cap in base ai map index
nel codice ho messo il percorso "locale/germany/map/map_level_cap.conf" ma puoi cambiarlo come ti pare...
il nome del file che dovrai creare è appunto map_level_cap.conf e dentro ci devi scrivere in ogni linea map_index(spazio)level_cap

esempio di file
Codice:
41 35
61 85

occhio a non lasciare righe vuote... (non mi andava di aggiungere nel loading il jump di line vuote :asd: )
 
Ringrazio entrambi per le possibili soluzioni, specialmente iKarus che ha pubblicato anche il codice.
Ho risolto seguendo il consiglio di iltizio, ovvero creando una quest che mi blocca l'exp in una mappa dopo un certo livello e me lo sblocca quando non sono all'interno di quella mappa.

Potete chiudere.
 
Ringrazio entrambi per le possibili soluzioni, specialmente iKarus che ha pubblicato anche il codice.
Ho risolto seguendo il consiglio di iltizio, ovvero creando una quest che mi blocca l'exp in una mappa dopo un certo livello e me lo sblocca quando non sono all'interno di quella mappa.

Potete chiudere.
Puoi chiuderla tu dal pannellino di amministrazione discussioni che vedi quando sei in sezione help (nella lista di discussioni senza entrare in nessuna discussione specifica).
Spero che quel codice prima o poi sarà utile a qualcuno ahah è un peccato.

Inviato dal mio LG-H870 utilizzando Tapatalk
 
Stato
Discussione chiusa ad ulteriori risposte.
Indietro
Top Bottom