Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 09/10/11 em todas áreas
-
Invocação de Player Sabe quando você e seu amigo está caçando em um lugar muito longe, e você morre, e o espertinho de seu amigo fica vivo, não dá aquela raiva, de ter que voltar todo caminho, e ainda sozinho ? Pensando nisso, foi que eu tive uma ideia de uma Pedra, aonde seu amigo pode usar ela no seu corpo se você ainda estiver tiver online, e aceitar seu convite, você é teleportado para cima do corpo. Observe a Imagem: Bom, agora que já está explicado a ideia vamos ao script: Crie um arquivo com o nome de invoc.lua na pasta actions/scripts e cole o seguinte código: local configs = { minLvL = 0, -- level minimo necessário[ 0 para não precisar ] mana = 0, -- mana necessária [ 0 para não precisar ] magicLvL = 0, -- magic level necessário [ 0 para não precisar ] vocs = {0, 1, 2, 3, 4, 5, 6, 7, 8}, -- vocações que podem usar premium = false, -- precisa de premium [ true ou false ] removeCorpse = true, -- remover o corpo depois de invocar [ true or false ] removeStone = true, -- remover a pedra após usar [ true or false ] invite = true -- o dono do corpo precisa aceitar [ true or false ] } function SendMessageInvoc(cid, pid) if getPlayerStorageValue(pid, 22254) ~= 1 then return true end if not isCreature(cid) or not isCreature(pid) then return true end doPlayerSendTextMessage(pid, 27, "O Player "..getCreatureName(cid).." quer te invocar digite /invoc aceitar ou /invoc rejeitar.") addEvent(SendMessageInvoc, 10000, cid, pid) end function onUse(cid, item, frompos, item2, topos) if getPlayerLevel(cid) < configs.minLvL then return doPlayerSendCancel(cid, "Você precisa de level "..configs.minLvL.." para invocar alguem.") elseif getPlayerMana(cid) < configs.mana then return doPlayerSendCancel(cid, "Você precisa de "..configs.mana.." de mana para invocar alguem.") elseif getPlayerMagLevel(cid) < configs.magicLvL then return doPlayerSendCancel(cid, "Você precisa de magic level "..configs.magicLvL.." para invocar alguem.") elseif not isInArray(configs.vocs, getPlayerVocation(cid)) then return doPlayerSendCancel(cid, "Sua Vocação não é permitido invocar alguem.") elseif not isPremium(cid) and configs.premium then return doPlayerSendCancel(cid, "Você precisa de premium account para invocar alguem.") end if isCorpse(item2.uid) then if not getItemAttribute(item2.uid, "description") then return doPlayerSendCancel(cid, "Este não é corpo de um player.") end local name = (getItemAttribute(item2.uid, "description")):match("You recognize (.-)%.") local pid = getPlayerByName(name) if pid then if not configs.invite then doTeleportThing(pid, topos) doSendMagicEffect(topos, 10) doSendAnimatedText(topos, "Invoked", math.random(1, 250)) doPlayerSendTextMessage(cid, 27, "O Player "..name.." foi invocado com sucesso.") doPlayerSendTextMessage(pid, 27, "O Player "..getCreatureName(cid).." te invocou.") if configs.removeCorpse then doRemoveItem(item2.uid) end else if getPlayerStorageValue(pid, 22254) ~= 1 then setPlayerStorageValue(pid, 22254, 1) setPlayerStorageValue(pid, 22255, topos.x) setPlayerStorageValue(pid, 22256, topos.y) setPlayerStorageValue(pid, 22257, topos.z) if configs.removeCorpse then setPlayerStorageValue(pid, 22258, "yes") end setPlayerStorageValue(pid, 22259, cid) SendMessageInvoc(cid, pid) doPlayerSendTextMessage(cid, 27, "Você envio convite para "..name.." para ser invocado.") else return doPlayerSendCancel(cid, "Este corpo já foi invocado por alguem.") end end if configs.removeStone then doRemoveItem(item.uid, 1) end return doCreatureAddMana(cid, - configs.mana) else return doPlayerSendTextMessage(cid, 27, "O Player não esta online.") end else return doPlayerSendCancel(cid, "Isto não é um corpo.") end end Depois na pasta actions procure pelo arquivo actions.xml e adicione a tag: <action itemid="8303" event="script" value="invoc.lua"/> Agora entre na pasta talkactions/scripts e crie outro arquivo com o nome de invoc.lua novamente e cole o código: function onSay(cid, words, param) if getPlayerStorageValue(cid, 22254) == 1 then if param == "aceitar" then if not isPlayer(getPlayerStorageValue(cid, 22259)) then setPlayerStorageValue(cid, 22254, 0) doPlayerSendTextMessage(cid, 27, "O Player que te invocou não está mais online por isso foi cancelado o pedido.") end local pos = {x=getPlayerStorageValue(cid, 22255), y=getPlayerStorageValue(cid, 22256), z=getPlayerStorageValue(cid, 22257)} doTeleportThing(cid, pos) doSendMagicEffect(pos, 10) doSendAnimatedText(pos, "Invoked", math.random(1, 250)) if getPlayerStorageValue(cid, 22258) == "yes" then for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if isCorpse(tile.uid) then if (getItemAttribute(tile.uid, "description")):match("You recognize (.-)%.") == getCreatureName(cid) then doRemoveItem(tile.uid) break end end end end doPlayerSendTextMessage(cid, 27, "O Player "..getCreatureName(getPlayerStorageValue(cid, 22259)).." te invocou.") doPlayerSendTextMessage(getPlayerStorageValue(cid, 22259), 27, getCreatureName(cid).." foi invocado com sucesso.") setPlayerStorageValue(cid, 22254, 0) elseif param == "rejeitar" then if not isPlayer(getPlayerStorageValue(cid, 22259)) then setPlayerStorageValue(cid, 22254, 0) doPlayerSendTextMessage(cid, 27, "O Player que te invocou não está mais online por isso foi cancelado o pedido.") end doPlayerSendTextMessage(cid, 27, "Você rejeitou o pedido de "..getCreatureName(getPlayerStorageValue(cid, 22259))..".") doPlayerSendTextMessage(getPlayerStorageValue(cid, 22259), 27, getCreatureName(cid).." rejeitou seu pedido de invocação.") setPlayerStorageValue(cid, 22254, 0) end else doPlayerSendTextMessage(cid, 27, "Você não tem convites.") end return true end Depois na pasta talkactions procure o arquivo talkactions.xml e adicione a seguinte tag: <talkaction words="/invoc" hide="yes" event="script" value="invoc.lua"/> Segue as configurações no script, se vai remover o corpo, se vai remover a pedra, o level, magic level, premium, ou até mesmo se o player que vai ser invocado precisar aceitar algum convite, tudo pode ser configurado no script nesta parte: local configs = { minLvL = 0, -- level minimo necessário[ 0 para não precisar ] mana = 0, -- mana necessária [ 0 para não precisar ] magicLvL = 0, -- magic level necessário [ 0 para não precisar ] vocs = {0, 1, 2, 3, 4, 5, 6, 7, 8}, -- vocações que podem usar premium = false, -- precisa de premium [ true ou false ] removeCorpse = true, -- remover o corpo depois de invocar [ true or false ] removeStone = true, -- remover a pedra após usar [ true or false ] invite = true -- o dono do corpo precisa aceitar [ true or false ] } Caso estiver usando o sistema de convite os comandos são: /invoc aceitar /invoc rejeitar Bom eu deixei configurado com aquela pedra rosa como na foto, fica ao seu critério deixar ela ou escolher outra só mudar na tag do xml: action itemid="8303" Obrigado a todos, e se gostaram comente Tchau ;*5 pontos
-
[Oficial] Refugia (8.60) 26/08/2012 0.0.8
felipecaldas199 reagiu a Subwat por um tópico no fórum
Bom pessoal,venho trazer-lhes hoje um trabalho,de meses de mim e de daniel devotti,fizemos um servidor Igual o refugia. e agora venho compartilhar com vocês. SENHA DO GOD account:god senha:GOD Spells Knights :ezzori,ezzori gran. Magos :exevo gran frigo,exevo gran mas mort,exevo gran mas ghost,aurora. Paladinos :exevo gran mas mort,aurora. Sistemas Pet system com mais de 50 pets,Incluindo Pets Donates que você pode vender em seu site! Sistemas de arena duels Para teams ou duplas no segundo andar no templo! Sistema de VIP Coins e (VIP) no nome Igual do Refugia Original! TASK SYSTEM! Sistema De Reborn Monster! adicionado 16/09/11 Ao matar um monstro ele tem 50% de chance de renascer igual no refugia! Items Mais de 100 items editados únicos do servidor! items free bons,quests com items editados e etc. Quests Anihilator demon helmet Aqua quest vermilion quest Pits of inferno Lord vampire quest refugia legs multi Quest dentre várias outras. Screen Shots Trainer's Templo Free Teleports Vip Teleports Free Teleportes para cidades Segundo andar do templo Montanha City Vip City Free NPC's DOWNLOAD: http://adf.ly/IGQ9S http://adf.ly/IGQDJ (SCAN DESATUALIZADO) Créditos Subwat (Gean Riot) Refugia.com.br daniel freire devotti curtiu REP+ Este tópico recebeu destaque em nosso portal!1 ponto -
[Global] Original Sem Bugs!
marquinhossm reagiu a lachost12 por um tópico no fórum
Cidades! Quests! Raids! Informações do Server: War System (Escudos) Distro DEV_0.4 Spells 8.6 100% Npc's Igual RL Sem bugs (dinheiro, entre outros). Server pronto para por Online. Outros: Download: Créditos:1 ponto -
[8.60] •Riotworld• Rpg Teleports! Sem Bugs!
mavinaousamais reagiu a Subwat por um tópico no fórum
Informações:Bom Pessoal Venho-lhes Trazer Um Servidor Inovador,Com Um Mapa Incrivel e Personalizado,Areas Imensas De Hunt, Spells Globais 8.70 Com Pequenas Edições Para melhor Balanceamento,Runas Personalizadas,Itens GLOBAIS SEM EDIÇÕES!,Quests Incriveis Com Monstros globais,Sistema Vip Perfect E Próprio,Invasões Automaticas,Sistema De Trainers Dinamico E Perfeito,Areas Vips Grandes e Unicas,então está ae Riot Server. SENHA GOD:GOD/GOD Principais quests: -Annihilator -Inquisition Quest -Pits of inferno (adicionada dia 30/08/2010) -Solar axe quest -HOTA -MPA quest - Special Set (adicionada dia 30/08/2010) -Special Shield (adicionada dia 30/08/2010) -Soft Boots Quest -Orshabaal's Quest (adicionada 03/09/2010) -Olympian Quest (adicionada 27/09/2010) Cidades: Sphere (yourots) Titanic Desert Jungle Vile Loria Gloria Vip City Lava City (adicionada dia 01/10/2010) Satir(Adicionada 27/09/2010) Ice Island Adicionada dia 17/10/2010 Enigma (evolutions) Dorion (alissow) Atualizações: Download:Riot WORLD 8.60 v3.0 download RIOT MAP EDITOR : RIOT MAP EDITOR 8.60~8.62 Adicionado Teleport Room! Creditos: Luisfe23 James Hetfield, neon e Skip. Gean Riot (edição map,itens,spells,monstros,vocs and more.) Caboot (fire city) Mix Team (distro) SEGUE A BAIXO ALGUMAS IMAGENS:1 ponto -
Boas. Segundo o Dare Devil ele disse que so funciona ate 8.10. :warn:Apartir dai compila com erros!:warn: Eu vou tenta encontra o pic editor 8.54-8.57 (Não sei se existe) Se alguem tive me manda pelo pm plx!! Aconselho a fazer um backup da pasta do tibia. (Se der error você tem que instala denovo) Hoje vou mostrar como mudar o background do tibia. Programa Nessessário: Pic Editor: Download Via MediaFire. Download Via MegaUpload. Download Via RapidShare. Download Via 4Shared. Se houver mais algum sítio onde você quiser que eu faça upload me digam !! |--| |--| _|--|_ \Scan/ \---/ \--/ \-/ \/ --->Pic Editor Scan <--- Crie uma pasta no ambiente de trabalho. Pode fazer em outro sítio mais no Desktop fica sempre,mais facil de acessar. Baixe o [Tibia]Pic Editor e coloque eli na pasta que você criou. Abra-o e clique em Browse. Depois procure pelo seu tibia.pic. (Normalmente ele se situa em C:\Program Files (x86)\Tibia) Depende onde você instalou. Depois disso que eu falei clique em Extract. Irá apareçer vários ficheiros chamados, 0, 1, 2, 3, 4, 5, 6 e 7 (Nós só nos vamos concentrar no 0.bmp) Abra-o e edite para a imagem que você quiser. (Lembre-se que o máximo de píxeis é de 640x por 480x) Para isso clique em Redimensionar no seu Paint. Uma janelinha vai apareçer e clique em Píxeis. Meta isso lá. De seguida salve com o nome de 0.bmp Assim. Agora abra seu pic editor e clique em Compile. Por fim: Irá apareçer o tibia.pic na pasta que você criou no Desktop. Copie e cole na pasta do seu tibia. Espero ter ajudado alguém. Tutorial 100% feito por mim. Não sou muito bom em tutorials! Comentem!! Não sei se existe outro tutorial de fazer isso. Sou novo aqui. :biggrin: :excl: Ow n sei se isso é grave. :excl: Symantec 20091.2.0.41 2010.03.22 Suspicious.Insight [/font]1 ponto
-
Azeroth Server Updated 14/07/2011: v1.0 Outras Versões: v1.1 [8.60]: http://www.xtibia.co...oth-rpg-reborn/ v2.0 [9.60]: http://www.xtibia.com/forum/topic/205054-960-azeroth-rpg/ Versão: 8.70 Distro: Crystal Server Mapa Base: Yourots Edited e Mix Yourots Features: > 7 Cidades: Azeroth Avalon Zatur Liberty Bay Gloria Sand Trap Tiquanda > Montarias por quest(NPC Mount Master, cavernas ao norte de Azeroth). > NPCs de Travel/Boat diferentes para cada cidade. > Corrigidos Vários Bugs do mapa. > Templo Reformado > Retirados Vários Itens custom e suas quests do antigo Riot Server. > Adicionada Dragon Dungeon. > Adicionado Vulcão de Goroma. > Adicionada Quest Especial em Gloria (NPC Gloria Scientist). > Adicionada Ferumbras Tower. > Várias Hunts adicionadas. > Adicionada Formorgar Mines. > Sistema de Refinamento e Slot. > 6 Novas Mounts. > Principais Quests: Annihilator Pits of Inferno The Inquisition FireWalker Boots Demon Helmet Draken Hell Conquer > 23 Raids Automáticas e configuradas: > Sistema de Guerras pelo Castelo [Honor Castle, a oeste de Azeroth] Evento automático. Quando a guerra é anunciada as guilds podem batalhar pelo controle do castelo, dando use no monumento do último andar e permanecendo assim até a guerra acabar. O último jogador a ter o controle do castelo antes do tempo acabar será o vencedor, e sua guild se tornará dona do castelo. Todos os membros da Guild ganharão uma recompensa e poderão acessar o mapa do subsolo. Os membros de outras Guilds serão teleportados para o templo e não poderão acessar o castelo. O sistema envia mensagens a todos antes de o evento começar, quando começar, quando o dono do castelo muda, antes de se finalizar e ao finalizar, relatando o conquistador do castelo e a guild vencedora. Imagens: Raids Castle Upgrade & Slot System Não há teleports diretos para hunts ou quests. Não há items ou monstros editados(além dos trainers). Não há sistema VIP(premium account valorizada). Não há raids com monstros excessivamente fortes nas cidades iniciais. Acc God: 2/password Créditos:Unknow YourOts Edited, Mix Yourots Team, Crystal Server Team, Tryller, Mock, TFS Team e um pouquinho (bem pouquinho) pra mim xD. Source - IP Changer 8.70 - Utilitários(opcional) - Map Editor *Utilitários inclui: Lista com códigos de todos os looktypes, SQLite Studio 1.1.1, códigos das cores dos outfits e o OTRestarter. Download Azeroth Server V 1.0 - Completo [MEDIAFIRE] Comandos: !war para executar a guerra pelo castelo manualmente, !reset para interromper o funcionamento da war e !castle para limpar todos os dados, ou seja, o castelo volta a ser terra de ninguém. V 0.2 V 0.3 V 0.4 V 1.0 Último pedido meu: encham o saco dos adms pra colocarem o tópico do tryller como fixo. É o melhor distro 8.70 que nós temos aqui, talvez ele salve os ots 8.70 daqui pra frente Contato: vmspk@hotmail.com Edit - Coloquei os Scans Edit2 - Adicionado comando Edit3 - Atualização Edit4 - Atualização http://img208.images...claymorepsf.jpg1 ponto
-
Anti Bot
Gualdani reagiu a churupetinha por um tópico no fórum
Ola pessal são 02:23 agora to sem nada pra fazer entao resouvi precurar um Anti Bot pra meu ot, achei um ake no google e vim postar aki pra vs Testado em 8.6 Aki esta uma Ss aki esta o link que eu peguei http://action.forum7.biz/t21-tutorialyunie-anti-bot-system Va Na Pasta do seu ot depois data/creaturescripts/creaturescripts.xml adc essa tag aki <event type="login" name="AntiBotLogin" script="antibot.lua"/> <event type="logout" name="AntiBotLogout" script="antibot.lua"/> Salve e Feche. Agora Vc Vai Dnv Na Pasta data/creaturescripts/script vai copiar um arquivo lua e cola ali msm e vai renomea-lo para antibot, apos renomea-lo abra e apague tudo que estiver dentro e coloque isso dentro agora vc vai em data/talkaction/talkaction.xml e vai por essa tag aki <talkaction words="!antibot" script="antibot.lua"/> apos feito isso salve e feche agora vc vai dnv em data/talkaction/script e vai copiar um arquivo lua e colar la msm e renomea-lo para antibot,feito isso abra ele apague tudo que estiver dentro e bote isso feito isso salve e feche! e isso galera esse ae e o antibot a lembrando que la nao tinha creditos entao nao sei de quem e!Abraços.1 ponto -
Pagseguro Automatico
Eder009 reagiu a glauberpacheco por um tópico no fórum
Galera eu achei este post em outro forum ,acho que tem ele ripado aqui no xtibia. mas eu vou postar ele mesmo assim. Meu colega conseguiu fazer ele funcionar , mais o cara que posto no xtibia falo que vai tirar ele pq vai vender ele agora (obs: nem é de autoria dele) Dps que ele viu que eu ja tinha copiado o post ele flo que tava faltando arquivo , mais axo que nao ta nao , meu colega conseguiu fazer funfa de boa. tentem ai , pois eu vi ele em outros forum os cara vendendo por 120 pila aki ta de graça ^^ OBS: se algum adm quizer que eu tire so avisa! ________________________________________________________________ No Seu Htdocs va em Config/config.php e coloque isso no final: // Sistema automatico Pagseguro by tatu_hunter // Seu email cadastrado no pagseguro $config['pagseguro']['email'] = 'seu e-mail'; // Valor unitario do produto ou seja valor de cada ponto // Exemplo de valores // 100 = R$ 1,00 // 235 = R$ 2,35 // 4254 = R$ 42,54 $config['pagseguro']['produtoValor'] = '100'; // Token gerado no painel do pagseguro $config['pagseguro']['token'] = 'SEU TOKEN PAGSEGURO AQUI'; Como ja havia dito no outro topico,crie um arquivo chamado retPagseguro.php Dentro adicione isso: <?php include('config-and-functions.php'); define('TOKEN', $config['pagseguro']['token']); // Incluindo o arquivo da biblioteca include('retorno.php'); // Função que captura os dados do retorno function retorno_automatico ( $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade, $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens) { global $config; if(strtolower($StatusTransacao) == 'aprovado') { $account_logged = $ots->createObject('Account'); $account_logged->find($Referencia); if($account_logged->isLoaded()) { $pontos = $account_logged->getCustomField("premium_points"); $account_logged->setCustomField("premium_points", $pontos + $produtos[0]['ProdQuantidade']); $nome = $Referencia.'-'.date('d-m-Y',$_SERVER['REQUEST_TIME']).'.txt'; if(file_exists('logsPagseguro/'.$nome)) $nome = $Referencia.'-2-'.date('d-m-Y',$_SERVER['REQUEST_TIME']).'.txt'; $arquivo = fopen('logsPagseguro/'.$nome, "w+"); $dados = "Conta: ".$Referencia."\n"; $dados = "Email: ".$CliEmail."\n"; $dados .= "Total de Points: ".$produtos[0]['ProdQuantidade']."\n"; $dados .= "Hora da Transação: ". date('d-m-Y H:i:s', $_SERVER['REQUEST_TIME']).""; fwrite($arquivo, $dados); fclose($arquivo); } } } // A partir daqui, é só HTML: ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <h1>Pedido em processamento</h1> <p>Recebemos seu pedido e estamos aguardando pela confirmação do pagamento. Obrigado por comprar conosco.</p> </body> </html> Depois crie um arquivo chamado retorno.php e adicione o seguinte: <?php if (!defined('TOKEN')) define ('TOKEN', ''); /** * RetornoPagSeguro * * Classe de manipulação para o retorno do post do pagseguro * * @package PagSeguro */ class RetornoPagSeguro { /** * _preparaDados * * Prepara os dados vindos do post e converte-os para url, adicionando * o token do usuario quando necessario. * * @internal é usado pela {@see RetornoPAgSeguro::verifica} para gerar os, * dados que serão enviados pelo PagSeguro * * @access private * * @param array $post Array contendo os posts do pagseguro * @param bool $confirmacao Controlando a adicao do token no post * @return string */ function _preparaDados($post, $confirmacao=true) { if ('array' !== gettype($post)) $post=array(); if ($confirmacao) { $post['Comando'] = 'validar'; $post['Token'] = TOKEN; } $retorno=array(); foreach ($post as $key=>$value){ if('string'!==gettype($value)) $post[$key]=''; $value=urlencode(stripslashes($value)); $retorno[]="{$key}={$value}"; } return implode('&', $retorno); } /** * _tipoEnvio * * Checa qual será a conexao de acordo com a versao do PHP * preferencialmente em CURL ou via socket * * em CURL o retorno será: * <code> array ('curl','https://pagseguro.uol.com.br/Security/NPI/Default.aspx') </code> * já em socket o retorno será: * <code> array ('fsocket', '/Security/NPI/Default.aspx', $objeto-de-conexao) </code> * se não encontrar nenhum nem outro: * <code> array ('','') </code> * * @access private * @global string $_retPagSeguroErrNo Numero de erro do pagseguro * @global string $_retPagSeguroErrStr Texto descritivo do erro do pagseguro * @return array Array com as configurações * */ function _tipoEnvio() { //Prefira utilizar a função CURL do PHP //Leia mais sobre CURL em: http://us3.php.net/curl global $_retPagSeguroErrNo, $_retPagSeguroErrStr; if (function_exists('curl_exec')) return array('curl', 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx'); elseif ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://pagseguro.uol.com.br', 443, $_retPagSeguroErrNo, $_retPagSeguroErrStr, 30))) return array('fsocket', '/Security/NPI/Default.aspx', $fp); elseif ($fp = @fsockopen('pagseguro.uol.com.br', 80, $_retPagSeguroErrNo, $_retPagSeguroErrStr, 30)) return array('fsocket', '/Security/NPI/Default.aspx', $fp); return array ('', ''); } /** * not_null * * Extraido de OScommerce 2.2 com base no original do pagseguro, * Checa se o valor e nulo * * @access public * * @param mixed $value Variável a ser checada se é nula * @return bool */ function not_null($value) { if (is_array($value)) { if (sizeof($value) > 0) { return true; } else { return false; } } else { if (($value != '') && (strtolower($value) != 'null') && (strlen(trim($value)) > 0)) { return true; } else { return false; } } } /** * verifica * * Verifica o tipo de conexão aberta e envia os dados vindos * do post * * @access public * * @use RetornoPagSeguro::_tipoenvio() * @global string $_retPagSeguroErrNo Numero de erro do pagseguro * @global string $_retPagSeguroErrStr Texto descritivo do erro do pagseguro * @param array $post Array contendo os posts do pagseguro * @param bool $tipoEnvio (opcional) Verifica o tipo de envio do post * @return bool */ function verifica($post, $tipoEnvio=false) { global $_retPagSeguroErrNo, $_retPagSeguroErrStr; if ('array' !== gettype($tipoEnvio)) $tipoEnvio = RetornoPagSeguro::_tipoEnvio(); $spost=RetornoPagSeguro::_preparaDados($post); if (!in_array($tipoEnvio[0], array('curl', 'fsocket'))) return false; $confirma = false; if ($tipoEnvio[0] === 'curl') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $tipoEnvio[1]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $spost); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($ch); if (!RetornoPagSeguro::not_null($resp)) { curl_setopt($ch, CURLOPT_URL, $tipoEnvio[1]); $resp = curl_exec($ch); } curl_close($ch); $confirma = (strcmp ($resp, 'VERIFICADO') == 0); } elseif ($tipoEnvio[0] === 'fsocket') { if (!$tipoEnvio[2]) { die ("{$_retPagSeguroErrStr} ($_retPagSeguroErrNo)"); } else { $cabecalho = "POST {$tipoEnvio[1]} HTTP/1.0\r\n"; $cabecalho .= "Content-Type: application/x-www-form-urlencoded\r\n"; $cabecalho .= "Content-Length: " . strlen($spost) . "\r\n\r\n"; $resp = ''; fwrite ($tipoEnvio[2], "{$cabecalho}{$spost}"); while (!feof($tipoEnvio[2])) { $resp = fgets ($tipoEnvio[2], 1024); if (strcmp ($resp, 'VERIFICADO') == 0) { $confirma = (strcmp ($resp, 'VERIFICADO') == 0); $confirma=true; break; } } fclose ($tipoEnvio[2]); } } if ($confirma && function_exists('retorno_automatico')) { $itens = array ( 'VendedorEmail', 'TransacaoID', 'Referencia', 'TipoFrete', 'ValorFrete', 'Anotacao', 'DataTransacao', 'TipoPagamento', 'StatusTransacao', 'CliNome', 'CliEmail', 'CliEndereco', 'CliNumero', 'CliComplemento', 'CliBairro', 'CliCidade', 'CliEstado', 'CliCEP', 'CliTelefone', 'NumItens', ); foreach ($itens as $item) { if (!isset($post[$item])) $post[$item] = ''; if ($item=='ValorFrete') $post[$item] = str_replace(',', '.', $post[$item]); } $produtos = array (); for ($i=1;isset($post["ProdID_{$i}"]);$i++) { $produtos[] = array ( 'ProdID' => $post["ProdID_{$i}"], 'ProdDescricao' => $post["ProdDescricao_{$i}"], 'ProdValor' => (double) (str_replace(',', '.', $post["ProdValor_{$i}"])), 'ProdQuantidade' => $post["ProdQuantidade_{$i}"], 'ProdFrete' => (double) (str_replace(',', '.', $post["ProdFrete_{$i}"])), 'ProdExtras' => (double) (str_replace(',', '.', $post["ProdExtras_{$i}"])), ); } retorno_automatico ( $post['VendedorEmail'], $post['TransacaoID'], $post['Referencia'], $post['TipoFrete'], $post['ValorFrete'], $post['Anotacao'], $post['DataTransacao'], $post['TipoPagamento'], $post['StatusTransacao'], $post['CliNome'], $post['CliEmail'], $post['CliEndereco'], $post['CliNumero'], $post['CliComplemento'], $post['CliBairro'], $post['CliCidade'], $post['CliEstado'], $post['CliCEP'], $post['CliTelefone'], $produtos, $post['NumItens'] ); } return $confirma; } } if ($_POST) { RetornoPagSeguro::verifica($_POST); die(); } ?> No seu buypoints.php,basta colocar isso: <?php if(!$logged) if($action == "logout") $main_content .= '<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" >Logout Successful</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>You have logged out of your '.$config['server']['serverName'].' account. In order to view your account you need to <a href="?subtopic=accountmanagement" >log in</a> again.</td></tr> </table> </div> </table></div></td></tr>'; 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=accountmanagement" 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>'; else { $main_content .= ' <form target="pagseguro" method="post" action="https://pagseguro.uol.com.br/checkout/checkout.jhtml"> <input type="hidden" name="email_cobranca" value="'. $config['pagseguro']['email']. '"> <input type="hidden" name="tipo" value="CP"> <input type="hidden" name="moeda" value="BRL"> <input type="hidden" name="item_id_1" value="1"> <input type="hidden" name="item_descr_1" value="Pontos na account de nome: '.$account_logged->getCustomField("name").'"> <input type="hidden" name="item_valor_1" value="'. $config['pagseguro']['produtoValor'] .'"> <input type="hidden" name="item_frete_1" value="0"> <input type="hidden" name="item_peso_1" value="0"> <input type="hidden" name="ref_transacao" value="'.$account_logged->getCustomField("name").'"> <table border="0" cellpadding="4" cellspacing="1" width="100%" id="#estilo"><tbody> <tr bgcolor="#505050" class="white"> <th colspan="2"><strong>Escolha a quantidade de pontos que deseja comprar</strong></th> </tr> <tr> <td width="10%">Sua conta</td> <td><strong>'.$account_logged->getCustomField("name").'</strong></td> </tr> <tr> <td width="10%">Pontos</td> <td> <input name="item_quant_1" type="text" value="1" size="5" maxlength="5"> </td> </tr> <tr> <td colspan="2"> <input type="image" src="https://p.simg.uol.com.br/out/pagseguro/i/botoes/carrinhoproprio/btnFinalizar.jpg" name="submit" alt="Pague com PagSeguro - é rápido, grátis e seguro!" /> </td> </tr> </tbody></table></form>'; } ?> Para finalizar: Adicione no seu phpmyadmin,na parte SQL,a seguinte database: CREATE TABLE `retorno_automatico` ( `TransacaoID` varchar(36) NOT NULL, `VendedorEmail` varchar(200) NOT NULL, `Referencia` varchar(200) default NULL, `TipoFrete` char(2) default NULL, `ValorFrete` decimal(10,2) default NULL, `Extras` decimal(10,2) default NULL, `Anotacao` text, `TipoPagamento` varchar(50) NOT NULL, `StatusTransacao` varchar(50) NOT NULL, `CliNome` varchar(200) NOT NULL, `CliEmail` varchar(200) NOT NULL, `CliEndereco` varchar(200) NOT NULL, `CliNumero` varchar(10) default NULL, `CliComplemento` varchar(100) default NULL, `CliBairro` varchar(100) NOT NULL, `CliCidade` varchar(100) NOT NULL, `CliEstado` char(2) NOT NULL, `CliCEP` varchar(9) NOT NULL, `CliTelefone` varchar(14) default NULL, `NumItens` int(11) NOT NULL, `Data` datetime NOT NULL, `status` tinyint(1) unsigned NOT NULL default '0', UNIQUE KEY `TransacaoID` (`TransacaoID`,`StatusTransacao`), KEY `Referencia` (`Referencia`), KEY `status` (`status`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; E essa outra aqui : CREATE TABLE `PagSeguroTransacoes` ( `TransacaoID` varchar(36) NOT NULL, `VendedorEmail` varchar(200) NOT NULL, `Referencia` varchar(200) default NULL, `TipoFrete` char(2) default NULL, `ValorFrete` decimal(10,2) default NULL, `Extras` decimal(10,2) default NULL, `Anotacao` text, `TipoPagamento` varchar(50) NOT NULL, `StatusTransacao` varchar(50) NOT NULL, `CliNome` varchar(200) NOT NULL, `CliEmail` varchar(200) NOT NULL, `CliEndereco` varchar(200) NOT NULL, `CliNumero` varchar(10) default NULL, `CliComplemento` varchar(100) default NULL, `CliBairro` varchar(100) NOT NULL, `CliCidade` varchar(100) NOT NULL, `CliEstado` char(2) NOT NULL, `CliCEP` varchar(9) NOT NULL, `CliTelefone` varchar(14) default NULL, `NumItens` int(11) NOT NULL, `Data` datetime NOT NULL, `status` tinyint(1) unsigned NOT NULL default '0', UNIQUE KEY `TransacaoID` (`TransacaoID`,`StatusTransacao`), KEY `Referencia` (`Referencia`), KEY `status` (`status`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Rep ++ ai plx :button_ok:1 ponto -
Simple War 8.60 Evolution Version
LadyElegance reagiu a AdmZenhow por um tópico no fórum
:star2: Simple War 8.60 Evolution Version Otserver já tava sumido desda versão 8.54 agora resolvi restauralo! e reformula totalmente com novos items e quests, com treiners com novo visual e toda a cidade com 2 bixos novos que um deles dropa a firewalker boots (a melhor bota do server), tambem temos um labirinto quest para chegar ao npc merchant! os rates já estão para um ot de war balanciado é meio dificil de pegar level 300+ isso vai de sua opção ajuste conforme você queira! e temos o comando !resetar para level 500, lembrando que começa level 150!. :colors: Algumas ScreenShoots :down: [Templo] :down: [Treiners] :excl: Download :excl: Scan :password: Senha! GOD/GOD Obrigado por visualizar e comentem! Crédito: 100% Meu! Caso Alguem coloque on Avise aqui no topico o ip! Confiram meu ultimo trabalho Baiak Enigma! Clique aqui < Em breve Updates!1 ponto -
Algumas Sprites Uteis Pra Você!
Registeelz reagiu a TeamSky por um tópico no fórum
Spr De alguns Client's que são fechados. Pokemon Maluco AskL Closed Beta (Naruto) !! So quero Ajudar. Spr By TeamSky Copia Com creditos.1 ponto -
[9.1] Tfs Map Editor (Compilado)
danielcd123 reagiu a zimbituba por um tópico no fórum
The Forgotten Map Editor Este é o map editor criado pela equipe da TFS. Ele funciona com o Tibia 9.1 Ainda está em desenvolvimento... pode conter bugs. Para o funcionamento correto veja a imagem abaixo http://imageshack.us/photo/my-images/4/wmc655.jpg/ Download http://www.4shared.com/file/fX3JHl6T/ForgottenMapEditor.html Scan http://www.virustotal.com/file-scan/report.html?id=3c333b6e95285942f705d31b5ac4584819c6bbb82829618a81c1ee8a513ffba9-1312238903 Todos os créditos vão para a equipe do TFS.1 ponto -
Guuh Torres Vs 4.0
Deadpool reagiu a GuuhTorres por um tópico no fórum
Guuh Torres Vs 4.0 *Pessoal,me desculpem pela demora da atualização,pois tinha muitos bugs nesta base,e em pedidos de vários xtibianos,arrumei o "Pokemon Squadium" do brun123...Este server era um bom server,mais tinha muitos bugs,irei listar os que eu arrumei,ou acrescentei: -Catch -Goback -Portrait -Pokedex -Order -Talkactions -!lg para mudar a linguagem (English-Português) -Status sistema -Novos pokemons (Johto-Shinys) -Coloquei mais moves (Johto) -Npc Name (Que coloca um apelido ao pokemon) no ultimo andar do CP -Novo Mapa do Betinhowz666 -Novas quests -Novas Spawns (Eu não sei fazer muito bem,mais dá para usar) -PVP ZONE -Efeito ao upar level -Client na pasta (IP : 127.0.0.1) -Senha do GOD : guuh/torres DOWNLOAD do server: -Guuh Torres vs 4.0 Créditos : -GuuhTorres 25% -Brun123 40% (Caso você ler este tópico,peço que adicione ght-2-@hotmail.com) -Betinhowz666 15% -Xtibia 5% -Victorkta 5% -Ciffer 5% -Italo 5% QUE VENHAM OS REPS :button_ok: ------------------------------------------------------------- PRÓXIMA ATUALIZAÇÃO!!! Na próxima atualização irei fazer sem os BUGS,que vocês falarem...1 ponto -
[Encerrado] Adicionar Items
Natanael Beckman reagiu a thefog por um tópico no fórum
é possivel adicionar items no ot?[8.6] ja tentei e nunca consegui, sempre que uso otitemeditor o distro da um monte de erro... heeelp1 ponto -
OS CREDITOS TBM SAO MEUS HEIMMMMMMMMMM1 ponto
-
Simple War 8.60 Evolution Version
LadyElegance reagiu a AdmZenhow por um tópico no fórum
Pois é concordo com você os antigos mapas eram muito boms, mais já que tudo começou a mudar reslvi editado-lo, obrigado pela +REP e pelos elogios! :happy: :excl: Em breve postarei um baiak que estou editando.Totalmente Modificado1 ponto -
<?xml version="1.0" encoding="UTF-8"?> <monster name="Entei" nameDescription="a Entei" race="fire" experience="17500" speed="270" manacost="0"> <health now="15000" max="15000"/> <look type="ID DO LOOKTYPE" head="20" body="30" legs="40" feet="50" corpse="ID DO CORPO"/> <targetchange interval="10000" chance="10"/> <strategy attack="100" defense="0"/> <flags> <flag summonable="1"/> <flag attackable="1"/> <flag hostile="1"/> <flag illusionable="1"/> <flag convinceable="1"/> <flag pushable="0"/> <flag canpushitems="1"/> <flag canpushcreatures="0"/> <flag targetdistance="1"/> <flag staticattack="90"/> <flag runonhealth="0"/> </flags> <attacks> <attack name="peck" interval="1000" chance="50" min="-300" max="-350"> </attack> <attack name="fire fang" interval="1000" chance="50" min="-300" max="-350"> </attack> <attack name="fire blast" interval="4500" chance="90" min="-700" max="-1500"> </attack> <attack name="magma storm" interval="5000" chance="90" min="-1000" max="-3500"> </attack> <attack name="ember" interval="3500" chance="90" min="-350" max="-700"> </attack> <attack name="flamethrower" interval="7000" chance="90" min="-1900" max="-2500"> </attack> <attack name="twister" interval="6000" chance="90" min="-300" max="-600"> </attack> </attacks> <defenses armor="1" defense="1"> <defense name="Intense Healing" interval="5000" chance="100" min="1000" max="1000"> </defense> </defenses> <voices interval="5000" chance="10"> <voice sentence="Entei!"/> </voices> <loot> <item id="2283" countmax="1" chance="6500"/> -- fire stone </loot> <script> <event name="Exp"/> </script> </monster> Basta Vc por o id do corpo dele de acordo com o seu OT e o lookytype tbm. Se quizer aumente a força dos attacks dele, e acerte de acordo com as spells do seu OT1 ponto
-
servidor atualizado hoje! retirada do bug de não morrer em PVP! adicionada ao pisar em alguns chaos aparecer animações iguais no refugia original!1 ponto
-
Projeto Digimon World Championship Online
Dextruidor reagiu a victormoaz por um tópico no fórum
Nome: Victor Idade: 18 Cargo: Programador E-Mail/Msn: só passo via PM Horario Disponivel: varia, 2h~3h por dia Ideias Para o Serve: inumeras, e sobre o negocio do client eu sei fazer!1 ponto -
Melhor esclarecimento function onUse(cid, item, fromposition, itemEx, toposition) if item.itemid == ID and item.type == Quantidade then doPlayerRemoveItem(cid,item.itemid,item.type) doPlayerAddItem(cid,ID2,1) else doPlayerSendCancel(uid,22,"Voce nao tem dinheiro suficiente") end return TRUE end id e o id do primeiro dinheiro quantidade e quanto desse dinheiro precisa para virar o outro id2 e o id do novo dinheiro tem esse outro geito tbm function onUse(cid, item, fromposition, itemEx, toposition) if doPlayerRemoveItem(cid,id,quantidade) == TRUE then doPlayerRemoveItem(cid,id2,1) doPlayerSendTextMessage(cid,22,"Voce Tem Recebeu seu novo dinheiro" ) else doPlayerSendTextMessage(cid,22,"Voce nao tem dinheiro suficiente para converte-lo" ) end return false end1 ponto
-
(Ajuda) Importar Database
DaNDaNrOxX reagiu a walefxavier por um tópico no fórum
@ahBom Execute o DELIMITER normalmente no SQL do Phpmyadmin.Depois instale o site... Note que o erro que está a persistir é o de não criar personagens... certo? Uncaught exception 'E_OTS_NotLoaded' in C:\xampp\htdocs\pot\OTS_Player.php:1866 Vá novamente ao seu SQL (Lembre-se de ter adicionado os delimiters e reinstalar o site antes.) Execute o seguinte: INSERT INTO `player_skills` (`player_id`, `skillid`, `value`, `count`) VALUES (1, 0, 10, 0), (1, 1, 10, 0), (1, 2, 10, 0), (1, 3, 10, 0), (1, 4, 10, 0), (1, 5, 10, 0), (1, 6, 10, 0), (2, 0, 10, 0), (2, 1, 10, 0), (2, 2, 10, 0), (2, 3, 10, 0), (2, 4, 10, 0), (2, 5, 10, 0), (2, 6, 10, 0), (3, 0, 10, 0), (3, 1, 10, 0), (3, 2, 10, 0), (3, 3, 10, 0), (3, 4, 10, 0), (3, 5, 10, 0), (3, 6, 10, 0), (4, 0, 10, 0), (4, 1, 10, 0), (4, 2, 10, 0), (4, 3, 10, 0), (4, 4, 10, 0), (4, 5, 10, 0), (4, 6, 10, 0), (5, 0, 10, 0), (5, 1, 10, 0), (5, 2, 10, 0), (5, 3, 10, 0), (5, 4, 10, 0), (5, 5, 10, 0), (5, 6, 10, 0); Isto resolveu aqui... Se o erro continuar ou estiver dando algum outro poste aqui \/ ! Até..1 ponto -
se vc tiver as sources do ot é só vc da uma olhada neste tópico Autostacking Items.1 ponto
-
1 ponto
-
1 ponto
-
Empilhar Itens Automaticamente Na Bp.
knightmage reagiu a allan1001 por um tópico no fórum
Testado no TFS 0.4 e 0.3.6pl1 Para arruma o AutoStatacking é preciso mexer nas sources do server. Ache as fuções e modifique. Em container.cpp Cylinder* Container::__queryDestination(int32_t& index, const Thing* thing, Item** destItem, uint32_t&) { if(index == 254 /*move up*/) { index = INDEX_WHEREEVER; *destItem = NULL; Container* parentContainer = dynamic_cast<Container*>(getParent()); if(parentContainer) return parentContainer; return this; } else if(index == 255 /*add wherever*/){ index = INDEX_WHEREEVER; *destItem = NULL; } else if(index >= (int32_t)capacity()){ /* if you have a container, maximize it to show all 20 slots then you open a bag that is inside the container you will have a bag with 8 slots and a "grey" area where the other 12 slots where from the container if you drop the item on that grey area the client calculates the slot position as if the bag has 20 slots */ index = INDEX_WHEREEVER; *destItem = NULL; } const Item* item = thing->getItem(); if(item == NULL){ return this; } if(item->isStackable()){ if(item->getParent() != this){ //try find a suitable item to stack with uint32_t n = 0; for(ItemList::iterator cit = itemlist.begin(); cit != itemlist.end(); ++cit){ if((*cit) != item && (*cit)->getID() == item->getID() && (*cit)->getItemCount() < 100){ *destItem = (*cit); index = n; return this; } ++n; } } } if(index != INDEX_WHEREEVER){ Thing* destThing = __getThing(index); if(destThing) *destItem = destThing->getItem(); Cylinder* subCylinder = dynamic_cast<Cylinder*>(*destItem); if(subCylinder){ index = INDEX_WHEREEVER; *destItem = NULL; return subCylinder; } } return this; } Em item.cpp void Item::setDefaultSubtype() { setItemCount(1); const ItemType& it = items[id]; if(it.charges) setCharges(it.charges); } Em player.cpp Cylinder* Player::__queryDestination(int32_t& index, const Thing* thing, Item** destItem, uint32_t& flags) { if(index == 0 /*drop to capacity window*/ || index == INDEX_WHEREEVER){ *destItem = NULL; const Item* item = thing->getItem(); if(item == NULL){ return this; } //find an appropiate slot std::list<Container*> containerList; for(int i = SLOT_FIRST; i < SLOT_LAST; ++i){ Item* inventoryItem = inventory[i]; if(inventoryItem == tradeItem){ continue; } if(inventoryItem == tradeItem){ continue; } if(inventoryItem){ //try find an already existing item to stack with if(inventoryItem != item && item->isStackable() && inventoryItem->getID() == item->getID() && inventoryItem->getItemCount() < 100){ *destItem = inventoryItem; index = i; return this; } //check sub-containers else if(Container* subContainer = inventoryItem->getContainer()){ Cylinder* tmpCylinder = NULL; int32_t tmpIndex = INDEX_WHEREEVER; Item* tmpDestItem = NULL; tmpCylinder = subContainer->__queryDestination(tmpIndex, item, &tmpDestItem, flags); if(tmpCylinder && tmpCylinder->__queryAdd(tmpIndex, item, item->getItemCount(), flags) == RET_NOERROR){ index = tmpIndex; *destItem = tmpDestItem; return tmpCylinder; } containerList.push_back(subContainer); } } //empty slot else if(__queryAdd(i, item, item->getItemCount(), flags) == RET_NOERROR){ index = i; *destItem = NULL; return this; } } //check deeper in the containers for(std::list<Container*>::iterator it = containerList.begin(); it != containerList.end(); ++it){ for(ContainerIterator iit = (*it)->begin(); iit != (*it)->end(); ++iit){ if(Container* subContainer = (*iit)->getContainer()){ if(subContainer == tradeItem){ continue; } Cylinder* tmpCylinder = NULL; int32_t tmpIndex = INDEX_WHEREEVER; Item* tmpDestItem = NULL; tmpCylinder = subContainer->__queryDestination(tmpIndex, item, &tmpDestItem, flags); if(tmpCylinder && tmpCylinder->__queryAdd(tmpIndex, item, item->getItemCount(), flags) == RET_NOERROR){ index = tmpIndex; *destItem = tmpDestItem; return tmpCylinder; } } } } return this; } Thing* destThing = __getThing(index); if(destThing) *destItem = destThing->getItem(); Cylinder* subCylinder = dynamic_cast<Cylinder*>(destThing); if(subCylinder){ index = INDEX_WHEREEVER; *destItem = NULL; return subCylinder; } else return this; } Créditos: Exedion e kwovan1 ponto -
1 ponto