Ir para conteúdo
Venda da WebCheats - Uma Nova Era para a Comunidade ×
SORTEIO MENSAL - ChatGPT 5 Plus, GTA V, NETFLIX e muito mais. ×
  • Quem está por aqui   0 membros estão online

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

AJUDA CÓDIGO LOJINHA FANTASMA 7.59


combatrw
 Compartilhar

Posts Recomendados

Fala ae pessoal, recebi ajuda de um usuário aqui da WC para editar o código de lojinha fantasma na versão 7.59 (tipo a base do the new world), e sinto que ta quase lá. Consigo criar o boneco que fica de loja, porém não fica como loja clicável, apenas o coelhinho parado conforme print. Tenho a relação de códigos e vou postar aqui pra caso alguem se interesse e também quem possa me ajudar a entender o que eu estou errando, só comentando que além do código que Renanzim me passou eu consegui melhorar mais, ainda assim não foi suficiente. 

PRINT>> 

É necessário se cadastrar para acessar o conteúdo.


Exec_MSG_SendAutoTrade.cpp

#include "ProcessClientMessage.h"
#include "..\\Basedef.h"

void Exec_MSG_SendAutoTrade(int conn, char* pMsg)
{
    SendAutoTrade(conn, conn);

    if (conn <= 0 || conn >= MAX_USER)
        return;

    if (pUser[conn].Mode != USER_PLAY)
        return;

    MSG_SendAutoTrade* m = (MSG_SendAutoTrade*)pMsg;

    /* ===============================
       VALIDA SIZE DO PACKET
    =============================== */
    if (m->Size > sizeof(MSG_SendAutoTrade))
    {
        SendClientMessage(conn, "Erro ao abrir loja. Tente novamente.");
        return;
    }

    /* ===============================
       VALIDA ESTADO DO PLAYER
    =============================== */
    if (pMob[conn].MOB.CurrentScore.Hp <= 0)
    {
        SendHpMode(conn);
        RemoveTrade(conn);
        return;
    }

    if (pUser[conn].Trade.OpponentID)
    {
        RemoveTrade(pUser[conn].Trade.OpponentID);
        RemoveTrade(conn);
        return;
    }

    if (pUser[conn].TradeMode)
    {
        SendClientMessage(conn, g_pMessageStringTable[_NN_CantWhenAutoTrade]);
        return;
    }

    if (NewbieEventServer == 0)
    {
        SendClientMessage(conn, g_pMessageStringTable[_NN_NEWBIEEVENTSERVER]);
        return;
    }

    /* ===============================
       LIMITADOR DE LOJAS
    =============================== */
    if (pUser[conn].Ingame.Lojinha)
    {
        DeleteMob(MAX_MOB + conn, 2);
        pUser[conn].Ingame.Lojinha = 0;
        RemoveTrade(conn);
        SendClientMessage(conn, "Sua loja foi fechada.");
        return;
    }

    if (Limitadordelojinha(pUser[conn].MacAddress) >= 1)
    {
        SendClientMessage(conn, "Apenas 1 AutoLoja por máquina.");
        RemoveTrade(conn);
        return;
    }

    int sameIP = 0;
    for (int i = 0; i < MAX_USER; i++)
    {
        if (pUser.Mode != USER_PLAY)
            continue;

        if (!pUser.cSock.Sock)
            continue;

        if (pUser.Ingame.Lojinha &&
            pUser.IP == pUser[conn].IP)
            sameIP++;
    }

    if (sameIP >= 1)
    {
        SendClientMessage(conn, "Apenas 1 AutoLoja por IP.");
        RemoveTrade(conn);
        return;
    }

    /* ===============================
       VALIDA POSIÇÃO
    =============================== */
    int posX = pMob[conn].TargetX;
    int posY = pMob[conn].TargetY;

    int Village = BASE_GetVillage(posX, posY);

    if (Village < 0 || Village >= 5)
    {
        SendClientMessage(conn, g_pMessageStringTable[_NN_OnlyVillage]);
        RemoveTrade(conn);
        return;
    }

    if (posX >= 2123 && posX <= 2148 &&
        posY >= 2139 && posY <= 2157)
    {
        SendClientMessage(conn, g_pMessageStringTable[_NN_OnlyVillage]);
        RemoveTrade(conn);
        return;
    }

    /* ===============================
       VALIDA ITENS DA LOJA
    =============================== */
    bool hasItem = false;

    for (int i = 0; i < MAX_AUTOTRADE; i++)
    {
        if (m->Coin < 0 || m->Coin > 1999999999)
            return;

        if (m->Item.sIndex)
        {
            hasItem = true;

            if (!m->Coin)
                return;

            if (m->CarryPos < 0 || m->CarryPos >= MAX_CARGO)
                return;

            if (BASE_GetItemAbility(&m->Item, EF_NOTRADE))
            {
                SendClientMessage(conn, g_pMessageStringTable[_NN_Cant_MoveItem]);
                return;
            }

            if (memcmp(&pUser[conn].Cargo[m->CarryPos],
                &m->Item, sizeof(STRUCT_ITEM)))
            {
                RemoveTrade(conn);
                return;
            }
        }
    }

    if (!hasItem)
    {
        SendClientMessage(conn, "Necessário pelo menos um item.");
        return;
    }

    /* ===============================
       APLICA TAXA DA CIDADE
    =============================== */
    m->Tax = g_pGuildZone[Village].CityTax;

    m->Title[MAX_AUTOTRADETITLE - 1] = 0;
    m->Title[MAX_AUTOTRADETITLE - 2] = 0;

    /* ===============================
       SALVA AUTOTRADE NO USER
    =============================== */
    memcpy(&pUser[conn].AutoTrade, m, sizeof(MSG_SendAutoTrade));

    

    /* ===============================
       CRIA MOB DA LOJINHA
    =============================== */
    /* ===============================
    CRIA MOB DA LOJINHA
 =============================== */
    int mobid = CreateMobStore(
        "AutoStore",
        posX,
        posY,
        "npc",
        0,
        MAX_MOB + conn,
        conn
    );

    if (mobid <= 0)
    {
        SendClientMessage(conn, "Não foi possível abrir a loja.");
        return;
    }

    /* ===============================
       SALVA AUTOTRADE NO NPC
    =============================== */
    memcpy(&pMob[mobid].AutoTrade, m, sizeof(MSG_SendAutoTrade));

    pMob[mobid].TradeMode = 1;
    pMob[mobid].Leader = conn;
    pMob[mobid].IsSummon = 2;

    pUser[conn].Ingame.Lojinha = 1;
    pMob[conn].CheckLojinha = 600;


    if (mobid <= 0)
    {
        SendClientMessage(conn, "Não foi possível abrir a loja.");
        pUser[conn].Ingame.Lojinha = 0;
        pUser[conn].TradeMode = 0;
        return;
    }

    /* ===============================
       ENVIA PACOTE DE LOJA AO CLIENT
    =============================== */
    MSG_CreateMobTrade sm;
    memset(&sm, 0, sizeof(MSG_CreateMobTrade));

    sm.Score.Con = 0;

    GridMulticast(posX, posY, (MSG_STANDARD*)&sm, 0);

    /* ===============================
       FINALIZA
    =============================== */
    RemoveTrade2(conn);
    SendClientMessage(conn, "Sua AutoLoja foi aberta com sucesso!");
}


int CreateMobStore em GetFunc.cpp > 

 

int CreateMobStore(char* MobName, int PosX, int PosY, char* folder, int Type, int indexMob, int conn)
{
    int tmob = indexMob;

    if (tmob == 0)
    {
        char temp[1024];
        sprintf_s(temp, "err,no emptymob create %s", MobName);
        Log(temp, "-system", 0);
        return -1;
    }
    ReadMob(&pMob[tmob].MOB, "npc");

    strncpy(pMob[tmob].MOB.MobName, MobName, NAME_LENGTH);

    memset(&pMob[tmob].PartyList, 0, sizeof(pMob[tmob].PartyList));

    memcpy(&pMob[tmob].MOB, &pMob[conn].MOB, sizeof(STRUCT_MOB));

    strncpy(pMob[tmob].MOB.MobName, pMob[conn].MOB.MobName, NAME_LENGTH);
    pMob[tmob].MOB.MobName[NAME_LENGTH - 1] = 0;
    pMob[tmob].MOB.BaseScore.Merchant = 0;

    for (int i = 0; i < NAME_LENGTH; i++)
    {
        if (pMob[tmob].MOB.MobName == 95) // '_'
            pMob[tmob].MOB.MobName = 32; // espaço

        if (pMob[tmob].MOB.MobName == '@')
            pMob[tmob].MOB.MobName = 0;
    }

    memset(pMob[tmob].Affect, 0, sizeof(pMob[tmob].Affect));

    for (int i = 0; i < MAX_SEGMENT; i++)
    {
        if (pMob[tmob].MOB.Equip[0].sIndex != 220 &&
            pMob[tmob].MOB.Equip[0].sIndex != 219 &&
            pMob[tmob].MOB.Equip[0].sIndex != 358)
        {
            pMob[tmob].SegmentListX = PosX + rand() % 5 - 2;
            pMob[tmob].SegmentListY = PosY + rand() % 5 - 2;
        }
        else
        {
            pMob[tmob].SegmentListX = PosX;
            pMob[tmob].SegmentListY = PosY;
        }
    }


    if (pMob[tmob].MOB.Equip[0].sIndex == 220 || pMob[tmob].MOB.Equip[0].sIndex == 219)
    {
        if (pMob[tmob].MOB.Equip[0].sIndex == 219)
        {
            pMob[tmob].MOB.Guild = g_pGuildZone[4].ChargeGuild;
            pMob[tmob].MOB.GuildLevel = 0;
        }
    }
    pMob[tmob].MOB.Equip[0].sIndex = 230;
    pMob[tmob].MOB.Equip[6].sIndex = 0;
    pMob[tmob].MOB.Equip[7].sIndex = 0;
    pMob[tmob].MOB.Equip[14].sIndex = 0;
    pMob[tmob].MOB.BaseScore.Con = 400;
    pMob[tmob].GenerateIndex = -1;

    pMob[tmob].Formation = 0;

    pMob[tmob].RouteType = Type;
    pMob[tmob].Mode = 4;
    //pMob[tmob].TradeMode = 1;
    pMob[tmob].SegmentDirection = 0;
    pMob[tmob].IsSummon = 1;
    pMob[tmob].Leader = conn;   // dono da loja

    pMob[tmob].WaitSec = Type == 0 ? 10 : 40;
    pMob[tmob].LastTime = CurrentTime;
    pMob[tmob].Leader = 0;
    pMob[tmob].GetCurrentScore(tmob);
    pMob[tmob].MOB.CurrentScore.Hp = pMob[tmob].MOB.CurrentScore.MaxHp;

    if (NewbieEventServer && pMob[tmob].MOB.CurrentScore.Level < 120)
        pMob[tmob].MOB.CurrentScore.Hp = 3 * pMob[tmob].MOB.CurrentScore.Hp / 4;

    pMob[tmob].SegmentProgress = Type == 0 ? 0 : 4;

    memset(pMob[tmob].EnemyList, 0, sizeof(pMob[tmob].EnemyList));

    int px = pMob[tmob].SegmentListX[0];
    int py = pMob[tmob].SegmentListY[0];

    int mobslot = GetEmptyMobGrid(tmob, &px, &py);

    if (mobslot == 0)
    {
        char temp[1024];
        sprintf_s(temp, "err,No empty mobgrid:%s x:%d y:%d", MobName, px, py);
        Log(temp, "-system", 0);

        pMob[tmob].Mode = 0;
        pMob[tmob].MOB.MobName[0] = 0;
        strncpy(pMob[tmob].Tab, "#VEMPROROGUE", 26);
        pMob[tmob].GenerateIndex = indexMob;

        return -2;
    }

    pMob[tmob].SegmentX = px;
    pMob[tmob].TargetX = px;
    pMob[tmob].LastX = px;
    pMob[tmob].SegmentY = py;
    pMob[tmob].TargetY = py;
    pMob[tmob].LastY = py;

    int skillnum = pMob[tmob].MOB.BaseScore.MaxMp;

    if (skillnum)
    {
        SetAffect(tmob, skillnum, 30000, 200);
        SetTick(tmob, skillnum, 30000, 200);
    }

    MSG_CreateMob sm;
    memset(&sm, 0, sizeof(MSG_CreateMob));

    GetCreateMob(tmob, &sm);

    sm.CreateType |= 2;

    pMobGrid[py][px] = tmob;

    // === PARTE CRÍTICA PARA VIRAR LOJA ===
    pMob[tmob].IsSummon = 2;

    SendGridMob(conn);   // 🔥 seller / dono
    SendGridMob(tmob);   // 🔥 a própria loja

    pMob[tmob].IsSummon = 1;
    GridMulticast(px, py, (MSG_STANDARD*)&sm, 0);
    // ====================================

    return TRUE;

}

RemoveTrade2  em Server.cpp >
 

void RemoveTrade2(int conn)
{
    if (conn <= 0 || conn >= MAX_USER)
        return;

    if (pUser[conn].Mode != USER_PLAY)
        return;

    memset(&pUser[conn].Trade, 0, sizeof(MSG_Trade));

    for (int i = 0; i < MAX_TRADE; i++)
        pUser[conn].Trade.InvenPos = -1;


    SendClientSignal(conn, conn, 900);

    if (pUser[conn].TradeMode)
    {
        int posX = pMob[conn].TargetX;
        int posY = pMob[conn].TargetY;

        MSG_CreateMob sm;
        memset(&sm, 0, sizeof(MSG_CreateMob));

        GetCreateMob(conn, &sm);
        GridMulticast(posX, posY, (MSG_STANDARD*)&sm, 0);

        pUser[conn].TradeMode = 1;
    }
}


ainda tem getfunc.h , server.h mas só pra declarar as int no caso. Seja humilde  e me ajude por favor.
 

Editado por combatrw
Link para o comentário
Compartilhar em outros sites

Tem algumas coisas que podem afetar o que deseja fazer, não vi todo o código e desconheço o projeto, mas vou tentar.

 

Note que eu me afastei do jogos a muitos anos, desde que postei o código fonte do emulador.

1 - Limitação de IDs: Tudo que passa do ID 1000 é tratado como NPC ou MOB, se vc limita a 500 jogadores, as novas lojas podem funcionar como loja de jogador. Se passar do id 1000, imagino que possa fazer uma loja, mas a aparência e dados, devem ser como uma loja de NPC.

 

2 - Abrir loja com ID inexistente: Ao tentar abrir a loja de um id fake ( Jogador 2, fake 1002 ), pode não estar encontrando a loja corretamente, o pacote é enviado quando vc clica, mas não recebe retorno.

Coloque alguma forma de ver os dados trafegados entre servidor e cliente, veja o pacote 364 ( Spawn de MOBs no jogo ), se seu ID está correto. Quando o jogador clica no mob, veja se um pacote "abrir loja" é enviado.
Verifique Merchant do mob, se bate com o esperado.

Pelo print, não tem o balão de loja, pode ser o ID mesmo.

Link para o comentário
Compartilhar em outros sites

12 minutos atrás, 987987987 disse:

Tem algumas coisas que podem afetar o que deseja fazer, não vi todo o código e desconheço o projeto, mas vou tentar.

 

Note que eu me afastei do jogos a muitos anos, desde que postei o código fonte do emulador.

1 - Limitação de IDs: Tudo que passa do ID 1000 é tratado como NPC ou MOB, se vc limita a 500 jogadores, as novas lojas podem funcionar como loja de jogador. Se passar do id 1000, imagino que possa fazer uma loja, mas a aparência e dados, devem ser como uma loja de NPC.

 

2 - Abrir loja com ID inexistente: Ao tentar abrir a loja de um id fake ( Jogador 2, fake 1002 ), pode não estar encontrando a loja corretamente, o pacote é enviado quando vc clica, mas não recebe retorno.

Coloque alguma forma de ver os dados trafegados entre servidor e cliente, veja o pacote 364 ( Spawn de MOBs no jogo ), se seu ID está correto. Quando o jogador clica no mob, veja se um pacote "abrir loja" é enviado.
Verifique Merchant do mob, se bate com o esperado.

Pelo print, não tem o balão de loja, pode ser o ID mesmo.

Bom, agradeço a resposta, mas não entendo nada disso, vou mesmo assim tentar junto a IA uma solução baseado nessas coisas que me disse. 

Link para o comentário
Compartilhar em outros sites

A IA é boa para quem sabe o que está acontecendo, sugiro estudar primeiro a source. A IA deixa muita coisa errada, abre muitas brechas, é importante fazer sozinho primeiro para saber se a IA gerou algum código indesejado ( Llxo ).

Mas, tentando explicar melhor, o ID do MOB define o que ele é para o jogo. Tudo que tiver ID entre 1 - 999, é tratado como jogador, então uma loja "real" precisa ter um ID menos que 1000, se for maior, será tratado como NPC ou Monstro.

A parte do pacote, servidor e tal, é mais para depuração, não precisa fazer.

Olhando o código, achei alguns detalhes:

 

É necessário se cadastrar para acessar o conteúdo.


Leader é setado duas vezes, se isso ocorreu tão perto um do outro, deve ter muita coisa a mais que pode ser removida.

 

É necessário se cadastrar para acessar o conteúdo.


Merchant é o que define o que o mob "faz". Mudar o merchant significa que algo pode ser um NPC de loja, de teleporte/quest, de skills, de guerra, etc etc etc. Eu não lembro de cabeça, mas o merchant 0 definitivamente não é de loja.
Procure na source, se não tiver, procure na source do cliente ( TMProject ), ache a lista de Merchants, veja qual é a da loja/lojinha e altere o código para ter esse valor.
Sem o merchant correto, o mob não vai ser clicável, pode ser só um mob para ser atacado, mas por estar dentro da cidade, pode não ser possível.

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

×   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.