Jump to content
Close

Search the Community

Showing results for tags 'Sitema%25252FMod'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Community
    • Rules
    • Portal
    • Resources
    • Commerce
    • Clubs
  • OTServers
    • Discussion
    • Support
    • Tutorial
    • Download
    • Code Development
    • Contests and Events
    • Form Team
    • Advertise your Server
  • Tibia and Bots
    • Discussion
  • Others
    • Playground (Off-topic)
    • Other Games
    • Advertising
    • Graphics and Design
    • Development and Programming
  • League of Legends's Geral
  • League of Legends's Suporte
  • Nto New Season's Tópicos
  • Fakes's Fakes
  • Tibia's Geral
  • Tibia's Notícias
  • Tibia's Media
  • Tibia's Life Thread
  • Computação's Geral
  • Computação's Dicas e Tutoriais
  • Computação's Suporte
  • Roleplaying's Roleplaying
  • Academia de Mapping's Quadro da Clopin
  • Academia de Mapping's Dev Area
  • Academia de Mapping's Quadro do Nolis
  • Academia de Mapping's Quadro do Namikaze
  • Styller's Tópicos

Calendars

  • Official Calendar
  • OTServs Calendar
  • Several Calendars

Product Groups

  • Advertisements in Top
  • Advertisements In Signatures
  • Advertisements in Topics
  • Others Advertisements

Categories

  • Sales Section
    • Scripting Sales
    • Codes Sales
    • Mapping Sales
    • Websites Sales
    • Design/Sprites Sales
    • Bots Sales
  • Look Jobs
  • Looking for Freelancers
  • Team Formation

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Localization


My character


Favorite OTServ


Bot preferred


Interests

Found 46 results

  1. Obrigatoriamente leia tudo! Atualizado 01/07/2014 Opa galera mais uma vez eu trazendo o melhor para todos. Hoje vou postar o sistema de Guild de Points que eu utilizo em meu OTserver, acredito que dificilmente será encontrado por ae um tão completo e sem bugs igual o que será postado logo abaixo, é um sistema completo que é utilizado pelo líder da guild executando um comando que, se tiver de acordo com as regras que seram feitas por você, todos os membros da guild iram receber os pontos uma unica vez, lembrando que quando os pontos são adicionados a um player ele não receberá entrando em outra guild e não receberá criando outro personagem na conta, resumindo ele só receberá uma unica vez na conta e com um player só. E um dos detalhes que me causava dor de cabeça era que quando um líder executava o comando, quem estava online recebia os pontos, mais quem estava offline não recebia, isso acontecia normalmente porque tem guilds que contém 50, 70, 100 players, portanto nem sempre todos estavam online. O comando só pode ser executado uma vez por dia cada guild, para não gerar processamentos desnecessários e assim um mal funcionamento do servidor. Cada administrador pode configurar seu sistema da forma que quiser, por ser um sistema muito simples, você pode bota que todos os players estejam no minimo level x, que a guild só possa executar o comando quando estiver quantidade x de players online, isso é bom porque traz um certa dificuldade para fraudes de pontos, e o sistema só vira bagunça dependendo do que você vai oferecer no seu shop guild, eu particularmente só utilizei esse comando porque muitas guilds grandes pediam pontos, eles me cobravam uma quantidade x de pontos e eu cobrava uma quantidade x de player então pra automatizar o processo e não ter dor de cabeça foi feito todo esse sistema. Se você analisar bem vai ver que tudo isso só gera mais crescimento ao seu servidor. Bom, vamos ao sistema: Em talkactions.xml, adicione a tag abaixo: <talkaction words="!guildpoints" event="script" value="guildpoints.lua"/> Na pasta talkactions/scripts faça um .lua com o nome guildpoints e dentro dele adicione os coder abaixo: GuildPointsConfigs = { ExecuteIntervalHours = 24, NeedPlayersOnline = 10, NeedDiferentIps = 6, MinLevel = 80, AddPointsForAcc = 9 } function getGuildPlayersValidAccIDS(GuildID, MinLevel) local RanksIDS = {} local AccsID = {} local ValidAccsID = {} Query1 = db.getResult("SELECT `id` FROM `guild_ranks` WHERE guild_id = '".. GuildID .."'") if(Query1:getID() == -1) then return ValidAccsID end for i = 1, Query1:getRows() do table.insert(RanksIDS, Query1:getDataInt("id")) Query1:next() end Query2 = db.getResult("SELECT `account_id` FROM `players` WHERE `rank_id` IN (".. table.concat(RanksIDS, ', ') ..") AND `level` >= ".. MinLevel .."") if(Query2:getID() == -1) then return ValidAccsID end for i = 1, Query2:getRows() do local AccID = Query2:getDataInt("account_id") if #AccsID > 0 then for k = 1, #AccsID do if AccID == AccsID[k] then AddAccList = false break end AddAccList = true end if AddAccList then table.insert(AccsID, AccID) end else table.insert(AccsID, AccID) end Query2:next() end Query3 = db.getResult("SELECT `id` FROM `accounts` WHERE `guild_points_stats` = 0 AND `id` IN (".. table.concat(AccsID, ', ') ..")") if(Query3:getID() == -1) then return ValidAccsID end for i = 1, Query3:getRows() do local AccID = Query3:getDataInt("id") if #ValidAccsID > 0 then for k = 1, #ValidAccsID do if AccID == ValidAccsID[k] then AddAccList = false break end AddAccList = true end if AddAccList then table.insert(ValidAccsID, AccID) end else table.insert(ValidAccsID, AccID) end Query3:next() end return ValidAccsID end function onSay(cid, words, param, channel) if(getPlayerGuildLevel(cid) == 3) then local GuildID = getPlayerGuildId(cid) Query = db.getResult("SELECT `last_execute_points` FROM `guilds` WHERE id = '".. GuildID .."'") if(Query:getID() == -1) then return true end if Query:getDataInt("last_execute_points") < os.time() then local GuildMembers = {} local GuildMembersOnline = {} local PlayersOnline = getPlayersOnline() for i, pid in ipairs(PlayersOnline) do if getPlayerGuildId(pid) == GuildID then if getPlayerLevel(pid) >= GuildPointsConfigs.MinLevel then table.insert(GuildMembersOnline, pid) end end end if #GuildMembersOnline >= GuildPointsConfigs.NeedPlayersOnline then local IPS = {} for i, pid in ipairs(GuildMembersOnline) do local PlayerIP = getPlayerIp(pid) if #IPS > 0 then for k = 1, #IPS do if PlayerIP == IPS[k] then AddIPList = false break end AddIPList = true end if AddIPList then table.insert(IPS, PlayerIP) end else table.insert(IPS, PlayerIP) end end if #IPS >= GuildPointsConfigs.NeedDiferentIps then local ValidAccounts = getGuildPlayersValidAccIDS(GuildID, GuildPointsConfigs.MinLevel) db.executeQuery("UPDATE `guilds` SET `last_execute_points` = ".. os.time() +(GuildPointsConfigs.ExecuteIntervalHours * 3600) .." WHERE `guilds`.`id` = ".. GuildID ..";") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "".. #ValidAccounts .." Players received points") if #ValidAccounts > 0 then db.executeQuery("UPDATE `accounts` SET `guild_points` = `guild_points` + " ..GuildPointsConfigs.AddPointsForAcc .. ", `guild_points_stats` = ".. os.time() .." WHERE `id` IN (" .. table.concat(ValidAccounts, ',') ..");") for i, pid in ipairs(GuildMembersOnline) do local PlayerMSGAccID = getPlayerAccountId(pid) for k = 1, #ValidAccounts do if PlayerMSGAccID == ValidAccounts[k] then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "You received "..GuildPointsConfigs.AddPointsForAcc .." guild points.") break end end end end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Only ".. #IPS .." players are valid, you need ".. GuildPointsConfigs.NeedDiferentIps .." players with different ips.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Has only ".. #GuildMembersOnline .." players online you need ".. GuildPointsConfigs.NeedPlayersOnline .." players online at least from level ".. GuildPointsConfigs.MinLevel ..".") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "The command can only be run once every "..GuildPointsConfigs.ExecuteIntervalHours .." hours.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Only guild leader can request points.") end return true end No coder acima bem no inicio tem as linhas seguintes para configurar: ExecuteIntervalHours = 24, ( Intervalo para execução do comando, ae está de 24 em 24hrs) NeedPlayersOnline = 10, (Quantos players é preciso está online para poder executar o comando.) NeedDiferentIps = 6, (Quantos IPS diferentes são necessários para executar o comando no exemplo ae tem 6.) MinLevel = 80, (Aqui adicione o level minimo, é necessário que todos os player da guild tenha o level pedido para o lider executar o comando.) AddPointsForAcc = 9, (Aqui é a quantidade de pontos para adicionar em cada player da guild.) Em data/globalevents/scripts crie um arquivo chamado shopguild.lua e adicione o code a seguir: local SHOP_MSG_TYPE = MESSAGE_EVENT_ORANGE local SQL_interval = 30 function onThink(interval, lastExecution) local result_plr = db.getResult("SELECT * FROM z_ots_guildcomunication WHERE `type` = 'login';") if(result_plr:getID() ~= -1) then while(true) do local id = tonumber(result_plr:getDataInt("id")) local action = tostring(result_plr:getDataString("action")) local delete = tonumber(result_plr:getDataInt("delete_it")) local cid = getCreatureByName(tostring(result_plr:getDataString("name"))) if isPlayer(cid) then local itemtogive_id = tonumber(result_plr:getDataInt("param1")) local itemtogive_count = tonumber(result_plr:getDataInt("param2")) local container_id = tonumber(result_plr:getDataInt("param3")) local container_count = tonumber(result_plr:getDataInt("param4")) local add_item_type = tostring(result_plr:getDataString("param5")) local add_item_name = tostring(result_plr:getDataString("param6")) local received_item = 0 local full_weight = 0 if add_item_type == 'container' then container_weight = getItemWeightById(container_id, 1) if isItemRune(itemtogive_id) == TRUE then items_weight = container_count * getItemWeightById(itemtogive_id, 1) else items_weight = container_count * getItemWeightById(itemtogive_id, itemtogive_count) end full_weight = items_weight + container_weight else full_weight = getItemWeightById(itemtogive_id, itemtogive_count) if isItemRune(itemtogive_id) == TRUE then full_weight = getItemWeightById(itemtogive_id, 1) else full_weight = getItemWeightById(itemtogive_id, itemtogive_count) end end local free_cap = getPlayerFreeCap(cid) if full_weight <= free_cap then if add_item_type == 'container' then local new_container = doCreateItemEx(container_id, 1) local iter = 0 while iter ~= container_count do doAddContainerItem(new_container, itemtogive_id, itemtogive_count) iter = iter + 1 end received_item = doPlayerAddItemEx(cid, new_container) else local new_item = doCreateItemEx(itemtogive_id, itemtogive_count) doItemSetAttribute(new_item, "description", "This item can only be used by the player ".. getPlayerName(cid) .."!") doItemSetAttribute(new_item, "aid", getPlayerGUID(cid)+10000) received_item = doPlayerAddItemEx(cid, new_item) end if received_item == RETURNVALUE_NOERROR then doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, 'You received >> '.. add_item_name ..' << from OTS GuildShop.') db.executeQuery("DELETE FROM `z_ots_guildcomunication` WHERE `id` = " .. id .. ";") db.executeQuery("UPDATE `z_shopguild_history_item` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";") else doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS GuildShop is waiting for you. Please make place for this item in your backpack/hands and wait about '.. SQL_interval ..' seconds to get it.') end else doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS GuildShop is waiting for you. It weight is '.. full_weight ..' oz., you have only '.. free_cap ..' oz. free capacity. Put some items in depot and wait about '.. SQL_interval ..' seconds to get it.') end end if not(result_plr:next()) then break end end result_plr:free() end return true end Em data/globalevents/globalevents.xml adicione a seguinte tag: <globalevent name="shopguild" interval="300" event="script" value="shopguild.lua"/> Certo, a parte do servidor é esta, ta feita, vamos adicionar a database o coder a seguir: ALTER TABLE `accounts` ADD `guild_points` INTEGER(11) NOT NULL DEFAULT 0; ALTER TABLE `accounts` ADD `guild_points_stats` INT NOT NULL DEFAULT '0'; ALTER TABLE `guilds` ADD `last_execute_points` INT NOT NULL DEFAULT '0'; CREATE TABLE `z_shopguild_offer` ( `id` int(11) NOT NULL auto_increment, `points` int(11) NOT NULL default '0', `itemid1` int(11) NOT NULL default '0', `count1` int(11) NOT NULL default '0', `itemid2` int(11) NOT NULL default '0', `count2` int(11) NOT NULL default '0', `offer_type` varchar(255) default NULL, `offer_description` text NOT NULL, `offer_name` varchar(255) NOT NULL, `pid` INT(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) CREATE TABLE `z_shopguild_history_item` ( `id` int(11) NOT NULL auto_increment, `to_name` varchar(255) NOT NULL default '0', `to_account` int(11) NOT NULL default '0', `from_nick` varchar(255) NOT NULL, `from_account` int(11) NOT NULL default '0', `price` int(11) NOT NULL default '0', `offer_id` int(11) NOT NULL default '0', `trans_state` varchar(255) NOT NULL, `trans_start` int(11) NOT NULL default '0', `trans_real` int(11) NOT NULL default '0', PRIMARY KEY (`id`)) CREATE TABLE `z_shopguild_history_pacc` ( `id` int(11) NOT NULL auto_increment, `to_name` varchar(255) NOT NULL default '0', `to_account` int(11) NOT NULL default '0', `from_nick` varchar(255) NOT NULL, `from_account` int(11) NOT NULL default '0', `price` int(11) NOT NULL default '0', `pacc_days` int(11) NOT NULL default '0', `trans_state` varchar(255) NOT NULL, `trans_start` int(11) NOT NULL default '0', `trans_real` int(11) NOT NULL default '0', PRIMARY KEY (`id`)) CREATE TABLE IF NOT EXISTS `z_ots_guildcomunication` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `type` varchar(255) NOT NULL, `action` varchar(255) NOT NULL, `param1` varchar(255) NOT NULL, `param2` varchar(255) NOT NULL, `param3` varchar(255) NOT NULL, `param4` varchar(255) NOT NULL, `param5` varchar(255) NOT NULL, `param6` varchar(255) NOT NULL, `param7` varchar(255) NOT NULL, `delete_it` int(2) NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13107; Olha estamos quase finalizando tudo, só precisamos terminar a parte de web. O meu GuildShop eu copiei meu shopsystem.php e fiz umas modificações, simples você pode fazer o mesmo é menos trabalhoso. Copie o shopsystem.php renomeie para shopguild.php, após abra-o e modifique como manda a seguir: shop_system para shopguild_system premium_points para guild_points premium points para guild points z_shop_offer para z_shopguild_offer shopsystem para shopguild z_shop_history_pacc para z_shopguild_history_pacc z_shop_history_item para z_shopguild_history_item z_ots_comunication para z_ots_guildcomunication Ou utilize este já pronto: shopguild.php O shopguildadmin.php está no link abaixo, basta fazer o mesmo procedimento: shopguildadmin.php Em index.php add: case "shopguild"; $topic = "Shop Guild"; $subtopic = "shopguild"; include("shopguild.php"); break; case "shopguildadmin"; $topic = "ShopGuild Admin"; $subtopic = "shopguildadmin"; include("shopguildadmin.php"); break; Vá em config.php adicione: $config['site']['shopguild_system'] = 1; $config['site']['access_adminguild_panel'] = 9; Vá em layouts.php adicione abaixo de buypoints: <a href='?subtopic=shopguild'> <div id='submenu_shopguild' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)'onMouseOut='MouseOutSubmenuItem(this)'> <div class='LeftChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> <div id='ActiveSubmenuItemIcon_shopguild' class='ActiveSubmenuItemIcon'style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'>Shop Guild</div> <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> </div> </a> Em layouts.php add depois do shopadmin: if($group_id_of_acc_logged >= $config['site']['access_adminguild_panel']) echo "<a href='?subtopic=shopadmin'> <div id='submenu_shopguildadmin' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)'onMouseOut='MouseOutSubmenuItem(this)'> <div class='LeftChain' style='background-image:url(".$layout_name."/images/general/chain.gif);'></div> <div id='ActiveSubmenuItemIcon_shopguildadmin' class='ActiveSubmenuItemIcon'style='background-image:url(".$layout_name."/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'><font color=red>! ShopGuild Admin !</font></div> <div class='RightChain' style='background-image:url(".$layout_name."/images/general/chain.gif);'></div> </div> </a>"; Em shopsystem.php procure por: elseif($action == 'show_history') { if(!$logged) { $main_content .= 'Please login first.'; } else{ $items_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';'); if(is_object($items_history_received)) { foreach($items_history_received as $item_received) { if($account_logged->getId() == $item_received['to_account']) $char_color = 'green'; else $char_color = 'red'; $items_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$item_received['to_name'].'</font></td><td>'; if($account_logged->getId() == $item_received['from_account']) $items_received_text .= '<i>Your account</i>'; else $items_received_text .= $item_received['from_nick']; $items_received_text .= '</td><td>'.$item_received['offer_id'].'</td><td>'.$item_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $item_received['trans_start']).'</td>'; if($item_received['trans_real'] > 0) $items_received_text .= '<td>'.date("j F Y, H:i:s",$item_received['trans_real']).'</td>'; else $items_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>'; $items_received_text .= '</tr>'; } } $paccs_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';'); if(is_object($paccs_history_received)) { foreach($paccs_history_received as $pacc_received) { if($account_logged->getId() == $pacc_received['to_account']) $char_color = 'green'; else $char_color = 'red'; $paccs_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$pacc_received['to_name'].'</font></td><td>'; if($account_logged->getId() == $pacc_received['from_account']) $paccs_received_text .= '<i>Your account</i>'; else $paccs_received_text .= $pacc_received['from_nick']; $paccs_received_text .= '</td><td>'.$pacc_received['pacc_days'].' days</td><td>'.$pacc_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $pacc_received['trans_real']).'</td></tr>'; } } $main_content .= '<center><h1>Transactions History</h1></center>'; if(!empty($items_received_text)) $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$items_received_text.'</table><br />'; if(!empty($paccs_received_text)) $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;Pacc Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccs_received_text.'</table><br />'; if(empty($paccs_received_text) && empty($items_received_text)) $main_content .= 'You did not buy/receive any items or PACC.'; } } Troque por: elseif($action == 'show_history') { if(!$logged) { $main_content .= 'Please login first.'; } else{ $items_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';'); if(is_object($items_history_received)) { foreach($items_history_received as $item_received) { if($account_logged->getId() == $item_received['to_account']) $char_color = 'green'; else $char_color = 'red'; $items_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$item_received['to_name'].'</font></td><td>'; if($account_logged->getId() == $item_received['from_account']) $items_received_text .= '<i>Your account</i>'; else $items_received_text .= $item_received['from_nick']; $items_received_text .= '</td><td>'.$item_received['offer_id'].'</td><td>'.$item_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $item_received['trans_start']).'</td>'; if($item_received['trans_real'] > 0) $items_received_text .= '<td>'.date("j F Y, H:i:s",$item_received['trans_real']).'</td>'; else $items_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>'; $items_received_text .= '</tr>'; } } $itemsguild_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shopguild_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';'); if(is_object($itemsguild_history_received)) { foreach($itemsguild_history_received as $itemguild_received) { if($account_logged->getId() == $itemguild_received['to_account']) $char_color = 'green'; else $char_color = 'red'; $itemsguild_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$itemguild_received['to_name'].'</font></td><td>'; if($account_logged->getId() == $itemguild_received['from_account']) $itemsguild_received_text .= '<i>Your account</i>'; else $itemsguild_received_text .= $itemguild_received['from_nick']; $itemsguild_received_text .= '</td><td>'.$itemguild_received['offer_id'].'</td><td>'.$itemguild_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $itemguild_received['trans_start']).'</td>'; if($itemguild_received['trans_real'] > 0) $itemsguild_received_text .= '<td>'.date("j F Y, H:i:s",$itemguild_received['trans_real']).'</td>'; else $itemsguild_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>'; $itemsguild_received_text .= '</tr>'; } } $paccs_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';'); if(is_object($paccs_history_received)) { foreach($paccs_history_received as $pacc_received) { if($account_logged->getId() == $pacc_received['to_account']) $char_color = 'green'; else $char_color = 'red'; $paccs_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$pacc_received['to_name'].'</font></td><td>'; if($account_logged->getId() == $pacc_received['from_account']) $paccs_received_text .= '<i>Your account</i>'; else $paccs_received_text .= $pacc_received['from_nick']; $paccs_received_text .= '</td><td>'.$pacc_received['pacc_days'].' days</td><td>'.$pacc_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $pacc_received['trans_real']).'</td></tr>'; } } $paccsguild_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shopguild_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';'); if(is_object($paccsguild_history_received)) { foreach($paccsguild_history_received as $paccguild_received) { if($account_logged->getId() == $paccguild_received['to_account']) $char_color = 'green'; else $char_color = 'red'; $paccsguild_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$paccguild_received['to_name'].'</font></td><td>'; if($account_logged->getId() == $paccguild_received['from_account']) $paccsguild_received_text .= '<i>Your account</i>'; else $paccsguild_received_text .= $paccguild_received['from_nick']; $paccsguild_received_text .= '</td><td>'.$paccguild_received['pacc_days'].' days</td><td>'.$paccguild_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $paccguild_received['trans_real']).'</td></tr>'; } } $main_content .= '<center><h1>Transactions History</h1></center>'; if(!empty($items_received_text)) $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;ShopServer Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$items_received_text.'</table><br />'; if(!empty($itemsguild_received_text)) $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;ShopGuild Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$itemsguild_received_text.'</table><br />'; if(!empty($paccs_received_text)) $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;ShopServer VIP Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccs_received_text.'</table><br />'; if(!empty($paccsguild_received_text)) $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;ShopGuild VIP Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccsguild_received_text.'</table><br />'; if(empty($paccs_received_text) && empty($items_received_text)) $main_content .= 'You did not buy/receive any items or PACC.'; if(empty($paccsguild_received_text) && empty($itemsguild_received_text)) $main_content .= 'You did not buy/receive any items or PACC.'; } } Finalmente terminamos! Bom todo esse processo é feito só para facilitar tudo pra você e o player e pra diferenciar o Shop System do Shop Guild, porque um sustenta as despesas do server e o outro atrai player, porque pra conseguir player é preciso ter player. Galera acredito que não esteja faltando nada, espero que gostem e tudo que eu poder fazer para nossas melhoras estarei postando, me desculpem meus erros de português mais o que importa aqui é o script está correto, abraços! Créditos: Natanael Beckman LukeSkywalker (Raphael Luiz) .lua 100% Não proíbo ninguém de copia o tópico só peço que onde você adicione inclua os créditos mencionados.
  2. Held Items Com Tiers Tutorial do necessário: Agora vá em "Data/Actions/Scripts" e crie um arquivo.lua com nome de HeldSystem, e dentro bote: No Actions.xml(Data/Actions) adicione esta tag: Adicionando Helds: Agora, vá em Exp2.lua(Data/Creaturescripts/Scripts) e procure por: E em cima coloque: Configure as %(porcentagens) no Configuration.lua(Data/Lib). Nessa parte: X-Hellfire e X-Poison: Agora, vá no Exp2.lua(data/Creaturescripts/Scripts) e procure por: E deixe assim: Configure as porcentagens no Configuration.lua(Data/Lib) nessa parte: X-Return: Vá no Exp2.lua(Data/Creaturescripts/Scripts) e procure por: E deixem assim: Defina as porcentagens no Configuration.lua(Data/Lib) nessa parte: Y-Regeneration: Agora, vá no Some Functions.lua(Data/Lib) e no final adicione isto: Agora, vá no Goback.lua(Data/Actions/Scripts) e Procure por: E deixe assim: Pronto, você pode configurar os bonus no Configuration.lua(Data/Lib), nessa parte: X-Defense: Depois, vá em Level System.lua(Data/Lib) e procure por: E deixe assim: Agora é só configurar os valores no Configuration.lua(Data/Lib), nessa parte: Y-Cure: Agora, vá no Some Functions.lua(Data/Lib) e no final adicione isto: Se ainda não tiver a função "isPlayerOnline", adicione em baixo: Agora, vá no Goback.lua(Data/Actions/Scripts) e procure por: E em baixo adicione: Sempre a mesma coisa, pra configurar as chances, vá no Configuration.lua(Data/Lib), nessa parte: X-Boost: Dificil né? Agora, vamos ao que importa, vá no Level System.lua(Data/Lib), e, levando em conta que você está aqui, creio que ja adicionou o X-Defense, então deve estar assim: É só deixar assim: Pronto, mas agora falta ir no Configuration.lua(Data/Lib) e depois de: Bote isso: Ai é só configurar os valores e.e Por enquanto é só, vou adicionando os que ja tinham sem Tier assim que possivel. PS: Os items dos helds devem ser do tipo "Usar Em". Look: Trade System.lua(Data/Creaturescripts/Scripts): Em ambos, é só ir adicionando items na tabela com seu ident. Fila: Créditos: PS: É só uma base. Ao Usar Esse Sistema, Peço Que Botem Créditos. Não Exijo, Mas Aprecio. Posso desenvolver qualquer held(lucky apenas com sources). Skype: gabriel.sales.01
  3. Ae galera do TK, uns caras ficaram me mandando PM pedindo esse sistema aqui.. aparentemente tem em algum server e eles queriam replicar o sistema no OT deles. Não sei como funciona no outro server mas no script que eu fiz vai funcionar assim: Serão 100 livros que você poderá comprar de um npc específico, cada livro te dá 1 ponto a mais na skill Dodge e isso acarreta em 0.3% de chance a mais de desviar de um golpe e tomar só 50% de dano. Infelizmente eu nunca joguei no servidor que foi o pioneiro desse sistema (na vdd eu nem sei qual é) então eu não fiz igual o deles, na realidade o meu só funciona ao perder vida então se o mago usar utamo vita acabou os dodge's dele. Outra coisa importante é que o player tem uma chance rara de dar Dodge no Dodge, ou seja, levando 1/4 do dano. Só vai funcionar para ataques de criaturas, tanto melee quanto spells, ou seja, se o cara passar no fogo não tem chance dele desviar do dano Sem mais delongas, vamos ao script: Crie um arquivo chamado dodge.lua na pasta creaturescripts\scripts e coloque isso dentro dele: agora adicione essa linha no creaturescripts.xml: <event type="statschange" name="dodge" event="script" value="dodge.lua"/> em creaturescripts\scripts\login.lua adicione isso antes do ultimo return true: registerCreatureEvent(cid, "dodge") if getPlayerStorageValue(cid, 48902) == -1 then setPlayerStorageValue(cid, 48902, 0) end agora vá em actions.xml e adicione essa linha aqui: <action itemid="1950" script="dodgebook.lua"/> note que vc pode mudar o ID do livro a hora que vc quiser. em items.xml, procure o item com o ID que vc irá utilizar e deixe ele assim: <item id="1950" article="a" name="Skill Book [DODGE]"> <attribute key="weight" value="1300" /> </item> agora crie um arquivo chamado dodgebook em actions\scripts e coloque isso dentro dele: local config = { minlevel = 150, --- level que precisa pra comprar o livro price = 10000, --- preço do livro itemid = 1950 --- ID DO LIVRO } --- end config function getDodgeSkill(cid) dodgeskill = getPlayerStorageValue(cid, 48902) return dodgeskill end local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} -- OTServ event handling functions start 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 -- OTServ event handling functions end function creatureSayCallback(cid, type, msg) -- Place all your code in here. Remember that hi, bye and all that stuff is already handled by the npcsystem, so you do not have to take care of that yourself. if (not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, 'skill book') then if getDodgeSkill(cid) == dodgeskill then selfSay('You want to buy Skill Book [DODGE]? It will cost '..config.price..' gp\'s!', cid) talkState[talkUser] = 1 else selfSay('I couldnt acess your data bank!', cid) end elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then if getPlayerMoney(cid) < config.price then selfSay('Its necessary to have at least '..config.price..' gp\'s in order to buy the Skill Book!', cid) elseif getPlayerLevel(cid) < config.minlevel then selfSay('The minimum level for buying this skill book is '..config.minlevel..'!', cid) else doPlayerRemoveMoney(cid,config.price) doPlayerAddItem(cid, config.itemid, 1, TRUE) end talkState[talkUser] = 0 elseif(msgcontains(msg, 'no')) and isInArray({1}, talkState[talkUser]) == TRUE then talkState[talkUser] = 0 selfSay('Ok.', cid) elseif msgcontains(msg, 'level') then selfSay('You have Leveled your Dodge Skill to ['..getDodgeSkill(cid)..'/100].', cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) lembrando que no começo vc pode editar o preço, o level que precisa pra comprar a skill e o ID do livro que será usado (USE O MESMO ID NO ITEMS.XML E NO ACTIONS.) agora crie o npc dodgeseller.xml e coloque isso nele: <npc name="Dodge Skill Seller" script="data/npc/scripts/bookseller.lua" access="5" lookdir="1"> <health now="1000" max="1000"/> <look type="133" head="95" body="86" legs="86" feet="38" addons="3"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. I've been waiting for you to come.. Say 'skill book' or 'level'" /> <parameter key="message_farewell" value="Cya folk." /> <parameter key="message_walkaway" value="How Rude!" /> </parameters> </npc> Explanações gerais: O sistema é bem simples (muito simples mesmo), ele pega o valor do storage do cara e multiplica por 3.. se isso for maior que um numero aleatório criado entre 0 e 1000 ele dá dodge e solta os efeitinhos lá do creaturescripts. Note que no nivel máximo o cara vai ter 100 de storagevalue e isso será multiplicado por 3 resultando em 300. Se 300 for maior que um valor aleatorio entre 0 e 1000 (30% de chance) você vai tomar apenas metade do dano. Vc pode editar a vontade e melhorar ele da forma que quiser, se vc quiser que todos os danos do player sejam passíveis de serem esquivados mude aqui: if type == STATSCHANGE_HEALTHLOSS and isCreature(attacker) then apenas retirando esse and isCreature(attacker), daí até dano de firefield vai dar pra dar dodge. Se você quiser adicionar classes que poderão usar (só knights e paladins por exemplo) só colocar isInArray({3,4,7,8}, getPlayerVocation(cid)) como condição na action. E se vc quiser que mago possa dar dodge mesmo com utamo vita (OQUE NÃO FAZ MUITO SENTIDO JÁ QUE O ESCUDO DE MANA FICA EM VOLTA DO PLAYER TEORICAMENTE, MAS TUDO BEM) é só colocar if type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS and isCreature(attacker) then Se você quiser que só ataques de Players sejam desviados ou só ataques de monstros é só trocar isCreature(attacker) por isMonster(attacker) ou isPlayer(attacker). Bom, isso é tudo, espero que vcs tenham curtido e qualquer coisa é só comentar ou me dar um Rep que ajuda pra caralho. Um abraço pra vocês. EDIT: Arrumei o problema de o npc não dar bye automáticamente qnd o player se afasta, bugando em algumas versões e impedindo de conversar com outros npcs. Apenas substituam o arquivo em scripts pela versão atualizada, grato.
  4. #Introdução Este é um sistema de rouba bandeira, no qual tem dois times que se enfrentam e tentam se infiltrar na fortaleza do inimigo, roubar a bandeira dele e retornar para sua base com ela. #Instalação Faça o download do sistema (anexado ao tópico) e cole na pasta do seu servidor. Atualizado 28/03/2014 Após ter instalado os arquivos nas suas respectivas pastas e instalado as tags nos arquivos xml, abra a pasta do seu servidor, e em seguida abra a pasta spells/scripts/support, e abra o arquivo invisible.lua com algum editor de texto, depois de function onCastSpell(cid, var) cole isso: if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end ficando assim: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_INVISIBLE) setConditionParam(condition, CONDITION_PARAM_TICKS, 200000) setCombatCondition(combat, condition) function onCastSpell(cid, var) if (getPlayerStorageValue(cid, 16700) ~= -1) then return doPlayerSendCancel(cid, "Você não pode usar invisible durante o CTF!") and doSendMagicEffect(getThingPos(cid), 2) end return doCombat(cid, combat, var) end #Configuração Como na maioria dos meus códigos: as configurações ficam na lib, então: waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer days = {2, 5, 7}, -- Dias que o evento vai abrir xp_percent = 0.5, -- Porcentagem de xp que o player vai receber quando ganhar timeclose = 1, -- Tempo para iniciar o CTF winp = 10, waitpos = {x = 93, y = 117, z = 6}, -- Posição da sala de espera Posição onde os players que entrarem no teleport vão ficar esperando, até o evento iniciar tppos = {x = 92, y = 117, z = 7}, -- Onde o TP vai aparecer Posição de onde o teleport vai aparecer days = {2, 5, 7}, -- Dias que o evento vai abrir Dias que o evento vai iniciar. xp_percent = 0.5, -- Porcentagem de exp que o player vai ganhar Quando o evento acaba, os players da equipe que venceu ganham uma quantidade de experiência baseada na experiência que eles já têm, exemplo: Meu player tem 1200000000 de exp, quando o evento acabar, ele vai ganhar 0.5% da exp que ele tem, no caso desse exemplo 6000000 de exp. timeclose = 1, -- Tempo, em minutos, para iniciar o CTF Tempo para o teleport sumir e os players que estão na sala de espera serem teletransportados para o evento. winp = 10, -- Quantos pontos uma equipe precisa marcar para vencer Quantos pontos uma equipe precisa marcar para vencer o evento. Para configurar o horário que o evento vai abrir, é só você modificar na tag do globalevents.xml: <globalevent name="CTFCheck" time="19:33:00" event="script" value="CTFMax.lua"/> Você não precisa criar as bandeiras pelo map editor. O script irá adicioná-las automaticamente. É isso, essa versão é uma remake, vários bugs reportados pela galera na v.1 foram corrigidos, o script ficou mais simples Capture The Flag.rar
  5. Olá galerinha do TibiaKinG, Hoje trago a vocês o script do Castle War 24horas vendido por algumas empresas, Vou postar o script e vocês configurem do gosto de vocês! Segue Abaixo o Link #Caracteristicas - Disponível para Linux ou Windows; - Mapa completo (Castle); - Avisos de invasores ao castle (2 configurados); - Somente players com guild tem acesso; - Fácilidade na configuração apenas em um arquivo; - Configuração de início por dia e hora; Link > http://www.mediafire.com/download/99n461m4bbrbi46/[DS]_Castle_War.rar Não dou suporte para o script, o mesmo já foi testado e funciona, Configurem do seus gostos! Att~~Gustavo
  6. Olá galera do TK, Provavelmente maioria aqui não me conhece, meu nome é Raphael ( Fael ), e minha área preferida é o mapa porém estou com um conteúdo aqui que muitos buscam separado mas não encontram. O bom evento Run Event. É um evento de corrida em um mapa com muitos obstáculos. Todos os players possuem a mesma velocidade. Objetivo muito simples, o primeiro que chegar no final vence Para entrar no evento é preciso dizer "!run" a mensagem será anunciada na hora que preciso. Tem que estar em área pz pra executa-lo. Bom vamos ao MOD: OTserver/Mod/... Adiciona um RunEvent.xml Script: <?xml version="1.0" encoding="UTF-8"?> <mod name="Run_Event" version="3.0" author="CollocorpuseK" contact="otland.net" enabled="yes"> <config name="config_run_event"> <![CDATA[ configRunEvent = { storages = { player = 'runEventPlayer', -- set free storage joining = 'runEventJoining', -- set free storage group = 'runEventGroup', -- set free storage exhaust = 'runEventExhaust', -- set free storage countEvent = 'runEventCountEvent' -- set free storage }, position = {x=885, y=1002, z=7}, -- Posicao que vai ser teleportado os players rewards = {9931, 7697, 2346, 8880}, -- Itens pro vencedor ( Sera sortido) players = { max = 45, -- Maximo de player min = 5, -- Minimo de player minLevel = 100, -- Level minimo pra entrar no evento speed = 200 -- Velocidade que todos ficaram }, days = { ['Monday'] = {'16:00:20'}, ['Tuesday'] = {'16:00:20'}, ['Wednesday'] = {'16:00:20'}, ['Thursday'] = {'16:00:20'}, ['Friday'] = {'16:00:20'}, ['Saturday'] = {'16:00:20'}, ['Sunday'] = {'16:00:20'} }, delayTime = 5.0, -- Tempo pros players dizer o comando [minutos] startEvent = 2, -- Tempo pra começar o evento quando todos players tiverem no local [ segundos ] text = 'Vai comecar o Run Evento, se preparem' } ]]> </config> <lib name="lib_run_event"> <![CDATA[ function doStartEventRun() if configRunEvent.players.min <= doCountPlayersRunEvent() then for _, cid in ipairs(getPlayersOnline()) do if getCreatureStorage(cid, configRunEvent.storages.player) > 0 then doRemoveCondition(cid, CONDITION_INFIGHT) -- fight doTeleportThing(cid, configRunEvent.position) -- teleport pos doChangeSpeed(cid, configRunEvent.players.speed - getCreatureBaseSpeed(cid)) -- predkosc doCreatureSetStorage(cid, configRunEvent.storages.group, getPlayerGroupId(cid)) -- storage doPlayerSetGroupId(cid, 7) -- grupa addEvent(doCreatureSetNoMove, configRunEvent.startEvent * 1000, cid, false) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'Get ready. Run Event start in '..configRunEvent.startEvent..' seconds.') end end addEvent(doCheckSpeedRunEvent, configRunEvent.startEvent * 1000) doBroadcastMessage('Run Event has started. LET\'S GO!') else for _, cid in ipairs(getPlayersOnline()) do if getCreatureStorage(cid, configRunEvent.storages.player) > 0 then doCreatureSetStorage(cid, configRunEvent.storages.player, -1) doCreatureSetNoMove(cid, false) doRemoveCondition(cid, CONDITION_INFIGHT) end end doBroadcastMessage('Run Event hasn\'t started beacuse there were not enough players.') end doSetStorage(configRunEvent.storages.joining, -1) end function doCountPlayersRunEvent() local x = 0 for _, cid in ipairs(getPlayersOnline()) do if getCreatureStorage(cid, configRunEvent.storages.player) > 0 then x = x + 1 end end return x end function doStartCountingRunEvent(x) if configRunEvent.delayTime-x > 0 then doBroadcastMessage('Run Event is going to start in '..configRunEvent.delayTime-x..' minutes. You can join to the event by saying "!run join".') addEvent(doStartCountingRunEvent, 60*1000, x+1) end end function doCheckSpeedRunEvent() if doCountPlayersRunEvent() > 0 then addEvent(doCheckSpeedRunEvent, 1000) end for _, cid in ipairs(getPlayersOnline()) do if getCreatureStorage(cid, configRunEvent.storages.player) > 0 then if getCreatureSpeed(cid) ~= configRunEvent.players.speed then doChangeSpeed(cid, (getCreatureSpeed(cid) < configRunEvent.players.speed and configRunEvent.players.speed - getCreatureSpeed(cid) or getCreatureSpeed(cid) > configRunEvent.players.speed and - (getCreatureSpeed(cid) - configRunEvent.players.speed))) end end end end ]]> </lib> <talkaction words="!run" event="script"> <![CDATA[ domodlib("config_run_event") function onSay(cid, words, param) if getStorage(configRunEvent.storages.joining) ~= 1 then return doPlayerSendCancel(cid, 'The Run Event hasn\'t started yet.') elseif param == '' then return doPlayerSendCancel(cid, 'Command param required (say: "!run join" or "!run leave.").') elseif getPlayerLevel(cid) < configRunEvent.players.minLevel then return doPlayerSendCancel(cid, 'You can\'t join to the event if you don\'t have a require '..configRunEvent.players.minLevel..' level.') elseif getTileInfo(getThingPos(cid)).protection ~= true then return doPlayerSendCancel(cid, 'You can\'t join to the event if you aren\'t in protection zone.') elseif exhaustion.check(cid, configRunEvent.storages.exhaust) ~= false then return doPlayerSendCancel(cid, 'You must wait '..exhaustion.get(cid, configRunEvent.storages.exhaust)..' seconds to use this command again.') end if param == 'join' then if getCreatureStorage(cid, configRunEvent.storages.player) > 0 then return doPlayerSendCancel(cid, 'You have arleady joined to event. Wait patiently for start.') elseif doCountPlayersRunEvent() == configRunEvent.players.max then return doPlayerSendCancel(cid, 'Max players in the event have been reached.') end doCreatureSetNoMove(cid, true) doPlayerPopupFYI(cid, configRunEvent.text) doCreatureSetStorage(cid, configRunEvent.storages.player, 1) doAddCondition(cid, createConditionObject(CONDITION_INFIGHT, -1)) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You have joined to Run Event. You can\'t move until event don\'t start. Wait patiently for the event start.') doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have joined to Run Event.') elseif param == 'leave' then if getCreatureStorage(cid, configRunEvent.storages.player) <= 0 then return doPlayerSendCancel(cid, 'You can\'t leave from the event if you don\'t join.') end doCreatureSetNoMove(cid, false) doCreatureSetStorage(cid, configRunEvent.storages.player, -1) doRemoveCondition(cid, CONDITION_INFIGHT) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have left from the Run Event.') end exhaustion.set(cid, configRunEvent.storages.exhaust, 5) return true end ]]> </talkaction> <talkaction words="!startrun" access="5" event="script"> <![CDATA[ domodlib("config_run_event") domodlib("lib_run_event") function onSay(cid, words, param) doSetStorage(configRunEvent.storages.joining, 1) addEvent(doStartEventRun, configRunEvent.delayTime * 60 * 1000) doStartCountingRunEvent(0) for _, pid in ipairs(getPlayersOnline()) do if getCreatureStorage(pid, configRunEvent.storages.player) > 0 then doCreatureSetStorage(pid, configRunEvent.storages.player, -1) doPlayerSetGroupId(pid, getCreatureStorage(pid, configRunEvent.storages.group)) doChangeSpeed(pid, getCreatureBaseSpeed(pid) - configRunEvent.players.speed) doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true) end end return true end ]]> </talkaction> <movement type="StepIn" actionid="5467" event="script"> <![CDATA[ domodlib("config_run_event") function onStepIn(cid, item, position) if getCreatureStorage(cid, configRunEvent.storages.player) > 0 then local prize = math.random(#configRunEvent.rewards) doCreatureSetStorage(cid, configRunEvent.storages.player, -1) doPlayerAddItem(cid, configRunEvent.rewards[prize], 1) doChangeSpeed(cid, getCreatureBaseSpeed(cid) - configRunEvent.players.speed) doPlayerSetGroupId(cid, math.max(1, getCreatureStorage(cid, configRunEvent.storages.group))) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true) doBroadcastMessage('Run Event has finished. The winner is '..getCreatureName(cid)..'.') doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You are winner. You have won '..getItemNameById(configRunEvent.rewards[prize])..'.') db.query("INSERT INTO `events` (`event_name`, `winner_name`, `won_item`, `time_win`) VALUES (\"Run\", \"" .. getCreatureName(cid) .. "\", \"" .. getItemNameById(configRunEvent.rewards[prize]) .. "\", " .. getStorage(configRunEvent.storages.countEvent) ..");") doSetStorage(configRunEvent.storages.countEvent, getStorage(configRunEvent.storages.countEvent) + 1) for _, pid in ipairs(getPlayersOnline()) do if getCreatureStorage(pid, configRunEvent.storages.player) > 0 then doCreatureSetStorage(pid, configRunEvent.storages.player, -1) doPlayerSetGroupId(pid, math.max(1, getCreatureStorage(pid, configRunEvent.storages.group))) doChangeSpeed(pid, getCreatureBaseSpeed(pid) - configRunEvent.players.speed) doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true) doPlayerSendTextMessage(pid, MESSAGE_EVENT_ADVANCE, 'You loss.') end end end return true end ]]> </movement> <globalevent name="Run_Event_Days" interval="1000" event="script"> <![CDATA[ domodlib("config_run_event") domodlib("lib_run_event") local daysOpen = {} for k, v in pairs(configRunEvent.days) do table.insert(daysOpen, k) end function onThink(interval) if isInArray(daysOpen, os.date("%A")) then if isInArray(configRunEvent.days[os.date("%A")], os.date("%X", os.time())) then if getStorage(configRunEvent.storages.joining) ~= 1 then doSetStorage(configRunEvent.storages.joining, 1) addEvent(doStartEventRun, configRunEvent.delayTime * 60 * 1000) doStartCountingRunEvent(0) for _, pid in ipairs(getPlayersOnline()) do if getCreatureStorage(pid, configRunEvent.storages.player) > 0 then doCreatureSetStorage(pid, configRunEvent.storages.player, -1) doPlayerSetGroupId(pid, math.max(1, getCreatureStorage(pid, configRunEvent.storages.group))) doChangeSpeed(pid, getCreatureBaseSpeed(pid) - configRunEvent.players.speed) doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true) end end end end end return true end ]]> </globalevent> <event type="login" name="Run_Event_Login" event="script"> <![CDATA[ domodlib("config_run_event") function onLogin(cid) if getCreatureStorage(cid, configRunEvent.storages.player) > 0 then doCreatureSetStorage(cid, configRunEvent.storages.player, -1) doPlayerSetGroupId(cid, math.max(1, getCreatureStorage(cid, configRunEvent.storages.group))) doCreatureSetNoMove(cid, false) doRemoveCondition(cid, CONDITION_INFIGHT) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true) end return true end ]]> </event> <globalevent name="Run_Event_Start" type="startup" event="script"> <![CDATA[ domodlib("config_run_event") function onStartup() doSetStorage(configRunEvent.storages.joining, -1) return true end ]]> </globalevent> </mod> Executem essa QUERY na sua DataBase CREATE TABLE `events` ( `event_name` varchar(255) NOT NULL, `winner_name` varchar(255) NOT NULL, `won_item` varchar(255) NOT NULL, `time_win` varchar(256) NOT NULL, PRIMARY KEY (`event_name`) ); No final do mapa para marcar o vencedor você marque um ActionID - 5467 no piso final. Não dou suporte ! Mapa Link
  7. VIP System by Mock 100% Fala galerinha do TK, então, há muito tempo atrás lá para meados de 2010 eu e alguns amigos pegamos um sistema de VIP inacabado pelo tão famoso scripter Mock e finalizamos ele deixando-o perfeito para uso, enfim, eu não achei esse script aqui no fórum e resolvi compartilhar com vocês, espero que gostem, confiram: 1° - Acesse a pasta data/lib e crie um arquivo chamado 049-vipsys.lua, coloque isso dentro do arquivo: vip = { name = "VIP System"; author = "Mock"; version = "1.0.0.0"; query="ALTER TABLE `accounts` ADD `vip_time` INTEGER"; query2="ALTER TABLE `accounts` ADD `vip_time` INT(15) NOT NULL" } function vip.setTable() dofile('config.lua') if sqlType == "sqlite" then db.executeQuery(vip.query) else db.executeQuery(vip.query2) end end function vip.getVip(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == FALSE then error('Player don\'t find') end; ae = db.getResult("SELECT `vip_time` FROM `accounts` WHERE `name` = '"..getPlayerAccount(cid).."';") if ae:getID() == -1 then return 0 end local retee = ae:getDataInt("vip_time") or 0 ae:free() return retee end function vip.getVipByAcc(acc) assert(acc,'Account is nil') local a = db.getResult("SELECT `vip_time` FROM `accounts` WHERE `name` = '"..acc.."';") if a:getID() ~= -1 then return a:getDataInt("vip_time") or 0, a:free() else error('Account don\'t find.') end end function vip.setVip(cid,time) dofile("config.lua") assert(tonumber(cid),'Parameter must be a number') assert(tonumber(time),'Parameter must be a number') if isPlayer(cid) == FALSE then error('Player don\'t find') end; db.executeQuery("UPDATE `"..sqlDatabase.."`.`accounts` SET `vip_time` = '"..(os.time()+time).."' WHERE `accounts`.`name` ='".. getPlayerAccount(cid).."';") end function vip.getVipByAccount(acc) assert(acc,'Account is nil') return db.getResult("SELECT `vip_time` FROM `accounts` WHERE `name` = '"..acc.."';"):getDataInt("vip_time") or 0 end function vip.hasVip(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == FALSE then return end; local t = vip.getVip(cid) or 0 if os.time(day) < t then return TRUE else return FALSE end end function vip.hasVips(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == FALSE then return end; local t = vip.getVip(cid) if os.time(day) < t then return TRUE else return FALSE end end function vip.accountHasVip(acc) assert(acc,'Account is nil') if os.time() < vip.getVipByAccount(acc) then return TRUE else return FALSE end end function vip.getDays(days) return (3600 * 24 * days) end function vip.addVipByAccount(acc,time) assert(acc,'Account is nil') assert(tonumber(time),'Parameter must be a number') local a = vip.getVipByAcc(acc) a = os.difftime(a,os.time()) if a < 0 then a = 0 end; a = a+time return vip.setVipByAccount(acc,a) end function vip.setVipByAccount(acc,time) dofile("config.lua") assert(acc,'Account is nil') assert(tonumber(time),'Parameter must be a number') db.executeQuery("UPDATE `accounts` SET `vip_time` = '"..(os.time()+time).."' WHERE `accounts`.`name` ='"..acc.."';") return TRUE end function vip.returnVipString(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == TRUE then return os.date("%d %B %Y %X ", vip.getVip(cid)) end end 2° - Abra a pasta data/creaturescrpits/scripts e crie um arquivo chamado fimvip.lua, dentro dele adicione: By Lukeskywalker function onLogin(cid) local temple = { x =32369, y = 32246, z = 6} if vip.hasVip(cid) == true then if getPlayerStorageValue(cid,55555) ~= 1 then setPlayerStorageValue(cid,55555,1) end else if getPlayerStorageValue(cid,55555) == 1 then doTeleportThing(cid, temple) doPlayerSendTextMessage(cid, 22, "Your VIP Time over!") db.executeQuery("UPDATE `accounts` SET `vip_time` = 0 WHERE `id` = ".. getAccountIdByName(getPlayerName(cid)) ..";") setPlayerPromotionLevel(cid, 1) setPlayerStorageValue(cid, 55555, 0) end end return true end Você pode troca as coordenadas do templo: local temple = {x=32369, y=32246, z=6}. 3° - Em data/creaturescripts/scripts/login.lua adicione essas tags: registerCreatureEvent(cid, "FimVip") registerCreatureEvent(cid, "VipReceive") 4° - Em data/creaturescripts/creaturescripts.xml adicione está tag: <event type="login" name="FimVip" event="script" value="fimvip.lua"/> 5º - Em data\movements\scripts e crie um arquivo chamado viptile.lua e adicione isso dentro dele: function onStepIn(cid, item, position, fromPosition) local tileConfig = { kickPos = fromPosition, kickEffect = CONST_ME_POFF, kickMsg = "You need to be a vip player to access this area.", enterMsg = "Welcome to vip area!", enterEffect = CONST_ME_MAGIC_RED, } if isPlayer(cid) == true then if vip.hasVip(cid) == FALSE then doTeleportThing(cid, tileConfig.kickPos) doSendMagicEffect(tileConfig.kickPos, tileConfig.kickEffect) doPlayerSendCancel(cid, tileConfig.kickMsg) return end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tileConfig.enterMsg) doSendMagicEffect(position, tileConfig.enterEffect) return true end end 6° - Em data\movements\movements.xml adicione a tag: <movevent type="StepIn" actionid="13500" event="script" value="viptile.lua"/> Vejam a numeração 13500 você irá usar no tile que você quer para a passagem de player VIP para configurar adicione a numeração em ActionID do tile. 7° - Em data/talkactions/scripts acrescente dentro da pasta scripts uma outra pasta com o nome VIP vamos precisar de 7 arquivos.lua que teram os nomes e códigos a seguir: add.lua function onSay(cid, words, param, channel) doPlayerSendCancel(cid, "Added "..param.." Vip Days.") return doPlayerAddVipDays(cid, param) end addvipp.lua function onSay(cid, words, param) if param == "" then return doPlayerPopupFYI(cid,"Está com problemas?\nAprenda os comandos!\n---------------\nAdicionar vip:\n/vip add days player\n/vip add 30 Real\n---------------\nDeletar vip:\n/vip del player\n/vip del Real\n---------------\nVer a vip:\n/vip see player\n/vip see Real\n---------------\n") end if param:lower():find('add') == 1 and 3 then local _,_,id,name = param:lower():find('add (%d+) (.+)') name = name or "" id = tonumber(id or 1) or 1 if tonumber(id) == nil or getPlayerByName(name) == false then return doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"Adicionar vip:\n/vip add days player\n/vip add 30 Real\n [Player: "..name.."]") end if isPlayer(getPlayerByName(name)) == TRUE then vip.addVipByAccount(getPlayerAccount(getPlayerByName(name)) ,vip.getDays(id)) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,"Foram adicionados "..tonumber(id).." dias de vip a "..name..".") doPlayerSendTextMessage(getPlayerByName(name),MESSAGE_INFO_DESCR,"Você recebeu "..tonumber(id).." dias de vip.") else doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,name.." não esta online ou não existe.") end elseif param:lower():find('del') == 1 and 3 then local _,_,name = param:lower():find('del (.+)') if getPlayerByName(name) == false then return doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"Deletar vip:\n/vip del player\n/vip del Real\n") end vip.setVipByAccount(getPlayerAccount(getPlayerByName(name)),-os.time()) doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"A vip de "..name.." foi apagada.") elseif param:lower():find('see') == 1 and 3 then local _,_,name = param:lower():find('see (.+)') name = name or "" if getPlayerByName(name) == false then return doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"Ver a vip:\n/vip see player\n/vip see Real\n") end local ret_ = vip.getVip(getPlayerByName(name)) if ret_ == 0 then return doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,name.." Não tem vip, e nunca teve.") else return doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "A vip de "..name.." Acaba/terminou em "..os.date("%d %B %Y %X ",ret_)) end end return TRUE end get.lua function onSay(cid, words, param, channel) doPlayerSendCancel(cid, ""..getPlayerVipDays(cid).." days VIP left.") end is.lua function onSay(cid, words, param, channel) if isPlayerVip(cid) == TRUE then doPlayerSendCancel(cid, "You are a VIP player.") else doPlayerSendCancel(cid, "You are not a VIP player.") end end removevip.lua function onSay(cid, words, param, channel) doPlayerSendCancel(cid, "Vip removed.") return doPlayerRemoveVip(cid) end set.lua function onSay(cid, words, param, channel) doPlayerSendCancel(cid, "VIP Days: "..param..".") return setPlayerVipDays(cid, param) end vipdays.lua function onSay(cid, words, param) if vip.hasVip(cid) == TRUE then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your vip end in "..os.date("%d %B %Y %X ",vip.getVip(cid))) else if vip.getVip(cid) ~= 0 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You're not a vip player. Your vip has finished in "..os.date("%d %B %Y %X ", vip.getVip(cid)).." and now is "..os.date("%d %B %Y %X ", os.time())) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You're not a vip player. You naver has a vip.") end end return TRUE end 8° - Em data/talkactions/talkactions.xml adicione está tag: <!-- VIP System --> <talkaction log="yes" words="/vip" access="5" event="script" value="VIP/addvipp.lua" /> <talkaction words="!vipdays" event="script" value="VIP/vipdays.lua" /> 9° - Para finalizar execute este comando na sua database: ALTER TABLE `accounts` ADD `vip_time` INT NOT NULL; Bom galera este sistema vip adiciona os dias corretos e ao termino do VIP o player recebe a mensagem que a VIP acabou e é teletransportado para o templo. Créditos: Mock (por ter iniciado algo e não terminou) Lukeskywalker (Sistema de finalização perfeito do vip) Matheus [Eu] (Por ter feito várias alterações nas talkacions) Natan Beckman (Por ter ido atrás da conclusão 100% in game e php) Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  8. Versão: 4.0 Versão suportada: 9.4+ (pode funcionar em anteriores) Descrição: O sonho do jogador tibiano era chegar aos céus sem precisar de auxilio. Que tal esse sonho se tornar realidade? Script: Fly System.rar Aviso: Esse script está sem voids, então se for realmente utilizar em seu servidor coloque aquelas bordas de piscina ou algumas montanhas para o player não fugir. Você também pode modificar o script e adicionar só para vocações ou leveis especifico para utilizar o comando (isso deve ser a sua parte, se quiser saber como adiciona comenta no tópico que eu mudo do jeito que você quiser) (se eu tiver tempo). Se der algum erro reporte. Créditos: MaxDenison (Criador do script para servidores de pokemon). Comedinha (modificou, arrumou bugs e adaptou para o tibia normal e qualquer outro projeto).
  9. Fala pessoal, então, todos sabem que essa quest é bem complicada de ser configurada e na maioria das vezes ocorre erros, pois bem, hoje eu vim aqui trazer para vocês um script angito da Arena de Svargrond em MOD, criado por um membro da otland chamado TomCrusher e modificado por mim. É um script de fácil configuração e sem erros nenhum, confira! Vá até a pasta mods e crie um arquivo chamado arena.xml com isso dentro: <?xml version="1.0" encoding="UTF-8"?> <mod name="Arena Svargrond" version="1.0" author="Tommy" contact="tommycrusher@gmail.com" enabled="yes"> <config name="arenaFunctions"><![CDATA[ KickPosition = {x=32227, y=31096, z=7} --if the player leave the arena or time is over, where he go. RewardsRoom = {x=32222, y=31080, z=6} --rewards room position. arenaRoomMaxTime = 240 --max time for each room 240 = 4 min. OpenDoorsID = 5127 --if you change doors item ids, change me =D TimeStor = 42350 --here will be saved the time. myArenaLevel = 45450 --here will be saved the arena level. talkNPC = 45451 --Storage to check if the player have paid to the npc and can enter to the arena. RewardsStor = {42361, 42371, 42381} --Storage for greenshore, scrapper, warlord. isIN = 42352 --to check if the player is in the arena. myRoom = 46000 --here will be saved the current room. MonStor = 47000 --here will be saved the monster uid. DoorsActID = 42357 --Doors near the npc. LeavePortals = 42321 --The action id of the portal to leave the rooms (south portals). GobletTiles = {42360, 42370, 42380} --Action ids of the tiles for Bronze, Silver and Gold Goblets. Cancel = { --message when use door and have not paid to the npc. [1] = "You have not paid NPC yet.", --message when leave arena. [2] = "You have been kicked!", --message when the player can't get the reward. [3] = "You can\'t get this item.", --message when already got any reward. [4] = "It is empty.", --when try to open a reward door and haven't completed the level. [5] = "You have not finished this arena level.", --NPC answer if the player completed all arena levels. [6] = "You already did all the arena levels.", --message when time is over [7] = "The time is over.", --message when you can go to the next room, LoL >_> this is not a cancel btw. [8] = "You can go to the next room.", --when try to go to the next room and not killed the monster yet. [9] = "Kill the monster first!", --when try to go to the next room but there is a player yet...this text will be PLAYERNAME + this text [10] = "Is in the room yet." } Completed = { [1] = "Congatulations! You have completed the arena in", --HERE WILL BE THE ARENA NAME. [2] = "difficulty! Now you go take your reward."} --then the message will be "Congatulations! you have completed the arena in greenshore/scrapper/warlord difficulty!, now go and take your reward." Arena = { --greenshore [0] = { Cost = 10000, LevelName = 'greenshore', LevelNeeded = 30, Goblet = 5807 }, --scrapper [1] = { Cost = 50000, LevelName = 'scrapper', LevelNeeded = 50, Goblet = 5806 }, --warlord [2] = { Cost = 100000, LevelName = 'warlord', LevelNeeded = 80, Goblet = 5805 } } Rewards = { --greenshore --present with items. [42361] = { Stor = RewardsStor[1], Cont = 1990, items = {7372, 6569, 6574, 2114}, count = {1, 10, 1, 1} }, --blacksteel sword. [42362] = { Stor = RewardsStor[1], Cont = nil, item = 7406 }, --headchopper. [42363] = { Stor = RewardsStor[1], Cont = nil, item = 7380 }, --orcish maul. [42364] = { Stor = RewardsStor[1], Cont = nil, item = 7392 }, --backpack with items. [42365] = { Stor = RewardsStor[1], Cont = 7342, items = {7365, 7364}, count = {100, 100} }, --scrapper --present with items. [42371] = { Stor = RewardsStor[2], Cont = 1990, items = {7372, 6569, 6574, 7183}, count = {1, 10, 1, 1} }, --mystic blade. [42372] = { Stor = RewardsStor[2], Cont = nil, item = 7384 }, --heroic axe. [42373] = { Stor = RewardsStor[2], Cont = nil, item = 7389 }, --cranial basher [42374] = { Stor = RewardsStor[2], Cont = nil, item = 7415 }, --backpack with items. [42375] = { Stor = RewardsStor[2], Cont = 7342, items = {7365, 2547, 2547, 2311, 2304}, count = {100, 100, 100, 50, 50} }, --warlord --present with items. [42381] = { Stor = RewardsStor[3], Cont = 1990, items = {7372, 6569, 6574, 6568}, count = {1, 10, 1, 1} }, --justice seeker [42382] = { Stor = RewardsStor[3], Cont = nil, item = 7390 }, --royal axe. [42383] = { Stor = RewardsStor[3], Cont = nil, item = 7434 }, --blessed sceptre. [42384] = { Stor = RewardsStor[3], Cont = nil, item = 7429 }, --backpack with items. [42385] = { Stor = RewardsStor[3], Cont = 7342, items = {2273, 2268, 7443, 7440, 7529}, count = {50, 50, 1, 1, 100} } } arena_monsters = { --greenshore -scrapper --warlord [45300] = "Frostfur", [45310] = "Avalanche", [45320] = "Webster", [45301] = "Bloodpaw", [45311] = "Kreebosh the Exile", [45321] = "Darakan the Executioner", [45302] = "Bovinus", [45312] = "The Dark Dancer", [45322] = "Norgle Glacierbeard", [45303] = "Achad", [45313] = "The Hag", [45323] = "The Pit Lord", [45304] = "Colerian The Barbarian", [45314] = "Slim", [45324] = "Svoren the Mad", [45305] = "The Hairy One", [45315] = "Grimgor Guteater", [45325] = "The Masked Marauder", [45306] = "Axeitus Headbanger", [45316] = "Drasilla", [45326] = "Gnorre Chyllson", [45307] = "Rocky", [45317] = "Spirit of Earth", [45327] = "Fallen Mooh'tah Master Ghar", [45308] = "Cursed Gladiator", [45318] = "Spirit of Water", [45328] = "Deathbringer", [45309] = "Orcus the Cruel", [45319] = "Spirit of Fire", [45329] = "The Obliverator"} Checking = false RoomsACT = {42301, 42302, 42303, 42304, 42305, 42306, 42307, 42308, 42309} Goblets = { [42360] = {Id=Arena[0].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[0].LevelName.." difficulty."}, [42370] = {Id=Arena[1].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[1].LevelName.." difficulty."}, [42380] = {Id=Arena[2].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[2].LevelName.." difficulty."}} RewardsDoors = {[42366] = 1, [42376] = 2, [42386] = 3} ArenaAdding = {[0] = 3000, [1] = 3010, [2] = 3020} function myArenaLevelIs(cid) Stor = getPlayerStorageValue(cid, myArenaLevel) if Stor == -1 then setPlayerStorageValue(cid, myArenaLevel, 0) Stor = 0 elseif Stor == 3 then Stor = 2 end return { RC = Arena[Stor].Cost, LN = Arena[Stor].LevelName, RLV = Arena[Stor].LevelNeeded, LV = getPlayerStorageValue(cid, myArenaLevel) } end function getDirectionmove(cid, itempos) --function by Nahruto p = getCreaturePosition(cid) i = itempos if p.x > i.x then if p.y > i.y then ret = NORTHWEST elseif p.y < i.y then ret = SOUTHWEST else ret = WEST end elseif p.x < i.x then if p.y > i.y then ret = NORTHEAST elseif p.y < i.y then ret = SOUTHEAST else ret = EAST end else if p.y > i.y then ret = NORTH elseif p.y < i.y then ret = SOUTH else ret = nil end end return ret end function LeaveArena(cid) for i = 45300, 45329 do setPlayerStorageValue(cid, i, 0) end if isCreature(getPlayerStorageValue(cid, MonStor)) == TRUE then doRemoveCreature(getPlayerStorageValue(cid, MonStor)) end setGlobalStorageValue(getPlayerStorageValue(cid, myRoom), 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[2]) doTeleportThing(cid, KickPosition, FALSE) setPlayerStorageValue(cid, TimeStor, 0) setPlayerStorageValue(cid, isIN, 0) end function CheckRooms() addEvent(CheckRooms, 1000) for i = 42300, 42309 do local Player = getGlobalStorageValue(i) if isPlayer(Player) == TRUE then local PlayerTime = getPlayerStorageValue(Player, TimeStor) if PlayerTime <= os.time() then doTeleportThing(Player, KickPosition, FALSE) setPlayerStorageValue(Player, TimeStor, 0) setGlobalStorageValue(i, 0) doPlayerSendTextMessage(Player,MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[7]) if isCreature(getPlayerStorageValue(Player, MonStor)) == TRUE then doRemoveCreature(getPlayerStorageValue(Player, MonStor)) end elseif PlayerTime - 10 <= os.time() then doPlayerSendTextMessage(Player, MESSAGE_EVENT_DEFAULT, "you have "..PlayerTime - os.time().." seconds left.!") end else setGlobalStorageValue(i, 0) end end end function getArenaMonsterIdByName(name) for i = 45300, 45329 do if tostring(arena_monsters[i]) == string.lower(tostring(name)) then return i end end return false end]]></config> <event type="login" name="arenaRegister" event="script"><![CDATA[ domodlib('arenaFunctions') function onLogin(cid) registerCreatureEvent(cid, "PlayerArena") registerCreatureEvent(cid, "ArenaKill") return true end]]></event> <event type="death" name="PlayerArena" event="script"><![CDATA[ domodlib('arenaFunctions') function onDeath(cid, corpse, deathList) if getPlayerStorageValue(cid, isIN) == 1 then I = 0 for i = 45300, 45329 do if getPlayerStorageValue(cid, i) == 1 then I = i end end GlobalStor = I - ArenaAdding[myArenaLevelIs(cid).LV] setGlobalStorageValue(GlobalStor, 0) setPlayerStorageValue(cid, isIN, 0) if isCreature(getPlayerStorageValue(cid, MonStor)) then doRemoveCreature(getPlayerStorageValue(cid, MonStor)) end end return true end ]]></event> <event type="kill" name="ArenaKill" event="script"><![CDATA[ domodlib('arenaFunctions') function onKill(cid, target, lastHit) if getPlayerStorageValue(cid, isIN) == 1 then local Room = getArenaMonsterIdByName(getCreatureName(target)) if Room ~= 0 then setPlayerStorageValue(cid, Room, 1) doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, Cancel[8]) end end return true end]]></event> <action fromaid="42357" toaid="42386" event="script"><![CDATA[ domodlib('arenaFunctions') function onUse(cid, item, fromPosition, itemEx, toPosition) local myMove = getDirectionmove(cid, fromPosition) if myMove == nil then return FALSE end local Reward = Rewards[item.actionid] if Reward then if getPlayerStorageValue(cid, Reward.Stor) ~= 1 then local reward = nil if Reward.Cont ~= nil then reward = doCreateItemEx(Reward.Cont, 1) for i = 1, #Reward.items do doAddContainerItem(reward, Reward.items[i], Reward.count[i]) end else reward = doCreateItemEx(Reward.item, 1) end if reward ~= nil then if doPlayerAddItemEx(cid, reward, FALSE) == RETURNVALUE_NOERROR then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,'You have found a '..getItemNameById(getThing(reward).itemid)..'.') setPlayerStorageValue(cid, Reward.Stor, 1) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[3]) end end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[4]) end elseif RewardsDoors[item.actionid] then if myArenaLevelIs(cid).LV >= RewardsDoors[item.actionid] then doTransformItem(item.uid, OpenDoorsID) doMoveCreature(cid, myMove) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[5]) end elseif item.actionid == DoorsActID and getPlayerStorageValue(cid, talkNPC) == 1 then doTransformItem(item.uid, OpenDoorsID) doMoveCreature(cid, myMove) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[1]) end return TRUE end]]></action> <movevent type="StepIn" fromaid="42300" toaid="42380" event="script"><![CDATA[ domodlib('arenaFunctions') function onStepIn(cid, item, position, fromPosition) local ArenaRoom = item.actionid if item.actionid == LeavePortals then LeaveArena(cid) elseif isInArray(GobletTiles, item.actionid) == TRUE then local gobletPos = getThingPos(item.uid) if getPlayerStorageValue(cid, item.actionid) ~= 1 then setPlayerStorageValue(cid, item.actionid, 1) local Goblet = doCreateItemEx(Goblets[item.actionid].Id, 1) doItemSetAttribute(Goblet, "description", ""..Goblets[item.actionid].txt.."\nAwarded to "..getCreatureName(cid)..".") gobletPos.y = gobletPos.y - 1 doTileAddItemEx(gobletPos, Goblet) end doTransformItem(item.uid, item.itemid - 1) elseif isInArray(RoomsACT, ArenaRoom) == TRUE or ArenaRoom == 42300 then if Checking == FALSE then Checking = TRUE CheckRooms() end local myLevelArena = myArenaLevelIs(cid).LV if ArenaAdding[myLevelArena] then Mons = ArenaRoom + ArenaAdding[myLevelArena] end if getGlobalStorageValue(ArenaRoom) == 0 then if isCreature(getPlayerStorageValue(cid, MonStor)) == FALSE then if ArenaRoom == 42300 and getPlayerStorageValue(cid, talkNPC) == 1 then setPlayerStorageValue(cid, talkNPC, 0) setPlayerStorageValue(cid, isIN, 1) P = 1 elseif ArenaRoom ~= 42300 and getPlayerStorageValue(cid, isIN) == 1 then P = 1 else P = nil end if P ~= nil then local SpawnPos = getThingPos(ArenaRoom) doTeleportThing(cid, SpawnPos, FALSE) SpawnPos.x = SpawnPos.x - 1 SpawnPos.y = SpawnPos.y - 1 local Monster = doSummonCreature(arena_monsters[Mons], SpawnPos) setGlobalStorageValue(ArenaRoom, cid) setGlobalStorageValue(ArenaRoom - 1, 0) setPlayerStorageValue(cid, TimeStor, os.time()+arenaRoomMaxTime) setPlayerStorageValue(cid, MonStor, Monster) setPlayerStorageValue(cid, myRoom, ArenaRoom) else LeaveArena(cid) end else doTeleportThing(cid, fromPosition, TRUE) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[9]) end else doTeleportThing(cid, fromPosition, TRUE) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ""..getCreatureName(getGlobalStorageValue(cid, ArenaRoom)).." "..Cancel[10].."") end elseif ArenaRoom == 42310 then if isCreature(getPlayerStorageValue(cid, MonStor)) == FALSE then doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_BLUE,""..Completed[1].." "..myArenaLevelIs(cid).LN.." "..Completed[2].."") setPlayerStorageValue(cid, myArenaLevel, getPlayerStorageValue(cid, myArenaLevel) + 1) setGlobalStorageValue(ArenaRoom - 1, 0) setPlayerStorageValue(cid, TimeStor, 0) setPlayerStorageValue(cid, isIN, 0) doTeleportThing(cid, RewardsRoom, TRUE) else doTeleportThing(cid, fromPosition, TRUE) doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_ORANGE,'Najpierw zabij potwora!') end end return TRUE end]]></movevent> <movevent type="StepOut" fromaid="42357" toaid="42387" event="script"><![CDATA[ domodlib('arenaFunctions') function onStepOut(cid, item, position, fromPosition) if item.actionid == DoorsActID or RewardsDoors[item.actionid] then doTransformItem(item.uid, item.itemid - 2) elseif isInArray(GobletTiles, item.actionid) == TRUE then doTransformItem(item.uid, item.itemid + 1) end return TRUE end]]></movevent> </mod> Pronto, apenas configure o RewardsRoom e o KickPosition, o resto é só adicionar os ActionsIDS no mapa editor caso não tenha. Se você possuir outro sistema de arena em seu OTServ, remova todos os arquivos desse sistema. Agora vamos configurar o NPC, vá até a pasta data/npc e crie um arquivo chamado Halvar.xml com isso: <?xml version="1.0" encoding="UTF-8"?> <npc name="Halvar" script="data/npc/scripts/arena.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="143" head="3" body="77" legs="78" feet="39" addons="1"/> </npc> Agora vá até data/npc/scripts e crie um arquivo chamado arena.lua com isso dentro: domodlib('arenaFunctions') 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 local focus = 0 local talk_start = 0 local TS = 0 function onCreatureDisappear(cid, pos) if focus == cid then selfSay('Good bye then.') focus = 0 talk_start = 0 end end local function BYE() focus = 0 talk_start = 0 TS = 0 end function msgcontains(txt, str) return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)')) end function onCreatureSay(cid, type, msg) msg = string.lower(msg) if (msgcontains(msg, 'hi') and (focus == 0)) then selfSay('Hello ' .. getCreatureName(cid) .. ', do you want to make arena?') focus = cid talk_start = os.clock() TS = 1 elseif msgcontains(msg, 'hi') and (focus ~= cid) then selfSay('Im Bussy') elseif TS == 1 and msgcontains(msg, 'yes') or msgcontains(msg, 'fight') or msgcontains(msg, 'arena') then if getPlayerStorageValue(cid, myArenaLevel) < 3 then local enterArena = myArenaLevelIs(cid) if getPlayerLevel(cid) >= enterArena.RLV then if getPlayerMoney(cid) >= enterArena.RC then setPlayerStorageValue(cid, talkNPC, 1) doPlayerRemoveMoney(cid, enterArena.RC) selfSay("Now you can go to test... ".. enterArena.LN .."!") BYE() else selfSay("You don\'t have "..enterArena.RC.." gp! Come back when you will be ready!") BYE() end else selfSay("You don\'t have "..enterArena.RLV.." level! Come back when you will be ready!") BYE() end else selfSay(Cancel[6]) BYE() end elseif TS == 1 and msgcontains(msg, 'no') then selfSay("Bye!") BYE() elseif msgcontains(msg, 'bye') then selfSay("Bye!") BYE() end return true end function onThink() doNpcSetCreatureFocus(focus) if (os.clock() - talk_start) > 10 then if focus > 0 then selfSay('Good bye then.') end focus = 0 end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Prontinho, sistema completamente configurado! Espero que façam bom proveito, esse é um ótimo script. Créditos: - TomCrusher (criação do sistema) - Matheus [EU] (arrumei os erros e modifiquei algumas coisas) Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  10. script testado em TFS 0.3.6 Crying Dansom Créditos: 100% Draky Lucas Provavelmente funcionará em qualquer versão acima de 8.54, ja abaixo eu nao confirmo mais não custa testar Como funciona? o ADM digita !war open para ativar a war, e !war close na hora de terminar a war. A Ultima guild que puxar a alavanca antes de terminar a war é considerada a vencedora do evento. Vamos começar: Atualizado: corrigido erro pelo Demonbholder [dava só em alguns pois eram desatualizados] em data/lib/050-functions.lua ache a função isInArea, deletem-la e substituam-la por essa: function isInArea(arr, arr1, arr2) if (arr.x <= arr1.x and arr.x >= arr2.x) or (arr.x >= arr1.x and arr.x <= arr2.x) then if (arr.y <= arr1.y and arr.y >= arr2.y) or (arr.y >= arr1.y and arr.y <= arr2.y) then if (arr.z <= arr1.z and arr.z >= arr2.z) or (arr.z >= arr1.z and arr.z <= arr2.z) then return TRUE end end end return FALSE end em Data/actions/scripts/ crie um arquivo chamado castlewar-action.lua e nele coloque isto : local storage = 1755 local emGuerra = 1756 function onUse(cid, item, frompos, item2, topos) if getPlayerGuildId(cid) == nil or getPlayerGuildId(cid) <= 0 or getPlayerGuildId(cid) == false then return doPlayerSendCancel(cid,"Voce precisa de uma guild para dominar o castelo!") end if getGlobalStorageValue(emGuerra) <= 0 then return doPlayerSendCancel(cid,"O Castelo nao está em guerra!") end if getPlayerGuildId(cid) == getGlobalStorageValue(storage) then return doPlayerSendCancel(cid,"Sua guild ja está dominando o castelo!") end setGlobalStorageValue(storage,getPlayerGuildId(cid)) doBroadcastMessage("A Guild ".. getPlayerGuildName(cid) .." dominou o castelo!",22) return true end Não mude nada a não ser que não saiba o que esteja fazendo! em Data/actions/actions.xml coloque isso: <action actionid="1755" script="castlewar-action.lua" /> em data/movements/scripts/ crie um arquivo chamado castlewar-movements.lua e coloque isso: local storage = 1755 local emGuerra = 1756 function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if getGlobalStorageValue(storage) == getPlayerGuildId(cid) then return true end if getGlobalStorageValue(emGuerra) == 1 then return true else doTeleportThing(cid,fromPosition,false) return doPlayerSendCancel(cid,"Por favor espere a batalha começar!") end return true end em data/movements/movements.xml coloque isso: <movevent type="StepIn" actionid="1756" event="script" value="castlewar-movements.lua"/> em data/talkactions/scripts/ crie um arquivo chamado castlewar-talk.lua e coloque isso: local storage = 1755 local emGuerra = 1756 local firstpos = {x = 582,y = 1290,z = 7} local secondpos = {x = 802,y = 1490,z = 0} function onSay(cid, words, param) if param == "open" then setGlobalStorageValue(emGuerra,1) doBroadcastMessage("A Guerra pelo castelo começou!",22) return true elseif param == "close" then for _, pid in ipairs(getPlayersOnline()) do if isInArea(getCreaturePosition(pid),firstpos,secondpos)then if getGlobalStorageValue(storage) ~= getPlayerGuildId(pid) then doTeleportThing(pid,getTownTemplePosition(getPlayerTown(pid))) doPlayerSendTextMessage(pid, MESSAGE_STATUS_CONSOLE_BLUE,"Desculpe mas sua guild não venceu essa guerra!") else doPlayerSendTextMessage(pid,MESSAGE_STATUS_CONSOLE_BLUE,"Sua guild conseguio dominar o castelo. Parabens por ajuda-la!") end end end setGlobalStorageValue(emGuerra,0) doBroadcastMessage("A Guerra pelo castelo terminou!",22) else return doPlayerSendCancel(cid,"Digite !war open[inicia a guerra] ou !war close[terminaa guerra]") end return true end local firstpos = {x = 582,y = 1290,z = 7} local secondpos = {x = 802,y = 1490,z = 0} ./\ edite essa parte com forme no tutorial das SS's e em data/talkactions/talkactions.xml adicione isso: <talkaction log="yes" words="!war" access="5" event="script" value="castlewar-talk.lua"/> Tutorial: MAPA Preencha todo o castelo com PVP TileZone, exceto a parte de caça para a guild dominante [que deverá ficar no subsolo do castelo] Depois siga o mapinha [nao zoapq fiz em 2 min pa demonstrar kpoekopkepo...] SS1: Castelo inteiro [nao zoa plz kkk] Resto de instalações: OBS : Script completo retirado de outro fórum por DrakyLucas. Creditos : DrakyLucas 100%.
  11. Fala galerinha, este é um sistema bastante procurado por todos os donos de servidores 9.6+ pelo fato de não possuir o Rule Violation, eu procurei por ele aqui no TK e acabei não encontrando, então resolvi compartilhar com vocês. Bom, vamos ao que interessa.. Os créditos do sistema encontram-se no final do tópico... Vá até sua database e execute a seguinte query: CREATE TABLE ban_table ( id INTEGER NOT NULL, account INTEGER NOT NULL, added INTEGER NOT NULL, expires INTEGER NOT NULL, admin_id INTEGER NOT NULL DEFAULT 0, comment TEXT NOT NULL, PRIMARY KEY ( id ) ); Vá até sua data/talkactions abra seu aquivo talkactions.xml e remova os comandos (caso exista): /ban /unban /baninfo Agora em data/talkactions, abra o arquivo talkactions.xml e adiciona a seguinte tag: <talkaction log="yes" words="/unban;/ban;/baninfo" access="4" event="script" value="bansystem.lua"/> Em data/talkactions/scripts crie um arquivo chamado bansystem.lua com isto: function onSay(cid, words, param) if words == "/unban" then if not param or param == "" then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "enter a valid name.") return true end local param = param:lower() local player = getPlayerGUIDByName(param) if not player then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "this player does not exist.") return true elseif not isAccountBan(getAccountIdByName(param)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "That player or account is not banished or deleted.") return true end doRemoveBanAccount(getAccountIdByName(param)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, param.." has unbanned successfully.") elseif words == "/ban" then local t = string.explode(string.lower(param), ",") if not t[1] then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.") return true end local player = getPlayerGUIDByName(t[1]) if not player then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player not found.") return true elseif isAccountBan(getAccountIdByName(t[1])) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "this player is already banished.") return true end local hours,comment = not tonumber(t[2]) and 24 or tonumber(t[2]),not t[3] and "No Reason" or t[3] doBroadcastMessage(t[1].." was banned by "..getCreatureName(cid)..": "..comment) doBanirAccount(getAccountIdByName(t[1]), os.time() + hours*3600, getCreatureName(cid), comment) if getPlayerByNameWildcard(t[1]) then doRemoveCreature(getPlayerByNameWildcard(t[1])) end elseif words == "/baninfo" then if not param or param == "" then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "enter a valid name.") return true end local param = param:lower() local player = getPlayerGUIDByName(param) if not player then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "this player does not exist.") return true elseif not isAccountBan(getAccountIdByName(param)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "That player or account is not banished or deleted.") return true end local acc = getAccountIdByName(param) local baninfo = getBanAccInfo(acc) doPlayerPopupFYI(cid, "Account has been banished at:\n"..os.date("%d %b %Y",baninfo[1])..".\n\nfor the following reason:\n"..baninfo[2]..".\n\nBanned By: "..baninfo[3].."\n\nYour banishment will be lifted at:\n"..os.date("%d %b %Y %X",baninfo[1])..".") end return true end Em data/creaturescript abra o arquivo chamado creaturescript.xml e adicione a tag: <event type="login" name="BanLogin" event="script" value="BanLogin.lua"/> Em data/creaturescript/scripts crie um arquivo chamado BanLogin.lua com isto: function onLogin(cid) local MyAccount = getPlayerAccountId(cid) if isAccountBan(MyAccount) then local baninfo = getBanAccInfo(MyAccount) doPlayerPopupFYI(cid, "You account has been banished at:\n"..os.date("%d %b %Y",baninfo[1])..".\n\nfor the following reason:\n"..baninfo[2]..".\n\nYour banishment will be lifted at:\n"..os.date("%d %b %Y %X",baninfo[1])..".") addEvent(doRemoveCreature, 1500, cid) end return true end Em data/lib crie um arquivo chamado BanLib.lua com isto: function doBanirAccount(accid, time, admin_id, comment) return db.executeQuery("INSERT INTO `ban_table` (`account`, `added`, `expires`, `admin_id`, `comment`) VALUES ('".. accid .."', '".. os.time() .."', '".. time .."', '".. admin_id .."', '".. comment .."');") end function getBanAccInfo(acc) local info,qry = {},db.getResult("SELECT `expires`, `comment`, `admin_id` FROM `ban_table` WHERE `account` = "..acc) if (qry:getID() ~= -1) then info = {qry:getDataInt("expires"), qry:getDataString("comment"), qry:getDataString("admin_id")} end return #info > 0 and info or false end function isAccountBan(acc) local qry = db.getResult("SELECT `expires` FROM `ban_table` WHERE `account` = "..acc) if (qry:getID() ~= -1) then if os.time() < qry:getDataInt("expires") then return true end if os.time() >= qry:getDataInt("expires") then db.executeQuery("DELETE FROM `ban_table` WHERE`account` = "..acc) end end return false end function doRemoveBanAccount(acc) return db.executeQuery("DELETE FROM `ban_table` WHERE `account` = "..acc) end Prontinho, seu script está pronto para ser utilizado! VOCÊ PODE USAR UM MOD AO INVÉS DE TODOS ESSES SCRIPTS ACIMA... Na pasta raiz do seu server abra a pasta /mods e cria um arquivo chamado BanCommand.xml com isso: <?xml version="1.0" encoding="ISO-8859-1"?> <mod name="Ban Command" version="1.0" author="Vodkart" contact="none.com" enabled="yes"> <config name="ban_func"><![CDATA[ function doBanirAccount(accid, time, admin_id, comment) return db.executeQuery("INSERT INTO `ban_table` (`account`, `added`, `expires`, `admin_id`, `comment`) VALUES ('".. accid .."', '".. os.time() .."', '".. time .."', '".. admin_id .."', '".. comment .."');") end function getBanAccInfo(acc) local info,qry = {},db.getResult("SELECT `expires`, `comment`, `admin_id` FROM `ban_table` WHERE `account` = "..acc) if (qry:getID() ~= -1) then info = {qry:getDataInt("expires"), qry:getDataString("comment"), qry:getDataString("admin_id")} end return #info > 0 and info or false end function isAccountBan(acc) local qry = db.getResult("SELECT `expires` FROM `ban_table` WHERE `account` = "..acc) if (qry:getID() ~= -1) then if os.time() < qry:getDataInt("expires") then return true end if os.time() >= qry:getDataInt("expires") then db.executeQuery("DELETE FROM `ban_table` WHERE`account` = "..acc) end end return false end function doRemoveBanAccount(acc) return db.executeQuery("DELETE FROM `ban_table` WHERE `account` = "..acc) end ]]></config> <event type="login" name="BanLogin" event="script"><![CDATA[ domodlib('ban_func') function onLogin(cid) local MyAccount = getPlayerAccountId(cid) if isAccountBan(MyAccount) then local baninfo = getBanAccInfo(MyAccount) doPlayerPopupFYI(cid, "You account has been banished at:\n"..os.date("%d %b %Y",baninfo[1])..".\n\nfor the following reason:\n"..baninfo[2]..".\n\nYour banishment will be lifted at:\n"..os.date("%d %b %Y %X",baninfo[1])..".") addEvent(doRemoveCreature, 1500, cid) end return true end]]></event> <talkaction words="/unban;/ban;/baninfo" access="4" event="buffer"><![CDATA[ domodlib('ban_func') if words == "/unban" then if not param or param == "" then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "enter a valid name.") return true end local param = param:lower() local player = getPlayerGUIDByName(param) if not player then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "this player does not exist.") return true elseif not isAccountBan(getAccountIdByName(param)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "That player or account is not banished or deleted.") return true end doRemoveBanAccount(getAccountIdByName(param)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, param.." has unbanned successfully.") elseif words == "/ban" then local t = string.explode(string.lower(param), ",") if not t[1] then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.") return true end local player = getPlayerGUIDByName(t[1]) if not player then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player not found.") return true elseif isAccountBan(getAccountIdByName(t[1])) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "this player is already banished.") return true end local hours,comment = not tonumber(t[2]) and 24 or tonumber(t[2]),not t[3] and "No Reason" or t[3] doBroadcastMessage(t[1].." was banned by "..getCreatureName(cid)..": "..comment) doBanirAccount(getAccountIdByName(t[1]), os.time() + hours*3600, getCreatureName(cid), comment) if getPlayerByNameWildcard(t[1]) then doRemoveCreature(getPlayerByNameWildcard(t[1])) end elseif words == "/baninfo" then if not param or param == "" then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "enter a valid name.") return true end local param = param:lower() local player = getPlayerGUIDByName(param) if not player then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "this player does not exist.") return true elseif not isAccountBan(getAccountIdByName(param)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "That player or account is not banished or deleted.") return true end local acc = getAccountIdByName(param) local baninfo = getBanAccInfo(acc) doPlayerPopupFYI(cid, "Account has been banished at:\n"..os.date("%d %b %Y",baninfo[1])..".\n\nfor the following reason:\n"..baninfo[2]..".\n\nBanned By: "..baninfo[3].."\n\nYour banishment will be lifted at:\n"..os.date("%d %b %Y %X",baninfo[1])..".") end return true ]]></talkaction> </mod> ESSE SCRIPT FOI INTEIRAMENTE CRIADO PELO VODKART, TODOS OS CRÉDITOS SÃO DELE! Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  12. Últimas atualizações: 16/12/2013: Introdução: Este é o meu já conhecido evento Blood Castle Automático que estava em outro fórum que acabou. Estou trazendo ele aqui para que ele não "morra". Informações: #Dica: Acho que fica legal o premio do evento ser um item que da double exp por um tempo. Atualização [12/04/2014] Resolvi refazer o código, para facilitar a instalação e melhorar o funcionamento do evento. O que mudou? Instalando o evento: Lib: Movements: Creaturescripts: Monsters: O evento pode acontecer de duas maneiras: automática ou manualmente. Vou por as duas possibilidades: Automática: Manual: Como Configurar: * Se você for colocar, dentro do evento, um teleporte para as pessoas que não quiserem mais participar, coloque o Action ID 9371 nele. * Lembre-se de por NO-LOGOUT tool e NO-PVP tool em toda área do evento!! Todas as demais explicações estão na lib, mas vou demonstrar como configurar os mais "confusos". No modo automático, você configura de quanto em quanto o tempo o evento vai acontecer. Nessa tag: <globalevent name="Blood Castle" interval="3600" event="script" value="BloodGlobalEvent.lua"/> Aqui está 3600 segundos, ou seja, 1 hora. * Se seu servidor for em milisegundos, multiplique o número por 1000, assim: 3600 segundos * 1000 = 3600000 milisegundos = 1 hora. No modo manual, para iniciar o evento, basta usar a talkaction /blood-start com seu god. Em posGuarda, vc deve colocar a posicao do Guarda do Portao, como mostrado abaixo: As posPedras são onde ficam as pedras que tampam a passagem enquanto o evento não esta aberto, conforme na imagem abaixo: Em estátua, vc deve colocar a posição em que o arcanjo vai ser criado, conforme na imagem abaixo: Nas posParedes, vc deve por a posição das paredes que bloqueiam a entrada do castelo e que são removidas quando o guarda morre, conforme abaixo: Em fromPos e toPos, você vai por o canto superior esquerdo e o canto inferior direito do mapa do seu evento, respectivamente. Dessa maneira: As outras configurações eu acredito que já estejam bem explicadas. Espero que gostem dessa nova versão. Recomendo a todos que já usam o evento, reinstalar com essa nova versão. Qualquer dúvida ou bug, postem que irei responder.
  13. Olá TK, Hoje trago para vocês um MOD bem interessante que encontrei na internet, a lógica é bem simples, você usa um item e ganha mais XP durante um tempo. O item, a XP e o tempo são totalmente configuráveis, vocês podem mudar como quiserem. FUNCIONA COM TFS 0.4 E DEVE FUNCIONAR COM 0.3.6 (NÃO TESTADO) Eu vou testar com a minha versão 0.3.7 quando chegar em casa e edito o post para vocês. Bem, então vamos ao script, Abra a pasta "mods" do seu servidor e crie um arquivo chamado expscroll.xml, abra e coloque o seguinte código: <?xml version="1.0" encoding="UTF-8"?> <mod name="Experience Stages Scroll" version="1.0" author="TomCrusher" contact="otland.net" enabled="yes"> <action itemid="9004" event="script" value="expstagescroll.lua"/> <creatureevent type="think" name="ExpStage" event="script" value="expstagescroll.lua"/> <creatureevent type="login" name="ExpStageLogin" event="script" value="expstagescroll.lua"/> </mod> Agora em "mods/scripts", crie um arquivo chamado expstagescroll.lua e coloque este código: local config = { rate = 2, storage = 1000, expstorage = 1100, register = 1200, time = 14400, } function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerStorageValue(cid, config.storage) <= 0 then local rates = getPlayerRates(cid) setPlayerStorageValue(cid, config.expstorage, rates[SKILL__LEVEL]) setPlayerStorageValue(cid, config.register, 1) itemEx=itemid == 9004 doCreatureSay(cid, "Your extra experience rate has been activated! It now is: " .. config.rate .. "x added to your former experience rate.", TALKTYPE_ORANGE_1, true, cid) setPlayerStorageValue(cid, config.storage, os.time()+config.time) doPlayerSetExperienceRate(cid, rates[SKILL__LEVEL]+config.rate) doRemoveItem(item.uid,1) registerCreatureEvent(cid, "ExpStage") else doCreatureSay(cid, "You must finish first exp condition to start other exp condition !", TALKTYPE_ORANGE_1, true, cid) end return true end function onThink(cid, interval) if getPlayerStorageValue(cid, config.register) == 1 then if getPlayerStorageValue(cid, config.storage) <= os.time() then doCreatureSay(cid, "Your extra experience rate has finished! It is now normaly experience rate.", TALKTYPE_ORANGE_1, true, cid) setPlayerStorageValue(cid, config.storage, 0) setPlayerStorageValue(cid, config.register, 0) local oldexp = getPlayerStorageValue(cid, config.expstorage) doPlayerSetExperienceRate(cid, oldexp) unregisterCreatureEvent(cid, "ExpStage") end end return true end function onLogin(cid) if getPlayerStorageValue(cid, config.register) == 1 then registerCreatureEvent(cid, "ExpStage") local rates = getPlayerRates(cid) doCreatureSay(cid, "Your extra experience rate is still here! It is: " .. config.rate .. "x added to your former experience rate.", TALKTYPE_ORANGE_1, true, cid) if getPlayerStorageValue(cid, config.storage) > os.time() then local oldexp = getPlayerStorageValue(cid, config.expstorage) doPlayerSetExperienceRate(cid, oldexp+config.rate) end end return true end Configurando: rate = 2, -- número que irá ser multiplicado pela sua exp rate básica (funciona com números quebrados, tais como 1.5 ou 0.2). storage = 1000, -- storage que irá guardar o tempo expstorage = 1100, -- storage que irá guardar a xp register = 1200, -- storage que indica se o player está registrado no mod time = 14400, -- tempo que falta para o buff do scroll acabar (o tempo é calculado em segundos, ex: 14400 segundos = 24 horas) ___________________________________________________________________________________________________________________________________ Créditos : TomCrusher (OTland) - Desenvolveu o sistema Eu - Traduzi e postei aqui.
  14. Olá pessoal do TibiaKing, Já estou de saco cheio, esse bando de humanos querendo tirar aproveito de coisas falsas e piratas, cobrando um valor altíssimo por códigos, ou seja, cobrando por meros combinações de códigos... O cara fez um trabalho legal? Sim, fez, porém, está usando coisas falsas para serem revendidas (pirataria), como por exemplo : War System (hoje não é mais vendido, já é gratuito) Cast System (estará sendo postado gratuitamente) TFS e Distros (Sem permissões do verdadeiro criado de Tibia) E muitos outros... Vem o que vem no conteúdo a seguir contem os seguintes items : Sourcers com o Cast System. Código MySQL para você por na sua database. Talkaction para o player poder executar o comando. Livestream.php, que é a página do Cast System com comandos e outros (não sei se suporta em Gesior, porém, sei que suporta em Modern). Link para download: Cast System TFS 0.4 8.6.rar Scan: Aqui! Bem, sei que nas sourcers modificadas tem essas marcações : //CA (Significa que há alterações relacionadas ao sistema do Cast) NÃO ESQUEÇA DE ADICIONAR ISSO NO CONFIG.LUA : enableCast = "true" (Obrigado Sammy) O auto do Script ? Créditos : Summ (Obrigado Fireelement). Bem, esse é apenas suporte para 8.6, em breve postarei a versão 9.6. Lembre-se: um bom scripter nunca deve tirar aproveito de alguém por dinheiro (vendendo script), principalmente revendendo.
  15. Bom galera com muita gente quer o tal cast tv está ai, LEMBRADO É SISTEMA REPLICA DO PARAGUAI , ENTÃO BOM USO Versão testada: TFS 8.6 0.4 e TFS 0.3.6 8.6 Comandos utilizados in-game: !cast on -- Ativa o seu Cast System, e permite os outros jogadores te assistirem; !cast off -- Desativa o seu Cast System; !cast exit -- Você sai do Cast no qual está assistindo; !cast NAME -- Começa a assistir um jogador (NAME). Instalação Vá em data/talkactions/scripts crie um arquivo chamado castSys.lua e adicione o seguinte código dentro do mesmo: --[[ Perfect Cast System 1.0 by Roksas ]]-- function onSay(cid, words, param) local player = getPlayerByName(param) if not isInArray({"list", "exit", "off", "on"}, param) and not param or param == "" then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "Enter the name of the player, which you want to cast in parameters.") return true end if param == "on" then if getPlayerStorageValue(cid, 10359) >= 1 then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "Your Cast System is already running ONLINE!") return true end castOn(cid) doSendMagicEffect(getThingPos(cid), 39) doPlayerSendTextMessage(cid, 20, "You have activated your Cast System, now others can cast you, to disable this feature, use the parameter '!cast off'.") return true end if param == "off" then if getPlayerStorageValue(cid, 10359) < 1 then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "Your Cast System is already OFFLINE!") return true end castOff(cid) doSendMagicEffect(getThingPos(cid), 39) doPlayerSendTextMessage(cid, 20, "You have disabled your Cast System, from now on no one can watch you, unless you turn on the Cast, using the parameter '!cast on'.") return true end if param == "exit" then if getPlayerStorageValue(cid, 12269) < 1 then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "You no are casting players.") return true end cancelCast(cid) doSendMagicEffect(getThingPos(cid), 39) doPlayerSendTextMessage(cid, 20, "You stopped casting, use the parameter '!cast list' to see who can be casted.") return true end if param == "list" then if #whoCasted() < 1 then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "At this time, no player can be casted, try again later.") return true end doPlayerSendTextMessage(cid, 20, "Players can be casteds:\n\n") for k, v in ipairs(whoCasted()) do doPlayerSendTextMessage(cid, 20, " - "..getCreatureName(v).."") end return true end if not isPlayer(player) then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "This player is offline or does not exist. Use the parameter '!cast list' to see who can be casted.") return true end if getPlayerStorageValue(player, 10359) < 1 then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "You can only cast one person with the Cast System is activated, use the parameter '!cast list' to see who can be assisted.") return true end if getPlayerStorageValue(cid, 10359) >= 1 then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendTextMessage(cid, 20, "To cast a player, you must first disable your Cast System using the parameter '!cast off'.") return true end if not getTileInfo(getThingPos(cid)).protection then return doPlayerSendTextMessage(cid, 20, "You need enter in Protection Zone to use the Cast System.") and true end setPlayerStorageValue(cid, 12269, 1) castPlayer(cid, player) doSendMagicEffect(getThingPos(cid), 39) doPlayerSendTextMessage(cid, 20, "You are casting the player "..getCreatureName(player)..", to exit just use the command '!cast exit'.") doPlayerSendTextMessage(player, 20, "You are casted by "..getCreatureName(cid).." player to disable your Cast, simply use the parameter '!cast off'.") return true end function cancelCast(uid) mayNotMove(uid, false) doCreatureSetHideHealth(uid, false) setPlayerStorageValue(uid, 12269, -1) doRemoveCondition(uid, CONDITION_OUTFIT) return doTeleportThing(uid, getTownTemplePosition(getPlayerTown(uid))) or doTeleportThing(uid, getPlayerMasterPos(uid)) and true end function castOn(uid) return setPlayerStorageValue(uid, 10359, 1) and true end function castOff(uid) return setPlayerStorageValue(uid, 10359, -1) and true end function castPlayer(uid, player) if not isPlayer(player) then cancelCast(uid) return true end if getPlayerStorageValue(player, 10359) < 1 then cancelCast(uid) return true end if getPlayerStorageValue(uid, 12269) < 1 then cancelCast(uid) return true end mayNotMove(uid, true) doSetItemOutfit(uid, 1934, -1) doCreatureSetHideHealth(uid, true) doTeleportThing(uid, getThingPos(player)) return addEvent(castPlayer, 1 * 1000, uid, player) and true end function whoCasted() local casteds = {} for _, pid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(pid, 10359) >= 1 then table.insert(casteds, pid) end end return #casteds > 0 and casteds or {} end Volte uma pasta (data/talkaction) abra com algum editor de texto o arquivo talkactions.xml e adicione essa tag em qualquer lugar: <talkaction words="!cast;/cast" event="script" value="castSys.lua"/> Muito bem, após isso siga para a pasta data/creaturescripts/scripts, faça o mesmo, crie um arquivo chamado castSys.lua e adicione isso function onLogout(cid) if getPlayerStorageValue(cid, 12269) > 0 then doPlayerSendCancel(cid, "To logout, you need to exit the Cast System first. Use the parameter '!cast exit'.") return false end setPlayerStorageValue(cid, 10359, -1) return true end function onStatsChange(cid, attacker, type, combat, value) if not isCreature(cid) then return true end if getPlayerStorageValue(cid, 12269) >= 1 and isMonster(attacker) or isPlayer(attacker) then return false end return true end function onAttack(cid, target) if not isPlayer(cid) or not isPlayer(target) then return true end if getPlayerStorageValue(cid, 12269) > 0 then doRemoveCondition(cid, CONDITION_INFIGHT) return false end return true end Já no arquivo creaturescripts.xml, você vai adicionar essa tag: <event type="attack" name="castAttack" event="script" value="castSys.lua"/> <event type="statschange" name="castHits" event="script" value="castSys.lua"/> <event type="logout" name="castLogout" event="script" value="castSys.lua"/> E no arquivo login.lua você vai adicionar essas 3 linhas: registerCreatureEvent(cid, "castAttack") registerCreatureEvent(cid, "castHits") registerCreatureEvent(cid, "castLogout") Para que o player que está assitindo ao outro não use magias enquanto está assistindo, coloque essas linhas abaixo dentro de cada script das magias, debaixo da linha: function onCastSpell(cid, var) Coloque: if getPlayerStorageValue(cid, 12269) >= 1 then return false end Prontinho galera, basta reiniciar o servidor e usar, é isto por hoje, espero que tenham gostado, ideias/sugestões para futuras versões, bugs ou críticas sobre o sistema, basta deixar um simples comentário aí no tópico, estarei aqui para atendê-los.
  16. Esse sistema usa premium points, bom para otserv que nao tem site baiak, mapa proprio daria pra usar com global tambem fica a escolha de quem usar. Testado em: TFS 0.3 e 0.4 Vamos instalar o sistema, primeiro entre em data/libs e abra o arquivo 050-function.lua e adicione: depois de ter feito isso vamos criar a talkactions que comprará o item e removerá os pontos da conta, entre em data/talkactions/scripts e crie o arquivo vipsword.lua e adicione: function onSay(cid, words, param) if ChecarPontos(cid) >= 2 then doPlayerAddItem(cid,2400,1) RemoverPontos(cid, 2) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce compro uma vip sword por 2 pontos!") else doPlayerSendCancel(cid, "Voce nao tem pontos suficiente!") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) end return TRUE end Configurando: ChecarPontos(cid) >= 2 doPlayerAddItem(cid,2400,1) RemoverPontos(cid, 2) No Verde e Laranja coloca quantos pontos quer remover da conta. No Azul id do item. No Vermelho quantidade do item. apos te configurado abra o talkactions.xml e adicione a seguinte linha: <talkaction words="!vipsword" event="script" value="vipsword.lua"/> para cada item que vc quizer adiciona basta crar um novo arquivo lua por o script e editar com o items desejado e adicionando em talkactions.xml. Os adms que quizerem por os pontos para vender por crystal coin o script e esse abaixo, entre em data/talkactions/scripts e crie o arquivo buypontos.lua e adicione: function onSay(cid, words, param) if getPlayerItemCount(cid, 2160) >= 10 then doPlayerRemoveItem(cid, 2160, 10) AddPontos(cid, 5) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce comprou 10 pontos") else doPlayerSendCancel(cid, "Voce nao tem dinheiro suficiente para comprar pontos!") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) end return TRUE end Configurando: getPlayerItemCount(cid, 2160) >= 10 then doPlayerRemoveItem(cid, 2160, 10) AddPontos(cid, 5) No Marron coloca quantos crystal coin quer remover do player No Rosa quantidade de pontos para adicionar ao player. apos te configurado abra o talkactions.xml e adicione a seguinte linha: <talkaction words="!buypontos" event="script" value="buypontos.lua"/> para funcionar perfeitamente execute no mysql:
  17. Fala galera do TK, hoje vim compartilhar com vocês um sistema que eu comecei a fazer com a ajuda de um amigo ... Bem, ele é viciado em Skyrim e esses dias a gente ficou quase 10 horas sem internet , e foi nesse meio tempo de tédio que eu decidi fazer um sistema baseado nas Bold Weapons do Skyrim e ele foi me dando uns toques pra eu poder melhorar o script. Se você nunca jogou Skyrim ou não se lembra eu vou explicar oque é: ​ Um sistema que você conjura uma arma feita de magia referente a sua classe mas se vc tentar tirar ela da mão, ela some. O Script em si é bem simpleszinho mas vc tem que fazer diversas alterações no server pra que ele fique 100% então aqui vamos nós: Antes de tudo eu gostaria de dizer que eu altamente recomendo que você crie novos itens no seu Item Editor pra evitar problemas futuros mas use as sprites dos itens que eu irei passar aqui nesse tópico. Abra seu weapons.xml e adicione as seguintes linhas (note que vc deve procurar os id's antes pra ver se já não existe ele declarado, caso haja, delete as linhas antigas e adicione as novas): <!-- AURA ITEMS --> <movevent type="DeEquip" itemid="7773" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7774" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="8854" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7775" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7766" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7772" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7424" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7451" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="8858" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7450" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7407" slot="right-hand" event="script" value="item.lua"/> <movevent type="DeEquip" itemid="7455" slot="right-hand" event="script" value="item.lua"/> aqui temos todos os ids dos items e o slot da função como sendo a mão esquerda (direita da tela >>) eu fiz utilizando esse slot porque os itens são criados lá diretamente e evita erros na distro ​ e na pasta movements\scripts adicione o arquivo item.lua que deverá conter o seguinte: ​ <instant name="Weapon Aura" words="Aurum" lvl="100" manapercent="60" aggressive="0" exhaustion="2000" needlearn="0" event="script" value="especiais/weaponaura.lua"> </instant> aqui vc vai configurar a palavra que vc diz pra conjurar a magia, o level dela e a porcentagem de mana que vai consumir ao usar a spell. Ainda na pasta spells vá em scripts e crie uma nova pasta chamada especiais e crie um arquivo chamado weaponaura.lua que deverá conter o seguinte: ​ Agora você tem que garantir que o player não irá dar trade nos itens, para isso vá em creaturescripts\scripts e crie um arquivo chamado untrade.lua e coloque isso dentro dele: ​ Feito isso você deve ir no creaturescripts.xml e adicionar essa linha aqui: <event type="traderequest" name="UntradeAura" event="script" value="untrade.lua"/> agora abra o login.lua que fica em creaturescripts\scripts e antes do ultimo return true adicione isso daqui: ---- AURA ITENS ---- registerCreatureEvent(cid, "UntradeAura") ______________________________________________________________________ Se você conseguiu fazer tudo até agora isso significa que você sabe ler. Se alguma coisa deu merda volte ao início e releia tudo com atenção! _______________________________________________________________________ Eu pessoalmente achei o sistema super bacana, ainda mais pra servidores sérios.. Testei aqui no meu TFS 0.3.6 (Crying Damson) e rodou tudo perfeitamente... quaisquer erros poste aqui no tópico que eu tento ajudar a resolver, mas é claro que na medida do possível, to sem tempo pra viver então não me peça pra adaptar o script pra sua versão 7.6 ou 10.1... ele foi feito pra 8.54! Espero que pelo menos alguém use esse sistema pq deu uma trabalheira danada pra fazer, e claro, se te ajudei, fortaleça com um REP que eu vou saber que você gostou do sistema. Grato. Mais uma coisa e talvez a mais importante do tópico: Esse script foi feito por mim, Night Wolf ou White Wolf (como vcs preferirem), e é conteudo >>> EXCLUSIVO <<<< do TIBIA KING. Não postem sem minha permissão que eu prometo continuar fazendo coisas legais pra vocês :angry2:. Abraço do Night. PS: Pra que o sistema funcione vc deve deixar as duas mãos vazias e falar Aurum, o script vai checar sua classe e te dar a weapon referente, caso vc seja Knight ele vai te dar a arma do tipo cujo sua proficiência seja a melhor.. (Em outras palavras: pegar a sua maior skill, se for sword vai te dar sword e assim por diante.. No caso de empate ele vai te dar sword e no caso de empate entre axe e club ele vai te dar club.) Note que não vai ser possível remover o item nem pra BP nem pra outro slot e nem pro chão... e também não é possível dar trade no item. Vou anexar umas imagens aqui pro pessoal ver melhor:
  18. Este script dá double exp à todos os player que estiverem online ou entrarem durante o tempo especificado no dia X. Pra quem não sabe, apenas crie um arquivo "QUALQUER-NOME.xml" na pasta "mods" (mesmo lugar do executável do servidor), cole isso dentro e salve: É isso aí galera, caso tenha dúvidas poste aqui. Créditos: Script: Tomek Xevis Tópico: Eu '-'
  19. Testado nas versões 8.60 - 9.43. Na pasta data/lib/pets.lua: --Circles AREA_CIRCLE2X2 = { {0, 1, 1, 1, 0}, {1, 1, 1, 1, 1}, {1, 1, 3, 1, 1}, {1, 1, 1, 1, 1}, {0, 1, 1, 1, 0} } AREA_CIRCLE3X3 = { {0, 0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 3, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 0, 0} } -- Crosses AREA_CROSS1X1 = { {0, 1, 0}, {1, 3, 1}, {0, 1, 0} } AREA_CROSS5X5 = { {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} } AREA_CROSS6X6 = { {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0} } --Squares AREA_SQUARE1X1 = { {1, 1, 1}, {1, 3, 1}, {1, 1, 1} } -- Walls AREA_WALLFIELD = { {1, 1, 3, 1, 1} } AREADIAGONAL_WALLFIELD = { {0, 0, 0, 0, 1}, {0, 0, 0, 1, 1}, {0, 1, 3, 1, 0}, {1, 1, 0, 0, 0}, {1, 0, 0, 0, 0}, } TYPE_NEAR = 1 TYPE_DISTANCE = 2 petExhaust = 3 --in seconds petSayExhaust = 3 --in seconds petGainTicks = { health = {func = doCreatureAddHealth, time = 3000, count = 1}, mana = {func = doCreatureAddMana, time = 3000, count = 2} } petGainHealth = 30 petGainMana = 30 petExpRate = 1.3 carryItems = 10 petItemsBase = 1250 petItems = {} blockedItems = {6132, 2195} for i = 1, carryItems do table.insert(petItems, petItemsBase + i) end petBase = 61200 petStorages = { pet = petBase + 1, level = petBase + 2, exp = petBase + 3, items = petBase + 4, isPet = petBase + 5, isDead = petBase + 6, exhaust = petBase + 7, sayExhaust = petBase + 8, moveExhaust = petBase + 9, health = petBase + 10, mana = petBase + 11 } reviveCost = 1000 pets = { [1] = { monster = "orc spearman", vocations = {1, 2, 3, 4}, level = 30, attacks = { [1] = {name = "", level = 30, petLevel = 30, mana = 50, type = TYPE_DISTANCE, range = 10, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_NONE, distEffect = CONST_ANI_SPEAR, damageMin = 0.7, damageMax = 1.0} } }, [2] = { monster = "fire devil", vocations = {1, 2}, level = 60, attacks = { [1] = {name = "Fire Strike", level = 60, petLevel = 60, mana = 100, type = TYPE_DISTANCE, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0} } }, [3] = { monster = "minotaur guard", vocations = {3, 4}, level = 60, attacks = { [1] = {name = "Punch", level = 60, petLevel = 60, mana = 55, type = TYPE_NEAR, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_NONE, damageMin = 1.5, damageMax = 2.0} } }, [4] = { monster = "water elemental", vocations = {2}, level = 95, attacks = { [1] = {name = "Ice Bomb", level = 100, petLevel = 100, mana = 250, type = TYPE_DISTANCE, range = 3, combat = COMBAT_ICEDAMAGE, effect = CONST_ME_ICEAREA, distEffect = CONST_ANI_ICE, damageMin = 1.5, damageMax = 2.0, area = {{0, 0, 1, 0, 0}, {0, 1, 3, 1, 0}, {0, 0, 1, 0, 0}}}, [2] = {name = "Poison Strike", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, range = 8, combat = COMBAT_EARTHDAMAGE, effect = CONST_ME_GREENRINGS, distEffect = CONST_ANI_POISON, damageMin = 1.2, damageMax = 1.8} } }, [5] = { monster = "fire elemental", vocations = {1}, level = 95, attacks = { [1] = {name = "Fire Bomb", level = 100, petLevel = 100, mana = 250, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0, area = {{0, 0, 1, 0, 0}, {0, 1, 3, 1, 0}, {0, 0, 1, 0, 0}}}, [2] = {name = "Fire Strike", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.2, damageMax = 1.8} } }, [6] = { monster = "orc warlord", vocations = {4}, level = 95, attacks = { [1] = {name = "Throw Knife", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_THROWINGKNIFE, damageMin = 1.5, damageMax = 2.0} } }, [7] = { monster = "golem", vocations = {3}, level = 95, attacks = { [1] = {name = "Throw Stone", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_LARGEROCK, damageMin = 1.5, damageMax = 2.0} } }, [8] = { monster = "wyrm", vocations = {1, 2, 3, 4}, level = 135 }, [9] = { monster = "dragon lord", vocations = {1, 2, 3, 4}, level = 200, attacks = { [1] = {name = "Fire Bomb", level = 200, petLevel = 200, mana = 300, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0, area = AREA_CROSS1X1}, [2] = {name = "Fire Storm", level = 205, petLevel = 220, mana = 700, type = TYPE_NEAR, range = 8, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.8, damageMax = 2.5, area = AREA_CROSS5X5}, [3] = {name = "Fire Explosion", level = 203, petLevel = 210, mana = 450, type = TYPE_DISTANCE, range = 6, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_EXPLOSIONHIT, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.1, area = AREA_CIRCLE2X2}, [4] = {name = "Scratch", level = 201, petLevel = 205, mana = 150, type = TYPE_NEAR, range = 1, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_HITAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.3, damageMax = 1.8}, [5] = {name = "Fire Strike", level = 203, petLevel = 210, mana = 100, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_EXPLOSIONAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.8, damageMax = 1.9} } } } function gainStat(pid, stat) if pid and pid > 0 and isMonster(pid) then stat.func(pid, stat.count) end addEvent(gainStat, stat.time, pid, stat) end function getLevelByExp(exp) return math.floor((math.sqrt(3) * math.sqrt(243*(exp+1)^2-48600*(exp+1)+3680000)+27 * (exp+1)-2700)^(1/3)/30^(2/3)-(5*10^(2/3))/(3^(1/3)*(math.sqrt(3)*math.sqrt(243*(exp+1)^2-48600*(exp+1)+3680000)+27*(exp+1)-2700)^(1/3))+2) end function getPetInfo(pet) if isNumber(pet) then return pets[pet] or false else for _, v in pairs(pets) do if pet:lower() == v.monster then return v end end end return false end function getPetByLevel(cid) local level = getPlayerLevel(cid) local pet for i = 1, #pets do v = pets[i] if level >= v.level and isInArray(v.vocations, getPlayerVocation(cid)) then pet = v end end return (pet ~= nil and pet or false) end function getAttackFormula(pid, attack) return { min = ((getPetLevel(pid) * 2) * (1 + attack.damageMin) + getPetLevel(pid)) / 2.5, max = ((getPetLevel(pid) * 3) * (1 + attack.damageMax) + getPetLevel(pid)) / 2.5 } end function doAttack(pid, target, param) local pet = getPetInfo(getCreatureName(pid)) if pet then if pet.attacks and pet.attacks[param] then local attack = pet.attacks[param] if target > 0 and attack.type and attack.type == TYPE_DISTANCE and getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(target)) > (attack.range or 3) or attack.type == TYPE_NEAR and target > 0 and getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(target)) > attack.range then return doPlayerSendCancel(getCreatureMaster(pid), "Target is too far.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) end if target > 0 and not isSightClear(getCreaturePosition(pid), getCreaturePosition(target), true) then return doPlayerSendCancel(getCreatureMaster(pid), "There is not enough room.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) end if target == 0 then return doPlayerSendCancel(getCreatureMaster(pid), "Please select a target first.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) end if getPlayerLevel(getCreatureMaster(pid)) < attack.level then return doPlayerSendCancel(getCreatureMaster(pid), "You need level " .. attack.level .. " or higher to use this attack.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) end if getPetLevel(pid) < attack.petLevel then return doPlayerSendCancel(getCreatureMaster(pid), "Your pet needs level " .. attack.petLevel .. " or higher to use this attack.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) end if attack.mana and getCreatureMana(pid) < attack.mana then return doPlayerSendCancel(getCreatureMaster(pid), "Your pet does not have enough mana.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) end if attack.area then doCastAreaAttack(pid, target, attack.area, attack) else doTargetCombatHealth(pid, target, attack.combat, -getAttackFormula(pid, attack).min, -getAttackFormula(pid, attack).max, attack.effect) end doCreatureAddMana(pid, -attack.mana) return doSendDistanceShoot(getCreaturePosition(pid), (attack.type == TYPE_DISTANCE and getCreaturePosition(target) or getCreaturePosition(pid)), attack.distEffect) and doCreatureSay(pid, attack.name, TALKTYPE_MONSTER) else return doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) end else return doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) and doPlayerSendCancel(getCreatureMaster(pid), "There is a tecnical problem, please contact a gamemaster.") end end function callPet(cid) for i = 1, #petStorages do if getCreatureStorage(cid, petStorages[i]) < 0 then doCreatureSetStorage(cid, petStorages[i], 0) end end local pet = getPetByLevel(cid) if not pet then return doPlayerSendCancel(cid, "You do not have enough level to call a pet.") end local ret = doCreateMonster(pet.monster, getCreaturePosition(cid)) if getCreatureStorage(cid, petStorages.level) < 1 then doCreatureSetStorage(cid, petStorages.level, pet.level) end if getCreatureStorage(cid, petStorages.exp) < 1 then doCreatureSetStorage(cid, petStorages.exp, getExperienceForLevel(pet.level)) end if getCreatureStorage(cid, petStorages.level) < pet.level then doCreatureSetStorage(cid, petStorages.level, pet.level) elseif getPlayerLevel(cid) * 3 < getCreatureStorage(cid, petStorages.level) then doCreatureSetStorage(cid, petStorages.level, (getPetByLevel(cid).level or 0)) doCreatureSetStorage(cid, petStorages.exp, getExperienceForLevel((getPetByLevel(cid).level or 0))) end if getLevelByExp(getCreatureStorage(cid, petStorages.exp)) < getCreatureStorage(cid, petStorages.level) then doCreatureSetStorage(cid, petStorages.exp, getExperienceForLevel(getCreatureStorage(cid, petStorages.level))) end if getCreatureStorage(cid, petStorages.health) < 1 then doCreatureSetStorage(cid, petStorages.health, getCreatureStorage(cid, petStorages.level) * petGainHealth) end if getCreatureStorage(cid, petStorages.mana) < 1 then doCreatureSetStorage(cid, petStorages.mana, getCreatureStorage(cid, petStorages.level) * petGainMana) end doCreatureSetStorage(ret, petStorages.level, getCreatureStorage(cid, petStorages.level)) doCreatureSetStorage(ret, petStorages.exp, getCreatureStorage(cid, petStorages.exp)) doConvinceCreature(cid, ret) doCreatureSetStorage(ret, petStorages.isPet, 1) doSendMagicEffect(getCreaturePosition(ret), CONST_ME_TELEPORT) setCreatureMaxHealth(ret, getPetLevel(ret) * petGainHealth) doCreatureAddHealth(ret, -getCreatureHealth(ret) + getCreatureStorage(cid, petStorages.health)) setCreatureMaxMana(ret, getPetLevel(ret) * petGainMana) doCreatureAddMana(ret, -getCreatureMana(ret) + getCreatureStorage(cid, petStorages.mana)) for _, v in pairs(petGainTicks) do gainStat(ret, v) end return doCreatureSay(cid, "Go pet!", TALKTYPE_SAY) end function doCastAreaAttack(pid, target, area, attack) local center = {} local areaxx = {} center.y = math.floor(#area/2)+1 for y = 1, #area do for x = 1, #area[y] do local number = area[y][x] if number > 0 then center.x = math.floor(table.getn(area[y])/2)+1 if attack.type == TYPE_DISTANCE then table.insert(areaxx, {x = getCreaturePosition(target).x + x - center.x, y = getCreaturePosition(target).y + y - center.y, z = getCreaturePosition(target).z}) else table.insert(areaxx, {x = getCreaturePosition(pid).x + x - center.x, y = getCreaturePosition(pid).y + y - center.y, z = getCreaturePosition(pid).z}) end end end end for i = 1, #areaxx do doAreaCombatHealth(pid, attack.combat, areaxx[i], 0, -getAttackFormula(pid, attack).min, -getAttackFormula(pid, attack).max, attack.effect) end end function isPet(pid) return getCreatureStorage(pid, petStorages.isPet) > 0 and true or false end function doPetAddExperience(pid, exp) doCreatureSetStorage(pid, petStorages.exp, getCreatureStorage(pid, petStorages.exp) + exp) doCreatureSetStorage(getCreatureMaster(pid), petStorages.exp, getPetExperience(pid)) doSendAnimatedText(getCreaturePosition(pid), exp, getConfigValue("gainExperienceColor")) return true end function getPetExperience(pid) return getCreatureStorage(pid, petStorages.exp) end function getPetLevel(pid) return getCreatureStorage(pid, petStorages.level) end function doPetSetLevel(pid, level) doCreatureSetStorage(pid, petStorages.level, level) doCreatureSetStorage(getCreatureMaster(pid), petStorages.level, level) setCreatureMaxHealth(pid, getPetLevel(pid) * petGainHealth) setCreatureMaxMana(pid, getPetLevel(pid) * petGainMana) return true end function getPlayerPet(cid) local pet if #getCreatureSummons(cid) < 1 then pet = false end for _, it in ipairs(getCreatureSummons(cid)) do if isPet(it) then pet = it break end end return pet end function getTopItem(p) p.stackpos = 0 local v = getThingFromPos(p) repeat p.stackpos = p.stackpos + 1 v = getThingFromPos(p) until v.itemid == 0 p.stackpos = p.stackpos - 1 return getThingFromPos(p) end Pasta data/creaturescripts/scripts/petdeath.lua: function onDeath(cid, corpse, deathList) if not isMonster(cid) or not isPet(cid) then return true end doCreatureSetStorage(getCreatureMaster(cid), petStorages.isDead, 1) doPlayerSendTextMessage(getCreatureMaster(cid), MESSAGE_STATUS_CONSOLE_BLUE, "Your pet is dead.") return true end Pasta data/creaturescripts/scripts/petstats.lua: function onStatsChange(cid, attacker, type, combat, value) if getPlayerPet(cid) and getPlayerPet(cid) == attacker then return false end return true end Pasta data/creaturescripts/scripts/petkill.lua: function onKill(cid, target, lastHit) if not isMonster(target) or getConfigValue("rateExperience") < 0.1 or getMonsterInfo(getCreatureName(target)) and getMonsterInfo(getCreatureName(target)).experience < 1 then return true end local pet = getPlayerPet(cid) if pet then doPetAddExperience(pet, getMonsterInfo(getCreatureName(target)).experience * petExpRate) if getLevelByExp(getPetExperience(pet)) > getPetLevel(pet) then doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your pet advanced from level " .. getPetLevel(pet) .. " to level " .. getLevelByExp(getPetExperience(pet)) .. ".") doPetSetLevel(pet, getLevelByExp(getPetExperience(pet))) end end return true end Adicione no data/creaturescripts/scripts/login.lua: registerCreatureEvent(cid, "petKill") registerCreatureEvent(cid, "petDeath") registerCreatureEvent(cid, "petSta") Adicione na data/creaturescripts/creaturescripts.xml: <event type="kill" name="petKill" event="script" value="petkill.lua"/> <event type="death" name="petDeath" event="script" value="petdeath.lua"/> <event type="statschange" name="petStats" event="script" value="petstats.lua"/> Na pasta talkactions/scripts/pet.lua: local l = { ["north"] = NORTH, ["east"] = EAST, ["south"] = SOUTH, ["west"] = WEST, ["southwest"] = SOUTHWEST, ["southeast"] = SOUTHEAST, ["northwest"] = NORTHWEST, ["northeast"] = NORTHEAST } --fixed by falcon-- function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.") return true end if param:lower() == "call" then if getCreatureStorage(cid, petStorages.isDead) > 0 then return doPlayerSendCancel(cid, "You need to revive your pet first.") end if getTilePzInfo(getCreaturePosition(cid)) then return doPlayerSendCancel(cid, "You cannot call your pet in protection zone.") end local pet = getPlayerPet(cid) if not pet then return callPet(cid) else doCreatureSetStorage(cid, petStorages.health, getCreatureHealth(pet)) doCreatureSetStorage(cid, petStorages.mana, getCreatureMana(pet)) doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF) doRemoveCreature(pet) return doCreatureSay(cid, "It's enough!", TALKTYPE_SAY) end elseif param:lower() == "info" then local pet = getPlayerPet(cid) if pet then local pet_ = getPetInfo(getCreatureName(pet)) local attacks = "" if pet_.attacks and #pet_.attacks > 0 then for i = 1, #pet_.attacks do attacks = attacks .. "Attack ID: " .. i .. "\n" .. (pet_.attacks[i].name ~= "" and " Name: " .. pet_.attacks[i].name .. "\n" or "") .. " Level: " .. pet_.attacks[i].level .. "\n Pet level: " .. pet_.attacks[i].petLevel .. "\n Pet mana: " .. pet_.attacks[i].mana .. "\n" end end return doShowTextDialog(cid, 1948, "Here is your pet info:\n" .. "\nName: " .. getCreatureName(pet) .. "\nHealth: " .. getCreatureHealth(pet) .. "-" .. getCreatureMaxHealth(pet) .. "\nMana: " .. getCreatureMana(pet) .. "-" .. getCreatureMaxMana(pet) .. "\nLevel: " .. getPetLevel(pet) .. "\nExperience: " .. getPetExperience(pet) .. "\n-----Attacks-----\n" .. (attacks ~= "" and attacks or "No attacks")) else return doPlayerSendCancel(cid, "Please call your pet first.") end elseif param:lower() == "take" then local pet = getPlayerPet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end local slot = 0 for i = 1, carryItems do if getCreatureStorage(cid, petItems[i]) < 1 then slot = i break end end if slot == 0 then return doPlayerSendCancel(cid, "You only can carry " .. carryItems .. " items.") end local item = getTopItem(getCreaturePosition(pet)) if getItemWeightById(item.itemid, 1) and getItemWeightById(item.itemid, 1) < 1 then return doPlayerSendCancel(cid, "There is no item to carry.") end if isInArray(blockedItems, item.itemid) then return doPlayerSendCancel(cid, "You cannot carry this item.") end doCreatureSetStorage(cid, petItems[slot], item.itemid * 1000 + (item.type > 0 and item.type or 1)) doRemoveItem(item.uid) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You take an item.") return true elseif param:lower() == "items" then local list = "Here is the list of items:\n" for i = 1, carryItems do if getCreatureStorage(cid, petItems[i]) < 1 then list = list .. "\n" .. i .. ". Empty." else local thing = getCreatureStorage(cid, petItems[i]) local item = math.floor(thing / 1000) local count = thing - item * 1000 list = list .. "\n" .. i .. ". x" .. count .. " " .. getItemNameById(item) .. "." end end return doShowTextDialog(cid, 1948, list) else param = string.explode(param, ":") if param[1]:lower() == "attack" then local pet = getPlayerPet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then return doPlayerSendCancel(cid, "No attack index specified.") end if exhaustion.get(cid, petStorages.exhaust) then return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF) end doAttack(pet, getCreatureTarget(cid), tonumber(param[2])) exhaustion.set(cid, petStorages.exhaust, petExhaust) elseif param[1]:lower() == "give" then local pet = getPlayerPet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then return doPlayerSendCancel(cid, "No slot specified.") end if getCreatureStorage(cid, petItems[tonumber(param[2])]) > 0 then local thing = getCreatureStorage(cid, petItems[tonumber(param[2])]) local item = math.floor(thing/1000) local count = thing-item*1000 doPlayerAddItem(cid, item, count) doCreatureSetStorage(cid, petItems[tonumber(param[2])], 0) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You get an item.") else return doPlayerSendCancel(cid, "This slot is empty.") end elseif param[1]:lower() == "say" then local pet = getPlayerPet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end if not param[2] or param[2] == "" then return doPlayerSendCancel(cid, "Command param required.") end if exhaustion.get(cid, petStorages.sayExhaust) then return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF) end doCreatureSay(pet, param[2], TALKTYPE_MONSTER) exhaustion.set(cid, petStorages.sayExhaust, petExhaust) elseif param[1]:lower() == "move" then local pet = getPlayerPet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end if not param[2] or param[2] == "" then return doPlayerSendCancel(cid, "Command param required.") end if exhaustion.get(cid, petStorages.moveExhaust) then return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF) end local dir if l[param[2]:lower()] then dir = l[param[2]:lower()] local toPos = getPosByDir(getCreaturePosition(pet), dir, 1) local ret = queryTileAddThing(pet, toPos) if ret == RETURNVALUE_NOERROR then doMoveCreature(pet, dir) exhaustion.set(cid, petStorages.moveExhaust, petExhaust) else return doPlayerSendCancel(cid, "There is not enough room.") and doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF) end else return doPlayerSendCancel(cid, "No direction specified.") end elseif isInArray({"mana", "health"}, param[1]:lower()) then if getPlayerGroupId(cid) < 3 then return false end local pet = getPlayerPet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end if not param[2] or not isNumber(param[2]) then return doPlayerSendCancel(cid, "Command param required.") end if param[1]:lower() == "health" then doCreatureAddHealth(pet, tonumber(param[2])) elseif param[1]:lower() == "mana" then doCreatureAddMana(pet, tonumber(param[2])) end return doSendMagicEffect(getCreaturePosition(pet), (param[1]:lower() == "health" and CONST_ME_MAGIC_RED or CONST_ME_MAGIC_BLUE)) end end return true end Talkactions.xml: <talkaction words="!pet" event="script" value="pet.lua"/> Screen's: Comandos: !pet call !pet take !pet items !pet attack !pet give !pet say !pet move !pet mana Créditos: Falcon
  20. Autor: MaXwEllDeN (Maxwell Denisson) Versão testada: TFS 0.3.6, 8.54 #Introdução Oi galera :B, Olha, hoje vou postar um sistema que acho que vai agradar a muitas pessoas, só estou postando ele porque alguém a quem eu vendí passou pra alguém que liberou ele em um fórum aí, já que já liberaram não vejo motivos pra não postá-lo aqui #Demonstração Private Shop System V.2 #Instalação O Sistema "se instala sozinho", só é fazer o download e jogar na pasta do servidor. Galera, faz MUITO, MUITO tempo mesmo que eu fiz esse sistema, então ele deve ter um bocado de gambiarras e essas coisas do tipo . Espero que seja útil a alguém.
  21. Sistema de Pet V1.0 E ai Galera, suave? Hoje venho trazer pra vocês, meu sistema de pet. É bem do tipo pokemon, mas tenho certeza que irão gostar. Vou liberá-lo porque gosto de compartilhar as coisas, e sei que alguém esta querendo um sistema desses. Assim como eu quis um dia e nunca encontrei um que funcionasse. O sistema está na versão 1.0, mas em em breve trarei um npc para healar o pet e algumas talks para o pet soltar spells. Vamos lá! Primeiramente, vá em data/action/scripts, crie um arquivo com o nome de CatchPet.lua e adicione: local mtrs = { ["Rat"] = {hp = 1000, maxhp = 1000, corpse = 2813, chance = 100}, ["Rotworm"] = {hp = 1000, maxhp = 1000, corpse = 5967, chance = 100}, ["Skeleton"] = {hp = 1000, maxhp = 1000, corpse = 5972, chance = 100}, ["Dragon"] = {hp = 1000, maxhp = 1000, corpse = 3104, chance = 100}, ["Dragon Lord"] = {hp = 1000, maxhp = 1000, corpse = 5984, chance = 100}, } function onUse(cid, item, frompos, item2, topos) for pet_name, v in pairs(mtrs) do if item2.itemid == v.corpse then if math.random(0,100) <= v.chance then doPlayerSendTextMessage(cid, 27, "Você capturou um ".. pet_name .. ".") doRemoveItem(item2.uid, 1) doRemoveItem(item.uid, 1) local itemcatch = doPlayerAddItem(cid, 7632, 1) doItemSetAttribute(itemcatch, "namepet", pet_name) doItemSetAttribute(itemcatch, "description", "Contém um ".. pet_name ..".") doItemSetAttribute(itemcatch, "lifepet", v.hp) doItemSetAttribute(itemcatch, "maxlifepet", v.maxhp) else doPlayerSendTextMessage(cid, 27, "Falhou.") end end end return true end Em seguida, duplique o arquivo, renomeie para VaiVolta e adicione: function onUse(cid, item, frompos, item2, topos) local health = tonumber(getItemAttribute(item.uid, "lifepet")) local mhp = tonumber(getItemAttribute(item.uid, "maxlifepet")) if health <= 0 then return doPlayerSendCancel(cid, "Esse pet esta morto.") end local pet_name = getItemAttribute(item.uid, "namepet") if item.itemid == 7632 then if not getTilePzInfo(getPlayerPosition(cid)) then if #getCreatureSummons(cid) < 1 then doTransformItem(item.uid, 7633) local summon = doSummonCreature(pet_name, getThingPos(cid)) doConvinceCreature(cid, summon) setCreatureMaxHealth(summon, mhp) doCreatureAddHealth(summon, mhp) doCreatureAddHealth(summon, health - mhp) doSendMagicEffect(getCreaturePosition(summon), 67) doCreatureSay(cid, "Vai, ".. pet_name .. "!", TALKTYPE_SAY) else doPlayerSendCancel(cid, "Você já sumonou um Pet.") end else doPlayerSendCancel(cid, "Você não pode estar em Protection Zone para sumonar seu Pet.") end elseif item.itemid == 7633 then local hp, maxhp = getCreatureHealth(getCreatureSummons(cid)[1]), getCreatureMaxHealth(getCreatureSummons(cid)[1]) if #getCreatureSummons(cid) >= 1 then doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), 67) doRemoveCreature(getCreatureSummons(cid)[1]) doTransformItem(item.uid, 7632) doItemSetAttribute(item.uid, "lifepet", hp) doItemSetAttribute(item.uid, "maxlifepet", maxhp) doCreatureSay(cid, "Volta, " .. pet_name .. ".", TALKTYPE_SAY) end end return true end Agora em Actions.xml, adicione as tags: <action itemid="2149" event="script" value="CatchPet.lua"/> <action itemid="7632;7633" event="script" value="VaiVolta.lua"/> Configurando Nesta parte você irá editar: Quote ["Rat"] = {hp = 1000, maxhp = 1000, corpse = 2813, chance = 100}, ["Rotworm"] = {hp = 1000, maxhp = 1000, corpse = 5967, chance = 100}, ["Skeleton"] = {hp = 1000, maxhp = 1000, corpse = 5972, chance = 100}, ["Dragon"] = {hp = 1000, maxhp = 1000, corpse = 3104, chance = 100}, ["Dragon Lord"] = {hp = 1000, maxhp = 1000, corpse = 5984, chance = 100}, NOME DO PET / HP / HP MÁXIMO / CORPSE ID ( AQUELE QUE FICA QUANDO O MONSTRO MORRE) / CHANCE DE CAPTURA DO PET. Esse são os id's das "pokeballs": Caso queira mudar, troque no script e na tag no actions.xml. Este é o item de captura: <action itemid="2149" event="script" value="CatchPet.lua"/> Bom, é isso galera, espero que gostem e que façam um bom uso do sistema! Aproveitem! Dúvidas? Sugestões? Criticas? Comentem!!
  22. Nome: Sistema de Colisão de Magias V. 1.0 Autor: Ramza (Ricardo Ianelli) Versão Testada: TFS 0.3.6PL1 (8.54) "PODERÁ FUNCIONA EM VERSÃO 8.54+ FAÇA O TESTE" Introdução video: Funcionamento Do ponto de vista do jogador: O jogador usa uma magia, digamos, exori frigo. No mesmo momento, o inimigo usa um exori vis por exemplo. As magias voam, e se colidem no ar. Do ponto de vista do scripter: Toda magia antes de ser lançada, salva um storage value, e checa se o inimigo tem o mesmo storage. Caso tenha, ao invés de mandar a magia, manda os efeitos pra uma posição calculada entre os dois pontos, e um efeito de colisão. Caso o criador queira melhorar ainda a função (pra ficar como na versão 2.0 do sistema), pode-se fazer uma checagem de força pra saber qual das duas 'vence', fazendo com que ela atinja o oponente. Para melhores resultados, magias usando addEvent são mais usadas, por isso usarei um exemplo dessa forma aqui no tutorial. Instalação Na pasta Data, crie um arquivo chamado colisionLIB.lua. Dentro dele, cole isto: function checkColision(cid) -- Function by Ramza (Ricardo Ianelli) if getCreatureTarget(cid) ~= 0 then setPlayerStorageValue(cid, 9001, 'casting') local ppos, enemy = getCreaturePosition(cid), getCreatureTarget(cid) local epos = getCreaturePosition(enemy) if getPlayerStorageValue(enemy, 9001) == 'casting' and getCreatureTarget(enemy) == cid then setPlayerStorageValue(enemy, 9001, 'colision') setPlayerStorageValue(cid, 9001, 'colision') if ppos.x > epos.x and ppos.y > epos.y then cpos = {x = ppos.x - ((ppos.x - epos.x) / 2), y = ppos.y - ((ppos.y - epos.y) / 2), z = ppos.z} elseif ppos.x > epos.x and ppos.y < epos.y then cpos = {x = ppos.x - ((ppos.x - epos.x) / 2), y = epos.y - ((epos.y - ppos.y) / 2), z = ppos.z} elseif ppos.x < epos.x and ppos.y < epos.y then cpos = {x = epos.x - ((epos.x - ppos.x) / 2), y = epos.y - ((epos.y - ppos.y) / 2), z = ppos.z} elseif ppos.x < epos.x and ppos.y > epos.y then cpos = {x = epos.x - ((epos.x - ppos.x) / 2), y = ppos.y - ((ppos.y - epos.y) / 2), z = ppos.z} end doSendDistanceShoot(ppos, cpos, CONST_ANI_ENERGY) doSendDistanceShoot(epos, cpos, CONST_ANI_ENERGYBALL) local value = math.random(1, 3) doSendMagicEffect(cpos, 27+value) return true else return false end end end Agora vamos pegar uma magia bem básica como exemplo para teste. Vamos usar a magia energy strike. Abra o arquivo da magia, estará mais ou menos assim: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Vamos modificar um pouco para o nosso sistema. Deixe-a assim: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) local function spell(cid, var) if getPlayerStorageValue(cid, 9001) ~= 'colision' then doCreatureSay(cid, 'Strike!', TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, 9001, nil) return doCombat(cid, combat, var) end end function onCastSpell(cid, var) checkColision(cid) doCreatureSay(cid, 'Energy...', TALKTYPE_ORANGE_1) addEvent(spell, 2000, cid, var) end Agora adiciona essa função em todas as magias que você deseja a colisão. function onCastSpell(cid, var) checkColision(cid) doCreatureSay(cid, 'Energy...', TALKTYPE_ORANGE_1) addEvent(spell, 2000, cid, var) end Hora de testar, a hora mais difícil! Bem, pra testar esse sistema você precisa de um amigo pra te ajudar, ou de ferramentas ilegais e agilidade. Vamos tomar como exemplo caso você fosse com um amigo testar. Simplesmente usem exori vis um no outro, e vejam o que acontece Comentários Quem já é mais experiente já deve ter sacado o tanto de possibilidades que isso abre, como fazer com magias mais avançadas, comparar magic level, fazer com que caso o ML de um seja maior que o do outro, ela anule a do inimigo mas a sua ainda acerte, fazer sistemas no estilo 'disputa de kame-hame-has' usando spriters sem ser as do tibia, e muitas outras coisas, só vai depender de você usar a sua CRIATIVIDADE. Esse sistema, apesar de simples, é considerado pra mim um dos meus sistemas mais avançados, pois como dizia o sábio programador: "O verdadeiro gênio não é aquele que usa pilhas, ponteiros, matrizes ou funções complexas, e sim aquele que usa a criatividade." Muita gente ofereceu grana preta nesse sistema já, mas eu postei aqui pra lembrar à todos vocês que o que faz um grande programador não é o quão complexas são as funções que você usa e os codes que você faz, e sim, o quão criativas einovadoras são suas criações. É isso ai galera, deixo meu abraço pra todos vocês, qualquer dúvida é só me perguntar, e eu quero que vocês lembrem que o melhor code é sempre, de longe, aquele mais criativo, não importa se tenha 3, 100 ou 10.000 linhas. Lembrem-se disso, sempre.
  23. Bom galera, estou começando minha carreira na área de scripts, e estou fazendo o possível para postar 1 por semana. Semana passada eu postei o Sistema de Fome E hoje estou postando o Woodcutting Sistem na versão 1.0, em breve updates. Então, vamos lá! Em data/actions/scripts, crie um arquivo.lua com o nome de wood e coloque isso: function onUse(cid, item, frompos, item2, topos) local chance = 70 -- chance de cortar local madeiras = {5941, 5901} -- item que o player irá ganhar local premio = madeiras[math.random(1, #madeiras)] local transformItem = 8786 local texts = {"Tuc", "Toc", "Trec"} local random = texts[math.random(1,#texts)] local vocationUse = 2 local time = 2 -- Minutos para crescer novamente if getPlayerVocation(cid) ~= vocationUse then doPlayerSendTextMessage(cid,22,"Você não tem a vocação necessária para cortar.") return true end if item2.itemid == 2708 or item2.itemid == 2700 or item2.itemid == 6218 or item2.itemid == 2701 or item2.itemid == 2707 then if math.random(1,100) >= chance then doPlayerAddItem(cid,premio, math.random(1, 2)) doTransformItem(item2.uid, transformItem) doSendMagicEffect(topos, 16) doPlayerSendTextMessage(cid,22,"Você cortou uma madeira.") doSendAnimatedText(topos, ""..random.."", TEXTCOLOR_GREEN) doDecayItem(item2.uid) addEvent(doCreateItem, time*60*1000, item2.itemid, 1, getThingPos(item2.uid)) else doSendAnimatedText(topos, ""..random.."", TEXTCOLOR_GREEN) doPlayerSendTextMessage(cid,22,"Você não conseguiu cortar.") end end return true end Em data/actions/actions.xml adicione a tag: <action itemid="4874" event="script" value="wood.lua"/> 4874 é o ID do Dwarven Pickaxe. Imagens: É isso ai galera. Obrigado!
  24. Looking at You Fala galera do TK, faz tempo que não posto nada, aí vou postar um sistema simples aqui, que ainda não tem no fórum e vejo membros procurando. DESCRIÇÃO DO SISTEMA: Quando um player der look em você aparecerá em branco uma mensagem no canto inferior da tela: "Nome do Player" is looking at you. 1° - Acesse a pasta MODS e crie um arquivo chamado lookingatyou.xml, coloque isso dentro do arquivo: <?xml version="1.0" encoding="UTF-8"?> <mod name="peeper" version="1.0" author="" contact="" enabled="yes"> <config name="peeper-config"><![CDATA[ -- anonymously or display peeper name? anonymous = "no" -- ignore players with access (will not show message when they look on someone) hiddenAccess = 3 -- message color (type) messageType = MESSAGE_STATUS_DEFAULT ]]></config> <event type="look" name="peeper-event" event="script"><![CDATA[ domodlib('peeper-config') local config = { anonymous = getBooleanFromString(anonymous), hiddenAccess = hiddenAccess, messageType = messageType } function onLook(cid, thing, position, lookDistance) if(isPlayer(thing.uid) and getPlayerAccess(cid) < config.hiddenAccess) then doPlayerSendTextMessage(thing.uid, config.messageType, (config.anonymous and "Someone" or getPlayerName(cid)) .. " is looking at you.") end return true end ]]></event> <event type="login" name="peeper-login" event="buffer"><![CDATA[ registerCreatureEvent(cid, "peeper-event") _result = true ]]></event> </mod> Bom galera este é o sistema. Créditos: EddyHavoc Slawkens Testado e funcionando 100%
  25. Script/Tutorial+ Php +Map +Talkaction +Portal. Ps: Antes de falar q o topico já existe no forum teste os outros scripts Então começando por informações basícas : Para abrir o evento : /zombiestart numero de players . exemplo : /zombiestart 2 Para Iniciar o evento sem o numero maximo de players: /zombiestart force. Apos aberto sempre q um player ente no portal do evento e avisado por broadcast quem entrou na arena e o numero de players restantes para o evento ser iniciado. Apos o evento ser iniciado um zombie e sumonado a cada 20 segundos, o player que for infectado e teleportado para o templo vence o ultimo player restante na arena. Ao terminar o evento e anuciado por broadcast o nome do player vencedor tempo q durou na arena e por quantos zombies ele sobreviveu, entrega de premio automatica, premio configuravel. Garantia de funcionabilidade perfeita em TFS 0.4 se configurado corretamente, não testado em outras versões de distros. Creditos: Me .. não criei mais montei peguei de varios servers/topicos e corigi os varios bugs de distro colocaria os creditos de onde peguei a maioria do script mais foi de um server sem creditos q nem era pra ter sido postado. Enfim Vamos ao Evento ! Primeiro vou estar postando a pagina classica do Zombie event no Gesior que seria a parte PHP para informar os players sobre o evento. Pagina PHP + Tutorial de como implementar ela no seu site. Agora alguns mapas para o zombie event: Então Agora vamos ao script ! data\creaturescripts\scripts\zombie – A pasta ‘zombie’ deve ser criada no diretorio citado. \data\creaturescripts\scripts\Zombie\onattack.lua function loseOnZombieArena(cid) kickPlayerFromZombiesArea(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "BOOM! You are dead.") local players = getZombiesEventPlayers() if(#players <= 1) then local winner = players[1] if(winner) then doPlayerAddItem(winner, 2157, 5, true) doPlayerAddItem(winner, 6119, 1, true) doPlayerSendTextMessage(winner, MESSAGE_STATUS_CONSOLE_BLUE, "You won zombies arena event.") doBroadcastMessage("After " .. os.time() - getPlayerZombiesEventStatus(winner) .. " seconds of fight " .. getCreatureName(winner) .. " won Zombie Arena Event in game versus " .. getStorage(ZE_ZOMBIES_SPAWNED) .. " zombies!") kickPlayerFromZombiesArea(winner) else doBroadcastMessage("Zombie arena event finished! No one win?!?!?! WTF!") end doSetStorage(ZE_STATUS, 0) doSetStorage(ZE_PLAYERS_NUMBER, ZE_DEFAULT_NUMBER_OF_PLAYERS) doSetStorage(ZE_ZOMBIES_TO_SPAWN, 0) doSetStorage(ZE_ZOMBIES_SPAWNED, 0) local width = (math.max(ZE_spawnFromPosition.x, ZE_spawnToPosition.x) - math.min(ZE_spawnFromPosition.x, ZE_spawnToPosition.x)) / 2 + 1 local height = (math.max(ZE_spawnFromPosition.y, ZE_spawnToPosition.y) - math.min(ZE_spawnFromPosition.y, ZE_spawnToPosition.y)) / 2 + 1 local centerPos = {x=math.min(ZE_spawnFromPosition.x, ZE_spawnToPosition.x)+width,y=math.min(ZE_spawnFromPosition.y, ZE_spawnToPosition.y)+height,z=ZE_spawnFromPosition.z} for z = math.min(ZE_spawnFromPosition.z, ZE_spawnToPosition.z), math.max(ZE_spawnFromPosition.z, ZE_spawnToPosition.z) do centerPos.z = z for i, uid in pairs(getSpectators(centerPos, width, height, false)) do if(isMonster(uid)) then doRemoveCreature(uid) end end end end end function onStatsChange(target, cid, changetype, combat, value) if((cid and isMonster(cid) and getCreatureName(cid) == "Zombie Event") or (isInRange(getThingPosition(target), ZE_spawnFromPosition, ZE_spawnToPosition) and changetype == STATSCHANGE_HEALTHLOSS and math.abs(value) >= getCreatureHealth(target))) then doCreatureAddHealth(target, getCreatureMaxHealth(target)) loseOnZombieArena(target) return false end return true end \data\creaturescripts\scripts\Zombie\ondeath.lua function onDeath(cid) setZombiesToSpawnCount(getZombiesToSpawnCount() + 2) doCreatureSay(cid, "I'll be back!", 19) return true end \data\creaturescripts\scripts\Zombie\onthink.lua function onThink(cid) local target = getCreatureTarget(cid) if(target ~= 0 and not isPlayer(target)) then doRemoveCreature(target) end return true end \data\globalevents\scripts\zombie\ onstartup.lua function onstartup() db.executeQuery("UPDATE `player_storage` SET `value` = 0 WHERE `key` = " .. ZE_isOnZombieArea .. ";") doSetStorage(ZE_STATUS, 0) doSetStorage(ZE_PLAYERS_NUMBER, ZE_DEFAULT_NUMBER_OF_PLAYERS) doSetStorage(ZE_ZOMBIES_TO_SPAWN, 0) doSetStorage(ZE_ZOMBIES_SPAWNED, 0) addZombiesEventBlockEnterPosition() return true end \data\globalevents\scripts\zombie\onthink.lua function onThink(interval, lastExecution, thinkInterval) if(getStorage(ZE_STATUS) == 2) then setZombiesToSpawnCount(getZombiesToSpawnCount()+1) local players = getZombiesEventPlayers() for i=1, getZombiesToSpawnCount() * 2 do if(getZombiesToSpawnCount() > 0 and spawnNewZombie()) then setZombiesToSpawnCount(getZombiesToSpawnCount()-1) end end end return true end \data\lib\zombie_event.lua -- CONFIG ZE_DEFAULT_NUMBER_OF_PLAYERS = 20 ZE_ACCESS_TO_IGNORE_ARENA = 4 -- POSITIONS ZE_blockEnterItemPosition = {x=32341, y=32213, z=7} -- onde nasce o teleport? ZE_enterPosition = {x=32154, y=32578, z=7} -- onde os players nascem dentro da arena zombie? ZE_kickPosition = {x=32368, y=32241, z=7} -- quando morre vai para onde? ZE_spawnFromPosition = {x=32140,y=32566,z=7} -- para sumonar zombie (de) ZE_spawnToPosition = {x=32168,y=32590,z=7} -- para sumonar zombie (ate) -- ITEM IDS --ZE_blockEnterItemID = 2700 ZE_blockEnterItemID = 1387 -- STORAGES -- - player ZE_isOnZombieArea = 34370 -- - global ZE_STATUS = 34370 -- =< 0 - off, 1 - waiting for players, 2 - is running ZE_PLAYERS_NUMBER = 34371 ZE_ZOMBIES_TO_SPAWN = 34372 ZE_ZOMBIES_SPAWNED = 34373 -- FUNCTION function setZombiesEventPlayersLimit(value) doSetStorage(ZE_PLAYERS_NUMBER, value) end function getZombiesEventPlayersLimit() return getStorage(ZE_PLAYERS_NUMBER) end function addPlayerToZombiesArea(cid) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) doTeleportThing(cid, ZE_enterPosition, true) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) if(getPlayerAccess(cid) < ZE_ACCESS_TO_IGNORE_ARENA) then setPlayerZombiesEventStatus(cid, os.time()) end end function kickPlayerFromZombiesArea(cid) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) doTeleportThing(cid, ZE_kickPosition, true) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) setPlayerZombiesEventStatus(cid, 0) end function getPlayerZombiesEventStatus(cid) return getCreatureStorage(cid, ZE_isOnZombieArea) end function setPlayerZombiesEventStatus(cid, value) doCreatureSetStorage(cid, ZE_isOnZombieArea, value) end function getZombiesEventPlayers() local players = {} for i, cid in pairs(getPlayersOnline()) do if(getPlayerZombiesEventStatus(cid) > 0) then table.insert(players, cid) end end return players end function getZombiesCount() return getStorage(ZE_ZOMBIES_SPAWNED) end function addZombiesCount() doSetStorage(ZE_ZOMBIES_SPAWNED, getStorage(ZE_ZOMBIES_SPAWNED)+1) end function resetZombiesCount() doSetStorage(ZE_ZOMBIES_SPAWNED, 0) end function getZombiesToSpawnCount() return getStorage(ZE_ZOMBIES_TO_SPAWN) end function setZombiesToSpawnCount(count) doSetStorage(ZE_ZOMBIES_TO_SPAWN, count) end function addZombiesEventBlockEnterPosition() -- remove tp -- remove o TP local item = getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID) if(item.uid ~= 0) then doRemoveItem(item.uid) end --doRemoveItem(getThingFromPos(Castle.desde).uid) --[[ if(getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID).uid == 0) then doCreateItem(ZE_blockEnterItemID, 1, ZE_blockEnterItemPosition) end ]]-- end function removeZombiesEventBlockEnterPosition() -- add tp if(getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID).uid == 0) then --doCreateItem(ZE_blockEnterItemID, 1, ZE_blockEnterItemPosition) local tp = doCreateTeleport(ZE_blockEnterItemID, ZE_enterPosition, ZE_blockEnterItemPosition) doItemSetAttribute(tp, "aid", "5555") end --[[ local item = getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID) if(item.uid ~= 0) then doRemoveItem(item.uid) end ]]-- end function spawnNewZombie() local posx = {} local posy = {} local posz = {} local pir = {} for i=1, 5 do local posx_tmp = math.random(ZE_spawnFromPosition.x ,ZE_spawnToPosition.x) local posy_tmp = math.random(ZE_spawnFromPosition.y ,ZE_spawnToPosition.y) local posz_tmp = math.random(ZE_spawnFromPosition.z ,ZE_spawnToPosition.z) local pir_tmp = 0 local spec = getSpectators({x=posx_tmp, y=posy_tmp, z=posz_tmp}, 3, 3, false) if(spec and #spec > 0) then for z, pid in pairs(spec) do if(isPlayer(pid)) then pir_tmp = pir_tmp + 1 end end end posx[i] = posx_tmp posy[i] = posy_tmp posz[i] = posz_tmp pir[i] = pir_tmp end local lowest_i = 1 for i=2, 5 do if(pir[i] < pir[lowest_i]) then lowest_i = i end end local ret = doCreateMonster("Zombie Event", {x=posx[lowest_i], y=posy[lowest_i], z=posz[lowest_i]}, false) if type(ret) == "number" then addZombiesCount() setGlobalStorageValue(201201051801, ret) end return type(ret) == "number" end \data\movements\scripts\zombie\ onenter.lua function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if(not isPlayer(cid)) then return true end if(getPlayerAccess(cid) >= ZE_ACCESS_TO_IGNORE_ARENA) then addPlayerToZombiesArea(cid) elseif(#getZombiesEventPlayers() < getZombiesEventPlayersLimit() and getStorage(ZE_STATUS) == 1) then addPlayerToZombiesArea(cid) local players_on_arena_count = #getZombiesEventPlayers() if(players_on_arena_count == getZombiesEventPlayersLimit()) then addZombiesEventBlockEnterPosition() -- removeTP doSetStorage(ZE_STATUS, 2) doBroadcastMessage("Zombie Arena Event started.") else doBroadcastMessage(getCreatureName(cid) .. " has entered a Zombie Arena. We still need " .. getZombiesEventPlayersLimit() - players_on_arena_count .. " players.") end else doTeleportThing(cid, fromPosition, true) addZombiesEventBlockEnterPosition() end return true end \data\talkactions\scripts\zombie\ onsay.lua function onSay(cid, words, param, channel) if(getStorage(ZE_STATUS) ~= 2) then local players_on_arena_count = #getZombiesEventPlayers() if(param == 'force') then if(players_on_arena_count > 0) then setZombiesEventPlayersLimit(players_on_arena_count ) addZombiesEventBlockEnterPosition() doSetStorage(ZE_STATUS, 2) doBroadcastMessage("Zombie Arena Event started.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Zombies event started.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Cannot start Zombies event. There is no players on arena.") end else if(param ~= '' and tonumber(param) > 0) then setZombiesEventPlayersLimit(tonumber(param)) end removeZombiesEventBlockEnterPosition() doSetStorage(ZE_STATUS, 1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Event started.") doPlayerBroadcastMessage(cid, "Zombie Arena Event teleport is opened. We are waiting for " .. getZombiesEventPlayersLimit() - players_on_arena_count .. " players to start.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Zombies event is already running.") end return true end data\monster\zombie_event.xml <monster name="Zombie Event" nameDescription="an event zombie" race="undead" experience="480" speed="170" manacost="0"> <health now="20000" max="20000"/> <look type="311" corpse="9875"/> <targetchange interval="5000" chance="50"/> <strategy attack="100" defense="0"/> <flags> <flag summonable="0"/> <flag attackable="1"/> <flag hostile="1"/> <flag illusionable="0"/> <flag convinceable="0"/> <flag pushable="0"/> <flag canpushitems="1"/> <flag canpushcreatures="1"/> <flag targetdistance="1"/> <flag staticattack="90"/> <flag runonhealth="0"/> </flags> <attacks> <attack name="melee" interval="1000" min="-1500" max="-2350"/> </attacks> <defenses armor="0" defense="0"/> <immunities> <immunity paralyze="1"/> <immunity invisible="1"/> <immunity fire="1"/> <immunity energy="1"/> <immunity poison="1"/> </immunities> <voices interval="5000" chance="10"> <voice sentence="You wont last long!"/> <voice sentence="Mmmmh.. braains!"/> </voices> <script> <event name="ZombieThink"/> <event name="ZombieDeath"/> </script> <loot> </loot> </monster> Agora as Tags nos xml’s . /data/creaturescripts/creaturescripts.xml <event type="think" name="ZombieThink" event="script" value="zombie/onthink.lua"/> <event type="statschange" name="ZombieAttack" event="script" value="zombie/onattack.lua"/> <event type="death" name="ZombieDeath" event="script" value="zombie/ondeath.lua"/> /data/globalevents/globalevents.xml <globalevent name="ZombieGlobalThink" interval="5000" event="script" value="zombie/onthink.lua"/> <globalevent name="ZombieGlobalStartup" type="start" event="script" value="zombie/onstartup.lua"/> /data/movements/movements.xml <movevent type="StepIn" actionid="5555" event="script" value="zombie/onenter.lua"/> /data/talkactions/talkactions.xml <talkaction log="yes" words="/zombiestart" access="4" event="script" value="zombie/onsay.lua"/> /data/monster/monsters.xml <monster name="Zombie Event" file="zombie_event.xml"/> Script Terminado ! Next: Tutorial de como configurar o zombie event ! Estarei postando apenas as partes q podem ou devem ser editadas em cada script. data\creaturescripts\scripts\zombiez\onattack.lua Next: \data\lib\zombie_event.lua Então galera eh isso ai .-. meu primeiro post não mim crucifiquem k Duvidas, reclamações elogios chigamentos u.u só comentar como dizia o mestre o topico ta explicado nos minimos detalhes e ''de forma bem entendida'' (entendedoresentenderam) então eh isso vlw ai a todos q mim ajudaram nisso e nem sabem :-D

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...