Domanda [HELP] QUEST RIMUOVI OGNI ITEM

Stato
Discussione chiusa ad ulteriori risposte.

O.Evil.O

Utente Electrum
4 Marzo 2014
185
37
11
122
Ultima modifica:
Salve popolo di Inforge,
mi ripresento per chiedere gentilmente a qualcuno che se ne intende più di me in ambito di quest se creandone una con la funzione:
item.remove()

questa rimuova gli oggetti anche nell'equipaggiamento del giocatore, devo creare una quest di tp di ritorno al villaggio da un'arena pvp con item gratis negli shop e già maxati, e quindi si... non vorrei che i miei cari amici se ne rubassero mezzo vagone!

Attendo eventuali risposte e ringrazio in anticipo! ;)
Messaggio unito automaticamente:

Salve popolo di Inforge,
mi ripresento per chiedere gentilmente a qualcuno che se ne intende più di me in ambito di quest se creandone una con la funzione:

item.remove()

questa rimuova gli oggetti anche nell'equipaggiamento (simile al comando/ipurge) del giocatore, devo creare una quest di tp di ritorno al villaggio da un'arena pvp con item gratis negli shop e già maxati, e quindi si... non vorrei che i miei cari amici se ne rubassero mezzo vagone!

o eventualmente costruire una quest inversa che finche conta item proibiti non possono passare, nel caso se si possa usare la funzione pc.count_item in successione col metodo or
Attendo eventuali risposte e ringrazio in anticipo! ;)
 
PIù che una semplice quest ti converrebbe un vero e proprio system, anche perché devi tener conto della gente che ha shoppato, non credo che vuoi eliminare anche a loro gli item dello shop.

Diciamo che la quest c'è ma dietro a tutto ciò ci sta anche un po' di modifica server side
 
PIù che una semplice quest ti converrebbe un vero e proprio system, anche perché devi tener conto della gente che ha shoppato, non credo che vuoi eliminare anche a loro gli item dello shop.

Diciamo che la quest c'è ma dietro a tutto ciò ci sta anche un po' di modifica server side
io ho messo il disclaimer nella quest di entrata nell arena PvP, quindi dato che sono amici bene o male gli posso fare un give da founder e passa la paura xD
 
Codice:
int item_remove(lua_State* L)
    {
        CQuestManager& q = CQuestManager::instance();
        LPITEM item = q.GetCurrentItem();
        if (item != NULL) {
            if (q.GetCurrentCharacterPtr() == item->GetOwner()) {
                ITEM_MANAGER::instance().RemoveItem(item);
            } else {
                sys_err("Tried to remove invalid item %p", get_pointer(item));
            }
            q.ClearCurrentItem();
        }

        return 0;
    }
Questa è la funzione item.remove()

Andando a vedere come funziona "RemoveItem(LPITEM item)", scoprirai che cancella definitivamente un oggetto da...
Codice:
void ITEM_MANAGER::RemoveItem(LPITEM item, const char * c_pszReason)
{
    LPCHARACTER o;

    if ((o = item->GetOwner()))
    {
        char szHint[64];
        snprintf(szHint, sizeof(szHint), "%s %u ", item->GetName(), item->GetCount());
        LogManager::instance().ItemLog(o, item, c_pszReason ? c_pszReason : "REMOVE", szHint);

        // SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX
        if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX)
        {
            // 20050613.ipkn.½Ã°£Á¦ ¾ÆÀÌÅÛÀÌ »óÁ¡¿¡ ÀÖÀ» °æ¿ì ½Ã°£¸¸·á½Ã ¼¹ö°¡ ´Ù¿îµÈ´Ù.
            CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
            if (pSafebox)
            {
                pSafebox->Remove(item->GetCell());
            }
        }
        // END_OF_SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX
        else
        {
            o->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
            item->RemoveFromCharacter();
        }
    }

    M2_DESTROY_ITEM(item);
}

Magazzino, item shop, e poi c'è un else, che dice "RemoveFromCharacter"... andiamo a vedere cosa fa questo altro metodo qui...

Codice:
if (m_bEquipped)    // ÀåÂøµÇ¾ú´Â°¡?
    {
        Unequip();
        //pOwner->UpdatePacket();

        SetWindow(RESERVED_WINDOW);
        Save();
        return (this);
    }

Se l'item è equipaggiato lo disequipaggia e lo porta nel limbo (dico cosi perchè onestamente non ricordo la finestra 0 per cosa fosse ma dovrebbe sparirti l'item). In ogni caso puoi fare una funzione apposita (che sicuramente ci sarà già ma ora non ho molto tempo per controllare) per rimuovere l'item direttamente dall'equip con cose del tipo: "pOwner->SetItem(cell, NULL);" dopo aver definito un "TItemPos cell(EQUIPMENT, posizione);"


Molto bene tutto bello, ma item.remove() toglie un item SELEZIONATO!!! come aspita seleziono un item nell'equip????? usiamo la fantastica funzione lua (nella quest quindi ci stiamo spostando) pc.get_wear(posizione dell'equip)
WEARABLE_BODY = (1 << 0),
WEARABLE_HEAD = (1 << 1),
WEARABLE_FOOTS = (1 << 2),
WEARABLE_WRIST = (1 << 3),
WEARABLE_WEAPON = (1 << 4),
WEARABLE_NECK = (1 << 5),
WEARABLE_EAR = (1 << 6),
WEARABLE_UNIQUE = (1 << 7),
WEARABLE_SHIELD = (1 << 8),
WEARABLE_ARROW = (1 << 9),

questi sono i numeri che devi mettere come posizione, tralasciando cosa siano.

Quindi scriverai qualcosa del tipo "local item = pc.get_wear(4)" e poi "if item != nil then" e fai l'item.remove().

Questa è una soluzione partorita sul momento ci saranno sicuramente 3984398 modi migliori di fare il tutto ma non ho visto risposte migliori al momento. Saluti
 
  • Mi piace
Reazioni: O.Evil.O
Codice:
int item_remove(lua_State* L)
    {
        CQuestManager& q = CQuestManager::instance();
        LPITEM item = q.GetCurrentItem();
        if (item != NULL) {
            if (q.GetCurrentCharacterPtr() == item->GetOwner()) {
                ITEM_MANAGER::instance().RemoveItem(item);
            } else {
                sys_err("Tried to remove invalid item %p", get_pointer(item));
            }
            q.ClearCurrentItem();
        }

        return 0;
    }
Questa è la funzione item.remove()

Andando a vedere come funziona "RemoveItem(LPITEM item)", scoprirai che cancella definitivamente un oggetto da...
Codice:
void ITEM_MANAGER::RemoveItem(LPITEM item, const char * c_pszReason)
{
    LPCHARACTER o;

    if ((o = item->GetOwner()))
    {
        char szHint[64];
        snprintf(szHint, sizeof(szHint), "%s %u ", item->GetName(), item->GetCount());
        LogManager::instance().ItemLog(o, item, c_pszReason ? c_pszReason : "REMOVE", szHint);

        // SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX
        if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX)
        {
            // 20050613.ipkn.½Ã°£Á¦ ¾ÆÀÌÅÛÀÌ »óÁ¡¿¡ ÀÖÀ» °æ¿ì ½Ã°£¸¸·á½Ã ¼¹ö°¡ ´Ù¿îµÈ´Ù.
            CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
            if (pSafebox)
            {
                pSafebox->Remove(item->GetCell());
            }
        }
        // END_OF_SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX
        else
        {
            o->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
            item->RemoveFromCharacter();
        }
    }

    M2_DESTROY_ITEM(item);
}

Magazzino, item shop, e poi c'è un else, che dice "RemoveFromCharacter"... andiamo a vedere cosa fa questo altro metodo qui...

Codice:
if (m_bEquipped)    // ÀåÂøµÇ¾ú´Â°¡?
    {
        Unequip();
        //pOwner->UpdatePacket();

        SetWindow(RESERVED_WINDOW);
        Save();
        return (this);
    }

Se l'item è equipaggiato lo disequipaggia e lo porta nel limbo (dico cosi perchè onestamente non ricordo la finestra 0 per cosa fosse ma dovrebbe sparirti l'item). In ogni caso puoi fare una funzione apposita (che sicuramente ci sarà già ma ora non ho molto tempo per controllare) per rimuovere l'item direttamente dall'equip con cose del tipo: "pOwner->SetItem(cell, NULL);" dopo aver definito un "TItemPos cell(EQUIPMENT, posizione);"


Molto bene tutto bello, ma item.remove() toglie un item SELEZIONATO!!! come aspita seleziono un item nell'equip????? usiamo la fantastica funzione lua (nella quest quindi ci stiamo spostando) pc.get_wear(posizione dell'equip)
WEARABLE_BODY = (1 << 0),
WEARABLE_HEAD = (1 << 1),
WEARABLE_FOOTS = (1 << 2),
WEARABLE_WRIST = (1 << 3),
WEARABLE_WEAPON = (1 << 4),
WEARABLE_NECK = (1 << 5),
WEARABLE_EAR = (1 << 6),
WEARABLE_UNIQUE = (1 << 7),
WEARABLE_SHIELD = (1 << 8),
WEARABLE_ARROW = (1 << 9),

questi sono i numeri che devi mettere come posizione, tralasciando cosa siano.

Quindi scriverai qualcosa del tipo "local item = pc.get_wear(4)" e poi "if item != nil then" e fai l'item.remove().

Questa è una soluzione partorita sul momento ci saranno sicuramente 3984398 modi migliori di fare il tutto ma non ho visto risposte migliori al momento. Saluti

oddio proverò a capirci qualcosa e ti faro sapere se riesco a farla funzionare, grazie mille ;) qualche istruzione su dove devo mettere cosa? xD
 
Anche se so che non è una cosa condivisa dai più bravi, se ti servisse aiuto per modifiche di poca importanza puoi lasciarmi skype in privato (ti risponderò appena riesco, non ho molto tempo per stare al pc), ed eventualmente aggiornare la discussione se facciamo qualche cosa di rilevante per un eventuale visitatore del thread in un ipotetico futuro.

Come suggerisce FreeWar ci si potrebbe fare un sistema dietro, ma in realtà non è necessario, basta avere ben CHIARO cosa vuoi esattamente che succeda e fare due ritocchi qua e la (il sistema con grafica e tutto resta sicuramente più figo, ma non penso tu fossi alla ricerca di questo, di solito si parte dalla ciambella per poi fare le torte). Nella risposta precedente ti ho dato qualche spunto, ma se devi diventarci scemo e non hai idea di cosa io abbia scritto (anche e soprattutto per una mia incapacità lampante nello spiegarmi che proverò a risolvere) contattami senza alcuna esitazione.
 
Anche se so che non è una cosa condivisa dai più bravi, se ti servisse aiuto per modifiche di poca importanza puoi lasciarmi skype in privato (ti risponderò appena riesco, non ho molto tempo per stare al pc), ed eventualmente aggiornare la discussione se facciamo qualche cosa di rilevante per un eventuale visitatore del thread in un ipotetico futuro.

Come suggerisce FreeWar ci si potrebbe fare un sistema dietro, ma in realtà non è necessario, basta avere ben CHIARO cosa vuoi esattamente che succeda e fare due ritocchi qua e la (il sistema con grafica e tutto resta sicuramente più figo, ma non penso tu fossi alla ricerca di questo, di solito si parte dalla ciambella per poi fare le torte). Nella risposta precedente ti ho dato qualche spunto, ma se devi diventarci scemo e non hai idea di cosa io abbia scritto (anche e soprattutto per una mia incapacità lampante nello spiegarmi che proverò a risolvere) contattami senza alcuna esitazione.
e che neanche io ho troppo tempo di stare al pc e mi serviva solo una piccola quest che rimuovesse all entrata di un arena pvp gli oggetti, il disclaimer l ho gia... piu che altro cercavo solo come e dove inserire queste funzioni/script, contando che ho un hamachi 34k a perditempo! xD
 
Ti suggerisco di cercare files 40k e soprattutto i sorgenti di game db e client (trovi cosa sono su internet, se sai cosa sono e li hai ignora quanto detto), e quindi di provare a fare quanto suggerito nelle risposte alla tua domanda. Questo va off topic, era solo un suggerimento personale (se gratis ti danno sia l'iphone 6 che il 7 tu prendi il 6?)
 
È una questione di nostalgia purtroppo che fa abbastanza, però volevo capire se effettivamente quelle cose si possono applicare a un 34k hamachi o necessitano solo un 40k e se gentilmente potrei avere qualche istruzione o indicazione di dove e cosa devo inserire e cosa sono quelle cose, a scopo di studio in modo di arrangiarmi prossima volta ;) senno ne faccio volentieri a meno, in quanto e un hamachi con si e no 10 persone dentro
 
Quello che ti ho suggerito si può fare anche sui 34k, a patto che tu abbia i sorgenti (non ricordo onestamente se girassero gratuitamente). Senza di essi, potendo modificare SOLO quest, potresti provare l'accoppiata pc.get_wear(wear index) + item.remove()

Verifica solo se il get wear ti ritorna il vnum dell'ipotetico item indossato, in quel caso avendo il vnum devi selezionare l'item (ci sarà item.select_vnum o qualcosa del genere non ho nulla sotto mano per controllare) perchè per poter usare item.remove() si suppone che l'item in questione sia selezionato.

Se non trovi nessun modo di selezionare l'item, e vuoi comunque fare il tuo piccolo sistema puoi procedere ad esempio cosi:
Dai questi item speciali con vnum diversi (scegliti un set particolare fighissimo che dai solo li). All'uscita lanci un ciclo for del genere:
for i = 1, 90-180, 1 do (metti 90 o 180 a seconda di quanti inventari hai, sono i quadrettini da controllare)
[TAB]if item.select_cell(i) then
TAB TAB if item.get_vnum() == vnum arma or item.get_vnum() == vnum armatura e cosi via (ci sarebbero modi piu carini di fare sto check ma non voglio complicare troppo)
TAB TAB TAB item.remove()
TAB TAB TAB se vuoi qui metti un messaggio chat() per dire "ti è stato rimosso il tal item", un modo carino è "chat(string.format("Ti e' stato rimosso/a %s", item.get_name()))
TAB TAB end
TAB end
end -- a cosa servono i TAB? ordine

una volta svuotato l'inventario dagli item (se li avevano li) procedi con l'equip:
fai vari if che verifichino cosa indossa il pg -> if pc.get_wear(index con gli indici che ho messo nella prima risposta) == value item then
(nell'if devi mettere nell'index del wear ad esempio l'index dello slot arma che per esempio è 4 e a destra dell'operatore == metterai il value dell'arma evento; ovviamente ci saranno piu armi dovrai fare piu controlli)
se riconosce un value gli fai dire:
say("togliti l'item e trascinalo su di me")
return
else
pc.warp(e lo esci dalla mappa) -> quindi l'uscita deve passare per forza da qui NON deve esserci altro modo, così finche non trascineranno gli item sull'npc non potranno andarsene.

quindi farai un bel
when valuenpc.take begin
e qua metti i vari if con il value degli item da rimuovere:
if item.get_vnum() == uno degli item dell'evento then
item.remove()
say("Grazie per aver restituito l'item evento")
quando avranno restituito tutti gli item potranno parlare premendo il bottone chat di prima che faceva tutto il controllo dell'inventario per andarsene.

capisco che non sia facilissimo ma credo che questo sia il modo meno complicato per fare quello che hai chiesto senza toccare il sorgente (c'è una possibilità remota che si potesse selezionare l'item col value tornato da pc get wear e fare item.remove tutto automatico, ma mi sembra di aver capito che non mi seguivi granchè, quindi ho provato cosi.. fammi sapere se riesci, in caso negativo ti scrivo direttamente la quest ma almeno provaci prima)
 
  • Mi piace
Reazioni: O.Evil.O
Quello che ti ho suggerito si può fare anche sui 34k, a patto che tu abbia i sorgenti (non ricordo onestamente se girassero gratuitamente). Senza di essi, potendo modificare SOLO quest, potresti provare l'accoppiata pc.get_wear(wear index) + item.remove()

Verifica solo se il get wear ti ritorna il vnum dell'ipotetico item indossato, in quel caso avendo il vnum devi selezionare l'item (ci sarà item.select_vnum o qualcosa del genere non ho nulla sotto mano per controllare) perchè per poter usare item.remove() si suppone che l'item in questione sia selezionato.

Se non trovi nessun modo di selezionare l'item, e vuoi comunque fare il tuo piccolo sistema puoi procedere ad esempio cosi:
Dai questi item speciali con vnum diversi (scegliti un set particolare fighissimo che dai solo li). All'uscita lanci un ciclo for del genere:
for i = 1, 90-180, 1 do (metti 90 o 180 a seconda di quanti inventari hai, sono i quadrettini da controllare)
[TAB]if item.select_cell(i) then
TAB TAB if item.get_vnum() == vnum arma or item.get_vnum() == vnum armatura e cosi via (ci sarebbero modi piu carini di fare sto check ma non voglio complicare troppo)
TAB TAB TAB item.remove()
TAB TAB TAB se vuoi qui metti un messaggio chat() per dire "ti è stato rimosso il tal item", un modo carino è "chat(string.format("Ti e' stato rimosso/a %s", item.get_name()))
TAB TAB end
TAB end
end -- a cosa servono i TAB? ordine

una volta svuotato l'inventario dagli item (se li avevano li) procedi con l'equip:
fai vari if che verifichino cosa indossa il pg -> if pc.get_wear(index con gli indici che ho messo nella prima risposta) == value item then
(nell'if devi mettere nell'index del wear ad esempio l'index dello slot arma che per esempio è 4 e a destra dell'operatore == metterai il value dell'arma evento; ovviamente ci saranno piu armi dovrai fare piu controlli)
se riconosce un value gli fai dire:
say("togliti l'item e trascinalo su di me")
return
else
pc.warp(e lo esci dalla mappa) -> quindi l'uscita deve passare per forza da qui NON deve esserci altro modo, così finche non trascineranno gli item sull'npc non potranno andarsene.

quindi farai un bel
when valuenpc.take begin
e qua metti i vari if con il value degli item da rimuovere:
if item.get_vnum() == uno degli item dell'evento then
item.remove()
say("Grazie per aver restituito l'item evento")
quando avranno restituito tutti gli item potranno parlare premendo il bottone chat di prima che faceva tutto il controllo dell'inventario per andarsene.

capisco che non sia facilissimo ma credo che questo sia il modo meno complicato per fare quello che hai chiesto senza toccare il sorgente (c'è una possibilità remota che si potesse selezionare l'item col value tornato da pc get wear e fare item.remove tutto automatico, ma mi sembra di aver capito che non mi seguivi granchè, quindi ho provato cosi.. fammi sapere se riesci, in caso negativo ti scrivo direttamente la quest ma almeno provaci prima)
ti ringrazio davvero per la guida dettagliata e faro buon uso di questi consigli, ma non ho le sorgenti purtroppo, provero ad arrangiarmi con il pc.get_wear o comunque con l item remove ;)
 
Stato
Discussione chiusa ad ulteriori risposte.