Ir para conteúdo

Líderes

Conteúdo Popular

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

  1. Bug de clonagem de dinheiro/itens

    EddyHavoc e 3 outros reagiu a Bruno Carvalho por uma resposta no tópico

    4 pontos
    Bom, estou criando esse tópico (que eu queria ter feito em vídeo no começo do ano) para contar-lhes um dos maiores bugs que existem nos otservs. Como alguns sabem eu participei da equipe do CaterOT e lá descobri muitas falhas em servidores e até dentro da equipe já tive a ideia de publicar estes problemas. Talvez o problema que mais dá dor de cabeça nos servidores é a clonagem de dinheiro... Como aquele player ficou rico?! Basicamente o problema consiste em duas funções (removeMoney e removeItem), quando elas são executadas, é retornado um booleano (verdadeiro ou falso) para saber se o item/dinheiro foi removido ou não. Mas se essa função não está dentro de um verificador (IF) mesmo que ela seja falsa ela irá funcionar e entregar o dinheiro/o item comprado sem verificar nada. Aos que conhecem C++, leia esse código e me diga se ele retorna algum nil caso o dinheiro não for encontrado: TFS 1.3: https://github.com/otland/forgottenserver/blob/master/src/luascript.cpp#L8487 Base TFS 0.3: https://github.com/mattyx14/otxserver/blob/otxserv2/path_8_6x/sources/luascript.cpp#L5550 Verifiquei vários servidores disponíveis no github e vi que vários tem esse problema. Um dos exemplos é o Otxserver-New do malucooo. Com uma unica pesquisa , vemos tudo o que há no código. E assim encontramos vários NPCs, Actions e Moveevents que não tem esse cuidado de verificar se o dinheiro foi realmente removido. Um exemplo é o NPC Black Bert Ai você me fala: Ah Bruno, mas não tem como dar erro por que ele já utiliza o getMoney ali em cima... NÃO ADIANTA USAR O GETMONEY, VOCÊ SÓ USA ELE SE PRECISAR VERIFICAR MAIS DE DOIS ITENS (EM BAIXO MAIS EXPLICAÇÕES). Basicamente as pessoas que fazem esse bug utilizam programas que colocam para o npc comprar/vender o item tendo o dinheiro/item e removem o item do personagem em fração de milésimos após clicar, assim o sistema "buga" (não é um bug, ele somente retorna falso no código pelo fato de o player “não ter“ o item, passando pelo verificador (getItem e getMoney) sem dar erro... O único verificador que funciona é o que diz se o item foi realmente removido. Antes/Depois Mas ai surge o problema de: Ah, e quando há mais de um item para ser removido (ou um item junto com dinheiro)? Dai você usa o getItem/getMoney e abaixo dele utiliza a função de remoção, para evitar que um item seja removido do player caso ele não houver o segundo item necessário. Exemplo: Exemplo 2: Este é um exemplo de como verificar se há mais de um item necessário. E ainda depois do segundo if poderia ser colocado um else alertando aos administradores o nome do player que está tentando bugar, pois se o player não fez nada de errado esse fator nunca irá acontecer. Ainda duvidam de mim? Você que usa TFS 1.2+ execute esse código em uma talkaction, tendo o item 2160 ou não. function onSay(player, words, param) if not player:getGroup():getAccess() then return true end if player:getAccountType() < ACCOUNT_TYPE_GOD then return false end player:removeItem(2160, 1) player:sendTextMessage(MESSAGE_INFO_DESCR, "Item removido!") end Isto serve para qualquer distribuição/versão de servidor. Não é um bug de distribuição, é um erro cometido por quase todos os SCRIPTERS.
  2. Perfect Tv System - OrochiElf

    sdnjaks e um outro reagiu a Orochi Elf por uma resposta no tópico

    2 pontos
    Perfect Tv System autor: Tony Araújo (OrochiElf) Olá pessoal, hoje eu vim mostrar para vocês o meu novo sistema de TV. Sim, isso mesmo, um sistema de televisão completo. Bom, como a maioria sabe, nenhum sistema de televisão disponível foi desenvolvido da "maneira correta". - Mas como assim, "maneira correta"? Sem utilizar a tecnica milenar chamada "GAMBIARRA", e a mais famosa delas é o auto teleport by step, ele consiste em teletransportar o telespectador toda vez em que o transmissor der um passo, ou seja, se tiver um canal com 100 pessoas assistindo, e o jogador estiver uma velocidade consideravel (ex: 2-4 passos por segundo), o que seria (120 - 240) passos por minuto, o que levaria então a (1200 - 2400) passos por minuto, por conta de todos os jogadores assistindo. Imaginem só a CPU gritando, é o que acontece, e então milhares de problemas acontecem, quedas por alto consumo da CPU, mass kicks, enfim, este sistema que estou mostrando a vocês foi desenvolvido utilizando a mesma técnica que o SvkE / PxG. É denominado de (compartilhamento de dados), consiste enviar os mesmos pacotes para todos os que estão dentro de uma certa lista / tabela. É simples entender a tecnica, pense o seguinte, quando o jogador vai dar um passo para algum lado, o servidor precisa enviar todas as informações de mapa, criaturas, items que estão na nova posição (que seriam os dados), e esse sistema envia os mesmos dados para todos os jogadores que estão assistindo, fazendo assim, atualizar a tela de todos telespectadores com as imagens do local do transmissor. Espero que gostem Obs: Como está escrito no vídeo (Vídeo não oficial), não é a versão final do vídeo, porque eu gravei de ultima hora e a qualidade não ficou boa, as travadas é por conta do meu computador, tinham algumas coisas abertas kkkk (PC lixo é assim mesmo).
  3. [TFS 1.x] TK Vip System

    Murilo35 reagiu a luanluciano93 por uma resposta no tópico

    1 ponto
    Olá pessoal, estou desenvolvendo esse sistema vip para TFS 1.x, se precisarem de alguma função nova é só comentar, criei para usar em um servidor meu e resolvi postar, bom proveito a todos. É só ir no arquivo data/lib/core/player.lua e adicionar esse código no começo do script: -- ALTER TABLE `accounts` ADD `vip_time` BIGINT(20) NOT NULL DEFAULT 0; -- player:getVipTime() function Player.getVipTime(self) local resultId = db.storeQuery("SELECT `vip_time` FROM `accounts` WHERE `id` = '".. self:getAccountId() .."';") local time = resultId ~= false and result.getNumber(resultId, "vip_time") or 0 result.free(resultId) return time end -- player:isVip() function Player.isVip(self) return self:getVipTime() > os.time() and true or false end -- player:addVipDays(days) function Player.addVipDays(self, days) return(self:isVip() and tonumber((days * 86400))) and db.query("UPDATE `accounts` SET `vip_time` = '".. (self:getVipTime() + (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") or db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() + (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:removeVipDays(days) function Player.removeVipDays(self, days) return(self:isVip() and tonumber((days * 86400))) and db.query("UPDATE `accounts` SET `vip_time` = '".. (self:getVipTime() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") or db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:setVipDays(days) function Player.setVipDays(self, days) return db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:removeVip() function Player.removeVip(self) db.query("UPDATE `accounts` SET `vip_time` = '0' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:sendVipDaysMessage() function Player.sendVipDaysMessage(self) if self:isVip() then local vipTime = self:getVipTime() - os.time() local vipDays = 1 + (math.floor(vipTime / 86400)) return self:getVipTime() ~= false and self:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, 'You have '.. vipDays .. ' vip day(s) in your account.') end end -- player:checkVipLogin() function Player.checkVipLogin(self) if self:getVipTime() > 0 and not self:isVip() then return self:removeVip() and self:teleportTo(self:getTown():getTemplePosition()) end end As funções são: • player:getVipTime() - Retorna o valor da tabela vip_time (igual esta na database). • player:isVip() - Retorna se o player é vip ou não. • player:addVipDays(days) - Usa-se em algum script para para adicionar dias de vip ao player (parâmetro de entrada "days"). • player:removeVipDays(days) - Usa-se em algum script para para remover dias de vip do player (parâmetro de entrada "days"). • player:setVipDays(days) - Usa-se em algum script para para mudar os dias de vip do player (parâmetro de entrada "days"). • player:removeVip() - Usa-se em algum script para para remover todo tempo de vip do player. • player:sendVipDaysMessage() - Retorna uma mensagem no player mostrando os dias de vip que ainda restam ao player. • player:checkVipLogin() - Checa se a vip do player acabou, se sim teleporta ele para o templo. Qualquer dúvida ou erro/bug poste aqui.
  4. [Mod] Automatic Raids [Dia E Hora Marcada]

    kingdj22 reagiu a Vodkart por uma resposta no tópico

    1 ponto
    Automatic Raids.xml <?xml version="1.0" encoding="UTF-8"?> <mod name="Automatic Raids" version="1.0" author="Vodkart And xotservx" contact="tibiaking.com" enabled="yes"> <config name="raids_func"><![CDATA[ days = { ["Monday"] = { ["21:30"] = {nome = "Orshabaal", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}},m = {"5 Fire Devil", "2 Orshabaal"}, Time = 15}, ["21:33"] = {nome = "Dragon", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}},m = {"100 Dragon"}, Time = 20} }, ["Sunday"] = { ["10:08"] = {nome = "Demon", pos = {fromPosition = {x=202, y=11, z=7},toPosition = {x=204, y=12, z=7}}, m = {"1 Demon"}, Time = 15}, ["10:46"] = {nome = "Hydra", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}}, m = {"7 Hydra", "4 Cyclops"}, Time = 20} } } ]]></config> <globalevent name="AutomaticRaids" interval="60" event="script"><![CDATA[ domodlib('raids_func') function onThink(interval, lastExecution) if days[os.date("%A")] then hours = tostring(os.date("%X")):sub(1, 5) tb = days[os.date("%A")][hours] if tb then function removeCreature(tb) for x = ((tb.pos.fromPosition.x)-10), ((tb.pos.toPosition.x)+10) do for y = ((tb.pos.fromPosition.y)-10), ((tb.pos.toPosition.y)+10) do local m = getTopCreature({x=x, y=y, z= tb.pos.fromPosition.z}).uid if m ~= 0 and isMonster(m) then doRemoveCreature(m) end end end end doBroadcastMessage("The invasion of " .. tb.nome .. " started") for _,x in pairs(tb.m) do for s = 1, tonumber(x:match("%d+")) do pos = {x = math.random(tb.pos.fromPosition.x, tb.pos.toPosition.x), y = math.random(tb.pos.fromPosition.y, tb.pos.toPosition.y), z = tb.pos.fromPosition.z} doSummonCreature(x:match("%s(.+)"), pos) end end addEvent(removeCreature, tb.Time*60*1000, tb) end end return true end ]]></globalevent> </mod> Configuração: days = { ["Monday"] = { ["21:30"] = {nome = "Orshabaal", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}},m = {"5 Fire Devil", "2 Orshabaal"}, Time = 1}, ["21:33"] = {nome = "Dragon", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}},m = {"100 Dragon"}, Time = 2} }, ["Tuesday"] = { ["10:44"] = {nome = "Demon", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}}, m = {"5 Demon", "8 Fire Devil"}, Time = 1}, ["10:46"] = {nome = "Hydra", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}}, m = {"7 Hydra", "4 Cyclops"}, Time = 2} } } ["DIA"] = { ["HORA DA INVASÃO"] = {nome = "NOME DA INVASÃO", pos = {começo e final da área}, monster = {"MONSTROS"}, Time = para remover os monstro} } O dia da invasão é colocada entre " " e somente dia em inglês e a primeira letra maiúscula, exemplo: "Saturday" Depois são as hora da invasão, que é colocada entre " " e somente a hora e minuto, segundos não precisa exemplo: "15:00" As Posições estão entre { } adicionando as posições x, y e z, é o começo e final da área exemplo: pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}} fromPosition -- começo da área onde vai acontecer a raid toPosition -- final da área onde vai acontecer a raid Os monters tem um modo especial de configurar, vc coloca entre { }, e cada monstro entre " ", e entre as " " vc adiciona "QUANTIDADE MONSTRO", e para adicionar mais tipos de monstro se separa por virgulas, exemplo: {"40 Water Elemental", "5 Cyclops"} Time é uma função extra, é para caso ninguém participe do evento os monstros não fiquem pelo mapa, e é em minutos, exemplo: Time = 15
  5. DEV C++ Compilando TFS no Windows

    Gabriel485 reagiu a Natanael Beckman por uma resposta no tópico

    1 ponto
    DEV C++, aprenda a compila uma source TFS! Downloads(Baixe de acordo as configurações do seu windows): DEV C++ CONFIGURADO PARA 32BITS DEV C++ CONFIGURADO PARA 64BITS REV 3884 TFS 0.4 Certo, feitos os downloads, extrai DEV C++ no Disco C e REV 3884 em Documentos. ====================================== Abra o DEV C++: ====================================== ====================================== Abra a Source: ====================================== ====================================== Localize a pasta da Source e abra o arquivo TheForgottenServer.dev, Documentos> trunk.r3884> dev-cpp> TheForgottenServer.dev: ====================================== ============================================================= ====================================== Aguarde carregar todos os arquivos: ====================================== ====================================== Vamos adicionar o parâmetro -D__CONSOLE__ no teclado digita ALT + P, clique em parameters e adicione o parâmetro... Feito? clique em OK: ====================================== ====================================== Vamos compilar Source, no teclado digite CTRL+F9 e aguarde finalizar o processo: ====================================== ====================================== Se der tudo certo em Log vai estar como mostra a imagem abaixo: ====================================== ====================================== Verifique na pasta Documentos> trunk.r3884> dev-cpp você vai encontrar o arquivo TheForgottenServer.exe e pronto meu parabéns você compilou! ====================================== =========================================== Só isso galera tutorial rápido resumido e útil! Créditos Natanael Beckman! =========================================== Caso você adquira uma source com apenas os arquivos .cpp e .h e não sabe como compilar o projeto, abaixo vamos explicar: Na pasta onde está localizado os arquivos .cpp e .h crie uma pasta chamada dev-cpp, e dentro dela adicione uma imagem icone. Abra o DEV-C++, clique em File> New> Project: Logo em seguida selecione Empty Project, em name terá o nome Project1 altere utilize o nome quer quiser, após isso clique em OK e em seguida selecione a pasta dev-cpp que criamos: Agora selecione a opção Win32GUI caso use source OTX ou TFS selecione Win32Console ao lado << Browse selecione a imagem do icone que está na pasta Dev-Cpp. No mesmo menu na aba Parameters em C++ compiler adicione os seguintes parâmetros: -D__ENABLE_SERVER_DIAGNOSTIC__ -D__ROOT_PERMISSION__ -D__GROUND_CACHE__ -D__USE_SQLITE__ -D__USE_MYSQL__ -D__CONSOLE__ -D__WAR_SYSTEM__ E em Linker adicione as seguintes libs: -lboost_filesystem -lboost_thread -lboost_system -lboost_regex -lsqlite3 -lwsock32 -llua5.1 -lws2_32 -leay32 -lmysql -lxml2 -lgmp -lz -s No mesmo Menu na aba Build Option escreva na segunda coluna horizontal escreva Obj e dê OK. Na lateral terá o nome do seu projeto o meu no caso é The Forgotten Server, clique com o botão direito do mouse em cima do nome e clique na opção Add Project: Selecione na pasta da sua source todos os arquivos .cpp e .h após isso salva o projeto e já pode compilar CTRL+F9: OpenSSL 0.9.8 1º baixe http://devpaks.org/details.php?devpak=73 2° abra Dev-Cpp > Tools > Packager Manager > Install > Seleciona o arquivo baixado e instala, fecha abre e testa! Clica aqui \/
  6. Trade OFF - Shop Offline

    Trunksontibia reagiu a Natanael Beckman por uma resposta no tópico

    1 ponto
    Esse sistema disponibiliza uma negociação offline, onde você oferta um item e esse item é divulgado no site do server e qualquer player pode comprar o item utilizando um comando especificado. Crie uma arquivo .lua dentro da pasta data/talkactions/scripts com o nome auctionsystem.lua, dentro do mesmo adicione o code: local config = { levelRequiredToAdd = 20, maxOffersPerPlayer = 5, SendOffersOnlyInPZ = true, blocked_items = {2165, 2152, 2148, 2160, 2166, 2167, 2168, 2169, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2343, 2433, 2640, 6132, 6300, 6301, 9932, 9933} } function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.") return true end local t = string.explode(param, ",") if(t[1] == "add") then if((not t[2]) or (not t[3]) or (not t[4])) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.") return true end if(not tonumber(t[3]) or (not tonumber(t[4]))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't set valid price or items count.") return true end if(string.len(t[3]) > 7 or (string.len(t[4]) > 3)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This price or item count is too high.") return true end local item = getItemIdByName(t[2]) if(not item) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item wich such name does not exists.") return true end if(getPlayerLevel(cid) < config.levelRequiredToAdd) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have required (" .. config.levelRequiredToAdd .. ") level.") return true end if(isInArray(config.blocked_items, item)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This item is blocked.") return true end if(getPlayerItemCount(cid, item) < (tonumber(t[4]))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you don't have this item(s).") return true end local check = db.getResult("SELECT `id` FROM `auction_system` WHERE `player` = " .. getPlayerGUID(cid) .. ";") if(check:getID() == -1) then elseif(check:getRows(true) >= config.maxOffersPerPlayer) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry you can't add more offers (max. " .. config.maxOffersPerPlayer .. ")") return true end if(config.SendOffersOnlyInPZ) then if(not getTilePzInfo(getPlayerPosition(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you add offert to database.") return true end end if(tonumber(t[4]) < 1 or (tonumber(t[3]) < 1)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have to type a number higher than 0.") return true end local itemcount, costgp = math.floor(t[4]), math.floor(t[3]) doPlayerRemoveItem(cid, item, itemcount) db.executeQuery("INSERT INTO `auction_system` (`player`, `item_name`, `item_id`, `count`, `cost`, `date`) VALUES (" .. getPlayerGUID(cid) .. ", \"" .. t[2] .. "\", " .. getItemIdByName(t[2]) .. ", " .. itemcount .. ", " .. costgp ..", " .. os.time() .. ")") doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You successfully add " .. itemcount .." " .. t[2] .." for " .. costgp .. " gps to offerts database.") end if(t[1] == "buy") then if(not tonumber(t[2])) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") return true end local buy = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";") if(buy:getID() ~= -1) then if(getPlayerMoney(cid) < buy:getDataInt("cost")) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have enoguh GP.") buy:free() return true end if(getPlayerName(cid) == getPlayerNameByGUID(buy:getDataInt("player"))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you can't buy your own items.") buy:free() return true end if(getPlayerFreeCap(cid) < getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")))then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You try to buy a " .. buy:getDataString("item_name") .. ". It weight " .. getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")) .. " cap oz. and you have only " .. getPlayerFreeCap(cid) .. " oz. free capacity. Put some items to depot and try again.") buy:free() return true end if(isItemStackable((buy:getDataString("item_id")))) then doPlayerAddItem(cid, buy:getDataString("item_id"), buy:getDataInt("count")) else for i = 1, buy:getDataInt("count") do doPlayerAddItem(cid, buy:getDataString("item_id"), 1) end end doPlayerRemoveMoney(cid, buy:getDataInt("cost")) db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";") doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You bought " .. buy:getDataInt("count") .. " ".. buy:getDataString("item_name") .. " for " .. buy:getDataInt("cost") .. " gps!") db.executeQuery("UPDATE `players` SET `auction_balance` = `auction_balance` + " .. buy:getDataInt("cost") .. " WHERE `id` = " .. buy:getDataInt("player") .. ";") buy:free() else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") end end if(t[1] == "remove") then if((not tonumber(t[2]))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") return true end if(config.SendOffersOnlyInPZ) then if(not getTilePzInfo(getPlayerPosition(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you remove offerts from database.") return true end end local delete = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";") if(delete:getID() ~= -1) then if(getPlayerGUID(cid) == delete:getDataInt("player")) then db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";") if(isItemStackable(delete:getDataString("item_id"))) then doPlayerAddItem(cid, delete:getDataString("item_id"), delete:getDataInt("count")) else for i = 1, delete:getDataInt("count") do doPlayerAddItem(cid, delete:getDataString("item_id"), 1) end end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your offert has been deleted from offerts database.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This is not your offert!") end delete:free() else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") end end if(t[1] == "withdraw") then local balance = db.getResult("SELECT `auction_balance` FROM `players` WHERE `id` = " .. getPlayerGUID(cid) .. ";") if(balance:getDataInt("auction_balance") < 1) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have money on your auction balance.") balance:free() return true end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You got " .. balance:getDataInt("auction_balance") .. " gps from auction system!") doPlayerAddMoney(cid, balance:getDataInt("auction_balance")) db.executeQuery("UPDATE `players` SET `auction_balance` = '0' WHERE `id` = " .. getPlayerGUID(cid) .. ";") balance:free() end return true end Em seguida em talkactions.xml adicione a tag: <talkaction words="!offer" event="script" value="auctionsystem.lua"/> No banco de dados execute as querys: CREATE TABLE `auction_system` ( `id` int(11) NOT NULL auto_increment, `player` int(11), `item_id` int(11), `item_name` varchar(255), `count` int(11), `cost` int(11), `date` int(11), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; ALTER TABLE `players` ADD `auction_balance` INT( 11 ) NOT NULL DEFAULT '0'; Na pasta do seu site crie um arquivo chamado tradeoff.php, em seguida adicione o code: <?PHP $auctions = $SQL->query('SELECT `auction_system`.`player`, `auction_system`.`id`, `auction_system`.`item_name`, `auction_system`.`item_id`, `auction_system`.`count`, `auction_system`.`cost`, `auction_system`.`date`, `players`.`name` FROM `auction_system`, `players` WHERE `players`.`id` = `auction_system`.`player` ORDER BY `auction_system`.`id` DESC')->fetchAll(); $players = 0; $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b>Instruction<b></TD></TR><TR BGCOLOR='.$config['site']['darkborder'].'><TD><center><h2>Commands</h2><b>!offer add, itemName, itemPrice, itemCount</b><br /><small>example: !offer add, plate armor, 500, 1</small><br /><br /><B>!offer buy, AuctionID</b><br /><small>example: !offer buy, 1943</small><br /><br /><b>!offer remove, AuctionID</b><br /><small>example: !offer remove, 1943</small><br /><br /><b>!offer withdraw</b><br /><small>Use this command to get money for sold items.</small></center></TR></TD></TABLE><br />'; if(empty($auctions)) { $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b>Auctions</b></td></TR><TR BGCOLOR='.$config['site']['darkborder'].'><TD>Currently is no one active Auction.</TD></TR></TABLE>'; $main_content .= '<br /><p align="right"><small>System created by <a href="http://otland.net/members/vDk/">vDk</a>.</small></p>'; } else { foreach($auctions as $auction) { $players++; if(is_int($players / 2)) $bgcolor = $config['site']['lightborder']; else $bgcolor = $config['site']['darkborder']; $cost = round($auction['cost']/1000, 2); $content .= '<TR BGCOLOR='.$bgcolor.'><TD><center>'.$auction['id'].'</center></TD><TD><center><img src="/item_images/'.$auction['item_id'].'.gif"/></center></TD><TD><center>'.$auction['item_name'].'</center></TD><TD><center><a href="?subtopic=characters&name='.urlencode($auction['name']).'">'.$auction['name'].'</a></center></TD><TD><center>'.$auction['count'].'</center></TD><TD><center>'.$cost.'k<br /><small>'.$auction['cost'].'gp</small></center></TD><TD><center>!offer buy, '.$auction['id'].'</center></TR>'; } $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b><center>ID</center></b></TD><TD class="white"><b><center>#</center></b></TD><TD class="white"><b><center>Item Name</center></b></TD><TD class="white"><b><center>Player</center></b></TD><TD class="white"><b><center>Count</center></b></TD><TD class="white"><b><center>Cost</center></b></td><TD class="white"><b><center>Buy</center></b></td></TR>'.$content.'</TABLE>'; $main_content .= '<br /><p align="right"><small>System created by <a href="http://otland.net/members/vdk.1553/">vDk</a>.</small></p>'; } ?> Em layouts.php adcione o code: <a href="?subtopic=tradeoff"> <div id="submenu_tradeoff" 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_tradeoff" class="ActiveSubmenuItemIcon" style="background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);"></div> <div id="ActiveSubmenuItemLabel_tradeoff" class="SubmenuitemLabel">Trade Off</div> <div class="RightChain" style="background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);"></div> </div> </a> Pra finalizar em index.php adicione esse code: case "tradeoff"; $topic = "Trade Off"; $subtopic = "tradeoff"; include("tradeoff.php"); break; - E pronto galera clica em GOSTEI e comenta no tópico.
  7. PGalaxy Atx

    DarkRed reagiu a liel157 por uma resposta no tópico

    1 ponto
    PGalaxy Atx Olha Galera Estou Aqui de Novo Para Posto Mais Um Serve De Poketibia Espero Que gostei Desse Serve Esse Serve E O Pokemon Titanium • Menu: ├ Informações; ├ Ediçoes; ├ Erros; ├ Prints; ├ Download; └ Creditos. Informações Básicas: •Senha do god: god/god. •Adicionado pokemons da 6ª Geração (nao esta completa) •Server com System de level !. •Pokemons das gerações: 1 - 2 - 3 - 4 shinys •Client com espaço ainda •novas paredes, pisos, e itens •Shinys Espalhado pelo mapa. •Adicionada Varias quest •Duel System. •Moves system (m1 a m12). •Maximo 6 pokemons na bag. •Order 100%. •Sprites Reformuladas Erros do Servidor Nenhum que eu saiba Créditos Aline PGalaxy Team Gabrieltxu Slicer E Eu Por Editar Umas Coisas Print Link Do Serve>> http://www.mediafire.com/download/ky7672l9eyv1hpe/PGalaxy+Server.rar Link Do Client>> http://www.mediafire.com/download/1sd46xdiyd9clkl/PGalaxy+Atx.rar
  8. Addon System FUNCIONAL 2015/2016

    radhanama reagiu a samlecter por uma resposta no tópico

    1 ponto
    Primeiramente, informo que não fui eu quem criou o sistema e nem a explicação, créditos no final. O que eu fiz então? R: Adaptei algumas coisas, exemplo: com o original a Cd Bar não aparecia nos pokemons com addon, adaptei para que apareçam e trouxe pro TK pois achei em outro lugar! OBS: Sei que já existe alguns posts sobre o assunto aki, mas quando procurei pra por no meu ot, todos eram incompletos apenas com o script pra por no actions e a tag no actions.xml OBS²: A única coisa que não funciona nesse sistema é que caso o pokemon tenha fly/surf/ride, não aparece o addon deles enquanto estiver no fly/surf/ride, não sei como por para aparecer, então se alguém souber, ficaria grato se ensinasse ( possuo a sprite do pokemon com addon usando fly/surf/ride, só não sei como por ) A Alteração feita para que a Cd Bar apareça foi feita no goback.lua e some functions.lua , já estará o correto na explicação abaixo! Vamos Lá ! Em Data/actions e Actions.xml adiciona isto: <action itemid="IdAddon;IdAddon" event="script" value="Addon.lua"/> Em IdAddon Coloca os ids dos items dos addons! ai para adicionar mais ids é só colocar o ";" Ou seja aquele negocio verde, e depois colocar o ID Ficando:IdAddon;IdAddon;IdAddon e por ai vai Ai Em Data/actions/scripts cria um arquivo lua Chamado "Addon" e Dentro Dele Adiciona Isto: function onUse(cid, item, fromPosition, itemEx, toPosition) local addons = { [12593] = {pokemon= "Electabuzz" , looktype = 1482}, --xxxx = id do item do addon --- "Scyther" = nome do pokemon --- looktype = 1 é o looktype do pokemon com addon [12925] = {pokemon= "Alakazam" , looktype = 1471}, --xxxx = id do item do addon --- "Scyther" = nome do pokemon --- looktype = 1 é o looktype do pokemon com addon } if #getCreatureSummons(cid) > 0 then doPlayerSendCancel(cid, "Please back your pokemon.") return false end local numero = addons[item.itemid].looktype local pb = getPlayerSlotItem(cid, 8).uid local pk = addons[item.itemid].pokemon if getItemAttribute(pb,"poke") ~= pk then doPlayerSendCancel(cid, "Sorry, you can't use this addon on this poke.") return false end if getItemAttribute(pb,"addon") < 1 then doRemoveItem(item.uid, 1) doPlayerSendTextMessage(cid, 27, "Congratulations! Now your pokemon will use the addon.") doSetItemAttribute(pb,"addon",numero) return true end return true end Para adicionar um Novo Addon é só Adicionar esta tag: [ItemID] = {pokemon= "NomeDoPoke" , looktype = IdDaOutfit}, EM ItemID, troca pelo id do addon em pokemon troca NomeDoPoke, pelo Nome Do Pokémon que vai ser adicionado o Addon Em looktype, troca IdDaOutfit, pelo looktype do pokémon com addon! Em Goback.lua Procure Por: (fica lá no final) else doPlayerSendCancel(cid, "This pokemon is fainted.") end E Adiciona Em cima do else Isto: local pk = getCreatureSummons(cid)[1] local pb = getPlayerSlotItem(cid, 8).uid local look = getItemAttribute(pb,"addon") if not look then doSetItemAttribute(pb,"addon",0) end if look > 0 then doSetCreatureOutfit(pk, {lookType = look}, -1) end Em Catch system.lua Procura Por: doItemSetAttribute(item, "description", description) Em baixo adicione isto: doItemSetAttribute(item, "addon", 0) Em Some Functions.lua Procure Por: unLock(item.uid) Da Enter Duas Vezes e Adiciona isto: local pk = getCreatureSummons(cid)[1] local pb = getPlayerSlotItem(cid, 8).uid local look = getItemAttribute(pb,"addon") if not look then doSetItemAttribute(pb,"addon",0) end if look > 0 then doSetCreatureOutfit(pk, {lookType = look}, -1) end Pronto! Sistema de Addon Funcionando Perfeitamente Caso Coloque Tudo Certinho! Caso Queira uma Addon Box... Façam isto: Em Actions.xml Adiciona Isto: <action itemid="12595" event="script" value="addonbox.lua"/> E Em Data/Actions/Scripts Cria um Arquivo Lua Chamado "addonbox" e Adiciona Isto Dentro Dele: function onUse(cid, item, frompos, item2, topos, pos) local addons = {12593,12889} local randomChance = math.random(1, 49) if item2.itemid == 12595 then doSendMagicEffect(getCreaturePosition(cid), 28) doRemoveItem(item2.uid, 1) doPlayerAddItem(cid, addons[randomChance], 1) doPlayerSendTextMessage(cid, 27, "Você ganhou um Addon!") return true end end Pronto Addon Box Adicionada! Créditos Pokémon X Rain Pelo Sistema de Addon Drazyn12391 E Eu EDITED Encontrei uma falha, quando evolui o pokemon com Addon, após voltar para a ball e mandar denovo, ele fica com a outfit antes de evoluir e com addon. Exemplo: Evolui o Electabuzz COM Addon, ele virou electivire, voltei pra ball e mandei denovo, ele estava com o Outfit(aparência) do Electabuzz com Addon. Ou seja, melhor só por o addon em pokemons que não evoluem, caso alguem saiba resolver pfv comenta aki, caso eu descubra como resolver, edito.
  9. COLOSSUS SERVER 10.77 Bom Galera do TK, ai vai a minha primeira contribuição para o site. Espero não ter errado ai na postagem e conseguir passar todas informações necessárias para o bom entendimento do Leitor. Sem mais delongas, apresento-lhes o Colossus server. CIDADES: Colossus* Edron Ankrahmun Gnombase Mineland* Yalahar Svargrond Roshamuul Gray Beach Rathleton Alpha Base* *Cidades Novas do servidor. - Warzone 1, 2, 3; - Bank System; - Gray Beach City completa 100% (incluindo Subsolo); - Monstros 100%; - Trainer Offline 100%; - Trainer Online 100%; - Todas montarias; - Taming system funcionando 100%; - Database completa; - Wrath of Emperor Quest; - War System 100%; - Market System 100%; - Roshamull Completa100% (incluindo subsolo); - Oramond Full; - POI; - Children of a Revolution Quest; - The New Frontier Quest; - Colossus quest; - Varias quests Items Espalhadas pelo mapa; - Novos Montros. - Todas as Magias Balanceadas para um melhor desempenho. (Foi mudado todos os cálculos das magias). Essa mudança foi feita visando obter um maior empenho do jogador para crescer no jogo, pois as formulas antigas cresciam linearmente. Adotei formulas que crescem exponencialmente. Resultado, quem se dedica ao jogo, treina, upa e busca os melhores itens, sera realmente o mais forte. - Itens vips criados. - Npcs de Addon postos em uma ilha, todas as quest e execuções de addons são idênticas aos métodos do global, e todos os caminhos são direcionados no mapa. - Todas as questes requerem missão. A inquisition, por exemplo, segue o mesmo raciocínio da quest global. - Muitas Hunts novas, todo mapa foi readequado, com isso, talvez as hunts que você encontre no global, não serão as mesma deste servidor. - A Knightwatch Tower, da dream chalange quest, foi reformulada, seus teleportes levam a Incríveis desafios. - Praticamente todos os items são acessíveis. - Wands e rods readequados para uma maior exploração destes items. - Todos os monstros do Global. Os novos monstros só poderão ser acessados com a conclusão da Colossus quest, que é um desafio e tanto. - Senha do god = god/god Dediquei um pouco do meu tempo para estar criando este servidor. Baseei-me no servidor aqui postado pelo Mitsuig Porem, o mapa foi totalmente editado por mim. Cidade Colossus e Alpha Base foram criadas por mim. As demais cidades foram readequadas para suprir minhas expectativas de jogabilidade do servidor. Todas as quests Globais (Exemplo: POI, Inqui, Children of revolution, The new Frontier, etc.) foram reformuladas para proporcionar mais jogabilidade e iteração no jogo. Todo mapa foi Sinalizado para guiar os jogadores à seus devidos destinos. ATENÇÃO: O mapa Não é global, Não é Global Compacto também, Não é Baiak. Tentei construir um servidor que conduza o jogador para o maior aproveitamento. O mapa é praticamente 100% utilizável, todas as hunts e quests disponibilizam items e recompensas interessantes. Creio que criei um bom servidor pra galera por online ai. Espero que gostem!! Bom, eu ja disponibilizei com o TFS compilado em Windows. Recomendo que Compilem vocês mesmo. Esse servidor foi feito usando de modelo o do link acima. Contudo, o mais importante mesmo aquié o SERVIDOR e a DATABASE. O resto podem fazer o download de lá que vai funcionar certinho. Downloads: SERVIDOR Database WEBSITE TFS-SDK-2.0 MAP EDITOR Imagens: Yalahar Colossus Quest Alpha Base Mineland Mapa Detalhado Mapa Detalhado - Colossus City Colossus Créditos: Os mesmos do link acima citado. OTLAND - TFS TEAM; Lucas Barreto.
  10. Descongelando Ursagrodon (Montaria)

    Boosie reagiu a luanluciano93 por uma resposta no tópico

    1 ponto
    Bom pessoal, vi alguns tópicos pedindo esse script, e como precisei dele agora, resolvi faze-lo. Em actions.xml: <action itemid="22726" script="descongelando_ursagrodon.lua" /> Agora em actions/scripts/ crie um arquivo lua com o nome de: descongelando_ursagrodon.lua local itemId = {22729, 22730, 22731, 22732} local porcentagem = 50 local function revertIce(toPosition) local tile = toPosition:getTile() if tile then local sprite = tile:getItemById(itemId[4]) if sprite then sprite:transform(itemId[1]) end end end function onUse(player, item, fromPosition, target, toPosition, isHotkey) if target.itemid == itemId[1] or target.itemid == itemId[2] or target.itemid == itemId[3] then if player:hasMount(38) then return player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You already have the obedience of ursagrodon.') end local rand = math.random(1, 100) if rand <= porcentagem then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The ice cracked and the frozen creature with it - be more careful next time!') item:remove(1) target:transform(itemId[4]) addEvent(revertIce, 600000, toPosition) else if target.itemid == itemId[1] then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You managed to melt about half of the ice blook. Quickly now, it\'s ice cold here and the ice block could freeze over again.') target:transform(itemId[2]) elseif target.itemid == itemId[2] then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You managed to melt almost the whole block, only the feet of the creature are still stuck in the ice. Finish the job!') target:transform(itemId[3]) elseif target.itemid == itemId[3] then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The freed ursagrodon look at you with glowing, obedient eyes.') target:transform(itemId[4]) player:addMount(38) item:remove(1) addEvent(revertIce, 600 * 1000, toPosition) end end end return true end Lembrando que precisa editar as fases do congelamento pelo id: local itemId = {22729, 22730, 22731, 22732} local porcentagem = 50 Espero ter ajudado.
  11. [Exclusivo] - (PDA) Profession System

    Orionx reagiu a GOD Vitor por uma resposta no tópico

    1 ponto
    Eae galera, faz tempo que não contribuo com o fórum, eu estava com um sistema de profissão aqui então decidi disponibilizá-lo. Vídeo - Apresentação básica do sistema. Informações Básicas. Download: Clique aqui Scan: Clique aqui Créditos
  12. Script Timer

    reisbro reagiu a thelifeofpbion por uma resposta no tópico

    1 ponto
    usa addEvent mano..
  13. [Link Quebrado]Pequena Hunt/Quest

    luisrsousa reagiu a Putotine Alfredo por uma resposta no tópico

    1 ponto
    Olá, venho aqui trazer minha primeira "Hunt/Quest", gostaria de algumas dicas, e criticas construtivas por favor xD. Sei que é bem simples, mas com o tempo eu irei melhorando. Sim? Scan: SCAN. DL: Download. Aqui vão fotos do mesmo.
  14. (Resolvido)Healing

    Tchukixx reagiu a KotZletY por uma resposta no tópico

    1 ponto
    @Tchukixx desculpe, erro de digitação. Kkkkk, dei um ctrl+c e v numa parte que já tinha feito e não inverti o sinal. Hahaha!
  15. [PEDIDO] PET System Diferente

    Sekk reagiu a PsyMcKenzie por uma resposta no tópico

    1 ponto
    O que to testando também, acho que até amanhã já terminei, mas não tem nada demais. Apenas o pet e o npc para revivê-lo. Aí as alterações são com você.
  16. Script Teleporte Me ajudem

    yasmincxz reagiu a thelifeofpbion por uma resposta no tópico

    1 ponto
    essa é a posição correta de twint? {x = 60544, y = 366, z = 7} })
  17. 1 ponto
    BOm galera meu problema é o seguinte, eu baixei o gesior, database e o global do Mitsuig 10.95 ate ai tudo bem. Rodei o vertrigo, criei o banco de dados e importei a database que tinha baixado. Configurei e o site rodou tranquilo só que quando eu crio a conta no site não consigo logar no mesmo e quando olho na database do phpmyadmin não tem nenhuma conta registrada. Alguem poderia me dizer aonde eu ajeito isso e caso tenha um tutorial mais complexo ensinando passo a passo.
Líderes está configurado para São Paulo/GMT-03:00

Informação Importante

Confirmação de Termo