Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 01/18/14 em todas áreas

  1. fitaisolante

    Fazer criaturas conversarem.

    Fala XTibianos, vim aqui postar um script muito simples, porem criativo e que eu nunca vi aqui no XTibia. É uma talkaction em que você faz um player falar, npc ou monstro. Obs: Os monstros ou NPC, se tiver mais de 1 criatura com o mesmo nome, somente uma vai falar, que é a primeira que seu char vai ir até ele por /goto Foto da talkaction: Vamos ao código, vá em talkactions/scripts e dê ctrl + c e ctrl + v em um arquivo qualquer e renomeie para criaturasfalar.lua, e coloque isso dentro: function onSay(cid, words, param) local t = string.explode(param, ",") doCreatureSay(getCreatureByName(t[1]), t[2], 1) return true end Agora abra o talkactions.xml e coloque essa tag: <talkaction log="yes" words="/falar" access="5" event="script" value="criaturasfalar.lua"/> É isso galera, abraços!
    2 pontos
  2. Wiliner

    Apresentação

    Emoção, adrenalina, euforia, estes serão os sentimentos lhe envolverão ao conhecer ao fundo tudo o que o nosso projeto tem a oferecer-lhe... Seja bem vindo ao nosso tópico e desfrute de tudo do melhor que um projeto voltado para a realidade medieval tem a oferecer. Apresento-lhes: Elënor - Awakening Chapter I “ E quando os dois reinos caírem, a força do deserto reinará soberana, trazendo aos aliados e sobreviventes uma nova esperança, nascida do fruto do exílio. ” A verdadeira essência do Role Play Game, em sua tela. Mapas, sistemas, gráficos, um mundo mergulhado nas eras antigas, a era em que homens lutavam até o frenesi de suas vidas, para conseguir aquele triunfo, aquela glória, ou pelo menos, morrerem tentando... E é neste cenário épico, aonde dois reinos antigos disputam terras para futuras colonizações, que começa o capítulo um de Elënor - Awakening. Acompanhe-nos, e surpreenda-se, com as envolventes situações decorridas antes mesmo do nosso pré lançamento. Dedicação e concentração, adjetivos perfeitos para descrever a situação atual de nossa equipe. Estamos trabalhando muito duro, levando a nossa capacidade ao extremo, e prometemos: Você finalmente sentirá a magia dos cenários épicos medievais entrando em sua mente, o deixando extasiado, e o melhor, completamente satisfeito, sentindo se imergido neste imenso mundo gráfico em perspectiva 45, banhado pela criatividade, e concebido por pesquisas e estudos sobre esta época que até hoje nos contagia. Awakening, o que seria? O despertar, o levante dos exilados, a rebelião dos que a muito foram condenados e jogados as areias mortas do continente inexplorado. Awakening segue como o primeiro capítulo de Elënor que além de seus updates trará, uma nova história, uma nova essência, uma nova razão para que o prazer em jogar não se acabe devido ao tempo. Awakening tem inicio quando tropas expedicionárias da capital do continente oeste vêm sofrendo constantes ataques, antecedidos por ardilosas emboscadas enquanto patrulham os arredores do porto de Talamar, o continente inexplorado. Elendor é o nome dessa capital, que com os esforços de seus homens, construiu um pequeno porto para dar inicio a explorações nessas terras que mais tarde acaba se tornando o segundo continente. A atenção da coroa elendoriana vira-se para este imenso espaço praticamente desconhecido, o qual é a residência fixa da raça sagrada élfica, e lar de alguns seres humanos, cujos exilados, jogados aquela porção de areia morta para se definharem, como sentença por seus crimes. O inesperado resultado desse exílio, foi à sobrevivência de um criminoso, que ao passar do tempo uniu-se com outros exilados formando uma sociedade, a sociedade que fundou a imponente cidade desértica; Al’darash, principal suspeita dos ataques ocorridos. Elendor, tendo seus exploradores e batedores massacrados a cada expedição, irá investigar a origem dos freqüentes ataques, é aí que a verdadeira seiva de Awakening se mostra pela primeira vez. O reino do sul, Ergon oferece alguns de seus homens para “ajudar” na investigação do ocorrido aliando-se temporariamente ao exército nortista elendoriano, tornando o capitulo ainda mais interessante. Legendas: • Nerak: Continente principal localizado ao oeste. • Talamar: Continente inexplorado situado ao leste. • Al’darash: Cidade desértica ao leste do continente Talamar. • Ergon: Reino do sul, localizado no continente Nërak. • Elendor: Reino do norte, localizado no continente Nërak. • Elendoriano (a): Nativo ou naturalizado na capital Elendor. Nossa missão Sempre evoluir e aprimorar os nossos conhecimentos, tentando trazer total excelência a cada nova atualização, fazendo com que os nossos jogadores e cooperadores desfrutem do prazer da sua imaginação, sem decepções e lamentações, adentrando neste mundo épico, projetado sobre idéias fantásticas que ganharam vida, tornando-se assim, um dos jogos mais reconhecidos na perspectiva 45°. Considerações Finais Essa foi a nossa breve apresentação. O andamento do nosso projeto será postado na medida em que tivermos um conteúdo realmente “pesado”. A equipe Elënor concordou em demorarmos um pouco mais a postar o sobre nosso desenvolvimento, porém, quando postado, tenham a certeza de que a espera terá valido a pena. Mapas, gráficos, histórias, descrições, sistemas, website, client, tudo virá de uma só vez, ou seja, não haverá tópicos mostrando apenas uma imagem de mapa. Mas, por regra do XTibia, manteremos o tópico atualizado mostrando pequenas frações sobre o nosso andamento, que irão variar desde pequenas histórias até básicos sistemas, exclusivos ou melhorados. Pelo menos até quando o nosso tópico principal estiver pronto. Equipe Elënor.
    2 pontos
  3. To de Vorta =D. to com preguiça de comenta entao la vai. Té manha Xaus =D
    2 pontos
  4. rDs7008

    Seu Ultimo Sprite.

    Fiz um edit na minha espada. Agora ficou como eu queria. Acho que vou fazer a outra espada do Kirito agora (a espada preta).
    2 pontos
  5. Desnecessario

    Seu Ultimo Sprite.

    Treinando questão de swords :
    2 pontos
  6. Kydrai

    Vip System By Account V1.0

    Vip System by Account 1.0 By Kydrai Este é um vip system por account, ou seja, um sistema de vip válido para todos os characters de uma determinada conta. O script foi testado no TFS 0.3.6 - 8.54. E no site Gesior 0.3.4 beta4. Em caso de erros ou dúvidas é só postar. Funções do Script Função necessária para começar a usar o script: installVip() -> Cria a coluna no banco de dados para usar o sistema de vip (testei somente em sqlite, mas acredito que funcione em mysql) Funções que utilizam o account id: doTeleportPlayersByAccount(acc, topos) -> Teleporta todos os players da account getVipTimeByAccount(acc) -> Pega o tempo de vip setVipTimeByAccount(acc, time) -> Edita o tempo de vip getVipDaysByAccount(acc) -> Pega o tempo de vip em dias isVipAccount(acc) -> Verifica se é vip addVipDaysByAccount(acc, days) -> Adiciona dias de vip doRemoveVipDaysByAccount(acc, days) -> Remove dias de vip getVipDateByAccount(acc) -> Pega a data e hora que irá terminar a vip Funções que utilizam o creature id (cid): doTeleportPlayers(cid, topos) -> Teleporta todos os players da account getVipTime(cid) -> Pega o tempo de vip setVipTime(cid, time) -> Edita o tempo de vip getVipDays(cid) -> Pega o tempo de vip em dias isVip(cid) -> Verifica se é vip addVipDays(cid, days) -> Adiciona dias de vip doRemoveVipDays(cid, days) -> Remove dias de vip getVipDate(cid) -> Pega a data e hora que irá terminar a vip Inserindo as funções Abra a pasta data/lib, crie um arquivo lua e coloque: vipAccount.lua --[[ Name: Vip System by Account Version: 1.0 Author: Kydrai Forum: http://www.xtibia.com/forum/topic/136543-vip-system-by-account-v10/ [Functions] -- Install installVip() -- By Account doTeleportPlayersByAccount(acc, topos) getVipTimeByAccount(acc) setVipTimeByAccount(acc, time) getVipDaysByAccount(acc) isVipAccount(acc) addVipDaysByAccount(acc, days) doRemoveVipDaysByAccount(acc, days) getVipDateByAccount(acc) -- By Player doTeleportPlayers(cid, topos) getVipTime(cid) setVipTime(cid, time) getVipDays(cid) isVip(cid) addVipDays(cid, days) doRemoveVipDays(cid, days) getVipDate(cid) ]]-- -- Install function installVip() if db.executeQuery("ALTER TABLE `accounts` ADD viptime INT(15) NOT NULL DEFAULT 0;") then print("[Vip System] Vip System instalado com sucesso!") return TRUE end print("[Vip System] Não foi possível instalar o Vip System!") return FALSE end -- By Account function doTeleportPlayersByAccount(acc, topos) if db.executeQuery("UPDATE `players` SET `posx` = "..topos.x..", `posy` = "..topos.y..", `posz` = "..topos.z.." WHERE `account_id` = "..acc..";") then return TRUE end return FALSE end function getVipTimeByAccount(acc) local vip = db.getResult("SELECT `viptime` FROM `accounts` WHERE `id` = "..acc..";") if vip:getID() == -1 then print("[Vip System] Account not found!") return FALSE end return vip:getDataInt("viptime") end function setVipTimeByAccount(acc, time) if db.executeQuery("UPDATE `accounts` SET `viptime` = "..time.." WHERE `id` = "..acc..";") then return TRUE end return FALSE end function getVipDaysByAccount(acc) local vipTime = getVipTimeByAccount(acc) local timeNow = os.time() local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60)) return days <= 0 and 0 or days end function isVipAccount(acc) return getVipDaysByAccount(acc) > 0 and TRUE or FALSE end function addVipDaysByAccount(acc, days) if days > 0 then local daysValue = days * 24 * 60 * 60 local vipTime = getVipTimeByAccount(acc) local timeNow = os.time() local time = getVipDaysByAccount(acc) == 0 and (timeNow + daysValue) or (vipTime + daysValue) setVipTimeByAccount(acc, time) return TRUE end return FALSE end function doRemoveVipDaysByAccount(acc, days) if days > 0 then local daysValue = days * 24 * 60 * 60 local vipTime = getVipTimeByAccount(acc) local time = vipTime - daysValue setVipTimeByAccount(acc, (time <= 0 and 1 or time)) return TRUE end return FALSE end function getVipDateByAccount(acc) if isVipAccount(acc) then local vipTime = getVipTimeByAccount(acc) return os.date("%d/%m/%y %X", vipTime) end return FALSE end -- By Player function doTeleportPlayers(cid, topos) doTeleportPlayersByAccount(getPlayerAccountId(cid), topos) end function getVipTime(cid) return getVipTimeByAccount(getPlayerAccountId(cid)) end function setVipTime(cid, time) return setVipTimeByAccount(getPlayerAccountId(cid), time) end function getVipDays(cid) return getVipDaysByAccount(getPlayerAccountId(cid)) end function isVip(cid) return isVipAccount(getPlayerAccountId(cid)) end function addVipDays(cid, days) return addVipDaysByAccount(getPlayerAccountId(cid), days) end function doRemoveVipDays(cid, days) return doRemoveVipDaysByAccount(getPlayerAccountId(cid), days) end function getVipDate(cid) return getVipDateByAccount(getPlayerAccountId(cid)) end Exemplos de uso Talkaction GOD: /installvip /addvip name, days /removevip name, days /checkvip name Player: /buyvip /vipdays talkactions.xml: <talkaction log="yes" access="5" words="/installvip;/addvip;/removevip;/checkvip" event="script" value="vipaccgod.lua"/> <talkaction words="/buyvip;/vipdays" event="script" value="vipaccplayer.lua"/> vipaccgod.lua: function onSay(cid, words, param, channel) local t = param:explode(",") local name, days = t[1], tonumber(t[2]) if words == "/installvip" then if installVip() then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Vip System instalado com sucesso!") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Não foi possível instalar o Vip System!") end elseif words == "/addvip" then if name then if days then local acc = getAccountIdByName(name) if acc ~= 0 then addVipDaysByAccount(acc, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip ao "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar essa quantidade de dia(s) de vip.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar dia(s) de vip a este player.") end elseif words == "/removevip" then if name then if days then local acc = getAccountIdByName(name) if acc ~= 0 then doRemoveVipDaysByAccount(acc, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você retirou "..days.." dia(s) de vip do "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar essa quantidade de dia(s) de vip.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar dia(s) de vip a este player.") end elseif words == "/checkvip" then if name then local acc = getAccountIdByName(name) if acc ~= 0 then local duration = getVipDateByAccount(acc) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O "..name.." possui "..getVipDaysByAccount(acc).." dias de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode visualizar os dias de vip a este player.") end end return TRUE end vipaccplayer.lua: function onSay(cid, words, param, channel) if words == "/buyvip" then local price = 1000000 local days = 30 if doPlayerRemoveMoney(cid, price) then addVipDays(cid, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip, agora você possui "..getVipDays(cid).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa de "..price.." para adicionar "..days.." dia(s) de vip.") end elseif words == "/vipdays" then local duration = getVipDate(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) end return TRUE end Movement (Tile) Coloque actionid 15000 em um tile onde somente os vips poderão passar. movements.xml: <movevent type="StepIn" actionid="15000" event="script" value="viptile.lua"/> viptile.lua: function onStepIn(cid, item, position, fromPosition) if isVip(cid) == FALSE then doTeleportThing(cid, fromPosition, false) doSendMagicEffect(position, CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Somente players vip podem passar.") end return TRUE end Creaturescript (Login) Quando player logar irá verificar se a vip do player acabou, se sim então irá teleportar todos os players da account para o templo, se não irá mostrar o tempo da vip. creaturescripts.xml: <event type="login" name="viplogin" script="viplogin.lua"/> viplogin.lua: function onLogin(cid) local vip = isVip(cid) if getVipTime(cid) > 0 and vip == FALSE then local townid = 1 doPlayerSetTown(cid, townid) local templePos = getTownTemplePosition(getPlayerTown(cid)) doTeleportThing(cid, templePos, false) setVipTime(cid, 0) doTeleportPlayers(cid, templePos) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sua Vip acabou!") elseif vip == TRUE then local duration = getVipDate(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) end return TRUE end Action (Door) Coloque actionid 15001 na door onde somente os vips poderão passar. Use a porta gate of expertise (id: 1227) actions.xml: <action actionid="15001" script="vipdoor.lua"/> vipdoor.lua: function onUse(cid, item, fromPosition, itemEx, toPosition) if isVip(cid) == FALSE then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Somente players vip podem passar.") elseif item.itemid == 1227 then doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition) end return TRUE end NPC (Vendedor de VIP) vipnpc.xml: <?xml version="1.0" encoding="UTF-8"?> <npc name="Vendedor de VIP" script="vipnpc.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="128" head="17" body="54" legs="114" feet="0" addons="2"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|, I sell {vip} days."/> </parameters> </npc> vipnpc.lua: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function buyVip(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end if doPlayerRemoveMoney(cid, parameters.price) then addVipDays(cid, parameters.days) npcHandler:say('Thanks, you buy '..parameters.days..' vip days. You have '..getVipDays(cid)..' vip days.', cid) else npcHandler:say('Sorry, you don\'t have enough money.', cid) end npcHandler:resetNpc() return true end local node1 = keywordHandler:addKeyword({'vip'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Do you want buy 30 vip days for 1000000 gp\'s?'}) node1:addChildKeyword({'yes'}, buyVip, {price = 1000000, days = 30}) node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Ok, then.', reset = true}) npcHandler:addModule(FocusModule:new()) Erros e Soluções Configurando o Gesior Com essa configuração irá aparecer o vip status do player no site e será possível vender vip pelo site. Se eu esqueci de alguma coisa é só avisar. accountmanagement.php Depois de: if(!$account_logged->isPremium()) $account_status = '<b><font color="red">Free Account</font></b>'; else $account_status = '<b><font color="green">Premium Account, '.$account_logged->getPremDays().' days left</font></b>'; Adicione: if(!$account_logged->isVip()) $account_vip_status = '<b><font color="red">Not Vip Account</font></b>'; else $account_vip_status = '<b><font color="green">Vip Account, '.$account_logged->getVipDays().' days left</font></b>'; Depois de: <td class="LabelV" >Account Status:</td><td>'.$account_status.'</td></tr><tr style="background-color:'.$config['site']['darkborder'].';" > Adicione: <td class="LabelV" >Account Vip Status:</td><td>'.$account_vip_status.'</td></tr><tr style="background-color:'.$config['site']['darkborder'].';" > pot/OTS_Account.php Substitua: private $data = array('email' => '', 'blocked' => false, 'rlname' => '','location' => '','page_access' => 0,'lastday' => 0,'premdays' => 0, 'created' => 0); Por: private $data = array('email' => '', 'blocked' => false, 'rlname' => '','location' => '','page_access' => 0,'lastday' => 0,'premdays' => 0, 'created' => 0, 'viptime' => 0); Substitua: $this->data = $this->db->query('SELECT ' . $this->db->fieldName('id') . ', ' . $this->db->fieldName('name') . ', ' . $this->db->fieldName('password') . ', ' . $this->db->fieldName('email') . ', ' . $this->db->fieldName('blocked') . ', ' . $this->db->fieldName('rlname') . ', ' . $this->db->fieldName('location') . ', ' . $this->db->fieldName('page_access') . ', ' . $this->db->fieldName('premdays') . ', ' . $this->db->fieldName('lastday') . ', ' . $this->db->fieldName('created') . ' FROM ' . $this->db->tableName('accounts') . ' WHERE ' . $this->db->fieldName('id') . ' = ' . (int) $id)->fetch(); Por: $this->data = $this->db->query('SELECT ' . $this->db->fieldName('id') . ', ' . $this->db->fieldName('name') . ', ' . $this->db->fieldName('password') . ', ' . $this->db->fieldName('email') . ', ' . $this->db->fieldName('blocked') . ', ' . $this->db->fieldName('rlname') . ', ' . $this->db->fieldName('location') . ', ' . $this->db->fieldName('page_access') . ', ' . $this->db->fieldName('premdays') . ', ' . $this->db->fieldName('viptime') . ', ' . $this->db->fieldName('lastday') . ', ' . $this->db->fieldName('created') . ' FROM ' . $this->db->tableName('accounts') . ' WHERE ' . $this->db->fieldName('id') . ' = ' . (int) $id)->fetch(); Substitua: $this->db->query('UPDATE ' . $this->db->tableName('accounts') . ' SET ' . $this->db->fieldName('password') . ' = ' . $this->db->quote($this->data['password']) . ', ' . $this->db->fieldName('email') . ' = ' . $this->db->quote($this->data['email']) . ', ' . $this->db->fieldName('blocked') . ' = ' . (int) $this->data['blocked'] . ', ' . $this->db->fieldName('rlname') . ' = ' . $this->db->quote($this->data['rlname']) . ', ' . $this->db->fieldName('location') . ' = ' . $this->db->quote($this->data['location']) . ', ' . $this->db->fieldName('page_access') . ' = ' . (int) $this->data['page_access'] . ', ' . $this->db->fieldName('premdays') . ' = ' . (int) $this->data['premdays'] . ', ' . $this->db->fieldName('lastday') . ' = ' . (int) $this->data['lastday'] . ' WHERE ' . $this->db->fieldName('id') . ' = ' . $this->data['id']); Por: $this->db->query('UPDATE ' . $this->db->tableName('accounts') . ' SET ' . $this->db->fieldName('password') . ' = ' . $this->db->quote($this->data['password']) . ', ' . $this->db->fieldName('email') . ' = ' . $this->db->quote($this->data['email']) . ', ' . $this->db->fieldName('blocked') . ' = ' . (int) $this->data['blocked'] . ', ' . $this->db->fieldName('rlname') . ' = ' . $this->db->quote($this->data['rlname']) . ', ' . $this->db->fieldName('location') . ' = ' . $this->db->quote($this->data['location']) . ', ' . $this->db->fieldName('page_access') . ' = ' . (int) $this->data['page_access'] . ', ' . $this->db->fieldName('premdays') . ' = ' . (int) $this->data['premdays'] . ', ' . $this->db->fieldName('viptime') . ' = ' . (int) $this->data['viptime'] . ', ' . $this->db->fieldName('lastday') . ' = ' . (int) $this->data['lastday'] . ' WHERE ' . $this->db->fieldName('id') . ' = ' . $this->data['id']); Depois de: public function getPremDays() { if( !isset($this->data['premdays']) || !isset($this->data['lastday']) ) { throw new E_OTS_NotLoaded(); } return $this->data['premdays'] - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->data['lastday']))) - date("z", $this->data['lastday'])); } Adicione: public function getVipDays() { if( !isset($this->data['viptime']) || !isset($this->data['lastday']) ) { throw new E_OTS_NotLoaded(); } return ceil(($this->data['viptime'] - time()) / (24*60*60)); } Depois de: public function isPremium() { return ($this->data['premdays'] - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->data['lastday']))) - date("z", $this->data['lastday'])) > 0); } Adicione: public function isVip() { return ceil(($this->data['viptime'] - time()) / (24*60*60)) > 0; } characters.php Substitua: if($config['site']['show_vip_status']) { $id = $player->getCustomField("id"); if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD WIDTH=10%>Vip Status:</TD>'; $vip = $SQL->query('SELECT * FROM player_storage WHERE player_id = '.$id.' AND `key` = '.$config['site']['show_vip_storage'].';')->fetch(); if($vip == false) { $main_content .= '<TD><span class="red"><B>NOT VIP</B></TD></TR>'; } else { $main_content .= '<TD><span class="green"><B>VIP</B></TD></TR>'; } $comment = $player->getComment(); $newlines = array("\r\n", "\n", "\r"); $comment_with_lines = str_replace($newlines, '<br />', $comment, $count); if($count < 50) $comment = $comment_with_lines; if(!empty($comment)) { if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD VALIGN=top>Comment:</TD><TD>'.$comment.'</TD></TR>'; } } Por: if($config['site']['show_vip_status']) { $id = $player->getCustomField("id"); if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD WIDTH=10%>Account Vip Status:</TD>'; if(!$account->isVip()) { $main_content .= '<TD><span class="red"><B>NOT VIP</B></TD></TR>'; } else { $main_content .= '<TD><span class="green"><B>VIP</B></TD></TR>'; } $comment = $player->getComment(); $newlines = array("\r\n", "\n", "\r"); $comment_with_lines = str_replace($newlines, '<br />', $comment, $count); if($count < 50) $comment = $comment_with_lines; if(!empty($comment)) { if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD VALIGN=top>Comment:</TD><TD>'.$comment.'</TD></TR>'; } } shopsystem.php (+Créditos ao GM Bekman) Substitua: if($buy_offer['type'] == 'pacc') { $player_premdays = $buy_player_account->getCustomField('premdays'); $player_lastlogin = $buy_player_account->getCustomField('lastday'); $save_transaction = 'INSERT INTO '.$SQL->tableName('z_shop_history_pacc').' (id, to_name, to_account, from_nick, from_account, price, pacc_days, trans_state, trans_start, trans_real) VALUES (NULL, '.$SQL->quote($buy_player->getName()).', '.$SQL->quote($buy_player_account->getId()).', '.$SQL->quote($buy_from).', '.$SQL->quote($account_logged->getId()).', '.$SQL->quote($buy_offer['points']).', '.$SQL->quote($buy_offer['days']).', \'realized\', '.$SQL->quote(time()).', '.$SQL->quote(time()).');'; $SQL->query($save_transaction); $buy_player_account->setCustomField('premdays', $player_premdays+$buy_offer['days']); $account_logged->setCustomField('premium_points', $user_premium_points-$buy_offer['points']); $user_premium_points = $user_premium_points - $buy_offer['points']; if($player_premdays == 0) { $buy_player_account->setCustomField('lastday', time()); } $main_content .= '<h2>PACC added!</h2><b>'.$buy_offer['days'].' days</b> of Premium Account added to account of player <b>'.$buy_player->getName().'</b> for <b>'.$buy_offer['points'].' premium points</b> from your account.<br />Now you have <b>'.$user_premium_points.' premium points</b>.<br /><a href="index.php?subtopic=shopsystem">GO TO MAIN SHOP SITE</a>'; } Por: if($buy_offer['type'] == 'pacc') { $player_viptime = $buy_player_account->getCustomField('viptime'); $player_lastlogin = $buy_player_account->getCustomField('lastday'); $save_transaction = 'INSERT INTO '.$SQL->tableName('z_shop_history_pacc').' (id, to_name, to_account, from_nick, from_account, price, pacc_days, trans_state, trans_start, trans_real) VALUES (NULL, '.$SQL->quote($buy_player->getName()).', '.$SQL->quote($buy_player_account->getId()).', '.$SQL->quote($buy_from).', '.$SQL->quote($account_logged->getId()).', '.$SQL->quote($buy_offer['points']).', '.$SQL->quote($buy_offer['days']).', \'realized\', '.$SQL->quote(time()).', '.$SQL->quote(time()).');'; $SQL->query($save_transaction); if($player_viptime > 0) $buy_player_account->setCustomField('viptime', $player_viptime + ($buy_offer['days'] * 24 * 60 * 60)); else $buy_player_account->setCustomField('viptime', time() + ($buy_offer['days'] * 24 * 60 * 60)); $account_logged->setCustomField('premium_points', $user_premium_points-$buy_offer['points']); $user_premium_points = $user_premium_points - $buy_offer['points']; if($player_viptime == 0) { $buy_player_account->setCustomField('lastday', time()); } $main_content .= '<h2>VIP Days added!</h2><b>'.$buy_offer['days'].' days</b> of Vip Account added to account of player <b>'.$buy_player->getName().'</b> for <b>'.$buy_offer['points'].' premium points</b> from your account.<br />Now you have <b>'.$user_premium_points.' premium points</b>.<br /><a href="index.php?subtopic=shopsystem">GO TO MAIN SHOP SITE</a>'; } Links Úteis 01- [Gesior Acc] Vendedo Vip Pelo Pacc Créditos: GM Bekman 02- Double Exp Para Vip Créditos: Vodkart 03- Outfits Só Para Jogadores Vips Créditos: Vodkart
    1 ponto
  7. BananaFight

    OtClient - Tutorial Básico #1

    OtClient - Tutorial Básico #1 Aula 1 : Editando mod/Modules Bom galera, hoje eu vou ensinar vocês a como editar mod/Modules, e também como posiciona-los na janela. OBS: Quando eu falar Janela, estou me referindo aos objetos: MainWindow, Botton etc Passo 1 entendendo os arquivos Dentro da maioria das pasta no OtClient existirão 3 arquivos com as seguintes extensões: .lua.otmod.otui Cada uma dessas extensões executam um papel EXTREMAMENTE importante dentro do mod/module que você pretende criar, Mais será explicado mais para a frente, Nessa aula vamos mexer apenas no arquivo ".otui". Passo 2 Indentação Uma das coisas mais importante dentro dos arquivos ".otui" é a indentação, pois se você errar um espaçamento qualquer você pode estar 'bugando' todo o funcionamento da sua mod/module. Vou ensinar a vocês o modo certo de indentar seus códigos para que não tenham erros. MainWindowid: tutorialWindowsize: 80 80&save: true Dentro dos arquivos '.otui' só é permitido a indentação com a tecla "Espaço", Caso você tente usar "Tab" para indentar seu código ele vai dar erro e não irá funcionar. A indentação deve ser feita com apenas 2 espaços, e sempre seguindo a ordem do item que você ta criando. Exemplo: MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Como o Botão 'Button1' vai ficar dentro da janela ' tutorialWindow', ele tem que ficar a uma distancia de 2 espaços da janela 'MainWindow', Caso eu quebre esse espaçamento provavelmente poderei ter bugs na hora de abrir esse mod/module dentro do client. Outra coisa para tomar cuidado é quando for dar linha para adicionar outra janela, nessa linha em que separa uma janela não pode conter nem um espaço e nenhum comando. Exemplo: Certo MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Errado MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Vocês não conseguem ver a diferença, mais tente selecionar os dois códigos que vão entender melhor, o que eu falei. Agora a organização e edição de cada janela dentro do arquivo '.otui' deve seguir o mesmo principio de 2 espaços de distancia. Exemplo: Certo MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Errado MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 E também esta Errado desta forma MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Como o botão vai aparecer dentro da janela 'MainWindow' ele tem que ficar a 2 espaçamento dela pois se eu deixar os 2 na mesma posição é como se eu estivesse dizendo ao script que são duas janelas separadas e o botton vai aparecer por conta própria quando eu executar o mod/module. Passo 3 conhecendo as janelas Existem diversos modos de se criar uma janela onde vai aparecer vários botoes textos e etc, Mais sempre vai ter uma janela que será a matriz de todos, onde todos deverão aparecer, que no nosso exemplo é : MainWindowid: tutorialWindowsize: 80 80&save: true Esse código é nossa janela principal, É nela que vai aparecer tudo que queremos mostrar com no script, Agora vou mostrar o que cada função que tem dentro de MainWindow faz. MainWindowid: esse é o ID do MainWindow, Supondo que tenham 2 MainWindow, é com esse id que vamos diferencia-lassize: aqui é onde configuramos a largura e altura da janela, nessesariamente nessa ordem&save: isso fica para as próximas aulas Não precisamos usar necessariamente size para mostrar o tamanho ou largura da janela, podemos utilizar por exemplo : width: 80height: 80 Esses 2 códigos podem ser utilizados no lugar de size e farão exatamente a mesma coisa. Caso você tenha editado ou criado algum mod/modules para testar esses códigos que mostrei acima, percebeu que na janela não aparece nome e nem nada do gênero e é isso que irei mostrar agora. !text: tr('Texto') - Essa função adiciona o texto na janela em que você adicionar esta linhaicon: img.png - Esta função pega a sua imagem e usa ela de icone para a janela ( neste caso a imagem tem que estar na mesma pasta que o arquivo '.otui', e isso só irá funcionar dependendo do tipo da janela matriz, veremos em outros tutoriais.) Com esses dois Código você consegue personalizar a janela onde irão aparecer os botoes, textos etc que você pretende fazer. Exemplo: MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: true Agora vamos começar a criar botoes, escrever textos e etc. Vamos começar adicionando uma Label que vai mostrar o texto 'Olá Xtibia'. MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftmargin-top: 5margin-left: 5 Como vocês podem ver apareceram algumas funções novas, que são elas : anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomanchors.top: prev.topanchors.left: prev.leftanchors.right: prev.rightanchors.bottom: prev.bottommargin-top: 5margin-left: 5margin-right: 5margin-bottom: 5 Com essas funões nós determinamos onde cada item da nossa janela vai ficar. Entendendo as novas funções anchors.top: parent.top Com a linha 'anchors.top:' estamos dizendo que a posição do meu item vai ser definida para cima, agora adicionando 'parent.top' estamos dizendo que a posição do meu item deve se Colada com começo da Janela, e isso segue para left, right, bottom também. agora se no lugar de 'parent.top' eu usar 'prev.top' eu estou dizendo que meu item vai ficar colado com a parte de cima do item que tem encima, Confuso eu sei mais vou dar um exemplo: MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.left Ali no script acima eu estou mandando a Label1 ficar colada com a borda de cima da janela principal, e a esquerda, Já na Label2, eu estou mando ela ficar colada com a Label1 ( pois a label1 que esta encima ) e também ficar colada com a borda da janela principal. Isso se aplica a todos os lados, se eu usar prev.left, eu vou estar dizendo que a label2 tem que ficar exatamente do lado esquerdo da label1. As funções 'margin-top: 5' vão fazer com que meu item fique com a distancia de 5 pixel ( Não tenho certeza se são pixels ) do item que esta acima MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5 Nesse Exemplo eu fiz a label2 ficar a 5 pixel abaixo da Label1, e isso é a mesma coisa se eu ultilizar left, right, bottom eu vou pegar uma distancia do que estiver do lado do meu item ou embaixo etc. Mais agora nós não precisamos nos prender a ficar somente com parent, e prev na hora de criar um item. podemos utilizar o id de um item como referencia de onde deve ficar meu item, como no exemplo : MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: parent.topanchors.left: Label1.left Nesse Exemplo eu fiz com que a Label3 ficasse a esquerda da Label1, e grudada a margem da janela principal, mais eu também poderia fazer ela ficar embaixo da Label1, e grudada ao lado direito da margem da janela principal. MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.topanchors.right: parent.right Mais caso você for testar isso vai perceber que o Label2 vai ficar encima do Label1 e ao invés do Label3 ficar embaixo do Label1 ele vai ficar do lado, Para corrigir esses pequenos erros você pode juntar códigos como no exemplo : MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.bottomanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.bottomanchors.right: parent.right Pelo Simples fato de eu ter trocado top por bottom agora o script sabe que a Label2 tem que ficar no fim da Label1 e o mesmo para a Label3, e por isso usamos margin, para deixa uma distancia entre cada item, e para ficar mais organizado. Bom acho que é isso, Caso eu lembre de algo relevante estarei editando e adicionando mais coisas, Espero que gostem e quais quer DUVIDAS relacionadas AO TÓPICO é só fazer um comentário aqui embaixo que estarei respondendo. @Edit, Infelizmente o Xtibia Quebrou a indentação, mais lembre-se é sempre 2 espaços.
    1 ponto
  8. zipter98

    Shiny Stone mais "simples"

    Olá, Esse script não é nada complexo, mas, como a maioria dos que vejo sobre Shiny Stone é necessário fazer tabelas para definir os pokémons que irão evoluir e talz, achei melhor fazer este aqui, que é mais simples. As configurações já estão indicadas no script. Ah, pra quem não sabe, Shiny Stone transforma o pokémon na sua versão shiny. Vá em data/actions/scripts, crie um arquivo com extensão .lua, nomeie-o shinystone, e adicione o seguinte conteúdo: Agora, em data/actions, abra actions.xml, e adicione a tag: <action itemid="id da shiny stone" event="script" value="shinystone.lua" allowfaruse="1"/> Só isso, qualquer erro, só postar. Testei aqui, e está funcionando perfeitamente. Testado em PDA by Slicer sem level, v1.9. Ah, só mais uma complementação: só está evoluindo pokémons que sua versão shiny tenha "Shiny " antes do nome. Por exemplo, "Shiny Electabuzz". Se em seu server os shinies não tiverem o prefixo "Shiny", obviamente, o pokémon não irá evoluir.
    1 ponto
  9. Omega

    Bruce The Fighter - O NPC Lutador

    Informações Bruce The Fighter é um NPC, mas também pode lutar contra outros jogadores, servindo como um ótimo boss de quests; A luta é inicada com um diálogo; Ele tem duas formas: normal e evoluída, mudando da primeira pra segunda quando chegar a uma porcentagem de vida configurável; Quando ele é derrotado, adiciona um storage (para ser usado como você quiser), itens, dinheiro e experiência; Também pode ser configurado se ele irá lutar novamente com o mesmo jogador, tendo também uma opção de exhaust; Quase totalmente configurável; São vários arquivos, então acompanhe atentamente o passo-a-passo da configuração/instalação. Códigos creaturescripts/scripts/monster1.lua creaturescripts/scripts/monster2.lua npcs/Bruce The Fighter.xml npcs/scripts/challenger.lua monsters/challenger.xml monsters/challenger_evolved.xml TAGs creaturescripts.xml <event type="statschange" name="Monster1" event="script" value="monster1.lua"/> <event type="statschange" name="Monster2" event="script" value="monster2.lua"/> monsters/monsters.xml <monster name="Bruce The Fighter" file="Meus Monstros/challenger.xml"/> <monster name="Bruce The Fighter_evolved" file="Meus Monstros/challenger_evolved.xml"/> Configuração/Instalação Na parte dos códigos, está indicado o lugar e o nome que o arquivo deverá ter. Não troque; No arquivo monsters1.lua, você pode decidir a porcentagem da vida na qual o Bruce trocará para a forma evoluída. A forma evoluída virá com essa mesma porcentagem de vida; No arquivo monsters2.lua, configure a experiência (exp), o dinheiro (money), o item e a quantidade (count) desse item que o jogador ganhará quando derrotar o Bruce. Também deve-se configurar o tempo de exhaust, como indicado no arquivo; Em Bruce The Fighter.xml, você pode definir as falas, o nome e a aparência inicial do Bruce (se mudar, não esqueça de trocar nos monstros também); No arquivo challenger.lua, escolha se o Bruce irá duelar novamente com o mesmo jogador; Nos arquivos challenger.xml e challenger_evolved.xml você definirá a força, vida e muitas outras coisas do Bruce (se tiver mudado a aparência ou o nome, deve mudar aqui também). Caso não saiba mexer nos monstros, procure um tutorial na seção de tutoriais de scripting; Ao mudar algo do Bruce, verifique o padrão e preste bastante atenção para não esquecer nenhuma parte; O storage que será mudado ao derrotá-lo é 69507, tendo valor inicial -1 (não derrotou nenhuma vez) e aumentando +1 para cada vez que o Bruce é derrotado (0, 1, 2, ...). Recomendo que o Bruce esteja em uma sala onde somente um jogador de cada vez possa entrar.
    1 ponto
  10. Eae Pessoal Tudo Bem? =D Ontem Tinha Visto Um membro aqui do Xtibia Postando Seu 1 Tópico, e Ele tava Postando Um Tutorial de como Criar um Client 100% Próprio! Mais o Tutorial Desse Membro Foi reprovado, Não tinha como ser Aprovado Pois Tava Mal Elaborado e na área Incorreta, Mais Vamos Lembrar era Ainda seu 1 Tópico aqui no Xtibia, Proxima Vez Aposto que ele vai melhorar e muito! Ai pensei Vou fazer um tutorial Da mesma BASE do dele, só que diferente Para Da a minima ideia Para quando ele for Postar Outro Tutorial. Criando um Client Próprio, Mudando Icone do Client,e Mudando Imagem de Fundo. 1º Passo >> Criar o Client Próprio 2º Passo >> Mudando Icone do Client 3º Passo >> Mudar Imagem de Fundo Para uma sua Downloads: Resource Hacker.rar PicEditor By Otservblog.rar
    1 ponto
  11. Avuenja

    [Arquivado]OTClient 0.6.4

    Fala galera tava dando uma olhadinha aqui no ékz e no repositório do OTC no github e vi que não tinha a última versão aqui... Então ai vai ela!! Informação: Versão OTC: 0.6.4 Versões suportadas pelo client: 7.6 há 10.22 Compilada por: Edubart Compilada há 7 semanas atrás, 13/novembro/2013 Imagem: For Windows For Linux Abraços, espero ter ajudado pessoal!
    1 ponto
  12. Alexclusive

    Mudança de nome

    Meus queridos X-Tibianos, mudança de nomes, fazer ou não fazer? Eis a questão! Este é um assunto que já fui muito discutido, só que na maioria das vezes a possibilidade disso acontecer sempre era negada. Pensamos melhor e decidimos dar a oportunidade para aqueles que se encaixarem em algum dos seguintes requisitos: | Se sua conta tiver mais que 5 anos? Você tem o direito de mudar.| | Seu nome é 876527637 ou algo do tipo? Você tem o direito de mudar.| | Contas antigas que criaram contas "por criar" e agora querem participar da comunidade.| | Alguma historia convincente de por que eu deveria mudar seu nome | |Você deve ser um membro ativo no fórum e ter a ficha limpa para poder fazer um pedido| Meu ponto, é que não vou fazer nenhuma mordomia para ninguém. Não posso mudar os nomes de todo mundo só por que não gostam mais do nome. Espero não ver nada do tipo: Meu nome saiu de moda, não gosto mais de dbz e etc... Em seu comentário, você deve por: Motivo: Novo nome: Se explique bem e verifique seu nome duas vezes antes de me mandar qualquer coisa. Irei alterar apenas uma ÚNICA vez o nome de cada membro. (Estarei fazendo as alterações de acordo com o que meu tempo me permitir.) Atenciosamente, Alexandre.
    1 ponto
  13. Wiliner

    Recrutamento

    Seja bem-vindo ao nosso tópico de recrutamento. Estamos em constante desenvolvimento e evolução, pra isso necessitamos de pessoas qualificadas e de grande potencial para integrar em nossa equipe como estagiário. Mas antes de se candidatar e mostrar seu formulário lembre-se: Você estará concordando em auxiliar, e executar o serviço proposto, obedecendo prazos e estimativas da administração da equipe Elënor. Formulário: Nome completo: Idade: Área desejada: Experiência: Trabalhos: Contato: Comentário (Opcional): Caso haja dúvidas relacionadas ao projeto ou qualquer outro que não esteja relacionado ao tópico de recrutamento, por favor, envie uma MP. Equipe Elënor.
    1 ponto
  14. Votação, A melhor Sprite #1 Premiação: 1° Lugar- 5 Reps + Medalha. 2° Lugar- 2 Reps. 3° Lugar - 1 Rep. Primeiramente, tivemos uma boa participação neste concurso e gostaria de agradecer a todos que participaram e convido aqueles que não, para participar das próximas edições de concursos na seção. Vamos às regras da votação: Trabalhos: Autor. A = Autor. B = Autor. C = Autor. D = Autor. E = Autor. F = Autor. G = Autor. H = Autor. I = Aqueles que quiserem complementar em seus comentários o porque de estarem escolhendo o trabalho do "Autor. X", o comentário será muito bem vindo. Votação: Liberada Boa sorte à todos.
    1 ponto
  15. vital900

    Escolinha de mapping.

    Ta afim de participar? É fácil.. Baixe esta área, edite a seu gosto me envie [Via Mensagem Privada].. Caso você seja selecionado a ser meu aluno, entrarei em contato. Informar na MP a versão usada; Postar foto do mapa [postando imagens corretamente]; O mapa abaixo esta na versão 8.70. Obs: Vocês podem estar enviando o mapa até o dia 10/02/2014
    1 ponto
  16. wreymar

    Precisando de Uma Avaliação

    Eae Pessoal Tudo Bem..? Como a Maioria aqui Já sabe Tou começando agora nessa Área de Designer, e esse Apenas é meu 3 Post aqui na Área de Designer.. Venho aqui Hoje Para Postar umas Imagens Que Tou editando Para um Blogger de um Amigo meu e tou precisando que os Membros do Xtibia mim digam como está as Imagens... Lembrando, Essas Imagens é para um Blogger de Pokemon e vai ser em relação as quests, Logo em baixo de cada Imagens vai ter as informações da Quest.... Ex: Local,Level,Premio e Etc. Olha outra da fire ae > Não sei qual está Mais boa Avaliem e Essa ai fiz Brincado '' suausasauhsuh Não tinha nada para fazer... =D
    1 ponto
  17. FabioDias

    Titans Baiak 24h

    TITANS BAIAK DEDICADO 24H! olá pessoal do xtibia!! Vim Divulgar meu server 24h com dedicado pago por 3 meses! Servidor é Novo, Promoçoes donates!! Intao vamos lá!! characters! SERVER 8.6 PORTAS 7172 - Rates Stages!! rateExperience =800 ip> Titans.servegame.com rateSkill = 110 rateMagic = 100 rateLoot = 45 rateSpawn = 2 IP> Titans.servegame.com Eventos! -Dota -Castle war -zumbie event ( irei por) -coliseum <( irei por) Com Bastante fast! Mapa baiak-lero! go ser top! site do server --> http://baiak-lero.webnode.com/
    1 ponto
  18. AnneMotta

    [Life Thread] Maarkiin Voltandoajogar

    Me recuperando aqui
    1 ponto
  19. vá em data/lib/level system.lua, procure por: setPlayerStorageValue(pk, 1007, nick) doCreatureSetNick(pk, nick) e adicione, entre eles, if not hideBoost then boost = getItemAttribute(item, "boost") or 0 nick = nick.." [+"..boost.."]" end ficando setPlayerStorageValue(pk, 1007, nick) if not hideBoost then boost = getItemAttribute(item, "boost") or 0 nick = nick.." [+"..boost.."]" end doCreatureSetNick(pk, nick) Créditos: zipter98
    1 ponto
  20. rDs7008

    OT Server Digimon

    Quer falar de copyright e não sabe nem escrever. Fica falando que tem direitos autorais e blablablá, mas isso só é válido se elas forem registradas na biblioteca nacional (que é bem burocrático e não é de graça, acredito eu), sendo que não foi nem você que fez as sprites (foi o Insaend). Se preocupa mais em fazer teu joguinho do que ter medo de ripping. Otserv é Ripping. Assim como você, parecendo hipócrita falando disso aqui, pois usa só sprites "ripadas" no seu projetinho Selenyum.
    1 ponto
  21. IvanAppel

    Proteger .spr

    Aaa cara não quero editar o .spr eu quero fazer pra que ninguém consiga descompilar ¬¬ apesar de que se eu quisesse editar meu spr sem perder o antigo é só copiar e dexa onde ta memo ¬¬
    1 ponto
  22. IvanAppel

    Proteger .spr

    Mais facil compilar um OTC que ninguém sabe descompilar mesmo '-' Pode fexar.
    1 ponto
  23. Venom2

    Seu último mapa - your last map

    Uma mina que eu fiz para o http://efferus.info/, o servidor está online para quem quiser conferir. http://www.xtibia.com/forum/topic/225776-87efferus-rpg-lowrate-mapa-e-sistemas-proprios/
    1 ponto
  24. Rafael Gomes

    [Life Thread] Transloko

    Paw and fur é uma sociedade de caçadores, concluindo uma task você recebe pontos da sociedade, com estes pontos você evolui o seu rank na sociedade. É como se fosse um emprego e você fosse subindo de cargo a cada quantia de ponto ganho. Quando você chega num rank/cargo alto para o seu level, ele não vai dar mais pontos de rank e sim pontos para boss. Com esses boss points você pode escolher um boss aleatório para enfrentar. Se eu estiver errado, por favor alguém me corrija.
    1 ponto
  25. Em svargrond você pode concluir a task de gargoly bem rápido. Lá tem um corredor com stone golens e gargoly, ótimo para task.
    1 ponto
  26. Isso e muito facil.... Vai na pasta do seu Server e vai em (data/movements) e abre o movements.xml é Cole essa Tag, de preferencia na area especifica do item que você vai botar. Vermelho - ID do Item Amarelo - Tipo do Item (head=helmet)-(armor=armor)-(legs=legs)-(feet=boots)-(shield=shield) Verde - Level para usa o item Azul claro - O ID das vocation que vão poder usar o item Para fazer que a crystal Wand hita 100 a 140, primeiro a sua ta errada ai, a certa tem que ser assim: Tirando o <attribute key="weaponType" value="rod" /> Agora va em weapons.xml e cole essa tag la, na area das Wand: <wand id="2184" level="42" mana="13" min="100" max="140" type="death" event="function" value="default"> <!-- Crystal Wand --> <vocation id="2"/> <vocation id="4"/> </wand> Vermelho - Id da Wand Verde - Level necessário para usar a Wand Marrom - Mana que gastara quando a Wand soltar um elemento Azul claro - Minimo que a wand Hitara Azul escuro - Maximo que a wand Hitara Amarelo - Id das Vocation que poderam usar a Wand
    1 ponto
  27. AnneMotta

    [Life Thread] Maarkiin Voltandoajogar

    +1 task de crocodile completa, bora fazer mais uma... talvez umas 5h eu acabe 3ª task de Crocodile Completa, 3 Boss Points por enquanto! Lista de tasks completas adicionada ao Post Principal!
    1 ponto
  28. Codeur

    Logo

    Ta aqui amigo espero que goste o/
    1 ponto
  29. Refe

    H.M.O.O - Harvest Moon Origins Online

    Estamos Começando com os Sistemas, Cada atualização irei postar aqui. @Edit Adicionado Video de Amostra v0.9 @Edit 2 o Mapa será Baseado Neste: hmm legal mas cuidado pra não ficar muito quadrado .Bom, é só BASEADO, ou seja iremos adicionar mais coisas, e será 3x Ilhas, 1 para cada jogo (Baseada no mapa do Jogo não Igual)
    1 ponto
  30. beto06

    [Show Off] Beto

    http://3.imgland.net/9w5WP.png
    1 ponto
  31. Codeur

    Avatar

    Bem, eu me dispus a esse kkkk, espero que goste ;p
    1 ponto
  32. Name: Willian Ferreira Cargo: Mapper Idade: 15 Trabalhos/se não fez nenhum deixe em branco: ├ 1º Templo └ 1º Loja E-mail: willian_ferreira98@hotmail.com Skype: willian.ferreira98 Facebook: facebook.com/willian.ferreira.737
    1 ponto
  33. Aiga

    Seu Ultimo Sprite.

    Mais uma espada, até conseguir aprender A.A e contraste:
    1 ponto
  34. Desnecessario

    Seu Ultimo Sprite.

    Tentativa fail de um goblin "original"
    1 ponto
  35. Lordfire

    Map loader errors

    Coloca o nome desses arquivos, então, salva e dá um F5 pro mapa recarregar. Depois confere os spawns e houses, se estiverem na posição certa, tá pronto. Se não, vais ter que procurar isso, aí não posso ajudar.
    1 ponto
  36. vital900

    Map loader errors

    para fazer oq o LF falou, configurar etc.. vc deve configurar o seu XML de acordo com o Otb do seu server.. para fazer isto de ctrl+P no seu mapa (abrindo a imagem q vc mostrou).. dado isto configure o external housefile de acordo com seu house XML.. e seu spawnfile de acordo com seu spawn XML.. pronto.. vc nao terá mais o erro apresentado..
    1 ponto
  37. FabioDias

    [Show Off] Meu Trabalho Xtibia <3

    MEUS Trabalho!! Galerinha Criei esse topico para divulgar o meu trabalho! pois estou criando mapas e editando para amigos.. pois criei um topico disendo que estou ajudando em criaçao de mapas,editaçoes e um amigo nosso do xtibia pediu para mim criar um mapa propio para ele! pois estarei postando a fotos do mapa que eu fis especialmente para nosso amigo Leoprotons! -Criei 3 Caves em 1 -entre outras :>>> Prints do mapa <<<:
    1 ponto
  38. Por vc Né?? Vc Não viu que Ta ajudando os Membros...?
    1 ponto
  39. FabioDias

    [Show Off] Meu Trabalho Xtibia <3

    pois eu fis rapido porq stava sem tempo, mais ja consertei! irei postar as fotos! Pois Ja arrumei a cidade! eu fis rapido pois estava compressa mas agora ja arrumei mais menos
    1 ponto
  40. Codeur

    Help em Imagem.

    oi? ocorreu um erro com o tutorial ou o rep+ se for o rep não faço questão ;p
    1 ponto
  41. AnneMotta

    [Life Thread] Maarkiin Voltandoajogar

    Agora eu gostei Novos itens adquiridos/comprados: + ---------------------------------------------- Task de tarantula completa!
    1 ponto
  42. Use esse Systema.... Primeiro va até Nome da pasta/Data/actions/scripts e crie um arquivo.lua chamado "sistemavip.lua" Citar Os textos que estao em AZUL e o action ID que voce colocara no piso , Depois que fizer isto salve e feche! Depois abra a actions.xml adiciona isoo! Citar o ITemID coloque o ID de o item que voce quer que adicione a VIP! Agora vamos adicionar as movements! Va até Nome da pasta/Data/movements/scripts e crie um arquivo.lua chamado "sistemavip.lua" Citar Depois abra a movements.xml adiciona isoo! Citar Pronto sua VIP esta pronta! Ajudei? REP+
    1 ponto
  43. Benny

    Mudança de nome

    cara, n tenho um motivo sério só acho que flinkton ia ser melhor, pq ninguém me chama de benny --' =)
    1 ponto
  44. masdead

    Mudança de nome

    Motivo: Criei esse nome a muito tempo para tirar minhas dúvidas mas com o tempo gostei do fórum e comecei a participar ativamente mas por preguiça (no começo) eu não troquei ai depois que consegui alguns rep ai que eu não iria criar outra conta mesmo (e que merda de nome é DuMal? huehue) Novo nome: ThiagoCarvalho ou Thiago Carvalho Obrigado
    1 ponto
  45. travelnpc.xml <?xml version="1.0"?> <npc name="Travel NPC" script="data/npc/scripts/travelnpc.lua" walkinterval="1000" floorchange="0"> <health now="100" max="100"/> <look type="155" head="115" body="76" legs="76" feet="83" addons="3"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|. Posso levar voce para {carlin} ou {thais}!" /> </parameters> </npc> travelnpc.lua local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local a = { levelcidade1 = 30, -- Level que necessita para ir na cidade 1 levelcidade2 = 60, -- Level que necessita para ir na cidade 2 itemcidade1 = 2392, -- Item que necessita para viajar para cidade 1 itemcidade2 = 2190, -- Item que necessita para viajar para cidade 2 goldcidade1 = 1000, -- Gold que precisa para viajar para cidade 1 goldcidade2 = 2000, -- Gold que precisa para viajar para cidade 2 poscidade1 = {x = 168, y = 57, z = 7}, -- Posição da cidade 1 poscidade2 = {x = 168, y = 58, z = 7}, -- Posição da cidade 2 } if msgcontains(msg, 'carlin') then if getPlayerItemCount(cid, a.itemcidade1) >= 1 then if getPlayerLevel(cid) >= a.levelcidade1 then if getPlayerMoney(cid) >= a.goldcidade1 then doTeleportThing(cid, a.poscidade1) doPlayerRemoveMoney(cid, a.goldcidade1) selfSay('Você foi teleportado para carlin!', cid) else selfSay('Você precisa de '..a.goldcidade1..' gold coins para viajar para {carlin}.', cid) end else selfSay('Você precisa ser '..a.levelcidade1..' para viajar para {carlin}.', cid) end else selfSay('Você precisa de uma '..getItemNameById(a.itemcidade1)..' para ir até {carlin}!', cid) end end if msgcontains(msg, 'thais') then if getPlayerItemCount(cid, a.itemcidade2) >= 1 then if getPlayerLevel(cid) >= a.levelcidade2 then if getPlayerMoney(cid) >= a.goldcidade2 then doTeleportThing(cid, a.poscidade2) doPlayerRemoveMoney(cid, a.goldcidade2) selfSay('Você foi teleportado para thais!', cid) else selfSay('Você precisa de '..a.goldcidade2..' gold coins para viajar para {thais}.', cid) end else selfSay('Você precisa ser '..a.levelcidade2..' para viajar para {thais}.', cid) end else selfSay('Você precisa de uma '..getItemNameById(a.itemcidade2)..' para ir até {thais}!', cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Eu testei e funcionou, caso algum erro basta avisar
    1 ponto
  46. zipter98

    Trader NPC

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