Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 09/02/12 em todas áreas

  1. @PkNfan LOL LOL LOL LOL como q eu nunca vi isso? LOL uahuah vlw ae ms.. kkk @pedrowarlock oia.. da... ate da... mais muitos scripts estao programados para verificar a bag no slot 3... entao se tu mudar de lugar tera q achar TODOS os scripts q fazem essa verificaçao e trocar para o novo slot... isso vai da um trampo lgl e tb tem muitaaaaaa change de bugar geral... ;x anyway, o script q da os itens iniciais eh o data/mods/firstitems.xml... good luck ae... ;x @EDIT como prometido postei o atualizaçao 1.6/2.6! como essa vai ser a ultima atualizaçao por um bom tempo, postei a versao 1.6/2.6 full tb para ajudar quem começar a usar meu serv agora minhas aulas começam amanha, entao vo passar menos tempo olhando o forum, mas ainda ajudarei noq puder, e caso apareça algum bug novo e importante eu postarei algum patch de correçao tb... espero q gostem dos novos sistemas e q continuem a reportar bugs! ^^ --nao esqueçam de olhar o change log!!
    3 pontos
  2. Slicer

    [Pokemon] Pda By Slicer 1.9/2.9

    [Pokemon] PDA By Slicer Pokemon dash advanced editado por slicer, vários bugs retidos. Projeto encerrado! Espero que todos tenham gostado desse 1 ano de trabalho duro! Todas as atualizações: * Leiam e sigam as instruções do Change Log dentro da pasta do patch! Downlaods: PDA By Slicer With Level System v2.9 Full -> http://www.mediafire...z2afuu75zblvmvq PDA By Slicer Without Level System v1.9 Full -> http://www.mediafire...td0l0ip9ajprrbf OTClient editado 2.8/1.8 => http://www.mediafire...1lcbs1fktpm676w Atualizações: EH OBRIGATORIO O USO DESSE CLIENT ABAIXO E USEM O .PIC TB!!!!!!!!! Client v1.9/2.9 => http://www.mediafire...77i414v1hy187fj Patch v1.9 => http://www.mediafire...da4umj3ip18jrf1 Patch v2.9 => http://www.mediafire...7nt275td9afl1fy Patch v1.9.1 => http://www.mediafire.com/?i3flwa3lrd016zl Patch v2.9.1 => http://www.mediafire.com/?m4zhjgn62uow1sp Obs: Atualizaçoes mais antigas estao dentro do spoiler acima!! OTAL.DLL: OBS: caso n esteja aparecendo a barra de moves no client normal do tibia, baixem essa .dll e coloquem na pasta onde fica o Pokemon_nibe.exe ... Otal.rar Patch Correçao! Todos olhem! Bugs na nova atualizaçao? Olhe o spoiler e veja se arruma o problema! Atualizado: 08/02/13 Créditos: Otal.rar
    2 pontos
  3. Vou postar o tão famoso Guild War System Com Escudos. Vou começar pelo site : Vá em Xampp/Htdocs e crie e um arquivo chamado wars.php,dentro add isto: <?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> <a onclick=\"show_hide('information'); return false;\" style=\"cursor: pointer;\"><h1><center>» Click to se the commands «<center></h1></a> <table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"4\" id=\"information\" style=\"display: none;\";> <tr align=\"center\"><b>You must send this commands in GUILD CHAT.</tr> <tr style=\"background: #512e0b;\"><td align=\"center\" class=\"white\"><b>Command</b></td><td colspan=\"2\" align=\"center\" class=\"white\"><b>Description</b></td></tr> <tr style=\"background: #F1E0C6;\"><td><b>/war invite, guild name, fraglimit</b></td><td>Sends an invitation to start the war. Example: <font color=red><BR>/war invite, Chickens, 150<BR></font><B>(Invite a guild to war with 150 frags count.)</B></td></tr> <tr style=\"background: #D4C0A1;\"><td><b>/war invite, guild name, fraglimit, money</b></td><td>Send the invitation to start the war. Example: <font color=red><BR>/war invite, Chickens, 150, 10000</font><br><B> (Invite a guild to war with 150 frags count and payment of 10000 gold coins <- you need donate to guild to use it.)<B></td></tr> <tr style=\"background: #F1E0C6;\"><td><b>/war accept, guild name</b></td><td>Accepts the invitation to start a war. Example: <font color=red><BR>/war accept, Chickens</font><BR><B>(Accept the war against guild \"Chickens\".)</b></td></tr> <tr style=\"background: #D4C0A1;\"><td><b>/war reject, guild name</b></td><td>Rejects the invitation to start a war. Example: <font color=red><BR>/war reject, Chickens</font><BR><B>(Reject a invitation to war from Chickens.)</B></td></tr> <tr style=\"background: #F1E0C6;\"><td><b>/war cancel, guild name</b></td><td>Cancels the invitation. Example: <font color=red><BR>/war cancel, Chickens</font><br><b>(Cancel my guild invitation to war with Chickens.)</b></td></tr> <tr style=\"background: #D4C0A1;\"><td><b>/balance</b></td><td>See the guild balance - balance of money.</td></tr> <tr style=\"background: #F1E0C6;\"><td><b>/balance donate value</b></td><td>Deposits money on the guild's bank account. All players can donate. Example: <font color=red><BR>/balance donate 100000 </font><BR><B>(You will donate 100k to your guild balance.)</B></td></tr> <tr style=\"background: #D4C0A1;\"><td><b>/balance pick value</b></td><td>Withdraws money from the guild's bank account. Can be used only by the guild leader. Example: <font color=red><BR>/balance pick 100000 </font><BR><B>(You will withdraw 100k from your guild balance.)</B></td></tr> </table> <table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"4\"> <tr> <td style=\"background: #512e0b\" class=\"white\" width=\"150\"><b>Aggressor</b></td> <td style=\"background: #512e0b\" class=\"white\"><b>Information</b></td> <td style=\"background: #512e0b\" class=\"white\" width=\"150\"><b>Enemy</b></td> </tr><tr style=\"background: #F1E0C6;\">"; $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 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=\"6\"><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=\"6\"><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;\">» Details «</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=\"index.php?subtopic=characters&name=" . 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=\"index.php?subtopic=characters&name=".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>"; $main_content .= '<div align="right"><small><b>Customized by: <a href="http://www.xtibia.com/forum/user/240289-walef-xavier">Walef Xavier</a></b></small></div><br />'; ?> Agora vá em Xampp/Htdocs/index.php e add o seguinte: case "wars"; $subtopic = "wars"; $topic = "Guild Wars"; include("wars.php"); break; Agora para finalizar a parte do site vá em Xampp/Htdocs/Layout/Tibiacom/layout.php e add o seguinte: <a href='?subtopic=wars'> <div id='submenu_wars' 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_polls' class='ActiveSubmenuItemIcon' style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'><font color=red>Guild Wars</font></div> <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> </div> </a> Agora vamos para seu Ot: Va em GlobalEvents/scripts/start.lua e add o seguinte: 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 vá em Lib e crie um arquivo .lua chamado 101-war,dentro add o seguinte: WAR_GUILD = 0 WAR_ENEMY = 1 Agora para finalizar vamos colocar os comandos em Talkactions ! Vá em Talkactions/scripts e crie dois arquivos chamados war.lua e balance.lua,dentro add o seguinte: War.lua function onSay(cid, words, param, channel) local guild = getPlayerGuildId(cid) 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.query("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.query(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.query("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.query("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.query(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.query(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 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.query('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.query('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 Agora vá em Talkactions/talkactions.xml e add as duas tags: <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."/> Pronto,seu Guild War Systema está instalado...mas para funcionar necessitará das tabelas na sua database e do Tfs 0.4 .Vou posta-los abaixo,respectivamente. . Tabelas . Para quem ainda não sabe add tabelas a sua database,vou ensinar: Acesse seu phpmyadmin,digite sua senha (caso tenha),clique no nome da sua database a esquerda,assim que carregar a sua database clique em SQL lá em cima...Aparecerá um espaço em branco lá voce irá add as seguintes tabelas...e depois clicar em Executar. 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; Pronto o Guild Wars System está totalmente instalado...falta apenas o Tfs 0.4 ! O meu The Forggoten Server 0.4 também comprei do mesmo cara que me vendeu o GWS,tenho um também que comprei na ChaitoSoft,mais conversei com eles por Msn e não permitirão que eu postasse pra ninguem,rsrs. Então vou postar o link do download e o scan: TFS 0.4 DEV Scan Ai está a DEV.... Também será necessario usar o items.xml e items.otb , a não ser que o que vc tenha seja compativel com o distro. Item.xml e otb Scan Obs: Este distro não carrega scripts que tenha a função "dbExecute.query",sempre que tiver mude para "db.query" .Todo o script ja está configurado para funcionar assim,não se preucupe. Só isso,obrigado a todos...que Deus Abençoe voces sempre !
    1 ponto
  4. 1 ponto
  5. danilo13

    Up Level Thais

    Bem hoje eu trago Thais um servidor de mapas ... Cujo servidor tem o seguinte: Sistema Casino ... Formadores Sistema Sqm ... Sistema Vip .. versão 8.60 Alguns outros .. Aki deixo algumas fotos! Casino: Depot: Hunts: Templo: Link De Descarga: http://www.speedyshare.com/files/26813155/new_server.rar Scan: http://www.virustotal.com/file-scan/report.html?id=4eeb7d5a90877570bd42e6636a6a1728cac67ab4e621b33921fc1fa602a11c50-1297644158 Okei Isso é tudo, se você gosta .. E você fez o download Por favor me dê Rep + + :button_ok:
    1 ponto
  6. gleison157

    Baiak Supreme V7.5 [8.6]

    TOPICO ATUALIZADO Supreme Baiak v7.5 editado (Apropriado para exp alta) Supreme Baiak editadao, novos itens, monstros,comandos e mapa editado. Novos Itens (vips) Milenio Helmet Milenio Armor Milenio Legs Milenio Boots Milenio Shield Milenio Axe Novas Vocations 1-Mixed Assassin 2-Spin Assassin 3-Sacred Martyr 4-Loney Star 5-Falling Star 6-Hellborn Deathdriver 7-Supreme Hellborn King 8-Apocalypse Deathbringer 9-Nova Hero 10-Addicted Zealot Para saber como resetar e ganhar a vocation nova basta escrever !promoinfo que mostrara todas informaçoes de como resetar. Para corrigir erros das vocation basta estra nesse meu post e fazer oq eu falo: http://www.xtibia.com/forum/topic/191478-reset-que-ganha-vocation/page__fromsearch__1 Novos Monstros Icyd Tripyd The Halloween Hare SuperNova e muito mais Novas Spells 4 VIP CITY's com tp novos quest's novas em cada vip e itens editados para cada vip E muito mais... Se quizer saber oq mais tem no mapa basta baixar e explorar TEMPLO HUNT's NOVAS ITENS EDITADO VIP CITY 1 VIP CITY 2 VIP CITY 3 VIP CITY 4 Creditos: Linnux Jhosef Gleison DOWNLOAD SCAN ESSE É MEU PRIMEIRO POST SE TIVER ALGO ERRADO ME AVISEM BUG's no mapa post aki que tentarei resolver o mais rapido possivel OBG Gostou !!! Dá um ai ^^
    1 ponto
  7. TheSlayer

    Baiak Slayer V1.8 By Theslayer

    Olá pessoal vim aque trazer o mais novo baiak do BaiakSlayer e esta muito bom na minha opinião,vesão 8.60 95% dos bugs resolvido e pronto para botar on line. :Quests: Anihi Poi Demon Oak Mpa Quest Inquisition Entre Outras... :Abaixo irei postar umas screenshots: :Templo Free: :Templo Vip: :Continente Free: :Npcs: :Trainers Free: :Trainers Vip: :Teleports Vip: :Teleports Vip 2: :Teleports Free: :Dead City: :Download(MediaFire): http://www.mediafire...tjojmvdynyoh4a1 :Scan: https://www.virustot...sis/1343951971/ (Os virús que estao acusando no scan são inofensivos) Se vcs puderem dar um rep+ obrigado. :Créditos: (TheSlayer)Pela edição (Bryaan) Pelo Mapa Base
    1 ponto
  8. Eu gostaria de compartilhar com vocês como é interessante que Atlantida World servidor. Ao mesmo tempo o projeto nasce de um grande OTS . Atlantyda World tratou-se um super server que pertencia a uma equipa polaca, tive o prazer de jogar nele, mas ao final de algum tempo fechou. O server esteve online varios meses, no entanto, alguém nao se apercebeu que as más escolhas da administração resultou em uma grande queda. Pack Full contém literalmente tudo para gozar as suas Atlântida! Mapa, scripts, actions, monters,etc! O importante é tudo isso vem de uma fonte legal como era na administração.Pessoalmente, eu não tenho tempo para abrir de novo este OTS por isso quis compartilhar com vocês tudo o que qualquer um de vocês pode reconstruir o que foi acima no fumo! Esta imagem é reduzida. Clique nesta barra para ver a imagem completa. Imagem original: 2202x1392. Esta imagem é reduzida. Clique nesta barra para ver a imagem completa. Imagem original: 801x586. Esta imagem é reduzida. Clique nesta barra para ver a imagem completa. Imagem original: 801x586. Esta imagem é reduzida. Clique nesta barra para ver a imagem completa. Imagem original: 801x586. Esta imagem é reduzida. Clique nesta barra para ver a imagem completa. Imagem original: 801x586. Download ou Download ​ Vírus Total Depois de vários pedidos decidi colocar um executável compactivel com windows, mas aconselho a configurar os vossos itens aconselho a utilização de rook para um maior rpg, bom jogo não esqueçam de um comentário e do REP+. Download Com exe e dlls Se tiver alguma dificuldade reporte-me, server configurado para ligar um mysql.
    1 ponto
  9. Tryller

    Tryller's Ip Changer - V1.6

    Tryller's IP Changer Tryller's IP Changer é um aplicativo para substituir o host no TibiaClient. Ele foi desenvolvido em C++, dispenssando a instalação de qualquer outro programa para roda-lo. Isto funciona com os protocolos 7.4, 7.5, 7.6, , 7.2. 7.8, , 7.81, 7.9, 7.92, 8.0, 8.1, 8.11, 8.20, 8.21, 8.22, 8.3, 8.31, 8.4, 8.41, 8.42, 8.5, 8.52, 8.54, 8.55, 8.56, 8.57, 8.6, 8.61, 8.62, 8.7, 8.71, 8.72, 8.73, 8.74, 9.0, 9.1, 9.2, 9.31, 9.4, 9.41, 9.42, 9.43, 9.44, 9.45, 9.46, , 9.51, 9.52, 9.53, 9.54 e 9.6 Imagens: ChangeLog Versão 1.6 Suporte para 9.6 Versão 1.4 Suporte para 9.54 Versão 1.2 Suporte para Tibia 9.51, 9.52 e 9.53 Corrigido alguns erros na leitura da memória do ipchanger. Versão 1.1 Suporte para Tibia 9.50. Removido "Informations" problemas devem ser corrigidos antes. Corrigido erro que causava uso extremo de memoria. Refeito estrutura GUI Versão 1.0 Suporte para todas as versões do Tibia. Salva a lista de ip's, para isto você deve ir até IP List e adiciona-lo. Suporte para Multi Client. Informações sobre os servidores. Agora o IP Changer pisca a tela do Tibia e Altera o Titulo quando troca IP. Arquivos para atualizar comparando com a versão anterior. IPChanger.exe files/Addresses.xml Download: http://www.mediafire...u1906jr1xsahghn
    1 ponto
  10. Ola Pessual Lindo Do Xtibia... Bom, Um Tutorial De Como Fazer outfits... Vamos Ao Tutorial: Bem, primeiro, o mais básico de tudo: abra uma imagem 32x32. Depois, arranje a cabeça de um outfit de citizen de frente, e cole na imagem. Após posiciona-la no extremo noroeste do quadrado, faça uma base. Tente copiar de um outro outfit, para você ir "pegando a manha". Não presisa caprichar muito, pois é só um esboço. Após ter a base pronta, começe os detalhes. Depois, passe linhas pretas no contorno e defina as linhas internas num tom cinza escuro. Pinte os espaços em branco num tom cinza claro e o outfit estara pronto. Se você quizer fazer um outfit pra mudar de cor depois, mantenha as cores cinzas, se não, decida a cor agora. Após sombreado, repita o processo com o personagem de costas. Caso queira fazer o outfit andando, pegue o outfit do personagem parado(antes de sombrea-lo) e mude a posição de suas mãos, pernas e tronco, afim de fazer com que ele pareça estar andando Resultado final: Lembrem-se de fazerem calmamente, atentos a cada detalhe, evitando de deixar um sombreamento artificial e um formato quadrado. Aviso: Se forem fazer algo na cabeça dele, não esitem em aumentar o quadrado do outfit. Aviso2: Lembrem sempre de alinhar os braços e os ombros.
    1 ponto
  11. Juntando um mapa ao outro no RME Abra o RME com o mapa que você quer copiar, após isso vá em File/Open e procure o mapa em que você quer colar outro. E então ficara os dois no mesmo RME, só que em abas diferentes: Feito isso vá no mapa que você quer copiar, no canto terá um quadradinho, clique nele, o mesmo vai virar um lápis; Continue no mapa que deseja copiar, e então segura shift e arraste o mouse por cima da área que você quer copiar, ele ficará escuro após selecionar como na foto abaixo: Depois é só apertar ctrl + v no mapa que você quer colar.
    1 ponto
  12. SmiX

    Facebook System

    Olá gentalhas, hoje venho aqui para postar um sistema bem legal para ots de ( Tibia, Pokemon e outros ), Chamado facebook system, criado por Eu(SmiX), ele vai com funções para quest que podem ser eleboradas por vocês mesmos e outros utilitarios. Vamos deixar de delongas e vamos ao ponto... Em data/actions/scripts vamos criar um arquivo .lua chamado faceSystem.lua e vamos colar o código a baixo dentro: Agora vamos em actions.XML e vamos colar a seguinte tag nele: <action itemid="Aqui o id do item que vai ser usado para dar CURTIR em outro player" event="script" value="faceSystem.lua"/> Lembrando que o item que vai ser usado tem que ter o atributo “Usable”. Agora vamos na pasta lib/ e criaremos um arquivo .lua chamado faceSystem.lua e dentro cole o código a baixo: Caso queira fazer uma quest com certo número de curtir coloque a linha no seu script; getPlayerCurtir(cid, curtir, msg) Em curtir você coloca a quantidade que o player tem que ter pra pode fazer e em msg você coloca a mensagem que vai dar caso o player não tenha essa quantidade de curtir. Pronto o system já está funcionando, agora vou postar um facelook pra quem quiser. Só não faço um rank curtir porque nunca fiz um script de rank e estou sem tempo. OBSs: Não ajudo em correções de erros de intalação do system. Aqui funciona perfeitamente ai também tem que funcionar... Obrigado pela atenção e tchau.
    1 ponto
  13. Stigal

    [Pokemon]Pvp Zone

    Ola Xtibianos, Venho Postar Minha Pvp Zone! Obs: Tem Que Editar Possiçao Do Teleport , Para Ir Para City Principal Do Seu Mapa! Imagen's: Espero Que Gostem Da Minha Pvp Zone! Fis Com Muita Dedicaçao a Voces! Se Gostou De REP+ :XTibia_smile:
    1 ponto
  14. SkyLigh

    Add Premium Por Talk E Action

    Iae galera !! hoje trago um script muito interessante adicionar premium por action ao dar use num item e comprar o item por 1 buyitem então vamos la va em data / talkactions / scripts / e ponha o nome de algum arquivo para premium e ponha isto la dentro function onSay(cid, words, param) local itens = { ["santa doll"] = {id = 6567, preco = 2000, count = 1 }, ["teddy bear"] = {id = 6568, preco = 1000, count = 1 }, ["jester doll"] = {id = 9663, preco = 500, count = 1 } } local param = string.lower(param) if (param == "lista") then local str = "" str = str .. "itens :\n\n" for name, preco in pairs(itens) do str = str..name.."\n" end str = str .. "" doShowTextDialog(cid, 7529, str) return TRUE end if not itens[param] or param == "" or not param then return doPlayerSendCancel(cid,"Desculpe esse item nao existe") end if itens[param] and doPlayerRemoveMoney(cid,itens[param].preco) then doPlayerAddItem(cid,itens[param].id,itens[param].count) doPlayerSendTextMessage(cid,27,"Parabéns Vc comprou 1 item") end return TRUE end <talkaction words="!buy" event="script" value="itens.lua"/> dps em data / actions / scripts / ponha o nome de algum arquivo de premium e adicionar isto la dentro --((Script By Skylight Xtibia.com))-- function onUse(cid, item) if doRemoveItem(item.uid, 1) then end if item.itemid == 6567 then doPlayerAddPremiumDays(cid, 30) doPlayerSendTextMessage(cid, 22, "Parabéns Você Recebeu 30 dias de premium") return true end if item.itemid == 6568 then doPlayerAddPremiumDays(cid, 30) doPlayerSendTextMessage(cid, 22, "Parabéns Você Recebeu 15 dias de premium") return true end if item.itemid == 9693 then doPlayerAddPremiumDays(cid, 30) doPlayerSendTextMessage(cid, 22, "Parabéns Você Recebeu 10 dias de premium") end return true end dps em actions.xml <action itemid="6567" script="premium.lua"/> <action itemid="6568" script="premium.lua"/> <action itemid="9693" script="premium.lua"/> Então e so isso espero que gostem e se puder nao custara 1 rep + Créditos TnTSlin 30 %(Pelo script do buy) SkyLigh 70 % (Pelo Script Do Action E A Ideia E Adicionar A Lista no script do buy)
    1 ponto
  15. Newtonnotwen

    [Spell] Tsukuyomi!

    Aew galera, aqui está a magia Tsukuyomi, aquela mesmo do Naruto. Testado em TSF 8.6. Primeiramente abra seu RME. Faça uma areá mais ou menos igual a seguinte (os tiles podem mudar de acordo com seu gosto): No caso estou usando um chão "invisível". Após criar essa areá adicione "NoPVPZone" (em toda areá). Depois adicione o "NoLogout" (em toda areá). Em data/movements/script crie um arquivo.lua nomeie para sharingan e adicione: Editando: -Verde: Numero do efeito (/z) -Azul: Life que vai perder -Laranja: Intervalo para tirar life (1000 = 1 segundo) -Roxo: Quantidade de vezes que vai bater Em movements.xml adicione: Em data/talkactions/scripts crie um arquivo.lua nomeie para tsukuyomi e adicione: Editando: ​Script auto-explicativo, variáveis em verde. Sobre as cordenadas: Para onde o teleport levará (players): Seria o tile em que os player atingidos pelo Tsukuyomi seria levados: Areá circulada em azul. Para onde o teleport levará (caster): Seria o tile, onde quem usou a magia (o caster) irá teleportar. Toda a areá em verde! Obs: O tile com um x não pode ser escolhido. Ponta de cima na esquerda na area que o tp leva (onde o tile está escuro): Ponta de baixo na direita na area que o tp leva (onde o tile está escuro): Em talkactions.xml adicine: <talkaction words="tsukuyomi" event="script" value="tsukuyomi.lua"/> Após fazer isso adicione o tile de movements no tile em que os players irão teleportar ao serem atingidos. Adicionando efeitos, nesse local: Em data/globalevents/scripts crie um arquivo.lua nomeie para sharingan e adicione: Editando: - Verde: Posição - Vermelho: Mensagem e cor - Azul: efeito Em globalevents.xml: Editando: - Vermelho: Tempo para aparecer os efeitos (1 = 1 segundo), podendo deixar 0.1 Qualquer duvida, só postar. Aqui vai um vídeo demonstrativo (o vídeo está mostrando a magia sem efeitos bons e com um lugar totalmente preto, isso depende de sua imaginação, só quis fazer o vídeo para verem como funciona): Magia com efeitos diferentes e com mais tempo: ​Créditos: Newtonnotwen, pelo script, pela ideia e pelo post. LuckOake, pelo script inicial Vodkart, pelo tile Jhon992, pelo tile Por favor comentem, se tiver mal explicado eu edito.
    1 ponto
  16. caotic

    Lua Demo

    Demo Lua demo e um debugger LUA nele e possivel verificar possiveis erros em seus scripts. Alem de ser pratico ele e online ou seja poder ser ultilizado pelo seu navegador. Criado pelo site oficial de LUA e uma otima opção para debugger. Eu recomendo pois ultilizo o lua demo e mais pratico e mais rapido. Interface A interface do LUA Demo e bem simples. Existe dois campos na sua pagina a primeira deve ser colocada o script e a segunda e Output onde mostra os erros do seus scripts. Não existe muita beleza em sua pagina mais e bem simples facilitando o acesso a pagina. Informações As informações são o que estão causando erros no scripts. As informaçôes dos erros aparecem no Output. Alem de que em baixo do Output e exibido a mensagem de failed(falha). Capacidade O lua demo suporta grandes scripts e os testa de forma agil. Mais ele apresenta um limite de caracteres. Seu limite de caracter não prejudica ja que ele tem um suporte muito grande a quantidade de caracterers. Funções Lua demo apresenta alguns botões com funçôes para seu funcionamento tais como: Run(Ok) = Este botão serve para começar o debugger. Clear(Apaga) = Apaga o scripts Restore(Restaurar) = Restaura o scripts Restart = Da um restart no campo. Para acessar o LUA Demo clique abaixo Lua Demo Mais informaçoes. http://www.lua.org/ (Conheça tambem o Scite)
    1 ponto
  17. brun123

    Erro Com "remove Item"

    Na vodkart, pode colocar até t.uid > 50000 que vai funcionar, pois os unique ids que são atribuídos aos itens podem no mínimo ter valor 70.000. A menos que você use doItemSetAttribute(itemUid, "uid", xxxx) ou então modifique seu UID pelo map editor, ele não pode ter valor menor que 70k. Caso editado manualmente, via map editor ou scripts, seu valor pode variar de 1000 até 65536, algum número assim... Colocar > 0 ou > 1 não faz diferença mesmo. Quando se usa a função getTileItemById e não encontra nenhum item, retorna uma tabela assim: {uid = 0, itemid = 0}, algo do tipo... Se você tentar remover o item cujo uid é 0 (item não existente), vai aparecer esse erro que o item não foi encontrado. Por isso checa-se antes de o uid do item é maior que 0 ou 1 (tanto faz), pois dessa forma o item certamente irá existir e não tem como possivelmente dar erros. Lolksky, eu testei a script aqui e não deu nenhum erro... Vou analisar aqui de novo e ver se consigo descobrir algo...
    1 ponto
  18. Skymagnum

    Efeitos..

    Huehe ele deixo a tag onAdvance envez de onLogin so mudar
    1 ponto
  19. caotic

    Tabelas

    Tabelas são estruturas de facil edição e são ultilizadas para diminuição e simplificação de um script lua. Muitos pessoas tem duvidas sobre elas vamos resolver todas elas: <-------------------------------------------------------------------------------------------------------------------------------------------------------------> Vamos ver uma tabela vazia. Para adicionar um valor na tab usamos table.insert Para ver a quantidade de valores na tabela usamos #tab print(#tab) que retornaria 0 ja que não existe nenhum valor na tabela Outros exemplo e usar a estrutura for para a repetição dos valores na tabelas. <-------------------------------------------------------------------------------------------------------------------------------------------------------------> Considere outra tabela Esta tabela apresenta as seguintes string(rad e leg) Sendo Para acessar o valor delas podemos defenir sua posição por numeros crescentes. Logo podemos fazer assim: print(tab[1]) Que retornaria rad ou print(tab[2) Que retornaria leg <-------------------------------------------------------------------------------------------------------------------------------------------------------------> Vamos agora em uma estrutura mais complexa. local transf = { ["Morte"] = {level = 1, type = "(Dark)", health = 2222, addlevel = 10, looktype = 300, spell = exori, addmana = 2000}, ["Demon"] = {level = 1, type = "(Demonio)", health = 22622, addlevel = 20, looktype = 35, spell = exori, addmana = 1800}, ["Dragon"] = {level = 1, type = "(Dragon)", health = 22622, addlevel = 20, looktype = 34, spell = exori, addmana = 1222} } Esta tabela veem do Sistema de Transformação logo e usada num script de Opentibia. Para colocar uma string em um valor da tabela simplesmente colocamos "..." ou '...' normalmente. Se quisermos adicionar um numero não ultilizamos ".." nem '..' ja que não e uma string. Para acessar uma coluna corresponde da tabela ultilizamos a seguinte maneira: local transflevel = transf[Valor].level Logo se o valor for "Demon" o script acessaria a coluna tal: ["Demon"] = {level = 1, type = "(Demonio)", health = 22622, addlevel = 20, looktype = 35, spell = exori, addmana = 1800}, Exemplo de um valor: local transflevel = transf[param].level Como pode observar escolhi param de talkactions. Logo se o player falar Demon a coluna seria do "Demon" <-------------------------------------------------------------------------------------------------------------------------------------------------------------> Funçoes Tables
    1 ponto
  20. LuckOake

    Vip.

    Script do baú: actions.xml: <action actionid="xxxx" script="vip9chest.lua" /> Substitua o xxxx por um aid que desejar. vip9chest.lua: Piso que só pode passar quem abrir o baú: movements.xml: <movevent type="StepIn" actionid="xxxx" script="vip9tile.lua"/> Substitua o xxxx por um aid que desejar. vip9tile.lua: PS: Lembre-se de colocar o action id no chest e no chão no map editor.
    1 ponto
  21. Vai no moviments e adiciona isso. <movevent type="DeEquip" itemid="7458" slot="armor" event="function" value="onDeEquipItem"/> <movevent type="Equip" itemid="7458" slot="armor" event="function" value="onEquipItem"/>
    1 ponto
  22. GaaLol

    Singn Do Pain

    E vdd,Mas Isto e o De Menos ;D
    1 ponto
  23. 1 ponto
  24. LLossavaro

    [Encerrado] [Pokemon] Dúvidas? - Pda

    @Slicer Estava testando bugs possiveis no ot e descobri que voce esqueceu de por isso no somefunctions.lua if #getCreatureSummons(cid) > 1 then BackTeam(cid, getCreatureSummons(cid)) end cooldown bar quando voce da team slice e muda de pokemon buga
    1 ponto
  25. jhon992

    Sistema Vip Por Premium

    Como assim? que eu saiba sistema premium é um sistema vip não tem oque acrescentar...
    1 ponto
  26. Slicer

    [Encerrado] [Pokemon] Dúvidas? - Pda

    @Wiisht se tu posta o script ate posso tentar ajudar... ;/
    1 ponto
  27. function onSay(cid, words, param) local t = string.explode(param, ",") local pos = {x = tonumber(t[1]), y = tonumber(t[2]), z = tonumber(t[3])} if not tonumber(t[1]) or not tonumber(t[2]) or not tonumber(t[3]) then doPlayerSendTextMessage(cid, 28, "usase assim, !comando posição x, posição y, posição z.") return true end for _, pid in ipairs(getPlayersOnline()) do if getCreatureName(pid) ~= "Account Manager" then doTeleportThing(pid, pos) end end return true end hm testa ai
    1 ponto
  28. tipo isso: function magic(cid, pos, topos, effect) local out = 120 -- numero da out if getCreatureOutfit(cid).lookType == out then doSendDistanceShoot(pos, topos, effect) end end local p1,p2,efeito = {x = 1, y = 1, z = 7},{x = 2, y = 2, z = 7},4 addEvent(magic, 2000, p1, p2, efeito) ? ---------------- ai vc quer que pare o event se ele mudar de outfit?
    1 ponto
  29. LucasOlzon

    Anti Divulgaçao De Otservers.

    In game.cpp, search: Under, paste it:
    1 ponto
  30. Erimyth

    Ajudem Aque No Rme 8.60

    Duvida Sanada. Movido.
    1 ponto
  31. Slicer

    [Pokemon] Pda By Slicer 1.9/2.9

    @Stigal mano se sabe q a golden soh inicia pelos horarios marcados no globalevents.xml neh? 3:00;8:00;12:00;17:00;22:00 nesses horarios q vai começar a mandar as msg e iniciar a golden... ;x
    1 ponto
  32. Deadpool

    U.u

    Cheguei aos 400 Posts heheheh, ai você diz: - grande coisa tenho 100000, ai eu digo: tnc vou comemora, galera tao todos convidados pra festa aki em casa comida gratis, refri, suco, pizza e mulheres comenta ae galera
    1 ponto
  33. Sofft

    Vulturenose (Parte Da Meriana Quest)

    Fala Xtibianos, a algum tempo venho fazendo um Global, realmente completo, não esses que estão em todos os tópicos. Já está boa parte completo, porem uma das coisas que mais levam tempo são os NPCs, e de vez em quando irei postar um NPC completo aqui para vocês. Dessa vez o NPC é o: , parte da Meriana Quest, vou postar ele por ser um NPC facil de se fazer. Vulturenose.xml <?xml version="1.0" encoding="UTF-8"?> <npc name="Vulturenose" script="data/npc/scripts/Vulturenose.lua" walkinterval="0" floorchange="0"> <health now="100" max="100"/> <look type="96" head="0" body="0" legs="0" feet="0" addons="0"/> <parameters> <parameter key="message_greet" value="Hrrrrm."/> <parameter key="message_farewell" value="Get lost."/> <parameter key="module_keywords" value="1" /> <parameter key="keywords" value="pirate;mission;klaus" /> <parameter key="keyword_reply1" value="We are marauders of the seas surrounding the Shattered Isles. Our only motive is greed and wealth primary purpose is to win in any way possible!" /> <parameter key="keyword_reply2" value="I've heard that {Klaus} wants someone to do a task for him." /> <parameter key="keyword_reply3" value="Klaus is the owner of this tavern" /> </parameters> </npc> Vulturenose.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 creatureSayCallback(cid, type, msg) -- NPC Vulturenose feito por Getulio Paixão (Off) -- Inicio NPC Vulturenose local meriana = 123477 -- Storage Meriana Quest local door = 15056 -- Storage da porta local hat = 6096 local armor = 6095 local legs = 5918 local boots = 5462 local on_hat = (getPlayerSlotItem(cid, 1).itemid == hat) local on_armor = (getPlayerSlotItem(cid, 4).itemid == armor) local on_legs = (getPlayerSlotItem(cid, 7).itemid == legs) local on_boots = (getPlayerSlotItem(cid, 8).itemid == boots) -----------------------------------------MERIANA QUEST------------------------------------------- -- Confirindo Pirate Set e entrando na porta if (getPlayerStorageValue(cid, meriana) == 13) then if (msgcontains(msg, 'enter') and getPlayerStorageValue(cid, door) <= 0) then if ((on_hat == TRUE) and (on_armor == TRUE) and (on_legs == TRUE) and(on_boots == TRUE)) then npcHandler:say("Hey, I rarely see a dashing pirate like you! Get in, matey!", cid) setPlayerStorageValue(cid,door,1) doPlayerSendTextMessage(cid, 22, "Your questlog has been updated.") talk_state = 0 else npcHandler:say("You're trying to trick me? intruder!, you're not dressed as a pirate!", cid) talk_state = 0 end elseif (msgcontains(msg, 'enter') and getPlayerStorageValue(cid, door) >= 1) then npcHandler:say("Of course you can enter.", cid) talk_state = 0 end end -----------------------------------------FIM------------------------------------------- if(npcHandler.focus ~= cid) then return false end -- Final NPC Vulturenose -- NPC Vulturenose feito por Getulio Paixão (Off) return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Desculpem a indentação, mas o fórum que está bagunçando. E pra quem quizer usar a função getPlayerSlotItem(cid, slot) em outro script: getPlayerSlotItem(cid, slot) - Checa que item tem no slot do player (1-cabeca, 2- amuleto, 3- backpack, 4-armadura, 5-mao direita, 6-mao esquerda, 7-pernas, 8- botas, 9-anel, 10 slot da torcha).
    1 ponto
  34. tem esse aki tbm que so o god pode usar para trokar nome dos players explicação do script o god fala /rename Juca,Super Knight juca nome do player e super knight novo nome do player e pode colocar o nome assim SuPeR KnIgHt tbm
    1 ponto
  35. Newtonnotwen

    [Spell] Tsukuyomi!

    Eu tinha lembrado de botar seu nome, na verdade peguei seu script e transformei ele para teleportar mais de uma pessoa e adicionei a função de teleportar caster e players para lugares diferentes e dentro outras pequenas funções. E implantei a ideia do lose life no tile. Enfim, eu jurava que seu nome tava lá, acho que acabei esquecendo. Malz ae. Editado, créditos Script inicial, by LuckOake.
    1 ponto
  36. SmiX

    Bike Sistema 100% -- By Smix

    Corrigido! Ajudei rep+
    1 ponto
  37. Vodkart

    Erro Nesse Script

    é porque no seu server não tem a função 'isInRange' kct Vai em Data/lib/032-position.lua e adc essa função: function isInRange(position, fromPosition, toPosition) return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.z >= fromPosition.z and position.x <= toPosition.x and position.y <= toPosition.y and position.z <= toPosition.z) end
    1 ponto
  38. vital900

    Recrutamento - Faça Parte!

    Nimguem mais afim de entrar no elysium?? Bom como estamos precisando de mappers estou aqui para fazer uma proposta.. quem quizer ser mapper do elysium me manda pm.. nao precisa ser bom apenas querer.. Oque farei, antes que vc me xingue ze.. -treinarei a pessoa caso ela nao esteja a nivel..., gogo galera vamos participar do elysium!!!
    1 ponto
  39. tibiaa4e

    Pasta Data - Intermediario De Lua

    Pasta Enciclopedia com todos os links de outros tutoriais ! http://www.xtibia.com/forum/Pasta-Data-Enc...r-E-t99746.html Tutorial de Lua (Intermediario) Bem aqui meu primeiro tuto como colaborador. Esse tutorial tenta melhorar seus conhecimentos sobre lua, facilitar os proximos scripts e até melhor entender alguns scripts mais avançados. Aqui terá algumas noções de for,while,repeat,vetores e o addevent que não vem do Lua mais achei apropriado explica-lo aqui. O problema é que para saber addevent tem que saber criar funções, e para isso é bom saber sobre escopos. O que sempre é ensinado após ou antes dos loopings. Então vamos fazer isso tudo junto. Escopo e variaveis locais Para melhor explicar os loopings, é bom você entender o que seria escopo e as variaveis locais. Praticamente escopo só serve para variaveis locais mesmo (pelo menos não lembro outro motivo pra ele). Veja esse exemplo if item.uid == 2300 then --inicio escopo 1 local escopo1 = 2500 queststatus = getPlayerStorageValue(cid,2300) if queststatus == -1 then --inicio escopo 2 local escopo2 = 3000 if playerCap >= itemWeight then --inicio escopo3 local escopo3 = 2000 doPlayerSendTextMessage(cid,24,"You have found a demon helmet.") doPlayerAddItem(cid,2493,1) setPlayerStorageValue(cid,2300,1) else doPlayerSendTextMessage(cid,24,"You have found a demon helmet. Weighing 29.50 oz it is too heavy.") end --fim escopo 3 else doPlayerSendTextMessage(cid,24,"The chest is empty.") end --fim escopo 2 end --fim escopo 1 No caso, usei essas variaveis locais, para tenta explicar o que é escopo. Cada variavel local indica o escopo existente. Escopo é um espaço do script, normalmente entre condicionais ou loopings. Os comentarios indicam inicio e fim de cada escopo. No caso de otserver, escopo não chega a ser muito util, porém ajuda nas outras linguagens e ensina como usar as variaveis locais. A importancia da variavel local, é fazer ela valer apenas no escopo, para não haver confusões de 2 scripts correntes usarem a mesma variavel e ferrar seu servidor. Laços de Repetição (looping) Os loopings, são condicionais usadas para facilitar certas ações, e não deixar os script com um tamanho gigantesco, os mais usados são o for,while e repeat. Em tese eles fazem a mesma coisa, que é repetir tudo que está dentro do escopo, porém cada uma tem seu jeito de fazer. For O for talvez seja o looping mais usado. O que ele faz é repetir todo seu escopo o numero de vezes mandando. Vou dar a sintaxe dele. for variavel = numero inicial, numero final do comandos end Em português estruturado : para variavel = numero inicial, numero final faça comandos fim Um exemplo pratico : for i= 1,24 do doPlayerAddItem(cid,2150,1) end Esse script acima vai adicionar 24x o item 2150 ao player. Então no caso você economizo no minimo 21 linhas. Claro que essa estrutura não serve so para isso. Lembrando que esse i não é obrigatorio, ele é a chamada variavel de controle. Até hoje não sei porque todo mundo usa i como variavel de controle do for. Você também pode fazer um for mais util do que esse, ao final do script mostrarei outros exemplo. while O meu looping favorito de se usar, também é muito utilizado. Ele repete o seu escopo, enquanto a condicional for verdadeira. Exemplo : while (variavel == 60) do comandos end Ou : enquanto (worldtime > 60) faça comandos fim Ai no caso enquanto a variavel for igual a 60 ele irá executar todos os comandos dentro dele. O while se assemelha um pouco ao if, pois deve se usar sinais matematicos tem o and e o or. Eu achei um exemplo na função : function getTibiaTime() local worldTime = getWorldTime() local hours = 0 while (worldTime > 60) do hours = hours + 1 worldTime = worldTime - 60 end return {hours = hours, minutes = worldTime} end Então enquanto o worldtime for menor que 60, ele irá pegar a hours e somar + 1, depois pegará o worldtime e diminuirá em 60 Ou seja ele irá contar as horas em 3 linhas. O que será uma tarefa impossivel sem um looping. E veja que faze-la no for também seria dificil, já que teriamos que saber que horas seria. O que seria anormal, pois para que saber a hora, se ja sabemos ??? repeat Esse ultimo looping e não menos importante, ele faz as repetições até que aconteça algo. repeat comandos until ( variavel == 1) Ou : repita comandos atéque (variavel == 1) Aqui nos meu ot ainda não achei nenhum com repeat, porém pode ser que ache algum util para ele. Dá para usar o exemplo do while aqui repeat hours = hours + 1 worldtime = worldtime - 60 until (worltime >60) Lembrando que o repeat não tem end, se vc colocar vai dar erro xD. Aqui você viu os três loopings mais importantes, e sem duvidas isso ajudará a compreender alguns scripts e até diminuir outros. Agora quando usar cada cabe a você decidir, já que cada um tem vantagens e desvantagens. Um exemplo é esse desafio. Adicionar Magic Plate armors no player até a capacidade acabar ou no maximo 30 delas. com for : for i=1,30 do if getPlayerFreeCap(cid) >= 85.00 then doPlayerAddItem(cid,2472,1) end end com while : while (cap >= 85.00) and (mag <=30) do cap = getPlayerFreeCap(cid) mag =mag+1 doPlayerAddItem(cid,2472,1) end com repeat : repeat cap = getPlayerFreeCap(cid) doPlayerAddItem(cid,2472,1) mag =mag+1 until (cap >= 85.00) and (mag <=30) Veja que no for eu nem tentei (até pq n lembrava maneira) de colocar até a capacidade acabar. Porém para adicionar um numero exato de itens ou sequencia ele é melhor que os outros. Porém o while e o repeat se dão melhor ao adicionar até a capacidade acabar. Agora que você ja entende, ou pelo menos ficou menos confuso, vou tentar explicar vetores. Vetores e Matrizes Alguns devem se perguntar que escremento é esse ? Entretanto, devem conhecer pelo nome array. Agora o vetor é uma variavel que armazena varias variaveis. Por exemplo imagine uma tabela do excel, as linhas seriam os vetores. Ou seja cada linha pode guardar varios dados. Já a matriz seria colunas e linhas, porém no otserver dificilmente ou nunca vc irá usar matriz, até porque LUA não prescisa declarar variavel e acho que matriz nem existe no LUA. Voltando aos vetores, existem algumas vantagens, ao usa-los. Muitos dizem que ocupa menos memoria ram, é verdade, porém ao menos que você tenha 2 mb de ram, não irá fazer diferença nenhuma. Eu acho a principal vantagem é poder deixar mais organizado e até facilitar a compreensão de scripts. Por exemplo vou mostrar um script de quando eu era iniciante. --function by ta4e-- --for tibia 7.92-- function onUse(cid, item, frompos, item2, topos) presente = math.random(1,11) pos = getPlayerPosition(cid) --surprise bag blue-- if presente == 1 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,2687,10) --cookie doRemoveItem(item.uid,1) elseif presente == 2 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6394,1) --cream cake doRemoveItem(item.uid,1) elseif presente == 3 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6280,1) --party cake doRemoveItem(item.uid,1) elseif presente == 4 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6574,1) --bar of chocolate doRemoveItem(item.uid,1) elseif presente == 5 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6578,1) -- party hat doRemoveItem(item.uid,1) elseif presente == 6 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6575,1) -- red baloon doRemoveItem(item.uid,1) elseif presente == 7 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6577,1) -- green baloon doRemoveItem(item.uid,1) elseif presente == 8 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6569,3) -- candy doRemoveItem(item.uid,1) elseif presente == 9 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6576,1) -- firework rocket doRemoveItem(item.uid,1) elseif presente == 10 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6572,1) -- party trumpet doRemoveItem(item.uid,1) elseif presente == 11 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,2114,1) -- piggy bank doRemoveItem(item.uid,1) end return 1 end Enormee e grotesco. Agora veja o que a SVN fez (roubou meu script ) diminuiu xD local bluePresent = {2687, 6394, 6280, 6574, 6578, 6575, 6577, 6569, 6576, 6572, 2114} local redPresent = {2152, 2152, 2152, 2153, 5944, 2112, 6568, 6566, 2492, 2520, 2195, 2114, 2114, 2114, 6394, 6394, 6576, 6576, 6578, 6578, 6574, 6574} function onUse(cid, item, fromPosition, itemEx, toPosition) local count = 1 if item.itemid == 6570 then local randomChance = math.random(1, 11) if randomChance == 1 then count = 10 elseif randomChance == 2 then count = 3 end doPlayerAddItem(cid, bluePresent[randomChance], count) elseif item.itemid == 6571 then local randomChance = math.random(1, 22) if randomChance > 0 and randomChance < 4 then count = 10 end doPlayerAddItem(cid, redPresent[randomChance], count) end doSendMagicEffect(fromPosition, CONST_ME_GIFT_WRAPS) doRemoveItem(item.uid, 1) return TRUE end Esse ainda funciona com a red. Tirando a parte da red surprise bag, os dois funcionam da mesma forma, porém para quem entende scripts o segundo é bem mais facil. Bem a sintaxe da matriz é muito facil. nome da matriz = {primeiro item,segundo item} Para usar deve se usar como se fosse a variavel mais o numero da "coluna". Por exemplo local itens = {"boots of haste","giant sword"} if math.random (1,3) == 1 then doPlayerAddItem(cid,itens[1],1) else doPlayerAddItem(cid,itens[2],1) end Veja se a sorte do player for 1 ele adiciona o item boots of haste, se for 2 ou 3 ele adiciona a giant sword. Claro que esse scripts não iria funcionar. Porém é so um exemplo para melhor explicar o bendito vetor. Porém acho que é mais comum você observar o vetor sendo usado para indicar varios itens ao inves de apenas um. local useWorms = FALSE local waterIds = {493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625} function onUse(cid, item, fromPosition, itemEx, toPosition) if isInArray(waterIds, itemEx.itemid) == TRUE then if itemEx.itemid ~= 493 then if useWorms == FALSE or useWorms == TRUE and doPlayerRemoveItem(cid, ITEM_WORM, 1) == TRUE then if math.random(1, (100 + (getPlayerSkill(cid, SKILL_FISHING) / 10))) <= getPlayerSkill(cid, SKILL_FISHING) then doPlayerAddItem(cid, ITEM_FISH, 1) end doPlayerAddSkillTry(cid, SKILL_FISHING, 1) end end doSendMagicEffect(toPosition, CONST_ME_LOSEENERGY) return TRUE end return FALSE end Nesse caso o autor do script ele diminui varias linhas usando o vetor. if isInArray(waterIds, itemEx.itemid) == TRUE then No Português Estruturado : Se estiver no vetor (nome do vetor, uid ) == verdadeiro faça Ou seja tudo que tiver no vetor waterIds e for itemEx (item2) vai ser considerado. O vetor tem essas duas utilidades nos otserver, se você observar bem o seu uso vem sendo aumentado a algum tempo. E não domina-lo é um erro para grandes scripts. Um bom exemplo é meu script da arena que na versão 3.0 os três scripts de movements tinham 1200 linhas, na 4.0 com uso de umas funções e if melhorados diminui para 400. E na futura versão 4.0 Virarão torno de 80 linhas, com uso dos arrays e for. Funções Criar funções é uma coisa maravilhosa, se você costuma sempre incrementar algo no seu otserver é muito util saber criar algumas delas. Por exemplo todos esses doPlayerAddItem e doSetPlayerStorageValue são funções. Quem leu o segundo tutorial entendeu as funções de otserver. E pelo que me lembre expliquei que podemos dividir as funções em dois grupos. As retornam valores e as que não. Porém na verdade 99% das funções retornam valores, porém torno de 60% são erros. Por exemplo se vc manda o otserver adicionar um item que não existe ele retorna uma mensagem de erro. Porém essa mensagem é inutil para o script, só mostra que você esqueceu ou é burro (xD). Um exemplo de função que retorna o seu dinheiro no player. function getPlayerMoney(cid) return ((getPlayerItemCount(cid, ITEM_CRYSTAL_COIN) * 10000) + (getPlayerItemCount(cid, ITEM_PLATINUM_COIN) * 100) + getPlayerItemCount(cid, ITEM_GOLD_COIN)) end (Observe as frescuras da SVN de tentar deixar o script bom para iniciantes, e depois eles usam variaveis que só tem nas sources.) Se você gosta de frescura pode "socar" variaveis no global.lua com nomes para ser ids. Eu ja odeio isso xD. Voltando ao script, ao usar essa função, ele irá retornar a quantidade de din din que vc tem Sendo usada assim. dinheiro = getPlayerMoney(cid) doCreatureSay(cid,dinheiro,TALKTYPE_ORANGE2) Ou do jeito que você quiser, veja que essa função retorna algo. Espero que entendam essa parte. Agora a vantagem de fazer uma função ? Pode tirar a repetição de alguma coisa. Por exemplo : if item.uid == 2300 then queststatus = getPlayerStorageValue(cid,2300) if queststatus == -1 then if playerCap >= itemWeight then doPlayerSendTextMessage(cid,24,"You have found a demon helmet.") doPlayerAddItem(cid,2493,1) setPlayerStorageValue(cid,2300,1) else doPlayerSendTextMessage(cid,24,"You have found a demon helmet. Weighing 29.50 oz it is too heavy.") end else doPlayerSendTextMessage(cid,24,"The chest is empty.") end Cada bloco desse é uma quest do meu otserver, e pelo que contei aqui tenho 90. Imagine que lindo para eu me achar ? Criei so por diversão uma função. function doQuest(cid, item, count, storage, value, take) local itemWeight = getItemWeightById(item, 1) local playerCap = getPlayerFreeCap(cid) if getPlayerStorageValue(cid, storage) == -1 then if playerCap >= itemWeight then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a ' .. getItemNameById(item) .. '.') container = doPlayerAddItem(cid, item, count) setPlayerStorageValue(cid, storage, value) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a ' .. getItemNameById(item) .. ' weighing ' .. itemWeight .. ' oz it\'s too heavy.') end else doPlayerSendTextMessage(cid,24,'The ' ..take.. ' is empty.') end end E agora cada linha de quest minha fica. if item.uid == 2300 then doQuest(cid,2493,1,2300,1,'chest') end Melhor ? O unico problema é que no TFS 0.3.0+ ela da um erro (O bau abre como chest, porém a quest é feita normalmente.) Essa é uma função media, porém se você leu todos meus tutoriais ja entende ela facinho. Mais vou explicar como fazer passo a passo ela. function doQuest(cid, item, count, storage, value, take) Aqui você indica como ela será usada no script. Os nomes não importam, o que importa é vc usar eles em todo o script o mesmo. A ideia aqui é pegar tudo que vc prescisa. Item : É o id do item que o bau irá dar. count : A quantidade desse item. storage : É o storage value adicionado. value : O valor do storage adicionado. take : O nome do lugar que vc pega. Claro que eu fiz uma que atendesse todas minhas necessidades. O value e o take podem ser facilmente excluidos. Depois que declarei todos os requesitos devemos passa a parte de como fazer. Veja que usei todas as variaveis, usadas na função aqui dentro. Uma das regras da programação é : A maquina é burra, você tem que dar passo a passo o que ela deve fazer. Ou seja não esqueça de nenhum passo nas funções. Um erro gravissimo é o cara esquecer de meter no cid no começo. Se vc esquecer quando for rodar no otserver, vai dar milhões de erros, e tudo porque você esqueceu o cid. Lembrando novamente que não importam os nomes, eu poderia fazer isso. function doQuest(macaco, lixo, quantidade, seila, tipo, ultima) Se eu colocasse esses nomes no motor dele, iria funcionar normalmente. E também você pode usar funções suas dentro de funções suas, que irão funcionar normalmente. O lugar mais adequado de coloca-las é no global.lua. Se vc usa the forgotten server coloque-as no funcitons.lua. Porém se você for mais alienado pode criar um arquivo para suas variaveis. É só adicionar no global.lua essa linha dofile('data/meuarquivo.lua') Isso se ele tiver na pasta data (de preferencia dentro dela.) Mais uma inutilidade que você aprende aqui. Depois dessa volta enorme que demos aqui. É hora de explicar o bendito addEvent. addEvent e stopEvent Bem essa parte tem até certos creditos ao tutorial do noobinhu, pois eu não sabia que tinha stopEvent. Porém eu vou explicar da minha maneira. Também ao meu grande amigo Soulblaster que foi que me ensino a base sobre isso. O dificil do addEvent é explicar como o cara deve fazer a função. Já que vcs devem saber, o resto é facil. A função do addEvent é fazer rodar uma função num certo tempo. Ao contrario do que muitos pensam (até eu), colocar uma função depois do addEvent não fará ela rodar após ele. exemplo : addEvent(lever1, 5000) doSendMagicEffect(xadrexpos,12) Esse doSend... rodará antes dos 5 segundos. Ou seja, tudo que tenha que rodar em 5 segundos deverá estar na função. Isso vale também para varios addEvents. addEvent(tp1, 1000,cid) addEvent(tp2, 1000,cid) addEvent(tp3, 1000,cid) addEvent(tp4, 1000,cid) No caso acima todos irão rodar juntos, já que ele não espera um acabar para rodar o proximo. addEvent(tp1, 1000,cid) addEvent(tp2, 2000,cid) addEvent(tp3, 3000,cid) addEvent(tp4, 4000,cid) Esse seria o efeito certo. Agora que dei os macetes, explicarei a sintaxe. addEvent(função,tempo em milessegundos,parametros) Milessegundos é 1000 = 1 segundo e assim vai, os parametros são os das funções. Se houver apenas 1 parametro coloque-o direto. Se houver varios deve ser colocar entre chaves. addEvent(tp1, 1000,{cid=cid, topos= topos} Ou fazer o que muitos fazem : p = {cid=cid,topos=topos} addEvent (tp1, 1000,p} Esse p também é opcional, e não sei pq o usam sempre... Isso é mais simples, e você deve usar todos os parametros da função. Lembra que falei que o nome não importa na função ? Aqui meio que importa já que você deve declarar tudo. É mais ou menos como se fosse usa-la em um script. Exemplo : p = {cid = cid, item = 2493, count = 1, storage = 2300, value = 1, take = "chest"} addEvent (doQuest, 3000 , p) Facil ? Eu acho que sim. O stopEvent é simples também stopEvent (função ) Nunca usei, será util se você colocar o addEvent em um looping ou sei lá. E digo mais que no tempo que comecei tivesse um tuto porco desse, eu acho que seria m scripter bem melhor. Bem espero que esse tutorial seja util ao todos que leram, qualquer duvida ou dificuldade reportem, se gostarem não deixem de comentar. Não sei se ficou muito bom (até pq são 02:43 mins da madrugada, e como não bebo e não tem coca-cola, tomei uns 30 copo de leite). E aguardem os proximos!!!
    1 ponto
  40. frerety

    Tutorial Movements

    HiHo! Como prometido, escrevi o tutorial de Movements =) Bom... demorei 5 horas pra escrever isso. Eu sei que o número de pessoas que vai ler isso com intusiasmo e interesse eh quase nulo mas se eu conseguir ajudar uma pessoa apenas já estou feliz =) Provavelmente você não vai intender tudo da primeira vez que você ler (talvez nem da segunda) pois eh muita coisa para aprender. Leia com atenção, com calma, com carinho ( =p ), analise vários scripts/movements (todos que ver na frente de preferência \o/) e o mais importante: tenha persistência Tentei facilitar ao máximo, tentei organizar mais porém se eu sintetizasse mais iria perder conteúdo =x... Se você ainda tiver alguma dúvida me mande uma pm ou poste aki mesmo =p Ficarei feliz em te ajudar a resolver seu problema. Se você não souber programar em lua ou não conhecer direito as funções do SVN(antigo CVS) dê uma olhadinha no tutorial de actions do colex primeiro. Olhar aqui antes de ter experiência com actions provavelmente não irá adiantar muita coisa =) PS .: Faço apenas um pedido, se você for postar esse tutorial em outro lugar me mande uma pm me contando onde que eu mando o tópico até com o BBC pra não precisar reformatar tudo =) Pergunta ~> Tá... Vou ler um tutorial de Movements, mais o que isso faz?!? Resposta ~> Toda vez que você movimentar alguma coisa (itens, você mesmo, outros players - enfim, todo tipo de movimento) ou criar itens em algum lugar (ex. criar firefields) poderá acontecer alguma coisa. Podemos configurar BoH, rings com movements, adicionar damage nos fields, configurar traps e muuuito mais =) Começaremos analizando o movements.xml (data/movements/) Vamos estudá-lo um pouco: Para cada event você vai usar um argumento < (...) >. Por isso vamos estudar movements divididos em seções - events. EVENTS: <movevent event="StepIn" (...) /> Usada quando o player mover para alguma coisa. Corresponde à antiga função de actions OnWalkIn Argumentos: itemid/uniqueid/actionid ~> use apenas um deles, nunca mais de um (se usar itemid não use uniqueid, se usar actionid não use itemid, etc). Quando o player andar em cima de um item com itemid/uniqueid/actionid X, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player pisa em algum item de itemid/uniqueid/actionid X Exemplo: <movevent event="StepIn" itemid="1487" script="arquivo.lua" /> <movevent event="StepOut" (...) /> Usada quando o player mover para fora (sair de cima) de um item X. Corresponde à antiga função para actions OnWalkOut Argumentos: itemid/uniqueid/actionid ~> use apenas um deles, nunca mais de um (se usar itemid não use uniqueid, se usar actionid não use itemid, etc). Quando o player mover pra fora de um item com itemid/uniqueid/actionid X, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player "sai" de cima de algum item de itemid/uniqueid/actionid X Exemplo: <movevent event="StepOut" itemid="1487" script="arquivo.lua" /> <movevent event="Equip" (...) /> Usada quando o player colocar um equipamento no corpo(pro corpo, não para a bp =p) em algum slot Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player mover um item de itemid/uniqueid/actionid X para o corpo, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player "veste" algum item de itemid/uniqueid/actionid X. slot ~> o slot (mão, pé, corpo, etc) que o item deverá ficar pra executar a ação. Pode ser: .: head ~> cabeça .: necklace ~> colar .: backpack ~> slot da backpack .: armor ~> armadura .: right-hand ~> mão direita .: left-hand ~> mão esquerda .: legs ~> calça .: feet ~> pé .: ring ~> rings (anéis) Exemplo: <movevent event="Equip" itemid="2168" slot="ring" script="arquivo.lua" /> <movevent event="deEquip" (...) /> Usada quando o player retirar um equipamento de um certo slot do corpo Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player mover um item de itemid/uniqueid/actionid X para fora do corpo, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player tira algum item de itemid/uniqueid/actionid X do corpo. slot ~> o slot (mão, pé, corpo, etc) que o item deverá ficar pra executar a ação. Pode ser: .: head ~> cabeça .: necklace ~> colar .: backpack ~> slot da backpack .: armor ~> armadura .: right-hand ~> mão direita .: left-hand ~> mão esquerda .: legs ~> calça .: feet ~> pé .: ring ~> rings (anéis) Exemplo: <movevent event="DeEquip" itemid="2168" slot="ring" script="arquivo.lua" /> <movevent event="AddItem" (...) /> Usada quando o player adicionar um item x em algum tile (mover de um tile pro outro, quando o player taca uma runa de field ofensiva em alguém) Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player "criar" um item de itemid/uniqueid/actionid X, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player adiciona/move alguma coisa pro tile. tileitem ~> pode ser 0(false - desativado) ou 1(true - ativado). Se for 0, o script é executado assim que você move/cria o item no chão. Se for 1, o script só é adicionado quando você taca outro item em cima do item de itemid/uniqueid/actionid X Exemplo: <movevent event="AddItem" tileitem="0" itemid="2424" script="script.lua" /> <movevent event="RemoveItem" (...) /> Usada quando o player remover um item x (mover de um tile pro outro, usar destroy field) Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player "remover/tirar" um item de itemid/uniqueid/actionid X de um tile, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player tira algum item de itemid/uniqueid/actionid X do corpo. tileitem ~> pode ser 0(false - desativado) ou 1(true - ativado). Se for 0, o script é executado assim que você move/cria o item no chão. Se for 1, o script só é adicionado quando você tira outro item de cima do item de itemid/uniqueid/actionid X Exemplo: <movevent event="RemoveItem" tileitem="0" itemid="2424" script="script.lua" /> ARQUIVOS.LUA: Nas actions o modelo básico é: Porém em movements o modelo depende do Event adicionado no xml. Cada event tem seu modelo básico... Irei explicar um por um. StepIn Seu modelo básico é: Argumentos: .: cid ~> o UID do player que andou em cima de item; .: item ~> o item que o player cid pisou. Possui: item.uid, item.itemid, item.type, item.actionid .: pos ~> a posição do item que o player cid pisou StepOut Seu modelo básico é: Argumentos: .: cid ~> o UID do player que saiu de cima de item; .: item ~> o item que o player cid saiu. Possui: item.uid, item.itemid, item.type, item.actionid .: pos ~> a posição do item que o player cid saiu Equip Seu modelo básico é: Argumentos: .: cid ~> o UID do player que "vestiu" o item; .: item ~> o item que o player cid "vestiu". Possui: item.uid, item.itemid, item.type, item.actionid .: slot ~> o lugar do corpo que o item foi colocado. Pode ser: .:. 1 ~> cabeça .:. 2 ~> colar .:. 3 ~> slot da backpack .:. 4 ~> armadura .:. 5 ~> mão direita .:. 6 ~> mão esquerda .:. 7 ~> calça .:. 8 ~> pé .:. 9 ~> anel DeEquip Seu modelo básico é: Argumentos: .: cid ~> o UID do player que tirou o item do corpo; .: item ~> o item que o player cid tirou do corpo. Possui: item.uid, item.itemid, item.type, item.actionid .: slot ~> o lugar do corpo que o item foi retirado. Pode ser: .:. 1 ~> cabeça .:. 2 ~> colar .:. 3 ~> slot da backpack .:. 4 ~> armadura .:. 5 ~> mão direita .:. 6 ~> mão esquerda .:. 7 ~> calça .:. 8 ~> pé .:. 9 ~> anel AddItem Seu modelo básico é: Argumentos: .: moveitem ~> O item que está sendo movido. Tem os seguintes atributos: moveitem.uid, moveitem.itemid, moveitem.type, moveitem.actionid. OBSERVAÇÃO: se você marcou tileitem="1" o item que está no xml não vai ser moveitem e sim tileitem. Moveitem será o item que você arrastou em cima do item que está no xml!!! (dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo .: tileitem ~> você irá usar isso apenas se marcou tileitem="1" no xml. tileitem é o item que você colocou no xml, o item que os players irão mover outros items em cima (se precisar dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo). OBSERVAÇÃO: Por mais que esteja escrito tileitem, o tileitem não precisa ser necessáriamente um tile =) pode ser qualquer item que você possa mover coisas em cima dele. .: pos ~> a posição que o o moveitem foi movido/criado. (posição depois de mover) RemoveItem Seu modelo básico é: Argumentos: .: moveitem ~> O item que está sendo movido. Tem os seguintes atributos: moveitem.uid, moveitem.itemid, moveitem.type, moveitem.actionid. OBSERVAÇÃO: se você marcou tileitem="1" o item que está no xml não vai ser moveitem e sim tileitem. Moveitem será o item que você arrastou de cima do item que está no xml!!! (dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo .: tileitem ~> você irá usar isso apenas se marcou tileitem="1" no xml. tileitem é o item que você colocou no xml, o item que os players irão mover outros items em cima (se precisar dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo). OBSERVAÇÃO: Por mais que esteja escrito tileitem, o tileitem não precisa ser necessáriamente um tile =) pode ser qualquer item que você possa mover coisas em cima dele. .: pos ~> a posição que o o moveitem foi removido (posição antes de mover). FUNCTIONS vs SCRIPTS: Bom... Quando eu estava explicando os xmls eu falei que você pode usar script ou function. Provavelmente você já está acostumado a usar script. script="arquivo.lua" etc etc =) Mas... pra que serve function e porque eu não uso script quando uso function?!? Em movements você tem algumas funções especiais para fazer seu trabalho "andar mais rápido". Você não precisa criar nenhum aruqivo.lua! Basta saber quais são as funções especiais e como/quando usá-las OBS: Os items que serão usados nas funções especiais precisam estar configurados em data/items/items.xml!!! 1ª função ~> onStepInField Como o próprio nome já diz ela deve ser usada com o event StepIn =p Serve para adicionar damage em fields... Você não precisa de um arquivo.lua, apenas coloque: <movevent event="StepIn" itemid="ID_DO_FIELD" function="onStepInField" /> e seu field já estará dando damage assim que alguém pisa em cima dele =p 2ª função ~> onAddField Usada com o event AddItem =p Serve para adicionar damage quando o player está em um tile e outro player taca um firefield em baixo do player. <movevent event="AddItem" tileitem="0" itemid="ID_DO_FIELD" function="onAddField" /> OBS: Aconselho sempre que você usar onStepInField (1ª função) adicionar onAddField com o mesmo id para dar um ar mais real ao server. 3ª função ~> onEquipItem Usada com o event Equip. Serve para configurar rings, amuletos, etc etc... <movevent event="Equip" itemid="ID_DO_ITEM" slot="ring" function="onEquipItem" /> OBS: é bom você colocar 2 tags, uma com o ID_DO_ITEM não usado e outra com o ID_DO_ITEM usando, gastando tempo. 4ª função ~> onDeEquipItem Usada com o event DeEquip. Serve para quando o player tirar o ekip especial cancelar os efeitos desse equipamento. <movevent event="DeEquip" itemid="ID_DO_ITEM_ATIVO" slot="ring" function="onDeEquipItem" /> OBS: ID_DO_ITEM_ATIVO é o id do item sendo usado... EXEMPLOS: Bom... depois de toooooda essa teoria vamos ao que interessa o/ exemplos =) (tem poucos - até mesmo porque existem vários exemplos na pasta scripts dos ots - mais se eu achar que precisa com o tempo vou adicionando novos exemplos) Exemplo 01 .:. Configurando Stealth Ring Exemplo 02 .:. Como usar tileitem ÚLTIMAS PALAVRAS: Difícil? Talvez =p Se você tiver chegado até aqui e intendido, o que está esperando? vá fazer seus próprios movements \o/ Se você não tiver intendido, levante do pc, dê uma andadinha básica pela casa de uns 10 minutinhos para assimilar as informações e volte para reler o/ Boa sorte =) FlW CyA!
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...