Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 04/01/13 em todas áreas
-
The Forgotten Server 0.3.6 (Crying Damson) V8.1
Maximaah e um outro reagiu a LuckinhaSan por um tópico no fórum
Versão8.1 Este servidor foi testado 15HRs com 30 jogadores. O server não cai! Está mais estável que as versões anteriores! V1 Log's - Lançado! V2 Log's - Fixed House bugFixed Npc BugFixed Items.otbAdicionado Marriage SystemAdicionado Auto Combo Bot detectorAdicionado Anti-Mc SystemAdicionado GM:Acc: godPass: god V2.5 Log's - Corrigido o erro sobre você não pode fazer login.Adicionado Level Up, msg com o feitiço que você pode usar.Adicionado Military Ranks V3 Log's - Adicionado auto stack itensAdicionado em danos guildmates e partymates - configurável no config.lua-- Damage Guild/Party --noDamageToGuildMates = false - Se true nenhum dano, se false, danosnoDamageToPartyMembers = false - Se true nenhum dano, se false, danosAdicionados anti-x Logg para que você não seja banido na otservlist!Adicionado shoot runes, pots, etc... se você atirar runas, pots etc... As cargas podem ser mais do que 1000. exemplo: you shooted your 1234 sudden deathEvoluído o comando online. ! on-line V4 Log's - Removido Auto Stack por causar erros!Corrigido o erro quando os itens cair no chão! V5 Log's - Corigidos menores erros nas sources!Corrigido o erro House, que pode causar a sua queda do servidor!O servidor tem sido mais estável do que antes!Atualizado dlls! V6 Log's - Adicionado: Característica Auto Stackable!Adicionado: onMove muito avançada <- Por Doggynub!Adicionado: Nível e Vocação OnLogin: <- Por Jetro!Adicionado Max Peso caixa de correio, By Ninja para evitar crash's!Bug Poções corrigidos! <- Graças a XubeigaCompile corrigido para linux! <- Sim, agora você pode compilar para linux! V7 Log's - Adicionado Anti-Push Prevention System!Adicionado CapacityOverload System!Adicionado CriticalHitChance!Corrigido o erro no login - graças a oskar1415Feita correção pequeno erro e mudou no sistema anti mc no login, em vez de pop-up, você receberá uma mensagem.Aproveite! V8 Log's - Removido Auto-Stack que faz com que seus itens caiam!Removido CapacityOverload System!Removido Anti-Push Prevention System! Bug causar erros em mover os itens!Removido OnMove muito avançada - Causando crash!CriticalHitChance removido!Adicionado Paralyze Bot Dedection!Stair Height corrigido por Benis: http://www.youtube.com/watch?v=x-R1Fm4vp1oE outras pequenas correções. V8.1 Log's [NEW] - Removido items.otb verificação de versão!Agora há dois exe, 64bit e 32bit! Download Server: cryingdamson 0.3.6 (8.60) V8.1.rar Download Source: cryingdamson 0.3.6 (8.60) V8.1 Source.rar Recorde que este é TFS Versão 0.3.6, que foi atualizado para 8.60 e acrescentado coisas e bugs corrigidos. Todos os créditos vão para a equipe TFS e para Cyko pela edição!2 pontos -
Pokemon Black & White - Spriting Male
Faelzdanil e um outro reagiu a JG6 por um tópico no fórum
Boa Tarde galera, vim aqui mostrar pra vcs uma sprite q eu fiz ta ae: com base nesse aqui: Se gostaram deem um Rep+ (não sei se pode pedi, mais se não pode algum mod ow alguem me avise) e deem dicas para me ajudar a melhorar nas sprites2 pontos -
[NPC] EGG
XXrodriXX e um outro reagiu a XkluivertX por um tópico no fórum
Mano foi meu amigo no msn que me passo ai ele pediu pra eu tirar o bug quando vc ia tirar o egg ele sai com um iten de tibia e quando vc abria sai um Demon morto na sua bp ai bugava, e os creditos eu não sei de quem fes pow, Mas so sei que eu ajetei esse bug demorei mais ajeitei. Se puder tbm dizer os creditos eu ponho, mais tbm terei credito pq ajeitei. Bruno eu testei em Cerution, Flash e Svke. mais provavelmente pegue em PDA.2 pontos -
Vip System by Account 1.0 By Kydrai Este é um vip system por account, ou seja, um sistema de vip válido para todos os characters de uma determinada conta. O script foi testado no TFS 0.3.6 - 8.54. E no site Gesior 0.3.4 beta4. Em caso de erros ou dúvidas é só postar. Funções do Script Função necessária para começar a usar o script: installVip() -> Cria a coluna no banco de dados para usar o sistema de vip (testei somente em sqlite, mas acredito que funcione em mysql) Funções que utilizam o account id: doTeleportPlayersByAccount(acc, topos) -> Teleporta todos os players da account getVipTimeByAccount(acc) -> Pega o tempo de vip setVipTimeByAccount(acc, time) -> Edita o tempo de vip getVipDaysByAccount(acc) -> Pega o tempo de vip em dias isVipAccount(acc) -> Verifica se é vip addVipDaysByAccount(acc, days) -> Adiciona dias de vip doRemoveVipDaysByAccount(acc, days) -> Remove dias de vip getVipDateByAccount(acc) -> Pega a data e hora que irá terminar a vip Funções que utilizam o creature id (cid): doTeleportPlayers(cid, topos) -> Teleporta todos os players da account getVipTime(cid) -> Pega o tempo de vip setVipTime(cid, time) -> Edita o tempo de vip getVipDays(cid) -> Pega o tempo de vip em dias isVip(cid) -> Verifica se é vip addVipDays(cid, days) -> Adiciona dias de vip doRemoveVipDays(cid, days) -> Remove dias de vip getVipDate(cid) -> Pega a data e hora que irá terminar a vip Inserindo as funções Abra a pasta data/lib, crie um arquivo lua e coloque: vipAccount.lua --[[ Name: Vip System by Account Version: 1.0 Author: Kydrai Forum: http://www.xtibia.com/forum/topic/136543-vip-system-by-account-v10/ [Functions] -- Install installVip() -- By Account doTeleportPlayersByAccount(acc, topos) getVipTimeByAccount(acc) setVipTimeByAccount(acc, time) getVipDaysByAccount(acc) isVipAccount(acc) addVipDaysByAccount(acc, days) doRemoveVipDaysByAccount(acc, days) getVipDateByAccount(acc) -- By Player doTeleportPlayers(cid, topos) getVipTime(cid) setVipTime(cid, time) getVipDays(cid) isVip(cid) addVipDays(cid, days) doRemoveVipDays(cid, days) getVipDate(cid) ]]-- -- Install function installVip() if db.executeQuery("ALTER TABLE `accounts` ADD viptime INT(15) NOT NULL DEFAULT 0;") then print("[Vip System] Vip System instalado com sucesso!") return TRUE end print("[Vip System] Não foi possível instalar o Vip System!") return FALSE end -- By Account function doTeleportPlayersByAccount(acc, topos) if db.executeQuery("UPDATE `players` SET `posx` = "..topos.x..", `posy` = "..topos.y..", `posz` = "..topos.z.." WHERE `account_id` = "..acc..";") then return TRUE end return FALSE end function getVipTimeByAccount(acc) local vip = db.getResult("SELECT `viptime` FROM `accounts` WHERE `id` = "..acc..";") if vip:getID() == -1 then print("[Vip System] Account not found!") return FALSE end return vip:getDataInt("viptime") end function setVipTimeByAccount(acc, time) if db.executeQuery("UPDATE `accounts` SET `viptime` = "..time.." WHERE `id` = "..acc..";") then return TRUE end return FALSE end function getVipDaysByAccount(acc) local vipTime = getVipTimeByAccount(acc) local timeNow = os.time() local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60)) return days <= 0 and 0 or days end function isVipAccount(acc) return getVipDaysByAccount(acc) > 0 and TRUE or FALSE end function addVipDaysByAccount(acc, days) if days > 0 then local daysValue = days * 24 * 60 * 60 local vipTime = getVipTimeByAccount(acc) local timeNow = os.time() local time = getVipDaysByAccount(acc) == 0 and (timeNow + daysValue) or (vipTime + daysValue) setVipTimeByAccount(acc, time) return TRUE end return FALSE end function doRemoveVipDaysByAccount(acc, days) if days > 0 then local daysValue = days * 24 * 60 * 60 local vipTime = getVipTimeByAccount(acc) local time = vipTime - daysValue setVipTimeByAccount(acc, (time <= 0 and 1 or time)) return TRUE end return FALSE end function getVipDateByAccount(acc) if isVipAccount(acc) then local vipTime = getVipTimeByAccount(acc) return os.date("%d/%m/%y %X", vipTime) end return FALSE end -- By Player function doTeleportPlayers(cid, topos) doTeleportPlayersByAccount(getPlayerAccountId(cid), topos) end function getVipTime(cid) return getVipTimeByAccount(getPlayerAccountId(cid)) end function setVipTime(cid, time) return setVipTimeByAccount(getPlayerAccountId(cid), time) end function getVipDays(cid) return getVipDaysByAccount(getPlayerAccountId(cid)) end function isVip(cid) return isVipAccount(getPlayerAccountId(cid)) end function addVipDays(cid, days) return addVipDaysByAccount(getPlayerAccountId(cid), days) end function doRemoveVipDays(cid, days) return doRemoveVipDaysByAccount(getPlayerAccountId(cid), days) end function getVipDate(cid) return getVipDateByAccount(getPlayerAccountId(cid)) end Exemplos de uso Talkaction GOD: /installvip /addvip name, days /removevip name, days /checkvip name Player: /buyvip /vipdays talkactions.xml: <talkaction log="yes" access="5" words="/installvip;/addvip;/removevip;/checkvip" event="script" value="vipaccgod.lua"/> <talkaction words="/buyvip;/vipdays" event="script" value="vipaccplayer.lua"/> vipaccgod.lua: function onSay(cid, words, param, channel) local t = param:explode(",") local name, days = t[1], tonumber(t[2]) if words == "/installvip" then if installVip() then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Vip System instalado com sucesso!") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Não foi possível instalar o Vip System!") end elseif words == "/addvip" then if name then if days then local acc = getAccountIdByName(name) if acc ~= 0 then addVipDaysByAccount(acc, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip ao "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar essa quantidade de dia(s) de vip.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar dia(s) de vip a este player.") end elseif words == "/removevip" then if name then if days then local acc = getAccountIdByName(name) if acc ~= 0 then doRemoveVipDaysByAccount(acc, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você retirou "..days.." dia(s) de vip do "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar essa quantidade de dia(s) de vip.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar dia(s) de vip a este player.") end elseif words == "/checkvip" then if name then local acc = getAccountIdByName(name) if acc ~= 0 then local duration = getVipDateByAccount(acc) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O "..name.." possui "..getVipDaysByAccount(acc).." dias de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode visualizar os dias de vip a este player.") end end return TRUE end vipaccplayer.lua: function onSay(cid, words, param, channel) if words == "/buyvip" then local price = 1000000 local days = 30 if doPlayerRemoveMoney(cid, price) then addVipDays(cid, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip, agora você possui "..getVipDays(cid).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa de "..price.." para adicionar "..days.." dia(s) de vip.") end elseif words == "/vipdays" then local duration = getVipDate(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) end return TRUE end Movement (Tile) Coloque actionid 15000 em um tile onde somente os vips poderão passar. movements.xml: <movevent type="StepIn" actionid="15000" event="script" value="viptile.lua"/> viptile.lua: function onStepIn(cid, item, position, fromPosition) if isVip(cid) == FALSE then doTeleportThing(cid, fromPosition, false) doSendMagicEffect(position, CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Somente players vip podem passar.") end return TRUE end Creaturescript (Login) Quando player logar irá verificar se a vip do player acabou, se sim então irá teleportar todos os players da account para o templo, se não irá mostrar o tempo da vip. creaturescripts.xml: <event type="login" name="viplogin" script="viplogin.lua"/> viplogin.lua: function onLogin(cid) local vip = isVip(cid) if getVipTime(cid) > 0 and vip == FALSE then local townid = 1 doPlayerSetTown(cid, townid) local templePos = getTownTemplePosition(getPlayerTown(cid)) doTeleportThing(cid, templePos, false) setVipTime(cid, 0) doTeleportPlayers(cid, templePos) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sua Vip acabou!") elseif vip == TRUE then local duration = getVipDate(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) end return TRUE end Action (Door) Coloque actionid 15001 na door onde somente os vips poderão passar. Use a porta gate of expertise (id: 1227) actions.xml: <action actionid="15001" script="vipdoor.lua"/> vipdoor.lua: function onUse(cid, item, fromPosition, itemEx, toPosition) if isVip(cid) == FALSE then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Somente players vip podem passar.") elseif item.itemid == 1227 then doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition) end return TRUE end NPC (Vendedor de VIP) vipnpc.xml: <?xml version="1.0" encoding="UTF-8"?> <npc name="Vendedor de VIP" script="vipnpc.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="128" head="17" body="54" legs="114" feet="0" addons="2"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|, I sell {vip} days."/> </parameters> </npc> vipnpc.lua: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function buyVip(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end if doPlayerRemoveMoney(cid, parameters.price) then addVipDays(cid, parameters.days) npcHandler:say('Thanks, you buy '..parameters.days..' vip days. You have '..getVipDays(cid)..' vip days.', cid) else npcHandler:say('Sorry, you don\'t have enough money.', cid) end npcHandler:resetNpc() return true end local node1 = keywordHandler:addKeyword({'vip'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Do you want buy 30 vip days for 1000000 gp\'s?'}) node1:addChildKeyword({'yes'}, buyVip, {price = 1000000, days = 30}) node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Ok, then.', reset = true}) npcHandler:addModule(FocusModule:new()) Erros e Soluções Configurando o Gesior Com essa configuração irá aparecer o vip status do player no site e será possível vender vip pelo site. Se eu esqueci de alguma coisa é só avisar. accountmanagement.php Depois de: if(!$account_logged->isPremium()) $account_status = '<b><font color="red">Free Account</font></b>'; else $account_status = '<b><font color="green">Premium Account, '.$account_logged->getPremDays().' days left</font></b>'; Adicione: if(!$account_logged->isVip()) $account_vip_status = '<b><font color="red">Not Vip Account</font></b>'; else $account_vip_status = '<b><font color="green">Vip Account, '.$account_logged->getVipDays().' days left</font></b>'; Depois de: <td class="LabelV" >Account Status:</td><td>'.$account_status.'</td></tr><tr style="background-color:'.$config['site']['darkborder'].';" > Adicione: <td class="LabelV" >Account Vip Status:</td><td>'.$account_vip_status.'</td></tr><tr style="background-color:'.$config['site']['darkborder'].';" > pot/OTS_Account.php Substitua: private $data = array('email' => '', 'blocked' => false, 'rlname' => '','location' => '','page_access' => 0,'lastday' => 0,'premdays' => 0, 'created' => 0); Por: private $data = array('email' => '', 'blocked' => false, 'rlname' => '','location' => '','page_access' => 0,'lastday' => 0,'premdays' => 0, 'created' => 0, 'viptime' => 0); Substitua: $this->data = $this->db->query('SELECT ' . $this->db->fieldName('id') . ', ' . $this->db->fieldName('name') . ', ' . $this->db->fieldName('password') . ', ' . $this->db->fieldName('email') . ', ' . $this->db->fieldName('blocked') . ', ' . $this->db->fieldName('rlname') . ', ' . $this->db->fieldName('location') . ', ' . $this->db->fieldName('page_access') . ', ' . $this->db->fieldName('premdays') . ', ' . $this->db->fieldName('lastday') . ', ' . $this->db->fieldName('created') . ' FROM ' . $this->db->tableName('accounts') . ' WHERE ' . $this->db->fieldName('id') . ' = ' . (int) $id)->fetch(); Por: $this->data = $this->db->query('SELECT ' . $this->db->fieldName('id') . ', ' . $this->db->fieldName('name') . ', ' . $this->db->fieldName('password') . ', ' . $this->db->fieldName('email') . ', ' . $this->db->fieldName('blocked') . ', ' . $this->db->fieldName('rlname') . ', ' . $this->db->fieldName('location') . ', ' . $this->db->fieldName('page_access') . ', ' . $this->db->fieldName('premdays') . ', ' . $this->db->fieldName('viptime') . ', ' . $this->db->fieldName('lastday') . ', ' . $this->db->fieldName('created') . ' FROM ' . $this->db->tableName('accounts') . ' WHERE ' . $this->db->fieldName('id') . ' = ' . (int) $id)->fetch(); Substitua: $this->db->query('UPDATE ' . $this->db->tableName('accounts') . ' SET ' . $this->db->fieldName('password') . ' = ' . $this->db->quote($this->data['password']) . ', ' . $this->db->fieldName('email') . ' = ' . $this->db->quote($this->data['email']) . ', ' . $this->db->fieldName('blocked') . ' = ' . (int) $this->data['blocked'] . ', ' . $this->db->fieldName('rlname') . ' = ' . $this->db->quote($this->data['rlname']) . ', ' . $this->db->fieldName('location') . ' = ' . $this->db->quote($this->data['location']) . ', ' . $this->db->fieldName('page_access') . ' = ' . (int) $this->data['page_access'] . ', ' . $this->db->fieldName('premdays') . ' = ' . (int) $this->data['premdays'] . ', ' . $this->db->fieldName('lastday') . ' = ' . (int) $this->data['lastday'] . ' WHERE ' . $this->db->fieldName('id') . ' = ' . $this->data['id']); Por: $this->db->query('UPDATE ' . $this->db->tableName('accounts') . ' SET ' . $this->db->fieldName('password') . ' = ' . $this->db->quote($this->data['password']) . ', ' . $this->db->fieldName('email') . ' = ' . $this->db->quote($this->data['email']) . ', ' . $this->db->fieldName('blocked') . ' = ' . (int) $this->data['blocked'] . ', ' . $this->db->fieldName('rlname') . ' = ' . $this->db->quote($this->data['rlname']) . ', ' . $this->db->fieldName('location') . ' = ' . $this->db->quote($this->data['location']) . ', ' . $this->db->fieldName('page_access') . ' = ' . (int) $this->data['page_access'] . ', ' . $this->db->fieldName('premdays') . ' = ' . (int) $this->data['premdays'] . ', ' . $this->db->fieldName('viptime') . ' = ' . (int) $this->data['viptime'] . ', ' . $this->db->fieldName('lastday') . ' = ' . (int) $this->data['lastday'] . ' WHERE ' . $this->db->fieldName('id') . ' = ' . $this->data['id']); Depois de: public function getPremDays() { if( !isset($this->data['premdays']) || !isset($this->data['lastday']) ) { throw new E_OTS_NotLoaded(); } return $this->data['premdays'] - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->data['lastday']))) - date("z", $this->data['lastday'])); } Adicione: public function getVipDays() { if( !isset($this->data['viptime']) || !isset($this->data['lastday']) ) { throw new E_OTS_NotLoaded(); } return ceil(($this->data['viptime'] - time()) / (24*60*60)); } Depois de: public function isPremium() { return ($this->data['premdays'] - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->data['lastday']))) - date("z", $this->data['lastday'])) > 0); } Adicione: public function isVip() { return ceil(($this->data['viptime'] - time()) / (24*60*60)) > 0; } characters.php Substitua: if($config['site']['show_vip_status']) { $id = $player->getCustomField("id"); if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD WIDTH=10%>Vip Status:</TD>'; $vip = $SQL->query('SELECT * FROM player_storage WHERE player_id = '.$id.' AND `key` = '.$config['site']['show_vip_storage'].';')->fetch(); if($vip == false) { $main_content .= '<TD><span class="red"><B>NOT VIP</B></TD></TR>'; } else { $main_content .= '<TD><span class="green"><B>VIP</B></TD></TR>'; } $comment = $player->getComment(); $newlines = array("\r\n", "\n", "\r"); $comment_with_lines = str_replace($newlines, '<br />', $comment, $count); if($count < 50) $comment = $comment_with_lines; if(!empty($comment)) { if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD VALIGN=top>Comment:</TD><TD>'.$comment.'</TD></TR>'; } } Por: if($config['site']['show_vip_status']) { $id = $player->getCustomField("id"); if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD WIDTH=10%>Account Vip Status:</TD>'; if(!$account->isVip()) { $main_content .= '<TD><span class="red"><B>NOT VIP</B></TD></TR>'; } else { $main_content .= '<TD><span class="green"><B>VIP</B></TD></TR>'; } $comment = $player->getComment(); $newlines = array("\r\n", "\n", "\r"); $comment_with_lines = str_replace($newlines, '<br />', $comment, $count); if($count < 50) $comment = $comment_with_lines; if(!empty($comment)) { if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD VALIGN=top>Comment:</TD><TD>'.$comment.'</TD></TR>'; } } shopsystem.php (+Créditos ao GM Bekman) Substitua: if($buy_offer['type'] == 'pacc') { $player_premdays = $buy_player_account->getCustomField('premdays'); $player_lastlogin = $buy_player_account->getCustomField('lastday'); $save_transaction = 'INSERT INTO '.$SQL->tableName('z_shop_history_pacc').' (id, to_name, to_account, from_nick, from_account, price, pacc_days, trans_state, trans_start, trans_real) VALUES (NULL, '.$SQL->quote($buy_player->getName()).', '.$SQL->quote($buy_player_account->getId()).', '.$SQL->quote($buy_from).', '.$SQL->quote($account_logged->getId()).', '.$SQL->quote($buy_offer['points']).', '.$SQL->quote($buy_offer['days']).', \'realized\', '.$SQL->quote(time()).', '.$SQL->quote(time()).');'; $SQL->query($save_transaction); $buy_player_account->setCustomField('premdays', $player_premdays+$buy_offer['days']); $account_logged->setCustomField('premium_points', $user_premium_points-$buy_offer['points']); $user_premium_points = $user_premium_points - $buy_offer['points']; if($player_premdays == 0) { $buy_player_account->setCustomField('lastday', time()); } $main_content .= '<h2>PACC added!</h2><b>'.$buy_offer['days'].' days</b> of Premium Account added to account of player <b>'.$buy_player->getName().'</b> for <b>'.$buy_offer['points'].' premium points</b> from your account.<br />Now you have <b>'.$user_premium_points.' premium points</b>.<br /><a href="index.php?subtopic=shopsystem">GO TO MAIN SHOP SITE</a>'; } Por: if($buy_offer['type'] == 'pacc') { $player_viptime = $buy_player_account->getCustomField('viptime'); $player_lastlogin = $buy_player_account->getCustomField('lastday'); $save_transaction = 'INSERT INTO '.$SQL->tableName('z_shop_history_pacc').' (id, to_name, to_account, from_nick, from_account, price, pacc_days, trans_state, trans_start, trans_real) VALUES (NULL, '.$SQL->quote($buy_player->getName()).', '.$SQL->quote($buy_player_account->getId()).', '.$SQL->quote($buy_from).', '.$SQL->quote($account_logged->getId()).', '.$SQL->quote($buy_offer['points']).', '.$SQL->quote($buy_offer['days']).', \'realized\', '.$SQL->quote(time()).', '.$SQL->quote(time()).');'; $SQL->query($save_transaction); if($player_viptime > 0) $buy_player_account->setCustomField('viptime', $player_viptime + ($buy_offer['days'] * 24 * 60 * 60)); else $buy_player_account->setCustomField('viptime', time() + ($buy_offer['days'] * 24 * 60 * 60)); $account_logged->setCustomField('premium_points', $user_premium_points-$buy_offer['points']); $user_premium_points = $user_premium_points - $buy_offer['points']; if($player_viptime == 0) { $buy_player_account->setCustomField('lastday', time()); } $main_content .= '<h2>VIP Days added!</h2><b>'.$buy_offer['days'].' days</b> of Vip Account added to account of player <b>'.$buy_player->getName().'</b> for <b>'.$buy_offer['points'].' premium points</b> from your account.<br />Now you have <b>'.$user_premium_points.' premium points</b>.<br /><a href="index.php?subtopic=shopsystem">GO TO MAIN SHOP SITE</a>'; } Links Úteis 01- [Gesior Acc] Vendedo Vip Pelo Pacc Créditos: GM Bekman 02- Double Exp Para Vip Créditos: Vodkart 03- Outfits Só Para Jogadores Vips Créditos: Vodkart1 ponto
-
OtClient - Tutorial Básico #1
TkZeCo reagiu a BananaFight por um tópico no fórum
OtClient - Tutorial Básico #1 Aula 1 : Editando mod/Modules Bom galera, hoje eu vou ensinar vocês a como editar mod/Modules, e também como posiciona-los na janela. OBS: Quando eu falar Janela, estou me referindo aos objetos: MainWindow, Botton etc Passo 1 entendendo os arquivos Dentro da maioria das pasta no OtClient existirão 3 arquivos com as seguintes extensões: .lua.otmod.otui Cada uma dessas extensões executam um papel EXTREMAMENTE importante dentro do mod/module que você pretende criar, Mais será explicado mais para a frente, Nessa aula vamos mexer apenas no arquivo ".otui". Passo 2 Indentação Uma das coisas mais importante dentro dos arquivos ".otui" é a indentação, pois se você errar um espaçamento qualquer você pode estar 'bugando' todo o funcionamento da sua mod/module. Vou ensinar a vocês o modo certo de indentar seus códigos para que não tenham erros. MainWindowid: tutorialWindowsize: 80 80&save: true Dentro dos arquivos '.otui' só é permitido a indentação com a tecla "Espaço", Caso você tente usar "Tab" para indentar seu código ele vai dar erro e não irá funcionar. A indentação deve ser feita com apenas 2 espaços, e sempre seguindo a ordem do item que você ta criando. Exemplo: MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Como o Botão 'Button1' vai ficar dentro da janela ' tutorialWindow', ele tem que ficar a uma distancia de 2 espaços da janela 'MainWindow', Caso eu quebre esse espaçamento provavelmente poderei ter bugs na hora de abrir esse mod/module dentro do client. Outra coisa para tomar cuidado é quando for dar linha para adicionar outra janela, nessa linha em que separa uma janela não pode conter nem um espaço e nenhum comando. Exemplo: Certo MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Errado MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Vocês não conseguem ver a diferença, mais tente selecionar os dois códigos que vão entender melhor, o que eu falei. Agora a organização e edição de cada janela dentro do arquivo '.otui' deve seguir o mesmo principio de 2 espaços de distancia. Exemplo: Certo MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Errado MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 E também esta Errado desta forma MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Como o botão vai aparecer dentro da janela 'MainWindow' ele tem que ficar a 2 espaçamento dela pois se eu deixar os 2 na mesma posição é como se eu estivesse dizendo ao script que são duas janelas separadas e o botton vai aparecer por conta própria quando eu executar o mod/module. Passo 3 conhecendo as janelas Existem diversos modos de se criar uma janela onde vai aparecer vários botoes textos e etc, Mais sempre vai ter uma janela que será a matriz de todos, onde todos deverão aparecer, que no nosso exemplo é : MainWindowid: tutorialWindowsize: 80 80&save: true Esse código é nossa janela principal, É nela que vai aparecer tudo que queremos mostrar com no script, Agora vou mostrar o que cada função que tem dentro de MainWindow faz. MainWindowid: esse é o ID do MainWindow, Supondo que tenham 2 MainWindow, é com esse id que vamos diferencia-lassize: aqui é onde configuramos a largura e altura da janela, nessesariamente nessa ordem&save: isso fica para as próximas aulas Não precisamos usar necessariamente size para mostrar o tamanho ou largura da janela, podemos utilizar por exemplo : width: 80height: 80 Esses 2 códigos podem ser utilizados no lugar de size e farão exatamente a mesma coisa. Caso você tenha editado ou criado algum mod/modules para testar esses códigos que mostrei acima, percebeu que na janela não aparece nome e nem nada do gênero e é isso que irei mostrar agora. !text: tr('Texto') - Essa função adiciona o texto na janela em que você adicionar esta linhaicon: img.png - Esta função pega a sua imagem e usa ela de icone para a janela ( neste caso a imagem tem que estar na mesma pasta que o arquivo '.otui', e isso só irá funcionar dependendo do tipo da janela matriz, veremos em outros tutoriais.) Com esses dois Código você consegue personalizar a janela onde irão aparecer os botoes, textos etc que você pretende fazer. Exemplo: MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: true Agora vamos começar a criar botoes, escrever textos e etc. Vamos começar adicionando uma Label que vai mostrar o texto 'Olá Xtibia'. MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftmargin-top: 5margin-left: 5 Como vocês podem ver apareceram algumas funções novas, que são elas : anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomanchors.top: prev.topanchors.left: prev.leftanchors.right: prev.rightanchors.bottom: prev.bottommargin-top: 5margin-left: 5margin-right: 5margin-bottom: 5 Com essas funões nós determinamos onde cada item da nossa janela vai ficar. Entendendo as novas funções anchors.top: parent.top Com a linha 'anchors.top:' estamos dizendo que a posição do meu item vai ser definida para cima, agora adicionando 'parent.top' estamos dizendo que a posição do meu item deve se Colada com começo da Janela, e isso segue para left, right, bottom também. agora se no lugar de 'parent.top' eu usar 'prev.top' eu estou dizendo que meu item vai ficar colado com a parte de cima do item que tem encima, Confuso eu sei mais vou dar um exemplo: MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.left Ali no script acima eu estou mandando a Label1 ficar colada com a borda de cima da janela principal, e a esquerda, Já na Label2, eu estou mando ela ficar colada com a Label1 ( pois a label1 que esta encima ) e também ficar colada com a borda da janela principal. Isso se aplica a todos os lados, se eu usar prev.left, eu vou estar dizendo que a label2 tem que ficar exatamente do lado esquerdo da label1. As funções 'margin-top: 5' vão fazer com que meu item fique com a distancia de 5 pixel ( Não tenho certeza se são pixels ) do item que esta acima MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5 Nesse Exemplo eu fiz a label2 ficar a 5 pixel abaixo da Label1, e isso é a mesma coisa se eu ultilizar left, right, bottom eu vou pegar uma distancia do que estiver do lado do meu item ou embaixo etc. Mais agora nós não precisamos nos prender a ficar somente com parent, e prev na hora de criar um item. podemos utilizar o id de um item como referencia de onde deve ficar meu item, como no exemplo : MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: parent.topanchors.left: Label1.left Nesse Exemplo eu fiz com que a Label3 ficasse a esquerda da Label1, e grudada a margem da janela principal, mais eu também poderia fazer ela ficar embaixo da Label1, e grudada ao lado direito da margem da janela principal. MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.topanchors.right: parent.right Mais caso você for testar isso vai perceber que o Label2 vai ficar encima do Label1 e ao invés do Label3 ficar embaixo do Label1 ele vai ficar do lado, Para corrigir esses pequenos erros você pode juntar códigos como no exemplo : MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.bottomanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.bottomanchors.right: parent.right Pelo Simples fato de eu ter trocado top por bottom agora o script sabe que a Label2 tem que ficar no fim da Label1 e o mesmo para a Label3, e por isso usamos margin, para deixa uma distancia entre cada item, e para ficar mais organizado. Bom acho que é isso, Caso eu lembre de algo relevante estarei editando e adicionando mais coisas, Espero que gostem e quais quer DUVIDAS relacionadas AO TÓPICO é só fazer um comentário aqui embaixo que estarei respondendo. @Edit, Infelizmente o Xtibia Quebrou a indentação, mais lembre-se é sempre 2 espaços.1 ponto -
[9.83] Alissow OTS 5.0! [17 / 03 / 2013]
jeanflamengo reagiu a Alissow por um tópico no fórum
Alissow OTS 5.0!!!!! [17/03/ 2013] Provavelmente vocês estão pensando "mas que diabo de OTS é esse?", afinal, já faz 2 anos desde que a ultima versão foi lançada (http://www.xtibia.co...10-86-completo/) e desde lá prometemos algo que não foi cumprido - até agora -, uma versão nova. ENFIM, TEMOS AGORA A MAIS NOVA VERSÃO DE UM DOS SERVIDORES MAIS AVACALHADOS JOGADOS DOS ULTIMOS TEMPOS. Mas eu tenho uma má noticia, está incompleto. Sim, o mapa está inacabado. Muitas coisas que eu planejei fazer nele eu não completei. Boa parte o Comedinha ajudou a terminar, adicionando o resto dos caminhos básicos e os monstros. mas mapa inacabado não quer dizer que não está jogável, quer dizer que faltou detalhar (Ex: x:55 y: 137 z: 9, x: 104 y: 140 z: 7, etc). A ultima versão foi baixada mais de 50 mil vezes e esperamos que essa versão faça o mesmo sucesso. VAMOS BAIXAR E JOGAR, SEUS LINDOS Créditos Gerais: Sobre o OT/Mapa: Principais quests: -Annihilator -Inquisition Quest -Pits of inferno -Demon Oak -Solar axe quest -HOTA -MPA quest -The Challenger Monstros: -Total monstros: 10292 -Total spawn: 5587+ Cidades: -12 Cidades -200 Houses+- Raids/Invasões: -Rat -Orshabaal -Ghazbaran -Giant spider/The old window -Ferumbras -Morgaroth Spells: -Magias editadas para balanceamento das vocações Changelog Atualização [3.4 BETA]: Atualização nº 2 [3.4]: Atualização 3.5 [06/08/2009]: Atualização Patch 3.5.1 [07/08/2009]: Atualização 3.6 [10/08/2009]: Atualização 3.7! Beta [18/12/2009]: Atualização 3.7 Patch 1 [27/12/2009]: Atualização 3.8 [17/01/2010]: Atualização 3.8 Minor Patch 1 [17/01/2010]: Atualização 3.9 [15/02/2010]: Atualização 4.0 [15/02/2010]: Atualização 4.11! [11/07/2010]: Atualização 5.0!!!!! [17/03/2013] - Atualizado para a versão 9.83 (Comedinhasss, Tfs Team) - Sistemas novos para a nova versão, montaria, war system, etc. (Comedinhasss, Tfs Team) - Rep System e Antbot Removido. (Comedinhasss) - 64 Quests reformuladas. (Comedinhasss/Alissow) - Novo sistema de dicas a cada 15 min. - (Comedinhasss) - Novo sistema de map marks ao entrar no servidor. (Comedinhasss) - Organização geral em Actions e Moveevents. (Comedinhasss) - Nova organização nos monstros agora usando os que não tem no tibia original na pasta monsters em mods. (Comedinhasss) - Npcs sem utilidade removidos (Comedinhasss) - Alavanca de runas e potions reformuladas (Comedinhasss, Alissow) - Bug PZ nas Hydras arrumado (Alissow) - Cidade principal parcialmente reformulada (Alissow) - Cidade de Flam totalmente reformulada (Alissow) - As lojas agora não são mais areas PZ (Alissow) - Corrigido erros em portas que não deveriam abrir, e portas que não deveriam fechar (Alissow) - Continente de Zao removido? (Alissow) - Arrumado bugs onde podia-se pegar items na ferumbras tower e vários outros lugares (Alissow) - Arrumado caminho da "inquisition" (Alissow) - Respawns recolocados em algumas áreas de yalahar, dragons, elfs Hydras, Dark magicians e apprentices (Alissow) - Nova entrada para arena (Svargrond) na cidade principal e funcionando! (Alissow) - Elevado nível de dificuldade da Arena (Svargrond) (Alissow) - Nova localização da Ferumbras Tower (Alissow) - Cidade de Mistyc removida (Alissow) - Novo sistema premium igual ao global. (Comedinhasss) - Sistema de bless reformulado e agora por items. (Comedinhasss) - Sistema de portais/teleports (Comedinhasss, Alissow) - Sistema offline training (Comedinhasss, TFS) - Sistema de casamento trocado (Comedinhasss, Outros) - Spells (OTX) Screenshots: Mais screenshots: Clique Aqui Download: Windows: http://www.mediafire...cap2yi5jee5e7an (Tam: 16MB) Linux (Debian): http://www.mediafire...5lu3476fd8jcnc8 (Tam: 7MB) Link Protegido Windows: http://lix.in/-d3c97c Link Protegido Linux (Debian): http://lix.in/-d5501d Scan Virus Total: https://www.virustot...sis/1363492837/ IP Changer: http://www.mediafire...6stsdskhljaa0c1 -Atenção- - Acc do God: admin/admin - LEIA o tópico antes de postar qualquer coisa ou duvida - Reportem se houver algum bug - Offline Train Level configurado no config.lua em levelToOfflineInBed - As estatuas de offline que ficam no templo não funcionam por serem enfeites - Para tirar o , previewer do nome, no config.lua em serverPreview mude para false - Todos os addons são vendidos menos o demon que o comedinha acabou esquecendo de coloca - Comandos personalizados: /ta - itens pro sv inteiro, /tp - locais do mapa, /p - tem na assinatura do comedinha ensinando, /e - abrir e fechar portal(open, close). - Para usar os portais você primeiro deve explorar a área indo até ela - Tem alguns segredinhos e lugares escondidos muito legais para vocês descobrirem - Favor, não usar o nosso distro sem o nosso consenso, obrigado. - Se você gostou, clique no ali embaixo ó1 ponto -
Auto loot system traduzido para o potugues
XXrodriXX reagiu a XkluivertX por um tópico no fórum
Ola galera tava sem fazer nada ai meu amigo pergunto se dava pra traduzir alguns scripts para portugues ai eu falei da sim ai ele me mando o auto loot system ai traduzir e resolvi postar aqui pra todos. 1:Va em Data/Talkactions/Scripts e crie um aquivo lua com nome de "aloot" e ponho isso dentro. 2: Va em Data/Talkactions e bote la na parte do playrs isso. Ei galera desculpa esqueci de por a parte de creaturescripts. 3: Va em Data/Creaturescripts/Scripts fala um arquivo lua com nome de aloot e ponha isso la dentro. 4: Va em creaturescripts.xml e ponha o seguinte tag: Se gostarem rep+1 ponto -
GTA San Andreas Server
92221066 reagiu a Animal Pak por um tópico no fórum
Informações: Mapa próprio; 40+ Quests; Arena PVP; Sistema de Armas; Sistema de Moto, Bicicleta, Carro, Skate; Todos Npcs configurados; Cada vocação tem suas próprias outfits; Jetpack; Todos os items com suas respectivas sprites; Sistema de WoE; Servidor 100% estável sem bugs e erros; Imagens: Download Server: http://www.mediafire.com/?z316hb4caj1ised Scan Server: https://www.virustotal.com/pt/file/876d75ad9a638c4c44c9e772b7cde60a5fb349f332c7cadb7c69a854f9d6e72f/analysis/1364336402/ Dowload Client: http://www.mediafire.com/?kzt230l0aihwh24 Scan Client: https://www.virustotal.com/pt/file/c18d1e7e73620ba8b21b72d455b24ffc393cb61fa4c67d69ed3f427beb41ee8f/analysis/1364336430/ Account do GOD: Account: 258536 Password: zxcvbnm123 Créditos: GTA OT Team Kalito BT SmoOkeR1 ponto -
Cap. 1: As Armas Nascido em Refor, Niklaus, filho de humanos, fora criado com espada e escudo. Aos 7 anos o levaram a um centro de treinamento de cavaleiros, futuro planejado por seus pais. Nesse centro Niklaus desenvolveu seu físico, estimulado a roubar alimentos e a sobreviver em condições horríveis. Carregando pedras grandes de um lado para o outro como seu principal trabalho, o menino permaneceu em arduo treinamento até os 13 anos de idade, até ser nomeado fiel escudeiro de Amaric. Amaric era um cavaleiro que passara a vida em batalhas e arenas. Inicialmente carregava os equipamentos e as mochilas das viagens. Como escudeiro de um cavaleiro, aprendeu a consertar amassados nas armaduras, afiar as espadas, negociar produtos nos bazares e estada nos hotéis de cidades desconhecidas. Durante 4 anos, Niklaus acompanhara o cavaleiro assistindo a inúmeros combates e treinando técnicas de combate, aprendidas quando Amaric e o escudeiro descansavam das longas viagens sob as sombra das árvores. Por muito tempo o cavaleiro se matenve invicto em suas batalhas, mas não eternamente. Certa vez, quando lutava em uma arena por 100 peças de ouro, fora atingido em seu ombro esquerdo com a espada de seu adversário, passando pela armadura leve que utilizava em combate. A dor impossibilitou o manejo de seu escudo, tornando-o vulnerável a maioria dos golpes. A luta acabou com a morte de Amaric. Quando o nobre cavaleiro morreu, Niklaus assumiu o seu lugar, sendo nomeado cavaleiro por Galahad, um dos amigos de Amaric. Galahad era muito rico e organizou a cerimônia da passagem da espada para nomear Niklaus. A cerimônia representou o início de aventuras do novo cavaleiro. Em certo momento, Galahad se colocou a frente dos convidados, e com sua espada tocou os ombros do escudeiro, que se encontrava ajoelhado ao pés de Amaric. Depois de muita festa e fartura, o jovem cavaleiro saiu à estrada atrás das próprias conquistas. Niklaus manejava suas armas muito bem. Estava bem treinado e preparado para participar de seu primeiro torneio. Inscreveu-se na primeira grande cidade que ficara, conhecendo assim muitas pessoas, principalmente as mulheres que enchiam os olhos de brilho ao verem as habilidades do cavaleiro. Feria-se muito pouco em batalhas, era focado na defesa. Obviamente que as cicatrizes não escaparam, mas isso eram apenas histórias para serem contadas. Com o tempo acabou decidindo se estabalecer em uma cidade chamada Welarian, do mesmo tamanho de Refor, sua cidade natal. Foi nesse local que encontrara o amor de sua vida, Selena. Selena, tecelã contratada para costurar as roupas que ficavam por baixo das armaduras de Niklaus (e frequentemente rasgadas pelas lâminas dos oponentes), apaixonou-se pelo cavaleiro. Um dia que voltara de uma batalha difícil, a tecelã ofereceu moradia, alimento e seu amor. Tempo depois se casaram e viveram com grande aconchego por três anos. Após esse tempo as riquezas do cavaleiro começaram a ficar inviáveis de serem gastas como antes. Niklaus decide voltar a viajar, mas era um mal momento, pois Selena estava grávida e exigia a presença do marido. O amor do cavaleiro o prende a Welarian, decidindo abandonar a espada e assumindo um emprego qualquer na cidade. Começou servindo mesas em uma taverna, mas acaba sendo localizado por um halfling, que desejava realizar uma encomenda. - Que tipo de encomenda? - Pergunta Niklaus ao pequenino. - A cabeça de um elfo. - A resposta espanta o humano. - Desejo vingança. - O halfling conta a história de sua vida, endividara-se e acabou virando um escravo por dívidas. As dívidas aumentaram e sem conseguir pagar, o elfo exilou o halfling em Welarian longe de sua família. Niklaus compreendeu os males feitos pelo elfo ao pequenino e aceitou realizar o trabalho por moedas de ouro, o que possibilitava ficar um bom tempo sem trabalhar com algo extremamente vergonhoso para um cavaleiro. O humano caça o elfo e o encontra numa cidade vizinha, escondido em um porão de uma casa, como o halfling indicara. Após o executar, entrega a cabeça para o halfling, que o paga como previsto. Alguns dias depois recebera outra oferta semelhante e o cavaleiro começa a participar de frequentes assassinatos, tomando gosto pelo seu novo título de justiceiro. O próximo movimento de Niklaus foi juntar-se a uma ordem de vingadores, trabalhando incansavelmente para diferentes raças, pelo mais alto valor. Mas os trabalhos começaram a exigir muita confiabilidade e já não poderiam ser realizados sozinhos. Niklaus começara a agir com um ladino, um arqueiro e um outro cavaleiro. Os quatros ficaram conhecidos como os “capa preta”, pois agiam sempre cobertos e silenciosos. Até que um dia, um mago vestido de um manto vermelho procurou os serviços do grupo. Eles ficaram responsáveis por acharem o sequestrador da filha do mago, que já se encontrava em local seguro, mas havia sido violentada. O grupo encontrou o sequestrador e o matou lentamente. Não sabiam exatamente com quem estavam lidando e o superior do sequestrador foi atrás de cada integrante dos “capa preta”. Na noite seguinte, quando Niklaus voltara de mais um trabalho, sua casa está toda bagunçada e com os móveis quebrados. Seu filho e sua mulher não se encontravam no quarto dormindo como de costume. O cavaleiro os chama e os procura em todos os cômodos, mas não os encontra. tempo verbal Então ele volta para a ordem dos vingadores e reune os mais bravos guerreiros presentes naquele momento. Eles varrem a cidade a procura de Selena e o do filho de Niklaus, mas não o encontram em lugar algum. Ficaram horas revirando a cidade silenciosa, procurando por pistas, mas nada. Quando Niklaus decide voltar para casa, sua porta está aberta e uma caixa de madeira se encontra no meio de sua sala. Quando ele a abre, são partes dos corpos de seu filho e sua mulher. Niklaus se descontrola e chora como uma criança. Reza e implora a Banzer, deus da guerra, oferecendo sua alma. em troca de vingança? O deus o responde, entregando-lhe o poder de encantar armas e um contrato que deveria ser cumprido, caso contrário, a morte o esperava. Encantando sua espada longa, o humano parte em busca de quem matara seu filho e sua mulher. Niklaus segue pela mais longa busca de sua vida, sem saber pelo que o esperava. Quase um ano depois Niklaus encontrara o assassino de seus entes aterrorizando uma cidade. O assassino o reconhece e o desafia. Em um golpe seis homens caem mortos, inclusive aquele que esquartejara os amores do cavaleiro. Em seguida Niklaus cumpre o contrato e seus afazeres. Depois da última missão do contrato, uma transformação ocorre. O humano ganha asas e passe livre ao quinto plano. Chengando a Penten, o novo anjo recebe muitas outras tarefas do deus da guerra. O anjo realiza inúmeras tarefas, até que se depara com o comandante da sociedade oculta de assassinos, a mesma a qual pertencia o esquartejador. O anjo pede permissão a Banzer para executar o comandante, mas lhe é negada. Niklaus acaba se revoltando e cansado de seguir ordens resolve agir. Em uma das vezes que o anjo fora mandado para vigiar um dos reinos medievais, enfeitiçara uma arma que estava sendo forjada por um anão. A arma se tornara um equipamento mágico dotado de um poder angelical e entregue a quem a encomendou - não tendo ideia de suas habilidades. Logo depois, Niklaus pensou em enfeitiçar diferentes armas e assim o fez. Esperarava uma guerra acontecer, provando aos seus superiores que as raças não poderiam ser civilizadas pois eram ambiciosas demais. Queria mostrar que os deuses falharam em suas missões, chegando assim o fim dos tempos. Migrou para os outros 6 reinos e enfeitiçou mais 6 armas. Essas armas eram extraordinárias e escondiam uma habilidade mágica dentro delas. Além de extremamente fortes e efetivas contra qualquer tipo de ser, elas liberavam um dom extremamente perigoso a quem a possuísse, podendo alterar a índole de quem a tocasse. O problema estava cravado: diferentes guerreiros de diferentes raças acabaram por possuir essas armas e uma grande guerra se estabeleceu. Cada um por si: elfos, anões, humanos, halflings, meio-orcs e gnomos. Algumas vezes alianças surgiam, mas nunca duravam mais do que meses. Todos lutaram incansavelmente até Banzer notar o que desencadeara a guerra. As armas enfeitiçadas usadas em combate eram muito poderosas e matavam mais de 10 guerreiros em um só golpe. A guerra assumiu uma proporção mundial e Niklaus, enviado para garantir a ordem dos reinos, não estava interferindo e realizando suas devidas ações. Banzer começara a interrogar o anjo, mas antes que o deus acessasse sua memória, Niklaus se sacrificou de modo a garantir o sigilo dos poderes das armas. A alma do anjo foi excluída de todos os planos. O deus da guerra ficou extremamente encabulado e confuso com o que acontecera e comunicou diretamente Mier. Concluiu-se que o poder fornecido aos anjos era demasiado. Os deuses passaram a desconfiar dos anjos e sentiram medo de outros agirem como Niklaus. Assim findou-se os contratos entre deuses e anjos. Com medo de uma revolução entre os anjos, os deuses não excluiram nenhum deles. Os deuses mais próximos de Mier foram encarregados de localizar as armas, mas os mesmos apenas se progetavam no terceiro plano e não poderiam se infiltrar entres os seres de Ihoê para se apoderarem das armas. Mais uma vez os anjos foram submetidos a uma missão: encontrarem as armas, tirar das posses dos humanos e levá-las para Penten. Os anjos se espalharam pelo terceiro plano e nunca acontecera tamanha concentração de seres angelicais em uma mesma era. Em pouco tempo as armas foram encontradas na posse de dois elfos, um halfling, um anão, um humano, um gnomo e um meio-orc. Estavam bem destribuídas e isso justifica o tempo de duração da guerra. Os anjos foram instruídos a realizarem um procedimento padrão. Todos esperaram aqueles que possuíam as armas ficarem sós para serem tomadas de seus donos. Alguns aguardaram eles adormecerem, mas as armas sempre ficavam de junto ao corpo dos combatentes. No momento em que as asas dos anjos se abriram para os senhores das armas, uma luz radiante ofuscou a visão de cada ser, cegando-os por um momento e as armas foram tomadas de seus donos. O que os deuses e os anjos não imaginavam eram os efeitos das armas sobre as criatruas angelicais: todos foram possuídos por um sentimento de incompatibilidade e sentiram-se pesados. Com pouco tempo de posse das armas encantadas, os anjos foram petrificados e muitos estavam no alto. O impacto espatifou os anjos em pedaços, menos as armas que ficaram espalhadas por todo mundo. Enquanto as armas estavam de posse dos combatentes dos exércitos, fácilmente foram dectadas, mas agora elas estavam espalhadas por uma imensidão sem fim, podendo estar entre pedras, em cima das árvores, no fundo de um lago, no telhado de uma casa ou dentro de um vulcão. A grande guerra terminou depois de 200 longos anos de batalha e esse foi o marco para o início de muitos calendários. As diferentes raças resolveram os assuntos pendentes com diversos tratados e acordos. Algumas rixas ainda não resolvidas criaram desconforto na convivência de certas civilizações, isso justifica a dominação dos elfos, humanos e anões dentre os reinos. Créditos: Vítor Amaral1 ponto
-
Como o próprio titulo lá diz, cada vocação terá sua(s) próprias outfits, o sistema foi aperfeiçoado para ficar mais fácil de configurar. em data> creaturescript > script vocouts.lua function onLogin(cid) registerCreatureEvent(cid, "OutfitClass") return true end function onOutfit(cid, old, current) local class = { [1] = {[0] = {136, 140}, [1] = {128, 132}}, -- citizen, nobleman [2] = {[0] = {136, 138}, [1] = {128, 130}}, -- citizen, mage [3] = {[0] = {136, 137}, [1] = {128, 129}}, -- citizen, hunter [4] = {[0] = {136, 139}, [1] = {128, 131}}, -- citizen, knight [5] = {[0] = {136, 140, 141, 158}, [1] = {128, 132, 133, 154}}, -- citizen, nobleman, summoner e shaman [6] = {[0] = {136, 138, 148, 149}, [1] = {128, 130, 144, 145}}, -- citizen, mage, druid e wizard [7] = {[0] = {136, 137, 156, 155}, [1] = {128, 129, 152, 151}}, -- citizen, hunter, assassin e pirate [8] = {[0] = {136, 139, 142, 147}, [1] = {128, 131, 134, 143}} -- citizen, knight, warrior e barbarian } if getPlayerAccess(cid) > 2 then return true end local outfits = class[getPlayerVocation(cid)][getPlayerSex(cid)] return isInArray(outfits, current.lookType) and true or doPlayerSendCancel(cid, "você não tem vocação para usar essa outfit.") and false end creaturescript.xml <event type="login" name="LoginClass" event="script" value="vocouts.lua"/> <event type="outfit" name="OutfitClass" event="script" value="vocouts.lua"/> explicando: os números entre os colchetes [] significa as vocations, caso você não sabe os ID das voc abre o spoiler: agora os números [0] e [1] significam o sexo do jogador, para female é [0] e para male é [1], onde cada um tem sua outfit. exemplo sorcerer: [1] = { -- vocation sorcerer[0] = {136, 140}, -- outfits female citizen e nobleman [1] = {128, 132}} -- outfits male citizen e nobleman } basta adicionar entre as chaves {} as id das outfits que cada vocação poderá usar. qualquer dúvida só postar.1 ponto
-
A questão é que os cavaleiros na idade medieval treinavam com seus escudeiros e ele aprendeu a lutar muito bem. Niklaus é sim com base no nome de TVD, mas só dei pq minha namorada pediu hahaha. Na verdade não conheço a história do God of War, pode ter ficado parecida, mas não tirei ideias de lá. Posso pensar em até reformular. Sim, o Niklaus fez as armas encantadas... e o efeito de petrificar foi ele quem colocou, mas isso só é revelado como acontece mais pra frente. Existe um pq. Na verdade não foi ele exatamente quem colocou, é uma consequência... tb explicada em outro capítulo, mas acredito que só revelado InGame.1 ponto
-
Ékz World Server
BananaFight reagiu a Insaend por uma questão
Que tal essa reforma? PS: alguns dos temas citados ai não tem esse tamanho de corpo então logo o monstro e bem menor! PINTEM1 ponto -
tem que adicionar no lib/configuration. Meu Articuno está assim: ["Articuno"] = {move1 = {name = "Quick Attack", level = 150, cd = 10, dist = 2, target = 1, f = 60, t = "normal"}, move2 = {name = "Ice Shards", level = 150, cd = 20, dist = 3, target = 1, f = 70, t = "ice"}, move3 = {name = "Whirlwind", level = 150, cd = 10, dist = 1, target = 0, f = 80, t = "flying"}, move4 = {name = "Icy Wind", level = 150, cd = 10, dist = 1, target = 0, f = 65, t = "ice"}, move5 = {name = "Wing Attack", level = 150, cd = 25, dist = 1, target = 0, f = 100, t = "flying"}, move6 = {name = "Ice Beam", level = 150, cd = 10, dist = 1, target = 0, f = 96, t = "ice"}, move7 = {name = "Aurora Beam", level = 150, cd = 20, dist = 1, target = 0, f = 130, t = "ice"}, move8 = {name = "Blizzard", level = 150, cd = 50, dist = 1, target = 0, f = 170, t = "ice"}, move9 = {name = "Tornado", level = 150, cd = 50, dist = 1, target = 0, f = 170, t = "flying"}, }, e xml do pokémon: <attacks> <attack name="melee" interval="2000" chance="100" range="1" min="-50" max="-100"/> <attack name="Quick Attack" interval="450" chance="5" range="1"/> <attack name="Ice Shards" interval="400" chance="10" range="6"/> <attack name="Aurora Beam" interval="1000" chance="9" range="5"/> <attack name="Whirlwind" interval="600" chance="6" range="5"/> <attack name="Ice Beam" interval="1000" chance="9" range="5"/> <attack name="Icy Wind" interval="450" chance="5" range="4"/> <attack name="Tornado" interval="1000" chance="8" range="6"/> <attack name="Blizzard" interval="1000" chance="8" range="6"/> </attacks> Acho que é só isso1 ponto
-
Push igual de ot 9.7
HatakeeKakashi reagiu a Luquinh4 por uma questão
ok,xd mas explica ai po n entendi oq vc realmente quer tenho essa também que peguei do meu ot 9.71 ponto -
[Encerrado] Exori gran ico
shuzin reagiu a mkbrabsolute por um tópico no fórum
KKKKK! Ignore /\ Quanto menor a numeração menor o hit, pela exp do seu servidor vejo que não está mal o hit mas altere para local levelTotal, formula = level / 9, 0.3436 POR: local levelTotal, formula = level / 7, 0.13211 ponto -
[Arquivado]O Que você acha interessante/atrativo ou gostaria de vêr em um OTserv 8.60?
paulohenriquesouza reagiu a Piabeta Kun por um tópico no fórum
no fim niguem se importa mesmo com isso, jogador de tibia so quer tacar bot e matar dl ou abrir 10 mcs e matar 1 player e falar que é foda, não importa o que voce inove pouquissimos notam o seu trablho e veem seu esforço ainda mais servidores 8.60 que ja estão no fim (globais), 8.60 nao tem mobilidade quase nenhuma pra inovar e mesmo assim 0,1% notam e 0,001 gostam!1 ponto -
void Game::useWith(const ItemPtr& item, const ThingPtr& toThing) { if(!canPerformGameAction() || !item || !toThing) return; Position pos = item->getPosition(); if(!pos.isValid()) // virtual item pos = Position(0xFFFF, 0, 0); // means that is a item in inventory if(toThing->isCreature()) m_protocolGame->sendUseOnCreature(pos, item->getId(), item->getStackPos(), toThing->getId()); else m_protocolGame->sendUseItemWith(pos, item->getId(), item->getStackPos(), toThing->getPosition(), toThing->getId(), toThing->getStackPos()); } Caso seja criatura, ele envia outro pacote, ou seja, players com lag ainda conseguiriam acertar caso cliquem em uma criatura. Para atingir o que você quer, uma opção é tirar o sendUseOnCreature.1 ponto
-
Erro meu :x local timeToCreate = 1 -- minutes local walls = { { x = 1092, y = 1065, z = 7, stackpos = STACKPOS_FIRST_ITEM_ABOVE_GROUNDTILE }, { x = 1092, y = 1066, z = 7, stackpos = STACKPOS_FIRST_ITEM_ABOVE_GROUNDTILE } } function removeWalls(item, position) doBroadcastMessage("Evento Exp Bug Fechara em 5 minutos.") addEvent(createWalls, timeToCreate * 300000) for i = 1, table.maxn(walls) do doRemoveItem(getThingfromPos(walls[i]).uid) doSendMagicEffect(walls[i], CONST_ME_MAGIC_RED) end return TRUE end function createWalls(item, position) for i = 1,table.maxn(walls) do doCreateItem(9533, 1, walls[i]) doSendMagicEffect(walls[i], CONST_ME_MAGIC_GREEN) end return TRUE end function onTimer() doBroadcastMessage("Evento Exp Bug comecara em 2 minutos CORRAM!!") addEvent(removeWalls, 120000) return TRUE end1 ponto
-
[Arquivado]O Que você acha interessante/atrativo ou gostaria de vêr em um OTserv 8.60?
drakylucas reagiu a PostadorHunter por um tópico no fórum
não parece1 ponto -
tente algo assim... PS: Ja avia gravado antes de você postar se não gostar do Post do video aqui e so falar que eu Edito!1 ponto
-
Avatar - Assinatura - Banner - Sign - Background -
Overpower reagiu a Alexclusive por uma questão
E como eu falei né cara.. não e nenhum personagem..e sim um MAPA! haha mesmo se eu juntar várias fotos de mapas suas não seu se ficaria legal.. Aqui chegado : Qualquer coisa só falar!1 ponto -
Auto loot system traduzido para o potugues
XhunterX reagiu a XkluivertX por um tópico no fórum
Se me puder fala o erro agradeço.1 ponto -
Pronto pra usar
AwakeGamer reagiu a lucashgas por um tópico no fórum
outra opcao bem rudimentar é voce deixar seu tibia.dat configurado com algum item diferente, que nao tenha no tibia comum. Ai é só colocar no piso do acc manager que quando o player entrar vai levar debug hahaha. O negócio é tenso, mas de primeira opção funciona haha1 ponto -
Poketibia Erondio-Site e Suas versões!
leandro600 reagiu a ErondinoSite por um tópico no fórum
ChuckNorris666 Estarei concertando. leandro600 gogo e vlw pelos elogios1 ponto -
[Narutibia] Spr,dat,pic Naruto Sky
narutomaniacos reagiu a Gabrieltxu por um tópico no fórum
Fala aew galera do Xtibia eu tinha um Projeto de narutibia e cansei e irei postar a SPR,DAT e PIC para vcs baixarem e fazer bom Proveito xD... Oq contem Nele? bom vou falar o basico que tem nele... Muitas Sprites de Voaçoes a muitas Sprites de Movimentos a Powers... Client 100% RPG Só algumas coisas do Tibia... Personagems com Grafikos melhores ... Umas ScrenShot: Img do Client: hehe isso é Tudo agora o Download: Download: http://www.mediafire...peaa26365so9hqa Scan: https://www.virustot...sis/1355087306/ Vlw galera Fikem Com deus de REP++ e Comentem ai Oq seis acharam vlw1 ponto -
Try this: data/creaturescripts/scripts/preventDrop.lua: local array = { PLAYERLOSS_CONTAINERS, PLAYERLOSS_ITEMS } function onPrepareDeath(cid, deathList) for i = 1, #array do doPlayerSetLossPercent(cid, array[i], 0) end return true end On creaturescripts.xml: <event type="prepareDeath" name="preventDrop" event="script" value="preventDrop.lua"/> And on creaturescripts/scripts/login.lua, the registration: registerCreatureEvent(cid, "preventDrop")1 ponto
-
Saiba Tudo Sobre Storage
narutomaniacos reagiu a caotic por um tópico no fórum
Bem iniciante de otserv tem duvidas do que e storage e estou aqui para resolver essa duvida. Mais afinal o que e STORAGE? Bem storage e uma função que guarda algum Valor (Numero ou Letras). A storage guardada fica na databse do seu otserv. Como posso usa-las? Para colocar uma storage no player basta usar essa função: Numero: setPlayerStorageValue(cid, 86784, 1) Letras: setPlayerStorageValue(cid, 86784, Letras) Os paramentos da storage que nos utilizamos: Cid == Player. 86784 == Que storage nos utilizamos para guardar. 1 e Letras(Exemplo 2) == O que esta na storage . Desta vez utilizamos a storage 86784 e guardamos o valor um 1 e no exemplo dois a palavra Letras. E ai como faz para verificar? Simples, usamos outra função que verifica a storage e da o valor que este guardado: getPlayerStorageValue(cid, 86784) Utilizamos dois paramentos para buscar a storage cid == Player 86784 == Onde o valor guardado da storage que queria verificar. Pronto agora que saiba usar storage pode utilizar em seus scripts.1 ponto -
[Arquivado]O Que você acha interessante/atrativo ou gostaria de vêr em um OTserv 8.60?
BananaFight reagiu a endreox por um tópico no fórum
não parece-1 pontos