Guest Rappa Carnaúba #1 Posted December 3, 2006 Olá galerinha decidi liberar a hotkeys, não fui eu que a desenvolvi completamente mais sim o 'Black Demon' eu fiz modificações para que ela funcionasse na mais nova cvs que é a revbattle sys(revisão do sistema de batalha) Vamos começar a colocar o code. em game.cpp Troque a funcão: bool Game::playerUseItemEx(Player* player, const Position& fromPos, uint8_t fromStackPos, uint16_t fromSpriteId, const Position& toPos, uint8_t toStackPos, uint16_t toSpriteId){ OTSYS_THREAD_LOCK_CLASS lockClass(gameLock, "Game::playerUseItemEx()"); if(player->isRemoved()) return false; ReturnValue ret = RET_NOERROR; if((ret = Actions::canUse(player, fromPos)) != RET_NOERROR){ player->sendCancelMessage(ret); return false; } Thing* thing = internalGetThing(player, fromPos, fromStackPos); if(!thing){ player->sendCancelMessage(RET_NOTPOSSIBLE); return false; } Item* item = thing->getItem(); if(!item || item->getClientID() != fromSpriteId || !item->isUseable()){ player->sendCancelMessage(RET_CANNOTUSETHISOBJECT); return false; } return internalUseItemEx(player, fromPos, item, toPos, toStackPos, toSpriteId);} Por esta funcão: bool Game::playerUseItemEx(Player* player, const Position& fromPos, uint8_t fromStackPos, uint16_t fromSpriteId, const Position& toPos, uint8_t toStackPos, uint16_t toSpriteId){ OTSYS_THREAD_LOCK_CLASS lockClass(gameLock, "Game::playerUseItemEx()"); if(player->isRemoved()) return false; ReturnValue ret = RET_NOERROR; if((ret = Actions::canUse(player, fromPos)) != RET_NOERROR){ player->sendCancelMessage(ret); return false; } Item* item = dynamic_cast<Item*>(internalGetThing(player, fromPos, fromStackPos)); player->usedHotkey = false; if(!item && fromPos == Position(0xFFFF, 0, 0)){ item = player->getHotkeyItem(fromSpriteId, fromStackPos); if(!item){ player->sendCancelMessage(RET_NOERROR); return false; } Cylinder* cylinder = item->getParent(); if(cylinder == NULL){ return false; } fromStackPos = cylinder->__getIndexOfThing(item); player->usedHotkey = true; } if(!item || item->getClientID() != fromSpriteId || !item->isUseable()){ player->sendCancelMessage(RET_CANNOTUSETHISOBJECT); return false; } return internalUseItemEx(player, fromPos, item, toPos, toStackPos, toSpriteId);} Agora troque essa funcão bool Game::playerUseBattleWindow(Player* player, const Position& fromPos, uint8_t fromStackPos, uint32_t creatureId, uint16_t spriteId){ OTSYS_THREAD_LOCK_CLASS lockClass(gameLock, "Game::playerUseBattleWindow"); if(player->isRemoved()) return false; Creature* creature = getCreatureByID(creatureId); if(!creature){ return false; } if(!Position::areInRange<7,5,0>(creature->getPosition(), player->getPosition())){ return false; } if(creature->getPlayer()){ player->sendCancelMessage(RET_DIRECTPLAYERSHOOT); return false; } ReturnValue ret = RET_NOERROR; if((ret = Actions::canUse(player, fromPos)) != RET_NOERROR){ player->sendCancelMessage(ret); return false; } Thing* thing = internalGetThing(player, fromPos, STACKPOS_USE); if(!thing){ return false; } Item* item = thing->getItem(); if(!item){ player->sendCancelMessage(RET_CANNOTUSETHISOBJECT); return false; } return internalUseItemEx(player, fromPos, item, creature->getPosition(), 0, 0);} Por esta funcão: bool Game::playerUseBattleWindow(Player* player, const Position& fromPos, uint8_t fromStackPos, uint32_t creatureId, uint16_t spriteId){ OTSYS_THREAD_LOCK_CLASS lockClass(gameLock, "Game::playerUseBattleWindow"); if(player->isRemoved()) return false; Creature* creature = getCreatureByID(creatureId); if(!creature){ return false; } if(!Position::areInRange<7,5,0>(creature->getPosition(), player->getPosition())){ return false; } if(creature->getPlayer()){ player->sendCancelMessage(RET_DIRECTPLAYERSHOOT); return false; } ReturnValue ret = RET_NOERROR; if((ret = Actions::canUse(player, fromPos)) != RET_NOERROR){ player->sendCancelMessage(ret); return false; } Item* item = dynamic_cast<Item*>(internalGetThing(player, fromPos, STACKPOS_USE)); player->usedHotkey = false; if(!item && fromPos == Position(0xFFFF, 0, 0)){ item = player->getHotkeyItem(spriteId, fromStackPos); if(!item){ player->sendCancelMessage(RET_NOERROR); return false; } Cylinder* cylinder = item->getParent(); if(cylinder == NULL){ return false; } fromStackPos = cylinder->__getIndexOfThing(item); player->usedHotkey = true; } if(!item){ player->sendCancelMessage(RET_CANNOTUSETHISOBJECT); return false; } return internalUseItemEx(player, fromPos, item, creature->getPosition(), 0, 0);} Agora em spells.cpp Troque bool RuneSpell::executeUse(Player* player, Item* item, const PositionEx& posFrom, const PositionEx& posTo, bool extendedUse){ if(!playerRuneSpellCheck(player, posTo)){ return false; } bool result = false; if(m_scripted){ LuaVariant var; var.type = VARIANT_POSITION; var.pos = posTo; result = internalCastSpell(player, var); } else{ if(function){ result = function(this, player, item, posFrom, posTo); } } if(result){ Spell::postCastSpell(player); if(hasCharges && item){ int32_t newCharge = std::max(0, item->getItemCharge() - 1); g_game.transformItem(item, item->getID(), newCharge); } } return result;} Por este code: bool RuneSpell::executeUse(Player* player, Item* item, const PositionEx& posFrom, const PositionEx& posTo, bool extendedUse){ if(!playerRuneSpellCheck(player, posTo)){ return false; } bool result = false; if(m_scripted){ LuaVariant var; var.type = VARIANT_POSITION; var.pos = posTo; result = internalCastSpell(player, var); } else{ if(function){ result = function(this, player, item, posFrom, posTo); } } if(result){ Spell::postCastSpell(player); if(hasCharges && item){ int32_t newCharge = std::max(0, item->getItemCharge() - 1); bool usedHotkey = player->usedHotkey; g_game.transformItem(item, item->getID(), newCharge); if(usedHotkey){ uint16_t totalCharges = player->getTotalCharges(item->getID()); if(totalCharges == 0){ player->sendTextMessage(MSG_INFO_DESCR, "That was your last rune!"); } else{ std::stringstream chargeStream; chargeStream << totalCharges << " charges left..."; player->sendTextMessage(MSG_INFO_DESCR, chargeStream.str().c_str()); } } } } return result;} agora em player.cpp embaixo de: chaseMode = CHASEMODE_STANDSTILL; adicione usedHotkey = false;no final adicione: Item* Player::getHotkeyItem(uint16_t itemId, uint8_t itemType){ const long fluidMap[] = {FLUID_EMPTY_1, FLUID_BLUE_1, FLUID_RED_1, FLUID_BROWN_1, FLUID_GREEN_1, FLUID_YELLOW_1, FLUID_WHITE_1, FLUID_PURPLE_1, FLUID_RED_2, FLUID_BROWN_2, FLUID_PURPLE_2}; std::list<const Container*> listContainer; ItemList::const_iterator cit; Container* tmpContainer = NULL; Item* item = NULL; for(int i = SLOT_FIRST; i < SLOT_LAST; i++){ if(item = inventory[i]){ if(item->getClientID() == itemId){ if(item->isFluidContainer() && fluidMap[item->getFluidType()] == itemType){ return item; } else if(!item->isFluidContainer()){ return item; } } if(tmpContainer = item->getContainer()){ listContainer.push_back(tmpContainer); } } } while(listContainer.size() > 0){ const Container* container = listContainer.front(); listContainer.pop_front(); for(cit = container->getItems(); cit != container->getEnd(); ++ cit){ if((*cit)->getClientID() == itemId){ if((*cit)->isFluidContainer() && fluidMap[(*cit)->getFluidType()] == itemType){ return (*cit); } else if(!(*cit)->isFluidContainer()){ return (*cit); } } if(tmpContainer = (*cit)->getContainer()){ listContainer.push_back(tmpContainer); } } } return NULL; } uint32_t Player::getTotalCharges(Cylinder* cylinder) const{ if(cylinder == NULL) return 0; std::list<Container*> listContainer; ItemList::const_iterator it; Container* tmpContainer = NULL; Thing* thing = NULL; Item* item = NULL; uint32_t charges = 0; for(int i = cylinder->__getFirstIndex(); i < cylinder->__getLastIndex(); ++i){ if(!(thing = cylinder->__getThing(i))) continue; if(!(item = thing->getItem())) continue; if(tmpContainer = item->getContainer()){ listContainer.push_back(tmpContainer); } else{ if(item->isRune()){ charges += item->getItemCharge(); } } } while(listContainer.size() > 0) { Container* container = listContainer.front(); listContainer.pop_front(); for(it = container->getItem(); it != container->getEnd(); ++it) { Item* item = (*it); if(listContainer = item->getContainer()){ listContainer.push_back(tmpContainer); } else{ if(item->isRune()){ charges += item->getItemCharges(); } } } return charges;} agora em player.h nos includes adicione #include "networkmessage.h" para terminarmos de adicionar o codigo em public adicione: Item* getHotkeyItem(uint16_t itemId, uint8_t itemType); uint32_t Player::getTotalCharges(uint16_t itemId) const; bool usedHotkey; Pronto, codigo terminado agora deem rebuild all. Rappa Carnaúba™ BlackDemon™ Todos direitos reservados® Share this post Link to post
Guest Staype #2 Posted December 3, 2006 Testado e aprovado!Funcionando mesmo!Valeu RAPPA! Share this post Link to post
Hero 0 #6 Posted December 4, 2006 funciona com fluids tambem ?se funcionar, óótimo!!e rappa, se puder, libera o code de exori 4/5 da mana ;][]'s Share this post Link to post
Guest Rappa Carnaúba #7 Posted December 4, 2006 @Hero, funciona com fluids sim eu testei. http://forum.otserv.com.br/style_emoticons/<#EMO_DIR#>/smile.gif Share this post Link to post
Ablankzin 0 #8 Posted December 5, 2006 Muito legal estarei adicionando e testando aki =) ateh que enfim liberou http://forum.otserv.com.br/style_emoticons/<#EMO_DIR#>/smile.gif Share this post Link to post
GOD Azura 0 #9 Posted December 5, 2006 n funfo aki... na hora de compila falo q essa linha do q vc pediu pra por no player.cpp:if(item->isFluidContainer() && fluidMap[item->getFluidType()] == itemType){ ta erradaaki o q q deu: "fluidMap" undeclared (first use this function)será q vcs poderiam me ajuda (uso CVS 0.6.0) Share this post Link to post
Guest Rappa Carnaúba #10 Posted December 5, 2006 @down bah fiz [Palavrão Censurado] agora q percebi http://forum.otserv.com.br/style_emoticons/<#EMO_DIR#>/sleep.gif @up so adicionar #include "networkmessage.h" Share this post Link to post
honux 0 #11 Posted December 5, 2006 @upRapha, não fale o que não deve.O que você me diz caso o arquivo não contém o player como include, e somente o network message?Além disto poder trazer mais erros ao programa, dependendo do compilador pode criar um 'loop' na hora de compilar, assim adicionando o mesmo arquivo milhares de vezes, e nunca terminando de unificar o exe.Além do mais, porque diabos você vai tirar aglo que é global e adicionar em uma classe ( Player ) ?Po rapha, pelo amor de deus, vai ler um tutorial de C++ :/ Share this post Link to post
GOD Azura 0 #12 Posted December 5, 2006 aí gente, continuou dando o mesmo erro oOq q eu faço pelo amorrr de deusss...precisava disso...vlws Share this post Link to post
Pedro Vincenzo 0 #13 Posted December 6, 2006 Grande code Rapha, mas você pode melhorar http://forum.otserv.com.br/style_emoticons/<#EMO_DIR#>/wink.gif ah.. Rapha... Pwned by Honux ... o.O // Pedro Cardoso Share this post Link to post
Guest Rappa Carnaúba #16 Posted December 7, 2006 Joga, funciona sim a mana fluid com hotkeys. Share this post Link to post
Hell Raiser 0 #17 Posted December 7, 2006 axei bem manero rappa...de volta pro forum ne ..v se dessa vea tu nao faz bestera em lek...cod bom e aprovado/hb Share this post Link to post
Guest alaorribeiro #18 Posted December 8, 2006 meu ot é evolution 0.6.3 e eu procurei nao tem nenhum arquivo com nome "game.cpp" o que eu faço?? minhas hotkey nao funciona!!! Share this post Link to post
Guest slanbr #19 Posted December 9, 2006 no meu da o mesmo erro do god azura... alguem ai pode ajudar nois? Share this post Link to post