Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 07/04/10 em todas áreas
-
Fazendo a Superfície do seu Mapa Talvez mais de 70% de um mapa, fique na superfície. Ela é composta por cidades, locais para caça, montanhas, algumas construções e florestas... Mas e o resto? Provavelmente todos já jogaram Tibia (*), e já perceberem que em uma viagem de Carlin para Thais, uma boa parte do mapa não tem nada! Ou melhor, não tem nada mais que alguma decoração, e é exatamente isso que vou ensinar a fazer: A superfície do seu mapa, as partes teoricamente inúteis, mas que fazem muita diferença no seu mapa Parte #1: As Bordas. O problema mais comum nesta primeira parte são as famosas bordas quadradas: Na foto acima temos um exemplo bem nítido de bordas quadradas, o que não é muito comum de se encontrar por aí, mas que AINDA existe, infelizmente. Talvez você esteja pensando: "Mas estas bordas NÃO estão quadradas!" Realmente... elas não estão quadradas, mas isso é o que eu chamo de borda "escadinha", aonde o mapper traça uma diagonal em uma direção e faz as bordas. Não é uma borda ruim, mas hoje em dia, o que conta é a diferença, então você pode ser um pouco mais ousado... Nesse caso temos uma borda bem irregular, nada geométrico. Assim seria uma borda IDEAL, mas uma dica: Não exagere demais! Bordas muito irregulares também são feias. Parte #2: A Vegetação. Outra parte muito importante de uma superfície, se não a mais importante: A vegetação. Ao contrário do que muitos pensam uma paisagem natural não depende exclusivamente de árvores. Uma grande planície composta por arbustos, árvores, pedras e pedregulhos pode ser um grande diferencial. Na foto abaixo, coloquei algumas árvores espalhadas randomicamente pelo mapa, que é o que vemos em GRANDE parte dos mapas atualmente. Sim, ainda costumam errar muito neste ponto... Na imagem acima vemos um exemplo TOTALMENTE errado de vegetação, até para uma floresta: Árvores em todos os pontos do mapa e com intervalos regulares (quase todas as árvores têm o mesmo espaçamento entre uma e outra). Isso é um erro extremamente comum. O Certo seria basicamente isso: Pouca quantidade de árvores (lembrem-se: não estamos fazendo uma floresta), separadas em intervalos irregulares e com quantidades diferentes de árvores em cada "grupo". Queria deixar claro que essa distribuição de árvores não é regra, mas temos que pensar que nenhum jardineiro plantou essas árvores, logo uma distribuição irregular seria muito mais correta. E obviamente, uma superfície não é composta apenas de árvores, também encontramos alguns arbustos e plantas baixas: Lembrando, como no exemplo das árvores, nada de espaçamentos regulares entre os arbustos! Mas não podemos esquecer também das rochas e pedras! São essenciais no seu mapa e dão um toque muito bonito. Como nossa superfície é imperfeita, adicionei outro tipo de solo, um rochoso (você também pode usar outros tipos de solo: como outras variações de grama e terra). Mas também não exagere! Nossa superfície está quase pronta, ela já tem uma vegetação muito bem distribuída, pedras e solo diferenciado. Mas ainda existem algumas áreas "peladas", por isso adicionei outros tipos de plantas, flores e até um tronco: Finalmente nós podemos finalizar nossa superfície, colocando os detalhes finais: Randomizar o solo e adicionar aqueles pequenos tufos de grama. Obs.: Escolhi randomizar a superfície depois de acabar a vegetação, mas isso varia de pessoa pra pessoa. Pronto! Sua superfície está pronta! E agora que você já aprendeu como fazer, poste aqui o resultado. Se você ainda acha sua superfície monótona e quer colocar algo diferente, você pode adicionar uma montanha, uma floresta mais densa ou até uma casa abandonada. E lembre-se: Partes inúteis no seu mapa são muito mais do que você imagina! Espero que vocês tenham gostado, Abraços.2 pontos
-
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: Vodkart1 ponto
-
Olá XTibianos, Galera eu vi que tinha muita gente querendo saber como colocar novos sprites no servidor, até achei alguns tutoriais mas não tinham imagens e eram muito vagos, então resolvi montar esse bem explicado e com imagens para facilitar o entendimento de vocês. Inicio: - Neste tutorial, você irá aprender como extrair, modificar e comilar o arquivo Tibia.spr. • Vamos trocar esse sprite - • Por esse - 1º Passo - Donwload e Instalação; - Após baixar o SprEditor extraia ele para uma pasta a sua escolha . - Após extrair vá na pasta do seu Tibia e copie o arquivo Tibia.spr para a mesma pasta onde esta o SprEditor. 2º Passo - Conhecendo o programa; - Para extrair as imagens do arquivo Tibia.spr clique em "Extract" e para compilar as imagens *.Bmp para *.Spr clique em "Compile"; 3º Passo - Extraindo; - No programa clique em "Extract" - Agora note q foi criada uma pasta chamada "Sprites" contendo todas as imagens. 4º Passo - Imagens e suas Propriedades; - Para mudar as imagens abra a pasta "Sprites" e note que as imagens são todas 32x32 e tem extenção *.Bmp. - A cor rosa nas imagens indica transparência. - Agora mude a imagen sem ultrapassar o limite de tamanho (32x32). - Depois de mudar e salvar as imagens que voce quiser vamos para o quinto passo; 5º Passo - Compilando; - Agora va no programa e clique em "Compile" e espere o processo terminar. - Perceba que ja esta sendo criado um arquivo chamado "MyTibia.spr" Pronto agora voce ja tem seu Tibia.spr editado e compilado pronto para usar! PS: Comentem e digam o que acharam!1 ponto
-
Demonic Ots - Feito Por Mim Recuse Imitações! Site Do Demonic Ots: Aqui Quests Funfando 100% Demon Helmet The Inquisition Pits Of Inferno Anihilador Demon Legs Entre Outras.. O que à de Novo! Novos Itens 8.54 100% Novos Objetos 8.54 100% Monsters 8.54 100% Novo Outfit Warmaster Pz Icone... Black Skull Cidade VIP..Com Tps Quest System. Vai No Seu Tibia Em Quests Que Vai Ta La a Quest Que Você Fez. Npc Banker funfando 100% sem da bug Amulet of Loss, bug de cair o server quando morrer consertado Debug nos Teleports consertado Novo Executavel Adicionado !vip Adicionado !ranks Adicionado !spells Sistema de Noticias, basta escrever o texto no noticias.txt do ot e digitar !notice no jogo Quando a Medusa morre aparece o corpo certo Fotos: Outfit Warmaster (Female, Male) Arena Teleports Templo Treiners Cidade Cidade VIP Deposit Senha do God: god/god Download: Aqui Scan: Aqui Espero Que Gostem.1 ponto
-
[Spell]Splash!
onokamisama reagiu a groku por um tópico no fórum
Essa é uma magia que ao soltar na area vem alguns espirros d'agua! :forward:Vamos Ver Como É A Magia Primeiro? :forward: Colocando nos spells.xml,procure uma linha e cole isso: :forward: Vá em scripts e crie 1 arquivo.lua que tenha o seguinte nome: Liquidagem :forward: Abra ele e cole isso: :forward: Explicação: Acha que acabou??? Voce acha q esse pool vai fica pro resto da vida no chao '-'? Procure o id 2016 e substitua por isso: Azul:=É o tempo(em segundos) que o liquido no chão dura! Está pronta sua magia :biggrin: Obs.: Foi Testada Com Sucesso em Thyrania Protocolo:8.10 + provavelmente funciona em versões superiores à 8.00 :button_ok: Gostou Da Magia?Dê reputaçao :button_ok: Ou se preferir simplesmente COMENTE :positive: vlw pela atenção1 ponto -
Ktibiax® Tibia Launcher [2.1] - Ip Changer [7.6 À 8.60]
michaellol reagiu a keyrox por um tópico no fórum
Confira o novo Ktibiax® Tibia Launcher Update (Junho/2010) Uma nova e empolgante interface Suporte para as versões até 8.60 Melhorias e correções de bugs no Lag checker Melhorias no consumo de memória Não será mais necessário realizar nenhuma instalação, KTibiaX agora é portable Não confie em links do rapidshare, easyshare ou afins. Baixe o programa apenas do googlecode ou codeplex! [Download do Programa] KTibiaX® Launcher Setup 2.1.3 .Net 20 (Para quem possui o .Net Framework 2.0) KTibiaX® Launcher Setup 2.1.3 .Net 35+ (Para quem possui o .Net Framework 3.5 ou posterior) [Código Fonte / Suporte] KTibiaX® Launcher CodePlex KTibiaX® Tibia Launcher 2.1 [Modo de Distribuição] Open Source [Linguagem de Construção] C# 3.5 [suporte para as versões] 7.6 - 7.92 - 8.0 - 8.10 - 8.11 - 8.20 - 8.21 - 8.22 - 8.30 - 8.31 - 8.4 - 8.41 - 8.42 - 8.50 - 8.54 - 8.55 - 8.57 - 8.60 [iPChanger (Server / Port)] Funcionalidade conhecida. Permite que você altere o ip do login server, para que você se conecte em OTServers. Também funciona com o Tibia Oficial (apenas não selecione nenhum servidor). [status Checker & Lag Measurement] Essa funcionalidade permite que você cheque se um determinado servidor está online e o Lag deste servidor. Obtém informações completas sobre o OT. Medidor de lag 100% funcional. Você está correto, até 250 (ainda verde no medidor) o server é "jogável". Acima disso (parte vermelho/alaranjado no medidor) significa que o servidor não é recomendável ou simplesmente não suporta mais jogadores. Uma boa aplicação para esta funcionalidade seria medir o lag do servidor quando o cliente começar a travar ou "freezar" demais, dessa forma você poderia identificar se o problema está no servidor ou na sua internet. []'s [OTServer Maps Distinct] Mantenha separados os Mapas dos OTs que você joga. Evitando a substituição e a bagunça nos mapas, causada pela utilização de varios servidores. E manteha os mapas oficiais intactos. Não é necessário alterar nenhuma configuração para que o ktibiax separe os mapas. Em opções avançadas existe um campo com o diretório onde os mapas de ot serão salvos e uma outra opção (que já vem marcada) que permite que os mapas de ots sejam separados. Dessa forma o programa criará uma pasta para cada ot que vc jogar e salvará os mapas na pasta deste ot. Assim quando você jogar neste ot novamente, o programa irá dizer ao tibia que os mapas que precisam ser usados são os mapas já salvos na pasta do ot. []'s [safe Multi-Client] Permite que você utilize a função de Multi-Cliente para qualquer versão 8.* sem risco de ser banido. Esse MC é indetectável, pois eu não modifico o cliente! Apenas fique atento, não logue vários MC's ao mesmo tempo pois a CIP grava registros dos jogadores que fazem isso. Aguarde ao menos 2 minutos entre os logins de seus chars para não correr risco de ser banido. []'s [server Address Storage] Salve informações de seus servidores favoritos e recupere quando quiser. [Client & Version Managment] Salva os clientes e suas respectivas versões. E sempre que vc selecionar um servidor, o cliente será sugerido automaticamente. [Graphics and FrameRate] Permite que você defina um Graphics Engine e que vc personalize o Frame Rate antes de abrir o cliente. Disponível para versões 8.* [Tibia.cfg Managment] Você pode salvar diferentes versões do seu Tibia.cfg com suas definições favoritas (Hotkeys, configurações, gráficos, etc.) para cada vocação, e usá-los para abrir os clientes quando quiser. [RSA Key Writer] Possibilita a personalização da chave RSA de login para OTServers. [Advanced Options Managment] Você pode definir qualquer uma das opções avançadas do sistema, e suas preferências serão salvas. [Form Skins] Você pode escolher entre os vários skins disponíveis. Não confie em links do rapidshare, easyshare ou afins. Baixe o programa apenas do googlecode ou codeplex! [Download do Programa] KTibiaX® Launcher Setup 2.1.3 .Net 20 (Para quem possui o .Net Framework 2.0) KTibiaX® Launcher Setup 2.1.3 .Net 35+ (Para quem possui o .Net Framework 3.5 ou posterior) [Código Fonte / Suporte] KTibiaX® Launcher CodePlex []'s1 ponto -
Este era apenas uma versão BETA, o oficial ja está lançado, para conferir Clique aqui. Tópico Fechado :button_cancel: Abraços.1 ponto
-
Bom Estou cansado de ver scripts de remover skulls e nenhum tem os 3juntos...bom entaum resolvi eu mesmo fazer,e bem caprixado sem nada de coisas disnecessárias... Vamos ao que interessa! Crie Um arquivo skulls.lua Na pasta Talkactions/scripts: e Cole Isso Dentro : Pronto.. agora Cole está Tag No talkactions.xml: Pronto! Script 100% By Gean Riot(eu). espero que gostem,quem curtiu a iniciativa da repp+++! GOGO fuiiz1 ponto
-
[Action]~Alavanca (Resolvido)
Luquitosmauriz reagiu a felzan por um tópico no fórum
Demorei, sou novato ainda, tenho que ficar procurando as funções e as ações... eu testei e re-testei, e agora ta funcionando. no data>actions>scripts copei e cole qualquer arquivo .lua retire tudo de dentro e cole isto data>actions>actions.xml1 ponto -
Talkaction
RulezKnight reagiu a davialves por uma questão
/addskill NOME PLAYER,level,450 -- no caso você queria 450.1 ponto -
Legal velho, ja tinha visto isso no Rozinx server. Abraços1 ponto
-
[Action] Trocando Crystals Por Moeda Vip
Henrique Moura reagiu a mapperneto por um tópico no fórum
Então man o script ta otimo ta de parabens mais tem o problema depois que vira a "moeda vip" ele não volta a ser crystal coin você prescisa faze isso no changecoin pra fica mais easy :smile_positivo: mais do resto esta de parabens-1 pontos -
Quer Aprender A Ser Scripter?
Henrique Moura reagiu a Black55 por um tópico no fórum
Muito bom o post vai ajuda mta gente q presisa aprender scripting ;D-1 pontos