Domanda [DOMANDA]Ottenere il VID di un mob - Quest

Stato
Discussione chiusa ad ulteriori risposte.

Th3~J0k3r

Utente Emerald
18 Agosto 2011
1,435
59
148
423
Salve ragazzi, c'è qualcuno che saprebbe come ottenere il VID di un mob ? Sempre se è possibile.

So che c'è la funzione find_npc_by_vnum ma come dice la funzione (cerca tra gli npc).

Se qualcuno riesce a suggerirmi una soluzione gliene sarei grato :)

P.S. Non sono in un dungeon, quindi tutte le funzioni "d." sono escluse.
 
Ultima modifica:
Se non erro Find npc by vnum restituisce le coordinate dell'npc nella mappa del player corrente.
A te serve il vid di un mob a che scopo?

Edit
Forse hai ragione , per maggiore certezza più tardi leggo in codice sorgente.


Inviato dal mio LG-D855 utilizzando Tapatalk
 
Se non erro Find npc by vnum restituisce le coordinate dell'npc nella mappa del player corrente.
A te serve il vid di un mob a che scopo?

Edit
Forse hai ragione , per maggiore certezza più tardi leggo in codice sorgente.


Inviato dal mio LG-D855 utilizzando Tapatalk
La funzione find_npc_by_vnum restituisce un "codice univoco" per ogni npc, però purtroppo funziona solo con gli npc.
Mi servirebbe per un evento tanaka automatico :asd: che quando faccio "Disattiva" vorrei che i tanaka rimanenti li eliminasse con un bel npc.purge(npc.select("vid_mob")) in un loop
 
Ok , ho letto find_npc_by_vnum e a dirti la verità , il metodo non scarta il vid dei mob , anzi.
Qualsiasi character trova con la razza (vnum) da te indicata te ne restituisce il vid.
Sicuro che non funzioni con i tanaka?
 
Ok , ho letto find_npc_by_vnum e a dirti la verità , il metodo non scarta il vid dei mob , anzi.
Qualsiasi character trova con la razza (vnum) da te indicata te ne restituisce il vid.
Sicuro che non funzioni con i tanaka?
Mmm se dici così allora provo col mio npc test. Ti faccio sapere tra poco
 
Ho provato col mio npc di test a farmi stampare il vid di un tanaka con questa istruzione say(find_npc_by_vnum(5004)) e il risultato è un bello 0.

Con gli npc tipo bottegaia, fabbro ecc funziona, con i mob tipo tanaka e anche un semplice cane torna 0.
 
C++:
int _find_npc_by_vnum(lua_State* L)
    {
        if (!lua_isnumber(L, 1))
        {
            sys_err("invalid argument");
            lua_pushnumber(L, 0);
            return 1;
        }

        DWORD race = (DWORD) lua_tonumber(L, 1);

        CharacterVectorInteractor i;

        if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(race, i))
        {
            CharacterVectorInteractor::iterator it = i.begin();

            while (it != i.end())
            {
                LPCHARACTER tch = *(it++);

                if (tch->GetMapIndex() == CQuestManager::instance().GetCurrentCharacterPtr()->GetMapIndex())
                {
                    lua_pushnumber(L, tch->GetVID());
                    return 1;
                }
            }
        }

        //sys_err("not find(race=%d)", race);

        lua_pushnumber(L, 0);
        return 1;
    }

Come vedi non scarta nulla , se lo trova lo restituisce immediatamente.
Tu hai spawnato il tanaka d'avanti a te e hai provato a fartene dire il vid?
In caso proviamo a fare una funzione che purga tutti i mob con un dato vnum.
 
C++:
int _find_npc_by_vnum(lua_State* L)
    {
        if (!lua_isnumber(L, 1))
        {
            sys_err("invalid argument");
            lua_pushnumber(L, 0);
            return 1;
        }

        DWORD race = (DWORD) lua_tonumber(L, 1);

        CharacterVectorInteractor i;

        if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(race, i))
        {
            CharacterVectorInteractor::iterator it = i.begin();

            while (it != i.end())
            {
                LPCHARACTER tch = *(it++);

                if (tch->GetMapIndex() == CQuestManager::instance().GetCurrentCharacterPtr()->GetMapIndex())
                {
                    lua_pushnumber(L, tch->GetVID());
                    return 1;
                }
            }
        }

        //sys_err("not find(race=%d)", race);

        lua_pushnumber(L, 0);
        return 1;
    }

Come vedi non scarta nulla , se lo trova lo restituisce immediatamente.
Tu hai spawnato il tanaka d'avanti a te e hai provato a fartene dire il vid?
In caso proviamo a fare una funzione che purga tutti i mob con un dato vnum.
"Tu hai spawnato il tanaka d'avanti a te e hai provato a fartene dire il vid?" ---> Si ho provato esattamente così
 
Giusto per SICUREZZA prova con un mob che non è stato spawnato da comando (es : cane selvaggio in villo )
Se ne hai tempo e voglia naturalmente.
 
va bene , allora adesso ti scrivo un comando in c++ da usare in lua per purgare tutti i mob di un dato race.
Però questa volta provalo :etuno:
 
Preferisci che il comando che purga i mob di un dato race richieda anche l'index map , oppure vuoi che lo prenda automaticamente dal player in questione?
Perchè un conto è purgare stando necessariamente nella mappa dell evento , un conto purgare anche da fuori.
Dimmi tu.
ES:
case 1) purge_all_mob(index ,race)
case 2) purge_all_mob(race)
 
Ultima modifica:
Scrivo in inglese l'installazione del codice perchè sono abituato così (anche il codice usa un dizionario inglese in realtà).

C++:
//search :

LPCHARACTER CHARACTER_MANAGER::SpawnMobRandomPosition(DWORD dwVnum, long lMapIndex)

//add before -WARNING BEFORE :
#ifdef IKARUS_QUEST_COMMAND

struct FuncPurgeAllMobByRace
{
    DWORD m_race;
   
    FuncPurgeAllMobByRace(DWORD race) : m_race(race)
    {
    }

    void operator () (LPENTITY ent)
    {

        if (ent->IsType(ENTITY_CHARACTER))
        {
            LPCHARACTER pkChr = (LPCHARACTER) ent;

            if(pkChr->IsPC())
                return;
            if(pkChr->GetRaceNum() != m_race )
                return;
            M2_DESTROY_CHARACTER(pkChr);
        }
    }
};

bool CHARACTER_MANAGER::PurgeAllMobByRace( DWORD race , LPSECTREE_MAP map ) 
{
    if(race < 0 || !map )
        return false;
    FuncPurgeAllMobByRace purge_all_mob(race);
    map->for_each(purge_all_mob);
    return true;
}


#endif

C++:
//search :

        LPCHARACTER        SpawnMobRandomPosition(DWORD dwVnum, long lMapIndex);

//add before -WARNING BEFORE

#ifdef IKARUS_QUEST_COMMAND
        bool            PurgeAllMobByRace( DWORD race , LPSECTREE_MAP map );
#endif

C++:
//search:

#include "desc.h"

//add under:

#ifdef IKARUS_QUEST_COMMAND
#include "sectree_manager.h"
#endif


////////////////////////////////////////////////

//search :

    int npc_get_exp(lua_State* L)
    {
        lua_pushnumber(L, CQuestManager::instance().GetCurrentNPCCharacterPtr()->GetMobTable().dwExp);
        return 1;
    }


//add under :

#ifdef IKARUS_QUEST_COMMAND
    int npc_purge_by_race(lua_State* L)
    {
        LPCHARACTER pc = CQuestManager::Instance().GetCurrentCharacterPtr();         
        LPSECTREE_MAP pcMap = SECTREE_MANAGER::instance().GetMap(pc->GetMapIndex());
        DWORD race = (DWORD)lua_tonumber(L , 1);
        if( !pcMap || !lua_isnumber(L , 1) || !race )
        {
            sys_err("Ikarus >> npc_purge_by_race : if(!pcMap || !lua_isnumber(L , 1) || !race ) , return before purge ");
            return 1;
        }
        CHARACTER_MANAGER::Instance().PurgeAllMobByRace(  race , pcMap);
        return 2;
    }
#endif 



//////////////////////////////////////////////////////

//search :

            { "purge",                npc_purge            },

//add under :


#ifdef IKARUS_QUEST_COMMAND
            { "purge_by_race",        npc_purge_by_race    },
#endif

C++:
//add
#define IKARUS_QUEST_COMMAND

QUESTO E' CODICE SCRITTO E POSTATO , DUNQUE AFFATTO TESTATO E CORRETTO
molto probabili gli warning di compilazione (se li segnalate li risolviamo) , meno probabili ma pur sempre possibili gli errori di compilazione.

fammi sapere.

COMANDO:
purge_by_race(race) -> dove race è il vnum del mob da purgare
 
Scrivo in inglese l'installazione del codice perchè sono abituato così (anche il codice usa un dizionario inglese in realtà).

C++:
//search :

LPCHARACTER CHARACTER_MANAGER::SpawnMobRandomPosition(DWORD dwVnum, long lMapIndex)

//add before -WARNING BEFORE :
#ifdef IKARUS_QUEST_COMMAND

bool CHARACTER_MANAGER::PurgeAllMobByRace( DWORD race , LPSECTREE_MAP map )
{
    if(race < 0 || !map )
        return false;
    FuncPurgeAllMobByRace purge_all_mob(race);
    map->for_each(purge_all_mob);
    return true;
 
}

struct FuncPurgeAllMobByRace
{
    FuncPurgeAllMobByRace(DWORD race)
    {
        m_race = race;
    }

    void operator () (LPENTITY ent)
    {

        if (ent->IsType(ENTITY_CHARACTER))
        {
            LPCHARACTER pkChr = (LPCHARACTER) ent;

            if(pkChr->IsPC)
                return;
            if(pkChr->GetRaceNum() != m_race )
                return;
            DestroyCharacter(pkChr);
        }
    }

    DWORD         m_race;
};

#endif

C++:
//search :

        LPCHARACTER        SpawnMobRandomPosition(DWORD dwVnum, long lMapIndex);

//add before -WARNING BEFORE

#ifdef IKARUS_QUEST_COMMAND
        bool            PurgeAllMobByRace( DWORD race , LPSECTREE_MAP map );
#endif

C++:
//search:

#include "desc.h"

//add under:

#ifdef IKARUS_QUEST_COMMAND
#include "sectree_manager.h"
#endif


////////////////////////////////////////////////

//search :

    int npc_get_exp(lua_State* L)
    {
        lua_pushnumber(L, CQuestManager::instance().GetCurrentNPCCharacterPtr()->GetMobTable().dwExp);
        return 1;
    }


//add under :

#ifdef IKARUS_QUEST_COMMAND
    int npc_purge_by_race(lua_State* L)
    {
        LPCHARACTER pc = CQuestManager::Instance().GetCurrentCharacterPtr();         
        LPSECTREE_MAP pcMap = SECTREE_MANAGER::instance().GetMap(pc->GetMapIndex());
        DWORD race = (DWORD)lua_tonumber(L , 1);
        if( !pcMap || !lua_isnumber(L , 1) || !race )
        {
            sys_err("Ikarus >> npc_purge_by_race : if(!pcMap || !lua_isnumber(L , 1) || !race ) , return before purge ");
            return 1;
        }
        CHARACTER_MANAGER::Instance().PurgeAllMobByRace(  race , pcMap);
        return 2;
    }
#endif 



//////////////////////////////////////////////////////

//search :

            { "purge",                npc_purge            },

//add under :


#ifdef IKARUS_QUEST_COMMAND
            { "purge_by_race",        npc_purge_by_race    },
#endif

C++:
//add
#define IKARUS_QUEST_COMMAND

QUESTO E' CODICE SCRITTO E POSTATO , DUNQUE AFFATTO TESTATO E CORRETTO
molto probabili gli warning di compilazione (se li segnalate li risolviamo) , meno probabili ma pur sempre possibili gli errori di compilazione.

fammi sapere.

COMANDO:
purge_by_race(race) -> dove race è il vnum del mob da purgare

Già che ci sei fai una bella release, copiando queste e aggiungendo il codice dell'invisibilità
 
Se li testi e correggiamo eventuali problemi , possiamo anche fare una release a parte.

edit _

ricorda di mettere il nuovo comando in quest_functions
 
Errore di compilazione
upload_2017-6-28_13-46-15.webp
 
Tutto ciò non ha molto senso esistono le funzioni unique del dungeon per puntare a uno specifico mob:
d.set_unique("mob_selezionato",d.spawn_mob(vnum,local_x,local_y))
Edit non ho letto che sei fuori dalla dungeon
 
Ultima modifica:
Si non avevo letto che non eri in dungeon, comunque ci sono alcuni ";" mancanti nelle varie function che ha scritto il ragazzo

no "anziano :asd:" ti sbagli.
Non mancano ";" , i problemi sono altri , ma comunque ora li risolviamo :rulz:

Edit :

Il problema era che la struct si trovava dopo il metodo della classe , quindi nella compilazione avveniva il richiamo della stessa prima della sua dichiarazione.
 
Stato
Discussione chiusa ad ulteriori risposte.
Indietro
Top Bottom