Postado Dezembro 7, 2020 4 anos 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. 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! Créditos: EddyHavoc Flatlander Kondrah Oen432 Editado Abril 28, 2021 4 anos por EddyHavoc (veja o histórico de edições)
Postado Abril 28, 2021 4 anos 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.
Postado Abril 28, 2021 4 anos 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.