Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
  • 0

NPC ENTREGANDO ITENS COM ADD


Fallem
 Compartilhar

Pergunta

Ola bom dia  alguém teria como me dizer como faço  para certo NPC entrar itens com add 

 

vo pega como exemplo o NPC Treinadora ( source Xwyd)

 

no NPC treinadora aparece o add correto que eu quero , mais quando eu compra certo item ele vem +0 sem add

 

 

 

 

cJx4xPb.png

 

 

 

 

#pragma region Recicladora troca 4
        if (npc->Mob.Inventory[packet->sellSlot].Index == 939) // Treinadora
        {
            if (userData->Ingame.LastClicked != packet->sellSlot)
            {
                userData->Ingame.LastClicked = packet->sellSlot;
                SendClientMessage(client, Language::instance().getStringFormat(ComporItem, pItem->Name));
                return true;
            }

            if (slot == -1)
            {
                SendClientMessage(client, "Seu inventário estar cheio.");
                return true;
            }

            if (Andarilho == 3467)
                Loop += 15;

            if (Andarilho_2 == 3467)
                Loop += 15;

            int amount = 0;

            for (int i = 0; i < Loop; i++)
            {
                if (mob->Mob.Inventory.Index == 524 && amount <= 1)
                    amount += Func::GetItemAmount(&mob->Mob.Inventory);
            }

            if (amount < 1)
            {
                SendClientMessage(client, "Estar faltando algum item.");
                return true;
            }

            if (amount > 1)
                amount = 1;

            for (int i = 0; i < amount; i++)
            {
                int slot = Func::GetFirstSlot(client, SlotType::Inventory, 524);
                Func::AmountMinus(&mob->Mob.Inventory[slot]);
                SendItem(client, (uint16_t)SlotType::Inventory, slot, &mob->Mob.Inventory[slot]);
            }


            STRUCT_ITEM itemSend = { 939, 43 , 9 , 0 , 0 ,0 , 0 };
            PutItem(client, &itemSend);
            SendEtc(client);
            return true;

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
53 minutos atrás, Fallem disse:

você teria esse Hook da  coreção , ou  sabe de alguma source que tenha "

geralmente tem na MW...

Precisa de ajuda?
Fale comigo.
Discord: sc2allin

Link para o comentário
Compartilhar em outros sites

  • 0

outra dúvida .... alguém poderia me explicar como funcinar esse  código  , peguei a source XWYD para estudos . porem  quando eu registro a pista +0  entrar normal

mais quando eu mato os lich nao refina a pista.     . se alguém souber e tiver como ajuda eu ficaria muito grato  meu discord:  SpanFrank#7748  pode  pode me chama no PV tbm . obg

 

na source XWYD nao achei 

 

STRUCT_ITEM NextPista;
                                        memset(&NextPista, 0, sizeof(STRUCT_ITEM));

                                        NextPista.sIndex = 5134;
                                        NextPista.stEffect[0].cEffect = 43;
                                        NextPista.stEffect[0].cValue = 1;

 

 

 

 

#nesse código aki nao achei onde fala da refinação da pista  #  estou começando a estuda esse contéudo 

 

 

namespace ClueLevel
{

    Lich::Lich()
    {
    }
    Lich::~Lich()
    {
    }

    bool Lich::onGroupRegistered(const uint16_t masterId)
    {
        if (getGroupCount() > 1)
            return false;

        bool containsGroup = false;

        foreachGroup([&containsGroup, &masterId](uint16_t otherGroup) {
            if (otherGroup == masterId)
                containsGroup = true;
        });
        if (containsGroup)
            return false;

        addGroup(masterId);
        return true;
    }

    void Lich::onClueReset()
    {
        if (getGroupCount() == 0)
            return;

        for (int client = 0; client < MAX_USER; client++)
        {
            auto user = Func::GetUserFromIndex(client);
            auto mob = GetMobFromIndex(client);

            auto play = Func::getPlayerinArea({ 3330, 1600 }, { 3451, 1661 });

            if (play.size() > 0)
            {
                for (auto& i : play)
                    DoTeleport(i, 3284 + rand() % 2, 1685 + rand() % 2, 0);
            }
            
            auto play2 = Func::getPlayerinArea({ 3330, 1600 }, { 3451, 1661 });

            if (play2.size() > 0)
            {
                for (auto& i : play2)
                    DoTeleport(i, 3284 + rand() % 2, 1685 + rand() % 2, 0);
            }


        }
        resetGroups();
        killLichAll(true);
    }

    void Lich::onClueStart()
    {
        if (getGroupCount() == 0)
            return;

        uint8_t idx = 0;

        foreachGroup([&idx](uint16_t masterId) {
            
            auto userData = &Global::userData[masterId];

            if (idx == 0)
                Func::partyTeleportUxmal(masterId, 3347, 1605, 0);
            //Func::executeForParty(masterId, [&idx](uint16_t member){DoTeleport(member, 3347, 1605, 0); });
            else
                Func::partyTeleportUxmal(masterId, 3406, 1605, 0);
            //Func::executeForParty(masterId, [&idx](uint16_t member){DoTeleport(member, 3406, 1605, 0); });

            Logs::sendLog(Global::pistalog, "[Enter] -> Grupo do %s Entrou na Pista de Lich.", GetMobFromIndex(masterId)->Mob.Name);

            idx++;
        });

        Logs::sendLog(Global::pistalog, "[GroupCounter] -> Número de Grupo Registrado na Pista de Lich %d", getGroupCount());

        spawnLichEsq();
        spawnLichDir();
    }

    bool Lich::onMobKilled(const uint16_t masterId, const uint16_t mobId)
    {
        bool containsGroup = false;

        auto mob = GetMobFromIndex(mobId);
        auto play = GetMobFromIndex(masterId);
        auto rnd = Rnd::instance().IRandomX(0, 100);

        if (!strcmp(mob->Mob.Name, "Lich Infernal"))
        {
            if (rnd >= 25 && rnd <= 32)
            {
                Func::executeForParty(masterId, [](int32_t member) {

                    STRUCT_ITEM runas[5] = {
                        { 5110, 0, 0, 0, 0, 0, 0 },
                        { 5112, 0, 0, 0, 0, 0, 0 },
                        { 5115, 0, 0, 0, 0, 0, 0 },
                        { 5113, 0, 0, 0, 0, 0, 0 },
                        { 5111, 0, 0, 0, 0, 0, 0 },
                    };

                    if (Func::checkPlayerLiveInArea(member, { 3330, 1600 }, { 3451, 1661 }) == TRUE) PutItem(member, &runas[rand() % 5]);

                });

                Func::sendPistaLider(masterId, { 3330, 1600 }, { 3451, 1661 }, 1);
                Logs::sendLog(Global::pistalog, "[Winner] -> Grupo do %s ganhou a pista de Lich lado Direito.", play->Mob.Name);

                killLichAll(true);
                return true;
            }
            killLichEsq(true);
            spawnLichEsq();
            return false;
        }

        if (!strcmp(mob->Mob.Name, "Lich Infernal "))
        {
            if (rnd >= 25 && rnd <= 32)
            {
                Func::executeForParty(masterId, [](int32_t member) {

                    STRUCT_ITEM runas[5] = {
                        { 5110, 0, 0, 0, 0, 0, 0 },
                        { 5112, 0, 0, 0, 0, 0, 0 },
                        { 5115, 0, 0, 0, 0, 0, 0 },
                        { 5113, 0, 0, 0, 0, 0, 0 },
                        { 5111, 0, 0, 0, 0, 0, 0 },
                    };

                    if (Func::checkPlayerLiveInArea(member, { 3330, 1600 }, { 3451, 1661 }) == TRUE) PutItem(member, &runas[rand() % 5]);

                });
                Func::sendPistaLider(masterId, { 3330, 1600 }, { 3451, 1661 }, 1);

                Logs::sendLog(Global::pistalog, "[Winner] -> Grupo do %s ganhou a pista de Lich lado Esquerdo.", play->Mob.Name);
                killLichAll(true);
                return true;
            }
            killLichDir(true);
            spawnLichDir();
            return false;
        }
        return false;
    }

    bool Lich::onMovimented(const uint16_t masterId, const uint16_t destX, const uint16_t destY)
    {
        bool containsGroup = false;

        return true;
    }

    void Lich::killLichEsq(bool updatePlayerSight)
    {
        auto liveMobs = Func::getMobsInAreaStr({ 3330, 1600 }, { 3390, 1656 }, { 2566 });
        for (auto& i : liveMobs)
        {
            pMob.Mob.BaseStatus.curHP = 0;
            MobKilled(i, i, 0, 0);
        }
    }

    void Lich::killLichDir(bool updatePlayerSight)
    {
        auto liveMobs = Func::getMobsInAreaStr({ 3388, 1601 }, { 3451, 1656 }, { 2566 });
        for (auto& i : liveMobs)
        {
            pMob.Mob.BaseStatus.curHP = 0;
            MobKilled(i, i, 0, 0);
        }
    }

    void Lich::killLichAll(bool updatePlayerSight)
    {
        // 3451 1645
        auto liveMobs = Func::getMobsInAreaStr({ 3330, 1600 }, { 3451, 1656 }, { 2566 });
        for (auto& i : liveMobs)
        {
            pMob.Mob.BaseStatus.curHP = 0;
            MobKilled(i, i, 0, 0);
        }
    }

    void Lich::spawnLichEsq()
    {
        static const STRUCT_POSITION spawn_pos[3] =
        {
            { 3368, 1634 }, { 3357, 1621 }, { 3355, 1637 },
        };

        auto rnd = Rnd::instance().IRandomX(0, 2);

        for (auto x = 0; x < 7; x++)// esse loop faz a quantidade de Lich
            CreateMob("Lich_Infernal", spawn_pos[rnd].X, spawn_pos[rnd].Y, "clue_of_runes/Lich", 0); // Lado Esquerdo

    }

    void Lich::spawnLichDir()
    {
        static const STRUCT_POSITION spawn_pos[3] =
        {
            { 3423, 1632 }, { 3413, 1623 }, { 3411, 1632 },

        };

        auto rnd = Rnd::instance().IRandomX(0, 2);

        for (auto x = 0; x < 7; x++)// esse loop faz a quantidade de Lich
            CreateMob("Lich_Infernal_", spawn_pos[rnd].X, spawn_pos[rnd].Y, "clue_of_runes/Lich", 0); // Lado Direito

    }

    void Lich::onSpawnBoss()
    {

    }

    void Lich::onPlayerTimer()
    {
    }

} // end namespace ClueLevel

Link para o comentário
Compartilhar em outros sites

  • 0
22 horas atrás, Fallem disse:

outra dúvida .... alguém poderia me explicar como funcinar esse  código  , peguei a source XWYD para estudos . porem  quando eu registro a pista +0  entrar normal

mais quando eu mato os lich nao refina a pista.     . se alguém souber e tiver como ajuda eu ficaria muito grato  meu discord:  SpanFrank#7748  pode  pode me chama no PV tbm . obg

 

na source XWYD nao achei 

 

STRUCT_ITEM NextPista;
                                        memset(&NextPista, 0, sizeof(STRUCT_ITEM));

                                        NextPista.sIndex = 5134;
                                        NextPista.stEffect[0].cEffect = 43;
                                        NextPista.stEffect[0].cValue = 1;

 

 

 

 

#nesse código aki nao achei onde fala da refinação da pista  #  estou começando a estuda esse contéudo 

 

 

namespace ClueLevel
{

    Lich::Lich()
    {
    }
    Lich::~Lich()
    {
    }

    bool Lich::onGroupRegistered(const uint16_t masterId)
    {
        if (getGroupCount() > 1)
            return false;

        bool containsGroup = false;

        foreachGroup([&containsGroup, &masterId](uint16_t otherGroup) {
            if (otherGroup == masterId)
                containsGroup = true;
        });
        if (containsGroup)
            return false;

        addGroup(masterId);
        return true;
    }

    void Lich::onClueReset()
    {
        if (getGroupCount() == 0)
            return;

        for (int client = 0; client < MAX_USER; client++)
        {
            auto user = Func::GetUserFromIndex(client);
            auto mob = GetMobFromIndex(client);

            auto play = Func::getPlayerinArea({ 3330, 1600 }, { 3451, 1661 });

            if (play.size() > 0)
            {
                for (auto& i : play)
                    DoTeleport(i, 3284 + rand() % 2, 1685 + rand() % 2, 0);
            }
            
            auto play2 = Func::getPlayerinArea({ 3330, 1600 }, { 3451, 1661 });

            if (play2.size() > 0)
            {
                for (auto& i : play2)
                    DoTeleport(i, 3284 + rand() % 2, 1685 + rand() % 2, 0);
            }


        }
        resetGroups();
        killLichAll(true);
    }

    void Lich::onClueStart()
    {
        if (getGroupCount() == 0)
            return;

        uint8_t idx = 0;

        foreachGroup([&idx](uint16_t masterId) {
            
            auto userData = &Global::userData[masterId];

            if (idx == 0)
                Func::partyTeleportUxmal(masterId, 3347, 1605, 0);
            //Func::executeForParty(masterId, [&idx](uint16_t member){DoTeleport(member, 3347, 1605, 0); });
            else
                Func::partyTeleportUxmal(masterId, 3406, 1605, 0);
            //Func::executeForParty(masterId, [&idx](uint16_t member){DoTeleport(member, 3406, 1605, 0); });

            Logs::sendLog(Global::pistalog, "[Enter] -> Grupo do %s Entrou na Pista de Lich.", GetMobFromIndex(masterId)->Mob.Name);

            idx++;
        });

        Logs::sendLog(Global::pistalog, "[GroupCounter] -> Número de Grupo Registrado na Pista de Lich %d", getGroupCount());

        spawnLichEsq();
        spawnLichDir();
    }

    bool Lich::onMobKilled(const uint16_t masterId, const uint16_t mobId)
    {
        bool containsGroup = false;

        auto mob = GetMobFromIndex(mobId);
        auto play = GetMobFromIndex(masterId);
        auto rnd = Rnd::instance().IRandomX(0, 100);

        if (!strcmp(mob->Mob.Name, "Lich Infernal"))
        {
            if (rnd >= 25 && rnd <= 32)
            {
                Func::executeForParty(masterId, [](int32_t member) {

                    STRUCT_ITEM runas[5] = {
                        { 5110, 0, 0, 0, 0, 0, 0 },
                        { 5112, 0, 0, 0, 0, 0, 0 },
                        { 5115, 0, 0, 0, 0, 0, 0 },
                        { 5113, 0, 0, 0, 0, 0, 0 },
                        { 5111, 0, 0, 0, 0, 0, 0 },
                    };

                    if (Func::checkPlayerLiveInArea(member, { 3330, 1600 }, { 3451, 1661 }) == TRUE) PutItem(member, &runas[rand() % 5]);

                });

                Func::sendPistaLider(masterId, { 3330, 1600 }, { 3451, 1661 }, 1);
                Logs::sendLog(Global::pistalog, "[Winner] -> Grupo do %s ganhou a pista de Lich lado Direito.", play->Mob.Name);

                killLichAll(true);
                return true;
            }
            killLichEsq(true);
            spawnLichEsq();
            return false;
        }

        if (!strcmp(mob->Mob.Name, "Lich Infernal "))
        {
            if (rnd >= 25 && rnd <= 32)
            {
                Func::executeForParty(masterId, [](int32_t member) {

                    STRUCT_ITEM runas[5] = {
                        { 5110, 0, 0, 0, 0, 0, 0 },
                        { 5112, 0, 0, 0, 0, 0, 0 },
                        { 5115, 0, 0, 0, 0, 0, 0 },
                        { 5113, 0, 0, 0, 0, 0, 0 },
                        { 5111, 0, 0, 0, 0, 0, 0 },
                    };

                    if (Func::checkPlayerLiveInArea(member, { 3330, 1600 }, { 3451, 1661 }) == TRUE) PutItem(member, &runas[rand() % 5]);

                });
                Func::sendPistaLider(masterId, { 3330, 1600 }, { 3451, 1661 }, 1);

                Logs::sendLog(Global::pistalog, "[Winner] -> Grupo do %s ganhou a pista de Lich lado Esquerdo.", play->Mob.Name);
                killLichAll(true);
                return true;
            }
            killLichDir(true);
            spawnLichDir();
            return false;
        }
        return false;
    }

    bool Lich::onMovimented(const uint16_t masterId, const uint16_t destX, const uint16_t destY)
    {
        bool containsGroup = false;

        return true;
    }

    void Lich::killLichEsq(bool updatePlayerSight)
    {
        auto liveMobs = Func::getMobsInAreaStr({ 3330, 1600 }, { 3390, 1656 }, { 2566 });
        for (auto& i : liveMobs)
        {
            pMob.Mob.BaseStatus.curHP = 0;
            MobKilled(i, i, 0, 0);
        }
    }

    void Lich::killLichDir(bool updatePlayerSight)
    {
        auto liveMobs = Func::getMobsInAreaStr({ 3388, 1601 }, { 3451, 1656 }, { 2566 });
        for (auto& i : liveMobs)
        {
            pMob.Mob.BaseStatus.curHP = 0;
            MobKilled(i, i, 0, 0);
        }
    }

    void Lich::killLichAll(bool updatePlayerSight)
    {
        // 3451 1645
        auto liveMobs = Func::getMobsInAreaStr({ 3330, 1600 }, { 3451, 1656 }, { 2566 });
        for (auto& i : liveMobs)
        {
            pMob.Mob.BaseStatus.curHP = 0;
            MobKilled(i, i, 0, 0);
        }
    }

    void Lich::spawnLichEsq()
    {
        static const STRUCT_POSITION spawn_pos[3] =
        {
            { 3368, 1634 }, { 3357, 1621 }, { 3355, 1637 },
        };

        auto rnd = Rnd::instance().IRandomX(0, 2);

        for (auto x = 0; x < 7; x++)// esse loop faz a quantidade de Lich
            CreateMob("Lich_Infernal", spawn_pos[rnd].X, spawn_pos[rnd].Y, "clue_of_runes/Lich", 0); // Lado Esquerdo

    }

    void Lich::spawnLichDir()
    {
        static const STRUCT_POSITION spawn_pos[3] =
        {
            { 3423, 1632 }, { 3413, 1623 }, { 3411, 1632 },

        };

        auto rnd = Rnd::instance().IRandomX(0, 2);

        for (auto x = 0; x < 7; x++)// esse loop faz a quantidade de Lich
            CreateMob("Lich_Infernal_", spawn_pos[rnd].X, spawn_pos[rnd].Y, "clue_of_runes/Lich", 0); // Lado Direito

    }

    void Lich::onSpawnBoss()
    {

    }

    void Lich::onPlayerTimer()
    {
    }

} // end namespace ClueLevel

 

Da uma olhada na source do Blast mano, essa do XWYD ta complicado... tem muita coisa bugada.

Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.