Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 04/20/14 em todas áreas

  1. masdead

    Dark Catedral [8.6++]

    Tópico sem scan então o conteúdo foi removido.
    2 pontos
  2. Ola pessoal, Eu estive conversando com o Omega sobre a possibilidade de ensinar a galera a respeito da linguagem LUA usada nos OTSERVERS para se montar todo tipo de sistema dentre outras coisas interessantes, afinal quem nunca teve força de vontade mais se viu perdido?? Por que não um professor que possa tirar todas suas duvidas e te ensinar o caminho certo?? Porem eu quero saber quantos aqui realmente tem interesse e tenham o compromisso de participar de todas as aulas que seriam em 1 TS 3, daria apostilas de estudo e provas para ir avançando de modulo, assim a comunidade cresce e o open tibia tambem. Obrigado pela atenção, Techrlz
    2 pontos
  3. Cara Uma Boa Base de Poketibia tem que Ter As as Fontes "Sources" Para Ediçao do Mesmo. - O Xtibia tem de Monte Servidores de Pokemon com Sources Porem oq voce esta Pedindo "• Tenha várias gerações" e "• Spriters iguais ao do PxG" Nao tem em Todos os Links de Downloads que Vou Postar Agora: - Aqui Estao Todas as Bases de Server de Pokemon que tem no Xtibia o Resto e tudo PDA "nao Presta"! - Espero ter Ajudado...........
    2 pontos
  4. Veja se funciona Coloque isso no seu characters.php, no lugar disso tudo: E verifique se tem essa função em classes/account.php public function isPremium(){return ($this->getPremDays() > 0);}
    2 pontos
  5. se ele uso getPlayerItemCount ele deve ta querendo pegar os uids da bag do player... achu q oq ele quer eh essa funçao... function getItemsInContainerById(container, itemid) -- Function By Kydrai local items = {} if isContainer(container) and getContainerSize(container) > 0 then for slot=0, (getContainerSize(container)-1) do local item = getContainerItem(container, slot) if isContainer(item.uid) then local itemsbag = getItemsInContainerById(item.uid, itemid) for i=0, #itemsbag do table.insert(items, itemsbag[i]) end else if itemid == item.itemid then table.insert(items, item.uid) end end end end return items end exemplo de uso: local uids = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid) for _, uid in ipairs(uids) do doRemoveItem(uid, 1) end nesse caso vai remover todos os itens com o 'itemid' do player...
    2 pontos
  6. XxBrUnNXx

    Poke Bas - Versão 9.60

    Informações Gerais . Catch/GoBack 100% Na V2 Surf 100% Ride 100% Fly 100% Blink 100% Rock Smash 100% Resto 100% Clan System (Atualizando) M1 a M12 100% Nurse Joy 100% New mapa sendo feito do zero (0%) Pokes Fulls 1° Geração Full (os 151) Evolui Por Stones e por Level na V2 (PokeDex está sendo Reformulada em Breve Imagens) New Pokébolas Novas Pokébolas Adicionada Em Breve Pokébola Tipo: Veneno +10% de chance de Pega Poke Tipo Veneno Pokébola Tipo: Água +10% de chance de Pega Poke Tipo Água Pokébola Tipo: Fogo +10% de chance de Pega Poke Tipo Fogo Inicio do Projeto Dia 01/04/2014 Downloads Servidor Base A Nossa Base será o Poketibia 9.60 o Download ja esta ai em cima a Nova versão a v2 ja vai vim tudo editado e configurado Aceitamos ajudar para a criação do servidor Login: admin senha: 123456 Créditos: Servidor Base do: Lazarocp Edição E Criação da V2 +: BrUnN • Ao divulgar ou utilizar, favor mantenham os devidos créditos. • REP'S serão sempre bem vindos, obrigado.
    1 ponto
  7. Nome: Log Chat Versão: 1.0 Código: GM BLumaster Forum Origem: OTSerV Versão: Todos TFS Descrição: Salvar tudo que os players falam para procurar bugs depois ou ate banir membros que fazem propaganda. Lembre que criar a pasta player na pasta log. Bom, vamos ao tutorial: game.cpp Procure por: #include "group.h" Abaixo, coloque: #include "textlogger.h" Procure por: Game::playerSay Dentro da função, encontre: switch(type) { case SPEAK_SAY: return internalCreatureSay(player, SPEAK_SAY, text, false); case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); (...) Adicione acima de switch(type) Logger::getInstance()->eFile("players/" + player->getName() + ".log", text, true); Não se esqueça de criar a pasta players. Assim tudo que os players falar/digitar in-game sera salvo no log do servidor.
    1 ponto
  8. caotic

    TV System by caotic

    Eae galeerrra xtibiana. Venho disponibilizar o famoso sistema de televisão poketibiano completo o sistema foi feito para ambos os clients tibianos. O sistema permite você assistir outro players jogando assim você fica sem usar itens,falar(so pm), se movimentar e etc... Vamos la: Vá em luascript.cpp e procure: int32_t LuaScriptInterface::luaGetTopCreature(lua_State* L) { //getTopCreature(pos) PositionEx pos; popPosition(L, pos); ScriptEnviroment* env = getEnv(); Tile* tile = g_game.getTile(pos); if(!tile) { pushThing(L, NULL, 0); return 1; } Thing* thing = tile->getTopCreature(); if(!thing || !thing->getCreature()) { pushThing(L, NULL, 0); return 1; } pushThing(L, thing, env->addThing(thing)); return 1; } E coloque embaixo: int32_t LuaScriptInterface::luaGetAllsTvs(lua_State* L) { //getAllsTvs(cid) ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } Tvlist::iterator it; it = player->tv.begin(); lua_newtable(L); uint32_t tableplayers = 1; for(uint32_t i = 1; it != player->tv.end(); ++it, ++i) { Player* players = env->getPlayerByUID(*it); if (players) { lua_pushnumber(L, tableplayers); lua_pushnumber(L, env->addThing(players)); pushTable(L); tableplayers = tableplayers+1; } } return 1; } int32_t LuaScriptInterface::luaSetPlayerTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player_tv = env->getPlayerByUID(popNumber(L)); Creature* creature = env->getCreatureByUID(popNumber(L)); if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } Player* player = creature->getPlayer(); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } if (!player_tv) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } player_tv->tv.push_back(player->getID()); SpectatorVec::iterator it; SpectatorVec list = g_game.getSpectators(player->getPosition()); Player* tmpPlayer = NULL; Condition* condition = NULL; if((condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_GAMEMASTER, -1, 0, false, GAMEMASTER_INVISIBLE))) { creature->setHideName(false); player->addCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_DISAPPEAR); for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player)) tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); } for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if(!pit->second->canSeeCreature(player)) pit->second->notifyLogOut(player); } IOLoginData::getInstance()->updateOnlineStatus(player->getGUID(), false); if(player->isTrading()) g_game.internalCloseTrade(player); player->clearPartyInvitations(); if(player->getParty()) player->getParty()->leave(player); g_game.internalTeleport(player, player_tv->getPosition(), true); } lua_pushboolean(L, true); } int32_t LuaScriptInterface::luaDoSendChannelsTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } player->sendChannelsDialog(true); lua_pushboolean(L, true); return 1; } int32_t LuaScriptInterface::luaDoRemovePlayerTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); Player* creature = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } for(std::list<uint32_t>::iterator it = player->tv.begin(); it != player->tv.end(); ++it) { if ((*it) == creature->getID()) { Tvlist tv = player->tv; if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); return 1; } Player* player_tv = creature->getPlayer(); if (!player) { return 1; } SpectatorVec::iterator its; SpectatorVec list = g_game.getSpectators(player_tv->getPosition()); Player* tmpPlayer = NULL; Condition* condition = NULL; creature->setHideName(false); if((condition = player_tv->getCondition(CONDITION_GAMEMASTER, CONDITIONID_DEFAULT, GAMEMASTER_INVISIBLE))) { IOLoginData::getInstance()->updateOnlineStatus(player_tv->getGUID(), true); for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if(!pit->second->canSeeCreature(player_tv)) pit->second->notifyLogIn(player_tv); } for(its = list.begin(); its != list.end(); ++its) { if((tmpPlayer = (*its)->getPlayer()) && !tmpPlayer->canSeeCreature(player_tv)) tmpPlayer->sendMagicEffect(player_tv->getPosition(), MAGIC_EFFECT_TELEPORT); } player_tv->removeCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_APPEAR); *it = NULL; } } } lua_pushboolean(L, true); } Continuando em luascript.cpp procure: //doCreatureSay(uid, text[, type = SPEAK_SAY[, ghost = false[, cid = 0[, pos]]]]) lua_register(m_luaState, "doCreatureSay", LuaScriptInterface::luaDoCreatureSay); Coloque embaixo: //doRemovePlayerTv(cid, id) lua_register(m_luaState, "removePlayerTv", LuaScriptInterface::luaDoRemovePlayerTv); //getAllsTv() lua_register(m_luaState, "getTvs", LuaScriptInterface::luaGetAllsTvs); //setPlayerTv(cid, player) lua_register(m_luaState, "setPlayerTv", LuaScriptInterface::luaSetPlayerTv); //doSendChannelstTv(cid) lua_register(m_luaState, "doSendChannelsTv", LuaScriptInterface::luaDoSendChannelsTv); Em luascript.h procure: static int32_t luaGetPlayerParty(lua_State* L); Coloque embaixo: static int32_t luaGetAllsTvs(lua_State* L); static int32_t luaSetPlayerTv(lua_State* L); static int32_t luaDoSendChannelsTv(lua_State* L); static int32_t luaDoRemovePlayerTv(lua_State* L); Vamos agora em game.cpp: Procure: bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text) E substitua função por esta nova função: bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; std::string str; if (player->getStorage(34421, str) && str == "true") { if (type == SPEAK_SAY) { player->getStorage(292924, str); player->sendTextMessage(MSG_STATUS_SMALL, str.c_str()); return false; } switch(type) { case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); case SPEAK_PRIVATE: case SPEAK_PRIVATE_RED: case SPEAK_RVR_ANSWER: return playerSpeakTo(player, type, receiver, text); case SPEAK_CHANNEL_O: case SPEAK_CHANNEL_Y: case SPEAK_CHANNEL_RN: case SPEAK_CHANNEL_RA: case SPEAK_CHANNEL_W: { if(playerTalkToChannel(player, type, text, channelId)) return true; return playerSay(playerId, 0, SPEAK_SAY, receiver, text); } case SPEAK_BROADCAST: return playerBroadcastMessage(player, SPEAK_BROADCAST, text); case SPEAK_RVR_CHANNEL: return playerReportRuleViolation(player, text); case SPEAK_RVR_CONTINUE: return playerContinueReport(player, text); default: break; } internalCreatureSay(player, SPEAK_SAY, text, false); return false; } uint32_t muteTime = 0; bool muted = player->isMuted(channelId, type, muteTime); if(muted) { char buffer[75]; sprintf(buffer, "You are still muted for %d seconds.", muteTime); player->sendTextMessage(MSG_STATUS_SMALL, buffer); return false; } if(player->isAccountManager()) { player->removeMessageBuffer(); return internalCreatureSay(player, SPEAK_SAY, text, false); } if(g_talkActions->onPlayerSay(player, type == SPEAK_SAY ? CHANNEL_DEFAULT : channelId, text, false)) return true; if(!muted) { ReturnValue ret = RET_NOERROR; if(!muteTime) { ret = g_spells->onPlayerSay(player, text); if(ret == RET_NOERROR || (ret == RET_NEEDEXCHANGE && !g_config.getBool(ConfigManager::BUFFER_SPELL_FAILURE))) return true; } player->removeMessageBuffer(); if(ret == RET_NEEDEXCHANGE) return true; } switch(type) { case SPEAK_SAY: return internalCreatureSay(player, SPEAK_SAY, text, false); case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); case SPEAK_PRIVATE: case SPEAK_PRIVATE_RED: case SPEAK_RVR_ANSWER: return playerSpeakTo(player, type, receiver, text); case SPEAK_CHANNEL_O: case SPEAK_CHANNEL_Y: case SPEAK_CHANNEL_RN: case SPEAK_CHANNEL_RA: case SPEAK_CHANNEL_W: { if(playerTalkToChannel(player, type, text, channelId)) return true; return playerSay(playerId, 0, SPEAK_SAY, receiver, text); } case SPEAK_PRIVATE_PN: return playerSpeakToNpc(player, text); case SPEAK_BROADCAST: return playerBroadcastMessage(player, SPEAK_BROADCAST, text); case SPEAK_RVR_CHANNEL: return playerReportRuleViolation(player, text); case SPEAK_RVR_CONTINUE: return playerContinueReport(player, text); default: break; } return false; } Continuando em game.cpp procure a função: ReturnValue Game::internalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) E substitua por esta função: ReturnValue Game::internalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) { const Position& currentPos = creature->getPosition(); Cylinder* fromTile = creature->getTile(); Cylinder* toTile = NULL; Position destPos = getNextPosition(direction, currentPos); if(direction < SOUTHWEST && creature->getPlayer()) { Tile* tmpTile = NULL; if(currentPos.z != 8 && creature->getTile()->hasHeight(3)) //try go up { if((!(tmpTile = map->getTile(Position(currentPos.x, currentPos.y, currentPos.z - 1))) || (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position(destPos.x, destPos.y, destPos.z - 1))) && tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID)) { flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE; destPos.z--; } } else if(currentPos.z != 7 && (!(tmpTile = map->getTile(destPos)) || (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position( destPos.x, destPos.y, destPos.z + 1))) && tmpTile->hasHeight(3)) //try go down { flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE; destPos.z++; } } ReturnValue ret = RET_NOTPOSSIBLE; if((toTile = map->getTile(destPos))) ret = internalMoveCreature(NULL, creature, fromTile, toTile, flags); if(ret != RET_NOERROR) { if(Player* player = creature->getPlayer()) { player->sendCancelMessage(ret); player->sendCancelWalk(); } } Player* player = creature->getPlayer(); if (player) { Tvlist::iterator it; it = player->tv.begin(); for(uint32_t i = 1; it != player->tv.end(); ++it, ++i) { Player* players = getPlayerByID(*it); if (players) { internalTeleport(players, player->getPosition(), true, 0); } } } return ret; } Procure a função: bool Game::playerRequestChannels(uint32_t playerId) Substitua a função por: bool Game::playerRequestChannels(uint32_t playerId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; player->sendChannelsDialog(false); return true; } Agora vamos a protocolgame.cpp e procure a função; void ProtocolGame::sendChannelsDialog(bool tv) E substitua por esta função: void ProtocolGame::sendChannelsDialog(bool tv) { NetworkMessage_ptr msg = getOutputBuffer(); std::string str; if(msg) { if (tv) { uint16_t bytes = 0; for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { bytes = bytes+1; } } if (bytes < 1) { player->sendCancel("Não há nenhuma tv online"); return; } TRACK_MESSAGE(msg); msg->AddByte(0xAB); msg->AddByte(bytes); uint16_t id = 200; for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { id = id+1; it->second->getStorage(12121, str); msg->AddU16(id); msg->AddString(str); } } return; } TRACK_MESSAGE(msg); msg->AddByte(0xAB); ChannelList list = g_chat.getChannelList(player); msg->AddByte(list.size()); for(ChannelList::iterator it = list.begin(); it != list.end(); ++it) { if(ChatChannel* channel = (*it)) { msg->AddU16(channel->getId()); msg->AddString(channel->getName()); } } } } Procure em protocolgame.h a seguinta declaração: void sendChannelsDialog(); Substitua por: void sendChannelsDialog(bool tv); Agora vamos em player.h e procure: void sendChannelsDialog() {if(client) client->sendChannelsDialog();} E substitua por: void sendChannelsDialog(bool tv) {if(client) client->sendChannelsDialog(tv);} Procure denovo em player.h: typedef std::list<Party*> PartyList; E adicione embaixo: typedef std::list<uint32_t> Tvlist; Continuando em player.h procure: AttackedSet attackedSet; Coloque embaixo: Tvlist tv; Vamos denovo a protocolgame.cpp e procure: if(player->isAccountManager()) { switch(recvbyte) { case 0x14: parseLogout(msg); break; case 0x96: parseSay(msg); break; default: sendCancelWalk(); break; } } Coloque embaixo: 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; } Seguidamente vá em creatureevent.cpp e procure: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Coloque embaixo: else if(tmpStr == "selecttv") m_type = CREATURE_EVENT_SELECTTV; Procure depois: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Coloque embaixo: case CREATURE_EVENT_SELECTTV: return "onSelectTv"; Procure: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Coloque embaixo: case CREATURE_EVENT_SELECTTV: return "cid, id"; Procure: uint32_t CreatureEvent::executeChannelJoin(Player* player, uint16_t channelId, UsersMap usersMap) { //onJoinChannel(cid, channel, users) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local channel = " << channelId << std::endl; scriptstream << "local users = {}" << std::endl; for(UsersMap::iterator it = usersMap.begin(); it != usersMap.end(); ++it) scriptstream << "users:insert(" << env->addThing(it->second) << ")" << 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); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, channelId); UsersMap::iterator it = usersMap.begin(); lua_newtable(L); for(int32_t i = 1; it != usersMap.end(); ++it, ++i) { lua_pushnumber(L, i); lua_pushnumber(L, env->addThing(it->second)); lua_settable(L, -3); } bool result = m_interface->callFunction(3); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << std::endl; return 0; } } Coloque embaixo: uint32_t CreatureEvent::executeSelectTv(Player* player, uint16_t id) { //onSelectTv(cid, id) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local id = " << id << 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); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, id); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << std::endl; return 0; } } Vá em creatureevent.h e procure: CREATURE_EVENT_ATTACK, Coloque embaixo: CREATURE_EVENT_SELECTTV Procure continuando em creatureevent.h: uint32_t executeCombat(Creature* creature, Creature* target); Coloque embaixo: uint32_t executeSelectTv(Player* player, uint16_t id); Vá agora em game.cpp denovo e procure a função: bool Game::playerOpenChannel(uint32_t playerId, uint16_t channelId) Substitua a função por: bool Game::playerOpenChannel(uint32_t playerId, uint16_t channelId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; if (channelId >= 200) { CreatureEventList tvEvents = player->getCreatureEvents(CREATURE_EVENT_SELECTTV); for(CreatureEventList::iterator it = tvEvents.begin(); it != tvEvents.end(); ++it) (*it)->executeSelectTv(player, channelId); return true; } ChatChannel* channel = g_chat.addUserToChannel(player, channelId); if(!channel) { #ifdef __DEBUG_CHAT__ std::cout << "Game::playerOpenChannel - failed adding user to channel." << std::endl; #endif return false; } if(channel->getId() != CHANNEL_RVR) player->sendChannel(channel->getId(), channel->getName()); else player->sendRuleViolationsChannel(channel->getId()); return true; } Vá em data/lib e crie um novo arquivo lua chamado tv system: names = {} storage_hastv = 22120 storage_watchtv = 34421 storage_nametv = 12121 storage_idwatchtv = 21213 storage_msgwatch = 292924 storage_namewatchtv = 21923 storage_save_group_id = 63732 smallerros = false ERROR_ID_NOT_FOUND = "ERROR\nPLAYER NOT FOUND\nSet Storage FALSE ON LOGIN" MSG_TV_SYSTEM = "Esta ação não e possivel você esta assistindo" MSG_CREATE_TV = "Parabéns, você criou sua TV " MSG_LOGOUT_TV = "Você saiu da tv " MSG_LOGOUT_TV_TOWN = "Você retornou a sua cidade " ID_ITEM_TV = 1949 ---- IMPORTANTE ID DA SUA CAM(CAMERA) MSG_WATCH_TV = "Você esta assitindo a uma tv" MSG_HAS_TV = "Você ja tem tv" MSG_NO_HAS_TV = "Você não tem tv" MSG_ENTER_PLAYER = "Um novo player entrou - " MININUM_STRING_CARACTER = 4 HAS_TV = "Você ja tem uma tv" MSG_DELETE_TV = "Você deletou sua channel com sucesso" MSG_WATCH_TV_ENTER_TV = "Você entrou na channel " NAME_WRONG = "Nome incorreto" MSG_HAS_NAME_TV = "Desculpe, ja existe uma tv com este nome escolha outro por favor" function setBooleanStorage(cid, storage, bool) if not bool then setPlayerStorageValue(cid, storage, -1) return true end setPlayerStorageValue(cid, storage, "true") return true end function checkFindStrings(str, array) for i=1, #array do if string.find(str, array[i]) then return true end end return false end function playerHasTv(cid) return getPlayerStorageValue(cid, storage_hastv) == "true" and true end function playerWatchTv(cid) return getPlayerStorageValue(cid, storage_watchtv) == "true" and true end function getTvOnlines() local t = {} local online = getPlayersOnline() for i=1, #online do if playerHasTv(online[i]) then table.insert(t, online[i]) end end return t end function getNamesTv(sep) local tvs = getTvOnlines() str = "" for i=1, #tvs do str = str..sep..getTvName(tvs[i]) end return str end function getIdByTvName(name) local tvs = getTvOnlines() for i=1, #tvs do if tvs[i] == name then return name end end return false end function stopWatchAllsPlayerTv(id) local onlines = getTvs(id) for i=1, #onlines do playerStopWatchTv(onlines[i]) end return true end function getNameTv(id) if not isPlayer(id) then print(ERROR_ID_NOT_FOUND) return false end local storage = getPlayerStorageValue(id, storage_nametv) if storage ~= -1 then return storage end return "" end function createNewTv(cid, name) if #name < MININUM_STRING_CARACTER or checkFindStrings(name, names) then doPlayerSendCancel(cid, NAME_WRONG) return false end local tvs = getTvOnlines() for i=1, #tvs do if getNameTv(tvs[i]) == name then doPlayerSendCancel(cid, MSG_HAS_NAME_TV) return false end end if playerHasTv(cid) then doPlayerSendCancel(cid, MSG_HAS_TV) return false end if playerWatchTv(cid) then doPlayerSendCancel(cid, MSG_WATCH_TV) return false end setBooleanStorage(cid, storage_hastv, true) setPlayerStorageValue(cid, storage_nametv, name) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_CREATE_TV..name) return true end function getTvNameById(id) if not isPlayer(id) then print(ERROR_ID_NOT_FOUND) return false end return getPlayerStorageValue(id, storage_nametv) end function playerWatchTv(cid, id) if not isPlayer(id) then if smallerros then print(ERROR_ID_NOT_FOUND) end return false end if playerHasTv(cid) then doPlayerSendCancel(cid, MSG_HAS_TV) return false end if playerWatchTv(cid) then doPlayerSendCancel(cid, MSG_WATCH_TV) return false end local name = getTvNameById(id) setBooleanStorage(cid, storage_watchtv, true) setPlayerStorageValue(cid, storage_msgwatch, MSG_TV_SYSTEM) setPlayerStorageValue(cid, storage_idwatchtv, id) setPlayerStorageValue(cid, storage_namewatchtv, name) setPlayerStorageValue(cid, storage_save_group_id, getPlayerGroupId(cid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_WATCH_TV_ENTER_TV) doPlayerSendTextMessage(id, MESSAGE_STATUS_CONSOLE_BLUE, MSG_ENTER_PLAYER..getCreatureName(cid)) setPlayerTv(cid, id) return true end function playerStopWatchTv(cid) local id = getPlayerStorageValue(cid, storage_idwatchtv) local name = getPlayerStorageValue(cid, storage_namewatchtv) local town = getPlayerTown(cid) local namet = getTownName(town) local post = getTownTemplePosition(town) if getPlayerStorageValue(cid, storage_watchtv) ~= "true" then return true end removePlayerTv(cid, id) setBooleanStorage(cid, storage_watchtv, false) setPlayerStorageValue(cid, storage_idwatchtv, -1) setPlayerStorageValue(cid, storage_namewatchtv, -1) setPlayerGroupId(cid, getPlayerStorageValue(cid, storage_save_group_id)) doTeleportThing(cid, post) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_LOGOUT_TV..name) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_LOGOUT_TV_TOWN..namet) return true end function deleteTv(cid) if getPlayerStorageValue(cid, 22120) ~= "true" then return false end stopWatchAllsPlayerTv(cid) setBooleanStorage(cid, storage_hastv) setPlayerStorageValue(cid, storage_nametv, -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_DELETE_TV) return true end Agora vamos em actions e crie um arquivo lua chamado tv e coloque: function onUse(cid, item, fromPosition, itemEx, toPosition) doSendChannelsTv(cid) end Vá em actions.xml e coloque a seguinte configurando com o id da sua tv: Agora vamos em talkactions e crie um novo arquivo lua chamado delete e coloque isto: function onSay(cid, words, param, channel) deleteTv(cid) return true end Agora vamos em talkactions.xml e coloque a seguinte tag: <talkaction words="/delete" event="script" value="delete.lua"/> Agora vamos a creaturescripts e crie um arquivo lua chamado createTv e coloque: function onTextEdit(cid, it:em, newText) if item.itemid == ID_ITEM_TV then createNewTv(cid, newText) return true end return true end Crie outro chamado de tv e coloque: function onSelectTv(cid, id) local tv = getTvOnlines() local idstarter = 200 for i=1, #tv do local tv = tv[i] local sub_id = i+idstarter if sub_id == id then playerWatchTv(cid, tv) end end return true end Crie outro chamado de tvlogout : function onLogout(cid) if isPlayer(cid) then deleteTv(cid) playerStopWatchTv(cid) end return true end Vá em creaturescripts.xml e coloque as seguintes as tags: <event type="textedit" name="newTv" event="script" value="createTv.lua"/> <event type="selecttv" name="selecttv" event="script" value="tv.lua"/> <event type="logout" name="tvlogout" event="script" value="tvlogout.lua"/> Vá em data/xml/group.xml e abra o arquivo e coloque o novo group: <group id="8" name="Tv" flags="3845069447162" customFlags="2097151" access="1" violationReasons="4" nameViolationFlags="2"/> Video do sistema em execução: E recomendavel NUNCA modificar as storages porques estão ligados aos codigos. Para mudar o id da camera e so mudar a variavel ID_ITEM_TV Para deletar uma tv diga o comand /delete
    1 ponto
  9. Assisti muitos tutoriais na internet sobre como abrir portas nesse modem (o meu) e apenas uma delas estava correta. Então como bom colega venho compartilhar ela com vocês. 1- Vá em: Iniciar>Pesquisar>CMD e dê enter. Logo que abrir digite IPCONFIG, pegue o Gateway padrão, abra seu navegador e coloque aquela numeração lá. Geralmente é 192.168.1.1 e minimize o CMD. 2- Agora você veio parar aqui. Coloque a senha ADMIN/ADMIN, isso é para Modens da operadora OI. 3- Vá em ADVANCED>NAT>VIRTUAL SERVER 4- Clique em ADD para abrir uma nova regra. Para todas as quatro portas você vai fazer isso !!! 5- Com o CMD ainda aberto pegue o Endereço IPv4 e faça exatamente como está aqui: (Lembre-se que sempre que reiniciar o computador esse número vai trocar, então vai ter de fazer o mesmo processo). Salve e faça o mesmo processo para porta 7172. As portas para abrir o site são: 80,8090. Você vai repitir exatamente o mesmo processo de abrir as portas 7171 e 7172, mas vai trocar as portas para 80 e 8090. Uma coisa que quero deixar claro é que a regra da porta 80 já está criada, pelo menos era assim no meu. Se estiver criada a regra, então só edite o seu IP lá. No final vai ficar assim: E também não se esqueça de abrir as portas no Firewall, Ok ?
    1 ponto
  10. krex

    Teaser #5 - Itens

    Hey Aproveitando o feriadão pra dar um avanço no Khorem. Como o mapa já está quase completo (digo quase pq conforme for adicionando novas coisas vou continuar editando) é hora de focar em uma nova área. Hoje adicionei alguns sprites que tinham sido doados já faz teeeeeempo. Vou começar a adicionar e configurar os "status" dos itens, seus atributos e pra qual vocação usar. Não sei quanto tempo leva, mas é algo bem chato :3 É isso. Um mini-teaser só pra ir mostrando o que está sendo feito
    1 ponto
  11. Bom Galerinha várias pessoas estavam me pedindo um tutorial de como substituir sprites no client! então fiz esse tutorial a pedido de vocês . Tutorial Super fácil ! vamos começar! Programas Necessários! 1° Spr editor feito pelo Cristofer Martins!. 2° Spr do seu servidor e do Servidor que você quer pegar as Sprites. Bom Começando agora o Tutorial. 1° Selecione a versão do seu client no caso 8.54 o de Poketibia e Selecione onde está localizado sua SPR. 2° Clique em Extract para começar a abrir sua SPR. OBS: você Pode abrir 2 Programas ao mesmo tempo. 3° Espere carregar a barrinha verde. ai depois clique em Ok. 4° Agora vá na SPR do servidor que você quer copiar a Sprite e seleciona elas e depois clica em Export! OBS: Recomento criar uma pasta para as Sprites. 5° ficando assim na pasta que você selecionou para ficar as Sprites. 6° Agora volte na sua SPR e Selecione a mesma quantia de Sprites que você exportou no meu caso 12 sprites sem contar a Sprite do corpo do pokemon. OBS: Recomendo selecionar Sprites dos monstros de tibia. 7° Agora você seleciona as 12 Sprites que você exportou do client que você queria pegar as Sprites. 8° Ficando assim na Sua SPR . 9° Agora para salvar só você clicar em compile e depois ir na sua SPR e salvar por cima. Pronto galera é isso ai só esperar salvar e pronto você substituiu sprites no seu client. depois Se quiser criar ele no dat faço outro tutorial mais já tem um tutorial desse genero no Xtibia. Créditos: PxG Pelo client usado para pegar o Bulbasaur. Cristofer Martins pelo SPR editor usado. E eu por fazer o Tutorial ​ Download do SPR editor by: Cristofer Martins Download: http://www.4shared.com/archive/BYQgxaDt/SprEditor.html
    1 ponto
  12. <---------------------------------------------------------------------------------------------> Sinopse (anime): Avatar A Lenda de Aang, A humanidade se divide em quatro nações: a Tribo da Água, o Reino da Terra,a Nação do Fogo e os Nômades do Ar. Dentro de cada nação, há homens e mulheres geniais, chamados de “Dobradores”, que tem a capacidade de dominar seus elementos nativos, fazendo uma “dobra”, que combina artes marciais variadas. Para manter o equilíbrio entre estas nações, existe um único dobrador que é capaz de controlar todos os quatro elementos. Esse é o Avatar, um escolhido que manifesta o espírito do mundo em uma forma humana. <---------------------------------------------------------------------------------------------> Introdução: Olá pessoal, passamos esses últimos meses criando um servidor de avatar, com sistemas inovadores e uma jogabilidade unica, como poucos já jogaram alguns servidores de avatar que nunca foram para frente, aqui pode ter certeza que vai, estamos investindo forte e com muita dedicação ao projeto, e posso dizer que ele já está em fase final, o servidor vai contar com 4 vocações, ar, água, terra e fogo, 18 magias para cada vocação, muitas quests e mistérios a serem desvendados. <---------------------------------------------------------------------------------------------> Vocações (Classes): Dobrador de Terra: "Um dobrador de terra consegue atingir o equilíbrio. Seu poder é grande e com facilidade de manipular seus adversários." Dobrador de Fogo: "Uma dobra poderosa, que se bem aprendida, pode devastar todo o mundo(ou quase todo)! Danos incríveis, mas precisa de ser rápido, porque não apresenta muitas dobras de suporte!" Dobrador de água: "Uma dobra delicada, que consegue causar dano devastador e também consegue curar seus amigos!" Dobrador de Ar: "Uma dobra excelentemente ágil, que garante uma tranquilidade para chegar e sair dos lugares. Porém, a agilidade faz com que seus danos não sejam muito potentes." <---------------------------------------------------------------------------------------------> Sistemas: MINERAÇÃO: "Você pode minerar pedras em cavernas com uma pick, utilizando ela na terra você pode adquirir pedras normais e pedras raras (1% de chance) e com elas e outros items que podem ser conseguido no jogo você pode forjar seus próprios items." Forja: "Para forjar você precisa ter o skill de forja necessário para fazer alguns items, items iniciais você não precisa de skill, somente da receita para faze-lo, conforme você vai forjando items você aumenta sua skill e pode forjar novos items e items mais raros." OBS: Ambos os sistemas você pode aumentar sua skill de forja e mineração. <---------------------------------------------------------------------------------------------> MAGIAS E OUTFITS: Cada vocação tem 2 outfits. Cada vocação tem 18 dobras(magias),começando no level 1 e indo até o level, contando com dobras secretas a serem descobertas dentro do jogo. MAGIA DE AR: "Magia aonde o usuário utiliza uma bola de ar para locomover-se mais rápido." MAGIA DE TERRA: "Magia aonde o dobrador cria uma onda de rochas, acertando seus inimigos a sua frente e empurrando eles para longe." MAGIA DE ÁGUA: "Magia aonde o usuário invoca um dragão de aguá atacando todos ao redor do lago." MAGIA DE FOGO: "Magia devastadora aonde o usuário chama uma chuva de meteoros causando um grande dano a todos ao redor." <---------------------------------------------------------------------------------------------> NOVOS MONSTROS: <---------------------------------------------------------------------------------------------> MAPA FIEL AO DESENHO: BA SING SE - EM CONSTRUÇÃO: CIDADE DOS NOMADES DO AR: Bom por em quanto é isso galera, espero que vocês tenham gostado e se vocês gostaram e querem receber noticias do servidor acessem a pagina do facebook e curtam, obrigado pela atenção! Facebook Avatar Online
    1 ponto
  13. Tenho interesse em ensinar e ajudar. O Omega tem o meu contato e minha atenção quando precisar me contatem.
    1 ponto
  14. XangoOTserver

    [8.6] Xango OTserver

    XangoOTserver, aberto a menos de 24/7 SEM LAG!. Venha ser o TOP! http://xango.servegame.com VIP I, VIP II e área donate(preços no site) TA ESPERANDO OQUE ? VENHA JOGAR AGORA! IP: xango.servegame.com Host é LGV Host, pago por 3 meses, doe e ajude o servidor a ficar ativo VIP I. 3KK DIGITE !buyvip(!vipdays para ver quanto tempo tem de vip). VIP II. Quest Vip! Vip III. Info no site Donates tem Fast Attack, Vocação nova(Xango Sorcerer, Xango Druid, Xango Paladin e Xango Knight), e podem usar runas novas e itens novos NOVAS VOCAÇÕES, NOVAS MAGIAS NOVOS ITENS! XP Rate: 1~200 = 1200X 201~450 = 900X 451~700 = 700X 701~900 = 600X 901+ = 500X Skills rate: 80x Loot rate: 5x Magic rate: 60x Spawns rate: 3x Protection lvl: 150 Lembrando o IP é: xango.servegame.com e a porta é 7171 Account manager 1/1
    1 ponto
  15. Substitui o código do npc por este: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local storage = 2014042021 local vocation = 350 if(msgcontains(msg, 'mestre kame') or msgcontains(msg, 'kame')) then selfSay('Voce realmente deseja se tornar um {Mestre Kame}.', cid) talkState[talkUser] = 1 elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then if(getPlayerItemCount(cid, 9971) >= 30) then doPlayerRemoveItem(cid, 9971, 30) doPlayerSetVocation(cid, vocation) setPlayerStorageValue(cid, storage, vocation) selfSay('Voce se tornou um Mestre Kame.', cid) else selfSay('Você não tem {vip coins} suficientes.', cid) end talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Cria um arquivo .lua em data/creaturescripts/scripts e coloca isso: function onLogin(cid) local storage = getPlayerStorageValue(cid, 2014042021) if storage ~= -1 then doPlayerSetVocation(cid, storage) end return true end Depois é só colocar a tag no creaturescripts.xml (me avisa se vc n souber fazer)
    1 ponto
  16. doCreatureSetHideHealth(cid, true)
    1 ponto
  17. Você adicionou a TAG no creaturescripts.xml? Se não, adicione isso: <event type="login" name="noticeDuuh" script="nomedoseuarquivo.lua"/> Editando a parte: script="" colocando o nome do seu arquivo.lua Abraço, testei aqui e funcionou.
    1 ponto
  18. Tópico movido para a seção de dúvidas e pedidos resolvidos.
    1 ponto
  19. Mateusoo

    Simple Task by Vodkart

    Olá, Retira do Login.lua. Utilize o daqui: <?xml version="1.0" encoding="UTF-8"?> <mod name="simple Task" version="3.0" author="Vodkart" contact="xtibia.com" enabled="yes"> <config name="task_func"><![CDATA[ tasktabble = { ["tarantula"] = {monster_race={"tarantula"}, storage_start = 200201, storage = 91001,count = 600,exp = 150000,reward = {{2477,1},{7903,1}}}, ["mammoth"] = {monster_race={"mammoth"}, storage_start = 200202, storage = 91002,count = 600,exp = 400000,reward = {{7432,1},{3973,1},{7463,1}}}, ["ice golem"] = {monster_race={"ice golem"}, storage_start = 200203, storage = 91003,count = 600,exp = 1500000}, ["quaras"] = {monster_race={"quara constrictor","quara hydromancer","quara mantassin","quara pincher","quara predator","quara constrictor scout","quara hydromancer scout","quara mantassin scout","quara pincher scout","quara predator scout"}, storage_start = 200204, storage = 91004,count = 600,exp = 1200000,reward = {{2487,1},{7383,1},{2497,1}}}, ["mutated rats"] = {monster_race={"mutated rat"}, storage_start = 200205, storage = 91005,count = 400,exp = 1000000,reward = {{7884,1},{2438,1},{3476,1}}}, ["giant spiders"] = {monster_race={"giant spider"}, storage_start = 200206, storage = 91006,count = 1000,exp = 500000, reward = {{2477,1},{7416,1},{7419,1},{2476,1}}}, ["hydra"] = {monster_race={"hydra"}, storage_start = 200217, storage = 91017,count = 4000, exp = 500000, reward = {{6433,1},{2195,1},{2476,1}}}, ["sea serpent"] = {monster_race={"sea serpent"}, storage_start = 200218, storage = 91018,count = 4000, exp = 70000,reward = {{8887,1},{10521,1}}}, ["pirate one"] = {monster_race={"pirate buccaneer","pirate corsair","pirate cutthroat","pirate ghost","pirate marauder","pirate skeleton"}, storage_start = 200207, storage = 91007,count = 6000,reward = {{6102,1}}}, ["pirate two"] = {monster_race={"pirate buccaneer","pirate corsair","pirate cutthroat","pirate ghost","pirate marauder","pirate skeleton"}, storage_start = 200208, storage = 91008,count = 6000,reward = {{6101,1}}}, ["pirate three"] = {monster_race={"pirate buccaneer","pirate corsair","pirate cutthroat","pirate ghost","pirate marauder","pirate skeleton"}, storage_start = 200209, storage = 91009,count = 6000,reward = {{6099,1}}}, ["pirate four"] = {monster_race={"pirate buccaneer","pirate corsair","pirate cutthroat","pirate ghost","pirate marauder","pirate skeleton"}, storage_start = 200210, storage = 91010,count = 6000,reward = {{6100,1}}}, ["minotaur"] = {monster_race={"minotaur","minotaur mage","minotaur archer"}, storage_start = 200211, storage = 91011,count= 10000}, ["necromancer"] = {monster_race={"necromancer","priestess"}, storage_start = 200212, storage = 91012,count= 8000, exp = 2000}, ["demon"] = {monster_race={"demon"}, storage_start = 200221, storage = 91021,count = 12666, exp = 70000, money = 200000, reward = {{2495,1},{2520,1},{2472,1}}}, } configbosses_task = { {race = "minotaur",playerpos = {x = 32439, y = 31990, z = 9}, FromposTopos = {{x = 32434, y = 31989, z = 9},{x = 32448, y = 32001, z = 9}},time = 5}, {race = "necromancer",playerpos = {x = 32610, y = 32795, z = 8}, FromposTopos = {{x = 32605, y = 32785, z = 8},{x = 32614, y = 32795, z = 8}}, time = 5}, } function issummon(uid) return uid ~= getcreaturemaster(uid) or false end function checkTask(cid) for k, v in pairs(tasktabble) do if getplayerstorageValue(cid,v.storage_start) >= 1 then return true end end return false end function finisheAllTask(cid) local config = { exp = {false,100000}, money = {false,200000}, items ={false,{{2124,2},{2173,1}}}, premium ={false,5} } local x = true for k, v in pairs(tasktabble) do if tonumber(getplayerstorageValue(cid,v.storage)) then x = false end end if x == true then setplayerstorageValue(cid, 521456, 0) local b = getGlobalstorageValue(63005) if b == -1 then b = 1 end if b < 11 then setGlobalstorageValue(63005,b+1) doBroadcastmessage('[Task mission complete] '..getcreatureName(cid)..' was the '..b..' to finish the task!.') doplayerAddpremiumDays(cid, config.premium[1] == true and config.premium[2] or 0) doplayerAddExp(cid, config.exp[1] == true and config.exp[2] or 0) doplayerAddmoney(cid, config.money[1] == true and config.money[2] or 0) if config.items[1] == true then doAddItemsFromList(cid,config.items[2]) end doItemsetAttribute(doplayerAddItem(cid, 7369), "name", "trophy "..getcreatureName(cid).." completed all the task.") end end end function haveplayerposition(cid, from, to) return isInRange(getplayerposition(cid), from, to) and true or false end function getRankstorage(cid, value, max, RankName) -- by vodka local str ="" str = "--[".. (RankName == nil and "RANK sTORAGE" or ""..RankName.."") .."]--\n\n" local query = db.getResult("sELEcT `player_id`, `value` FROm `player_storage` WhERE `key` = "..value.." ORDER BY cast(value as INTEGER) DEsc;") if (query:getID() ~= -1) then k = 1 repeat if k > max then break end str = str .. "\n " .. k .. ". "..getplayerNameByGUID(query:getDatastring("player_id")).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end return doshowTextDialog(cid, 2529, str) end function getItemsIncontainerById(container, itemid) -- Function By Kydrai local items = {} if iscontainer(container) and getcontainersize(container) > 0 then for slot=0, (getcontainersize(container)-1) do local item = getcontainerItem(container, slot) if iscontainer(item.uid) then local itemsbag = getItemsIncontainerById(item.uid, itemid) for i=0, #itemsbag do table.insert(items, itemsbag[i]) end else if itemid == item.itemid then table.insert(items, item.uid) end end end end return items end function doplayerAddItemstacking(cid, itemid, quant) -- by mkalo local item = getItemsIncontainerById(getplayerslotItem(cid, 3).uid, itemid) local piles = 0 if #item > 0 then for i,x in pairs(item) do if getThing(x).type < 100 then local it = getThing(x) doTransformItem(it.uid, itemid, it.type+quant) if it.type+quant > 100 then doplayerAddItem(cid, itemid, it.type+quant-100) end else piles = piles+1 end end else return doplayerAddItem(cid, itemid, quant) end if piles == #item then doplayerAddItem(cid, itemid, quant) end end function getItemsFromList(items) -- by vodka local str = '' if table.maxn(items) > 0 then for i = 1, table.maxn(items) do str = str .. items[i][2] .. ' ' .. getItemNameById(items[i][1]) if i ~= table.maxn(items) then str = str .. ', ' end end end return str end function doAddItemsFromList(cid,items) -- by vodka if table.maxn(items) > 0 then for i = 1, table.maxn(items) do local count = items[i][2] while count > 0 do if isItemstackable(items[i][1]) then doplayerAddItemstacking(cid, items[i][1], 1) else doplayerAddItem(cid, items[i][1],1) end count = count - 1 end end end end function pairsByKeys(t, f) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 local iter = function () i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end ]]></config> <event type="kill" name="KillTask" event="script"><![CDATA[ domodlib('task_func') function onKill(cid, target, lasthit) if ismonster(target) and not issummon(target) then local n = string.lower(getcreatureName(target)) for race, mob in pairs(tasktabble) do if getplayerstorageValue(cid,mob .storage_start) >= 1 then for i = 1,#mob.monster_race do if n == mob.monster_race[i] then local contagem = getplayerstorageValue(cid, mob.storage) if not tonumber(contagem) then return true end if (contagem == -1) then contagem = 1 end if contagem > mob.count then return true end setplayerstorageValue(cid, mob.storage, contagem+1) doplayersendTextmessage(cid, mEssAGE_sTATUs_cONsOLE_ORANGE,""..(contagem == mob.count and "congratulations! You finished the task of "..race.."." or "defeated. Total [" .. contagem .. "/" .. mob.count .. "] " .. race .. ".").."") end end end end end return true end]]></event> <event type="login" name="TaskLogin" event="script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "KillTask") return true end ]]></event> <talkaction words="/task;!task" event="buffer"><![CDATA[ domodlib('task_func') local param = string.lower(param) if param == "rank" then getRankstorage(cid, 521456, 20, "Task Rank Finalizadas") return true end local str = "" str = str .. "Task completed :\n\n" for k, v in pairsByKeys(tasktabble) do local contagem = getplayerstorageValue(cid, v.storage) if (contagem == -1) then contagem = 1 end str = str..k.." = ".. (not tonumber(contagem) and "["..contagem.."]" or "["..((contagem)-1).."/"..v.count.."]") .."\n" end str = str .. "" return doshowTextDialog(cid, 8983, str) ]]></talkaction></mod> Você mudou todos os "C" para "c" fazendo com que a função: registerCreatureEvent ficasse assim: registercreatureEvent A primeira função existe, porem a segunda não. Cuidado. Abraço.
    1 ponto
  20. Otimo, e tambem pelo o que eu falei, seria chato usar o Item X e o Item Y desaparecer, por ser do mesmo ID. Muito obrigado pela ajuda :] Muito bom, quanto mais gente ajudando melhor não acha? HAHA Valeu pela ajuda Abraço.
    1 ponto
  21. Boa tarde, Testa ai agora: -- Script SYtem vip 1.0 -- function onSay(cid, words, param) if(words == "!buyvip") then local itemid = 2159 local count = 10 if doPlayerRemoveItem(cid, itemid, count) then local days = 30 local daysvalue = days * 24 * 60 * 60 local storageplayer = getPlayerStorageValue(cid, 13540) local timenow = os.time() if getPlayerStorageValue(cid, 13540) - os.time() <= 0 then time = timenow + daysvalue else time = storageplayer + daysvalue end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Foram adicionados ".. days .." dias de VIP no seu character.") setPlayerStorageValue(cid, 13540, time) local quantity = math.floor((getPlayerStorageValue(cid, 13540) - timenow)/(24 * 60 * 60)) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você tem ".. quantity .." dias de VIP restantes.") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você precisa de "..price.." gp's para colocar vip.") end elseif(words == "!vipdays") then local timenow = os.time() local quantity = math.floor((getPlayerStorageValue(cid, 13540) - timenow)/(24 * 60 * 60)) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você tem ".. (quantity < 0 and 0 or quantity) .." dias de VIP no seu character.") elseif(words == "/checkvip") then if getPlayerAccess(cid) == 5 then if not param then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.") end local player = getPlayerByName(param) local pid = getPlayerByNameWildcard(param) if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player with this name doesn\'t exist or is offline.") return TRUE end local timenow = os.time() local quantity = math.floor((getPlayerStorageValue(player, 13540) - timenow)/(24 * 60 * 60)) doPlayerPopupFYI(cid, "O jogador tem ".. (quantity < 0 and 0 or quantity) .." dias de VIP no character.") return TRUE end elseif(words == "/addvip") then if getPlayerAccess(cid) == 5 then local t = string.explode(param, ",") if not t[2] then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.") end local player = getPlayerByName(t[1]) local days = t[2] local pid = getPlayerByNameWildcard(t[1]) if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player with this name doesn\'t exist or is offline.") return TRUE end local daysvalue = days*3600*24 local storageplayer = getPlayerStorageValue(player, 13540) local timenow = os.time() local time = storageplayer <= 0 and (timenow + daysvalue) or (storageplayer + daysvalue) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Foram adicionados "..days.." dias de VIP no seu character.") setPlayerStorageValue(player, 13540, time) local quantity = math.floor((getPlayerStorageValue(player,13540) - timenow)/(3600*24)) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Você tem "..quantity.." dias de VIP restantes.") end elseif(words == "/delvip") then if getPlayerAccess(cid) == 5 then local dec = MESSAGE_INFO_DESCR if(param == "") then return TRUE,doPlayerSendTextMessage(cid,18,"Command param required.")end local C,t = {},string.explode(param, ",") C.pos = getPlayerPosition(cid) C.uid = getCreatureByName(t[1]) C.time = ((tonumber(t[2]) == nil) and 1 or tonumber(t[2]))*3600*24 --Tempo da vip por dia. C.days = (tonumber(t[2]) == nil) and 1 or tonumber(t[2]) --Dias de vip. local pid = getPlayerByNameWildcard(t[1]) if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player with this name doesn\'t exist or is offline.") return TRUE end if(getPlayerStorageValue(C.uid,13540) < C.time)then doPlayerSendTextMessage(cid,dec,'O jogador '..t[1]..' não possui '..C.days..' dias de vip.') else doPlayerSendTextMessage(cid,dec,'Você removeu '..C.days..' dias de vip do player '..t[1]..'.') setPlayerStorageValue(C.uid,13540,getPlayerStorageValue(C.uid,13540)-C.time) end doSendMagicEffect(C.pos, math.random(28,30)) end end return TRUE end A variavel itemid está o ID do item que será removido, no caso o ID do Scarab Coin e a variavel Count será a quantidade que será removido, coloquei para 10, edite a vontade. Abraço e aguardo respostas. ~Não testado.
    1 ponto
  22. Acho que seria interessante trocar doPlayerRemoveItem(cid, item.itemid, 1) por: doRemoveItem(item.uid, 1)
    1 ponto
  23. Boa tarde, Experimente: --Usar item e receber exp, com verificação de remover o item ou não - By: Mateuso local qntexp = 1000 --Quantidade de exp que o player vai receber local removeitem = true --Se TRUE o item irá desaparecer se FALSE o item permanecerá e poderá ser usado infinitas vezes function onUse(cid, item, fromPosition, itemEx, toPosition) if removeitem == true then doPlayerSendTextMessage(cid, 4, "Você recebeu: "..qntexp.." pontos de experiencia, e o seu "..getItemName(item.uid).." desapareceu.") doPlayerAddExp(cid, qntexp) doRemoveItem(item.uid, 1) return true else doPlayerSendTextMessage(cid, 4, "Você recebeu: "..qntexp.." pontos de experiencia.") doPlayerAddExp(cid, qntexp) return true end end Onde a variável qntexp é igual a quantidade de experiencia que o player irá ganhar e a variável removeitem é(true ou false), para verificar se o item será removido depois de ser usado. Coloque esse script na pasta: Data/Actions/Scripts com o nome de itemaddexp.lua e adicione a seguinte TAG no Actions.xml: <action itemid="xxxx" script="itemaddexp.lua"/> Onde o xxxx é o id do item que você quer que adicione exp. Qualquer problema com o script poste aqui, e eu lhe ajudarei. Testei aqui e funcionou perfeitamente. Um grande abraço e boa sorte. Não é permitido a postagem desse script em mais nenhum outro local. ~Edit: Alterada função: doPlayerRemoveItem por doRemoveItem para mais realidade no script. Credito: Demonbholder.
    1 ponto
  24. é pra mandar de 1 em 1 segundo? se for... function unparalyze(cid) return isPlayer(cid) and doCreatureSetNoMove(cid, false) end function magicEfe(cid, times) if times > 0 and isPlayer(cid) then doSendMagicEffect(getCreaturePosition(cid), 189) addEvent(magicEfe, 1000, cid, times-1) end end function onCastSpell(cid, var) local target = getCreatureTarget(cid) if not isCreature(target) then doPlayerSendCancel(cid, 'You may only use this on human targets.') return false end doCreatureSetNoMove(target, true) addEvent(unparalyze, 5000, target) doSendMagicEffect(getCreaturePosition(target), 189) addEvent(magicEfe, 1000, target, 5) return true end ps: não testei, vê como ta
    1 ponto
  25. Maenilse

    distro tfs

    faz o download ae, ta com o war system q tu pediu. Download: Distro
    1 ponto
  26. homersapiens

    VOTAÇÃO - AMA #100!

    1. Codeur 2. Alex 3. Avuenja
    1 ponto
  27. vlw por nada ¬¬ pode fexa ja resolvi SOSSINHO!
    1 ponto
  28. Provavelmente fica em creaturescript, procura na pasta creaturescripts, vê no .xml todos creaturescript que tem "onLogin", vê os nome algo de janela inicial.lua e ai vai na pasta scripts abre e edita ;-;
    1 ponto
  29. Não é o monsters.xml que você tem que importar e sim o arquivo do monstro (nome_do_monstro_de_exemplo.xml) e mesmo assim in game não vai aparecer ele como mago e sim com a outfit que você colocou no script do monstro.
    1 ponto
  30. Killua

    !teleport com lista

    Ele já está mandando o efeito de teleport nas duas posições. Você quer por outro efeito? Se for, basta mudar essas duas linhas: doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) doSendMagicEffect(abc.pos, CONST_ME_TELEPORT) Altere os CONST_ME_TELEPORT para o nome ou número do efeito que quiser.
    1 ponto
  31. TottyzinSM

    nome saindo do chao

    Ou Então pode está no chão incorreto Ou! pos não está correto estárei aqui se você precisar de ajudaa..
    1 ponto
  32. Dbko

    nome saindo do chao

    Mano Em Globalevents `Tem um Arquivo.lua Chamado Texto Ou Pt E Tem os Texto Lá So Remover Ou então editar e Dps em Globalevents.xml remova a tag tbm que estejá com mesmo nome <globalevent name="texto" interval="0" script="texto.lua" /> para não dar erro na distro
    1 ponto
  33. dyego2008

    [Dúvida] New sprites

    Recomendo usar o Object Builder, na seção de download, nos utilitários, ele é ótimo.
    1 ponto
  34. Erro na compilação ... error: CPU you selected does not support x86-64 instruction set
    1 ponto
  35. Maenilse

    Erro Distro

    ae cara, to de saida se ninguem te ajudar, amanha to postando aqui a distro.
    1 ponto
  36. Descobri algumas coisas, o arquivo que chama os arquivos g1.png g2.png e g3.png para o launcher é o gallery.otml localizado na pasta pxgclient/pxgclient/news, pois modifiquei de g1.png para g432.png, e no launcher ele só abriu o squirtle e o bulba, após mudar no gallery.otml o nome de g1.png pra g432.png funcionou normalmente. Faz uma cópia do launcher e cola no seu desktop, só o launcher.exe, se tu tentar abrir vai ver que abre normalmente, ele é programado pra ir na pasta pxgclient que fica no %appdata%/roaming, eu abri o launcher.exe com o hex editor e procurei algumas coisas tendo alguns resultados, todos arquivos .bc são os .lua criptografados, todos arquivos .bt são .png, arquivos .ba NÃO TENHO CERTEZA mas acho que são .ogg. Mas porque os .png seriam os .bt se na parte pxgclient/pxgclient/news tem arquivos .png? Porque aqueles arquivos são mudados de update em update e não mudam nada se pegarem eles pois são só imagem executadas no launcher. No launcher.exe também encontrei funções similares a linguagem lua, tipo get set e is, todas pelo hex dentro do launcher.exe Depois coloco mais algumas coisas
    1 ponto
  37. Insaend

    Fairy Tail Online [FTO] - Show Off Gráfico

    Realmente gostei espero poder entra nessa aventura logo!
    1 ponto
  38. BrenoNeto

    BrenoNeto ShowOFF

    - Necronia Sprite - -Fairy Tail Online-
    1 ponto
  39. lazarocp

    Novidade: Poketibia 9.60

    Respondendo como Mudar ip vai na pasta do client abre a pasta mods abra o kingdomage.otmod com bloco de notas dentro vai encontrar Module name: game description: Otclient mods author: Lazarocp website: https://github.com/otclient sandboxed: true autoload: true autoload-priority: 1000 @onLoad: | EnterGame.setUniqueServer('seu ip aki', 7171, 960)
    1 ponto
  40. vital900

    Montanhas [Pt.#02]

    Antes de mostrar a área gostaria de dizer que eu a perdi no meio da confecção do tutorial, logo não ficou algo bom e 100%completo.. Mas esta razoável e da para captar a essência do que desejo ensinar a vocês. Partirei do pré-suposto que vocês já sabem como fazer o formato da montanha, como já fora ensinado. Preencha o seu formato com ground (a sua escolha o tipo de chão e o tipo de montanha usada). Colocado o chão, ponha as bordas.. Lembre-se quando se trata de montanhas temos 2 tipos de bordas principais (cada qual tem inúmeras variações), a borda do tipo um é uma borda de ground, ou seja, é uma borda para se por no chão ao redor de toda a montanha. Após ter colocado sua borda de chão, coloque o segundo tipo de borda as bordas de parede.. Diferente da primeira borda, esta borda deve ser posta apenas em alguns locais.. Ou seja, algo meio randomizado, não fica bom caso haja exagero destas bordas.. Após ter feito o preenchimento completo de sua montanha, você deve terminar de detalhar.. Para isto basta saber como utilizar da natureza a seu favor, ta meio feio a minha área porque ela esta incompleta (como já fora dito).
    1 ponto
  41. FlamesAdmin

    Mapa Johto - Contruçao

    Eae galera, fmz ? A um tempo atras eu postei esse mapa: www.xtibia.com/forum/topic/210426-pokemon-mapa-frontier-access/ mais fecharam o topico pq eu estava sem net. Entao venho aqui postar denovo esse mapa que estou fazendo da regiao Johto, entao vamos la. Sao 3 cidades que estao no mapa, 1 em construçao ainda. Prints: Download: AQUI Scan nao é necessario pq o 4Shared ja faz o scan. Em breve postarei mais atualizaçoes. SEM TEMPO PRA MECHER NO MAPA, DANDO OS ULTIMOS AJUSTES NO MEU SERVIDOR PARA COLOCAR ELE NO DEDICADO.
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...