Ir para conteúdo

mostps

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Obrigado
    mostps deu reputação a Makhai Drakon em [PEDIDO] NPC   
    @mostps 
    Esse era o script do meu server, eu dei uma editada nele pra você, mas eu não testei!
     
    Captain.xml
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Captain" script="Captain.lua" walkinterval="3000" floorchange="0" access="5" level="100" maglevel="1"> <health now="15" max="15"/> <look type="335" head="114" body="7" legs="7" feet="7" addons="2"/> <parameters> <parameter key="message_greet" value="Welcome |PLAYERNAME|, you want some {quest}?"/> </parameters> </npc> Captain.lua
    local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function PArea(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end local function backp() doTeleportThing(cid, parameters.exit) end if parameters.premium == false and not isPremium(cid) then npcHandler:say('Sorry, you need to be premium account!', cid) return true elseif doPlayerRemoveMoney(cid, parameters.price) == FALSE then npcHandler:say('Sorry, you dont have enought money!', cid) return true end doPlayerSendTextMessage(cid,22,'Good Luck!.') doTeleportThing(cid, parameters.enter) addEvent(backp, parameters.minutes*60*1000) npcHandler:resetNpc() return true end local node1 = keywordHandler:addKeyword({'quest'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Nessa {quest} possui monstros muito fortes você esta pronto para enfrenta-los?? Mais antes guarde suas pokebolas no DP....ah você so tem 60 minutos de tempo para realizar essa quest!!!!'}) node1:addChildKeyword({'yes'}, PArea, {premium = no, price = 0, enter = {x=1235, y=630, z=8}, exit = {x=1235, y=630, z=8}, minutes = 60}) node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Ok, then.', reset = true}) npcHandler:addModule(FocusModule:new())  
  2. Curtir
    Fala galerinha Vim aqui trazer pra vocês um negocio bem simples, Mais creio que vai ser bem útil pra quem usa tfs 0.3.6, Bom oque isso faz ?, Ao invés da sua barra de vida e mana ficar com aqueles números gigantes, Vai ficar por porcentagem %%, independente do level do personagem vai ficar 100/100 % MAX, Então vamos lá vocês vão ter que ter as souces que você usa em seu servidor, Abra elas com Deve C++, Agora vá em protocolgame.cpp, Em seguida:
     
    PROCURE POR:
     
    msg->AddU16(player->getHealth());
     
    AGORA SUBSTITUA POR:
     
    msg->AddU16((uint16_t)std::ceil(player->getHealth() * 100 / player->getPlayerInfo(PLAYERINFO_MAXHEALTH)));
     
    NO MESMO ARQUIVO PROCURE POR:
     
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
     
    SUBSTITUA POR:
     
    msg->AddU16((uint16_t)100);
     
    PROCURE POR:
     
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MANA));
     
    SUBSTITUA POR:
     
    msg->AddU16((uint16_t)std::ceil(player->getMana() * 100 / player->getPlayerInfo(PLAYERINFO_MAXMANA)));
     
    POR ULTIMO NO MESMO ARQUIVO PROCURE POR:
     
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
     
    AGORA SUBSTITUA POR:
     
    msg->AddU16((uint16_t)100);
     
    Simples né ?, Agora só salvar e compilar!, Então é isso pessoal, Eu decidi postar isso aqui porque um dia procurei muito e não achei aqui pelo TK, Para versão 0.3.6, Então espero que esse simples tutorial ajude muita gente (...), FLLW's
     
    OBS: Se estiver na área errada peço desculpas, É peço que algum moderador movam pra área correta pls.
     
  3. Gostei
    mostps recebeu reputação de iTzBrHue3 em Volatile Spiderling   
    Que fora kkkkkkk me lembro mt a elise quando ela ulta pena que seria mais legal em otserv 8.7 + :/
  4. Gostei
    mostps deu reputação a Naze em Arruma Acc Manager pegando com Site em Sha1 (tirar salt acc manager)   
    ESSE MÉTODO NÃO ESTÁ MAIS FUNCIONANDO. 
    Talvez esse aqui posso ser mais útil http://www.tibiaking...-muito-estável/ 
     
    MAS CASO QUEIRAM TENTAR MESMO ASSIM \/\/\/\/\/\/
     
    -----------------
     
    Muitos que não consegue colocar account manager junto com Site é porque quando criamos conta nele elá é feita senha + salt, ja no site é so a senha então para resolver esse problema é simples, mais precisa das sources da distro para compila depois.
     
    Na sources ache o arquivo iologindata.cpp, nele procure:
    bool IOLoginData::setPassword(uint32_t accountId, std::string newPassword) { std::string salt; if(g_config.getBool(ConfigManager::GENERATE_ACCOUNT_SALT)) { salt = generateRecoveryKey(2, 19, true); newPassword = salt + newPassword; } e onde está 
    newPassword = salt + newPassword retire o salt ficando 
    newPassword = newPassword Aqui você resolveu o problema de criar acconta mais caso alguem mude a senha por account manager tera o mesmo bug entao procure agora:
    uint64_t IOLoginData::createAccount(std::string name, std::string password) { std::string salt = generateRecoveryKey(2, 19, true); password = salt + password; e retire o salt de 
    password = salt + password; ficando: 
    password = password; Após isso apenas compile sua distro e estará resolvido. 
     
     ---- --- Para quem quiser a distro ja Compilada > http://www.tibiaking.com/forum/topic/40463-distro-tfs-04-ant-dv-war-system-no-otbm-check-no-gerar-salt-acc-manager-pega-junto-com-site-em-sha1/#entry230588
  5. Gostei
    mostps deu reputação a Natanael Beckman em ShopGuild Points 100% add em player offline. Atualizado   
    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.
  6. Gostei
    mostps deu reputação a xWhiteWolf em Volatile Spiderling   
    Fala galera do TK, hoje eu venho mais uma vez trazer uma das magias mais incríveis que eu já vi até hoje (sério). A magia original foi feita em outro fórum mas para a versão 10.1... como eu vi que ninguém conseguiu adaptar pra versões inferiores eu decidi criar a minha própria volatile spiderling.
    Confesso que no começo eu tive muita dificuldade em achar as funções certas mas depois de tentar ajudar o membro @234567890z no suporte eu tive uma epifania. Sem mais delongas eu vou explicar oque o script faz e em seguida ensinar a colocá-lo no seu server.

    • Explicação: A magia foi feita baseada na personagem Elise do jogo League of Legends: você faz uma cria que anda até os oponentes e se explodem causando dano em area e deixando eles envenenados. Aqui tem um gif da magia funcionando  
    obs: note que esse gif não fui eu que fiz mas ele demonstra exatamente como a magia funciona.
     
     
    • Instalação: Pra instalá-lo no seu servidor vai ser um pouco complicado pois ele requer diversas modificações... antes de mais nada, coloque essas linhas no seu spells.xml:
    <instant name="Volatile Spiderling" words="utevo res tera" lvl="40" mana="20" prem="1" selftarget="1" exhaustion="2000" groups="1,2000" icon="88" needlearn="0" event="script" value="especiais/spiderling.lua"> <vocation id="3"/> <vocation id="7"/> </instant> <instant name="poison explosion" words="poison explosion" lvl="0" mana="0" prem="0" aggressive="1" exhaustion="3000" needlearn="1" event="script" value="especiais/newspider.lua"> </instant> Agora você vai ter que criar os dois arquivos na pasta spells\scripts\especiais.
    Em newspider.lua coloque o seguinte:
    agora em spiderling.lua coloque o seguinte: Agora feito isso vc vai precisar criar o monstro que usará essa spell.. vá em monster\monsters.xml e adicione a seguinte linha: <monster name="Clone Spider" file="arachnids/newspider.xml"/> agora crie o arquivo data\monsters\arachnids\newspider.xml e adicione o seguinte nele:
    Agora eu vou ensinar vocês a editarem... não tem muito oque mudar, apenas se vc quiser alterar os danos da spell vá em newspider.lua e será possível editar os danos do poison e da explosão:
     
    local damageTable = {     {4, -3},     {9, -2},     {20, -1} }   aqui você muda quantos danos serão e quanto cada um tirará.. no caso serão 4 hits de -3, depois 9 hits de -2 e por fim 20 hits de -1 até o poison parar. Lembrando que esses danos saem de 4 em 4 segundos. Se você quiser que eles sejam mais rápidos é só editar aqui:
    addDamageCondition(poisonpowder, t[1], 4000, t[2]) (4000 significa 4 segundos).
    Feito isso será possível editar também a area e o dano da explosão respectivamente em: Area:    
    Dano:
    doAreaCombatHealth(cid, 1, getThingPos(cid), area, -1, -30, 20)
    Em vermelho temos o dano mínimo, analogamente, em azul, temos o dano máximo.
    Em verde é possível editar o efeito da explosão
    Só lembrando que as edições que forem feitas no newspider.lua devem ser feitas no spider.lua para que a magia tenha graça.. se não o dano da explosão/poison ao explodir será diferente caso ela morrer antes.  Em spiderling.lua vc pode editar a quantidade máxima de crias que um player pode ter... o normal está setado para 2 mas vc pode sentir-se livre pra colocar quantas queira.
    local maxsummon = 2   (Só lembre-se que ao explodir uma aranha pode acertar outra então não é muito bom deixar um numero maior que 3);
     
    Se você for daqueles bem chatinhos com a magia você ainda pode editar algumas coisas importantes tais como:
    O efeito que sai quando ela explode por morte ou pela spell:
     doSendMagicEffect(getThingPos(cid), 16) O tempo em que ela executa a spell, a chance da spell sair naquele tempo e quantos sqm de distancia a criatura alvo deve estar pra aranha se explodir: 
    <attack name="poison explosion" interval="1000" range="1" chance="50"/> interval = de quantos em quantos segundos ela executa a spell
    range = distancia em sqm que o alvo deve estar pra que ela execute a spell
    chance = chance de executar a spell a cada interval (nesse caso a cada 1 segundo tem 50% de chance dela soltar a magia)
     
    Você ainda pode editar aqui em vermelho:
    o tempo que leva pra criatura executar a magia.. Por padrão eu deixei 2 segundos, ou seja... eu sumono a aranha, ela vai até o alvo e a cada segundo q ela passa grudada no alvo (1 sqm de distancia) ela tem 50% de chance de ativar a spell e ficar parada no lugar durante 2 segundos até explodir. Se você quiser que ela leve menos tempo pra explodir é só baixar o 2000 (em milisegundos).. Se você quiser aumentar o dano e deixar ela parada por mais tempo até explodir pode editar a vontade aumentando os 2000.

    • Bom, isso é tudo que dava pra eu explicar... é óbvio que dá pra editar muito mais coisa mas se você não é scripter e não tem muita idéia de como editar eu dei uma ensinada básica doque você está autorizado a mexer. Espero que vocês curtam a spell e deem aquele REP+ pra fortalecer kkkk
    Eu não pretendia liberar essa spell visto que ela é extremamente complexa e nenhum servidor tem ela, mas, acho que seria muito babaca da minha parte ficar guardando um script tão bonito hahaha. Qualquer erro ou dúvida postem nos comentários que eu tento ajudar.
     
    ah, mais uma coisa: Os créditos são 90% meus visto que eu fiz praticamente tudo.. 9% é pro cara que fez a magia original (se vcs derem uma procurada vcs vão ver que não tem quase nada a ver com a minha mas os créditos dele são por ele ter me dado a idéia) e 1% pro cara no suporte que me pediu ajuda numa spell do mesmo gênero e me fez correr atrás de uma forma de fazer essa magia pra versões inferiores a TFS 1.0
  7. Gostei
    mostps recebeu reputação de migao em (Resolvido)[ERRO] Criando vocations   
    com a de cima da erro?
     
    <vocation id="4" name="Espadachim" description="a Espadachim" gaincap="25" gainhp="15" gainmana="5" gainhpticks="2" gainhpamount="250" gainmanaticks="2" gainmanaamount="250" manamultiplier="4.0" attackspeed="520" soulmax="100" gainsoulticks="120" fromvoc="4"> <formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0"/> <skill id="0" multiplier="1.1"/> <skill id="1" multiplier="1.1"/> <skill id="2" multiplier="1.1"/> <skill id="3" multiplier="1.1"/> <skill id="4" multiplier="1.4"/> <skill id="5" multiplier="1.1"/> <skill id="6" multiplier="1.1"/> </vocation>   tenta usar esse
  8. Gostei
    mostps deu reputação a Alidev em [8.60] Distro 0.4 LINUX [CAST]   
    Olá galera, vou postar a source compilada desse tópico: AQUI
     
    Alguns amigos meus de skype estão pedindo e não conseguem compilar, então vou postar já compilada.
     
     
    Adicione 
    enableCast = "true" (no seu config.lua) Obs: só estou postando a DISTRO para LINUX (talkactions, pagina de cast, pegue aqui: AQUI)
     
    DOWNLOAD :
    Link Download.
     
    SCAN:
    VirusTotal
     
    Créditos:
    EU por compilar xD
    Summ
    Jamilson Collins
    Joadson (modificou algo).
     
  9. Gostei
    mostps deu reputação a MaTTch em (Resolvido)Propriedades items   
    Na verdade é possivel sim:
    <attribute key="increaseMagicPercent" value="110" /> mas lembre-se que o value deve ser sempre acima de 100 para aumentar a força, e menor de 100 para diminuir.
     
    Exemplo: ali esta 110, entao ele da apenas 10% a mais de porcentagem, pois os 100 representao os 100% do poder do player.
  10. Gostei
    mostps deu reputação a glacialot em [Sistema] Castle Guild   
    Alguem vende esses scripts do castle 24h?
  11. Gostei
    mostps deu reputação a Absolute em [FireStorm Event] Chuva de fogos! Desespero [ON]   
    Hello nação TK, de um tempo pra cá eu e o membro ViitinG resolvemos trabalhar em cima de um novo evento para vocês, é o FireStorm event!
     
    Eu vim trabalhando no script do evento em MODS e o Victor no mapa do mesmo.
     
    WTF DE FAIRIEISTORMIII IS IT?
    Pois é galera, o nome já diz tudo "Chuva de Fogos".
    Algum membro da equipe executará o comando !startfire para dar início ao evento, então irá aparecer uma mensagem para todos os jogadores do servidor que o evento Fire Storm foi aberto.
    Então os jogadores irão dizer: !joinfire para entrar no evento, os jogadores ficarão imóveis até que o evento comece, o jogador não poderá usar o comando quando estiver com battle fight.
    Pós dar o tempo para inciar o evento (configurável no script) os jogadores serão teleportados para a área específica do mesmo onde em 1 minuto começará a cair FOGOS do céu, onde os jogadores contaram com a habilidade e a sorte para fugir dos fogos.
    A regra é clara Casa Grande, foi atingido é teleportado para o templo com a mensagem "You loss" VOCÊ PERDEU BABY!
     
    O Último sobrevivente da arena é recompensado com X item automáticamente (configurável).
     
     
     
    Sem mimimi vamos ao que interessa:
     
    Na pasta incial do seu servidor há uma pasta com o nome de MODS, então crie um arquivo com o nome de w-fire.xml dentro dela com o conteúdo abaixo:
    <?xml version="1.0" encoding="UTF-8"?> <mod name="Fire_Storm_Event" version="0.1" author="Absolute Version" contact="lu.lukinha" enabled="yes">     <config name="config_fire_storm_event">         <![CDATA[             configFireStormEvent = {                 storages = {                     main = 'fireStormEventMain', -- set free storage                     player = 'fireStormEventPlayer', -- set free storage                     joining = 'fireStormEventJoining', -- set free storage                     exhaust = 'fireStormEventExhaust', -- set free storage                     countEvent = 'fireStormEventCountEvent' -- set free storage                 },                                  position = {x=890 ,y=993,z=7}, -- posiotion to which player is teleporting                 room = {                     from = {x=736,y=933,z=7}, -- left top corner of event room                     to = {x=781,y=955,z=7} -- right bottom corner of event room                 },                 rewards = {8858, 2346, 2538, 2437}, -- reward id which player can win (reward is random)                 players = {                     max = 80,                     min = 2,                     minLevel = 100                 },                 days = {                     ['Tuesday'] = {'19:59:20'},                     ['Thursday'] = {'19:59:20'},                     ['Sunday'] = {'19:59:20'}                 },                 fireStormDelay = 1000, -- milisecond                                  delayTime = 5.0, -- time in which players who joined to event are teleporting to teleport position                 startEvent = 5 -- time from teleport to start event                 text = '-PL-\nAby wygrac i otrzymac nagrode, utrzymaj sie jak najdluzej na arenie.\n\n-ENG-\nTo win and get a Rewards, to stay as long as possible in the arena.'             }             y, x = 1, 1 -- don't change it         ]]>     </config>          <lib name="lib_fire_storm_event">         <![CDATA[             function doStartFireStormEvent()                 doSetStorage(configFireStormEvent.storages.joining, -1)                                  if configFireStormEvent.players.min <= doCountPlayersFireStormEvent() then                             for _, cid in ipairs(getPlayersOnline()) do                         if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then                             doCreatureSetNoMove(cid, false)                             doRemoveCondition(cid, CONDITION_INFIGHT)                             doTeleportThing(cid, configFireStormEvent.position)                             doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)                                                          doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'Get ready. Fire Storm Event start in '..configFireStormEvent.startEvent..' seconds.')                         end                     end                                          addEvent(doSetStorage, configFireStormEvent.startEvent * 1000, configFireStormEvent.storages.main, 1)                     addEvent(doRepeatCheckFireStorm, configFireStormEvent.startEvent * 1000 + 2000)                                          doBroadcastMessage('Fire Storm Event has started. LET\'S GO!')                 else                     for _, cid in ipairs(getPlayersOnline()) do                         if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then                             doCreatureSetNoMove(cid, false)                             doRemoveCondition(cid, CONDITION_INFIGHT)                         end                     end                                          doBroadcastMessage('Fire Storm hasn\'t started beacuse there were not enough players.')                 end             end                          function doRepeatCheckFireStorm()                 if getStorage(configFireStormEvent.storages.main) > 0 then                     local xTable, yTable, playerTable = {}, {}, {}                     for x = configFireStormEvent.room.from.x, configFireStormEvent.room.to.x do                         for y = configFireStormEvent.room.from.y, configFireStormEvent.room.to.y do                             table.insert(xTable, x)                             table.insert(yTable, y)                             local n, i = getTileInfo({x=x, y=y, z=configFireStormEvent.room.to.z}).creatures, 1                             if n ~= 0 then                                 local v = getThingfromPos({x=x, y=y, z=configFireStormEvent.room.to.z, stackpos=i}).uid                                 while v ~= 0 do                                     if isPlayer(v) then                                         table.insert(playerTable, v)                                         if n == #playerTable then                                             break                                         end                                     end                                     i = i + 1                                     v = getThingfromPos({x=x, y=y, z=configFireStormEvent.room.to.z, stackpos=i}).uid                                 end                             end                         end                     end                     if #playerTable == 1 then                         local prize = math.random(#configFireStormEvent.rewards)                         doCreatureAddHealth(playerTable[1], getCreatureMaxHealth(playerTable[1]) - getCreatureHealth(playerTable[1]))                         doCreatureAddMana(playerTable[1], getCreatureMaxMana(playerTable[1]) - getCreatureMana(playerTable[1]))                         doTeleportThing(playerTable[1], getTownTemplePosition(getPlayerTown(playerTable[1])), true)                         doPlayerAddItem(playerTable[1], configFireStormEvent.rewards[prize], 1)                         doPlayerSendTextMessage(playerTable[1], MESSAGE_EVENT_ADVANCE, 'You win! You have received ' .. getItemNameById(configFireStormEvent.rewards[prize]) .. ' as reward.')                         doBroadcastMessage('Fire Storm Event has finished. The winner is ' .. getCreatureName(playerTable[1]) .. '. Congratulations.')                         doSetStorage(configFireStormEvent.storages.main, -1)                                                  db.query("INSERT INTO `events` (`event_name`, `winner_name`, `won_item`, `time_win`) VALUES (\"Fire\", \"" .. getCreatureName(playerTable[1]) .. "\", \"" .. getItemNameById(configFireStormEvent.rewards[prize]) .. "\", " .. getStorage(configFireStormEvent.storages.countEvent) ..");")                         doSetStorage(configFireStormEvent.storages.countEvent, getStorage(configFireStormEvent.storages.countEvent) + 1)                                                  x, y = 1, 1                     elseif #playerTable > 1 then                         for a = 1, y do                             addEvent(                                 function()                                     local pos = {x=xTable[math.random(#xTable)], y=yTable[math.random(#yTable)], z=7}                                     for _, player in ipairs(playerTable) do                                         local pPos = getThingPos(player)                                         if pPos.x == pos.x and pPos.y == pos.y and pPos.z == pos.z then                                             doCreatureAddHealth(player, - getCreatureMaxHealth(player))                                         end                                     end                                     doSendDistanceShoot({x = pos.x - math.random(4, 6), y = pos.y - 5, z = pos.z}, pos, CONST_ANI_FIRE)                                     addEvent(doSendMagicEffect, 150, pos, CONST_ME_HITBYFIRE)                                     addEvent(doSendMagicEffect, 150, pos, CONST_ME_FIREAREA)                                 end,                                 math.random(100,1000)                             )                         end                         if x == 5 * y then                             y = y + 1                         end                                                  x = x + 1                     else                         doBroadcastMessage('No one have won in Fire Storm Event.')                         doSetStorage(configFireStormEvent.storages.main, -1)                                                 doSetStorage(configFireStormEvent.storages.countEvent, getStorage(configFireStormEvent.storages.countEvent) + 1)                         x, y = 1, 1                     end                                          addEvent(doRepeatCheckFireStorm, configFireStormEvent.fireStormDelay)                 end             end                          function doCountPlayersFireStormEvent()                 local x = 0                 for _, cid in ipairs(getPlayersOnline()) do                     if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then                         x = x + 1                     end                 end                 return x             end                          function doStartCountingFireStormEvent(x)                 if configFireStormEvent.delayTime-x > 0 then                     doBroadcastMessage('Fire Storm Event will start in '..configFireStormEvent.delayTime-x..' minutes. You can join to the event by say "!fire join".')                     addEvent(doStartCountingFireStormEvent, 60*1000, x+1)                 end             end         ]]>     </lib>     <talkaction words="!fire" event="script">         <![CDATA[             domodlib("config_fire_storm_event")             function onSay(cid, words, param)                 if getStorage(configFireStormEvent.storages.joining) ~= 1 then                     return doPlayerSendCancel(cid, 'Fire Storm Event hasn\'t started yet.')                 elseif param == '' then                     return doPlayerSendCancel(cid, 'Command param required (say: "!fire join" or "!fire leave.").')                 elseif getPlayerLevel(cid) < configFireStormEvent.players.minLevel then                     return doPlayerSendCancel(cid, 'You can\'t join to the event if you don\'t have a require '..configFireStormEvent.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, configFireStormEvent.storages.exhaust) ~= false then                     return doPlayerSendCancel(cid, 'You must wait '..exhaustion.get(cid, configFireStormEvent.storages.exhaust)..' seconds to use this command again.')                 end                 if param == 'join' then                     if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then                         return doPlayerSendCancel(cid, 'You have arleady joined to event. Wait patiently for start.')                     elseif doCountPlayersFireStormEvent() == configFireStormEvent.players.max then                         return doPlayerSendCancel(cid, 'Max players in the event have been reached.')                     end                                          doCreatureSetNoMove(cid, true)                     doPlayerPopupFYI(cid, configFireStormEvent.text)                     doCreatureSetStorage(cid, configFireStormEvent.storages.player, 1)                     doAddCondition(cid, createConditionObject(CONDITION_INFIGHT, -1))                     doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You have joined to Fire Storm 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 Fire Storm Event.')                 elseif param == 'leave' then                     if getCreatureStorage(cid, configFireStormEvent.storages.player) <= 0 then                         return doPlayerSendCancel(cid, 'You can\'t leave from the event if you don\'t join.')                     end                                          doCreatureSetNoMove(cid, false)                     doRemoveCondition(cid, CONDITION_INFIGHT)                     doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)                     doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have left from the Fire Storm Event.')                 end                                  exhaustion.set(cid, configFireStormEvent.storages.exhaust, 5)                                  return true             end         ]]>     </talkaction>          <talkaction words="!startfire" access="4" event="script">         <![CDATA[             domodlib("config_fire_storm_event")             domodlib("lib_fire_storm_event")             function onSay(cid, words, param)                 if getStorage(configFireStormEvent.storages.main) > 0 then                     return doPlayerSendCancel(cid, 'Fire Storm Event is already running.')                 end                              doStartCountingFireStormEvent(0)                                  for _, pid in ipairs(getPlayersOnline()) do                     if getCreatureStorage(pid, configFireStormEvent.storages.player) > 0 then                         doCreatureSetStorage(pid, configFireStormEvent.storages.player, -1)                         doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)                     end                 end                                  doSetStorage(configFireStormEvent.storages.joining, 1)                 addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)                 return true             end         ]]>     </talkaction>     <globalevent name="Fire_Storm_Event_Days" interval="1000" event="script">         <![CDATA[             domodlib("config_fire_storm_event")             domodlib("lib_fire_storm_event")             local daysOpen = {}                         for k, v in pairs(configFireStormEvent.days) do                 table.insert(daysOpen, k)             end                          function onThink(interval)                 if isInArray(daysOpen, os.date('%A')) then                     if isInArray(configFireStormEvent.days[os.date('%A')], os.date('%X', os.time())) then                         if getStorage(configFireStormEvent.storages.joining) ~= 1 then                             doStartCountingFireStormEvent(0)                                                          for _, pid in ipairs(getPlayersOnline()) do                                 if getCreatureStorage(pid, configFireStormEvent.storages.player) > 0 then                                     doCreatureSetStorage(pid, configFireStormEvent.storages.player, -1)                                     doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)                                 end                             end                                                          doSetStorage(configFireStormEvent.storages.joining, 1)                             addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)                         end                     end                 end                 return true             end         ]]>     </globalevent>     <event type="statschange" name="Fire_Storm_Event_Dead" event="script">         <![CDATA[             domodlib("config_fire_storm_event")             function onStatsChange(cid, attacker, type, combat, value)                 if type == 1 and getCreatureHealth(cid) <= value then                     if isInRange(getThingPos(cid), configFireStormEvent.room.from, configFireStormEvent.room.to) then                         doCreatureAddHealth(cid, getCreatureMaxHealth(cid) - getCreatureHealth(cid))                         doCreatureAddMana(cid, getCreatureMaxMana(cid) - getCreatureMana(cid))                         doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))                         doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You loss.')                         return false                     end                 end                 return true             end         ]]>     </event>          <event type="login" name="Fire_Storm_Event_Login" event="script">         <![CDATA[             domodlib("config_fire_storm_event")                      function onLogin(cid)                 if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then                     doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)                     doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true)                     doCreatureSetNoMove(cid, false)                     doRemoveCondition(cid, CONDITION_INFIGHT)                 end                 registerCreatureEvent(cid, 'Fire_Storm_Event_Dead')                 return true             end         ]]>     </event>          <globalevent name="Fire_Storm_Event_Start" type="startup" event="script">         <![CDATA[             domodlib("config_fire_storm_event")             function onStartup()                 doSetStorage(configFireStormEvent.storages.main, -1)                 doSetStorage(configFireStormEvent.storages.joining, -1)                 return true             end         ]]>     </globalevent> </mod> Como configurar:
     
    position = {x=890 ,y=993,z=7}, -- posiotion to which player is teleporting - Aqui você deve colocar o centro da posição do mapa que o linduxo do meu querido amigo e parceiro vosso disponibiliza AQUI
    from = {x=736,y=933,z=7}, -- left top corner of event room - Aqui você deve colocar a posição superior esquerda da área do evento, como exemplo na imagem:



    to = {x=781,y=955,z=7} -- right bottom corner of event room - Aqui você deve colocar a posição inferior direita da área do evento, como exemplo na imagem:



     
    Configurar prêmio:
    rewards = {8858, 2346, 2538, 2437}, -- reward id which player can win (reward is random) - onde está os números de exemplo 8858, 2346, 2538, 2437 são os IDS dos items que você colocará como premiação, o player ganhará apenas UM item que pode ser um dos 4 (sorteio).
    Caso você queira colocar apenas 1 item específico altere para:
    rewards = {8858}, -- reward id which player can win (reward is random)
     
     
    Permissão para abrir o evento:
    <talkaction words="!startfire" access="4" event="script"> - em acess="4" você poderá alterar o membro da staff que poderá abrir, o número 4 indica que CM e ADMS poderão abrir, caso troque para 3, GM'S, CM'S E ADM'S poderão executar o comando !startfire para abrir o evento quando quiser.
     
     
    Configuração automática:
        days = {
                        ['Tuesday'] = {'19:59:20'},
                        ['Thursday'] = {'19:59:20'},
                        ['Sunday'] = {'19:59:20'}
     
    Simples, os dias são colocados em inglês, então basta ajustar, por exemplo, você quer que o evento ocorra na segunda-feira ás 19:00, segue um exemplo:
       ['Monday'] = {'19:00:00'},
     
    Lembrando que o dia e horário deve corresponder com o horário atual da máquina onde roda o servidor.
     
     
    É isso meus queridos, na próxima versão do evento colocarei para entrar no mesmo por teleport.
     
    Não esqueçam de baixar e usar o mapa que recomendo do Victor aqui. É ideal para o evento =)
     
     
    Qualquer dúvida não deixe de me perguntar.
     
     
     
    Créditos:
    CollocorpuseK base do evento
    Absolute (adaptação, funções e abertura por comando)
    VitiinG (mapa)
     
     
     
     
     
    Nós vemos na próxima versão!
    Enjoy.
  12. Gostei
    mostps deu reputação a MaxSilver em [Pedido] Bloqueando 1/1 do gesior   
    Primeiramente vá na database do seu servidor vá em accounts procure pela conta name 1 e senha 1 (provavelmente será a primeira) depois disso vá em page access e modifique para 2
    Após transfira os characters "samples" do account manager para outra conta deixe só o proprio Account Manager na acc.
    Em seguida abra a pasta do seu site depois abra a pasta config e logo depois abra o arquivo config.php

    Procure por:
    // ACC MAKER OPTIONS config $config['site']['access_news'] = 2; // access level needed to edit news $config['site']['access_admin_panel'] = 3; // access level needed to open admin panel Modifique Para
    // ACC MAKER OPTIONS config $config['site']['access_news'] = 3; // access level needed to edit news $config['site']['access_admin_panel'] = 3; // access level needed to open admin panel Feito isso volta a pasta do seu site e abra o arquivo accountmanagement.php
    logo depois do <?PHP adicione isso:
    if($group_id_of_acc_logged == 2) $main_content .= '<h1>Account Manager Bloqueado.'; else Pronto após executar todos os passos seu account manager estará bloqueado para acessos no site 
    Ele ficara impossibilitado de mudar o password do account manager pelo site !!
     
     
    Gostou? REP +
  13. Gostei
    mostps deu reputação a MaXwEllDeN em (Resolvido)Npc travel por storage   
    local STORAGE = 5021 -- Storage necessária para viajar local DESTINO = {x = 160, y = 54, z = 7} -- POSIÇÃO DE DESTINO   local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler)   function onCreatureAppear(cid)         npcHandler:onCreatureAppear(cid)         end function onCreatureDisappear(cid)      npcHandler:onCreatureDisappear(cid)         end function onCreatureSay(cid, type, msg)   npcHandler:onCreatureSay(cid, type, msg:lower())   end function onThink()                  npcHandler:onThink()                  end local talkState = {}   function creatureSayCallback(cid, type, msg)    if(not npcHandler:isFocused(cid)) then       return false    end      local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid      if msgcontains(msg, "cinnabar") then       selfSay("Você deseja ser teletransportado para cinnabar?", cid)       talkState[talkUser] = 1    elseif msgcontains(msg, "yes") and talkState[talkUser] == 1 then       if getPlayerStorageValue(cid, STORAGE) > 0 then          selfSay("Aí está!", cid)          doSendMagicEffect(getThingPos(cid), 10)          npcHandler:releaseFocus(cid)          doTeleportThing(cid, DESTINO)          doSendMagicEffect(DESTINO, 10)       else          selfSay("Me desculpe, mas você não tem acesso a cinnabar.", cid)       end       talkState[talkUser] = 0    end      return true end     npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())  
  14. Gostei
    mostps deu reputação a llucas75 em (Resolvido)Npc travel por storage   
    Tenta ae friendi
     
    npc
     



  15. Gostei
    mostps deu reputação a Mythera em DISTRO - TFS 0.3.7-r5969 - ANTI CLONE - CAST SYSTEM !   
    Olá pessoal, estou desenvolvendo minha source para continuar meu projeto 8.60, a finalidade é que está source seja a mais estável com todos os códigos de segurança possível:
     
    CHANGE LOG:
    http://pastebin.com/JSghWu5a
     
    SOURCE OTX - MARTYX
    LINK DOWNLODER
     
    OBS: As alterações abaixo é somente na DISTRO que disponibilizei, a base de dados que usei para alterações está logo acima para downloder!
     
    ANTI CLONE AUTOMÁTICO PELO EXECUTÁVEL
    CAST SYSTEM - ELF
    WAR SYSTEM
    ANTI DIVULGAÇÃO
    NO CHEKS ITEMS
    TRAINING OFFLINE
     
    DISTRO ESTÁVEL SEM BUGS POSSÍVEIS !
      UPDATE 1 DOWNLODER!!!!   SCAN   REVISÃO: AGORA O ICON SWORD FICA QUANDO ESTÁ EM PZ CTRL + O FUNCIONANDO REVISÃO EM OUTROS SISTEMAS.   UPDATE 2 DOWNLOAD 2 !!!     COMPILANDO TFS AND OTX - MARTYX USANDO DEV-CPP++...DISPONIBILIZANDO PRA VOCÊS UMA FORMA MAIS FÁCIL DE COMPILAR!!!   COMPILANDO OTX EM DEV C++ USED: DOWNLOAD 3   TUTORIAL COMPILING OTX AND TFS EM DEV ++     Credits: ========= OTX Server 2 are based on: [The Forgotten Server Version: 0.3.7 - Crying Damson](http://otland.net/threads/9-46-the-forgotten-server-v0-3-7-preview-crying-damson.155314/).   Codename: FINAL.   Developers: Protect Administrator: [Mattyx14](http://www.blacktibia.org/u3472) and [Alejandra](http://www.blacktibia.org/u37886).   C++ Programmer(s), Committer(s) and Data Directory Manager(s): [Mattyx14](http://www.blacktibia.org/u3472).   Special Thanks(s): [Alejandra](http://www.blacktibia.org/u37886) - Comedinhasss - Lincoln - Rodrigo - Pyromaniack - Druckz - Kazbin & The Forgotten Server Team   Arthur Luna And Natanael Beckman   OBG!!!
  16. Gostei
    mostps deu reputação a Raell5 em Mega-Rpg Monster World [8.60] *   
    Download *

    http://www.speedyshare.com/8sbvs/Mega-Rpg-Monster-Map.rar  
    Skan *



     
    Creditos *

    Rewana Raell Deads  
  17. Gostei
  18. Gostei
    mostps deu reputação a gabisa00 em Defense System - "Dodge"   
    Ae galera do TK, não quero fazer propaganda de nada mas sempre ajudei o pessoal do tibiaking, e com seu fim, resolvi procurar outro fórum para me posicionar, quando conheci aqui não botava muita Fé mas ao longo do tempo percebi que o TK merecia meu respeito, pois ao contrário do tibiaking ele defende o OpenSource, afinal de tudo resolvi fazer minha primeira contribuição para o TK.
     

    Defense System


    Informações:Esse sistema é bem simples, consiste em um sistema que ignora o ataque do oponente dependendo do nivel de defense. Sim, sei que o próprio tibia já tem um sistema desse, mas acontece que para servidores baiak fastattack isso torna as coisas mais emocionantes.
     
    Descrição:
    O player oponente tem 10 porcento de chance máxima de defender o próximo ataque.
    Testado em Versão 8.60.
     
     


    Instalação
     Vá em data/creaturescripts/scripts e cria um arquivo chamado defense.lua, dentro dele coloque.



     



     
    Logo em seguida vá até data/creaturescripts abra o arquivo creaturescripts.xml e adicione essa tag.



     
    Agora vá em data/creaturescripts/scripts e abra o arquivo login.lua e adicione essa tag.



     
     
    Em seguida vá a pasta data/actions/scripts e cria um arquivo chamado defense.lua, dentro dele coloque isso.



     



     
    Agora vá ao arquivo data/actions/actions.xml e adicione essa tag.



     



     
     
    Créditos:
    100% - Gabisa00
     
    Dúvidas, bugs, sugestões, somente no tópico.
     
    Gostou do Sistema Faça Seu Pedido Aqui!
  19. Gostei
    mostps deu reputação a xWhiteWolf em Dodge System 8.54+   
    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:
  20. Gostei
    mostps deu reputação a palubo em Como criar uma nova skill   
    Fala, galera! Beleza?
     
    Sou novo aqui no TK e queria trazer algo para vocês. Dei uma procurada e não achei nada do tipo, então creio que esse tutorial possa ajudar algumas pessoas! 
    O que vou ensinar a vocês é como criar uma skill direto na source, o que permite que você utilize comandos como "getPlayerSkill", "doPlayerAddSkillTry" etc em seus scripts em Lua. Esse tutorial NÃO serve para criar skills de "combate", como sword, axe etc. Esse tipo de skill envolve vários outros parâmetros além do que mostrarei aqui. Quem sabe eu faça um tutorial sobre isso daqui um tempo. 

    Preview de uma skill que criei para meu projeto:

     
    Para este tutorial, eu usei:
     Sources do The Forgotten Server 0.3.7: Aqui serão feitas várias edições, criando a nova skill e tudo que é necessário para a skill funcionar corretamente.  Microsoft Visual Studio 2010 Professional: Utilizei para compilar o TFS com as novas edições. Se não souber compilar, procure em outros tópicos aqui do fórum. Não é meu objetivo aqui ensinar como compilar. É necessário compilar com o MVS? Não. Se você preferir, pode fazer com outros programas.  Notepad++: Usei porque acho um editor de texto simples, prático e funcional. Não gosto de editar os códigos no MVS. Porém sinta-se à vontade para usar o editor que quiser. haha  SQLiteStudio 2.1.4: Será necessário para fazer pequenas alterações para que seu banco de dados funcione corretamente. Se você utiliza MySQL, terá que fazer essas edições por outro programa.  Sources do OTClient: Como utilizo o OTClient em meu servidor, usarei ele para demonstrar como adicionar a barrinha à janela de Skill. Se você utiliza outro client, infelizmente, não poderei dar suporte, já que nunca editei outros clients.  Codeblocks: Usei para compilar o OTClient. Mas pode ser feito com o MVS também. A escolha é sua! Passo 1 - Editar a source do TFS:
     



     
    Passo 2 - Editar o OTClient:
     



     
    Passo 3 - Editar o TFS:
     



     
    Passo 4 - Editar a database:
     



     
    Pronto! Seu servidor já está configurado com a nova skill! Agora você poderá usar Lua para configurá-la! 
     
    Vou dar um exemplo MUITO simples de como isso poderia ser feito em Lua:
     



     
    Claro que essa action acima é algo muito simples, mas, tendo o servidor já configurado, acredito que essas modificações abram uma gama de possibilidades imensas a todos que querem desenvolver uma nova skill. Espero que tenham gostado e que o tutorial seja útil para alguém! haha
     
    Qualquer erro ou bug, me avisem!
     
    Atenciosamente,
    Auro Mota.
  21. Gostei
    mostps deu reputação a luanluciano93 em TFS 0.4 CAST   
    Olá pessoal, tive a iniciativa de criar esse tópico para atualizar e otimizar as sources do TFS 0.4 DEV que é uma das mais usadas no mundo do otserv. Conteúdo totalmente gratuito e pretendemos melhora-lo cada vez mais. 
     
    Qualquer um pode colaborar, postando bugs, erros, otimizando códigos, comentar aqui no tópico, toda ajuda é bem vinda, vamos tornar essa a melhor source disponível. Conto com vocês.
     
    Versão do Tibia: 8.60
     
    Alguns sistema já implementados na source:
    • TFS 0.4 DEV rev 3777 (by TFS Team)
    • Anti-Divulgação (.servegame, .no-ip, .net, .com, .org, .pl, .biz, .br, .sytes, .info)
    • War System
    • Cast System (by Summ)
    • Retirado bugs de anti-push ..
    • Retirado bugs de elfbot ...
    • Retirado erro de não aceitar outros items ...
    • Retirado erro de Malformed File ...
    • Add creatureevent onMoveItem()  ...
    • Add função getCreaturePathTo () ...
    • E vários outros!
     
    Complementos:
    • Add cast System (passo a passo): [AQUI]
    • Pode add o comando na config.lua:
    healthHealingColor = COLOR_GREEN -- [podendo alterar a cor]. manaHealingColor = COLOR_DARKPURPLE -- [podendo alterar a cor]. Downloads:
    • Distro Compilada 32x
    • Distro Compilada 64x
    • Sources 7
     
     
    TESTADO EM WINDOWS, DEBIAN 7.8, UBUNTU 12.04 E 14.05!
     
     
    • Compilar em Linux: 
     
     
     
    • Erros para arrumar: 
     


    Obrigado ao runeraserver pelo incentivo em fixa-la para linux

    E é isso pessoal, espero ter ajudado, abraços
     
  22. Gostei
    mostps deu reputação a Mek Fiuchem em [DUVIDA] Como Posso dar look No Player e ver os frags   
    Crie na pasta Data/Creaturescripts/script o arquivo fraglook.lua
    e cole isso

    function getPlayerFrags(cid) local time = os.time() local times = {today = (time - 86400), week = (time - (7 * 86400))} local contents, result = {day = {}, week = {}, month = {}}, db.getResult("SELECT `pd`.`date`, `pd`.`level`, `p`.`name` FROM `player_killers` pk LEFT JOIN `killers` k ON `pk`.`kill_id` = `k`.`id` LEFT JOIN `player_deaths` pd ON `k`.`death_id` = `pd`.`id` LEFT JOIN `players` p ON `pd`.`player_id` = `p`.`id` WHERE `pk`.`player_id` = " .. getPlayerGUID(cid) .. " AND `k`.`unjustified` = 1 AND `pd`.`date` >= " .. (time - (30 * 86400)) .. " ORDER BY `pd`.`date` DESC") if(result:getID() ~= -1) then repeat local content = {date = result:getDataInt("date")} if(content.date > times.today) then table.insert(contents.day, content) elseif(content.date > times.week) then table.insert(contents.week, content) else table.insert(contents.month, content) end until not result:next() result:free() end local size = { day = table.maxn(contents.day), week = table.maxn(contents.week), month = table.maxn(contents.month) } return size.day + size.week + size.month end function onLogin(cid) registerCreatureEvent(cid, "fraglook") return true end function onLook(cid, thing, position, lookDistance) if isPlayer(thing.uid) and thing.uid ~= cid then doPlayerSetSpecialDescription(thing.uid,'[Frags: '..getPlayerFrags(thing.uid)..']') return true elseif thing.uid == cid then doPlayerSetSpecialDescription(cid,'[Frags: '..getPlayerFrags(cid)..']') local string = 'You see yourself.' if getPlayerFlagValue(cid, PLAYERFLAG_SHOWGROUPINSTEADOFVOCATION) then string = string..' You are '.. getPlayerGroupName(cid) ..'.' elseif getPlayerVocation(cid) ~= 0 then string = string..' You are '.. getPlayerVocationName(cid) ..'.' else string = string..' You have no vocation.' end string = string..getPlayerSpecialDescription(cid)..'' if getPlayerNameByGUID(getPlayerPartner(cid), false, false) ~= nil then string = string..' You are '.. (getPlayerSex(cid) == 0 and 'wife' or 'husband') ..' of '.. getPlayerNameByGUID(getPlayerPartner(cid)) ..'.' end if getPlayerGuildId(cid) > 0 then string = string..' You are ' .. (getPlayerGuildRank(cid) == '' and 'a member' or getPlayerGuildRank(cid)) ..' of the '.. getPlayerGuildName(cid) string = getPlayerGuildNick(cid) ~= '' and string..' ('.. getPlayerGuildNick(cid) ..').' or string..'.' end if getPlayerFlagValue(cid, PLAYERCUSTOMFLAG_CANSEECREATUREDETAILS) then string = string..'nHealth: ['.. getCreatureHealth(cid) ..' / '.. getCreatureMaxHealth(cid) ..'], Mana: ['.. getCreatureMana(cid) ..' / '.. getCreatureMaxMana(cid) ..'].' string = string..'nIP: '.. doConvertIntegerToIp(getPlayerIp(cid)) ..'.' end if getPlayerFlagValue(cid, PLAYERCUSTOMFLAG_CANSEEPOSITION) then string = string..'nPosition: [X:'.. position.x..'] [Y:'.. position.y..'] [Z:'.. position.z..'].' end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, string) return false end return true end Agora no Data/Creaturescripts/creaturescripts.xml adicione essas tags: <event type="login" name="fraglook_register" event="script" value="fraglook.lua"/> <event type="look" name="fraglook" event="script" value="fraglook.lua"/>


    Ajudei ? Rep+ Please
  23. Gostei
    mostps deu reputação a OptimusHostOFC em DUVIDA   
    1º Aprenda sobre LINUX.. windows não presta para otserver.
  24. Gostei
    mostps deu reputação a ViitinG em (Resolvido)[AJUDA] Item que ganha dias de vip (Sistema Mock)   
    "data/actions/scripts/ganharvip"
    function onUse(cid, item, fromPosition, itemEx, toPosition) local config={ removeOnUse = "yes" -- remover quando usar ("yes" or "no") } local days = 30 -- dias que serão adicionados local daysvalue = days * 24 * 60 * 60 local storageplayer = getPlayerStorageValue(cid, 55555) local timenow = os.time() if getPlayerStorageValue(cid, 55555) - os.time() <= 0 then time = timenow + daysvalue else time = storageplayer + daysvalue end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Foram adicionados ".. days .." dias de VIP no seu character.") setPlayerStorageValue(cid, 55555, time) local quantity = math.floor((getPlayerStorageValue(cid, 55555) - timenow)/(24 * 60 * 60)) doSendMagicEffect(getPlayerPosition(cid), math.random(28,30)) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você tem ".. quantity .." dias de VIP restantes.") if (config.removeOnUse == "yes") then doRemoveItem(item.uid, 1) end return TRUE end "data/actions/actions.xml"
    <action itemid="IDDOITEM" script="ganharvip.lua"/>
  25. Gostei
    mostps deu reputação a Ryzor em Top 25 Fraggers   
    Nome: Top 25 Fraggers no Site
    Autores: Skeyba(mysql e PHP) / Dreamer/aioriusox(Script)
    Servidor Testado: TFS 0.3.4 (Cryng Dansom)
    Gesior Acc Maker Testado: Gesior Acc 0.3.4




    O Script.lua


    Basicamente este script mostra no Site um Rank dos jogadores que mais matam outros Jogadores, a cada jogador Morto é adicionado um valor no banco de dados fazendo a contagen de quantos jogadores cada jogador matou e ele vai ganhando caveirinhas.




    Screen Shot








    Vamos Começar a Parte Mysql e PHP:


    Vá no seu banco de dados em mysql, e execute no banco de dados do seu OT este comando Mysql:

    Código PHP:
    ALTER TABLE `players` ADD `frags_all` INT( 11 ) NOT NULL;


    Agora vamos criar a Pagina do Site em PHP, vá na pasta do seu site, se voce usar xampp vá em c:/xampp/htdocs copie um arquivo PHP e cole na mesma pasta e renomei-o para frags.php e adicione este código la dentro:






    Salve, Abra seu OT e Teste!

Informação Importante

Confirmação de Termo