Ir para conteúdo

Líderes

Conteúdo Popular

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

  1. Tonynh

    A MELHOR ASSINATURA #100!

    É com grande alegria e satisfação que vos trago a CENTÉSIMA EDIÇÃO do concurso cultural (...) Como de costume, funcionará como as demais edições. Entretanto, contaremos com algumas diferenças em relação a premiação e calendário. * Se você é desenvolvedor de um projeto, ou até mesmo já tem o seu servidor online, você não pode ficar de fora dessa. Mais abaixo, tudo será melhor explicado. SUGESTÕES E DÚVIDAS DEVERÃO SER POSTADOS (AQUI) APENAS COMENTÁRIOS ESTÃO LIBERADOS NESTE TÓPICO. LIVRE (Deixe sua imaginação decolar!) 1° Lugar: 3 Pontos de reputação + Gold Award EXCLUSIVA #ADS100 + (KIT Banner+Logo) OU Layout FATIADO (Apenas Layout) TOTALMENTE GRÁTIS! 2° Lugar: 2 Pontos de reputação + Silver Award EXCLUSIVA #ADS100 3° Lugar: 1 Ponto de reputação + Bronze Award EXCLUSIVA #ADS100 OBSERVAÇÕES: 1. A premiação está sendo inteiramente oferecida por mim mesmo (Tonynh). (Awards Exclusivas + KIT (Banner+Logo) ou Layout) 2. Caso o vencedor escolha o Layout, este será feito sob encomenda para você! (Você pode escolher de sites/blogs/portfólios pessoais até a reformulação do site do seu servidor!) 2.2 Na escolha do Layout, será fornecido apenas as imagens fatiadas (Apenas design) 3. Na escolha de um KIT (Banner + Logo) serão oferecidos de 2 a 3 modelos de cada um. Concurso: 30/03/2014 até 13/04/2014 (23:59) Votação: 14/04/2014 até 20/04/2014 (23:59) Resultado: 21/04/2014. AS IMAGENS DEVEM SER POSTADAS NESTE TÓPICO ATÉ A DATA MARCADA. QUE OS JOGOS COMECEM!
    5 pontos
  2. caotic

    onDropLoot(cid, item)

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

    [8.54] Remakes PxG até 07/03

    Oi povo do Xtibia, sou o adm do PxC e vim aqui disponibilizar para vocês umas sprites de remakes da PxG em formato .obd .Arquivo contidos \/: Olha a Imagem e.e \/ .Downloads em .obd em png .Créditos .EdMignari por disponibilizar um MegaPack com todos as spr da PxG .Para Euzito por localiza-las, renomear e distribuir para vocês e.e .joaopera por colocar em formato de png Se Gosto agradeça sua mão não vai cair e.e
    3 pontos
  4. Wend ll

    PDA By: Bolz:: Versão [GOD anna]

    Fala galera do xtibia, Hoje estou trazendo o servidor PDA by: Bolz editado por mim, Passei um bom tempo Editando ele Espero que gostem;; • Menu: ├ Informações; ├ Ediçoes; ├ Erros; ├ Prints; ├ Download; └ Creditos. • Informações Basicas • • Erros do servidor • • PrintScreen • • Download's • Servidor PDA by: Bolz [Editado Por Mim ] http://www.4shared.com/rar/06OG8lB5ba/pda_by_bolz_verso_god_anna.html? OTClient:: http://www.4shared.com/rar/x5LgTQKLce/OTclient.html? @Atualizado 02/04/2014 • Menu: ├ Ediçoes; ├ Prints; ├ Download; • Edições / ajustes • • PrintScreen • • Download's • Servidor PDA by: Bolz [Editado Por Mim v2 ] http://www.4shared.com/rar/_lB31rwxba/PDA_By_Bolz_Verso_GOD_anna_v2.html? OTclient v2:: http://www.4shared.com/rar/aiqka_kQce/OTclient_v2.html? • Creditos • Slicer (pelo servidor) Brun123 (por alguns scripts, e por criar o pda) Stylo Maldoso (pelo mapa) Bolz (por editar Maior Parte do Server) Eu ( por Corrigir Varios bugs e Editar varias coisas no Servidor) Gabrielsales ( pelos Systemas:: "Held item", "Ditto system" ) valakas ( Por ter ajudado a resolve o Bug da Barra de Ataques do OTclient v2) Xtibia (por alguns scripts) Cometem OQ acharam do Server Tou parando com as atualizações por enquanto POr causa das Provas (Tenho que Passa) Mais quando terminar as Aulas posto Nova atualiazação... Obrigado a Todos que Elogiaram minha edição nesse Belo servidor
    2 pontos
  5. Techrlz

    ProjectPO - Mapping Showoff

    Caso queiram acompanhar o projeto pelo facebook: https://www.facebook.com/ProjectPO >> PART 2 <<.
    2 pontos
  6. HenrikDiamond

    [DOWNLOAD] Server PokeZot

    Galerinha do Xtibia... Hoje vim postar o Servidor "PokeZot" - Com base do PDA by Bolz e Edições feitas por mim!! Lista Completa de Pokemon Adicionados!! Sistemas Quests Alterações Prints Creditos---- A equipe que criou o PDA Bolz --> Pela maravilhosa Editada no Server A Mim--> Pelo Trabalho de Adicionar os pokemon e fazer mudanças sozinho!! Downloads!! Isso Ai Galerinha!! Foi isso Até a próxima. Talvez saia uma proxima atualização do Zot! Lembrando Conta do God : luh/123 Flw! Até Mais... Gostou do Serv? Da Rep + entao que me ajuda!! kk
    1 ponto
  7. Olá Galerinha Tibiana! Durante 3 anos o baiak ainda está se atualizando cada vez mais e agora eu venho trazer a nova versao 10.10 não esta 100% mais garanto que vao gostar,entao vamos ver oque há de novo nele ? Essa Nova Versão eu conseguir criar em apenas 2 dias e meio e nao deu tempo de testar mais se houver bugs comentem por favor. Versão x10.1- 1.0 Oque há de novo ? • Todas as mountarias da versao 10.10 • Todos os outfits 10.10 • Todos os items 10.10 • Monsters ainda em andamento. • Templo com cara de 10.10 • City Vip com novo visual 10.10 • War System 100% - Comandos :/war invite,nomedaguildrival outra guild ativar a war /accept war,guildrival cancelar war . /war cancel,guildrival • Cast System 100% - Comandos:!cast list para ver casts abertos,!cast nomedoplayer para entrar, !cast exit para sair do cast que voce está !cast on para voce abrir um cast e !cast off para sair • Novo Npc no templo que vende items 10.10 • Novo npc que vende items vip • Bug das houses retirados • Bug da Sql retirado • Novos Comandos /rank !mount nomedamount !addon nomedoaddon !changesex !buyhouse,!leavehouse,alana res,!sellhouse funcionando 100% e muito mais que nao veio na cabeça mais quando eu lembrar posto. O Servidor está em SQL pronto para por online e os erros do distro nao encomodam o server. • Baiak Yurots V5.2 Oque Mudou ? •Tirei bug das houses •Tirei todos os erro do distro •Arrumei o lado >> da city vip agora mais rox. • Baiak Yurots V5.1 Oque Mudou ? • Mudei a Quest do templo lv 150 ganha 2kk agora ganha só 500k • Melhorei os teleports master lv 300+ agora tem 4 novas quest e 2 hunt + • Mudei respaw de todas as hunts free , vip e master agora ta 5x melhor. • Mudei Tempo da loteria tava 15 em 15 minutos agora ta de 1 em 1 hora. • Melhorei a Exori gran do kina. • Mudei os loot do monster bosses agora igual da versao 10.30 do global • Adicionei quest do addon doll na area d lvel 300+ • Adicionei Quest do 2kk na area d Lvl 300+ • Adicionei Quest do necromancer shield na area de Lv 300+ • Adicionei Quest do Dwarven Set e hornede helmet na area de level 300+ • Adicionei o novo monster Master Medusa Lv 300+ • Adicionei 2 novas hunt de Master Medusa. Se eu lembrar mas alguma coisa eu posto. :S • Baiak Yurots V5.0 Oque Mudou ? • Agora a City Está Maior Mais Bonita e Com Mais Houses. • Novo Sistema de Treiner não prescisa andar muito para axar um livre. • Novos monstros vip ( Sea Serpent Vip , Hellhound vip , night mare vip , fury vip ) novos monstros master ( hydra master , frost master , grim master e demon master). • Nova Quest Master Com Armas Para todas as vocaçao. • Agora o NPC VIP Vende e compra items vip, pois se voce pegar item vip de algum red algo assim voce pode vender mais so que o npc compra 60% mais barato ☺ • Novo Npc que vender Red Remover. • Novo Templo. • Novas Quests. • Novo Depot. • Novos Commandos ( !food Compra 100 , !topfrags Ver quem é o top frag , !glist ver as guild do server e !glist Nameguild para ver os player da guild. • Teleports Free e vip Agora com nova cara. • Novo Caminho Para Poi no mesmo lugar so que mais bonito. • Addon agora é com addon doll npc Varkhal Vende. • Systema de Loteria a cada 2 Horas. • Nova arena de team god que organiza. E muito Mais .. Novos Items. Master vip Quest Teleports Master Templo vip Templo city Teleports Master Teleport Free Documento baiak original O Server Está FULL EM SQL Só Baixar e Por Online Abaixo ! Download Baiak 10.10 13/01/2014 - >http://www.4shared.com/rar/hOppT8_kba/Baiak_1010.html Scan Baiak 10.10 -> https://www.virustotal.com/pt-br/file/e18224ffa86a7a034e66d9d57e441cd179ed24a842fdcf9b532266227877f501/analysis/1389761678/ Testado 32bits windowns 7. acc do god -> god/god Creditos 10% GOD Bon | Por editar em 2008 90% Baiak Lula = Luizbaiak | Por editar2010 a 2014 Contato Face -> https://www.facebook...zhenrique.baiak Email -> Baiaklula@gmail.com Obrigado bom jogo! GOSTOU? DE REP+.
    1 ponto
  8. EdMignari

    Aumentando o Limite de Sprites

    Clientes com versões anteriores à 9.60 têm um limite de sprites de 65.535. Parece muito, mas logo esse limite é atingido e ficamos impossibilitados de adicionar novos objetos para o servidor/cliente a não ser substituindo alguns sprites. Esse tutorial pretende ensinar como configurar as principais ferramentas para aumentar o limite. A versão utilizada no tutorial foi a 8.60. Conhecimentos Necessários: Básico nas ferramentas utilizadas. Ferramentas Utilizadas: Object Builder (edita os arquivos dat e spr do cliente) ItemEditor (edita o arquivo otb, que contém os itens usados no servidor) OTClient 0.6.5 Remere's Map Editor Um programa para abrir arquivos LUA. Compilando os Arquivos Estendidos: 1.Abra seus arquivos spr e dat no Object Builder. 2.Compile os arquivos com a opção extended selecionada. Obs: Uma vez compilado estendido, a opção extended deverá estar sempre selecionada tanto ao abrir, quanto ao compilar. Configurando o ItemEditor: 1. Abra a janela preferences no menu File > Preferences ou pelo atalho Crtl + P 2. Selecione a opção extended e a pasta do cliente. Pode ser preciso reiniciar o aplicativo. Configurando OTClient: 1. Abra o arquivo things.lua encontrado em modules/game_things 2. Adicione esta linha de código na função load: function load() local version = g_game.getClientVersion() g_game.enableFeature(GameSpritesU32) -- Linha Adicionada local datPath, sprPath . . . 3.Adicione uma cópia dos arquivos dat e spr estendidos na pasta data/things. Remere's Map Editor : Abra a janela de preferências no menu File > Preferences e selecione a aba Client Version. 1 - Selecione a versão do cliente que será usada como padrão. 2 - Selecione a opção extended. 3 - Selecione a pasta onde se encontram os arquivos do cliente. OBS.: Quando a opção extended está selecionada, ocorrerá um erro se tentar abrir arquivos não estendidos ( arquivos com versão menores que 9.60) Perguntas Frequentes: P: Qual o novo limite de sprites após ser estendido? R: 4.294.967.295 P: Depois que compilar estendido, pode ser usando no cliente da Cip? R: Não! Seria preciso modificar o cliente para que consiga ler os arquivos. P: Posso usar o dat editor para modificar os arquivos depois? R: O ObjectBuilder é um dat/spr editor, mas se você quer usar outro editor, é pouco provável que funcione. Não custa tentar. Créditos: EdMignari (edmignari@xtibia.com)
    1 ponto
  9. Como o Xtibia mudou seu site, e o modo de edição de tópico colocarei resumido.. Global Compacto Versão 8.60 Links com DLL e Sem DLL http://www.mediafire.com/?651yyaal4lklfbb http://www.mediafire.com/?wkwwote6edvcv4o
    1 ponto
  10. 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
  11. EdMignari

    Object Builder

    Object Builder é o programa usado para editar itens, outfits, efeitos e mísseis no cliente. Ele edita e compila os arquivos dat e spr. (Object Builder) Versões suportadas: 8.00 - 10.38Download: ___________________________ Adobe AIR Object Builder 0.2.9 Scan Adobe AIR ___________________________ Sources GitHub
    1 ponto
  12. RastaLegion

    Tutorial Poison/Subsolo.

    1- Dirt/Stone Wall. Faça com calma , com formatos variados, evitando o formato escadinha ou reto demais. 2-Grounds. Coloque os grounds de poison nos cantos da cave com formatos variados visualizando como ficará depois de colocar a borda, já os dirts de uma variada para não ficar entediante. 3-Bordas/detalhes. Coloque as bordas e comece a detalhar, você pode usar plantas que lembre pantano, cogumelos, gravels, pedras de musgo se for cave de spiders pode colocar teias, ovos de aranha entre outras coisas. Bom Pessoal ,espero ter ajudado e que clique no botãozinho de curtir =).
    1 ponto
  13. Gabrieltxu

    ProjectPO - Mapping Showoff

    Ficou bem legal em manolo , desejo sorte a tu xD
    1 ponto
  14. Maenilse

    Distro e Source 8.60

    as sources infelizmente n poderei mandar, irei postar aqui 2 tipos de distro, compilada em CONSOLE q é a q vc n pode minimizar ela, e em GUI q é a minimizavel, basta aguardar um instante
    1 ponto
  15. Maenilse

    Distro e Source 8.60

    irei implantar so o dual weapon e o war system, porem n irei aumentar o limite do lvl, uns 10/20 minutos, eu edito o post com a distro, caso alguem n te forneça algo.
    1 ponto
  16. Avuenja

    Avu~ Spriter

    Fala povo... Com ajuda do Breno... Ta ai... Bom fiz mais a textura só... Ta fraco ainda... Mas é isso ai... Fiz ele moreno porque não sei que cor é a de pele... kkk Ela ainda esta incompleta... 1° Humano - 22/03/14 - 23:59 2° Potion life - 24/03/14 - 17:07 3° Avu shield - 24/03/14 - 17:33 4° Avu Long Sword - 24/03/14 - 22:40 v2 5° Avu Armor Mais uma srite galera... Nessa eu espero sugestões porque não manjo muito em gramas e taus... v2 Um pouco de cenário.... (Tentando aprender) Abraços! Obrigado Breno pela oportunidade! :3
    1 ponto
  17. Flaah

    Avu~ Spriter

    Pra um começo vc já pego a dimensão da coisa e proporção, só falta a sombra. Mais curtir suas sprites inicias kk' +REP
    1 ponto
  18. Benny

    A MELHOR ASSINATURA #100!

    Bom .. espero que não deletem, ou considerem flood . Enfim, a edição 100 haha. Um ano se passou desde que eu comecei a me interessar por design, e graças ao xtibia, hoje eu 'trabalho' com isso =P. Nunca pensei que ia chegar a esse ponto, sendo que a única coisa que eu queria no começo, era ter uma assinatura 'foda', que se não me engano, era uma que o overpower usava.. De tanto que gostei, comecei a aprender, e ir postando aqui, mas .. eu não tinha noção de nada, sempre foi trabalhoso para mim aprender rs, mas.. com as criticas do pessoal aqui, e a ajuda do over fora do fórum, consegui chegar a um certo nível, que me agradava, é claro que nunca se sabe de tudo, mas é sempre bom tentar. Não havia necessidade de eu fazer um post desse, mas .. eu sou eternamente grato ao fórum, graças a vocês eu sei o que realmente eu quero como emprego para mim Vou ver se consigo fazer algo descente, e participar aqui .. =P Novamente repito, parabéns a equipe, estão fazendo um ótimo trabalho. Abraços, Beeny. (se não for permitido postar aqui, avisa, que eu dou um ctr+c e colo em 'comentários/sugestões'.)
    1 ponto
  19. Save: local config = { broadcast = {120, 30}, flags = 13, delay = 120, events = 30 } local function executeSave(seconds) if(isInArray(config.broadcast, seconds)) then doBroadcastMessage("Server save within " .. seconds .. " seconds, please mind it may freeze!") end if(seconds > 0) then addEvent(executeSave, config.events * 1000, seconds - config.events) else doSaveServer(config.flags) end end function onThink(interval) if(table.maxn(config.broadcast) == 0) then doSaveServer(config.flags) else executeSave(config.delay) end return true end Clean: function executeClean(interval) doCleanMap() doBroadcastMessage("Game map cleaned, next clean in " .. table.concat(string.timediff(interval / 1000)) .. ".") return true end function onThink(interval) doBroadcastMessage("Game map cleaning within 30 seconds, please pick up your items!") addEvent(executeClean, 30000, interval) return true end
    1 ponto
  20. Wend ll

    PDA By: Bolz:: Versão [GOD anna]

    Eu Dentro da pasta do server tem um client que ta com o nome assim >> "Client Para usar Para editar o Mapa" pegue ele e bote na vaga do Tibia.Dat e Tibia.Spr da pasta do seu Tibia ..
    1 ponto
  21. Slicer

    [PDA] Aura

    mania q o pessoal tem de fazer perguntas sem dizer qual serv usa --' sabiam q existem dezenas de servs por ae? se tiver usando algum baseado no meu entao eh em lib/Movement_Effects.lua ... acha a funçao: function sendAuraEffect(cid, eff) e muda o 3000 aki: addEvent(sendAuraEffect, 3000, cid, eff) caso n saiba, 3000 quer dizer a cada 3seg...
    1 ponto
  22. lazarocp

    Novidade: Poketibia 9.60

    .
    1 ponto
  23. Slicer

    [Resolvido] Held Item

    function doRegenerateWithHeld(cid,sid) if not isSummon(sid) or not isPlayer(cid) then return elseif getCreatureCondition(cid, CONDITION_INFIGHT) or getCreatureCondition(sid, CONDITION_INFIGHT) then addEvent(doRegenerateWithHeld, 1000, cid, sid) return end local ball = getPlayerSlotItem(cid, 8) if ball.uid > 1 and getItemAttribute(ball.uid, "regenheld") == 1 and getCreatureHealth(sid) < getCreatureMaxHealth(sid) then doCreatureAddHealth(sid,1000) doSendAnimatedText(getThingPos(sid), "+1000", 30) end addEvent(doRegenerateWithHeld, 1000, cid, sid) end
    1 ponto
  24. gustavao2011

    [Encerrado]CONTRATANDO PESSOAS

    Bom dia, Entre em contato comigo. No aguardo
    1 ponto
  25. Oiie, achei um jeito mais Facil Usa essa Minha Script ae ta sem erro:: Bike.lua Sabe configurar né?
    1 ponto
  26. function doRegenerateWithHeld(cid,sid) local ball = getPlayerSlotItem(cid, 8) or getPlayerSlotItem(getCreatureMaster(cid), 8) if getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE then return false end if isSummon(sid) then if isPlayer(cid) and #getCreatureSummons(cid) > 0 then if isCreature(sid) and getItemAttribute(ball.uid, "regenheld") == 1 and getCreatureHealth(sid) < getCreatureMaxHealth(sid) then addEvent(function() doCreatureAddHealth(sid,1000) doSendAnimatedText(getThingPos(sid), "+1000", 30) end, 0) end end addEvent(doRegenerateWithHeld, 1000, cid, sid) end end
    1 ponto
  27. Reeditado o Layout de Dragon Ball....(deem uma olhada nesse) vê se melhorou =P *Não reparem no about pokeot Ps.Sim, Alex Pode deixar ;D Following Avuenja
    1 ponto
  28. BrenoNeto

    EkzART - Desenvolvendo Habilidades

    Claro, entra em contato via skype.
    1 ponto
  29. Já Pro corpse sumir depois de um certo tempo, normalmente é "50seg.", vc tem q ir em "data/items/items.xml" E adicionar isso: O "11912", é o id do corpse do Pokemon, no seu caso "Venusaur" O "8", é o número de "container's" (SLOOTS), que terá ao abrir o loot do pokemon. E o "55" é o tempo, que o corpse fica no chão, ali no Caso esta "55 Segundos" As Houses, Tem que estar Registradas, como Falou Kttalan. OBS: Caso Mesmo Registrando o Catch do Pokemon no "Lib/configurations.lua", e feito aquilo q falei acima, no "Items.xml" Recomendo, Que vc abra o DatEditor, e Procure o Corpse do POkemon e marque as seguintes opções, "Container", "Corpse", "Imobble". Logo Após, Abra Seu OtItemEditor, e Procure o Corpse Novamente e Marque a opção "NotMoveable". Tendo Feito isso, Estará Funcionando Perfeitamente!!! GRATO!
    1 ponto
  30. 1 - A House tem que estar registrada veja isso. 2 - Vá em data/lib/configuration.lua Procure a area de catch e coloque ["Venusaur"] = {chance = 5000, corpse = corpese do venusaur o novo man} mais duvidas tu tem meu skype.
    1 ponto
  31. Deadpool

    PDA By: Bolz:: Versão [GOD anna]

    Outland, Main Quest, Cyber Wolrd, Outlands, Liga Pokémon, acho que é a mesma coisa kkkk', mas vai demorar :v
    1 ponto
  32. Deadpool

    PDA By: Bolz:: Versão [GOD anna]

    @AnnaFeeh, Tem meu REP+ , gostei do serve, baixe o PokexCyan e retire os systemas e coloque nesse ai, e faça uma proxima versão, ficará Top #Rep+.
    1 ponto
  33. Wend ll

    PDA By: Bolz:: Versão [GOD anna]

    Vejo Lek com 1 Geração só de Lendarios e querendo Colocar Mais
    1 ponto
  34. Oi amigo. Estou em um novo computador, por isso, o resultado lixo. mil desculpas
    1 ponto
  35. Descrição: Como colocar uma foto dentro de um texto através do Photoshop. Aqui deixo mais um tutorial p/ vocês: Até o próximo!
    1 ponto
  36. EdMignari

    Aumentando o Limite de Sprites

    @allanzinh Acho que dá pra aumentar o seo. Mas como coloquei no tutorial, é preciso no mínimo saber o que está fazendo pra não bugar os arquivos. Salve uma cópia quando for testar. @DarkHeel Não, fica com limite de 4 bilhões de sprites
    1 ponto
  37. masdead

    [Show Off] Thiago Carvalho

    É o seguinte eu estou juntando todos os mapas que tenho aqui e vou formar só um, não vou postar imagem in game pois tem mapas de vários outros autores como: Beto06, AundSoul, Luffy, Left4Dead, Neon, entre outros.
    1 ponto
  38. 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)
    1 ponto
  39. u n d e r

    Shop OTClient

    Olá pessoal, Entendo que houve uma discussão saudável durante este tópico de dúvida. Aproveito para esclarecer que realmente, uma comunidade brasileira sofre com o não interesse de pessoas na participação de projetos. Muitos querem somente "criar seus servidores prontos", deixando de se esforçar para pensar, agir e concretizar. Este cenário é o qual desejo mudar, incentivando a todos a começarem a programar, desenvolver, estudar. Este é um caminho delicado e que exige tempo! Conto com vocês nessa nova empreitada! Tópico fechado para evitar conflitos.
    1 ponto
  40. Fala pessoal..Tudo certinho com vocês? Então..como já me perguntaram muito como que poem curva no texto, resolvi fazer esse tutorial pra ajudar os iniciantes de plantão por ai! Né!? Tutorial: Esse foi o primeiro de muitos!
    1 ponto
  41. Vaginal

    Pokémon Centurion V8.0

    Rep +
    1 ponto
  42. vital900

    [Mapping] Mostre suas Idéias

    Ideias sobre: Nature: Mistura de galhos Créditos: Daaniel, TK Entrada do cogumelo & Passagem pelas folhas & Aranha em sua teia Créditos: MetalChau, EK Espada encravada na pedra Construção: Trem No tibia & uma mini torre com um telhado massa & grande pé de morango. Créditos: MetalChau, EK Ponte 'alternativa' Créditos: MetalChau, EK Uma mina em perspectiva totalmente diferente (créditos: MetalChau, EK) Toda a mina Entrada da mina, e caminho do carrinho Um homem que morreu escalando a mina e o dragão botando fogo nesta Uma entrada de cave, diferente Trilhos partidos
    1 ponto
  43. Glanos

    Download Ot Map Editor 8.50 - 8.54

    Programa super nescesário para quem tem um otserv, com ele você poderá editar o mapa do seu server, criar cidades, casas, spawns, etc... Download : http://www.mediafire.com/?jgdcae1r4v124ip Scan : http://www.virustotal.com/file-scan/report.html?id=2f0f8a44abd163a0fc141b063350fd4cc94fa11721d92585b20efa241e110fae-1289859719
    1 ponto
  44. Vodkart

    Ring De Double Exp

    sabe o que eu estava pensando... É o seguinte, que dá para fazer através do onKill e usando stages! Na hora que você fosse matar o monstro iria checar se no slot tem o anel com ID "XY",caso tivesse ele faria a conta de quanto o jogador ganha ao matar um montro,por exemplo eu no level 300 mato um demon e ganho 6000 de xp,com o anel me dando 50% eu ganharia os 6000 + 3000 de exp, dando um total de 9000! está ai: function onKill(cid, target) local ringID = 2123 if isPlayer(cid) and isMonster(target) then if getPlayerSlotItem(cid, CONST_SLOT_RING).itemid == ringID then local exp = getExperienceStage(getPlayerLevel(cid), getVocationInfo(getPlayerVocation(cid)).experienceMultiplier) local count = ((getMonsterInfo(string.lower(getCreatureName(target))).experience*1.5*exp)/2) doPlayerAddExperience(cid, count) addEvent(doSendAnimatedText, 500, getCreaturePosition(cid), '+'..count, math.random(50,60)) end else return TRUE end return TRUE end configurado para dar 50% de bonus xp
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...