Ir para conteúdo

Featured Replies

Postado

 

Descrição: Com estas alterações nas sources do servidor e do OTC você conseguirá adicionar ao jogo uma barra de carregamento nas criaturas do jogo. Esta barra é personalizável e pode ser utilizada de diversas formas em diferentes scripts.

separador.png

Server sources.

No arquivo game.h

Abaixo de:

Spoiler



bool reload(ReloadTypes_t reloadType);

 

Adicione:

Spoiler



void startProgressbar(Creature* creature, uint32_t duration, bool ltr = true);

 

 

No arquivo game.cpp

Adicione:

Spoiler




void Game::startProgressbar(Creature* creature, uint32_t duration, bool ltr)
{
    SpectatorVec spectators;
    map.getSpectators(spectators, creature->getPosition(), false, true);
    for (Creature* spectator : spectators) {
        if (Player* tmpPlayer = spectator->getPlayer()) {
            tmpPlayer->sendProgressbar(creature->getID(), duration, ltr);
        }
    }
}

 

 

No arquivo luascript.h

Abaixo de:

Spoiler



static int luaCreatureGetZone(lua_State* L);

 

Adicione:

Spoiler



static int luaCreatureSetProgressbar(lua_State* L);

 

 

No arquivo luascript.cpp

Abaixo de:

Spoiler



	registerMethod("Creature", "getZone", LuaScriptInterface::luaCreatureGetZone)

 

Adicione:

Spoiler

 




	registerMethod("Creature", "sendProgressbar", LuaScriptInterface::luaCreatureSetProgressbar);

Abaixo de:

Spoiler

 





int LuaScriptInterface::luaCreatureGetZone(lua_State* L)
{
	// creature:getZone()
	Creature* creature = getUserdata<Creature>(L, 1);
	if (creature) {
		lua_pushnumber(L, creature->getZone());
	} else {
		lua_pushnil(L);
	}
	return 1;
}

Adicione:

Spoiler




int LuaScriptInterface::luaCreatureSetProgressbar(lua_State* L)
{
    // creature:sendProgressbar(duration, leftToRight)
    Creature* creature = getUserdata<Creature>(L, 1);
    uint32_t duration = getNumber<uint32_t>(L, 2);
    bool ltr = getBoolean(L, 3);
    if (creature) {
        g_game.startProgressbar(creature, duration, ltr);
        pushBoolean(L, true);
    }
    else {
        lua_pushnil(L);
    }

    return 1;
}

 

 

No arquivo player.h

Abaixo de:

Spoiler




		void sendNetworkMessage(const NetworkMessage& message) {
			if (client) {
				client->writeToOutputBuffer(message);
			}
		}

 

Adicione:

Spoiler




		void sendProgressbar(uint32_t id, uint32_t duration, bool ltr = true) {
            if (client) {
                client->sendProgressbar(id, duration, ltr);
            }
        }

 

 

No arquivo protocolgame.h

Abaixo de:

Spoiler



void sendModalWindow(const ModalWindow& modalWindow);

 

Adicione:

Spoiler



void sendProgressbar(uint32_t id, uint32_t duration, bool ltr = true);

 

 

No arquivo protocolgame.cpp

No final do arquivo adicione:

Spoiler




void ProtocolGame::sendProgressbar(uint32_t id, uint32_t duration, bool ltr)
{
    NetworkMessage msg;
    msg.addByte(0x3b);
    msg.add<uint32_t>(id);
    msg.add<uint32_t>(duration);
    msg.addByte(ltr);
    writeToOutputBuffer(msg);
}

 

 

Client sources.

No arquivo protocolcodes.cpp

Abaixo de:

Spoiler



        GameServerExtendedOpcode            = 50,

 

Adicione:

Spoiler



		GameServerProgressBar               = 59,

 

 

No arquivo protocolgame.h

Abaixo de:

Spoiler



    void parseChangeMapAwareRange(const InputMessagePtr& msg);

 

Adicione:

Spoiler



	void parseProgressBar(const InputMessagePtr& msg);

 

 

No arquivo protocolgameparse.cpp

Abaixo de:

Spoiler



            case Proto::GameServerChangeMapAwareRange:
                parseChangeMapAwareRange(msg);
                break;

 

Adicione:

Spoiler




			case Proto::GameServerProgressBar:
                parseProgressBar(msg);
                break;

 

Abaixo de:

Spoiler




void ProtocolGame::parseChangeMapAwareRange(const InputMessagePtr& msg)
{
    int xrange = msg->getU8();
    int yrange = msg->getU8();

    AwareRange range;
    range.left = xrange/2 - ((xrange+1) % 2);
    range.right = xrange/2;
    range.top = yrange/2 - ((yrange+1) % 2);
    range.bottom = yrange/2;

    g_map.setAwareRange(range);
    g_lua.callGlobalField("g_game", "onMapChangeAwareRange", xrange, yrange);
}

 

Adicione:

Spoiler

 





void ProtocolGame::parseProgressBar(const InputMessagePtr& msg)
{
    uint32 id = msg->getU32();
    uint32 duration = msg->getU32();
    bool ltr = msg->getU8();
    CreaturePtr creature = g_map.getCreatureById(id);
    if (creature)
        creature->setProgressBar(duration, ltr);
    else
        g_logger.traceError(stdext::format("could not get creature with id %d", id));
}

 

No arquivo creature.h

Abaixo de:

Spoiler




    virtual void onPositionChange(const Position& newPos, const Position& oldPos);
    virtual void onAppear();
    virtual void onDisappear();
    virtual void onDeath();

 

Adicione:

Spoiler




    // progress bar
    uint8 getProgressBarPercent() { return m_progressBarPercent; }
    void setProgressBar(uint32 duration, bool ltr);
    void updateProgressBar(uint32 duration, bool ltr);

 

Abaixo de:

Spoiler

 





    // jump related
    float m_jumpHeight;
    float m_jumpDuration;
    PointF m_jumpOffset;
    Timer m_jumpTimer;

Adicione:

Spoiler

 





    // progress bar
    uint8 m_progressBarPercent;
    ScheduledEventPtr m_progressBarUpdateEvent;
    Timer m_progressBarTimer;

 

No arquivo creature.cpp

Abaixo de:

Spoiler

 





    m_outfitColor = Color::white;

Adicione:

Spoiler




	m_progressBarPercent = 0;
    m_progressBarUpdateEvent = nullptr;

 

Substitua o código abaixo:

 

Spoiler




    // draw
    if(g_game.getFeature(Otc::GameBlueNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray)
        fillColor = Color(0x66, 0xcc, 0xff);

    if(drawFlags & Otc::DrawBars && (!isNpc() || !g_game.getFeature(Otc::GameHideNpcNames))) {
        g_painter->setColor(Color::black);
        g_painter->drawFilledRect(backgroundRect);

        g_painter->setColor(fillColor);
        g_painter->drawFilledRect(healthRect);

        if(drawFlags & Otc::DrawManaBar && isLocalPlayer()) {
            LocalPlayerPtr player = g_game.getLocalPlayer();
            if(player) {
                backgroundRect.moveTop(backgroundRect.bottom());

                g_painter->setColor(Color::black);
                g_painter->drawFilledRect(backgroundRect);

                Rect manaRect = backgroundRect.expanded(-1);
                double maxMana = player->getMaxMana();
                if(maxMana == 0) {
                    manaRect.setWidth(25);
                } else {
                    manaRect.setWidth(player->getMana() / (maxMana * 1.0) * 25);
                }

                g_painter->setColor(Color::blue);
                g_painter->drawFilledRect(manaRect);
            }
        }
    }

 

Por este código:

Spoiler




    // draw
    if(g_game.getFeature(Otc::GameBlueNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray)
        fillColor = Color(0x66, 0xcc, 0xff);

    if(drawFlags & Otc::DrawBars && (!isNpc() || !g_game.getFeature(Otc::GameHideNpcNames))) {
        g_painter->setColor(Color::black);
        g_painter->drawFilledRect(backgroundRect);

        g_painter->setColor(fillColor);
        g_painter->drawFilledRect(healthRect);

        if(drawFlags & Otc::DrawManaBar && isLocalPlayer()) {
            LocalPlayerPtr player = g_game.getLocalPlayer();
            if(player) {
                backgroundRect.moveTop(backgroundRect.bottom());

                g_painter->setColor(Color::black);
                g_painter->drawFilledRect(backgroundRect);

                Rect manaRect = backgroundRect.expanded(-1);
                double maxMana = player->getMaxMana();
                if(maxMana == 0) {
                    manaRect.setWidth(25);
                } else {
                    manaRect.setWidth(player->getMana() / (maxMana * 1.0) * 25);
                }

                g_painter->setColor(Color::blue);
                g_painter->drawFilledRect(manaRect);
            }
        }
		
		if (getProgressBarPercent()) {
            backgroundRect.moveTop(backgroundRect.bottom());

			g_painter->setColor(Color::black);
            g_painter->drawFilledRect(backgroundRect);
            //g_drawQueue->addFilledRect(backgroundRect, Color::black);

            Rect progressBarRect = backgroundRect.expanded(-1);
            double maxBar = 100;
            progressBarRect.setWidth(getProgressBarPercent() / (maxBar * 1.0) * 25);

			g_painter->setColor(Color::white);
            g_painter->drawFilledRect(progressBarRect);
            //g_drawQueue->addFilledRect(progressBarRect, Color::white);
		}
    }

 

 

E ainda no arquivo creature.cpp no final da página adicione:

Spoiler




void Creature::setProgressBar(uint32 duration, bool ltr)
{
    if (m_progressBarUpdateEvent) {
        m_progressBarUpdateEvent->cancel();
        m_progressBarUpdateEvent = nullptr;
    }

    if (duration > 0) {
        m_progressBarTimer.restart();
        updateProgressBar(duration, ltr);
    } else
        m_progressBarPercent = 0;

    callLuaField("onProgressBarStart", duration, ltr);
}

void Creature::updateProgressBar(uint32 duration, bool ltr)
{
    if (m_progressBarTimer.ticksElapsed() < duration) {
        if (ltr)
            m_progressBarPercent = abs(m_progressBarTimer.ticksElapsed() / static_cast<double>(duration) * 100);
        else
            m_progressBarPercent = abs((m_progressBarTimer.ticksElapsed() / static_cast<double>(duration) * 100) - 100);

        auto self = static_self_cast<Creature>();
        m_progressBarUpdateEvent = g_dispatcher.scheduleEvent([=] {
            self->updateProgressBar(duration, ltr);
        }, 50);
    } else {
        m_progressBarPercent = 0;
    }
    callLuaField("onProgressBarUpdate", m_progressBarPercent, duration, ltr);
}

 

 

 

Fim! Estas são todas as alterações! 

separador.png

Créditos:

EddyHavoc

Flatlander

Kondrah
Oen432

 

Editado por EddyHavoc (veja o histórico de edições)

  • 4 months later...
Postado

Muito dahora este tutorial Eddy, apenas lembrando que o mesmo foi feito pelo oen432, o mesmo pode ser visto no fórum gringo.

O Kondrah apenas adicionou o suporte pra ele no otcv8 2.6.

# Regras Gerais - TibiaKing.com #
Contato: [email protected]
Não respondo dúvidas via MP.


1C2tu.png4Tlqo.png1C2tu.png


 

Postado
  • Autor
3 horas atrás, Augusto disse:

Muito dahora este tutorial Eddy, apenas lembrando que o mesmo foi feito pelo oen432, o mesmo pode ser visto no fórum gringo.

O Kondrah apenas adicionou o suporte pra ele no otcv8 2.6.

 

Valeu pelo comentário @Augusto o Oen432 é um Monstro no OTC! Acredito que ele e o Reddington são atualmente os melhores na área. Adicionei os créditos a postagem. Muito obrigado por avisar.

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

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

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo