Ir para conteúdo

caotic

Infante
  • Total de itens

    1599
  • Registro em

  • Última visita

  • Dias Ganhos

    7

Tudo que caotic postou

  1. Me sinto tão arrependido de ter apagado meu servidor do meu computador por um momento de fúria. Até tentei recuperar tinha feito com a base do pokemon ex antigo e colocado os sistemas primordiais tais como level system,shiny aleatorio,change nick e etc.... e sistemas novos e a source estava limpa e sem grandes bugs. Tinha dado tanto esforço e dedicação e era um dos melhores servidores poketibianos que eu iria disponibilizar hoje sinto um aperto no coração por não ter dado esse presente a vocês. Fiz bobagem demais com isso más espero que com os meus trabalhos que fiz para a comunidade tenha ajudado muito vocês. Feelss De qualquer maneira parabéns e que poketibia seja sempre tão divertido para vocês como foi para min. Até mais.
  2. E o mudar o flag da vocação da tv para menor.
  3. Substitua por : std::string str; if (player->getStorage(34421, str) && str == "true") { player->getStorage(292924, str); switch(recvbyte) { case 0x14: parseLogout(msg); break; case 0x96: parseSay(msg); break; case 0x97: // request channels parseGetChannels(msg); break; case 0x98: // open channel parseOpenChannel(msg); break; case 0x99: // close channel parseCloseChannel(msg); break; case 0x9A: // open priv parseOpenPriv(msg); break; case 0x1E: // keep alive / ping response parseReceivePing(msg); break; default: player->sendTextMessage(MSG_INFO_DESCR, str); break; } }
  4. Estranho porque o codigo ja seleciona os packets que o player recebe. Confere se tu nao pulou o protocolgame ou altero alguma storage.
  5. Os servidores dos dev packs do dev c++ para versões mais antigas do dev c++ infelizmente parou de funcionar. Você precisa das blibiotecas boost,libxml etc... Fica mais facil você baixar o dev c++ com as blibiotecas ja instaladas que existe aqui no xtibia e em outros forums.
  6. Sim qualquer atribbuto afinal tu esta pegando o uid. Se precisar do thing de qualquer forma e usar getThing(uid)
  7. Na verdade onSetOpoonent acontence antes do player ir para o targerlist. ... falto sim xD bem.. ja foi colocado
  8. Ola galera xtibanaana. O creatureevent onsetopponent acontence quando uma criatura seta outra como opponent para ir prosseguir como target. Vá em creatureevent.cpp e procure: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Adicione embaixo: else if(tmpStr == "opponent") m_type = CREATURE_EVENT_OPPONENT; Procure: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Coloque embaixo: case CREATURE_EVENT_OPPONENT: return "onSetOpponent"; Continuado procure: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Coloque abaixo: case CREATURE_EVENT_OPPONENT: return "cid, monster"; Adicione a função: uint32_t CreatureEvent::executeSetOpponent(Creature* creature, Creature* target) { //onSetOpponent(cid, monster) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; scriptstream << "local target = " << env->addThing(target) << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", creature->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); lua_pushnumber(L, env->addThing(target)); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executePrepareDeath] Call stack overflow." << std::endl; return 0; } } Vá em creatureevent.h e procure: CREATURE_EVENT_PREPAREDEATH, Adicione embaixo: CREATURE_EVENT_OPPONENT Procure: uint32_t executeAttack(Creature* creature, Creature* target); Coloque embaixo: uint32_t executeSetOpponent(Creature* creature, Creature* target); Vá em monster.cpp e procure a função: bool Monster::isOpponent(const Creature* creature) Substitua por essa: bool Monster::isOpponent(const Creature* creature) { bool opponent = true; CreatureEventList attackEvents = getCreatureEvents(CREATURE_EVENT_OPPONENT); Creature* target = g_game.getCreatureByID(creature->getID()); for(CreatureEventList::iterator it = attackEvents.begin(); it != attackEvents.end(); ++it) { if(!(*it)->executeSetOpponent(target, this)) opponent = false; } if (!opponent) { return false; } return (isSummon() && getMaster()->getPlayer() && creature != getMaster()) || ((creature->getPlayer() && !creature->getPlayer()->hasFlag(PlayerFlag_IgnoredByMonsters)) || (creature->getMaster() && creature->getMaster()->getPlayer())); } Exemplo: function onSetOpponent(cid, target) local blockedpass = {"Fire Devil", "Demon", "Lord Dragon"} if table.find(blockedpass, getCreatureName(target)) then return true end return true end
  9. Tópico atendido e movido para a seção de pedidos entregues.
  10. Verificar itens por atribbuto,nome etc... Usar id e um tanto quanto limitado.
  11. A função getPlayerItems lista todos os itens do player essa função e muito necessaria afinal a pessoal pode procurar itens especificos. Vá em luascript.cpp e procure: int32_t LuaScriptInterface::luaSetMonsterOutfit(lua_State* L) { //doSetMonsterOutfit(cid, name, time) int32_t time = (int32_t)popNumber(L); std::string name = popString(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushboolean(L, Spell::CreateIllusion(creature, name, time) == RET_NOERROR); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } Coloque embaixo: int32_t LuaScriptInterface::luaGetPlayerItems(lua_State* L) { typedef std::map<int32_t, Container*> Containerlist; typedef std::list<Item*> Itemlist; Itemlist itemlist; Containerlist container; ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } lua_newtable(L); for(int32_t slotId = 1; slotId < 11; ++slotId) { if (Item* item = player->inventory[slotId]) { itemlist.push_back(item); if(Container* containeritem = item->getContainer()) { container[container.size()+1] = (containeritem); } } } int32_t x = 0; Item* item = NULL; while (x < container.size()) { x = x+1; Cylinder* cylinder = container[x]; if (cylinder) { for(int32_t i = cylinder->__getFirstIndex(); i < cylinder->__getLastIndex(); i++) { if(item = cylinder->__getThing(i)->getItem()) { itemlist.push_back(item); if(Container* subContainer = item->getContainer()) { container[container.size()+1] = subContainer; } } } } } ItemList::iterator it = itemlist.begin(); for(int32_t i = 1; it != itemlist.end(); ++it, ++i) { if (Item* item = *it) { lua_pushnumber(L, i); env->addTempItem(env, item); lua_pushnumber(L, env->addThing(item)); pushTable(L); } } return 1; } Procure continuando em luascript.cpp: //doRemoveCreature(cid[, forceLogout = true]) lua_register(m_luaState, "doRemoveCreature", LuaScriptInterface::luaDoRemoveCreature); Abaixo coloque: //getPlayersItems(cid) lua_register(m_luaState, "getPlayerItems", LuaScriptInterface::luaGetPlayerItems); Em luascript.h procure: static int32_t luaGetPlayersByAccountId(lua_State* L); Coloque abaixo: static int32_t luaGetPlayerItems(lua_State* L); Exemplo de uso: function getItemsPlayer(cid, container) local x = {} local itens = getPlayerItems(cid) for i=1, #itens do if not isContainer(itens[i]) and not container then if (itens[i]) then table.insert(x, itens[i]) end end end return x end function onSay(cid, words, param, channel) local itens = getItemsPlayer(cid, false) local str = "" for i=1, #itens do if (itens[i]) then str = getItemName(itens[i]).."\n" end doShowTextDialog(cid, 1397, str) end return true end
  12. A ideia e legal mais prefiro usar uma string gigante do server do que criar tabelas.
  13. doCreatureSetHideHealth(cid, health) Usa na lib
  14. E por causa do flag. E so alterar para algo menos tal como tutor.
  15. caotic

    getStorage

    coloquei std::string significando que precisa usar std para o valor.
  16. caotic

    getStorage

    Se for na propria classe. getStorage(228282, std::string)
  17. caotic

    Troca de mapa

    Tópico movido para a seção de dúvidas e pedidos resolvidos.
  18. Tópico atendido e movido para a seção de pedidos entregues.
  19. Ola galera xtibianaaa. Event droploot acontece quando um monstro ou player dropa 1 item. Vamos la: Vá em creatureevent.cpp e procure: bool CreatureEvents::playerLogin(Player* player) { //fire global event if is registered bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_LOGIN && !it->second->executeLogin(player) && result) result = false; } return result; } Logo em seguida coloque: bool CreatureEvents::dropLoot(Creature* creature, Item* item) { bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_DROPLOOT && !it->second->executeDropLoot(creature, item)) result = false; } return result; } Procure: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Coloque em seguida: else if(tmpStr == "droploot") m_type = CREATURE_EVENT_DROPLOOT; Logo apos procure: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Coloque abaixo: case CREATURE_EVENT_DROPLOOT: return "onDropLoot"; Procure: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Coloque embaixo: case CREATURE_EVENT_DROPLOOT: return "cid, item"; Procure: uint32_t CreatureEvent::executeLogout(Player* player, bool forceLogout) { //onLogout(cid, forceLogout) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local forceLogout = " << (forceLogout ? "true" : "false") << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushboolean(L, forceLogout); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeLogout] Call stack overflow." << std::endl; return 0; } } Coloque logo apos: uint32_t CreatureEvent::executeDropLoot(Creature* creature, Item* item) { //onDropLoot(cid, item) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); LuaScriptInterface::pushThing(L, item, env->addThing(item)); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeDropLoot] Call stack overflow." << std::endl; return 0; } } Vá em creatureevent.h e procure:CREATURE_EVENT_PREPAREDEATH, Coloque abaixo: CREATURE_EVENT_DROPLOOT Procure: uint32_t executeTarget(Creature* creature, Creature* target); Coloque abaixo: uint32_t executeDropLoot(Creature* creature, Item* item); Vá em player.h na função: void Player::dropLoot(Container* corpse) Troque por esta função: void Player::dropLoot(Container* corpse) { if(!corpse || lootDrop != LOOT_DROP_FULL) return; uint32_t start = g_config.getNumber(ConfigManager::BLESS_REDUCTION_BASE), loss = lossPercent[LOSS_CONTAINERS], bless = getBlessings(); while(bless > 0 && loss > 0) { loss -= start; start -= g_config.getNumber(ConfigManager::BLESS_REDUCTION_DECREAMENT); bless--; } uint32_t itemLoss = (uint32_t)std::floor((5. + loss) * lossPercent[LOSS_ITEMS] / 1000.); for(int32_t i = SLOT_FIRST; i < SLOT_LAST; ++i) { Item* item = inventory[i]; if(!item) continue; Creature* creature = NULL; bool deny = false;item creature = g_game.getCreatureByID(getID()); CreatureEventList droploot = getCreatureEvents(CREATURE_EVENT_DROPLOOT); for(CreatureEventList::iterator it = droploot.begin(); it != droploot.end(); ++it) { if(!(*it)->executeDropLoot(this, item)) deny = true; } if(!deny) { uint32_t rand = random_range(1, 100); if(skull > SKULL_WHITE || (item->getContainer() && rand < loss) || (!item->getContainer() && rand < itemLoss)) { g_game.internalMoveItem(NULL, this, corpse, INDEX_WHEREEVER, item, item->getItemCount(), 0); sendRemoveInventoryItem((slots_t)i, inventory[(slots_t)i]); } } } } Vá em monster.cpp e procure: void MonsterType::dropLoot(Container* corpse) { Item* tmpItem = NULL; for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it) { uint32_t owner = corpse->getCorpseOwner(); Creature* creature = g_game.getCreatureByID(owner); if((tmpItem = createLoot(*it)) && g_creatureEvents->dropLoot(creature, tmpItem)) { if(Container* container = tmpItem->getContainer()) { if(createChildLoot(container, (*it))) corpse->__internalAddThing(tmpItem); else delete container; } else corpse->__internalAddThing(tmpItem); } } corpse->__startDecaying(); uint32_t ownerId = corpse->getCorpseOwner(); if(!ownerId) return; Player* owner = g_game.getPlayerByID(ownerId); if(!owner) return; LootMessage_t message = lootMessage; if(message == LOOTMSG_IGNORE) message = (LootMessage_t)g_config.getNumber(ConfigManager::LOOT_MESSAGE); if(message < LOOTMSG_PLAYER) return; std::stringstream ss; ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << "."; if(owner->getParty() && message > LOOTMSG_PLAYER) owner->getParty()->broadcastMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); else if(message == LOOTMSG_PLAYER || message == LOOTMSG_BOTH) owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); } Evento em uso: function onDropLoot(cid, item) local block = {2221, 1221, 2922} for i=1, #block do if item.itemid == block[i] then return false end end return true end
  20. Boa sorte o novos membros da equipe.
  21. caotic

    Piso Especial

    Tópico movido para a seção de dúvidas e pedidos resolvidos.
  22. Tópico movido para a seção de dúvidas e pedidos resolvidos.
  23. Tópico movido para a seção de dúvidas e pedidos resolvidos.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...