Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 03/09/14 em %

  1. 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
    6 pontos
  2. Bom dia galera do XTibia! Venho por meio deste tópico perguntar e fazer uma enquete para saber se na opinião de vocês OTAdmins o cliente flash seria essencial para seu servidor seja ele derivado ou não. Oque o cliente flash mudaria no servidor? Bom, basicamente os acessos, pois quem entra no site e cria sua conta enquanto baixa o cliente, você não tem ciência de que ha pessoas que gostam e tem net compartilhadas & escada... Flash não pesa? Cliente flash é uma aplicação em flash que mecher com cookies, no servidor que hospeda pode ser pesado, porém para o acessante o primeiro acesso é o de mais paciência, pois os demais já estão guardados em cache/cookies. Sendo assim o cliente carrega mais rapidamente sem interrupções repentinas. Como posso ter este script? Isto existe? Não, ainda nunca vi nenhum website comportando cliente em flash, porém tenho um amigo de um amigo que é parceiro do amigo da escola do meu amigo que me disponibilizou um script em flash que não é perfeitamente funcional, porém eu fiz uns ajustes e ele pode ser adaptado a um servidor de tibia sim! Isto é bom? Você vai vender este script? Bom, com a venda deste script eu tenho oque comer no dia seguinte (#ZOA), porém vou disponibiliza-lo no XTibia na hora certa, nunca vi um servidor com este tipo de script, estou fazendo deste script um private source do ekz, ou seja. Apenas usuários registados do XTibia poderão utilizar. Maaaas poow, quero pro meu ot gringo! Bom, venha fazer parte de nossa família, compartilhar o conteúdo de sua sabedoria no fórum... Vamos te ajudar o mesmo tanto ou mais que você nos ajudar; Tópico aberto para quais quer tipo de duvidas, criticas e sugestões.
    5 pontos
  3. Olá comunidade, O meu nome é Lucas Melo, conhecido como LuquitossML, eu recebo muitas mensagens aqui no fórum de membros que gostariam de auxilio para a criação/edição de uma sprite e outros com interesse de aprender a spritear, como eu não tenho tempo para ajudar todo mundo, decidi fazer um tutorial, neste tutorial eu vou compilar tudo aquilo que você precisa saber para começar a arte da perspectiva 45°. Aqui nós vamos aprender passo a passo para a criação de uma sprite. Tutorial Básico sobre quase tudo aquilo que você precisa saber. Introdução: Definição Geral.No Tibia, assim como todos os jogos, os elementos gráficos são chamados de Sprites. Para criar estes sprites, utilizamos uma técnica de design gráfico conhecida pelo nome de Pixel Art. Pouca gente conhece essa arte, que surgiu com os primeiros videogames. Pixel art significa fazer Arte através da utilização de Pixels. Pixel são os pequenos quadrados que compõe as imagens gráficas de qualquer sistema televisual. A organização correta de pixels pode gerar formas que podem ser reconhecidas como animais, objetivos, fotografias, plantas, animações variadas, etc. Técnicas de pixel artPixel art conta com algumas técnicas diferentes de qualquer outro tipo de arte, por ser uma arte de baixa resolução. Dithering: É o uso de padrões de pixels para se criar a ilusão de que existem mais cores do que realmente se estão sendo usadas. Também é usado para se fazer texturas. Anti-Alias (ou AA): Técnica para se suavisar linhas, usando tons médios para reduzir o contraste entre a cor da linha e a cor que envolve a linha. Sombreamento: O sombreamento em pixel art deve ser feito como em objetos reais, com base em uma fonte de luz. Sombrear a figura das bordas para o centro é um erro bastante comum, chamado de Pillow Shading (ou sombreamento 'travesseiro') Salvando deu Trabalho:Para se salvar um trabalho seu no computador, deve-se usar o formato correto. JPG é um formato que usa um tipo de compressão bom apenas para imagens suaves e contínuas. Se usado no pixel art, causa uma enorme perda de qualidade BMP é um formato que apesar de manter a qualidade, acaba resultando em um arquivo muito pesado GIF e PNG são os formatos mais apropriados. GIF, com uma paleta limitada a 256 cores, é o formato ideal, já que é o menor e dificilmente o pixel art terá tantas cores. Se você usa o programa Paint para fazer pixel art, salve como PNG, pois quando o Paint salva como GIF, ele usa uma paleta de cores padrão, e causará alterações de cores no seu pixel art. Categorias:Pixel art é normalmente dividido em duas categorias. Isométrico é o pixel art que imita uma visão em 3 dimensões, mas que não possui perspectiva. Não-isométrico é qualquer outro tipo de visão como Front View (frente) ou Top View (de cima) Como começar a fazer Pixel Art? Existem vários programas para se fazer Pixel art. O mais simples deles é o conhecido Microsoft Paint, ou como dizem: MS Paint. A interface do Paint, é muito muito simples, e com o tempo você entenderá cada uma das funções que ele é capaz de realizar. Ferramentas Básicas:LUPA - Amplia ou reduz o CANVAS (Área onde se desenha ou Área selecionada). LÁPIS - Ferramente capaz de pintar um pixel por vez. BORRACHA - Apaga o que foi desenhado. LATA DE TINTA - Preenche formas com cores. Controles Básicos. CTRL + A = Seleciona todo o Canvas. CTRL + C = Copiar Canvas. CTRL + E = Abre a Janela de Atributos do Canvas. CTRL + F = Fullscreen CTRL + G = Cria uma grade de pixels nos aumentos de 6x e 8x da LUPA CTRL + R = Abre Janela de Inverter ou Girar o Canvas. CTRL + T = Ocultar Barra de Ferramentas. CTRL + V = Colar Canvas. CTRL + Z = Desfazer ação. Desenvolvimento: Agora que já temos uma abordagem geral sobre o tema, vamos aprofundar nossos estudos. Luz e Sombra na perspectiva 45°.Para quem está começando é essencial ter noção de como a luz se comporta na perspectiva que focamos. De modo simples, a luz tem sua fonte a 45 graus acima do objeto, ou seja, a parte "noroeste" do sprite precisa sempre estar mais iluminado do que a parte "sudeste". Vejamos: Obs: Virar a sprite horizontalmente permite verificar se a luz está se comportando da maneira correta (Vindo de uma fonte que está a esquerda e acima do sprite - ou seja, a noroeste ) Lembrem-se de sempre considerar que a parte sudeste não é totalmente escura. Pois a parte da luz que vem do noroeste e chega até sudeste cruzando o sprite, pode refletir/refracionar e iluminar a parte sudeste, mas lógicamente, essa luminosidade será menor. Uma das regras mais importantes e obrigatórias caso seu intuito seja seguir o padrão Tibia: A luz vem do noroeste, mas mesmo assim, ainda existe luz vinda das demais fontes naturais e refletidas pelas superfícies. Sendo assim, seu sprite recebe luz de todas as direções, mas preferencialmente pelo Noroeste. Anti-Aliasing (AA). Quando trabalhamos com pixels percebemos que as bordas dos desenhos costumam aparentar muito o fato de que os pixels são de fato quadrados. O problema de muitos desenvolvedores gráficos no começo do pixel art, foi justamente no momento em que precisavam desenhar elementos que não seguissem o padrão quadrado dos pixels, como por exemplo Círculos, Esferas, e bordas redondas. Para muitos, a solução desse problema surgiu com a criação da ténica de Anti-Aliasing ou simplesmente AA. O AA foi um grande avanço no desenho de formas esféricas ou outras que precisassem passar a idéia de uma superfícia lisa, sem irregularidades. Mas como isto é possível se todo sistema televisual utiliza PIXELS para formar gráficos? A resposta é simples: O AA utiliza pixels que misturam as linhas com o plano de fundo em que elas estão. Quando isto é feito, nossos olhos não conseguem distinguir as irregularidades dos pixels. Em primeiro lugar devido ao tamanho dos pixels e segundo lugar devido a uma boa suavização de bordas. Vejam no exemplo: http://img507.imageshack.us/img507/8484/aaexampleok2zl9.png Obs: Créditos da imagem: Galiant Na esquerda da 2° imagem, vemos o circulo formado de vários pixels pretos. Suas bordas estão "cruas" e sem AA. Assim, mesmo no aumento menor é possível perceber as falhas de suas bordas redondas. Na direita da imagem vemos o mesmo circulo após a aplicação da técnica de Anti-Aliasing. E agora, no aumento menor, não se pode mais ver as falhas das bordas. Como fazer Anti-Aliasing? O Anti aliasing é simples apesar de não parecer. Tudo se baseia em 3 passos: 1 - Observar primeiro o desenho que se quer suavizar. 2 - Observar o fundo no qual este desenho está inserido. 3 - Adicionar cores que simbolizam a mistura das cores do desenho, com o seu fundo. No exemplo acima (dos circulos) tinhamos um circulo PRETO, num fundo BRANCO, então apenas adicionamos tons de CINZA (PRETO + BRANCO) para suavizar a borda. No caso de uma sprite, o AA é feito internamente, ou seja, é feito dentro do outline/lineart da sprite, isso é feito utilizando no caso tons mais escuros nas partes cerrilhadas da sprite. Vejamos: Como podem ver na direita, a disposição dos pixels escuros nas partes mais cerrilhadas é o chamado AA, não é necessário que seja utilizado apenas preto para se fazer o Anti-Aliasing. Exemplo: "Ahh luquitos, eu quero fazer algo roxo, como eu faço AA nele?" Simples, apenas faça os passos iniciais para se fazer uma sprite: Faça um outline (contorno do sprite) Comece a pintar. comece a fazer o AA. (no caso do meu amigo da sprite roxa, utilize tons roxos escuros nas partes cerrilhadas da sprite) Logo depois do AA pronto faça a Iluminação, no caso, Luz e Sombra. Depois de todos esses passos, veja se não há mais nada para arrumar e "Voilá" Sua sprite está pronta. Conclusão: O Investimento do Tempo e Esforço. Trabalho em pixel art é demorado e muitas vezes de difícil processo. Quanto mais tempo você gasta trabalhando, e, em seguida, um pedaço de refino, Melhor será sua aparência. Isso muitas vezes pode levar horas, mas as recompensas valem a pena. Se você não está preparado para investir o tempo em seu trabalho, Ele não ira fluir, independentemente do número de tutoriais que você lê. Nada da certo na primeira vez? As primeiras interações com o seu outline/lineart ou imagem (sprite) sombreada pode muitas vezes ser frustrantes. Não desanime, mesmo os erros aparentemente mais hediondos podem ser editados em algo decente. Uma vez que a última versão de sua sprite é completa, sentar e dar uma boa olhada nela é essencial. Este reajuste geralmente divide-se em um simples ciclo de 3 etapas: 1 - O que aparentemente há de errado? 2 - Como posso corrigir? 3 - A fixação dele. O uso de referências. Muitas vezes, você pode compensar a falta de conhecimento sobre algum objeto através de imagens. Estes podem ser encontrados a partir de uma variedade de fontes, a mais imediata a ser através de um motor de busca na internet.Você também pode encontrar cores novas e interessantes a partir de fotografias e arte dos outros pixel. Lembre-se que o plágio direto, incluindo a edição do trabalho de outras pessoas, é distintamente ilegal. Espero que o tutorial tenha sido útil para alguém, caso o tutorial tenha uma grande repercussão e o pessoal mais duvidas, eu irei continuar atualizando ele com um conteúdo mais aprofundado sobre o tema. Obrigado a equipe do Xtibia pelo espaço. Atenciosamente, LuquitossML.
    2 pontos
  4. Wingardium

    Galeria {Wingardium}

    Opa galera, Me chamo Antony e, por uma eventualidade, entrei no "ramo" das sprites o qual estou gostando muito, mesmo sendo iniciante. Vou postar meus trabalhos aqui e gostaria de críticas construtivas para que eu melhore meu trabalho o quanto antes. Reunirei todos os trabalhos nesse mesmo tópico pra ninguém ficar precisando procurá-las em outras páginas (isso se eu fizer o suficiente pra ter outras páginas). Obs.: é melhor clicar na imagem para ver com a qualidade original. O site acaba dando uma leve embaçada nas sprites. Mas é isso ai, lá vai: Weapons The Green Arrow The Deathstroke The Incredible Hulk Modificação Hulk com correção de pillow shading Uzumaki Naruto Wolf 20/03/2014 Obs.: Estou ocupado com a faculdade e não terei muito tempo para praticar e postar novos trabalhos por pelo menos um mês. Mesmo assim, não deixem de comentar e criticar, pois farei o possível para responder dúvidas e atender a todas as críticas assim que possível ^^
    2 pontos
  5. u n d e r

    Estrutura modificada

    Boa tarde Xtibianos, qual a boa para este final de semana? Nossa equipe está tão motivada, que não para. A cada segundo, estamos nos movimentando buscando melhorar esta comunidade que voltou a crescer. Antes de "startar" as notícias, gostaria de agradecer a cada um que dia após dia tem elogiado e também criticado de forma construtiva as nuances de nosso fórum. 1º Aprovação de downloads Uma crítica esta semana nos chamou a atenção, para ler na íntegra, acesso o link abaixo: http://www.xtibia.com/forum/topic/229440-sugestao-aprovacao-de-downloads/ Para solucionarmos a situação, estaremos analisando membros de bom desempenho, que entenda e com uma boa conduta dentro de nosso fórum para estagiar nas seções de aprovações. Queremos de uma vez por todas, evitar que tópicos se acumulem nesta área, agilizando o processo e garantindo que todo o conteúdo seja liberado, atentando-se para a qualidade e segurança dos downloads disponibilizados. Obviamente estamos expostos a diversas situações, portanto, é muito importante também a colaboração de vocês para conseguirmos rastrear qualquer conteúdo nocivo ao usuário ou visitante do fórum. 2º Área de atendimento http://www.xtibia.com/forum/topic/229602-area-de-atendimento/ Com o objetivo de evitar qualquer "desvio" na interpretação do nosso fórum de atendimento aos membros do Xtibia, optamos por alterar a tratativa do nome. O atendimento funciona mais como um "retorno dos usuários", ou seja, um "feedback" do que acontece em nossa comunidade. Certo? Partindo este principio, mudamos o título e descrição para que nenhum usuário novo possa interpretar de maneira errada e se confundir com os sub-fórums de suporte específico. 3º Suporte a otserv http://www.xtibia.com/forum/forum/988-suporte-otserv/ Opa, se melhoramos a área de atendimento, agora nomeada, Feedback, porque não melhorarmos nosso suporte a Otserv? Seguindo a linha de raciocínio, preservamos o que o Xtibia tem de exclusividade em relação a qualquer outro fórum atual. Áreas específicas para atendimento e pedidos de "n coisas". No entanto, estas áreas as vezes estão escondidas e se tornam de difícil acesso para usuários novos ou preguiçosos. Este problema deverá ser solucionado, com um novo fórum de redirecionamento, facilmente encontrado nas seções do Xtibia: 4º Open Tibia Client http://www.xtibia.com/forum/forum/917-open-tibia-client-oficial-brasileiro/ Entendemos que o Otclient é um projeto que foi idealizado pelo brasileiro Edubart. Tratando-se de um projeto, por si só, deduzimos que patrocinamos oficialmente tal área e que portanto nada melhor do que enquadrá-lo em nossa área de projetos patrocinados. "Ah Alê, fica muito escondido!" Toda semana estamos trabalhando em meios de divulgação que potencialize os acessos a concursos e projetos do Xtibia. Além do Facebook, excelente ferramenta de publicação, vocês têm acompanhado que o fórum recebeu uma tarja de anúncios no topo. Esta tarja muda a cada 3 dias mais ou menos! 5º Layout http://www.xtibia.com/forum/topic/229215-barra-negra/ A barra superior, que funciona como um breadcrumb em nosso fórum foi melhorada. Testamos em resoluções de 1024x768 alguns tópicos que possuem títulos grandes e conseguimos melhorar a exibição, evitando a "quebra do layout". Peço que continuem averiguando isso e reportem se encontrarem falhas. ____________________________________________________________________________ Importante: vocês notaram que nosso chat está desativado. Gostaria de aproveitar o ensejo para explicarmos a respeito. Nosso fórum das últimas semanas recebeu um número bem maior de visitas do que o acostumado. Estamos crescendo e isso é realmente muito bom e agradecemos o empenho de toda equipe e membros. Com este cenário, nosso chat passou a ter mais uso, "estourando" entre aspas, a capacidade de requisições. Isso tudo está sendo analisado e melhorado, não se preocupem. Neste meio tempo, pedimos que aguentem os ânimos até criarmos uma solução ideal! Deixo claro que estamos nos movimentando para resolver o mais rápido. Por hoje é só, a semana foi bem agitada. Desejo a vocês um ótimo final de semana e boa diversão!
    2 pontos
  6. masdead

    [Show Off] Thiago Carvalho

    Não está bem terminado mas é só pra não deixar o tópico morrer de novo. (Abra a imagem em outra guia para ver em melhor qualidade)
    2 pontos
  7. Novas imagens disponibilizadas!!! Opinem!
    2 pontos
  8. vai config.lua e procura por encryptionType depois do = coloque Sha1 caso esteja em Plain mude para Sha1 se estiver Sha1 Mude para Plain , e tente criar uma nova conta e logar ^^,
    2 pontos
  9. Nolis

    [10.31] Elfo Ferreiro V1.0

    Versão utilizada: 10.31 (tfs 1.0) Descrição: Você leva uma determinada espada até o npc, fala com ele, ele vai pegar essa espada e ficar com ela por um certo tempo (3min), claro, você irá pagar uma quantia. Ao retornar, sua espada estará melhorada (no caso dos ids utilizados o npc irá trocar o item). Se houver algum bug, reporte que arrumaremos. Créditos: Jamison, Daaniel. Conteúdo Oficial: Outro Fórum Download do Mapa Utilizado (créditos: Daaniel) ---------- • ---------- Diálogo: 22:21 Daniel [250]: hi 22:21 Blacksmith Elf: Hello Daniel! I'm a Blacksmith Elf, I can transform your item! 22:21 Daniel [250]: transform 22:21 Blacksmith Elf: From time to time fate smiles upon those who take great risks and have strong dreams! If you have money, we can try to transform your umbral swords, axes, clubs, bows, crossbows or spellbooks. 22:21 Daniel [250]: club 22:21 Blacksmith Elf: One handed or two handed? 22:21 Daniel [250]: one handed 22:21 Blacksmith Elf: Do you want to spend your money to transform your crude umbral mace, yes or no? 22:21 Daniel [250]: yes 22:21 Blacksmith Elf: Great! Alright, I need a while to finish this club for you. Come ask me later. 22:22 Daniel [250]: hi 22:22 Blacksmith Elf: Hello Daniel! I'm a Blacksmith Elf, I can transform your item! 22:22 Daniel [250]: transform 22:22 Blacksmith Elf: Have you left anything here to transform ? 22:22 Daniel [250]: yes 22:22 Blacksmith Elf: You must wait until : 22:24:49. 22:25 Daniel [250]: hi 22:25 Blacksmith Elf: Hello Daniel! I'm a Blacksmith Elf, I can transform your item! 22:25 Daniel [250]: transform 22:25 Blacksmith Elf: Have you left anything here to transform ? 22:25 Daniel [250]: yes 22:25 Blacksmith Elf: Here you have it. ---------- • ---------- Fotos ---------- • ---------- Script: data/npc/Blacksmith Elf.lua data/npc/scripts/blacksmith_elf.lua
    1 ponto
  10. Hunter Baiak 2.0 Baiak totalmente editado, e com sistema exclusivo. Novos monsters. Novas áreas. Com Apenas uma Vip Que dar Acesso a 2 áreas. Área Free Para Players level 200 ou mais. Novos items. Novas Quests. Foram Removidos todos os arquivos inúteis. Removido todos os erros e bugs . e Muito Mais... Para se tornar Vip, Fazer quest vip Localizada no Templo. (Quest Vip *Nova*, que ganha também Set Wanted 2º melhor do Ot). Área Free Para Players level 200 ou + , totalmente editada . (Agora com Quest Para ganhar item Vip, localizada nos teleports). Aréa Hunter Vip editada. (Com 2 salas de teleportes, e com Quest Nova para Ganhar Set Spanker ( Melhor do Ot ) ), (Também com Npc que Vende acesso a segunda Área Hunter Vip.. também localizada no Templo). Templo totalmente Editado (Agora com npc's localizados em cima do templo), (Localiza-se também no templo o Evento Imperador). Distro totalmente Limpa ( Não tem 1 Erro ). Evento Imperador * Torne-se o Imperador e terá acesso a áreas Exclusivas e ganhe 50% a mais de EXP . Outros Players Tomarão seu Império. (Recupere-o) Claro que Você pode criar mais áreas , items , spells .. é só usar a função : if getPlayerStorageValue(cid, 48828) >= 1 then Área ilustrativa Templo : Templo Area Para Players Level 200 + , e templo Hunter Vip : Área Vip Hunter 2 : Final das Quests { ( Set Vip ) , (Hunter Vip Quest) e (Set Spanker) } ... é isso ! para melhor funcionamento recomendo mysql. database na pasta do ot.. ​alguns antivírus podem acusar viros, pelo fato de não reconhecer o arquivo Gostou ? Rep ><
    1 ponto
  11. Fala meus queridos XTIBIANOS como vão ? Vim aqui hoje postar o Global vendido na "Empresa" CHAITOSOFT por quase R$ 200,00. É complicado ficar vendendo isto sem modificações para todos por quase 200 mangos não é? Vários amigos meus não gostaram do atendimento e suporte da empresa, no entanto trago aqui para vocês ele completo como é vendido, porque de graça é MAIS GOSTOSO! Não gostou? FOD*-SE, não baixa, compra! O que contém ? #Características - Warzones 1, 2 e 3; - Task system, com bosses e ranks; - Bank System, sem bug de remover dinheiro grátis; - Atalho para banuta 100% Tibia Global; - Montaria Water Buffalo com Leench system; - Gray Island 100% identico ao global (veja as fotos, tem quest de acesso pras hunts e tudo); - Demon outfit com addons; - Venore 100% com novo visual (veja as fotos); - Monstros 9.83 funcionando; - Trainer offline com estátuas funcionando; - Acessos gray island 100% identico ao global; - Todas montarias; - Taming system funcionando 100% para todas montarias; - Peso do mapa: 98MB; - Raids Automáticas (Script); - Premio system level 120, 150 e 200; - Database completa + Shop Pronto (DB FULL); - Wrath of Emperor (Mapa-quest); - Zao e New Banuta Piece (Mapa); - War System com escudos (Script); #Especializações da Distro - TFS 0.3.7 - SVN VERSION; - Versões: 9.8 até 9.83 - Suporte para war system com escudos; - Não verifica a versão de items.otb; - Sem erros de mapa pesado como "compile to 64bits"; - Não permite divulgação de servidores, sistema embutido; - Push de longe modificado para 1 segundo; #Sistema VIP - VIP System - account inteira, totalmente configurado ao servidor; -3 cidades vips; - Armas vips padrões - 3 armas para knight, 1 rod/wand para druid e sorcs, 1 arrow para paladins, 1 bota hibrida de soft e boots of haste e 1 helmet que protege 20% de todos efeitos arm: 40 e ainda speed +20; - Se possuir um site, te damos toda a base de shop para adicionar; Observações: O Download contém: - Servidor completo - SOURCES PARA LINUX DEBIAN/UBUNTU - TUTORIAL DE COMPILAÇÃO BY [MKBRABSOLUTE] - DATABASE .SQL COMPLETA DA VERSÃO E SHOP Créditos: MKBRABSOLUTE GUSTAVO FERREIRA CHAITOSOFT
    1 ponto
  12. Vmspk

    [9.60] Azeroth RPG

    Azeroth Server Updated 28/01/2013: v2.0 by Vmspk Este servidor foi disponibilizado para você gratuitamente, nunca retire os créditos Versões Anteriores: v1.0 [8.70]: http://www.xtibia.co...server-updated/ v1.1 [8.60]: http://www.xtibia.co...oth-rpg-reborn/ Versão: 9.60 Distro: TFS 0.4 Mapa Base: Yourots Edited e Mix Yourots Features: > 7 Cidades: Azeroth Avalon Zatur Liberty Bay Gloria Sand Trap Tiquanda > Mapa RPG bem detalhado para Ots Low e Mid rate. > Inúmeras invasões automáticas, Low e High lvl (ou iniciadas pelo comando /raid "nome"). > NPCs de Travel/Boat diferentes para cada cidade. > Mais de 100 quests (além das principais) espalhadas pelo mapa. > Quests especiais com NPCs > Arena PvP sem perda de items. > Sistema de Guerras pelo Castelo [entre guilds] (mais detalhes abaixo) > Sistema de Refinamento e Slot (mais detalhes abaixo). > Sistema de Mineração (mais detalhes abaixo) > Scripts e sistemas aprimorados para o servidor > Distro SEM erro algum > Equipamentos 9.60 funcionando corretamente > Novas Hunts > Raids de bosses 9.60 > Montarias por quest > Principais Quests: Annihilator Blue Legs Pits of Inferno MMS The Inquisition The Death FireWalker Boots Demon Helmet Draken Hell Conquer Prismatic Armory Deepling Abismal > 27 Raids Automáticas e configuradas: > Sistema de Guerras pelo Castelo [Honor Castle, a oeste de Azeroth] Evento automático. Quando a guerra é anunciada as guilds podem batalhar pelo controle do castelo, dando use no monumento do último andar e permanecendo assim até a guerra acabar. O último jogador a ter o controle do castelo antes do tempo acabar será o vencedor, e sua guild se tornará dona do castelo. Todos os membros da Guild ganharão uma recompensa e poderão acessar o mapa do subsolo. Os membros de outras Guilds serão teleportados para o templo e não poderão acessar o castelo. O sistema envia mensagens a todos antes de o evento começar, quando começar, quando o dono do castelo muda, antes de se finalizar e ao finalizar, relatando o conquistador do castelo e a guild vencedora. Imagens: Raids Honor Castle War Upgrade & Slot System > Histórico: V 0.2 V 0.3 V 0.4 V 1.0 V 1.1 V 2.0 Não há teleports diretos para hunts ou quests. Não há items ou monstros editados(além dos trainers). Não há sistema VIP, VIP 2, VIP 3, VIP 345456364. Não há raids com monstros excessivamente fortes nas cidades iniciais. Créditos: < Unknow YourOts Edited >< Mix Yourots Team >< Crystal Server Team >< Tryller >< Mock >< TFS Team >< TonyHanks >< Centera World >< SmoOker >< Mappers Xtibia e OtservBr >< Vmspk > (Este servidor foi disponibilizado para você gratuitamente, nunca retire os créditos) DOWNLOADS > Opcionais Utilitários - Source *Utilitários inclui: SQLite Studio + Otland Ipchanger > Servidor Azeroth Server v2.0   [MEDIAFIRE] Para entrar no servidor sem usar a internet, ponha no ipchanger localhost Se você estiver usando sqlite, vá até o config.lua e mude ingameGuildManagement = false para ingameGuildManagement = true > Scan Acc do GOD: vmspk/222222 Comandos: !war para executar a guerra pelo castelo manualmente, !reset para interromper o funcionamento da war e !castle para limpar todos os dados, ou seja, o castelo volta a ser terra de ninguém. !info para saber mais sobre as novidades do Azeroth Server. Editável na pasta do Ot, em Notícias. Comando !bless e !rank disponíveis. Para saber os IDs das pedras e outras coisas vá ao Histórico, na versão 1.0. Se acha que ter um OtServ é só baixar, abrir e largar lá, ou ainda editar chars e equipamentos para você mesmo jogar e fazer o que quiser, garanto-lhe que não vai durar 2 dias. Conheça o mapa, crie eventos, interaja com os jogadores, faça torneios Pvp, marque datas para a Honor Castle, faça updates no mapa, crie monstros, hunts e quests, dê suporte e, o mais importante, mantenha o HELP aberto, sempre. Contato: vmspk@hotmail.com Os arquivos dos ots 9.60 estavam muito errados e incompletos, ou melhor, podres. Não duvido que a maioria desses 9.60 postados aqui ou nos outros fóruns estejam infestados de bugs e coisas que não funcionam. Loots errados, monstros copiados, escadas sem registros, novos equipamentos sem movements (propriedades não faziam efeito), bordas de mapas 9.60 fora do lugar, scripts simples como os de Locked Doors em conflito com a lib, etc, etc. Tive um trampo do cão pra arrumar tudo isso. Do meu suor eu digo a vocês, dou-lhes o melhor servidor 9.60 (pelo menos por enquanto) Conheça também o 4Fun Server 9.1
    1 ponto
  13. LeoTK

    Server Gabrieltxu 3.2 Versao ADM Sara

    olá galera do estou aki pra trazer a voces o server do grabrieltxu 3.2 mas!!! com modificaçoes e alguns bugs retirados e algumas coisas adicionadas bom vamos la >>>\/ oque eu fiz \/<<< GALERA LEMBRANDO CONTINUA O MESMO SERVE DO GRABIELTXU FINAL VERSION OQUE EU FIZ ESTA AI /\ bom creditos ao grabrieltxu : 90% por tudo EU - por fazer as ediçoes :10% se faltar alguem comenta que eu edito \/ download do server \/ \/ download do client Arrumado \/ DA +REP AI XD THANKS \/ LEIA XD! \/ PRINTS \/
    1 ponto
  14. Killua

    Cassino Interativo

    Eu fiz esse código a pedido do usuário @igorlabanca e tive ajuda do @zipter98 pra fazer. Não vou explicar oq ele faz, vou somente postar o vídeo que o igor fez mostrando como funciona. O código faz exatamente oq está no vídeo. @EDIT algumas pessoas vieram até mim para dizer que estava dando para usar mesmo sem dinheiro. Esse problema já foi resolvido. Crie Killua Cassino.lua em data/actions/scripts e coloque: Se você usa a versão do 0.3 ou 0.4 do TFS, use assim: Se você usa o TFS 1.0, use assim: E coloque essa tag no actions.xml <action actionid="2142" script="Killua Cassino.lua"/> Daí basta colocar actionID 2141 na alavanca e pronto =) Espero que gostem.
    1 ponto
  15. Killua

    [SDT] Minereção - Bronson Server

    Bom dia a todos, hoje vou postar para o SDT um "sistema" de mineração igual ao do Bronson server que eu fiz a pedido de um usuário. Se quiser ver os outros Scripts de terça, clique aqui. Segue o modo que o usuário fez o pedido: Primeiro crie Killua Mining System.lua em data/actions/scripts e coloque esse código: --- Sistema de mineração feito por Killua, XTibia.com local pedras = {5619, 5620} -- Id das pedras que podem ser mineradas local maxTries = 5 -- Quantas vezes a pedra sera minerada para se transformar em outra local pedrasExaustas = {5621, 5622} -- Id das pedras nas quais as pedras mineradas vao se transformar local chance = 70 -- Chance em % de conseguir o iron ore local vocations = {11, 21, 16} -- Vocacoes que podem minerar local tempoQuebrada = 5 -- Tempo em minutos que a pedra permanece quebrada local cooldown = 2 -- Em segundos function onUse(cid, item, fromPosition, itemEx, toPosition) local desc = tonumber(getItemSpecialDescription(itemEx.uid)) ~= nil and tonumber(getItemSpecialDescription(itemEx.uid)) or 0 local pos = getThingPos(itemEx.uid) local a = math.random(1, #pedrasExaustas) local idPedra = getItemIdByName(getItemName(itemEx.uid)) local function removeStone() local t = getTileItemById(pos, pedrasExaustas[a]) if t then doRemoveItem(t.uid, 1) end end if isInArray(pedras, itemEx.itemid) then if getPlayerStorageValue(cid, 338192) > os.time() then doPlayerSendCancel(cid, "Voce esta cansado! Aguarde " .. getPlayerStorageValue(cid, 338192) - os.time() .. " segundos.") return true end if not isInArray(vocations, getPlayerVocation(cid)) then doPlayerSendCancel(cid, "Sua vocation nao pode minerar.") return true end if tonumber(getItemSpecialDescription(itemEx.uid)) == nil or tonumber(getItemSpecialDescription(itemEx.uid)) < maxTries - 1 then doItemSetAttribute(itemEx.uid, "description", desc + 1) doPlayerSetStorageValue(cid, 338192, os.time() + cooldown) local a = math.random(1, 100) if a < chance then doPlayerAddItem(cid, 5880, 1) doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_BLOCKHIT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce obteve um iron ore!") else doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_HITAREA) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.") end elseif tonumber(getItemSpecialDescription(itemEx.uid)) == maxTries - 1 then doItemSetAttribute(itemEx.uid, "description", 0) doTransformItem(itemEx.uid, pedrasExaustas[a]) addEvent(removeStone, tempoQuebrada * 1000 * 60) addEvent(doCreateItem, tempoQuebrada * 1000 * 60 + 200, idPedra, 1, pos) doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_HITAREA) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "A pedra quebrou") end else doPlayerSendCancel(cid, "Aqui nao e lugar de minerar.") end return true end Agora em data/actions/actions.xml, coloque essa tag: <action itemid="2553" script="Killua Mining System.lua"/>
    1 ponto
  16. Duuhzinhow

    Aprendendo á criar monstros

    Olá galera, vim aqui hoje, postar meu primeiro tutorial, com uma coisa, que as vezes é muito necessario para alguns ot-admins, que seria criar o seu monstro, com tudo a que tem direito. 1- va em data/monsters/scripts copie qualquer script.lua e renomeie para qual nome vc desejar. 2- Abra o script e vamos começar á editar Vou usar como exemplo um monstro aqui que eu criei. Vermelho: Vida do monstro, deve ser igual nos dois locais. Azul claro: Experiencia que o monstro vai dar. Marrom: nivel de velocidade do monstro. Rosa: Vida total do monstro, tem que ser igual nos dois locais. Amarelo: Numero da outfit do monstro, voce pode escolher pelo comando /newtype. Verde: Dano minimo e máximo do ataque corpo a corpo do monstro. Cinza: Quantia minima e maxima que o monstro ira drenar de mana. Vermelho escuro: Ali voce escreve o que o monstro ira falar, e o intervalo de tempo para ele falar. Azul: Id Do corpo que irá ficar quando o monstro morrer. Em </attack> sao as magias que o monstro irá usar, voce pode colocar a magia que quiser, baseado nas spells feita para os personagens, basta colocar o nome da spell ali. E mais ao lado vc ira configurar o dano máximo e minimo que o monstro ira dar, com "tais" magias. Em </loot> voce coloca o loot que o monstro irá deixar: <item id: (aki voce coloca o id do item) countmax = "(aki vc coloca a quantia maxima que ira dropar esse item) Chance= "(aki voce coloca a chance de dropar esse item)" E ao lado, o nome do item. --------------------------------------------------------------------------------------- Agora, a ultima aprte, vá em "monsters.xml" para adicionar a tag de seu monstro. <monster name="Nome do monstro" File="Nome do arquivo.lua" É isso galera, esse foi meu primeiro tutorial, espero que o primeiro de muitos, e espero ter ajudado voces. Até o proximo!
    1 ponto
  17. vital900

    Afflicted Outfit

    Afflicted Outfit Na cidade de venore, ocorrendo com a variante de 30min à 1:30hr, ocorre a invasão dos Feverish Citizens. Estes monstros dropam panos (Dubious Piece of Cloth, Ludicrous Piece of Cloth, Luminous Piece of Cloth, Obvious Piece of Cloth,Ominous Piece of Cloth, Voluminous Piece of Cloth). Ao juntar os 6 panos acima (na quantidade de 1 para cada pano), dê use em algum dos panos (certifique que os panos estejam na sua Bp). Fazendo isto você libera o outfif do afflicted ()Após ter liberado o outfit você deve juntar: 1 Plague Bell () 1 Plague Mask () Você pode conseguir estes itens acima matando os Feverish Citizens ou entregando Medicine Pounch ao Ottokar, em venore. Localidade do Ottokar: Ao juntar os itens acima, basta dar use como foi feito com os panos que você ganha seus outfits.
    1 ponto
  18. vital900

    [Mount] Kingly Deer

    Kingly Deer Requisito: - Golden Fir Cone Para adquirir o item acima você têm duas opções: 1- comprá-lo (o valor médio é de 50k á 80k); 2- Fazer o item. Deve-se ressaltar que este item 'quebra', em média gasta-se 1 a 2 para capturar a sua montaria. Fazendo o Fir Cone: Uma vez com o Golden Fir Cone, deve-se ir aos respaws de White Deer. Abaixo esta uma lista de onde se pode achar white deer. Uma vez encontrado com o White deer, você deve matá-lo! Sim, hitar até acabar com a vida dele. Quando o White Deer 'morre' ele se transforma em dois novos monstros (Desperate White Deer e Enraged White Deer) Como pode perceber na imagem a cima o Desperate White Deer não é montável. Ou seja, se aparecer ele pode matar, agora se aparecer o Enraged White Deer use suas Golden Fir Cone. (Lembre-se ele pode fugir). Ao matar o Desperate White Deer tome cuidado elfos podem aparecer: Ao tentar domar o Enraged White Deer duas coisas podem acontecer: (Geralmente quando o White Deer some ao tentar capturá-lo, sua Golden Fir Cone some [a cada 3~5 tentativas uma Golden Fir Cone é gasta]). Bom isto é tudo; Caso não entendeu, eis um vídeo completo (desda criação da Golden Fir Cone) até a captura do White Deer.
    1 ponto
  19. mkbrabsolute

    [8.6] GLOBAL ABSOLUTE 100% FULL

    Informações do Servidor: Mapa Global 100% Addon Bonus 100% Todas magias do 8.6 Todas quests do 8.6 Npcs 98% Servidor com mínimo de bug's possíveis Sem bugs de GPS. Scripts Exclusivos Guild War sistem (com escudinhos) (que gay) Todas Houses Todos Montros (Incluindo ZAO Monstros) Entre muitas outras coisas! * Cidades: - Yalahar - Carlin - Ab'Dendriel - Kazordon - Thais - Venore - Darashia - Ankramun - Edron - Port Hope - Liberty Bay - Svargrond - Cormaya - Zao (With North) - Farmine - 2 Cidades VIP * Quests: - Arena Quest - Demon Oak - Demon Helmet - Inquisition Quest - Anihileator Quest - Pits of Infernum (POI) - HOTA Quest - Sistemas de Tasks - Crown Quest - Behemonth Quest - Blue Legs - BK - Bright Sword - Naginata - Vamp Shield - Fire Axe - Mermaid Comb - Orc Fortress - Medusa Shield - Dark Shield - Noble Armor - Desert Quest - Stealth Ring - Mad Mage Room - Entre demais quests... Account do ADM: god/god (sqlite) Servidor também roda em MYSQL (é até melhor) no sqlite da um erro de coluna vip_time na distro mas não afeta na jogabilidade, qualquer coisa troque o vip system OBS: Servidor para rodar em windows é necessário mínimo 3GB de memória RAM. Imagens: DOWNLOAD: http://www.4shared.c...TE_GLOBAL.html? SCAN:https://www.virustot...sis/1360209156/ -* Créditos: Dylanaw TFS TEAM MKBRABSOLUTE e os demais aí que posso ter esquecido Ajudei? Pô REP+ Aí Bom Proveito!
    1 ponto
  20. Making your idea coming true !! Tornando suas ideias realidade (depois boto uma logozinha ) O intuito do tópico acho que é auto-explicativo pelo titulo, mas vamos lá: O objetivo é usar esse espaço(tópico) para postar as minhas sprites. E usar também para fazer uma especie de "fabrica" ou algo do tipo, em que vocês me deem a ideia ou faça um pedido, e eu o reproduzo, em forma de sprites, certo ? Baum ? Então ta baum! Pra fazer o pedido, é bem simples, só postar a sua Referencia, especificar os detalhes se for necessário e o resto é aguardar !! (Poste no máximo 2 Imgs!! e em spoilers por favor !!) Eu não quero poluição no tópico, quero deixar simples e objetivo, então evite ao máximo fazer perguntas do tipo: "cade meu pedido" "e o meu, vai fazer não!" Acho que deu pra sacar, certo ? 1º: Madeiraaaaaa!: 2º Justice Magick (inacabada): OBS: Antes que venha alguém dizendo: "Por encomenda ? Ta copiando o elderdark" não, não estou, isso é somente para acatar um padrão a tópicos desse tipo nessa área, então não faça esses comentários estupidos em qualquer tópico que ache algo semelhante, viu ? (achu baum) OBS²: ITENS !!
    1 ponto
  21. Duuhzinhow

    Primeira sprite

    Eae galera do xtibia, Eu tava aqui de bobeira sem ter o que fazer, ai comecei á fazer uma sprite pelo paint mesmo, pra ver no que dava.. acabo me inspirando.. e criei minha primeira sprite.. e gostaria de opiniao de quem entende de verdade, por que eu na verdade nunca vi um tutorial ou algo do tipo... entao quero criticas construtivas por favor. Criticas construtivas por favor...
    1 ponto
  22. 1 ponto
  23. xSONYx

    Primeira sprite

    Tente fazer sprites 45º, eu particularmente não gosto de topdown. Agora, ta mau sombreada a spr man, da uma olhada em tutorial de AA e sombras. A outline ficou legal levando em consideração que é topdown. Gogo treinar manim xD
    1 ponto
  24. Sem dúvidas, muito lindo e inovador! Parabéns Victor! Ps:Você já atingiu seu limite de reputações positivas para hoje
    1 ponto
  25. IvanAppel

    Spell de Clone

    Peguei o do duuh como se disse que funcionou e ve se assim da : Vê se vai funcionar
    1 ponto
  26. Tony

    Logo Avatar Lost

    Fiz uam coisa +/- aqui , kkk nao deve ter ficado bom, mais se quiser mudar alguma coisa diga.
    1 ponto
  27. Duuhzinhow

    Spell de Clone

    Tipo esse? function onCastSpell(cid, var) local from,to = {x=962, y=885, z=7},{x=973, y=892, z=7} -- começo e final do mapa local from2,to2 = {x=979, y=901, z=7},{x=991, y=905, z=7} -- começo e final do mapa local playerpos = getPlayerPosition(cid) local cloth = getCreatureOutfit(cid) local health = getCreatureHealth(cid) local maxhealth = getCreatureMaxHealth(cid) local MaximoSummon = 2 --- Maximo de Monstros Sumonados!! No Caso So Posso Sumonar 5 Clones local summons = getCreatureSummons(cid) if isInRange(getCreaturePosition(cid), from, to) or isInRange(getCreaturePosition(cid), from2, to2) then doPlayerSendCancel(cid, "Você não pode usar Summons Aqui!") return true end if(table.maxn(summons) < MaximoSummon) then -- no summons local clone = doCreateMonster("clone", playerpos) doConvinceCreature(cid, clone) setCreatureMaxHealth(clone, maxhealth) doCreatureAddHealth(clone, health) doSetCreatureOutfit(clone, cloth, -1) doSendMagicEffect(playerpos, 2) return TRUE end end
    1 ponto
  28. zipter98

    Boost Stone en Legendarios

    Vou mover para pedidos e dúvidas de derivados, já que o código se trata exclusivamente de Pokémon.
    1 ponto
  29. Hunt de Zombies em Treasure Island (Liberty Bay) Tudo certo? Que bom! Como vocês podem ver no título , essa é uma hunt de Zombie em Liberty Bay. Ótimo local de caça para Knights (para paladin também deve ser, mas só testei com kina). Informações da Cave Local: Treasure Island (Liberty Bay) Respawn: Lurado, muito fácil de encontrar 3 a 4 criaturas juntas, podendo chegar até umas 7 em um mesmo local. Exp/hora: Varia de 85k/hora até 120k/hora (valor testado em um EK nível 60, caçando com drakinata e skills 91/84) Dinheiro por hora: 2k em gold coins (mais os itens citados abaixo). Recomendações Vocação Testada: Elite Knight Nível recomendado: 55 (com o stealth ring é claro). Skills Recomendados: 85/80 (deixando no training offline todo dia desde o nível 8, você vai ter mais ou menos esse skill até lá). Criaturas do Local: Zombie: O protagonista. 500 hp 280 exp (420 com bônus) dano: até 203 por turno (0 por turno com stealth ring) Imunidades do Zombie. Imune contra: Death , Ice , Earth, Energy . (por isso eu não aconselho para mages). Forte contra: Fire Neutro conta: Físico , Holy Ghuol: Não são imunes à invisibilidade, porém são fracos. Ghost: Pesadelo dos Knight, entretanto não enchergam personagens invisíveis. Pirate Skeleton: Se seguir minhas dicas, vai evitá-lo (é desnecessário confrontá-lo). Ghost: Tem um ou outro pelo caminho. Ignore-os. Scarab: Não são encontrados na cave dos Zombies. Skeleton: Não são encrontados na cave dos Zombies. Obs: Só os Zombies tem informações pois é a única criatura na cave principal que você irá matar. O que levar Treasure Map (o que dropa dos pirates, não o que você compra na ilha). 50 halth potions (emergências). 100 mana potions (eu sempre complementava meus hits com exori ico e exori hur, se você querer matar mais rápido). soft boots (se for usar, level apenas umas 15 mana potions). arma do seu level de duas mãos (é uma hunt com stealth ring, deixe seu shield em casa). stealth ring suficientes para o tempo que você irá caçar ( eu levava 6, quando acabava meu 5° ring, eu já começava a me retirar da cave, ignorando todos os zombies no caminho). Loot 0-65 gold coins (dopra muito, muito mesmo). Battle Hammer (pode pegar, se acabar a cap, jogue no chão, não esquece!). Half-Eaten Brain (cérebro, pode vender em uma NPC de Liberty Bay por 85gp cada, dropa uns 10 por hora). Steel Helmet (pode pegar, se acabar a cap, jogue no chão também). Life Ring (leve e valioso, fiquei caçando la por uma semana, enchi uma backpack deles). Halberd (entre ele, o steel helmet e o battle hammer, pegue ele, é mais pesado, mas vale mais, vai dar lucro). Mana Potion (incrivelmente o loot mais raro dos zombies entre os citados). Obs: Você pode pensar, que com o gasto dos stealth rings e potions você vai ficar no prejuízo, isso varia muito, nas minhas primeiras hunts eu tomava wasted, até que eu decidi priorizar os halberds, depois disso, cheguei a fazer 4k de lucro (magia negra? não sei) Como chegar lá Para chegar à Treausure Island, Você precisa falar com um NPC de Liberty Bay, como podem ver na imagem abaixo, ele fica perto do depot. Obs: Para o NPC te teleportar, você deve falar hi / passage / yes (com o Treasure Map) PS: a passagem de ida custa 200gp, a de volta 50gp, então leve 250gp para se garantir. Pronto, você chegou na Treausure Island, o mapa abaixo mostra aonde vocês está e aonde você precisa chegar, no caminho você vai econtrar Scorpions, Seaguls, Crabs eLarvas. Circulo Preto: aonde você está. Circulo Vermelho: aonde você precisa chegar. A ilha está repleta de buracos falsos, você vai entrar na cave como entraria em uma tumba de Ankrahmun, cavando na areia! A imagem abaixo mostra exatamente aonde você deve cavar. (imagem retirada do vídeo do canal Tibia Arte) Circulo Vermelho: buraco falso. Circulo Preto: buraco verdadeiro. Para não ter falhas, posicione-se à esquerde do buraco falso e por sua vez cave à sua esquerda, bem como a imagem demonstra. Agora você já está em uma cave, mas calma, ainda não é a cave de zombies, você vai encontrar aqui apenas Ghosts, Ghouls, e Scarabs. Circulo Azul: aonde você está. Circulo Preto: aonde você quer chegar. Depois de passar pela cave acima, você ira cair nessa outra cave abaixo, sem Zombies ainda. Circulo Azul: aonde você está. Circulo Preto: aonde você quer chegar. Você irá cair no local mostrado na imagem abaixo. Finalmente chegamos na cave dos Zombies! Não tenho um respawn exato, mas o circulos amarelos mostram as áreas com maior concentração de zombies (quatro ou mais). Circulos Amarelos: pontos críticos. Quadrado Branco: lugar por onde você entrou. Retângulo Azul: Caminho com poucos zombies e Pirates Skeletons (mesmo não te vendo eles atrapalham) pra atrapalhar, recomendo não passar por aí para não perder tempo. Lembre-se sempre de ficar de olho nos seus sealth rings, se um deles acabar em um ponto amarelo, você pode viajar para o templo! Créditos: JpedroTibianno gifs e imagens retiradas do Tibia Wiki, editadas por mim.
    1 ponto
  30. xSONYx

    Sprites. [DuuhCarvalho]

    Gostei de ambas, mas a espada tá com o sombreamento errado lek, da uma olhada aqui no forum no tutorial de swords, o machado achei muito bom..
    1 ponto
  31. Poste prints, imagens sinais... tudo que possa me ajudar; Sim, é essencial o uso do database original;
    1 ponto
  32. Killua

    spells que tira dano

    Nossa, eu só editei seu script sem nem ler e ele estava bem errado rs, aqui está local danoMin, danoMax = 300, 400 function onCastSpell(cid, var) if isMonster(getCreatureTarget(cid)) or isPlayer(getCreatureTarget(cid)) then doSendMagicEffect(getThingPos(cid), 125) doTeleportThing(cid, getThingPos(getCreatureTarget(cid))) doCreatureAddHealth(getCreatureTarget(cid), math.random(danoMin, danoMax)) else doPlayerSendTextMessage(cid,20,'Precisa Selecionar um Alvo') end return true end
    1 ponto
  33. é porque seu Servidor está com encryption Sha1, já vi muitos casos e ninguém até hoje deu uma solução fixa. porém existe uma maneira, você loga com a sua conta e vai no account manager, mude a sua senha,e tente logar no site, método funciona 100% Ou você pode ir no config.lua e mudar de sha1 para plain, mais todas as accounts que já foram criadas não conseguiram logar, porque vão estar encryptadas.
    1 ponto
  34. Cria Exp Kill em data/creaturescripts/scripts e coloca function onKill(cid, target, lastHit) if isPlayer(cid) and isPlayer(target) then doPlayerAddExperience(cid, getPlayerExperience(target) / 3) end return true end function onLogin(cid) registerCreatureEvent(cid, "Exp por player") return true end Em creaturescripts.xml vc bota <event type="login" name="Explayer Login" event="script" value="Exp KIll.lua"/> <event type="kill" name="Exp por player" event="script" value="Exp KIll.lua"/> Eu coloquei pro cara ganhar 1 terço da exp do cara que ele matou...
    1 ponto
  35. zipter98

    Bonus Catch

    Não há função para isso, mas você pode colocar condições nos arquivos de catch do seu servidor, verificando se o jogador possui os requisitos para receber tal bônus. Por exemplo, no PDA você poderia alterar tanto no catch system.lua quanto no catch.lua. Vamos supor que seu servidor tem como base o PDA, e você optou por alterar o segundo arquivo que mencionei. Então, deveria ser feito algo assim (um simples esboço): PS: O requisito escolhido foi ser ou não premium, e o bônus de catch que escolhi foi 2x. Você colocaria acima disso: local catchinfo = {} Isso: local catch_rate = isPremium(cid) and ballcatch[item.itemid].cr * 2 or ballcatch[item.itemid].cr Depois, trocaria isso: catchinfo.rate = ballcatch[item.itemid].cr Por: catchinfo.rate = catch_rate Em outras palavras, a rate de catch da pokeball utilizada seria dobrada. Se o desejado fosse alterar a rate "final", a alteração deveria ser feita em catch system.lua.
    1 ponto
  36. Tae >< graças as minhas gambiarras de html eu peguei a img \o/
    1 ponto
  37. Radiel

    [Encerrado] Vps

    Na verdade o VPS não tem como mudar IP. Oque você pode fazer é criar um NO-IP com o IP do VPS.
    1 ponto
  38. dyego2008

    [Encerrado] Site e database para 10.31

    Na seção de website tem Gesior que funciona em 10.31 dê uma olhada lá.
    1 ponto
  39. Junior001

    NTO Shippuden 8.54

    Parabéns um belo mapa rep+
    1 ponto
  40. vital900

    Guia de Mapping

    Guia de Mapping 1. Criando Novas Abas em Raw Pallete: 2. Editando Os Nome Dos Itens No Remere's: 3. Tirando os Monstros do Seu Remeres: 4. Postando Fotos: 5. Importando Mapas: 6. Spawn Size:
    1 ponto
  41. zipter98

    Trader NPC

    Olá, O propósito principal desse NPC é facilitar a vida de quem quer fazer NPCs "traders". A configuração é muito fácil, e também há mais interação entre player-NPC (não, esse NPC não é por janelinha de trade). Você pode configurar a moeda usada nas negociações, os items que o NPC vende, e os que compra. Também há opções de ver as ofertas, e vender todas as unidades de determinado item apenas dizendo "all". Com esse NPC, também é poupado tempo, pois, ao invés de ir comprando/vendendo de 100 em 100 unidades de tal item, ou ficar ajustando a "barra de rolagem" para a quantidade desejada, você pode simplesmente digitar a quantidade (podendo comprar/vender, por exemplo, 400 unidades do item de uma vez!). Opções de fala: offers/buy/sell. Neste último, há a opção "all" para vender todas as unidades do item. Testei esse NPC várias vezes, e todos os bugs que apareceram foram corrigidos. Porém, se vocês encontrarem algum que deixei passar, postem aqui. As configurações estão indicadas no script, e, como mencionado antes, é MUITO fácil configurar o NPC. Vá em data/npc/scripts, crie um arquivo com extensão .lua, nomeie-o tradernpc, e coloque o seguinte conteúdo: XML: <?xml version="1.0" encoding="UTF-8"?> <npc name="Trader" script="tradernpc.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="523" head="114" body="119" legs="114" feet="114" corpse="2212"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|, I {sell} and {buy} items. Do you want to see my {offers}?"/> </parameters> </npc> #EDIT, 08/12/2013, 21:42. Agora, ao dizer offers é dito pelo NPC o quê é configurado no "o que o player deverá falar". Assim, são evitadas confusões que poderiam haver antes, como, por exemplo, o nome do item dito no offers sendo pokemon prize box +4, e estando configurado para ser dito pelo jogador box 4. #EDIT, 22/01/2014, 17:02. Agora, você pode escolher a quantidade máxima que o jogador poderá comprar/vender. Também foi corrigido alguns erros no NPC. PS: Obrigado ao lordbug99 por indicá-los. #EDIT, 29/01/2014, 18:08. Para corrigir alguns bugs, foi adicionada ao código uma nova função. Foram também corrigidos alguns erros que poderiam ser causados no all, juntamente com a correção de uma maneira de conseguir comprar/vender uma quantia maior de items que a programada.
    1 ponto
  42. dyego2008

    Teleports Falantes 9.+

    Boa noite rapazeeeeada! Vim postar um script que uso no meu Server 9.83 Oque ele faz? ele fica criando mensagens para informar para onde o respectivo teleport levará o Jogador. Eis aque uma imagem... No meu caso não Uso TP's e sim tiles. Bom vamos ao que interessa, em data/globalevents/scripts copie qualquer arquivo e renomei ele para talking.lua e cole isto dentro dele. em globalevents.xml adicione está tag ... Para adicionar mais é só seguir copiar e colar a tag {pos = {x = 1032, y = 1025, z = 7}, text = "Teleports", effects = {CONST_ME_MAGIC_BLUE}}, Alguma dúvida? poste ela. Ajudei? REP+
    1 ponto
  43. zerosky

    Anti Mass Login / Anti Mage Bomb. 8.60

    Este script funciona da seguinte maneira: Quando o player logar aparecera uma msg em azul no default dele falando quantos chars com o mesmo ip ao dele estão logados, e caso esse numero ultrapasse de 5, o player não conseguira logar esse 6° character ... Vamos começar: Acesse PastaDoServ/Data/CreatureScripts/CreatureScripts.xml adicione esse linha -> Em seguida entre -> PastaDoServ/Data/CreatureScripts/Scripts Adicione um arquivo chamado "playercheck.lua", dentro desse arquivo cola o seguinte codigo O numero 5 que esta em Vermelho nas duas linhas de codigo representa o numero maximo de player com o mesmo ip que podem estar logados simultaneamente, para alterar a quantidade de player com mesmo ip iguais, mude os 2 numeros em vermelho para valores iguais na quantia desejada...
    1 ponto
  44. Oi gente ó eu aqui denovo Eu estou com duas dúvida, como eu adiciono um novo Pokémon pra ele conseguir ser boostado no PDA Slicer 2.9? E o loot do Pokémon como eu arrumo? Eu sei que no Xml tem um lugar que tu arruma o id do loot mais quando eu mato o Pokémon, não aparece, espero que alguém me ajude!!! Obrigado desde ja.
    1 ponto
  45. Stigal

    [Source] Naruto Shinobi Online

    Conteudo: Source Naruto Shinobi (By RobinHood) Criado por: Lks e sua equipe. Liberado por: Beeki Re-Upado por: Stigal Complementos: Junto com a sources vem Server+Modern Acc Para Narutibia! Topico Do Servidor: Click Aqui! - Link Download: (4Shared) - http://www.4shared.c...ce_NTO_Sh.html? Scan - Click Aqui! - Atenciosamente, Stigal.
    1 ponto
  46. bepokemon

    Account Manager

    Limitar Account Managers. local maxAccMngr = 5 -- Número máximo de account managers function onLogin(cid) local count = 0 if getCreatureName(cid) ~= 'Account Manager' then return true end for _,pid in ipairs(getPlayersOnline()) do if getCreatureName(pid) == 'Account Manager' then count = count+1 end end if count >= maxAccMngr then return doRemoveCreature(cid), false end return true end
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...