Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 07/06/10 em todas áreas

  1. 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
    2 pontos
  2. Marcell

    Quick-List (8.6 Até 8.62)

    Quick-List Oque é uma quick-list ? R- é uma lista com os melhores tópicos da area em um só. Download OTServers 8.62 The Crystal Server V0.2.0 Sleeper Map 0.6 Download OTServers 8.61 We Do Server 0.1.2 Download OTServers 8.6 Mix Yourots 1.0.0 Alissow Ots 4.11 [11/07/2010] 8.6 Completo! Snowz Thyrania 3.1 The Forgotten Server (Crying Damson) Real Server 3.2 The Subwat® Riot Server Baiak Yurots Download Utilitários 8.6 até 8.62 Tibia Client 8.6 Comedinha IPChanger Tirus Ip-Changer Asprate's Multi Ip Changer atenção: apenas tópicos e ots confiantes estarei postando, NENHUM servidor que eu postar aqui na lista, tera virus, portanto, não adianta vir falando: tem virus em tal ot, porque eu passo scan em todos e revejo. ao longo do tempo. iremos adicionando mais downloads...até!
    1 ponto
  3. - Mix Yourots - ~||0.0.1||~ *Contém apenas 2 cidades por enquanto. *Área de teleports para as hunts. *Sistema de Prisão. *Por inquanto temos as principais quests como: Pits of Inferno (POI), Demon Helmet, Annihilator, Inquisition, entre outras. *Soft boots pode ser recarregada pelo NPC Jenny que fica ao sudeste da Mix City. *Itens e monstros do update estão 100% completos. *Magias totalmente balanceadas seguindo o padrão do Tibia Global. *Addons do update estão 100%. *Sistema de voar (Créditos ao Forcera). *Distro TCS modificado com amplas proteções - Totalmente Estável. *Highscores. *Bed System 100%. ~||0.0.2||~ *Agora você pode logar com 4 protocolos do Tibia: 8.54 | 8.55 | 8.56 | 8.57 *3 Cidades (Mix City - Vip City - Thunder City). *Nova área de Teleports. *MEGA reformulação da cidade principal e suas proximidades com o máximo de RPG. *Quests que não funcionavam, agora estão 100%. *Mix City com 51 casas a disposição. *Vip System (Comando para Player: !vipdays | !buyvip || Comando para GOD: /addvip | /delvip) *Básico sistema de montaria. *Reformulação de algumas Hunts. *Reformulação da entrada da Pits of Inferno Quest (POI). *Algumas hunts para a cidade vip. *Balanceamento das vocações. *Alguns bugs foram corrigidos. ~||Patch1||~ *Erros no Vip System arrumados. Agora está 100%. ~||0.0.3||~ *Nova área de Teleports. *MEGA reformulação da cidade principal e suas proximidades com o máximo de RPG. *Reformulação de algumas Hunts. *Novas caves. *Tiquanda foi totalmente reformulada com o máximo de RPG. *Todas as caves estão com o máximo de RPG. *Modificaçõs no distro, está 100% estável. *Quest de pequeno port agora estão funcionando. *Bug no npc que não vendia rods e wands. *Pequenos bugs corrigidos. *Inquisition Adicionada. *Protocolo 8.60. Não temos ainda as features do update pois a cipsoft colocou uma proteção, em breve já estará tudo completo. ~||0.0.4||~ *Protocolo 8.60 *Todos os possíveis debugs foram arrumados. *Todas as features do update incluindo items, outfits, monsters, novo sistema de potions e runas foram adicionados. *Items novos funcionando perfeitamente com seus atributos. *Sistema de voar foi retirado. *Alguns bugs foram arrumados. ~||1.0.0||~ :star: *Novas áreas de hunt. *Duas novas cidades: Saaha e Icya *Demon Oak Quest foi adicionada. *Novas hunts na Vip City. *Alterações no distro. *Várias hunts foram reformuladas. *Thunder City foi desativada pois iremos reformular ela completamente. *Pequenos bugs foram corrigidos. - Fotos: *Templo *Saída sul de Mix City. *Npc vendedor de food. *Depot *Annihilator Quest *Entrada da cave de Demons. *Hydras *Barco para a Vip City. *Demon Helmet Quest *Inquisition Quest *Algumas das features do update 8.60 *Nova city: Saaha *Nova city: Icya *Nova hunt de hydras *Ghastly Dragons igual ao Tibia Global *Demon Oak Quest - Account do GOD Mix: Account: god Password: god Download: Clique aqui para fazer o Download Scan: Clique aqui para ver o Scan Obs: Encontrou algum bug? Relate neste tópico, para que possamos melhorar a cada dia o Mix Yourots. Portal Mix Soft
    1 ponto
  4. MatheusGlad

    [Download]Quest Maker E Como Usar

    Fikei em duvida se postava na aprovaçao de tutorial ou downloads, pois o meu contem os dois. Quest Maker Download: 4shared Virus Scan Virus Total Ps: So 1 antivirus achou, acho que inofensivo. Como usar: Ele e um programa muito simples de se usar porem algumas pessoas nao sabem, irei explicar. Apos baixar o Quest Maker bote-o na pasta "actions/scripts" do seu otserver. Em seguida,abra-o e espera carregar. Preencha todos os campos do quest maker. Use a ss como exemplo 1 - Nome do Arquivo.lua onde ficara o script (dentro da pasta aonde botou o Quest Maker) 2 - Comentarios (Nao ira modificar em nada seu script) 3 - Unique ID que voce vai botar no bau da quest.(Sempre botar um numero qualquer que n tenha em actions.xml) 4 - Storage ID. (Pode ser o mesmo do Unique ID, mais nao afetara se for diferente) 5 - Mensagem que ira aparecer apos completar a quest. 6 - Botao que cria o script em sua pasta. 7 - ID do item que ira dar na quest. 8 - Apaga todas as suas configuraçoes feitas no programa. 9 - Cria Tag que voce ira botar em actions.xml 10 - NAO USE ESTA BUGADO ELE TE DA OS IDS ERRADOS 11 - Aonde aparece sua tag criada pelo botao numero 9 Criando o Bau: Agora abra o seu mapa com o seu Map Editor e crie um bau. Adicione o UniqueId que voce colocou no Quest Maker. Salve e aproveite! Quest Criada com Sucesso Tutorial by MatheusMkalo, exclusivo para o Xtibia Copia Ilegal,PROIBIDA Sugestoes,Duvidas,Elogios aceitados nesse topico ou via MP.
    1 ponto
  5. joaohd

    [Arquivado]X-Tibia Scripting Environment

    Então... aqui estou novamente com mais um fruto de meus estudos em LUA. Recentemente fui apresentado à um novo ambiente de programação em LUA, o wxLua. Bom, mas primeiro, devemos saber o que é o wxLua: wxLua é um ambiente de programação LUA que tem como função principal a criação de uma interface gráfica para aplicação de scripts. Abaixo segue um exemplo do que pode ser feito com o wxLua: Obs: O script contém 352 linhas, podendo "bugar" o layout. E também algumas fotos do programa: Como é a primeira versão e ainda não sei muito sobre o assunto, o programa ficou bem básico, contendo apenas as funções: Arquivo ► Novo, Abrir, Salvar, Salvar como e exit Editar ► Copiar, Colar, Recortar, Desfazer, Refazer Ferramentas ► Funções, Executar Info ► Sobre o programa Link do Scan: Scan Link para download: X-Tibia Scripting Environment.rar Ps: Algumas pessoas podem obter um erro devido à falta de lua5.1.dll. Caso aconteça, basta copiar a dll de algum servidor para a pasta do programa. Bom, é isso. Aguardem novas versões... Agradecimentos: MatheusMkalo, Socket flw
    1 ponto
  6. Koddy

    [Ext] Beige Pavement / "new" Wooden Floor

    Saudações XTibianos! Enfim, após um longo período sem novidades e por falta de pedidos, venho hoje trazer duas novas Extensions (extenções) para o seu RME. É o piso bege "Pavement", e aquele "Wooden Floor" mais claro. Lembrando que o autoborder de ambos só fica aparecendo em cima de certos pisos, como o apresentado na figura abaixo. Mesmo com o autoborder desativado, a extension do Pavement é muito útil pois com ela o piso fica aleatório ao configurar, e não é mais preciso colocar piso por piso para diferenciar. [EXT] Beige Pavement / "New" Wooden Floor Começando... Em Meu Computador (no caso o seu), vá em C:\...\Remere's Map Editor\data\(versão). Lá você utilizará três arquivos: "tilesets", "grounds" e "borders", então vamos por partes. OBS: Para facilitar a "abertura" do arquivo clique com o botão direito, vá em "Abrir com", e selecione o programa desejado, o Bloco de Notas, que é o mais simples e o mais comum. Você encontrará algo parecido com isso: tilesets.xml <materials> <!-- TILESETS --> <tileset name="Grounds"> <raw> Pressione Control + F e procure por Town, que é o local onde você verá os dois "tiles" em seu RME. Sugiro completar da seguinte maneira: <tileset name="Town"> <terrain> <brush name="stone floor"/> <brush name="cobblestone"/> <brush name="dark cobblestone"/> <brush name="beige pavement"/> ********** <brush name="ugly cobblestone"/> <brush name="grassy cobblestone"/> <brush name="lawn"/> <brush name="wooden floor"/> <brush name="wooden floor (with border)"/> <brush name="new wooden floor"/> ********** <brush name="pavement"/> ********** Adicionar estas linhas Assim fica próximo aos outros pisos semelhantes, consequentemente mais fácil de se lembrar deles. Após preencher as linhas acima, salve e feche o arquivo tilesets.xml. grounds.xml Abra o arquivo grounds.xml com o Bloco de Notas e, logo no fim, depois de qualquer: </brush> E antes da última linha, que contém: </materials> Adicione as seguintes linhas: <brush name="new wooden floor" type="ground" server_lookid="458" z-order="110"> <item id="458" chance="1"/> <border id="998" align="outer"/> <border id="998" to="none" align="outer"/> </brush> <brush name="beige pavement" type="ground" server_lookid="10398" z-order="1610"> <item id="10398" chance="1000"/> <item id="10399" chance="1000"/> <item id="10400" chance="1000"/> <item id="10401" chance="1000"/> <item id="10402" chance="1000"/> <item id="10403" chance="1000"/> <item id="10404" chance="1000"/> <border align="outer" id="997"/> </brush> Salve o arquivo e feche. borders.xml Para finalizar, adicione após qualquer </border> as seguintes linhas (se preferir, faça no final para ficar mais fácil de alterá-las [e encontrá-las] caso necessário futuramente). <border id="998"> -- new wooden floor (by koddy) -- <borderitem edge="n" item="10406"/> <borderitem edge="w" item="10408"/> <borderitem edge="s" item="10405"/> <borderitem edge="e" item="10407"/> <borderitem edge="cnw" item="10415"/> <borderitem edge="cne" item="10416"/> <borderitem edge="csw" item="10414"/> <borderitem edge="cse" item="10413"/> <borderitem edge="dnw" item="10411"/> <borderitem edge="dne" item="10412"/> <borderitem edge="dsw" item="10410"/> <borderitem edge="dse" item="10409"/> </border> <border id="997"> -- beige pavement (by koddy) -- <borderitem edge="n" item="10418"/> <borderitem edge="e" item="10419"/> <borderitem edge="s" item="10417"/> <borderitem edge="w" item="10420"/> <borderitem edge="cnw" item="10427"/> <borderitem edge="cne" item="10428"/> <borderitem edge="csw" item="10426"/> <borderitem edge="cse" item="10425"/> <borderitem edge="dnw" item="10423"/> <borderitem edge="dne" item="10424"/> <borderitem edge="dsw" item="10422"/> <borderitem edge="dse" item="10421"/> </border> Agora é só salvar, fechar o arquivo e finalmente abrir seu RME para testar. Você poderá encontrar os atalhos em "Terrain Palette", na 'sub-sessão' "Town", assim como ilustra a imagem abaixo. É isso aí, espero que tenham gostado e peço que continue acompanhando os próximos Tutoriais de Mapping. Não esqueça de pedir o seu! Abraços, Koddy EDIT: Créditos adicionados.
    1 ponto
  7. zani123

    [Talkaction] Espiar Equipamentos

    Eu gostei desse script... ja coloquei ele num OT aqui. Seria legal se você colocasse uma função para espiar skills dos outros
    1 ponto
  8. felipedorgas

    [Encerrado] Ajudaa Ae Plxx :|

    de nada, se eu ajudei, da 1 ponto ae
    1 ponto
  9. O script ainda ficará sujeito a falhas. Você precisa de um jeito de controlar a evolução. Para convencer um monster vc precisa alterar o xml do monster e colocar para poder convencer. Fiz umas correções, mas ainda terá problemas na evolução. local function evolve(cid, oldmid, MonsterEvo) doRemoveCreature(oldmid) local mid = doCreateMonster(MonsterEvo, getCreaturePosition(cid)) doConvinceCreature(mid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Seu pet evoluiu! Parabens.") end function onUse(cid, item, fromPosition, itemEx, toPosition) local MonsterName = "Dragon Hatchling" local MonsterEvo = "Dragon" local MaximoSummon = 1 local exhaust = 180 local segundos = 60 if (getPlayerStorageValue(cid, 3278) <= os.time()) then if getPlayerVocation(cid) == 4 or getPlayerVocation(cid) == 8 then local summons = getCreatureSummons(cid) if(table.maxn(summons) < MaximoSummon) then local mid = doCreateMonster(MonsterName, getCreaturePosition(cid)) doConvinceCreature(cid, mid) doRemoveItem(item.uid,1) addEvent(evolve, segundos*1000, cid, mid, MonsterEvo) setPlayerStorageValue(cid, 3278, os.time()+exhaust) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você aingiu o limite de summons!") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não possui a vocação para chocar este ovo!") end else doPlayerSendCancel(cid, "Desculpe, você so pode sumonar novamente depois de "..exhaust.." segundos.") end end
    1 ponto
  10. Primeiro servidor 8.6 \o_ Espero que gostem do mapa. Logo novas atualizações, e mais cidades, com mais RPG! (: Sem mais, Atenciosamente, Bondx.
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...