Ir para conteúdo
Close

POR UM TK MELHOR! Ajude a melhorar e evoluir ainda mais a nossa comunidade, veja mais clicando aqui!

Líderes


Conteúdo Popular

Mostrando conteúdo com a maior reputação desde 16/09/2018 em todas áreas

  1. 3 pontos
    Daniel

    [10.98] Carlin Revamp 2.0

    Trago a vocês a nova versão desse remake que fiz um tempo atrás. Agradecimentos ao @JohnBonner que me ajudou em alguns locais. Confiram o que mudou: - Bugs em algumas houses corrigidos; - Saídas leste, oeste e norte modificadas; - Nova loja de paladins, no topo da estrutura onde se localizava a antiga; - Nova biblioteca; - Novo depot; - Adição de um segundo depot com loja de jewels no topo e vista para o Magician's park; - Adição do Magician's Park e estatuas de memorial nos dois lados da cidade; - Remake do templo; - Remake da prision; - Remake do teatro; - Novo porto, localizado ao sol, tendo como acesso a loja de potions e de móveis; - Castelo editado, novo piso no topo com duas passagens para saída; - Remake em loja de npc de tasks, com saída para campo com flores; - Outras edições menores. Espero que gostem! Download - Link direto (arquivo.otbm) carlinrevamp2.0.otbm
  2. 2 pontos
    Sorry I don't speak spanish so you will have to bare with me. This is a new way for people to create npc's which use different types of currency, rather than a coming up with different items to trade with the npc or trying to edit the npc modules this method simplifies everything by providing the npc with a npc currency id. All this npc currency id is, is a storage value.. pretty simple eh? If the npc doesn't have a currency id then it will use the normal currency e.g. gold, plat, cc etc.. I originally posted this on otland, but fuck them xD Using Lailene here you can see she has a currency attribute with id of 123456 <?xml version="1.0" encoding="UTF-8"?> <npc name="Lailene" currency="123456" script="lailene.lua" walkinterval="2000" floorchange="0" speechbubble="2"> <health now="100" max="100"/> <look type="279" head="114" body="94" legs="113" feet="114" addons="0"/> </npc> Now any player who has a storage value of 123456 can purchase things from her shop provided they have enough value stored within the storage, similar to having money in the bank. The money or in this case the storage value is added and removed from the player in real time. Lets get to the code game.cpp Find this bool Game::removeMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) Replace the whole function with this. bool Game::removeMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) { if (cylinder == nullptr) { return false; } if (money == 0) { return true; } uint32_t currencyId = 0; Player* player; if (Creature* creature = cylinder->getCreature()) { if (Player* p = creature->getPlayer()) { currencyId = p->getNpcCurrencyId(); player = p; } } if (!currencyId) { std::vector<Container*> containers; std::multimap<uint32_t, Item*> moneyMap; uint64_t moneyCount = 0; for (size_t i = cylinder->getFirstIndex(), j = cylinder->getLastIndex(); i < j; ++i) { Thing* thing = cylinder->getThing(i); if (!thing) { continue; } Item* item = thing->getItem(); if (!item) { continue; } Container* container = item->getContainer(); if (container) { containers.push_back(container); } else { const uint32_t worth = item->getWorth(); if (worth != 0) { moneyCount += worth; moneyMap.emplace(worth, item); } } } size_t i = 0; while (i < containers.size()) { Container* container = containers[i++]; for (Item* item : container->getItemList()) { Container* tmpContainer = item->getContainer(); if (tmpContainer) { containers.push_back(tmpContainer); } else { const uint32_t worth = item->getWorth(); if (worth != 0) { moneyCount += worth; moneyMap.emplace(worth, item); } } } } if (moneyCount < money) { return false; } for (const auto& moneyEntry : moneyMap) { Item* item = moneyEntry.second; if (moneyEntry.first < money) { internalRemoveItem(item); money -= moneyEntry.first; } else if (moneyEntry.first > money) { const uint32_t worth = moneyEntry.first / item->getItemCount(); const uint32_t removeCount = (money / worth) + 1; addMoney(cylinder, (worth * removeCount) - money, flags); internalRemoveItem(item, removeCount); break; } else { internalRemoveItem(item); break; } } } else { int32_t value; player->getStorageValue(currencyId, value); if (value < money) { return false; } player->addStorageValue(currencyId, value - money); } return true; } Next find this void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) Replace the whole function with this void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) { if (money == 0) { return; } if (Creature* creature = cylinder->getCreature()) { if (Player* player = creature->getPlayer()) { if(uint32_t currencyId = player->getNpcCurrencyId()){ int32_t value; player->getStorageValue(currencyId, value); player->addStorageValue(currencyId, value + money); return; } } } uint32_t crystalCoins = money / 10000; money -= crystalCoins * 10000; while (crystalCoins > 0) { const uint16_t count = std::min<uint32_t>(100, crystalCoins); Item* remaindItem = Item::CreateItem(ITEM_CRYSTAL_COIN, count); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } crystalCoins -= count; } uint16_t platinumCoins = money / 100; if (platinumCoins != 0) { Item* remaindItem = Item::CreateItem(ITEM_PLATINUM_COIN, platinumCoins); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } money -= platinumCoins * 100; } if (money != 0) { Item* remaindItem = Item::CreateItem(ITEM_GOLD_COIN, money); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } } } npc.cppLook for this pugi::xml_attribute attr; if ((attr = npcNode.attribute("speed"))) { baseSpeed = pugi::cast<uint32_t>(attr.value()); } else { baseSpeed = 100; } Right underneath that you are going to place this. if ((attr = npcNode.attribute("currency"))) { currency = pugi::cast<uint32_t>(attr.value()); } npc.hLook for this bool isPushable() const final { return walkTicks > 0; } Place this right underneath uint32_t getCurrencyId() const { return currency; } Look for this uint32_t walkTicks; Place this right underneath uint32_t currency; player.cppFind this void Player::openShopWindow(Npc* npc, const std::list<ShopInfo>& shop) Replace that function with this void Player::openShopWindow(Npc* npc, const std::list<ShopInfo>& shop) { shopItemList = shop; sendShop(npc); sendSaleItemList(npc); } Next find this bool Player::updateSaleShopList(const Item* item) Replace that function with this bool Player::updateSaleShopList(const Item* item) { uint16_t itemId = item->getID(); if (itemId != ITEM_GOLD_COIN && itemId != ITEM_PLATINUM_COIN && itemId != ITEM_CRYSTAL_COIN) { auto it = std::find_if(shopItemList.begin(), shopItemList.end(), [itemId](const ShopInfo& shopInfo) { return shopInfo.itemId == itemId && shopInfo.sellPrice != 0; }); if (it == shopItemList.end()) { const Container* container = item->getContainer(); if (!container) { return false; } const auto& items = container->getItemList(); return std::any_of(items.begin(), items.end(), [this](const Item* containerItem) { return updateSaleShopList(containerItem); }); } } if (client) { client->sendSaleItemList(shopOwner, shopItemList); } return true; } Next you are going to look for uint64_t Player::getMoney() const Now right underneath that function you are going to place these. uint64_t Player::getMoney(Npc* npc) const { uint64_t cash; setNpcCurrencyId(npc); uint32_t currencyId = getNpcCurrencyId(); if (currencyId) { int32_t value; getStorageValue(currencyId, value); cash = (uint64_t)value; } else { cash = getMoney(); } return cash; } void Player::setNpcCurrencyId(Npc* npc) const{ currencyId = npc->getCurrencyId(); } uint32_t Player::getNpcCurrencyId() const { return currencyId; } player.hLook for this uint64_t getMoney() const; Place this right underneath uint64_t getMoney(Npc*) const; void setNpcCurrencyId(Npc*) const; uint32_t getNpcCurrencyId() const; Find this void sendShop(Npc* npc) const { if (client) { client->sendShop(npc, shopItemList); } } Place this right underneath void sendSaleItemList(Npc* npc) const { if (client) { client->sendSaleItemList(npc, shopItemList); } } Find this uint32_t manaMax; Place this right underneath mutable uint32_t currencyId; protocolgame.cpp Now find this function void ProtocolGame::sendSaleItemList(const std::list<ShopInfo>& shop) Place this right underneath void ProtocolGame::sendSaleItemList(Npc* npc, const std::list<ShopInfo>& shop) { NetworkMessage msg; msg.addByte(0x7B); msg.add<uint64_t>(player->getMoney(npc)); std::map<uint16_t, uint32_t> saleMap; if (shop.size() <= 5) { // For very small shops it's not worth it to create the complete map for (const ShopInfo& shopInfo : shop) { if (shopInfo.sellPrice == 0) { continue; } int8_t subtype = -1; const ItemType& itemType = Item::items[shopInfo.itemId]; if (itemType.hasSubType() && !itemType.stackable) { subtype = (shopInfo.subType == 0 ? -1 : shopInfo.subType); } uint32_t count = player->getItemTypeCount(shopInfo.itemId, subtype); if (count > 0) { saleMap[shopInfo.itemId] = count; } } } else { // Large shop, it's better to get a cached map of all item counts and use it // We need a temporary map since the finished map should only contain items // available in the shop std::map<uint32_t, uint32_t> tempSaleMap; player->getAllItemTypeCount(tempSaleMap); // We must still check manually for the special items that require subtype matches // (That is, fluids such as potions etc., actually these items are very few since // health potions now use their own ID) for (const ShopInfo& shopInfo : shop) { if (shopInfo.sellPrice == 0) { continue; } int8_t subtype = -1; const ItemType& itemType = Item::items[shopInfo.itemId]; if (itemType.hasSubType() && !itemType.stackable) { subtype = (shopInfo.subType == 0 ? -1 : shopInfo.subType); } if (subtype != -1) { uint32_t count; if (!itemType.isFluidContainer() && !itemType.isSplash()) { count = player->getItemTypeCount(shopInfo.itemId, subtype); // This shop item requires extra checks } else { count = subtype; } if (count > 0) { saleMap[shopInfo.itemId] = count; } } else { std::map<uint32_t, uint32_t>::const_iterator findIt = tempSaleMap.find(shopInfo.itemId); if (findIt != tempSaleMap.end() && findIt->second > 0) { saleMap[shopInfo.itemId] = findIt->second; } } } } uint8_t itemsToSend = std::min<size_t>(saleMap.size(), std::numeric_limits<uint8_t>::max()); msg.addByte(itemsToSend); uint8_t i = 0; for (std::map<uint16_t, uint32_t>::const_iterator it = saleMap.begin(); i < itemsToSend; ++it, ++i) { msg.addItemId(it->first); msg.addByte(std::min<uint32_t>(it->second, std::numeric_limits<uint8_t>::max())); } writeToOutputBuffer(msg); } protocolgame.h Find this void sendSaleItemList(const std::list<ShopInfo>& shop); Place this right underneath void sendSaleItemList(Npc* npc, const std::list<ShopInfo>& shop); luascript.cpp Find int LuaScriptInterface::luaPlayerAddMoney(lua_State* L) Replace that whole function with this int LuaScriptInterface::luaPlayerAddMoney(lua_State* L) { // player:addMoney(money[, currencyId]) uint64_t money = getNumber<uint64_t>(L, 2); uint32_t currencyId = getNumber<uint32_t>(L, 3); Player* player = getUserdata<Player>(L, 1); if (player) { if (currencyId) { int32_t value; player->getStorageValue(currencyId, value); player->addStorageValue(currencyId, value + money); } else { g_game.addMoney(player, money); } pushBoolean(L, true); } else { lua_pushnil(L); } return 1; } Next find this function which should be right below it. int LuaScriptInterface::luaPlayerRemoveMoney(lua_State* L) Replace that whole function with this int LuaScriptInterface::luaPlayerRemoveMoney(lua_State* L) { // player:removeMoney(money[, currencyId]) Player* player = getUserdata<Player>(L, 1); if (player) { uint64_t money = getNumber<uint64_t>(L, 2); uint32_t currencyId = getNumber<uint32_t>(L, 3); if (currencyId) { int32_t value; player->getStorageValue(currencyId, value); if (value < money) { pushBoolean(L, false); return 1; } player->addStorageValue(currencyId, value - money); pushBoolean(L, true); } else { pushBoolean(L, g_game.removeMoney(player, money)); } } else { lua_pushnil(L); } return 1; }
  3. 2 pontos
    KotZletY

    Vamos melhorar o TK!

    Hello membros do Tibia King, vocês puderam notar que recentemente tivemos algumas melhorias em nossa comunidade, como por exemplo o nossa nova seção de Classificados, um novo visual para o site, entre outras novidades que vocês podem conferir clicando aqui. Aah! Vale lembrar também que está acontecendo neste momento o evento "Mapper King" organizado pelo membro @Daniel, participe e acompanhe clicando aqui. Neste tópico gostaria de abordar um assunto importantíssimo a respeito de nossa comunidade: a participação vocês na comunidade! Ou seja, alguns dos membros da comunidade ajudam aos outros, postam conteúdos e contribuem bastante. assim como eu, mas como todos, também tenho minhas ocupações, projetos pessoais e o mais importante, vida pessoal. Por isso digo que é essencial o agradecimento e a retribuição de todos que usufruem de tudo que nossa comunidade oferece, mas eu vejo que muitos esquecem de fazer isso, agem como "leechers", apenas sugam o conteúdo e até mesmo pedem ajuda em nossas seções de suporte, é ajudado pelos membros do fórum e nem se quer agradecem pela atenção. O reconhecimento é muito gratificante, as vezes receber um simples "obrigado" já é muita coisa, isso incentiva que as pessoas continuarem ajudando, publicando e criando novos conteúdos para todos. Tente também contribuir com a comunidade, as vezes alguém está com um problema que você já resolveu alguma vez ou até mesmo você já sabe a solução, não custa nada ajudar e compartilhar o seu conhecimento! Então é isso galera, vamos tentar sempre evoluir e fazer com que essa comunidade maravilhosa seja ainda melhor. Nós da equipe do TK continuaremos fazendo nossa parte, ajudando sempre da melhor maneira. Vale lembrar que estamos com novas ideias para valorizar ainda mais os membros que são realmente ativos, portanto aguardem que novidades surgirão! E você? O que acha, concorda ou descorda? Deixe sua opinião aqui e vamos juntos em busca de uma comunidade melhor!
  4. 1 ponto
    EAEH GALERA DO TIBIAKING VIM DISPONIBILIZA UMA BASE ANTIGA ESQUECIDA, EU ATUALIZEI ELA UM POUCO, ESTOU AQUI POR CAUSA QUE FOI DIFICIL ACHA ESSA BASE UMA DAS MELHORES LENDARIAS, ESSA BASE E UMAS DAS BASE MAIS PARECIDAS DO POKEPRO.. INFORMAÇÕES *Tournament System não esta 100% *Sem Open Source *Base Lenda/Mega *Sem LvL System *Sem OLD Cliet *Foi arrumado o sexo "M" não é mais uma ball. *Source Compilando 100% *XP por RATES. *Box de 1 até 14/ SpBox 1 até 4 *SHOP System igual Pokepro 100% *Arrumado todos atalho de quest. *Alguns pokemon foi balanceado para evitar curar outros pokemon. *Adicionado Solgaleo *Arrumado O Mapa *Atualizado As Sprites * *Prints: *Download: *Scan: *Creditos:
  5. 1 ponto
    KOLISAO

    [show-off] Classic Yurots

    Classic Yurots v8.60 Eu estou desenvolvendo um novo Yurots! O mapa é exclusivo para o servidor e foi modificado para relembrar os tempos Old's. A versão da distro utilizada para o servidor é uma customização da OTX2 - 2.8 "LEZICK". A datapack foi completamente modificada e se tornou única, removendo todos os problemas encontrados da versão. Em breve irei atualizar este tópico e também adicionar atualizações sobre o projeto. Imagens Patch (basta clicar na versão para ser redirecionado até o post específico) - v0.10 (17/08/2018) - v0.20 (22/08/2018) - v0.25 (22/08/2018) - v0.30 (26/08/2018) Quer me ajudar? Poste sua sugestão para este projeto.
  6. 1 ponto
    Fala aí pessoal! Curse Tibia Server é um servidor para amantes de RPG, de rates baixas e onde a exploração é muito bem recompensada. Além disso, temos como foco fazer patchs frequentemente, sempre adicionando novos conteúdos e proporcionando novos desafios aos jogadores. Informações Gerais - A experiência é stagiada em torno de 5x até 1.5x. - O mapa é uma mistura de áreas e modificações próprias + global + partes de servidores que nunca foram lançados. - O servidor tem base na versão 9.6, mas adicionamos algumas criaturas e alguns itens de versões posteriores. Principais Mudanças - Em vez de poções recuperarem vida/mana instantaneamente, elas recuperam ao longo de 3 segundos. - O server tem Training Monk, porém, você só pode ficar neles durante 1 hora, para regenerar esse tempo é preciso caçar bastante. - Andar de barco é uma tarefa um pouco mais complexa, com um custo bastante elevado e algumas passagens precisando de uma pequena quest ou alguns itens. Vocações - 5 novas classes, além das existentes terem sido reformuladas. - Uma promoção a mais para cada classe. - Todas classes ganharam várias magias novas. - Uma das classes novas é o famoso Necromancer: Atributos Atributos são pontos escolhidos pelo jogador para melhorar o desempenho de seus personagens e desenvolvê-los de uma maneira pessoal. Eles também servem para poder conjurar algumas magias e fazer algumas interações com o mapa (Puxar uma alavanca emperrada exige força, por exemplo). Árvore de Skills A árvore de skills te permite distribuir pontos para liberar novas magias e personificar ainda mais seu personagem o deixando mais versátil de acordo com sua preferência. - Cada classe tem dois caminhos na árvore, cada um deles é voltado para uma jogabilidade diferente. - Quase todas magias são liberadas pela árvore. Prévia do Necromancer: Caminho da morte Caminho de summons Sistema de Raridade Todos equipamentos tem uma pequena chance de serem dropados como um item raro, épico ou lendário. - Quanto melhor a qualidade do item, melhor será os bônus, porém será mais difícil de encontrá-lo. Existem ainda alguns outros sistemas e as telas são mais um protótipo, mas acho que da pra ter uma ideia do objetivo do servidor. O que acham? Jogariam? Gostaria muito de ouvir críticas e opiniões! (:
  7. 1 ponto
    MarceloP

    OTClient 0.6.3 | 7.4 à 10.96

    Olá pessoal! Sou relativamente novo na comunidade, mas hoje estarei trazendo algo que me perdi por uma ou duas semanas! Podem haver bugs, entretanto ele está preparado para 10.95 sem muitos bugs, e minhas alterações para que funcionasse no 10.96 foram bem sutís. OTClient 0.6.3 Compilado em: 23 de agosto de 2016. Compativel com as versões: 7.4 à 10.96 Compilado por: MarceloP Sources: https://github.com/edubart/otclient Versões compatíveis: Mudar background do OTClient: Vá em otclient\data\images\ Substitua background.png. Reinicie o client. Adicionar versão no client (apenas a adição de versões abaixo da 10.96 são permitidas): Adicione a versão do client em otclient\modules\gamelib\game.lua. Crie uma pasta com a versão do client em otclient\data\things\ e coloque o .spr e dat. Reinicie o jogo. Bugs Conhecidos: Download: MEGA Sendspace Scan: VirusTotal Agradecimentos: Eldhelion Modelo de post por: @Azhaurn
  8. 1 ponto
    Absolute

    [Sistema de Ticket] Atendimento - Gesior Acc

    Fala galerinha do TK, depois de ver muitos pedidos em busca desse simples sistema, resolvi pegar um antigo meu e realizar algumas modificações para que vocês possam usar em seus servidores, aprimorando o atendimento aos seus players. Funcionamento; Quando o player logar a conta e clicar na página para abrir um chamado, irá abrir: Qualquer jogador com a conta logada, poderá abrir seu chamado, clicando em [Abrir chamado] (como mostra na imagem a cima). Então o mesmo será redirecionado para: Campos requeridos: Assunto; O nome já diz tudo, o motivo da abertura do chamado. Descrição; Nome também diz tudo, o assunto do motivo da abertura do chamado. Tag; Em tag ele selecionará o motivo do chamado (para ajudar o administrador dos tickets no assunto), Ficando mais ágil e bonito hihi . Prioridade; Em prioridade ele irá selecionar a prioridade da resposta do ticket, Alta; Normal ou Baixa. Pós clicar em "Submit" irá abrir o chamado como na imagem: Nota: Quando estiver logado com a conta do administrador (Page acess 6) irá aparecer na página um "Admin Painel" onde você irá ver, responder e gerenciar os chamados abertos pelos jogadores. Toda vez que o ticket for respondido o status é alterado para "Respondido" e então caso ainda haja alguma dúvida o players poderá responder o ticket, até você selecionar o status como "Fechado" Creio que está bem explicado o funcionamento. Enfim, agora vamos a instalação do sistema *-* Primeiramente na sua pasta htocs(em windows) ou www(no caso de linux), ou seja, na pasta do seu site, onde fica as páginas principais como: latestnews.php, arichive.php, highscores.php e companhia. Nesta pasta crie um arquivo com o nome de helpdesk.php e adicione o seguinte dentro: <?php if($logged) { // type (1 = question; 2 = answer) // status (1 = open; 2 = new message; 3 = closed;) $dark = $config['site']['darkborder']; $light = $config['site']['lightborder']; $priority = array(1 => "Baixa", "Normal", "Alta"); $tags = array(1 => "[Vendas]", "[Suporte]", "[Parceria]", "[Bug]", "[Outros]"); if($group_id_of_acc_logged >= $config['site']['access_admin_panel'] and $_REQUEST['control'] == "true") { if(empty($_REQUEST['id']) and empty($_REQUEST['acc']) or !is_numeric($_REQUEST['acc']) or !is_numeric($_REQUEST['id']) ) $bug[1] = $SQL->query('SELECT * FROM '.$SQL->tableName('z_helpdesk').' where `type` = 1 order by `uid` desc'); if(!empty($_REQUEST['id']) and is_numeric($_REQUEST['id']) and !empty($_REQUEST['acc']) and is_numeric($_REQUEST['acc'])) $bug[2] = $SQL->query('SELECT * FROM '.$SQL->tableName('z_helpdesk').' where `account` = '.$_REQUEST['acc'].' and `id` = '.$_REQUEST['id'].' and `type` = 1')->fetch(); if(!empty($_REQUEST['id']) and is_numeric($_REQUEST['id']) and !empty($_REQUEST['acc']) and is_numeric($_REQUEST['acc'])) { if(!empty($_REQUEST['reply'])) $reply=true; $account = $ots->createObject('Account'); $account->load($_REQUEST['acc']); $account->isLoaded(); $players = $account->getPlayersList(); if(!$reply) { if($bug[2]['status'] == 2) $value = "<font color=gray><b>Aguardando</b> <img src=images/bug/waiting.gif></font>"; elseif($bug[2]['status'] == 4) $value = "<font color=green><b>Respondido</b></font> <img src=images/bug/ok.png>"; elseif($bug[2]['status'] == 3) $value = "<font color=red><b>Fechado</b></font> <img src=images/bug/closed.png>"; elseif($bug[2]['status'] == 1) $value = "<font color=#4169E1><b>Nova Resposta</b></font> <img src=images/bug/new.png>"; $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR='.$config['site']['vdarkborder'].'><TD COLSPAN=2 CLASS=white><B>Atendimento</B></TD></TR>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td width=40%><img src=images/bug/report.png> <b>Assunto:</b></td><td> '.$tags[$bug[2]['tag']].' '.$bug[2]['subject'].' '.$value.'</td></tr>'; $main_content .= '<TR BGCOLOR="'.$light.'"><td><img src=images/bug/pri.gif> <b>Prioridade:</b></td><td> <img src=images/bug/'.$bug[2]['priority'].'.png> '.$priority[$bug[2]['priority']].''; $main_content .= '<TR BGCOLOR="'.$dark.'"><td><img src=images/bug/tibia.png> <b>Enviado por:</b></td><td>'; foreach($players as $player) { $main_content .= '<img src=images/bug/t.png> '.$player->getName().'<br>'; } $main_content .= '</td></tr>'; $main_content .= '<TR BGCOLOR="'.$light.'"><td colspan=2><img src=images/bug/des.png><b>Descrição:</b></td></tr>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td colspan=2>'.nl2br($bug[2]['text']).'</td></tr>'; $main_content .= '</TABLE>'; $answers = $SQL->query('SELECT * FROM '.$SQL->tableName('z_helpdesk').' where `account` = '.$_REQUEST['acc'].' and `id` = '.$_REQUEST['id'].' and `type` = 2 order by `reply`'); $ot = $config['site']['worlds']; foreach($answers as $answer) { if($answer['who'] == 1) $who = "<img src=images/bug/staff.gif> <font color=red><b>Staff</b></font>"; else $who = "<img src=images/bug/player.gif> <font color=green><b>Player</b></font>"; $main_content .= '<br><TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR='.$config['site']['vdarkborder'].'><TD COLSPAN=2 CLASS=white><B>Resposta #'.$answer['reply'].'</B></TD></TR>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td width=70%><img src=images/bug/tibia.png><i><b>Enviado por:</b></i></td><td>'.$who.'</td></tr>'; $main_content .= '<TR BGCOLOR="'.$light.'"><td colspan=2><img src=images/bug/des.png><i><b>Descrição:</b></i></td></tr>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td colspan=2>'.nl2br($answer['text']).'</td></tr>'; $main_content .= '</TABLE>'; } if($bug[2]['status'] <= 4) $main_content .= '<br><a href="index.php?subtopic=helpdesk&control=true&id='.$_REQUEST['id'].'&acc='.$_REQUEST['acc'].'&reply=true"><b>[Responder]</b></a>'; } else { //if($bug[2]['status'] < 3) //{ $reply = $SQL->query('SELECT MAX(reply) FROM `z_helpdesk` where `account` = '.$_REQUEST['acc'].' and `id` = '.$_REQUEST['id'].' and `type` = 2')->fetch(); $reply = $reply[0] + 1; $iswho = $SQL->query('SELECT * FROM `z_helpdesk` where `account` = '.$_REQUEST['acc'].' and `id` = '.$_REQUEST['id'].' and `type` = 2 order by `reply` desc limit 1')->fetch(); if(isset($_POST['finish'])) { if(empty($_POST['text'])) $error[] = "<font color=black><b>Por favor, preencha a descrição.</b></font>"; //if($iswho['who'] == 1) //$error[] = "<font color=black><b>Você precisa aguardar a resposta do usuário.</b></font>"; if(empty($_POST['status'])) $error[] = "<font color=black><b>Status cannot be empty.</b></font>"; if(!empty($error)) { foreach($error as $errors) $main_content .= ''.$errors.'<br>'; } else { $type = 2; $INSERT = $SQL->query('INSERT INTO `z_helpdesk` (`account`,`id`,`text`,`reply`,`type`, `who`) VALUES ('.$SQL->quote($_REQUEST['acc']).','.$SQL->quote($_REQUEST['id']).','.$SQL->quote($_POST['text']).','.$SQL->quote($reply).','.$SQL->quote($type).','.$SQL->quote(1).')'); $UPDATE = $SQL->query('UPDATE `z_helpdesk` SET `status` = '.$_POST['status'].' where `account` = '.$_REQUEST['acc'].' and `id` = '.$_REQUEST['id'].''); header('Location: index.php?subtopic=helpdesk&control=true&id='.$_REQUEST['id'].'&acc='.$_REQUEST['acc'].''); } } $main_content .= '<br><form method="post" action=""><table><tr><td>Mensagem:</i></td><td><textarea name="text" rows="3" cols="25"></textarea></td></tr><tr><td><br><font color=gray><b>Aguardando</b></font> <img src=images/bug/waiting.gif></td><td><input type=radio name=status value=2></td></tr><tr><td><font color=green><b>Respondido <img src=images/bug/ok.png /></b></font></td><td><input type=radio name=status value=4></td></tr><tr><td><font color=red><b>Fechado <img src=images/bug/closed.png></b></font></td><td><input type=radio name=status value=3></td></tr></table><br><input type="submit" name="finish" value="Submit" class="input2"/></form>'; //} //else //{ //$main_content .= "<br><font color=black><b>You can't add answer to closed bug thread.</b></font>"; //} } $post=true; } if(!$post) { $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR='.$config['site']['vdarkborder'].'><TD colspan=2 CLASS=white><B>Atendimento Admin</B></TD></TR>'; $i=1; foreach($bug[1] as $report) { if($report['status'] == 2) $value = "<font color=gray><b>Aguardando</b> <img src=images/bug/waiting.gif></font>"; elseif($report['status'] == 3) $value = "<font color=red><b>Fechado</b></font> <img src=images/bug/closed.png>"; elseif($report['status'] == 4) $value = "<font color=green><b>Respondido </b></font> <img src=images/bug/ok.png>"; elseif($report['status'] == 1) $value = "<font color=#4169E1><b>Nova Resposta</b></font> <img src=images/bug/new.png>"; if(is_int($i / 2)) { $bgcolor = $dark; } else { $bgcolor = $light; } $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><td width=75%><img src=images/bug/'.$report['priority'].'.png> <a href="index.php?subtopic=helpdesk&control=true&id='.$report['id'].'&acc='.$report['account'].'">'.$tags[$report['tag']].' '.$report['subject'].'</a></td><td>'.$value.'</td></tr>'; $showed=true; $i++; } $main_content .= '</TABLE>'; } } else { $acc = $account_logged->getId(); $account_players = $account_logged->getPlayersList(); foreach($account_players as $player) { $allow=true; } if(!empty($_REQUEST['id'])) $id = addslashes(htmlspecialchars(trim($_REQUEST['id']))); if(empty($_REQUEST['id'])) $bug[1] = $SQL->query('SELECT * FROM '.$SQL->tableName('z_helpdesk').' where `account` = '.$account_logged->getId().' and `type` = 1 order by `id` desc'); if(!empty($_REQUEST['id']) and is_numeric($_REQUEST['id'])) $bug[2] = $SQL->query('SELECT * FROM '.$SQL->tableName('z_helpdesk').' where `account` = '.$account_logged->getId().' and `id` = '.$id.' and `type` = 1')->fetch(); else $bug[2] = NULL; if(!empty($_REQUEST['id']) and $bug[2] != NULL) { if(!empty($_REQUEST['reply'])) $reply=true; if(!$reply) { if($bug[2]['status'] == 1) $value = "<font color=gray><b>Aguardando</b> <img src=images/bug/waiting.gif></font>"; elseif($bug[2]['status'] == 2) $value = "<font color=#4169E1><b>Nova Resposta</b></font> <img src=images/bug/new.png>"; elseif($bug[2]['status'] == 3) $value = "<font color=red><b>Fechado</b></font> <img src=images/bug/closed.png>"; elseif($bug[2]['status'] == 4) $value = "<font color=green><b>Respondido</b></font> <img src=images/bug/ok.png>"; $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR='.$config['site']['vdarkborder'].'><TD COLSPAN=2 CLASS=white><B>Atendimento</B></TD></TR>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td width=40%><img src=images/bug/report.png><b> Assunto:</b></td><td> '.$tags[$bug[2]['tag']].' '.$bug[2]['subject'].' '.$value.'</td></tr>'; $main_content .= '<TR BGCOLOR="'.$light.'"><td><img src=images/bug/pri.gif> <b>Prioridade:</b></td><td> <img src=images/bug/'.$bug[2]['priority'].'.png> '.$priority[$bug[2]['priority']].''; $main_content .= '<TR BGCOLOR="'.$dark.'"><td><img src=images/bug/tibia.png> <b>Enviado por:</b></td><td>'; $main_content .= '<img src=images/bug/t.png> You <br>'; $main_content .= '<TR BGCOLOR="'.$light.'"><td colspan=2><img src=images/bug/des.png><b>Descrição:</b></td></tr>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td colspan=2>'.nl2br($bug[2]['text']).'</td></tr>'; $main_content .= '</TABLE>'; $answers = $SQL->query('SELECT * FROM '.$SQL->tableName('z_helpdesk').' where `account` = '.$account_logged->getId().' and `id` = '.$id.' and `type` = 2 order by `reply`'); foreach($answers as $answer) { if($answer['who'] == 1) $who = "<img src=images/bug/staff.gif> <font color=red><b>Staff</b></font>"; else $who = "<img src=images/bug/player.gif> <font color=green><b>YOU</b></font>"; $main_content .= '<br><TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR='.$config['site']['vdarkborder'].'><TD COLSPAN=2 CLASS=white><B>Answer #'.$answer['reply'].'</B></TD></TR>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td width=70%><img src=images/bug/tibia.png><i><b> Enviado por:</b></i></td><td>'.$who.'</td></tr>'; $main_content .= '<TR BGCOLOR="'.$light.'"><td colspan=2><img src=images/bug/des.png><i><b>Descrição:</b></i></td></tr>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td colspan=2>'.nl2br($answer['text']).'</td></tr>'; $main_content .= '</TABLE>'; } if($bug[2]['status'] != 3) $main_content .= '<br><a href="index.php?subtopic=helpdesk&id='.$id.'&reply=true"><b>[Responder]</b></a>'; } else { //if($bug[2]['status'] != 3) //{ $reply = $SQL->query('SELECT MAX(reply) FROM `z_helpdesk` where `account` = '.$acc.' and `id` = '.$id.' and `type` = 2')->fetch(); $reply = $reply[0] + 1; $iswho = $SQL->query('SELECT * FROM `z_helpdesk` where `account` = '.$acc.' and `id` = '.$id.' and `type` = 2 order by `reply` desc limit 1')->fetch(); if(isset($_POST['finish'])) { if(empty($_POST['text'])) $error[] = "<font color=black><b>Descrição não pode ser vazia.</b></font>"; if($iswho['who'] == 0) $error[] = "<font color=black><b>Você precisa aguardar a resposta da staff.</b></font>"; if(!$allow) $error[] = "<font color=black><b>Você não possui nenhum char na conta.</b></font>"; if(!empty($error)) { foreach($error as $errors) $main_content .= ''.$errors.'<br>'; } else { $type = 2; $INSERT = $SQL->query('INSERT INTO `z_helpdesk` (`account`,`id`,`text`,`reply`,`type`) VALUES ('.$SQL->quote($acc).','.$SQL->quote($id).','.$SQL->quote($_POST['text']).','.$SQL->quote($reply).','.$SQL->quote($type).')'); $UPDATE = $SQL->query('UPDATE `z_helpdesk` SET `status` = 1 where `account` = '.$acc.' and `id` = '.$id.''); header('Location: index.php?subtopic=helpdesk&id='.$id.''); } } $main_content .= '<br><form method="post" action=""><table><tr><td><i>Description</i></td><td><textarea name="text" rows="15" cols="35"></textarea></td></tr></table><br><input type="submit" name="finish" value="Submit" class="input2"/></form>'; //} //else // //$main_content .= "<br><font color=black><b>You can't add answer to closed bug thread.</b></font>"; //} } $post=true; } elseif(!empty($_REQUEST['id']) and $bug[2] == NULL) { $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR='.$config['site']['vdarkborder'].'><TD CLASS=white><B>Atendimento</B></TD></TR>'; $main_content .= '<TR BGCOLOR="'.$dark.'"><td><i>Ticket doesn\'t exist.</i></td></tr>'; $main_content .= '</TABLE>'; $post=true; } if(!$post) { if($_REQUEST['add'] != TRUE) { $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR='.$config['site']['vdarkborder'].'><TD colspan=2 CLASS=white><B>Atendimento</B></TD></TR>'; foreach($bug[1] as $report) { if($report['status'] == 1) $value = "<font color=gray><b>Aguardando</b> <img src=images/bug/waiting.gif></font>"; elseif($report['status'] == 2) $value = "<font color=#4169E1><b>Nova Resposta</b></font> <img src=images/bug/new.png>"; elseif($report['status'] == 3) $value = "<font color=red><b>Fechado</b></font> <img src=images/bug/closed.png>"; elseif($report['status'] == 4) $value = "<font color=green><b>Respondido </b></font> <img src=images/bug/ok.png>"; if(is_int($report['id'] / 2)) { $bgcolor = $dark; } else { $bgcolor = $light; } $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><td width=75%><img src=images/bug/'.$report['priority'].'.png> <a href="index.php?subtopic=helpdesk&id='.$report['id'].'">'.$tags[$report['tag']].' '.$report['subject'].'</a></td><td>'.$value.'</td></tr>'; $showed=true; } if(!$showed) { $main_content .= '<TR BGCOLOR="'.$dark.'"><td><i>Nenhum atendimento solicitado.</i></td></tr>'; } $main_content .= '</TABLE>'; $main_content .= '<br><a href="index.php?subtopic=helpdesk&add=true"><b>[Abrir Chamado]</b></a>'; } elseif($_REQUEST['add'] == TRUE) { $thread = $SQL->query('SELECT * FROM `z_helpdesk` where `account` = '.$acc.' and `type` = 1 order by `id` desc')->fetch(); $id_next = $SQL->query('SELECT MAX(id) FROM `z_helpdesk` where `account` = '.$acc.' and `type` = 1')->fetch(); $id_next = $id_next[0] + 1; if(empty($thread)) $thread['status'] = 3; if(isset($_POST['submit'])) { //if($thread['status'] != 3) //$error[] = "<font color=black><b>Can be only 1 open bug thread.</b></font>"; if(empty($_POST['subject'])) $error[] = "<font color=black><b>Assunto cannot be empty.</b></font>"; if(empty($_POST['text'])) $error[] = "<font color=black><b>Description cannot be empty.</b></font>"; if(!$allow) $error[] = "<font color=black><b>You haven't any characters on account.</b></font>"; if(empty($_POST['tags'])) $error[] = "<font color=black><b>Tag cannot be empty.</b></font>"; if(!empty($error)) { foreach($error as $errors) $main_content .= ''.$errors.'<br>'; } else { $type = 1; $status = 1; $INSERT = $SQL->query('INSERT INTO `z_helpdesk` (`account`,`id`,`text`,`type`,`subject`,`status`,`tag`,`priority`) VALUES ('.$SQL->quote($acc).','.$SQL->quote($id_next).','.$SQL->quote($_POST['text']).','.$SQL->quote($type).','.$SQL->quote($_POST['subject']).','.$SQL->quote($status).','.$SQL->quote($_POST['tags']).','.$SQL->quote($_POST['priority']).')'); header('Location: index.php?subtopic=helpdesk&id='.$id_next.''); } } $main_content .= '<br><form method="post" action=""><font size=4><b>Atendimento</b></font><br><br><br><table><tr><td><img src=images/bug/report.png> <b>Assunto:</b></td><td><input type=text name="subject"/></td></tr><tr><td><img src=images/bug/des.png><b>Descrição:</b></td><td><textarea name="text" rows="4" cols="15"></textarea></td></tr><tr><td><img src=images/bug/tag.png> <b>TAG:</b></td><td><select name="tags"><option value="">SELECT</option>'; for($i = 1; $i <= count($tags); $i++) { $main_content .= '<option value="' . $i . '">' . $tags[$i] . '</option>'; } $main_content .= '</td></tr><tr><td><br><img src=images/bug/pri.gif> <b>Prioridade:</b></td><td><br><select name="priority"><option value="">SELECT</option>'; for($i = 1; $i <= count($priority); $i++) { $main_content .= '<option value="' . $i . '">' . $priority[$i] . '</option>'; } $main_content .= '</select></tr></tr></table><br><input type="submit" name="submit" value="Submit" class="input2"/></form>'; } } } if($group_id_of_acc_logged >= $config['site']['access_admin_panel'] and empty($_REQUEST['control'])) { $main_content .= '<br><br><a href="index.php?subtopic=helpdesk&control=true">[ADMIN PANEL]</a>'; } } else { $main_content .= 'Please enter your account name and your password.<br/><a href="?subtopic=createaccount" >Create an account</a> if you do not have one yet.<br/><br/><form action="?subtopic=helpdesk" method="post" ><div class="TableContainer" > <table class="Table1" cellpadding="0" cellspacing="0" > <div class="CaptionContainer" > <div class="CaptionInnerContainer" > <span class="CaptionEdgeLeftTop" style="background-image:url('.$layout_name.'/images/content/box-frame-edge.gif);" /></span> <span class="CaptionEdgeRightTop" style="background-image:url('.$layout_name.'/images/content/box-frame-edge.gif);" /></span> <span class="CaptionBorderTop" style="background-image:url('.$layout_name.'/images/content/table-headline-border.gif);" ></span> <span class="CaptionVerticalLeft" style="background-image:url('.$layout_name.'/images/content/box-frame-vertical.gif);" /></span> <div class="Text" >Account Login</div> <span class="CaptionVerticalRight" style="background-image:url('.$layout_name.'/images/content/box-frame-vertical.gif);" /></span> <span class="CaptionBorderBottom" style="background-image:url('.$layout_name.'/images/content/table-headline-border.gif);" ></span> <span class="CaptionEdgeLeftBottom" style="background-image:url('.$layout_name.'/images/content/box-frame-edge.gif);" /></span> <span class="CaptionEdgeRightBottom" style="background-image:url('.$layout_name.'/images/content/box-frame-edge.gif);" /></span> </div> </div> <tr> <td> <div class="InnerTableContainer" > <table style="width:100%;" ><tr><td class="LabelV" ><span >Account Name:</span></td><td style="width:100%;" ><input type="password" name="account_login" SIZE="10" maxlength="10" ></td></tr><tr><td class="LabelV" ><span >Password:</span></td><td><input type="password" name="password_login" size="30" maxlength="29" ></td></tr> </table> </div> </table></div></td></tr><br/><table width="100%" ><tr align="center" ><td><table border="0" cellspacing="0" cellpadding="0" ><tr><td style="border:0px;" ><div class="BigButton" style="background-image:url('.$layout_name.'/images/buttons/sbutton.gif)" ><div onMouseOver="MouseOverBigButton(this);" onMouseOut="MouseOutBigButton(this);" ><div class="BigButtonOver" style="background-image:url('.$layout_name.'/images/buttons/sbutton_over.gif);" ></div><input class="ButtonText" type="image" name="Submit" alt="Submit" src="'.$layout_name.'/images/buttons/_sbutton_submit.gif" ></div></div></td><tr></form></table></td><td><table border="0" cellspacing="0" cellpadding="0" ><form action="?subtopic=lostaccount" method="post" ><tr><td style="border:0px;" ><div class="BigButton" style="background-image:url('.$layout_name.'/images/buttons/sbutton.gif)" ><div onMouseOver="MouseOverBigButton(this);" onMouseOut="MouseOutBigButton(this);" ><div class="BigButtonOver" style="background-image:url('.$layout_name.'/images/buttons/sbutton_over.gif);" ></div><input class="ButtonText" type="image" name="Account lost?" alt="Account lost?" src="'.$layout_name.'/images/buttons/_sbutton_accountlost.gif" ></div></div></td></tr></form></table></td></tr></table>'; } ?> Salve e feche. Pós isso abra o seu phpmyadmin, seuip.com/phpmyadmin, clique em executar e dentro da caixa coloque o seguinte: CREATE TABLE IF NOT EXISTS `z_helpdesk` ( `account` varchar(255) NOT NULL, `type` int(11) NOT NULL, `status` int(11) NOT NULL, `text` text NOT NULL, `id` int(11) NOT NULL, `subject` varchar(255) NOT NULL, `priority` int(11) NOT NULL, `reply` int(11) NOT NULL, `who` int(11) NOT NULL, `uid` int(11) NOT NULL AUTO_INCREMENT, `tag` int(11) NOT NULL, `registered` int(11) NOT NULL, PRIMARY KEY (`uid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=61 ; E então irá aparecer aquela linha verde dizendo que o comando foi executado com sucesso... Pronto, o sistema foi implantando. Agora irei ensinar vocês (caso não saibam) adicionar a aba de atendimento no menu do seu website. Primeiramente, na pasta principal do seu site abra o arquivo index.php e procure por: case "houses": $topic = "Houses"; $subtopic = "houses"; include("houses.php"); break; Logo abaixo de break; adicione o seguinte: case "helpdesk": $topic = "Helpdesk"; $subtopic = "helpdesk"; include("helpdesk.php"); break; Ficando então: case "houses": $topic = "Houses"; $subtopic = "houses"; include("houses.php"); break; case "helpdesk": $topic = "Helpdesk"; $subtopic = "helpdesk"; include("helpdesk.php"); break; Salve e feche. Logo depois na pasta principal vá em layouts/tibiacom/layout.php e procure por: <a href='index.php?subtopic=archive'> <div id='submenu_archive' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)' onMouseOut='MouseOutSubmenuItem(this)'> <div class='LeftChain' style='background-image:url(<?PHP echo "$layout_name"; ?>/images/general/chain.gif);'></div> <div id='ActiveSubmenuItemIcon_archive' class='ActiveSubmenuItemIcon' style='background-image:url(<?PHP echo "$layout_name"; ?>/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'>News Archive</div> <div class='RightChain' style='background-image:url(<?PHP echo "$layout_name"; ?>/images/general/chain.gif);'></div> </div> </a> Logo depois do </a> adicione: <a href='index.php?subtopic=helpdesk'> <div id='submenu_helpdesk' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)' onMouseOut='MouseOutSubmenuItem(this)'> <div class='LeftChain' style='background-image:url(<?PHP echo "$layout_name"; ?>/images/general/chain.gif);'></div> <div id='ActiveSubmenuItemIcon_helpdesk' class='ActiveSubmenuItemIcon' style='background-image:url(<?PHP echo "$layout_name"; ?>/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'>Atendimento <font size=-3>NOVO</font></div> <div class='RightChain' style='background-image:url(<?PHP echo "$layout_name"; ?>/images/general/chain.gif);'></div> </div> </a> Salve e feche. Pronto, atualize seu site e no menu News verifique que estará lá em funcionalidade o sistema de Atendimento por Ticket. Dica: Seja formal e tenha eficaz com seus jogadores, isto mostrará a dedicação da equipe em cima do servidor. Este sistema é antigo, onde venho adaptando para postar para vocês do TibiaKing, não autorizo o post do mesmo em outro fórum seja qual for a relação. O conteúdo foi adaptado por mim e exclusivo ao fórum do tibiaking. Qualquer dúvida quero que me comunique e poste aqui no fórum. O Sistema foi testado e encontra-se em funcionalidade a qualquer gesior account, seja qual for a versão do mesmo. Créditos: Averatec -OTLAND Absolute Gostaram? Até o próximo sistema/script/servidor seja o que for! Até mais galerinha do TK!
  9. 1 ponto
    Dean183

    Hardcore Open Tibia

    Olá galerinha do tibiaking. Venho apresentar pra vocês um servidor que, espero, irá surpreendê-los. A ideia: 6 meses atrás quando o projeto se iniciou, eu e o outro administrador queriamos montar um servidor com o mapa do antigo PBOT para reviver os bons tempos daquele server, visto que a maioria dos servers de hoje estão cheios de pay-to-win e/ou mapas feitos as pressas.Com o decorrer do projeto nós vimos que poderíamos ir um pouco além do que imaginamos, e agora, 6 meses depois, quero apresentar para vocês um servidor feito pensando nos jogadores, e não em dinheiro. Tudo que foi feito no servidor foi feito com o OLD-CLIENT. As novidades: Um servidor não se mantém só de palavras bonitas, por isso nessa parte vou mostrar o que foi feito. Npcs: Monstros: Mapa: Gameplay & PVP: Desde o início do projeto a ideia sempre foi: "fazer um servidor com experiência baixa e com vários recursos novos que lembrem o servidores antigos.", para isso nós sabíamos que não iríamos impor o uso do OTClient. TODOS os recursos do game podem ser acessados sem nenhum problema por um cliente 8.6 normal. Fora isso nós adicionados alguns sistemas que irão certamente ajudar a melhorar o PVP de modo geral(Todas as informações aqui apresentadas podem vir a sofrer mudanças futuramente) Fields mostram quem os atirou(players e monstros) Loot Channel - a ideia é deixar um canal de mensagens separados para o loot, visto que o server log já é utilizado para várias coisas. Dual Wielding: Esse sempre foi um sistema muito discutido entre os servidores derivados de otserver, porém nenhum foi implementado corretamente. A ideia desse sistema é deixar o player decidir com sua conta e risco o que vale mais a pena em uma certa situação, dano ou defesa. O player poderá fazer o uso de qualquer combinação que preferir(No caso de knights) sword com axe, axe com club, sword com sword..., Se você utilizar 2 armas(ou 2 stars no caso de Paladins), o seu dano com aquelas armas aumentará em 30% mais você receberá 40% a mais de dano. Fist Aumenta Attackspeed: A ideia desse sistema é dar uma utilidade maior ao skill de fist, que é, na maioria das vezes, ignorado nos otservers. O seu fist será utilizado par aumentar o seu attackspeed. Aqui está uma pequena comparação entre diferentes valores de fist (lembrando que os valores referentes ao aumento do attackspeed estão sujeitos a mudanças futuras) Houses mostram seu tamanho quando você dá look na porta. Existem também várias guildHalls no jogo, todas funcionando perfeitamente.Para uma guild adquirir uma será necessário que o líder da guild efetue a compra. Houses com aluguel semanal: Esse é um sistema 'dormente' em muitos servidores.Enquanto estávamos arrumando as casas do servidores nós queríamos um jeito de manter os players que tem casa ativos no server, para isso só refizemos um sistema presente no antigo PBOT, o aluguel de casas. Quando você comprar um casa você receberá um aviso dizendo que você deverá deixar o valor do aluguel da casa dentro do depot da cidade em que a casa está vinculada. Caso você deixe de pagar o aluguel você receberá um aviso dizendo que você tem no máximo 1 dia para pagar a casa, se nesse tempo você não pagar você pederá a casa.A ideia desse sistema é fazer com que os players inativos não monopolizem as casas do jogo. Yellow Skull funciona corretamente. Cooldown de magias de healing e de ataque tem exhausted próprio, como no global. exura's curam paralyze. Quests: Sistema de Item Owner: Dungeons: Existem várias dungeons espalhadas pelo mapa, para adentrar-las será necessário pelo menos 2 players.Elas estão divididas em dungeons diárias, semanais, e mensais. Cada tipo com uma dificuldade distinta. A recompensa da dungeons são: dinheiro, experiência e um item que poderá ser trocado em um npc por outros itens, as dungeons também têm tempo para serem concluidas, caso você e seu grupo não consigam a completar a tempo serão mandados de volta para o início e poderão escolher entre tentar de novo e desistir. Exemplo de uma dungeon: A experiência e rate de skills do jogo ainda não foram decidas, mas não esperem um servidor que ao jogar por 1 hrs já está no level 100, as rates com toda certeza serão baixas. Isso Tudo e muito mais!!Em um servidor realmente inovador, SEM ITENS VENDIDOS EM SHOP, venderemos apenas PREMIUM(como era no global antigamente) Todos os itens serão obtidos in-game. Para mais informações e uma chance de participar em uma beta futuro: Discord: https://discord.gg/ngRdkD Facebook: https://www.facebook.com/hardcoreot/ Peço a todos os jogadores que gostaram da ideia que entrem no nosso grupo no discord e no nosso facebook para darem ideias, fazerem críticas e nos ajudar a fazer o melhor ot possível para o jogador, e não para o dono do server. Peço também que compartilhem esses links(do discord, facebook, e desse post) onde possível para nos ajudar a atingir o maior número de pessoas possíveis antes do lançamento oficial
  10. 1 ponto
    Kramer

    RESPONDIDO Script de efeito

    Não consegui ter um intentamento maior, esse script é para ser usado quando ? Assim que o player falar isso ou quando usar tal frase ? Pois tenho um quando ele pisar em X tile com ID ele ficaria com N storage ignorando o anti idle assim burlando o otservlist e soltando M efeito e rodando o char por X período que você programar, quanto maior o intervalo maior será a verificação do script causando mais lag.
  11. 1 ponto
    @Thiphone ActionID - É uma identidade, assim como pessoas tem números de Identidades(RG) diferentes para facilitar o acesso aos nossos dados. A actionID não é diferente, ela nada mais é que a identidade do Bau ou outro Item. Ah, mas o que ela faz? Simples. Se você criar um arquivo .lua com o nome de BAU, e outro arquivo com o nome de BAU2, cada um vai dar item diferente. Então terão identidades (actionID) diferentes um do outro. Exemplo: <action actionid="2240" event="script" value="bau.lua"/> <action actionid="2241" event="script" value="bau2.lua"/> Agora, respondendo a sua pergunta, "a action ID eu posso coloca qual eu quiser, ou posso colocar a 2000?" Sim, desde que ela não exista. Exemplo: Se o bau1 tem actionID = 1000, o bau2 NÃO pode ter actionID = 1000. Pode ser 1001, 1002, 1003.... Storage - Storages também NÃO PODEM SER IGUAIS. Se você usou no arquivo BAU a storage 2508, então no BAU2 você não poderá usar a mesma storage. (mentira pode usar sim, mas com algumas exceções). Pensa assim: É páscoa na sua escola, então estão distribuindo chocolates, doces.... Quando você ganhar seu chocolate e suas balinhas, você não poderá pegar de novo, por que você já pegou uma vez. Porém na escola você tem as professoras que veem quem recebeu ou não o chocolate e as balas, já no tibia "as professoras" são as storages. Ou seja, se você abrir um bau ele vai te dar a storage 1, se você tentar abrir o mesmo bau depois você não vai conseguir, por que você já ganhou o chocolate e as balas . Em poucas palavras, ao abrir o bau1, automaticamente você vai ganhar uma storage e se tentar abrir o mesmo bau não vai conseguir, pois você já abriu o bau uma vez e recebeu o prêmio.
  12. 1 ponto
    pablobion

    Action de "casulos" de bixos

    Basicamente são itens do tibia que diz "spider eggs" e você clica e nasce o bixo ou um bat do tronco etc... <action itemid="7537" script="other/spideregg.lua" /> <action itemid="5677" script="other/tortoisegg.lua" /> <action itemid="4189" script="other/bategg.lua" />
  13. 1 ponto
    JZDJ

    Download Clients 11+ IP 127.0.0.1

    Olá galera do TK. Hoje eu trago vários clientes de Tibia 11+ com IP 127.0.0.1. Vi que alguns usuários não estão conseguindo algumas versões 11 então resolvi postar aqui. Estou disponibilizando o EXECUTÁVEL DO CLIENTE. Para que funcione é só colocar na pasta BIN da versão correspondente. Também disponibilizei a pasta completa compactada. Vamos ao que interessa. Tibia 11.43.5504 127.0.0.1-11.43.5504.exe SCAN do cliente Pasta completa: Tibia 11.43.5504.rar SCAN pasta completa Tibia 11.44.5516 127.0.0.1-11.44.5516.exe SCAN do cliente Pasta completa: Tibia 11.44.5516.rar SCAN pasta completa Tibia 11.46.5556 127.0.0.1-11.46.5556.exe SCAN do cliente Pasta completa: Tibia 11.46.5556.rar SCAN pasta completa Tibia 11.47.5640 127.0.0.1-11.47.5640.exe SCAN do cliente Pasta completa: Tibia_11_47.5640.rar SCAN pasta completa Tibia 11.47.5674 127.0.0.1-11.47.5674.exe SCAN do cliente Pasta completa: Tibia_11_47.5674.rar SCAN pasta completa Tibia 11.48.5712 127.0.0.1-11.48.5712.exe SCAN do cliente Pasta completa: Tibia_11_48.5712.rar SCAN pasta completa Tibia 11.48.5753 127.0.0.1-11.48.5753.exe SCAN do cliente Pasta completa: Tibia_11_48.5753.rar SCAN pasta completa Tibia 11.49.5813 127.0.0.1-11.49.5813.exe SCAN do cliente Pasta completa: Tibia_11_49.5813.rar SCAN pasta completa Tibia 11.49.5884 127.0.0.1-11.49.5884.exe SCAN do cliente Pasta completa: Tibia_11_49.5884.rar SCAN pasta completa Tibia 11.49.5921 127.0.0.1-11.49.5921.exe SCAN do cliente Pasta completa: Tibia_11_49.5921.rar SCAN pasta completa Tibia 11.49.5983 127.0.0.1-11.49.5983.exe SCAN do cliente Pasta completa: Tibia_11_49.5983.rar SCAN pasta completa Tibia 11.49.6018 127.0.0.1-11.49.6018.exe SCAN do cliente Pasta completa: Tibia 11.49.6018.rar SCAN pasta completa Tibia 11.49.6030 127.0.0.1-11.49.6030.exe SCAN do cliente Tibia 11.49.6030.rar SCAN pasta completa Tibia 11.50.6055 127.0.0.1-11.50.6055.exe SCAN do cliente Tibia 11.50.6055.rar SCAN pasta completa Tibia 11.51.6099 127.0.0.1-11.51.6099.exe SCAN do cliente Tibia 11.51.6099.rar SCAN pasta completa Tibia 11.52.6104 127.0.0.1-11.52.6104.exe SCAN do cliente Tibia 11.52.6104.rar SCAN pasta completa Tibia 11.55.6239 127.0.0.1-11.55.6239.exe SCAN do cliente Tibia 11.55.6239.rar SCAN pasta completa Tibia 11.56.6239 127.0.0.1-11.56.6239.exe SCAN do cliente Tibia 11.56.6239.rar SCAN pasta completa Tibia 11.57.6239 127.0.0.1-11.57.6239.exe SCAN do cliente Tibia 11.57.6239.rar SCAN pasta completa Tibia 11.58.6239 127.0.0.1-11.58.6239.exe SCAN do cliente Tibia 11.58.6239.rar SCAN pasta completa Tibia 11.58.6239 ATUALIZADO 127.0.0.1-11_58.6239.exe ATUALIZADO SCAN do cliente Tibia 11.58.6239 ATUALIZADO.rar SCAN pasta completa Tibia 11.59.6424 127.0.0.1-11.59.6424.exe SCAN do cliente Tibia 11.59.6424.rar SCAN pasta completa Tibia 11.60.6457 127.0.0.1-11.60.6457.exe SCAN do cliente Tibia 11.60.6457.rar SCAN pasta completa Tibia 11.65.6492 127.0.0.1-11.65.6492.exe SCAN do cliente Tibia 11.65.6492.rar SCAN pasta completa Tibia 11.65.6507 127.0.0.1-11.65.6507.exe SCAN do cliente Tibia 11.65.6507.rar SCAN pasta completa Tibia 11.66.6516 127.0.0.1-11.66.6516.exe SCAN do cliente Tibia 11.66.6516.rar SCAN pasta completa Tibia 11.70.6535 127.0.0.1-11.70.6535.exe SCAN do cliente Tibia 11.70.6535.rar SCAN pasta completa Tibia 11.70.6543 127.0.0.1-11.70.6543.rar SCAN do cliente Tibia 11.70.6543.rar SCAN pasta completa Tibia 11.70.6548 127.0.0.1-11.70.6548.rar SCAN do cliente Tibia 11.70.6548.rar SCAN pasta completa Tibia 11.70.6555 127.0.0.1-11.70.6555.rar SCAN do cliente Tibia 11.70.6555.rar SCAN pasta completa Espero que eu tenha ajudado. Créditos: A Cip pelos clientes e a mim por ter alterado os ips nos mesmos. REP+ é sempre bom e não dói. Abraços. ATT , Jaurez/JZDJ
  14. 1 ponto
    nandoedp

    Ursulla Online (Rpg Game)

    Isso, tava faltando isso mesmo, divulgação em forum. Precisamos de um servidor nesse estilo, o Tibia comum com Knight, Paladin, Sorc/Druid ta chato, são os mesmo sistemas do global, com as mesmas classes do global, mesmas skills e o mesmo pvp. Sou mais um ansioso pra jogar e no aguardo por novas noticias.
  15. 1 ponto
    Daniel

    Daniel Spriting Art

    DANIEL SPRITING ART Sejam bem vindos à minha galeria de spriting. Tudo que estiver aqui é livre para uso
  16. 1 ponto
    DdJs

    Fortbay City | Cidade Completa | 11.40

    Fortbay City Version: 11.40 Brief infos: *63 houses *01 guildhall *01 depot *01 boat(s) *02 usable hunt places Download: Type: .Rar Size: 677KB Temple position: [X: 1028 Y: 1025 Z: 7] File password: tibiaking Scan: OBSERVAÇÕES: O mapa não foi implantado em qualquer otserver para teste, então pode haver pequenos erros no mapa (e.g: ausencia de pz tiles, portas que não abrem, blank tiles, etc). Images:
  17. 1 ponto
    sirarcken

    Cliente 10- Versão 11.80+

    Atualizado para 11.80+ [*] Items [*] Outfits [*] Effects Unica coisa que não fiz a mão foram os addons, monstros e items tudo na raça. Adicionei ao Git Lab para ficar parecendo mais profissional. Download Se possível quem baixar e testar, gostaria de um feedback so pra ver se esta funcionando certinho e tals.
  18. 1 ponto
    Mateus Santosss

    Sprites de NTO

    Bom, esse client que eu descompilei foi de um "moleque" que arranjou treta com a aliança ultra! . Prints: Download: Aqui Scan: https://www.virustotal.com/pt/file/3201013d9163715f9e6d3731aa955b1df319570dc0225ffc97c7903d7c2cc2c0/analysis/1506425321/ Creditos: 1% Mateus (Descompilar) 98% ao NTO TAKE. 1% Leprosotibiano (ALGUMAS sprites)
  19. 1 ponto
    Dwarfer

    RESPONDIDO Npc Crafting

    crafter.lua Crafter.xml <?xml version="1.0" encoding="UTF-8"?> <npc name="Crafter" script="crafter.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="66"/> </npc> Edite as falas e os nomes como queira. Apenas coloquei exemplos para te servir como base.
  20. 1 ponto
    Bom, ja tem um script como esse aqui no fórum, mas muitos não conseguirão colocar pra funcionar, esse aqui é 100% funcional em qualquer servidor. 1º - Vá na pasta Lib, no arquivo some functions.lua e adicione isso depois do ultimo "end": 2º - Vá em actions/script e crie um arquivo.lua com nome de Autoloot, dentro coloque: 3° Agora, no actions.xml adicione a tag: <action itemid="1123" event="script" value="Autoloot.lua"/> Dentro de itemid="", coloque o id dos corpses. Uma imagem Tbm vou disponibilizar os ids de cada corpo dos pokemon; peguei de cada script de pokemon pq pelo arquivo configuration não funciona Esses ids sao da base Pda Pyros Créditos: Jhonata Solsa ~~Por edittar Mkalo -- Auto Stacking Gabriel Sales(eu) -- Resto
  21. 1 ponto
    Informações: Diversas Transformações como Goku GodMode, Golden Freeza, Bills entre outras! Novos sistemas! Mapa próprio! Reborn System! Diversas Quests! Diversos Items! E mais! Imagens: Download: Mediafire Scan: https://www.virustotal.com/pt/file/82bf4689784c5459e240d0ba7fd15e28b5ab8f2253c885d43aeaa875b07ded11/analysis/1437840718/ Distro(Executavel + DLL's) By Animal Pak: Download Scan: https://www.virustotal.com/pt/file/ffd037b5dfa3c6e5529490e460d075da3b4c24e8a230671a7d0c11f0dbc6d8d4/analysis/1438323955/ Créditos: DBRelated Team Animal Pak
  22. 1 ponto
    Olá galerinha do TK Hoje eu vou ensinar vcs a como criar um client próprio e customizado pro seu ot Neste tutorial eu vou usar o OTC ou OT Client Primeiramente baixe o OTC. Após isso vá ate '\otclient-master\modules\client' e abra o arquivo 'client.otmod' Remova essas linhas: Dentro do diretório \otclient-master modules\client_entergame Você irá abrir o arquivo "entergame.lua" Dentro da função "Init", você vai procurar por: E embaixo dessa função você adiciona essa linha : EnterGame.setUniqueServer('127.0.0.1', 7171, 854, 270, 210) Como configurar essa função: EnterGame.setUniqueServer(Ip do server, Porta (7171), Versão do server, Largura da janela, Altura da Janela) Depois para alterar as imagens navegue ate a pasta \data\images e edite o background.png Depois na pasta \data\things crie uma nova pasta com a versão do seu OT sem ponto. Exemplo: 1041 Coloque o .spr e .dat lá dentro. Já está pronto!
  23. 1 ponto
    Olá :v como o titulo ja diz, irei disponibilizar a vcs um script de um bau que ao clicar, venha um pokemon que vc determinar.. 1º - Abra a pasta Servidor/data/actions/scripts, crie um arquivo em .lua, e coloque isso: Para Servidores PDA sem level System: Para Servidores Com Level System: 2º - Abra o arquivo actions.xml e adicione isso: Coloque o actionid no bau que vc quer q dê o pokemon pelo mapa. Em baupokemon.lua é o nome do arquivo q vc criou.. Espero ter ajudado, se ajudei, clique em gostei pf. Até a Próxima
  24. 1 ponto
    Depois de ter me virado aqui consegui ! era so editar o if($section_id == 1 && $group_id_of_acc_logged < $group_not_blocked) $errors[] = 'Only moderators and admins can post on news board.'; para if($section_id == 12345 (ID DA MINHA ACC) && $group_id_of_acc_logged < $group_not_blocked) $errors[] = 'Only moderators and admins can post on news board.'; Podem fechar o tópico!
  25. 1 ponto
    Adriano SwaTT

    [Tutorial] Criando Mana Rune

    É, todos conhecem a "Mana Rune", então nem tenho muito o que fala... Então vamos lá.. A Imagem da Runa que será a "Mana Rune" está no spoiler abaixo. 1º Passo 2º Passo 3º Passo Ex: <item fromid="2275" toid="2285" article="a" name="spell rune"> <attribute key="weight" value="120" /> </item> Item FromID 2275 - ToID 2285, ou seja, da ID 2275 à ID 2285 todos os items serão chamados de "spell rune" como está na tag. P- Certo, então como procurá-la então? R- Simples... basta você procurar pelo nome do item, ou seja, procure por "spell rune". Nessa parte tem um porém... você tem que verificar se não há uma tag que comprometa a nova tag que será adicionada. P- Como assim? R- Simples, como no exemplo que usei acima, ele renomeia as runas de ID 2275 à 2285, ou seja, a "2281" que é a Runa na qual iremos editar já está sendo nomeada. Usando este exemplo (que é fictício) vamos fazer o seguinte, ao invés de deixar renomeando até a 2285, você edita para renomear até a 2280 já que iremos usar a "2281". Para o exemplo que citei acima, ficará assim: <item fromid="2275" toid="2280" article="a" name="spell rune"> <attribute key="weight" value="120" /> </item> Certo, agora você adiciona a tag da runa abaixo do código que foi alterado. A tag da "Mana Rune" é a que está abaixo: <item id="2281" article="a" name="Mana Rune"> <attribute key="weight" value="120" /> </item> Após feito isso, para as runas restantes não ficarem sem nome (runas de ID 2282, 2283, 2284 e 2285, no nosso exemplo), adicione o código abaixo renomeando-as. <item fromid="2282" toid="2285" article="a" name="spell rune"> <attribute key="weight" value="120" /> </item> Vale lembrar que para cada caso, as ID's vão está diferente. Se você leu o tutorial pela opção "não conseguiu encontrar a " ID da RUNA"" você acaba por aqui. Apague o que está codificado e adicione o código abaixo em seu lugar. <item id="2281" article="a" name="Mana Rune"> <attribute key="weight" value="120" /> </item> É, eu acho que é isso...Espero que funcione. Créditos pelo Script: Miter (Outro Forum) Script Editado por: AdrianoSwaTT TUTORIAL feito por: AdrianoSwaTT Abraços galera
Líderes está configurado para São Paulo/GMT-03:00

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia partindo do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer publicidade para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução! A publicação do seu anuncio é instantânea!

×