Ir para conteúdo

Erimyth

Administrador
  • Registro em

  • Última visita

Tudo que Erimyth postou

  1. Erimyth postou uma resposta no tópico em BBot
    Não cara, você poderá fazer o download da atualização diretamente da sua conta no site bmega.net.
  2. Galerinha, muitas vezes vocês possuem items.otb editados ou de outras versões, porém o server não aceita ele e acaba dando erro na hora de abrir seu distro, leia esse fácil tutorial e seus problemas irão acabar! Eu usei o Crystal Server e TFS 0.4 para fazer este tutorial, porém acho que ele funciona em outras versões do TFS, bom, vamos lá! Vá nas sources do seu servidor, abra seu items.cpp e procure por: if(Items::dwMajorVersion == 0xFFFFFFFF) std::clog << "[Warning - Items::loadFromOtb] items.otb using generic client version." << std::endl; else if(Items::dwMajorVersion < 3) { std::clog << "[Error - Items::loadFromOtb] Old version detected, a newer version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(Items::dwMajorVersion > 3) { std::clog << "[Error - Items::loadFromOtb] New version detected, an older version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(!g_config.getBool(ConfigManager::SKIP_ITEMS_VERSION) && Items::dwMinorVersion != CLIENT_VERSION_920) { std::clog << "[Error - Items::loadFromOtb] Another (client) version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } Agora substitua isso tudo por isso: /*if(Items::dwMajorVersion == 0xFFFFFFFF) std::clog << "[Warning - Items::loadFromOtb] items.otb using generic client version." << std::endl; else if(Items::dwMajorVersion < 3) { std::clog << "[Error - Items::loadFromOtb] Old version detected, a newer version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(Items::dwMajorVersion > 3) { std::clog << "[Error - Items::loadFromOtb] New version detected, an older version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(!g_config.getBool(ConfigManager::SKIP_ITEMS_VERSION) && Items::dwMinorVersion != CLIENT_VERSION_920) { std::clog << "[Error - Items::loadFromOtb] Another (client) version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; }*/ Agora compile seu server e seja feliz! A única alteração que eu fiz na code é adicionar as tags de comentário /* */ para que o servidor não revise o otb. Tutorial feito por mim com exclusividade ao TibiaKing.com! Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  3. Erimyth postou uma resposta no tópico em Playground (Off-topic)
    Olá miguxo
  4. Erimyth postou uma resposta no tópico em Ferramentas OpenTibia
    Asprate parou de atualizar ai tiveram que criar novos IP Changers... Belo tópico!
  5. Esse sistema de fato é incrível e devido a isto resolvi posta-lo aqui no TK. Espero que muitos gostem...
  6. Galerinha, esse é o famoso Guild War System com escudos, ele envolve vários scripts portanto preste atenção neste tópico e siga passo à passo para não dar nenhum tipo de erro. Nome: Guild War Author: Elf Versão testada: 0.4 SVN Crie um arquivo com o bloco de notas chamado db.mysql e importe ele para sua database: CREATE TABLE IF NOT EXISTS `guild_wars` ( `id` INT NOT NULL AUTO_INCREMENT, `guild_id` INT NOT NULL, `enemy_id` INT NOT NULL, `begin` BIGINT NOT NULL DEFAULT '0', `end` BIGINT NOT NULL DEFAULT '0', `frags` INT UNSIGNED NOT NULL DEFAULT '0', `payment` BIGINT UNSIGNED NOT NULL DEFAULT '0', `guild_kills` INT UNSIGNED NOT NULL DEFAULT '0', `enemy_kills` INT UNSIGNED NOT NULL DEFAULT '0', `status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `status` (`status`), KEY `guild_id` (`guild_id`), KEY `enemy_id` (`enemy_id`) ) ENGINE=InnoDB; ALTER TABLE `guild_wars` ADD CONSTRAINT `guild_wars_ibfk_1` FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `guild_wars_ibfk_2` FOREIGN KEY (`enemy_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE; ALTER TABLE `guilds` ADD `balance` BIGINT UNSIGNED NOT NULL AFTER `motd`; CREATE TABLE IF NOT EXISTS `guild_kills` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `guild_id` INT NOT NULL, `war_id` INT NOT NULL, `death_id` INT NOT NULL ) ENGINE = InnoDB; ALTER TABLE `guild_kills` ADD CONSTRAINT `guild_kills_ibfk_1` FOREIGN KEY (`war_id`) REFERENCES `guild_wars` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `guild_kills_ibfk_2` FOREIGN KEY (`death_id`) REFERENCES `player_deaths` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `guild_kills_ibfk_3` FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE; ALTER TABLE `killers` ADD `war` INT NOT NULL DEFAULT 0; Copie as querys e cole no arquivo start.lua ou init.lua, data > globalevents > scripts: db.executeQuery("DELETE FROM `guild_wars` WHERE `status` = 0 AND `begin` < " .. (os.time() - 2 * 86400) .. ";") db.executeQuery("UPDATE `guild_wars` SET `status` = 5, `end` = " .. os.time() .. " WHERE `status` = 1 AND `end` > 0 AND `end` < " .. os.time() .. ";") Agora na pasta data > lib crie um arquivo chamado 101-war.lua com isto: WAR_GUILD = 0 WAR_ENEMY = 1 Adicionem estas tags em data > talkactions > talkactions.xml: <!-- Guild War System --> <talkaction words="/war" channel="0" event="script" value="war.lua" desc="(Guild channel command) War management."/> <talkaction words="/balance" channel="0" event="script" value="balance.lua" desc="(Guild channel command) Balance management."/> Agora crie dois aquivos na pasta data > talkactions > scripts, chamados de balance.lua e war.lua: balance.lua local function isValidMoney(value) if(value == nil) then return false end return (value > 0 and value <= 99999999999999) end function onSay(cid, words, param, channel) local guild = getPlayerGuildId(cid) if(guild == 0) then return false end local t = string.explode(param, ' ', 1) if(getPlayerGuildLevel(cid) == GUILDLEVEL_LEADER and isInArray({ 'pick' }, t[1])) then if(t[1] == 'pick') then local money = { tonumber(t[2]) } if(not isValidMoney(money[1])) then doPlayerSendChannelMessage(cid, '', 'Invalid amount of money specified.', TALKTYPE_CHANNEL_W, 0) return true end local result = db.getResult('SELECT `balance` FROM `guilds` WHERE `id` = ' .. guild) if(result:getID() == -1) then return false end money[2] = result:getDataLong('balance') result:free() if(money[1] > money[2]) then doPlayerSendChannelMessage(cid, '', 'The balance is too low for such amount.', TALKTYPE_CHANNEL_W, 0) return true end if(not db.executeQuery('UPDATE `guilds` SET `balance` = `balance` - ' .. money[1] .. ' WHERE `id` = ' .. guild .. ' LIMIT 1;')) then return false end doPlayerAddMoney(cid, money[1]) doPlayerSendChannelMessage(cid, '', 'You have just picked ' .. money[1] .. ' money from your guild balance.', TALKTYPE_CHANNEL_W, 0) else doPlayerSendChannelMessage(cid, '', 'Invalid sub-command.', TALKTYPE_CHANNEL_W, 0) end elseif(t[1] == 'donate') then local money = tonumber(t[2]) if(not isValidMoney(money)) then doPlayerSendChannelMessage(cid, '', 'Invalid amount of money specified.', TALKTYPE_CHANNEL_W, 0) return true end if(getPlayerMoney(cid) < money) then doPlayerSendChannelMessage(cid, '', 'You don\'t have enough money.', TALKTYPE_CHANNEL_W, 0) return true end if(not doPlayerRemoveMoney(cid, money)) then return false end db.executeQuery('UPDATE `guilds` SET `balance` = `balance` + ' .. money .. ' WHERE `id` = ' .. guild .. ' LIMIT 1;') doPlayerSendChannelMessage(cid, '', 'You have transfered ' .. money .. ' money to your guild balance.', TALKTYPE_CHANNEL_W, 0) else local result = db.getResult('SELECT `name`, `balance` FROM `guilds` WHERE `id` = ' .. guild) if(result:getID() == -1) then return false end doPlayerSendChannelMessage(cid, '', 'Current balance of guild ' .. result:getDataString('name') .. ' is: ' .. result:getDataLong('balance') .. ' bronze coins.', TALKTYPE_CHANNEL_W, 0) result:free() end return true end war.lua local guild = getPlayerGuildId(cid) function onSay(cid, words, param, channel) if(not guild or getPlayerGuildLevel(cid) < GUILDLEVEL_LEADER) then doPlayerSendChannelMessage(cid, "", "You cannot execute this talkaction.", TALKTYPE_CHANNEL_W, 0) return true end local t = string.explode(param, ",") if(not t[2]) then doPlayerSendChannelMessage(cid, "", "Not enough param(s).", TALKTYPE_CHANNEL_W, 0) return true end local enemy = getGuildId(t[2]) if(not enemy) then doPlayerSendChannelMessage(cid, "", "Guild \"" .. t[2] .. "\" does not exists.", TALKTYPE_CHANNEL_W, 0) return true end if(enemy == guild) then doPlayerSendChannelMessage(cid, "", "You cannot perform war action on your own guild.", TALKTYPE_CHANNEL_W, 0) return true end local enemyName, tmp = "", db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. enemy) if(tmp:getID() ~= -1) then enemyName = tmp:getDataString("name") tmp:free() end if(isInArray({"accept", "reject", "cancel"}, t[1])) then local query = "`guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild if(t[1] == "cancel") then query = "`guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy end tmp = db.getResult("SELECT `id`, `begin`, `end`, `payment` FROM `guild_wars` WHERE " .. query .. " AND `status` = 0") if(tmp:getID() == -1) then doPlayerSendChannelMessage(cid, "", "Currently there's no pending invitation for a war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0) return true end if(t[1] == "accept") then local _tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild) local state = _tmp:getID() < 0 or _tmp:getDataInt("balance") < tmp:getDataInt("payment") _tmp:free() if(state) then doPlayerSendChannelMessage(cid, "", "Your guild balance is too low to accept this invitation.", TALKTYPE_CHANNEL_W, 0) return true end db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. tmp:getDataInt("payment") .. " WHERE `id` = " .. guild) end query = "UPDATE `guild_wars` SET " local msg = "accepted " .. enemyName .. " invitation to war." if(t[1] == "reject") then query = query .. "`end` = " .. os.time() .. ", `status` = 2" msg = "rejected " .. enemyName .. " invitation to war." elseif(t[1] == "cancel") then query = query .. "`end` = " .. os.time() .. ", `status` = 3" msg = "canceled invitation to a war with " .. enemyName .. "." else query = query .. "`begin` = " .. os.time() .. ", `end` = " .. (tmp:getDataInt("end") > 0 and (os.time() + ((tmp:getDataInt("begin") - tmp:getDataInt("end")) / 86400)) or 0) .. ", `status` = 1" end query = query .. " WHERE `id` = " .. tmp:getDataInt("id") if(t[1] == "accept") then doGuildAddEnemy(guild, enemy, tmp:getDataInt("id"), WAR_GUILD) doGuildAddEnemy(enemy, guild, tmp:getDataInt("id"), WAR_ENEMY) end tmp:free() db.executeQuery(query) doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE) return true end if(t[1] == "invite") then local str = "" tmp = db.getResult("SELECT `guild_id`, `status` FROM `guild_wars` WHERE `guild_id` IN (" .. guild .. "," .. enemy .. ") AND `enemy_id` IN (" .. enemy .. "," .. guild .. ") AND `status` IN (0, 1)") if(tmp:getID() ~= -1) then if(tmp:getDataInt("status") == 0) then if(tmp:getDataInt("guild_id") == guild) then str = "You have already invited " .. enemyName .. " to war." else str = enemyName .. " have already invited you to war." end else str = "You are already on a war with " .. enemyName .. "." end tmp:free() end if(str ~= "") then doPlayerSendChannelMessage(cid, "", str, TALKTYPE_CHANNEL_W, 0) return true end local frags = tonumber(t[3]) if(frags ~= nil) then frags = math.max(10, math.min(1000, frags)) else frags = 100 end local payment = tonumber(t[4]) if(payment ~= nil) then payment = math.max(100000, math.min(1000000000, payment)) tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild) local state = tmp:getID() < 0 or tmp:getDataInt("balance") < payment tmp:free() if(state) then doPlayerSendChannelMessage(cid, "", "Your guild balance is too low for such payment.", TALKTYPE_CHANNEL_W, 0) return true end db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. payment .. " WHERE `id` = " .. guild) else payment = 0 end local begining, ending = os.time(), tonumber(t[5]) if(ending ~= nil and ending ~= 0) then ending = begining + (ending * 86400) else ending = 0 end db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `enemy_id`, `begin`, `end`, `frags`, `payment`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ");") doBroadcastMessage(getPlayerGuildName(cid) .. " has invited " .. enemyName .. " to war till " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE) return true end if(not isInArray({"end", "finish"}, t[1])) then return false end local status = (t[1] == "end" and 1 or 4) tmp = db.getResult("SELECT `id` FROM `guild_wars` WHERE `guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy .. " AND `status` = " .. status) if(tmp:getID() ~= -1) then local query = "UPDATE `guild_wars` SET `end` = " .. os.time() .. ", `status` = 5 WHERE `id` = " .. tmp:getDataInt("id") tmp:free() doGuildRemoveEnemy(guild, enemy) doGuildRemoveEnemy(enemy, guild) db.executeQuery(query) doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. (status == 4 and "mend fences" or "ended up a war") .. " with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE) return true end if(status == 4) then doPlayerSendChannelMessage(cid, "", "Currently there's no pending war truce from " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0) return true end tmp = db.getResult("SELECT `id`, `end` FROM `guild_wars` WHERE `guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild .. " AND `status` = 1") if(tmp:getID() ~= -1) then if(tmp:getDataInt("end") > 0) then tmp:free() doPlayerSendChannelMessage(cid, "", "You cannot request ending for war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0) return true end local query = "UPDATE `guild_wars` SET `status` = 4, `end` = " .. os.time() .. " WHERE `id` = " .. tmp:getDataInt("id") tmp:free() db.executeQuery(query) doBroadcastMessage(getPlayerGuildName(cid) .. " has signed an armstice declaration on a war with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE) return true end doPlayerSendChannelMessage(cid, "", "Currently there's no active war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0) return true end Crie um arquivo chamado war.php na pasta do seu website: <?php $main_content = "<h1 align=\"center\">Guild Wars</h1> <script type=\"text/javascript\"><!-- function show_hide(flip) { var tmp = document.getElementById(flip); if(tmp) tmp.style.display = tmp.style.display == 'none' ? '' : 'none'; } --></script> <table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"4\"> <tr> <td style=\"background: " . $config['site']['vdarkborder'] . "\" class=\"white\" width=\"150\"><b>Aggressor</b></td> <td style=\"background: " . $config['site']['vdarkborder'] . "\" class=\"white\"><b>Information</b></td> <td style=\"background: " . $config['site']['vdarkborder'] . "\" class=\"white\" width=\"150\"><b>Enemy</b></td> </tr>"; $count = 0; foreach($SQL->query('SELECT * FROM `guild_wars` WHERE `status` IN (1,4) OR ((`end` >= (UNIX_TIMESTAMP() - 604800) OR `end` = 0) AND `status` IN (0,5));') as $war) { $a = $ots->createObject('Guild'); $a->load($war['guild_id']); if(!$a->isLoaded()) continue; $e = $ots->createObject('Guild'); $e->load($war['enemy_id']); if(!$e->isLoaded()) continue; $alogo = $a->getCustomField('logo_gfx_name'); if(empty($alogo) || !file_exists('guilds/' . $alogo)) $alogo = 'default_logo.gif'; $elogo = $e->getCustomField('logo_gfx_name'); if(empty($elogo) || !file_exists('guilds/' . $elogo)) $elogo = 'default_logo.gif'; $count++; $main_content .= "<tr style=\"background: " . (is_int($count / 2) ? $config['site']['darkborder'] : $config['site']['lightborder']) . ";\"> <td align=\"center\"><a href=\"?subtopic=guilds&action=show&guild=".$a->getId()."\"><img src=\"guilds/".$alogo."\" width=\"64\" height=\"64\" border=\"0\"/><br />".$a->getName()."</a></td> <td class=\"white\" align=\"center\">"; switch($war['status']) { case 0: { $main_content .= "<b>Pending acceptation</b><br />Invited on " . date("M d Y, H:i:s", $war['begin']) . " for " . ($war['end'] > 0 ? (($war['end'] - $war['begin']) / 86400) : "unspecified") . " days. The frag limit is set to " . $war['frags'] . " frags, " . ($war['payment'] > 0 ? "with payment of " . $war['payment'] . " bronze coins." : "without any payment.")."<br />Will expire in three days."; break; } case 3: { $main_content .= "<s>Canceled invitation</s><br />Sent invite on " . date("M d Y, H:i:s", $war['begin']) . ", canceled on " . date("M d Y, H:i:s", $war['end']) . "."; break; } case 2: { $main_content .= "Rejected invitation<br />Invited on " . date("M d Y, H:i:s", $war['begin']) . ", rejected on " . date("M d Y, H:i:s", $war['end']) . "."; break; } case 1: { $main_content .= "<font size=\"12\"><span style=\"color: red;\">" . $war['guild_kills'] . "</span> : <span style=\"color: lime;\">" . $war['enemy_kills'] . "</span></font><br /><br /><span style=\"color: darkred; font-weight: bold;\">On a brutal war</span><br />Began on " . date("M d Y, H:i:s", $war['begin']) . ($war['end'] > 0 ? ", will end up at " . date("M d Y, H:i:s", $war['end']) : "") . ".<br />The frag limit is set to " . $war['frags'] . " frags, " . ($war['payment'] > 0 ? "with payment of " . $war['payment'] . " bronze coins." : "without any payment."); break; } case 4: { $main_content .= "<font size=\"12\"><span style=\"color: red;\">" . $war['guild_kills'] . "</span> : <span style=\"color: lime;\">" . $war['enemy_kills'] . "</span></font><br /><br /><span style=\"color: darkred;\">Pending end</span><br />Began on " . date("M d Y, H:i:s", $war['begin']) . ", signed armstice on " . date("M d Y, H:i:s", $war['end']) . ".<br />Will expire after reaching " . $war['frags'] . " frags. ".($war['payment'] > 0 ? "The payment is set to " . $war['payment'] . " bronze coins." : "There's no payment set."); break; } case 5: { $main_content .= "<i>Ended</i><br />Began on " . date("M d Y, H:i:s", $war['begin']) . ", ended on " . date("M d Y, H:i:s", $war['end']) . ". Frag statistics: <span style=\"color: red;\">" . $war['guild_kills'] . "</span> to <span style=\"color: lime;\">" . $war['enemy_kills'] . "</span>."; break; } default: { $main_content .= "Unknown, please contact with gamemaster."; break; } } $main_content .= "<br /><br /><a onclick=\"show_hide('war-details:" . $war['id'] . "'); return false;\" style=\"cursor: pointer;\">&raquo; Details &laquo;</a></td> <td align=\"center\"><a href=\"?subtopic=guilds&action=show&guild=".$e->getId()."\"><img src=\"guilds/".$elogo."\" width=\"64\" height=\"64\" border=\"0\"/><br />".$e->getName()."</a></td> </tr> <tr id=\"war-details:" . $war['id'] . "\" style=\"display: none; background: " . (is_int($count / 2) ? $config['site']['darkborder'] : $config['site']['lightborder']) . ";\"> <td colspan=\"3\">"; if(in_array($war['status'], array(1,4,5))) { $deaths = $SQL->query('SELECT `pd`.`id`, `pd`.`date`, `gk`.`guild_id` AS `enemy`, `p`.`name`, `pd`.`level` FROM `guild_kills` gk LEFT JOIN `player_deaths` pd ON `gk`.`death_id` = `pd`.`id` LEFT JOIN `players` p ON `pd`.`player_id` = `p`.`id` WHERE `gk`.`war_id` = ' . $war['id'] . ' AND `p`.`deleted` = 0 ORDER BY `pd`.`date` DESC')->fetchAll(); if(!empty($deaths)) { foreach($deaths as $death) { $killers = $SQL->query('SELECT `p`.`name` AS `player_name`, `p`.`deleted` AS `player_exists`, `k`.`war` AS `is_war` FROM `killers` k LEFT JOIN `player_killers` pk ON `k`.`id` = `pk`.`kill_id` LEFT JOIN `players` p ON `p`.`id` = `pk`.`player_id` WHERE `k`.`death_id` = ' . $death['id'] . ' ORDER BY `k`.`final_hit` DESC, `k`.`id` ASC')->fetchAll(); $count = count($killers); $i = 0; $others = false; $main_content .= date("j M Y, H:i", $death['date']) . " <span style=\"font-weight: bold; color: " . ($death['enemy'] == $war['guild_id'] ? "red" : "lime") . ";\">+</span> <a href=\"/characters/" . urlencode($death['name']) . "\"><b>".$death['name']."</b></a> "; foreach($killers as $killer) { $i++; if($killer['is_war'] != 0) { if($i == 1) $main_content .= "killed at level <b>".$death['level']."</b> by "; else if($i == $count && $others == false) $main_content .= " and by "; else $main_content .= ", "; if($killer['player_exists'] == 0) $main_content .= "<a href=\"/characters/".urlencode($killer['player_name'])."\">"; $main_content .= $killer['player_name']; if($killer['player_exists'] == 0) $main_content .= "</a>"; } else $others = true; if($i == $count) { if($others == true) $main_content .= " and few others"; $main_content .= ".<br />"; } } } } else $main_content .= "<center>There were no frags on this war so far.</center>"; } else $main_content .= "<center>This war did not began yet.</center>"; $main_content .= "</td> </tr>"; } if($count == 0) $main_content .= "<tr style=\"background: ".$config['site']['darkborder'].";\"> <td colspan=\"3\">Currently there are no active wars.</td> </tr>"; $main_content .= "</table>"; ?> Para finalizar você precisa necessariamente que o seu distro (.exe) possua em sua compilação o parâmetro: -D__WAR_SYSTEM__ Como adiciono? Para adicionar é necessário ter a source do OTServ que você utiliza, abra a source em no dev-cpp aperte ALT+P na aba paraments adicione a tag -D__WAR_SYSTEM__ dá um OK e compila. Veja: Tutorial para compilação de um OTServ! Caso você seja um preguiçoso da bunda grande, baixe um server já compilado com o parâmetro clicando aqui. Aviso: Esse sistema só irá funcionar perfeitamente se seu servidor for MySql. Créditos Elf / otland Cakees Leaprotons Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  7. Erimyth postou uma resposta no tópico em Scripts tfs 0.4 (OLD)
    Cara, bem bacana a magia, mas acho que o melhor nome para ela seria Exevo Gran Mas Ice.
  8. Erimyth postou uma resposta no tópico em Portal
    Daqui alguns minutos eu entro... (;
  9. Erimyth postou uma resposta no tópico em Tibia Auto
    Bacana o tutorial cara, essa função é usado por muitos! Reputado!
  10. Bom, vim aqui trazer um MOD simples, porém muito útil, a função dele é destribuir o First Itens por vocação. Vá na pasta do seu servidor, abra a pasta mods e edite o arquivo "firstitems.xml" e substitua tudo por isto: <?xml version="1.0" encoding="UTF-8"?> <mod name="First Items" version="1.0" author="The Forgotten Server" contact="otland.net" enabled="yes"> <config name="firstitems_config"><![CDATA[ config = { storage = 30001, items = {2050, 2382} } ]]></config> <event type="login" name="FirstItems" event="script"> <![CDATA[ domodlib('firstitems_config') function onLogin(cid) local config = { voc_items = { { -- SORC {2190}, -- wand of vortex {2175}, -- spellbook {8820}, -- mage hat {8819} -- mage robe }, { -- DRUID {2182}, -- snakebite rod {2175}, -- spellbook {8820}, -- mage hat {8819} -- mage robe }, { -- PALADIN {2410}, -- throwing knife {2530}, -- copper shield {2480}, -- legion helmet {2464} -- chain armor }, { -- KNIGHT {2409}, -- serpent sword {2530}, -- copper shield {2480}, -- legion helmet {2464} -- chain armor } }, all_items = { {2468}, -- studded legs {2643} -- leather boots }, extra_items = { {2789, 15}, {2120}, {5710} }, knight_weapons = { {2423}, -- clerical mace {2429} -- barbarian axe } } if getPlayerGroupId(cid) < 3 then if getPlayerStorageValue(cid, storage) == -1 then local common = config.voc_items[getPlayerVocation(cid)] if common ~= nil then for _, v in ipairs(common) do doPlayerAddItem(cid, v[1], v[2] or 1) end end local all = config.all_items if all ~= nil then for _, v in ipairs(all) do doPlayerAddItem(cid, v[1], v[2] or 1) end end local extra = config.extra_items local bp = doPlayerAddItem(cid, 1988, 1) if extra ~= nil then for _, v in ipairs(extra) do doAddContainerItem(bp, v[1], v[2] or 1) end end local weapons = config.knight_weapons if weapons ~= nil then for _, w in ipairs(weapons) do if isKnight(cid) then doAddContainerItem(bp, w[1], w[2] or 1) end end end setPlayerStorageValue(cid, storage, 1) end end return true end ]]></event> </mod> Créditos: Collz JDB Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  11. Se o seu site for através da porta 80, para entrar-lo nele bote apenas o seu IP. Exemplo: http://seuserver.servegame.com Não faça posts duplos, leia as regras. E pare de tirar dúvidas sobre isso aqui neste tópico, se quiser tirar dúvidas que não seja sobre esse tutorial em vídeo abra um tópico no fórum de suporte!
  12. Cara se sua internet for compartilhada já outros 500. Você terá que desbloquear as portas 7171 e 7172 do seu modem, terá que desbloquear o firewalll, e sempre terá que atualizar seu IP Fixo. Como eu disse, esse tutorial é apenas para quem contém internet descompartilhada!
  13. Dúvidas? Poste-as aqui! Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  14. Erimyth postou uma resposta no tópico em Playground (Off-topic)
    Rave Host é uma boa empresa de hospedagem, já tive um servidor dedicado lá e não me arrependo. Porém eu prefiro a onservers.com.br
  15. Erimyth postou uma resposta no tópico em Tutoriais Websites
    Bacana o vídeo, mas ficaria mais legal se ouve-se um som, até mesmo um fundo musical... Hum, você poderia upar-lo no youtube, vimeo, ou qualquer outro site de midia e botar-lo aqui no TK, né?! Reputado!
  16. Fabiano, leia as regras do fórum, não é permitido realizar posts duplos, fica aqui um aviso, dá próxima você poderá ser punido. Esse script funciona no TFS 0.4!
  17. Cara, bacana a função do NPC, bem útil... Reputado!
  18. Erimyth postou uma resposta no tópico em GlobalEvents, CreatureScripts & Weapons
    Fala galera, a um tempo atrás vi um membro pedir este script aqui no TK, então resolvi trazer-lo. Este script proibirá o acesso de muitos IPs iguais em seu servidor! Adicione uma tag em data > creaturescripts > creaturescripts.xml: <event type="login" name="AntiMC" event="script" value="antimc.lua"/> Crie um arquivo chamado antimc.lua em data > creaturescripts > scripts: local config = { max = 1, -- Número de players permitido com o mesmo IP. group_id = 1 -- Kikar apenas player com o group id 1. } local accepted_ip_list = {} -- Lista dos players permitidos a usar MC, exemplo: {"200.85.3.60", "201.36.5.222"} local function antiMC(p) if #getPlayersByIp(getPlayerIp(p.pid)) >= p.max then doRemoveCreature(p.pid) end return true end function onLogin(cid) if getPlayerGroupId(cid) <= config.group_id then if isInArray(accepted_ip_list,doConvertIntegerToIp(getPlayerIp(cid))) == false then addEvent(antiMC, 1000, {pid = cid, max = config.max+1}) end end return true end O único problema é que vai kikar os players de lan house, ai você coloca o max de 20 IPs. Créditos: Shawak Cykotitan Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
  19. Erimyth postou uma resposta no tópico em Outros Bots
    Fala galera, o FlmR Auto é um simples bot, porém ele é muito útil e é completamente indetectável pois simula o movimento do mouse e do teclado. Veja algumas funções abaixo: Auto Trainer: Treina com Slime Auto Mana: Recarrega a mana assim como o Auto Heal. Spell Caster: Usa uma magia determinada com uma quantidade de mana. Auto Heal: Com 3 opções de "healar", com prioridades definidas. Food Eater: Come em intervalos de tempo regulares. Bug Reporter: Reporta possíveis Bugs no flmR Auto. Auto Haste: Utiliza magias de haste sucessivamente após o seu término. Anti-Idle: Não deixa seu personagem deslogar após 15 minutos AFK. E muito mais... Como ativar no primeiro uso: 1. Para instalação do flmR Auto é necessário a instalação do Microsoft .NET Framework 4.0. 2. Abra o Tibia e depois o flmR Auto. 3. Agora você precisa validar o seu flmR Auto. Clique em Copy to clipboard and go to Activation Page. 4. Nessa página você deve colocar o seu código "Your Random Unique ID" e clicar em "Go". 5. Será gerado um código que você deve colocar em Activation ID, logo depois disso clique em Run flameR Auto. Download FlmR Auto 9.31 Scan do Arquivo Créditos: flmR.net
  20. Erimyth postou uma resposta no tópico em Portal
    Fala galerinha do TK, Então, vim hoje aqui dar alguns breve esclarecimentos sobre algumas mudanças que ocorreram no fórum durante essa última semana, chega de papo né, vamos logo ao que interessa! Nesta semana, dois novos membros se integraram à nossa equipe, o e o Doughell, dois ótimos scripters que agora fazem parte do grupo de Cavaleiros do fórum. Também corrigimos diversos bugs no fórum, o editor de texto foi revisado, a pagina de cadastro foi reformulada e outros bugs de segurança foram arrumados. Foi adicionado na sidebar do fórum e do portal widget do Facebook e do Twitter, siga-nos, curta-nos! A mudança mais significativa desta semana, com certeza foi as mudanças no portal, reformulamos o visual do portal e agora ele está mais bonito e funcional. Bom, por enquanto é isso, espero que tenham gostado! E em breve mais novidades...
  21. Erimyth postou uma resposta no tópico em Outros Bots
    Nova versão do RedBot lançada, foram feitas mudanças no Cavebot, Targeting e Looting, e também foram arrumados bugs do Targeting usando a magia em momentos indevidos e o bug da cap, que era quando o bot ficava tentando puxar os items quando não era possível. Para quem não sabe o RedBot é indetectável pois simula o uso do teclado e do mouse. Algumas funções do RedBot: Cave Bot super avançado com sistemas de deposit gold, npc trader, salvamento de waypoints, e etc; Targeting avançado com ataque na diagonal, outros modos de ataque, e etc; Looting; Auto Haste; Auto Mana Shield (Utamo Vita); Anti-Paralyze; Food Eater; Mana Trainer; Mana Restore Avançado; Healer; Anti Idle; Auto Fishing e muito mais. Download RedBot 9.31 (v4.4) Scan do Arquivo Microsoft .NET Framework 3.5 (necessário para rodar o RedBot - link direto da Microsoft) [NEW] Dicas para melhor desempenho do RedBot: Coloque o FPS (framerate) do Tibia no máximo, para isso vá em Options > Graphics > Advanced e coloque a barrinha no máximo. Coloque a prioridade do RedBot em Tempo Real, para isso vá no gerenciador de tarefas do windows, procure o processo RedBot.exe, clique com botão direito, vá na opção prioridade e seleciona Tempo Real. Galerinha, eu recomendo este bot!
  22. Erimyth postou uma resposta no tópico em Playground (Off-topic)
    SÁBAADO NA BALADA...
  23. Erimyth postou uma resposta no tópico em Suporte & Pedidos
    Caralho, só tem mapas fodões, bem bacanas mesmo! Para ser mapper você DEVE ser bem criativo e com muito bom gosto, se não, não dá certo.
  24. Erimyth postou uma resposta no tópico em Monsters, NPC, Raids & Mounts
    Eu não quero ver mais discussão. Se continuar essa baboseira aqui eu vou sair punindo todos os envolvidos!
  25. Fala galerinha, eu fiz esse script à muito tempo, na época que eu tinha um servidor online, é um script bem simples, mas tem um função bem interessante: proibir palavrões, por isso resolvi trazer-lo até o TK. Bom, primeiramente já até a pasta data/talkaction, abra o arquivo talkactions.xml e adicione esta tag: <talkaction words="porra;caralho;cu;merda;buceta" event="script" value="proibido.lua"> Repare que você pode adicionar os palavrões que você quiser, basta botar ; entre eles... Agora vá até a pasta scripts dentro da pasta talkaction, faça um script chamado proibido.lua e coloque isso dentro: -- Proibir palavrões by Talkaction -- Author: Matheus Sesso -- Url: www.tibiaking.com function onSay(cid, words, param) local time = 10 -- Tempo que ele ficará com outra outfit e muted! (em segundos) local life = 15 -- Quantidade de vida que o player perderá! doSendAnimatedText(getPlayerPosition(cid), "#$#%##%", 19) doPlayerSendTextMessage(cid, 23, "Now you are muted and with other outfit for "..time.." seconds!") doCreatureAddHealth(cid, -life) doSetMonsterOutfit(cid, "Bug", time*1000) doMutePlayer(cid, time*1000) return TRUE end É isso ai, até mais! Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!

Informação Importante

Confirmação de Termo