Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 06/12/11 em %
-
Npc Criando Novos Monstros
LordOfSeian e 2 outros reagiu a Demonbholder por um tópico no fórum
Faaaala galera! Tudo bom? Desde ontem eu estou tentando fazer npc, foi bem chatinho de corrigir os bugs e etc. Enfim, o importante é que ele está pronto, e pelo que eu testei, não há nenhum bug comprometedor. Como funciona: Como é um npc, eu vou mostrar como pode ser a conversa: Jogador: Info Npc: Eu posso criar seu monstro, apenas diga criar e siga as instruções. Diga reset para recomeçar. Jogador: Criar Npc: Diga o nome do seu monstro. Lembre-se, é melhor ter tantos gps com você. Jogador [Nome do Monstro] Npc: O nome está correto, agora seleciona a raça para o seu monstro. A raça é o que vai definir os ataques e a aparencia do seu monstro, escolha entre: venom, undead, blood e fire. Jogador: [Venom ou Undead ou Blood ou Fire] Npc: A raça do seu monstro foi escolhida como [Raça escolhida], agora escolha a aparencia do seu monstro. Npc: A lista de aparencias é esta: [Lista de aparências para raça escolhida]. Jogador: [Nome do monstro da aparência] Npc: A aparencia do seu monstro foi escolhida, agora diga até 3 voses para seu monstro e para finalizar, diga fim. Jogador: [Voz] Npc: [Nada] Jogador: fim Npc: Parabéns! Seu monstro foi criado. Em breve ele poderá ser usado. Jogador: reset Npc: O sistema foi resetado para você. Feito, entenderam? Vamos ao npc... NPC local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} local info = {} 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) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local race = { ['venom'] = {['attacks'] = {1, 2}, ['looktype'] = {['slime'] = '<look type="19" head="20" body="30" legs="40" feet="50" corpse="1496"/>'}}, ['undead'] = {['attacks'] = {3, 4}, ['looktype'] = {['undead dragon'] = '<look type="231" corpse="6306"/>'}}, ['fire'] = {['attacks'] = {5, 6}, ['looktype'] = {['demon'] = '<look type="35" corpse="5995"/>'}}, ['blood'] = {['attacks'] = {7, 8}, ['looktype'] = {['vampire'] = '<look type="68" head="20" body="30" legs="40" feet="50" corpse="6006"/>'}} } local cost = 1000 -- custo para criar o monstro local one = FALSE -- um monstro por jogador? TRUE para sim e FALSE para não if talkState[talkUser] == nil and msg == "info" then selfSay("Eu posso criar seu monstro, apenas diga criar e siga as instruções. Diga reset para recomeçar.", cid) elseif talkState[talkUser] == nil and msg == "criar" then if getPlayerStorageValue(cid, 40000) == 1 and one == TRUE then selfSay("Você já criou seu monstro, não pode criar outro.", cid) else selfSay("Diga o nome do seu monstro. Lembre-se, é melhor ter " .. cost .. " gps com você.", cid) talkState[talkUser] = 0 return TRUE end elseif msg == "reset" then table.remove(info, table.find(info, cid)) selfSay("O sistema foi resetado para você.", cid) talkState[talkUser] = nil return TRUE end if talkState[talkUser] == 0 then if isValid(msg) then if monsterExist(msg) == FALSE then info["'" .. cid .. "'"] = {} table.insert(info["'" .. cid .. "'"], msg) talkState[talkUser] = 1 selfSay("O nome está correto, agora seleciona a raça para o seu monstro. A raça é o que vai definir os ataques e a aparencia do seu monstro, escolha entre: venom, undead, blood e fire.", cid) else selfSay("Desculpe, este monstro já existe.", cid) end else selfSay("Nome invalido.", cid) end elseif talkState[talkUser] == 1 then if race[msg] then table.insert(info["'" .. cid .. "'"], msg) talkState[talkUser] = 2 selfSay("A raça do seu monstro foi escolhida como " .. msg .. ", agora escolha a aparencia do seu monstro.", cid) selfSay("A lista de aparencias é esta: " .. getoutfit(race[info["'" .. cid .. "'"][2]]['looktype']) .. ".", cid) else selfSay("Esta raça não pode ser escolhida.", cid) end elseif talkState[talkUser] == 2 then if race[info["'" .. cid .. "'"][2]]['looktype'][msg] then talkState[talkUser] = 3 table.insert(info["'" .. cid .. "'"], race[info["'" .. cid .. "'"][2]]['looktype'][msg]) selfSay("A aparencia do seu monstro foi escolhida, agora diga até 3 voses para seu monstro e para finalizar, diga fim.", cid) else selfSay("Este outfit não pode ser escolhido.") end elseif talkState[talkUser] == 3 and msg ~= "fim" then if #info["'" .. cid .. "'"] == 3 or #info["'" .. cid .. "'"][4] < 3 then if #info["'" .. cid .. "'"] == 3 then info["'" .. cid .. "'"][4] = {} end table.insert(info["'" .. cid .. "'"][4], msg) else selfSay("Você já alcançou o máximo de voses.", cid) end elseif talkState[talkUser] == 3 and msg == "fim" then if doPlayerRemoveMoney(cid, cost) then table.insert(info["'" .. cid .. "'"], race[info["'" .. cid .. "'"][2]]['attacks']) doCreateMonsterIn(info["'" .. cid .. "'"]) talkState[talkUser] = nil setPlayerStorageValue(cid, 40000, 1) selfSay("Parabéns! Seu monstro foi criado. Em breve ele poderá ser usado.", cid) table.remove(info, table.find(info, cid)) else selfSay("Desculpe, você não tem dinheiro.", cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) function monsterExist(s) local info = io.open("data/monster/monsters.xml", "r") local re = info:read("*all") if string.find(string.lower(re), "'" .. string.lower(s) .. "'") or string.find(string.lower(re), '"' .. string.lower(s) .. '"') then return TRUE end return FALSE end function doCreateMonsterIn(tab) local attacks = { [1] = '<attack name="melee" interval="2000" skill="30" attack="35"/>', [2] = '<attack name="earth" interval="1000" chance="14" range="4" target="1" min="-100" max="-200"> <attribute key="areaEffect" value="plantattack"/> </attack>', [3] = '<attack name="melee" interval="2000" min="-0" max="-185"/>', [4] = '<attack name="lifedrain" interval="1000" chance="14" radius="4" target="0" min="-50" max="-225"> <attribute key="areaEffect" value="smallclouds"/> </attack>', [5] = '<attack name="melee" interval="2000" skill="30" attack="35"/>', [6] = '<attack name="fire" interval="1000" chance="11" range="7" radius="4" target="1" min="-150" max="-175"> <attribute key="shootEffect" value="fire"/> <attribute key="areaEffect" value="firearea"/> </attack>', [7] = '<attack name="melee" interval="2000" min="-50" max="-150"/>', [8] = '<attack name="energy" interval="1000" chance="14" range="7" min="-65" max="-175"> <attribute key="shootEffect" value="energy"/> </attack>' } local info = io.open("data/lib/model.txt", "r") local re = info:read("*all") local arquive = io.open("data/monster/" .. tab[1] .. ".xml", "w+") arquive:write(re) arquive:close() local arq = io.open("data/monster/" .. tab[1] .. ".xml", "r") local ri = arq:read("*all") local sub = string.gsub(ri, "-- NAME", tab[1]) local sub2 = string.gsub(sub, "-- RACE", tab[2]) local sub3 = string.gsub(sub2, "-- LOOK", tab[3]) local sub4, sub5 = nil, nil if #tab == 5 then for n, voice in pairs(tab[4]) do sub4 = sub4 and string.gsub(sub4, "-- VOICE" .. n, '<voice sentence="' .. voice .. '"/>') or string.gsub(sub3, "-- VOICE1", '<voice sentence="' .. voice .. '"/>') end end local fo = #tab == 5 and tab[5] or tab[4] sub4 = sub4 or sub3 for n, atid in pairs(fo) do sub5 = sub5 and string.gsub(sub5, "-- ATTACK" .. n, attacks[atid]) or string.gsub(sub4, "-- ATTACK1", attacks[atid]) end sub5 = sub5 or sub4 local file = io.open("data/monster/monsters.xml", "r") local re = file:read("*all") local new = io.open("data/monster/monsters.xml", "w+") local su, sub2 = string.gsub(re, '-- XML', '<monster name="' .. tab[1] .. '" file="' .. tab[1] .. '.xml"/>\n-- XML') new:write(su) local arquive = io.open("data/monster/" .. tab[1] .. ".xml", "w+") arquive:write(sub5) arquive:close() addEvent(doReloadInfo, 180 * 1000, RELOAD_MONSTERS) end function getoutfit(tab) local s = nil for opt, _ in pairs(tab) do s = s and s .. ", " .. opt or opt end return s end function isValid(msg) if #msg < 3 or #msg > 10 then return nil end for i = 1, #msg do if not(string.match(msg, "%a", i)) or (string.match(msg, "%a", i) ~= string.sub(msg, i, i) and string.match(msg, "%s", i) ~= string.sub(msg, i, i)) then return nil end end return TRUE end Feito isso, vá em data/lib, crie um arquivo chamado model.txt. Lib <?xml version="1.0" encoding="UTF-8"?> <monster name="-- NAME" nameDescription="a -- NAME" race="-- RACE" experience="0" speed="225" manacost="0"> <health now="3000" max="3000"/> -- LOOK <targetchange interval="5000" chance="0"/> <strategy attack="90" defense="10"/> <flags> <flag summonable="0"/> <flag attackable="1"/> <flag hostile="0"/> <flag illusionable="0"/> <flag convinceable="0"/> <flag pushable="0"/> <flag canpushitems="0"/> <flag canpushcreatures="0"/> <flag targetdistance="1"/> <flag staticattack="90"/> <flag runonhealth="0"/> </flags> <attacks> -- ATTACK1 -- ATTACK2 </attacks> <defenses armor="30" defense="35"/> <voices interval="10000" chance="10"> -- VOICE1 -- VOICE2 -- VOICE3 </voices> <loot> </loot> </monster> Por ultimo vá em data/monster, abra o arquivo monsters.xml e abaixo de <monsters> cole isto: -- XML Feito, o npc está instalado. O npc vai criar um novo monstro no otserv, todas as raças estão balanceadas. Depois de 3 minutos ele irá executar o reload para os monstros e o novo monstro estará disponível. Eu aconselho que apenas os mais experientes mudem o script, mas eu vou ensinar como adicionar mais looktypes para cada raça. Vá nesta tabela: local race = { ['venom'] = {['attacks'] = {1, 2}, ['looktype'] = {['slime'] = '<look type="19" head="20" body="30" legs="40" feet="50" corpse="1496"/>'}}, ['undead'] = {['attacks'] = {3, 4}, ['looktype'] = {['undead dragon'] = '<look type="231" corpse="6306"/>'}}, ['fire'] = {['attacks'] = {5, 6}, ['looktype'] = {['demon'] = '<look type="35" corpse="5995"/>'}}, ['blood'] = {['attacks'] = {7, 8}, ['looktype'] = {['vampire'] = '<look type="68" head="20" body="30" legs="40" feet="50" corpse="6006"/>'}} } Observe esta parte: {['slime'] = '<look type="19" head="20" body="30" legs="40" feet="50" corpse="1496"/>'} Agora, observe como poderia ser adicionada: {['slime'] = '<look type="19" head="20" body="30" legs="40" feet="50" corpse="1496"/>', ['wasp'] = '<look type="44" head="20" body="30" legs="40" feet="50" corpse="5989"/>'} E assim você pode adicionar quantas mais desejar. Video http://www.youtube.com/watch?v=Bmg37YQLJ00 -- Espero que gostem do npc, demorei bastante para fazer. Abraços. Se houver algum bug, por favor avisem.3 pontos -
Aqui Mophus Envia Uma Mensagem Privada À Linshun
Deprimido e 2 outros reagiu a Linshun por um tópico no fórum
where is your God now ?3 pontos -
Gesior Acc Maker 0.3.8 Modificado E Customizado
Luan Moreira e um outro reagiu a walefxavier por um tópico no fórum
Esta é uma versão do [GesiorAcc] ,um site completo e bem amplo ,com várias modificações e algumas novas funções,uma excelente opção para quem procura algo diferente ou pra quem está começando um servidor. O que há de novo? * Novos Estilos (Backgrounds,Buttons,Headers e Artworks.) * Pagina de download com Tibia 8.60, Ip Changer, HyperCam e Team Speaker. * Guild War System Customized (Scripts pegar na aba Tutoriais de WebSite) * Top 100 Killer do Servidor * Advanced Character Page (Traduzida ,bem formal e "Única".) * Who is Online? (Versão 0.3.8 modificada para adaptações em todos os servidores) * Trade System (Explicações no site e em PT) * Novo Support List * Addons Page (Com fotos,Premium Required,Male of Female e Itens necessários.) * Pagina Server Info (Modificada,bem simples e no jeito de colocar as informações do seu servidor.) * Novo Shop Offer com novo estilo (Preto e Amarelo) e as abas | Dias Vip | Itens a Venda | Outros | ! * Pagina Benefícios totalmente reformulada e muito simples para modificar. * Novo ! Pagina de Buypoints auto-explicativa...e semi-automática ! >> Leia Abaixo sobre << A pagina consiste em: O player escreve o nome do char e escolhe a quantidade de pontos que deseja comprar,clica em finalizar e é redirecionado para a página do pagseguro para terminar o pagamento. No pagseguro será mostrado o nome do char e a quantidade de pontos,assim,quando o pagamento for confirmado voce já saberá para quem os pontos devem ser entregues,não precisando mais de Confirmação de Pagamentos. Abaixo,veja algumas fotos das principais modificações: New Addons Page Pagina de Benefícios Pagina de Characters Customizada Pagina de Downloads Novo Estilo do Shop Offer Trade System Obs: 1° O site ja vai com alguns sistemas que necessitam das tabelas na sua database,como o War System,Trade System e o Top 100 Killer, então vou posta-las abaixo para que adicionem no SQL.(Quem não quiser utilizar os sistemas é so apagar as paginas ditas acima do layout.) Link das Tabelas 2° Em Htdocs/Config/Config.php , vá lá em baixo e coloque seu email pagseguro para o sistema de compra funcionar. 3° A página Houses não está a vista...mas está configurada para funcionar,quem quiser é so adiciona-la no Layout. *É isso ,por favor não postem erros de tabelas aqui,ja foi explicado acima que pode dar error por causa dos sistemas que estão nosite ,basta voce adicionar as tables que postei no download acima ou então apagar as paginas do layout ou do index.php ! Vlw Galera ! DOWNLOAD DO SITE SCAN DO SITE2 pontos -
Esse renato falo muita merda,do nada o mlk chega falando de quem trabalha na google ou não sei o que do gari! Cria vergonha nessa tua cara,a questão não é essa,é que o mophus e você também pelo menos ajudam aqui na comunidade diferente desse haxy que tenta trollar,fica criando tópicos como esse para que finalidade? critica? o último que pode criticar é esse lixo imprestável... Da licença né,ai vem fala de uma coisa nada a ver,como se tu fosse outro fodão quem sabe,não passa de outro nerd que fica atrás do pc se achando "o cara" flw2 pontos
-
Alissow OTs 4.11! Esta versão 4.11 foi meio apressada, só adicionamos as features novas do 8.6. Aproveitem. Créditos: Alissow Comedinha Luis Nirk TFS Team Viniply Xedegux 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]: - Removido áreas não usadas no mapa, diminuindo o tamanho em MBs - Adicionado Anti Magebomb System - Corrigido bugs no npc addon - Adicionado sistema onde os npcs falam sozinhos (Igual como foi adicionado no global). First ;] - Adicionado Elf village em Venonh ( bem parecida com a do global ;]) - Potions desaparecem quando usadas - Corrigido sistema de Up - Corrigido sistema de Monster Counter - Nova dragon lair em Mirand Theraan (Subsolo) - Adicionado porta de level, que protege leveis baixos acessarem os demons da cidade de Flam - Ampliado deserto da cidade de Mirand Theraan - Adicionado Ilha de Goroma - Adicionado Forbidden islands - Ampliado floresta da cidade de alfon e colocado área de macacos parecida com Banuta. - Ligação de alfon com Mirand Theraan - Corrigido bugs reportados nas portas das casas - Corrigido posição dos buracos e escadas - Adicionado beds em todas as casas - Corrigido bugs em casas de yalahar - Adicionado Blue legs quest ( Koshei The Deathless global) - Corrigidas quase todas as areas de Yalahar - Teleports em Yalahar substituidos por NPCs de teleport do global - Corrigido pequenos erros no npc Capitao Coruja, e adicionado viagem à goroma - diminuido ataque do Eye of the seven - Ice rapier agora quebra - Corrigido npc Banker - Adicionado quase todos os items 8.5 - Adicionado medusa - Adicionado Todos os outfits novos - Corrigido NPC Banker (que dava dinheiro) Script By Ta4e - Corrigido Annihilator Quest - Adicionado Notice System - Adicionado novo distro, compilado por Comedinha Atualização nº 2 [3.4]: Otserv atualizado... Corrigido debugs frequentes Corrigido debugs na magia exevo pan Corrigido bugs nos npcs Roy e Firewalker Adicionados mais novos items 8.5, agora temos 90% dos items novos... Atualização 3.5 [06/08/2009]: - Cidade principal (dorion) totalmente reformada - corrigido blue legs quest - Corrigido alavancas de compra de potions - Adicionado alavancas de compra de runas - Corrigido npc Bank - Adicionado NPC King Arthas, que vende promotion - Adicionado npc Rashid, que vende items. - Arrumado Wild Growth rune - Arrumado Utani Hur - Magias reajustadas - Novo estilo de server save - Ilha de mystic reformulada (by Nirk) - Adicionado nova magia para knights "Exkordium". - Adicionado nova magia para mages (promoted) "Exura Seil". - Adicionado nova magia para mages (promoted) "Exevo Gran Frigo". (arrumar -> sem exhausted nem gasta mana) - Adicionados novos monstros. - Adicionado quest challenge (lvl 250) - Corrigido bug do Dead Cyclops - Bug aol Arrumado - Poi Modificada - Corrigido teleports ghouls yalahar - Modificada demon helmet quest, assim como o premio da quest - Corrigido nome do Hallowed axe - Corrigido bug das houses - Corrigido bug dos items andaveis Atualização Patch 3.5.1 [07/08/2009]: - Corrigido erro na inicialização do Ot - Bug das potions corrigido - Bug do aol corrigido (pelomenos pra mim) - Bug dos outfits corrigido - Corrigido erros nas escadas na ilha PvP - O monstro The Fastest Turtle agora não morre, se tornando um monstro apenas para atrapalhar - Retirada suposta quest dos 3 hellhounds e 1 minishabaal - Adicionado teleport de retorno na Ferumbras Tower - Corrigido posições da raid de The old widow - Corrigido bug das escadas nas minas de demons - Corrigido alguns bugs vistos no mapa Atualização 3.6 [10/08/2009]: - Arrumado bugs criticos - Arrumado comando !promote/!demote - Atualizado Items.xml - Bug das Beds arrumado - Modificações na cidade, como, nature e caves - Nova sala de treino - Adicionado comando !highscores Atualização 3.7! Beta [18/12/2009]: - Guildhall support (Elf) - Nova deathlist(Elf, OpenTibia SVN) - Frags funcionando (Elf) - Atualizado monstros e items (slawkens, KaczooH, Elf) - Novas talkactions: /commands, /wp, /storage, /config, /promote & /demote. (slawkens) - Novas funções lua - Novos creatureevents (slawkens, Elf) - Novos configuráveis (Elf, slawkens) - Modificado ataque de monstros existentes (especialmente outfits e velocidade) (Elf) - Monstros reorganizados & atualizados (Nem todos) (slawkens) - Melhorado sistema de banimentos (Elf) - Reescrita janela de Rule Violation (Elf) - Arrumado Stamina (Elf, OpenTibia SVN) - Casas agora são salvas nas modificações do dono (Elf) - Escadas de yalahar funcionando perfeitamente (Elf, Talaturen) - Sistema de nado & waterball completo (slawkens) - Monstros invisiveis não são mais mandandos ao client (anti bot) (OpenTibia SVN) - Anti-dash (OpenTibia SVN) - Sistema de leilão de casas, possibilidade de usar site para vender casas (house_actions table) (OpenTibia SVN, Elf) - Salvando bot actions para /logs/bots por cada player. Por exemplo, bot pode enviar mensagem com mais de 255 caracteres (slawkens) - Novos raid events- item spawning & disappearing and more (Elf) - Modificações no NPC system (Elf) - NPCs OutfitModule (Elf) - Completo 8.53 support, com wars (Elf) - Completo 8.54 support (Elf) - Arrumado NPC voices (Elf) - Players serão informados quando o Gamemaster logar ou ficar invisivel (slawkens) - Arrumado Player Deaths (Elf, slawkens) - Arrumado Abuso de PZ (slawkens) - Portas agora não ajudam players a entrar em PZ (slawkens) - Magic level formula (OpenTibia SVN, KaczooH) - Memory leaks (Elf) - Queries optimization (Talaturen) - Janelas podem ser abertas do lado de fora da casa- agora apenas GMs podem fazer isso (slawkens) - arrumado Efeitos para o Ghost (GM)- configuravel (slawkens) - Corrigido >> Ghost debugging players (OpenTibia SVN, Elf) - Corrigido erro na promotion (Elf) - Corrigido vários erros no console. (slawkens) - Corrigido Spam de magias (Elf) - Corrigido stamina premium (Elf) - Corrigido Clean (Elf) - Corrigido vários outfits (Elf) - Corrigido Ghost (Elf) - Todas as correções no OpenTibia SVN (Open Tibia SVN, Elf) - Corrigido Todos os crashes possiveis (Elf) - Npcs Corrigidos (Comedinha) - Distro Reformulado (comedinha) - Bugs de reports arrumados (Comedinha) - Novos outfits (Alissow) - Actions Arrumadas (Comedinha) - Libs trocadas (Comedinha) - Talkactions bugadas arrumadas (Comedinha) - Reforma na área Sul da cidade Dorion (Alissow) - Adicionado monstros 8.54 (Alissow) - Corrigido bug das potions infinitas (Alissow) Atualização 3.7 Patch 1 [27/12/2009]: - Rampa na frente da loja de foods retirada (Alissow) - Arrumado bugs de mapa em anknor (Alissow) - Bug na Lib dos npcs corrigido (Alissow) - Bug do acc manager arrumado! (Alissow) - Magias "Exkordium" e "Ice Storm" arrumadas (Alissow) - Monstros 8.54 funcionando (Alissow) - 2º Addon Yalaharian arrumado (Alissow) - Addons Warmaster adicionados no NPC Addoner (Alissow) - Pequenas modificações na cidade principal, Dorion, para melhora da jogabilidade (Alissow) - Comando /Deathlist retirado (Alissow) - Magic Wall Rune arrumada (Alissow) - Quest Annihilator arrumada (Alissow) - "Your depot contain x items" Arrumado (Alissow) - Addons reorganizados, mais facil aggora (Alissow) - Tempo de Red skull e Black skull reduzidos para 24 e 42 horas (Alissow) - Reduzida porcentagem de morte (Alissow) - Acrescentado chance de critical hits (Alissow) - ShowHealingDamage Adicionado (Alissow) - Várias partes do mapa remapeadas (Alissow) - NPCs para recarga de Soft boots & Firewalker boots arrumados [Não testado] (Alissow) - Comando !frags arrumado! (Alissow) - Agora é possivel fazer addons sem precisar do comando !buypremium (Alissow) Atualização 3.8 [17/01/2010]: - Arrumado bug nas escadas do Dlair (Alissow) - Todos os bugs nos NPCs arrumados (Comedinha) - Novas talkactions [a pedidos] (Comedinha) - Deathlist arrumada (Comedinha) - Novo Distro (Comedinha) - MySQL Atualizada (Comedinha) - Firewarker boots não é mais gasta quando não está usando (Comedinha) - Problemas com items no Rashid arrumados (Alissow, Comedinha, Comunidade) - O NPC Banker foi corrigido, mas achei mais seguro retira-lo, visto que ninguem usava e poderia causar outro tipo de bug - Ilha (Sim aqui é uma ilha) de Zao adicionada (Alissow, Barker) - Monstros 8.54 aperfeiçoados (Alissow, Markithu, Zkum) - Reduzido danos da magia Exkordium (Alissow) - Os npcs Dark Rodo e Rachel vendem Blank Runes (Alissow) - Magias que não hitavam anteriormente foram arrumadas (Alissow) - Comando !buypremium arrumado (Alissow) - Arena PVM - Mais conhecida como Arena Svargrond - FUNCIONANDO!!! (Alissow) - Magia LightChain Retirada (Alissow) - Adicionado um sisteminha legal no templo (Alissow) - NPC Rashid retirado (Alissow) Atualização 3.8 Minor Patch 1 [17/01/2010]: - Comando Deathlist retirado novamente, fizemos testes equivocados. Se você é uma das 16 pessoas que baixou a versão anterior (3.8) não precisa baixar esta, basta retirar o comando !deathlist e /deathlist do seu Talkactions.xml, Os comandos causam quedas no servidor. Atualização 3.9 [15/02/2010]: - Cidade principal (Dorion) reformada, novo templo, novo depot, novo porto, novos npcs :] (Alissow) - Adicionado Reputation System (Comedinha, Cybermaster) - Adicionado !bless system (Comedinha) - /info melhorado (Comedinha) - Jail System (Comedinha) - Bug chatinho nos tiles pretos arrumado. - Magic Wall Funcionando! (Alissow) - Agora você pode fazer bolos e pães :] (Comedinha, Jean, Ojani) - Adicionado sistema de casamento (Comedinha, ScorpiOOn93, Alissow) - Loot The Fastest Turtle diminuido (Alissow) - Loot e experiencia do Feromous mais baixo (Alissow) - Sistema de parceis para Dorion funcionando (Alissow) - Guildwar System (Comedinha) - Anti MageBomb System (Comedinha, Huggen) - Adicionado Anti Nuker - Esse funciona! (Comedinha) - Adicionado Map Marks, para os players novos (Alissow, Comedinha) Atualização 4.0 [15/02/2010]: - Cidade Mountain totalmente reformada (Alissow) - Montanha de Goblins de Dorion reformada (Alissow) - Demonic Castle de Dorion reformado (Alissow) - Cidade de Venonh modificada (Luis) - Distro atualizado, funcionando nos clients 8.54, 8.55, 8.56 e 8.57 (Comedinha) - Comando !bless retirado (Alissow) - O NPC Ermes não vende mais items de decoração (Alissow) - Arrumado bugs na Ferumbras Tower (Alissow) - O comando !AFK on agora mantem o player parado (Comedinha) - Arrumado bugs nas escadas da área de DeathFans (Alissow) - Comando !Deathlist funcionando! (Alissow, Doidinmapper, GT Thionix) - Sistema de REP atualizado (Comedinha) - Sistema de Polls (Comedinha) - Banco por comandos (Comedinha) - Novos comandos de addon e accounts (Comedinha) - Sistema de futebol completo! (Comedinha) - Sistema Antibot (Comedinha) - Magia Spared Hur modificada (Alissow, Orzeleagle) - Adicionado sistema de montaria (Alissow, unknown666) - Adicionado Canivetes (Alissow, Siramix) - Nova hunt Subaquatica (Luis) Atualização 4.11! [11/07/2010]: - Versão 8.6, todos os items, outfits e monstros novos (Comedinhasss, Fireelement) - Adicionados os novos monstros 8.6 (Alissow) - Bug das potions arrumado (Comedinha, Matheusmkalo, Gabriel linhares, Fireelement) - Erros das runas arrumado (Comedinha, Gabriel linhares, Matheusmkalo, fireelement) Download Servidor: 4shared Tamanho: 17,416 KB Download: http://www.4shared.com/file/ez8XKrju/860_Alissow_Ots_411.html Link protegido: http://lix.in/-8d4bc0 Scan VirusTotal: http://www.virustotal.com/pt/analisis/983abb574dbb957a75aa1fd29eb804065f775e6a0c43216aa277686d32bce22a-1263702373 Atenção - Acc do God: god/god - LEIA o tópico antes de postar qualquer coisa ou duvida - Reportem se houver algum bug - A database fica na pasta schemas+Database - Proibido o uso do nosso distro sem o nosso consenso, obrigado. Andei percebendo que há muitos mapas feitos por mim em outros servidores postados aqui no xtibia, eu não sei se vocês sabem, mas isso é PLÁGIO. Eu não sou uma pessoa egoista, tudo que eu posto aqui no XTibia é para ser compartilhado, mas desde que mantenham os devidos créditos. Será denunciado qualquer tipo de "roubo" sem minha autorização para beneficio próprio. Eu sei que vocês não se importam muito com isso, eu também não deveria me importar, mas é o tempo e a dedicação de outra pessoa que vocês estão roubando, então peço gentilmente aos que tem conhecimento desses mapas, que me apontem. Não tem graça trabalhar horas e horas e ser roubado em dois minutos.1 ponto
-
[Oficial] Snowz Thyranic 3.1 - Especial Edition (8.60)
LEONARDO MARTINS reagiu a Doidin por um tópico no fórum
• Snowz Thyranic 3.1 - Especial Edition (8.60) • Servidor feito por luisfe23 e Doidin. Fala galera estou aqui para apresentar o novo Snowz Thyranic, eu e o luisfe23 estamos trabalhando a muito tempo neste servidor e muitas novidades surgirão, este servidor é baseado no mapa Thyrania e contém um RPG super emocionante. Então, tá esperando o que? Confira logo! • 8 Cidades: ├ Rookgaard ├ Thyran ├ Murnia ├ Saaha ├ Icya ├ Venga ├ Mandrin └ Talas • Conta do GOD: ├ Account: god └ Senha: god Ok, vamos logo para as atualizações! • Snowz Thyranic Versão 1: • Snowz Thyranic Versão 1.1: • Snowz Thyranic Versão 2: • Snowz Thyranic Versão 2.1: • Snowz Thyranic Versão 3.0: • Snowz Thyranic Versão 3.1 (Especial Edition): ├ Modificações no Distro, ele está completamente estável! ├ Modificações no mapa, bugs foram removidos! ├ Modificações em vários NPC's, eles estão bem mais realistas! ├ Todos os NPC's de Addons foram removidos e substituidos por apenas 1 que fica nas redondezas de Thyran. ├ A Demon Oak Quest está funcionando perfeitamente. ├ A Dijin Quest agora está funcionando perfeitamente. ├ A Black Knight Quest está funcionando perfeitamente. ├ Todos os bugs que davam para fazer dinheiro foram removidos. ├ Adicionado NPC "Padre" em Thyran, ele realiza casamentos. ├ Agora as bless custam apenas 50k. ├ Arrumado as Quests no Quest Log. └ Entre várias outras mudanças! • Algumas Imagens: :forward: Download do Snowz Thyranic 3.1 (8.60) :forward: Scan do Snowz Thyranic 3.1 (8.60) • Créditos: Achou Bugs? Reporte !1 ponto -
[Gesior Acc] Guild War System Com Escudos
guiduarteee reagiu a walefxavier por um tópico no fórum
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 -
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
-
Eae Galerinha, é meu Primeiro post no XTibia então sem pisar em mim em ;B Procurei e não achei um tutorial assim então vou postar pra ajudar os iniciantes Eu estarei ensinando como se adiciona sprites prontas com formato .idc Primeira mente você precisara do programa DAT EDITOR Download : Pacote de Sprites Prontas Pokemons Johto Feitos Pelo Purple: Agora com os 125 pokemons, Corpses, Magias e portraits de todos os johto: http://www.4shared.com/file/WWLgCVbT/johtos.html Dat Editor : http://www.multiupload.com/KD9NW6TMF0 Scan Dat Editor: http://www.virustotal.com/file-scan/report.html?id=3c5e94e59df52ef693d12b0543aa66d6f8b0dee89a88bdb1e1cd1ca5d3d13195-1306952621 Novo Scan Pacote de Sprites :http://www.virustotal.com/file-scan/report.html?id=98c2917453f3829817cf36562a34dc627000675528a0ef62f4838cf256584da2-1303932047 Agora vamos começar Depois de baixar o Dat Editor, extraia ele na pasta que você quiser. Abra o dat editor, Vá em : File / Open Procure a pasta do client do seu Server, e nos seus devidos lugares abra o Tibia.dat e Tibia.spr Espere carregar e as sprites do seu client irão aparecer Agora Extraia os pokemons que vocês baixaram , e note que eles estão em formato .idc Vá no dat editor e clique em : Import / Import Itens Vá ate a pasta onde você extraiu os pokemons em formato .idc, segure Ctrl e selecione todos de uma vez As sprites irão aparecer no Canto esquerdo Agora clique em : File / Save Na janelinha clique em Compile Depois que carregar totalmente Feixe a janelinha Más não fexe o Dat Editor Na tabela inferior do Dat Editor tem vários itens, e um deles é o ItemType Pegue esse numero do ItemType e grave ou copie. Abra a pasta do seu Server, clique em : Data / Monsters / Pokes Copie Qualquer Arquivo XML Renomeie para o nome do Pokemon que esta no Dat Editor Abra o arquivo com o bloco de notas. Mude o nome do Pokemon , e Lá onde está escrito : Look Type = ... Mude para o ItemType que esta no dat editor ( que eu falei pra copiar) Volte para a pasta : Data / Monsters Abra o arquivo Monsters.xml Copie qualquer Pokemon, mude o nome para o Pokémon que você criou, e no fim da linha esta escrito o nome do Pokemon .xml Mude para o nome do arquivo que você criou. Lembrete sempre ponha .xml no fim Salve tudo, e Abra o seu Server Proonto novo Pokémon Adicionado :x Se você quiser Adicionar os atakes novos dos pokemons fala isso: Embaixo , lá no xml do pokemon na linha </flags> <attacks> <attack name="nome da magia (tem que existir no seu server)" interval="tempo que o mosntro usa" chance="chance de usar" range="poder da magia" min="dano minimo use sempre o menos EX: -100" max="dano maximo use sempre o menos EX: -200"> </attack> ai vai adicionando as linhas com os novos atakes se o atake ainda não estiver criado vá na pasta Spells crie um xlm da nova magia, edite o nome, vá no dat editor pegue o item type da magia que você quer (o efeito desejado) volte, abra o Spells.xml adicione a sua nova magia. depois faça o que eu disse a cima. crie uma linha no xml do seu pokemon e vá adicionando as magias ^^ use isso para faser os pokemons selvagens '-' Gentee entra no meu novo tutorial , Criando novos itens e corpses com ids proprios http://www.xtibia.com/forum/topic/158900-criando-novos-id-de-items-e-corpses/page__p__1047720#entry1047720 See te Ajudei Dáa um +Rep Ae pro Okaminha ;B não cai o dedo \õ :smile_positivo: Créditos: Psycho Okama < Eoooooo E as sprites convertidas pelo < Purple Fuiz \õ/1 ponto
-
Opções Do Comando /attr
darkrayfury reagiu a Doidin por um tópico no fórum
É galera eu acho que todos sabem que o comando /attr serve para mudar coisas no server, semprecisar ter que derrubar ele para poder alterar... Para usar ele é bem simples, basta usar virado para o "alvo" que no caso é o player ou algum item, vamos logo as opções do comando: Opções para se usar em items: Opções para se usar em players: Sempre que for usar o comando você deve informar para qual numero você irá alterar, exemplo: /attr group 5 Espero que tenham entendido, abraços...1 ponto -
1 ponto
-
Engraçado não ?, pois é resolvi fazer um sistema de Reputação para o tibia. Você tá lá noob, ganha um item dum cara fodão, oke vc pode fazer por ele ? de um REP+, pra ele, isso mesmo as pessoas que mais ajudá no server concerteza terá + reps. vejá as SS. Explicação dos comandos. !rep (nomi do player) - dá um rep para um player. !myrep - consulta minha reputação !rankrep - confere os reps de quem está online Vamos aos scripts. 1° crie um arquivo com nome de replogin.lua na pasta creaturescripts/scripts e cole o seguinte script function onLogin(cid) if getPlayerStorageValue(cid, 6003) <= 0 then setPlayerStorageValue(cid, 6001, 0) setPlayerStorageValue(cid, 6003, 1) end return TRUE end TAG : <event type="login" name="RepLogin" event="script" value="replogin.lua"/> e registre no arquivo creaturescripts/scripts/login.lua adicione : registerCreatureEvent(cid, "RepLogin") vá na pasta talkactions/scripts e crie um arkivo com nomi de rep.lua e cole o script : local configs = { rephours = 24 -- qntas em qntas horas pode dar rep, 24 para 1 dia. } function getTime(s) local n = math.floor(s / 60) s = s - (60 * n) return n, s end function onSay(cid, words, param) local cd = math.ceil(configs.rephours/2) local storage = 6002 if words == "!rep" then if os.time()-getPlayerStorageValue(cid, storage) <= cd then minutes,seconds = getTime(cd-(os.time()-getPlayerStorageValue(cid, storage))) return doPlayerSendTextMessage(cid, 27, "Wait " .. configs.rephours .. " fours for the next rep.") end if getPlayerByName(param) then local p = getPlayerByName(param) if getPlayerIp(cid) == getPlayerIp(p) or getPlayerAccount(cid) == getPlayerAccount(p) then return doPlayerSendTextMessage(cid, 27, "IP ACCOUNT PROTECT.") end setPlayerStorageValue(p, 6001, getPlayerStorageValue(p, 6001) + 1) doPlayerSendTextMessage(cid, 27, "You gave reputation + 1 for " .. getCreatureName(p) .. ".") doPlayerSendTextMessage(p, 21, "You received reputation + 1 of ".. getCreatureName(cid) ..".") setPlayerStorageValue(cid, storage, os.time()+3600*cd) else doPlayerSendTextMessage(cid, 27, "Player Not Found.") end elseif words == "!myrep" then return doPlayerSendTextMessage(cid, 27, "My Reputation : " .. getPlayerStorageValue(cid, 6001)) elseif words == "!rankrep" then local e = getPlayersOnline() local text = "" for _, pid in ipairs(e) do text = text .. "[" .. getCreatureName(pid) .. "] Reputation: " .. getPlayerStorageValue(pid, 6001) .. "\n\n" end text = "[RANK REPUTATION ONLINES]\n\n" .. text doShowTextDialog(cid, 2525, text) end return TRUE end TAG: <talkaction words="!rep;!myrep;!rankrep" event="script" value="rep.lua"/> Configurando : Você só configura essa parte : local configs = { rephours = 24 } rephours = 24, significa de qntas em qntas horas pode dar rep, ai caso querer ki for um dia ki tem 24 horas. ou seja vai fica 1 rep por dia. Então tá explicado, espero que vcs gostem do script, obrigado a todos. fui...1 ponto
-
• nome: Sistema de Ginásio / GYM para pokemon. • autor: brun123 (mastercraft) • versão testada: TFS 0.36 pl 1 (8.54) Detalhes: Como cada servidor de pokemon é bem diferente, acredito que muitos erros vão aparecer devido a diferença de IDs das pokebolas por exemplo, mas vou ajudar no que posso. Primeiro passo: crie um arquivo com o nome gymlib.lua na pasta data/lib/, e coloque isso dentro do arquivo: Segundo passo: crie um arquivo chamado gym.lua na pasta data/creaturescripts/scripts/ e coloque isso dentro: Terceiro passo: abra o arquivo creaturescripts.xml (localizado em data/creaturescripts) e adicione essas 4 tags: <event type="cast" name="Gym1" event="script" value="gym.lua"/> <event type="attack" name="Gym2" event="script" value="gym.lua"/> <event type="direction" name="Gym3" event="script" value="gym.lua"/> <event type="death" name="Gym4" event="script" value="gym.lua"/> Quarto passo: crie um arquivo chamado brock.xml em data/npc e crie um chamado brock.lua em data/npc/scripts e coloque isso dentro: Quinto passo: se você usar o pokemon dash, vá no arquivo playerattack.lua (data/creatureevents/scripts) e adicione esses códigos embaixo da linha "function onAttack(cid, target)": if getPlayerStorageValue(target, 201) ~= -1 then for a, b in pairs(ginasios) do if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then doPlayerSendCancel(cid, "You can't attack this pokemon.") return false end end end end end Se você não usa o pokemon dash, crie um arquivo chamado playerattack.lua na pasta data/creatureevents/scripts e coloque isso dentro: function onAttack(cid, target) if getPlayerStorageValue(target, 201) ~= -1 then for a, b in pairs(ginasios) do if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then doPlayerSendCancel(cid, "You can't attack this pokemon.") return false end end end end return true end e adicione essa tag no creaturescripts.xml (data/creaturescripts): <event type="attack" name="PlayerAttack" event="script" value="playerattack.lua"/> e ainda, abra o arquivo login.lua e embaixo dessa linha: "function onLogin(cid)" adicione esse código: registerCreatureEvent(cid, "PlayerAttack") Último passo: vá em data/creaturescripts/scripts e abra o arquivo goback.lua (aqui por exemplo, pode ser que haja uma particulariedade de servidor para servidor), e procure pela linha: function onDeath(cid, deathList) e abaixo dela, adicione esse código: local owner = getCreatureMaster(cid) for x, y in pairs(ginasios) do if getPlayerStorageValue(owner, y.storage) == 1 then if getPlayerStorageValue(owner, 991) == 5 or not hasPokemon(owner) then setPlayerStorageValue(owner, 991, -1) else local number = tonumber(getPlayerStorageValue(owner, 991)) setPlayerStorageValue(owner, 991, number + 1) end end end Configuração dos NPCs: Abrindo o arquivo brock.lua na pasta data/npc/scripts, procure por esta linha: "doGymBattle("Brock", "Brock Geodude", cid, 1)" o "Brock" precisa ser o nome do NPC e o "Brock Geodude" precisa ser o nome do primeiro pokemon a ser usado. Agora nessa parte, no script do seu NPC, você também deve editar o nome do NPC no lugar de "brock". Se quiser que o player possa lutar com o NPC mesmo depois de tê-lo vencido, é só remover a mesma parte: if getPlayerStorageValue(cid, ginasios["Brock"].storage) >= 1 then return true end Ao abrir o arquivo gymlib.lua, você encontra essas duas linhas (são as primeiras): funcpokemon = {2220, 2222} -- ID das pokebolas (o pokemon tem que estar vivo nessas IDs) bpslot = CONST_SLOT_BACKPACK --em outros servers, pode ser que seja CONST_SLOT_AMMO o lugar onde fica a backpack no inventory Onde está funcpokemon, você coloca o ID de todas as pokebolas do seu server, mas esse ID tem que ser o ID da pokebola com algum pokemon vivo dentro, e esses IDs devem ser separados por vírgula. Onde está bpslot, você escreve onde fica a BACKPACK do seu server de pokemon. Se ficar no lugar normal de BPs, deixe como está, mas se sua BP fica no slot da munição (ammunition), você deve estar para CONST_SLOT_AMMO. Isso é tudo, agora vocês podem configurar os IDs e localização da BP facilmente, sem precisar conhecimentos mais avançados sobre scripting, e evitar erros no sistema. Abrindo o arquivo gymlib.lua, localizado em data/lib/ você encontra essa tabela: ginasios = { ["Brock"] = { storage = 900, msgdefeat = "You lost! You aren't strong enough yet, don't come back until you get stronger!", msgafk = "Go away if you don't have any pokemons!", msgwin = "Congratulations, you were strong enough to win this battle fairly! Take this Earth Badge as reward.", [1] = { msggo = "Lets fight then! I choose you, Geodude!", msgba = "That's enough, Geodude!", pokem = "Brock Geodude", nextp = "Brock Graveler"}, [2] = { msggo = "It's your turn, Graveler!", msgba = "Come back, Graveler!", pokem = "Brock Graveler", nextp = "Brock Golem"}, [3] = { msggo = "Crush'em, Golem!", msgba = "You did well, Golem!", pokem = "Brock Golem", nextp = "finish"} } } • storage significa a única storage que deve variar de NPC para NPC, tenha certeza de que essa storage não está sendo usada, é você não deve usar a storage 901 aqui, pois a mesma já está em uso pelo próprio sistema. • msgdefeat significa o que o NPC irá dizer quando o player perder o duelo. • msgafk significa o que o NPC irá dizer caso o player comece o duelo, mas não faça nada depois. • msgwin significa o que o NPC irá dizer quando o player vencer o duelo. • msggo / msgba significam os textos que o NPC irá dizer ao sumonar o pokemon dele, ou quando o mesmo morrer, respectivamente.• pokem / nextp significam o nome do pokemon que será utilizado, e o próximo pokemon a ser sumonado pelo NPC, respectivamente. Caso o nextp seja especificado como "finish", não haverá um próximo pokemon. • o número entre [] significa a ordem utilizada pelo líder para usar o tal pokemon, sendo 1 o primeiro pokemon, 2 o segundo e assim vai... Uma tabela detalhada sobre a configuração: Importante: caso for testar o sistema como foi postado aqui, é necessário criar antes os monstros Brock Geodude, Brock Graveler e Brock Golem, assim como adicioná-los no monsters.xml. Recomendações: é bom você impedir que o pokemon consiga retornar para a pokebola durante duelos (assim como foi feito no SvkE), para isso, basta adicionar esse código no arquivo goback.lua (data/actions) na parte inicial de retornar o pokemon: for a, b in pairs(ginasios) do if getPlayerStorageValue(cid, b.storage) == 1 then -- GYM doPlayerSendCancel(cid, "You can't return your pokemon during gym battles.") return true end end Aconselho fazer o mesmo caso seu server tenha script de revive. Deve-se também checar pelos storages usado em players, somente o 990 e o 991. No servidor testado, é utilizado apenas pokeballs e ultraballs, com IDs 2220 e 2222 (outra particularidade). Após ter instalado os arquivos, entre no jogo e use o comando /n Brock para testar o NPC. Último aviso: o prêmio ainda não foi adicionado (que seria a badge), pois esse sim é bem variado de servidor pra servidor. Já que nenhum servidor base já vem com os IDs das badges, cada um adicionou elas de modo diferente, por isso não pude fazer, mas existe uma parte sobre um prêmio no arquivo gym.lua (data/creaturescripts/scripts), procure por isso: --local item = getPlayerItemById(killer, true, 2307) --doTransformItem(item.uid, 2294) Você pode modificar para adicionar dinheiro ou outra coisa, e pode também desenvolver um sistema de badges. Eu não vou fazer badge aqui, mas se vocês tentarem, posso ajudar com problemas. Quaisquer erros, tentarei responder o mais rápido possível.1 ponto
-
[Gesior] Ver Jogadores Vips
Jonathanlol reagiu a walefxavier por um tópico no fórum
Vá em C:\xampp\htdocs e cria um arquivo php chamado : viplist.php,dentro add isso : <?PHP $zapytanie = $SQL->query('SELECT `player_storage`.`player_id`, `player_storage`.`key`, `player_storage`.`value`, `players`.`id`, `players`.`name`, `players`.`level`, `players`.`online` FROM `player_storage`, `players` WHERE `key` = 13540 AND `player_storage`.`player_id` = `players`.`id` ORDER BY `players`.`level` DESC;')->fetchall(); foreach($zapytanie as $zap) { $kolor++; if(is_int($kolor / 2)) $bgcolor = $config['site']['lightborder']; else $bgcolor = $config['site']['darkborder']; if($zap['online'] == 0) $player_list_status = '<font color="red"><b>Offline</b></font>'; else $player_list_status = '<font color="green"><b>Online</b></font>'; $tresc .= '<TR BGCOLOR='.$bgcolor.'><TD><center><a href="?subtopic=characters&name='.urlencode($zap['name']).'">'.$zap['name'].'</a></TD><TD><center>'.$zap['level'].'</TD><TD><center>'.$player_list_status.'</center></TD></TR>'; } $main_content .= '<center><hr/><b>Jogadores Vip Do '.$config['server']['serverName'].'.</b><hr/><br><TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white WIDTH=32%><b><center>Name</center></b></TD><TD class="white" WIDTH=32%><b><center>Level</center></b></TD><TD class="white" WIDTH=32%><b><center>Status</center></b></TD></TR>'.$tresc.'</TABLE>'; $main_content .= '<div align="right"><small><b></small></div><br />'; ?> Agora vá em C:\xampp\htdocs/index.php e depois de : case "latestnews": $topic = "Novidades"; $subtopic = "latestnews"; include("latestnews.php"); break; ADICIONE ISSO : case "viplist"; $subtopic = "viplist"; $topic = "Jogadores Vip"; include("viplist.php"); break; Agora vá em C:\xampp\htdocs\layouts\tibiacom/layout.php e add o seguinte: <a href='?subtopic=viplist'> <div id='submenu_viplist' 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_experiencetable' class='ActiveSubmenuItemIcon' style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'><blink><font color=grey>Jogadores VIP</font></blink></div> <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> </div> </a> Simples !1 ponto -
[Action] Ditto System
raulcdj reagiu a jeancassio2010 por um tópico no fórum
Va em data/actions/scripts e copie um arquivo .lua e renomeie para ditto.lua Apague tudo que tiver dentro e coloque isto: Depois va em data/actions e abra o arquivo actions.xml e coloque essa tag Sendo 2178 o id do item que sera usado para transformar o ditto. isto é tudo, se axo bom, de Rep+.1 ponto -
Olá a todos. Eu sempre venho ao fórum pedir coisas e perguntar... Mas hoje resolvi postar um script FEITO POR MIM... Na verdade é bem simples para quem sabe um pouco de banco de dados... Mas para quem não sabe é uma boa. Esses comandos servem para: - limpar a casa de um players inativo(30 dias) - tirar player inativo(30 dias) de dono de casas - deletar player inativo(30 dias) Bom os comandos que apresentarei DEVEM SER REALIZADOS COM O SERVIDOR FECHADO, OU DARÁ ERRO!!! Deletando Itens que casas, onde o player não loga a mais de 30 dias DELETE from tile_items WHERE tile_id IN (select id from tiles WHERE house_id IN (select id from houses WHERE owner IN (select id from players WHERE lastlogin < UNIX_TIMESTAMP() - 30*24*60*60))) Tirando o player inativo(mais de 30 dias) de dono da casa UPDATE houses set owner = 0 WHERE owner IN (select id from players WHERE lastlogin < UNIX_TIMESTAMP() - 30*24*60*60) Deletando o player inativo(mais de 30 dias) DELETE FROM players WHERE lastlogin < UNIX_TIMESTAMP() - 30*24*60*60 Os 3 códigos apresentado OBRIGATÓRIAMENTE terão que ser executados na órdem que foram apresentados, ou não se achará. Espero que todos gostem. Atenciosamente, ADM KoD1 ponto
-
[Movement] Map Mark
Faeelz reagiu a SkyDangerous por um tópico no fórum
Script Retirado por SkyDangerous Se quiser o script que faça ou procure em outro forum. Até +1 ponto -
Neste tutorial vou explicar como geralmente para trabalhar com os scripts de ação. 1 - Informações úteis (leia-se quando você é novo com isso) 2 - Comandos 3 - Fazer useables 4 - Fazer buscas Todos id item é usado em 3 e 4 são 7,6 ids item! -------------------------------------------------- ------------------ ---- 1 Informações Úteis Ao editar o arquivo. LUA /. Xml o melhor editor de usar é simples bloco de notas. Você também pode utilizar outros editores como o Word. Mas funciona melhor bloco de notas comigo. --- 1,1 Armazenar dados Quando o script em ação ot arquivos que você vai ter que entender o que significa alguma coisa. Uma das coisas importantes são itens nos quais você pode armazenar dados. Aqui vou dar um exemplo: Código: = número 1now o item de armazenamento "número" contém "1". Assim, cada vez vamos chamar o valor de armazenamento "item", teremos a resposta "1". Quando você gostaria de realizar cálculos matemáticos que você pode fazer assim: Código: = número + número 1Now não será adicionado um valor ao número de armazenamento. Você pode substituir com + -, / e alguns sinais mais matemática (havn't tentei todos eles). Se quiser peça para ser um número aleatório, seria assim: Código: math.random número = (1,10) 1,10 é o min / max número aleatório que o init deve receber. Também é possível armazenar texto dentro desses itens Starage. Um exemplo: Código: name = "oi, meu nome é Mindstorm" Agora, o armazenamento de itens "nome" conterá o texto "oi, meu nome é Mindstorm". Nestes dois exemplos que usei o armazenamento de itens "número" e "nome". No entanto, você pode alterá-los para o que quiser! --- 1.2 Se afirmações: E se comunicado diz apenas que um pedaço de código entre o "se" eo "fim" só será realizada quando as linhas de código entre o "se" eo "depois" está correto. Você sempre precisa para fechar um "if" e com "final". Exemplo: Código: Se a Apple == 1 então "Pedaço de código" Código endThis vai realizar o "pedaço de código" somente se o valor de armazenamento "maçã" é 1. Olhe para o "==" parte. Ao usar uma instrução if e você quiser comparar dois fatores que você deve usar o "=" signe duas vezes em vez de uma só vez! Se você deseja que o "if" para comparar múltiplos fatores, em um comunicado que será parecido com este: Código: Se maçã e pêra == 1 == 2 então "Pedaço de código" endNow o "pedaço de código" só será efectuada quando o armazenamento do valor da "maçã" é 1 e "pera" é 2. Claro que você pode colocar como muitos fatores em um if, contanto que você separe-os com um "e". Se você gostaria de realizar "pedaço de código", quando o armazenamento do valor da "maçã" é 1 ou quando o armazenamento do valor "pêra" é simplesmente substituir os dois "e" por um "ou". Digamos que você quer executar "pedaço de code1" quando o armazenamento do valor da "maçã" é 1 e "pedaço de code2" quando o valor de armazenamento "maçã" não é 1. Ela terá para olhar como este: Código: Se a Apple == 1 então "Pedaço de código" mais "Pedaço de code2" endYou simplesmente colocar um "else" entre o "se ... então" e "fim" do. Tudo que está entre o "se .. então" eo "outro" será realizada se o valor de armazenamento de maçãs é 1, tudo que está entre o "outro" e "final" será feita quando e maçã valor de loja é NOT 1 Agora, o que se quiser "pedaço de code1" a ser realizado quando o armazenamento do valor da "maçã" é 1 e "pedaço de code2" quando o armazenamento do valor da "maçã" é 2. Quando a Apple não é nem 1 nem 2 "pedaço de Code3" será realizado. Código: Se a Apple == 1 então "Pedaço de code1" maçã elseif == 2 então "Pedaço de code2" mais "Pedaço de Code3" endNow se o valor de armazenamento "maçã" é um "pedaço de code1" será realizada, mas se o valor de armazenamento "maçã" é de 2 ONLY "pedaço de code2" será realizado! Quando a maçã não é nem vermelho, nem verde "pedaço de código 3" será realizado. Você pode colocar quantas "elseif ... então" 's entre o "se ... então" e do "outro" como você quiser. Se você quiser que nada aconteça quando a maçã não é nem 1 ou 2 simples remover o mais "Pedaço de Code3" Quando você estiver usando "==" entre a Apple e 1 (se a maçã == 1, então) que você está comparando. Então você diz, se o valor de armazenamento de "maçã é um" então .... Quando você usa o "==" o sinal, a parte em frente ao "==" (maçã) na maioria das vezes representa um item de armazenamento. Mas seria bom se pudéssemos fazer outras coisas, em seguida, comparar os fatores! Portanto, podemos colocar algumas coisas diferentes entre o valor de armazenamento e, em seguida, coisa que você quer comparar (ou qualquer outra coisa) que ele. Exemplos: - Se a Apple> 1, então (só será realizado se o valor de armazenamento "maçã" é maior que 1) - Se a Apple <1 então (só será realizado se o valor de armazenamento "maçã" é menor que 1) - Se a Apple ~ = 1 então (só será realizado se o valor de armazenamento "maçã" não é 1) - Se> Apple = então (só será realizado se o valor de armazenamento "maçã" é 1, ou maior, então 1) - Se <= maçã então (só será realizado se o valor de armazenamento "maçã" é 1 ou menor que 1) --- 1.3 Para declarações Para afirmações são completamente diferentes, em seguida, se as declarações. Aqui está um exemplo: Código: 1,10 para a Apple fazer doPlayerSendTextMessage (cid, 18, maçã) "DoPlayerSendTextMessage (cid, 18, maçã)" final é uma função (mais sobre isso depois), que irá enviar uma mensagem para o jogador com um texto. Agora, o texto que será enviado é o contém da "maçã" de armazenamento de item. Neste código para declaração vai criar um loop. Ele irá repetir "doPlayerSendTextMessage (cid, 18, maçã)" até que a maçã valor de armazenamento é de 10. [/ I] para a maçã nr1, nr2 fazer [/ i]. Aqui nr1 é o número inicial, NR2 é o número de acabamento. O laço for vai automaticamente aumentar o valor do depósito item "maçã" cada vez que repete o ciclo. --- 1,4 demonstrações Repetir Repetir declarações vai repetir um trecho de código até que alguma coisa atinge um valor. Exemplo: Código: Repita "Pedaço de código" Até NumberOfApples> NumberOfPearsNow o "pedaço de código" wil ser repetido unstill o valor de armazenamento NumberOfApples é maior que o valor NumberOfPears armazenamento. Claro que você pode mudar NumberOfPears em um número. ---- 2 Comandos Quando a ação de script arquivos existem alguns comandos que são úteis para saber. Aqui vou explicar uma vez que você irá usar mais. "Função onUse (cid, item, frompos, item2, topos)": Isso é o que cada script de ação começa com. O onUse function () apenas significa que você está usando alguma coisa (um item ou outro qualquer). Existem alguns valores de armazenamento que são dadas no Action Script, que você não tem que configurar! Estes valores de armazenamento são: -Cid: A pessoa que usa o item (informação sobre a pessoa que estiver usando). -Item: Informações sobre o item que ele está usando. (Isso se você ctrl-clique sobre uma baga informações arbusto azul muito al sobre esse arbusto azul é armazenado dentro do valor de armazenamento de item). -Frompos: De que posição ele vai usar o item. -Item2: se ele está usando o item em alguma coisa, item2 contém dados desse item. -Topos: a posição que ele está usando para o item. Tenha em mente que onUse fuction () sempre termina com um "fim" - Não funciona "DoPlayerSay (cid," oi ", 2)": Este tipo de função vai um recado para o jogador. Agora, o jogador seria automaticamente dizer oi. "DoPlayerSendTextMessage (cid, 22," Hi .")": Se você digitar isso no seu script de ação que irá enviar a mensagem para Oi Cid. Cid é o jogador que está usando um objeto. 22 é a cor que a mensagem deve ser mostrada dentro (1-22 de trabalho, com certeza, maior que aqueles que eu não sei). numberFor exemplo, se um jogador usa uma alavanca esse script ação será enviar. Código: onUse Função (cid, item, frompos, item2, topos) doPlayerSendTextMessage (cid, 22, "oi") EndNow cada vez que um jogador usa uma alavanca que ele vai receber uma mensagem dizendo "oi" dentro de sua barra de chat. "DoPlayerSendCancel (cid," oi ")": Esta função se parece muito com o doPlayerSendTextMessage () função. A diferença é que você não pode usar as cores ea mensagem não será mostrado dentro do chat bar, mas na parte inferior da tela. (Normalmente, o texto "está esgotado" ou "você não tem mana suficiente" aparecem lá). "DoCreateItem (id, número, topos)": Esta função irá criar um item sobre o título que você usa. Id é o ID do item que deve ser criado, o número é a quantidade do mesmo, topos é a posição onde deve ser criado. Lembra quando você usar um topos item já é o coords "DoDecayItem (item.uid)": Esta função irá decair um item. Isso significa que ele irá retornar ao seu original item.id. (Por exemplo buracos pá voltar a montes de pedra). "DoPlayerAddHealth (cid, 100)": Isso vai acrescentar 100 para a saúde do jogador (CID). Você pode substituir 100 ofcourse por qualquer número que você gostaria! Você também pode fazer o 100 um número negativo, este número será removido da saúde dos jogadores. "DoPlayerAddMana (cid, 100)": Isso vai acrescentar 100 mana para o jogador (CID). (Também pode ser números negativos). "DoPlayerAddSkillTry (cid, 6,1)": Esta função irá adicionar uma habilidade. 6 significa que o tipo de habilidade 1 significa que a quantidade de habilidade para ser adicionado (em% não, ou como um nível, apenas como um número de tentativas). "DoPlayerSetMasterPos (cid, newpos)": Esta função irá definir a posição do novo mestre do jogador. A posição do mestre é a posição onde o jogador irá se ele morrer. "DoPlayerSetVocation (cid, COV)": Esta função irá definir a vocação jogadores. Voc é a vocação como um dígito (0-4). "DoPlayerRemoveMoney (cid, 100)": Esta função irá recolher uma quantidade de dinheiro a partir de mochila do jogador. (Você pode mudar 100 para o que você quiser). "DoPlayerAddItem (cid, quantidade, itemid)": Esta função irá adicionar um item na mochila jogadores. 2400 é o número do item (você pode encontrar os números dos itens no item.xml. 1 representa a quantidade desses itens deve ser dado. Quando 2400 seria um item que você pode entrar em quantidade (moedas de ouro, platina, moedas, runas) será o montante do mesmo. Portanto, se você mandaria (cid, 2152,100), é necessário adicionar 100 moedas de ouro dentro da mochila jogadores. Ao dizer (cid, runeid, 100) você gostaria de acrescentar uma runa do tipo runeid com 100 cargas dentro da mochila jogadores. Quando o ID do item que deseja enviar uma garrafa / caneca caneca de cerveja ou algo igualmente o número vai significar o contém da garrafa / mub / caneca de cerveja. (Para o que está dentro). Por exemplo: doPlayerAddItem (cid, bottleid, 0) daria uma garrafa com sangue no seu interior. "DoPlayerRemoveItem (cid, quantidade, itemid)": Esta função irá remover um item do inventário dos jogadores. "DoRemoveItem (item.uid, item.type)": Esta função seria remover o item que você está usando. "DoSetItemActionId (item.uid, newactionid)": Esta função irá alterar o itemid de um item em uma nova itemid. "DoSetItemText (item.uid," Oi ")": Esta função irá definir o texto de uma leitura (livros, cartas ...). Item.uid é a identificação do item original. "Oi" é o texto que você quer ser no interior do legível. (Vou dar mais explicações sobre isso no "4 - Fazer quests" parte). "DoShowTextWindow (item.uid, 0,0)": Esta função irá mostrar a caixa de texto na tela a partir de uma leitura (livros, cartas ....). Ele não pode colocar no texto que você vai ler! Item.uid é o item que deve ser mostrado pequena em cima. 0,0 é algumas coisas em geral (Você não deve usar essa função para tanto, a maioria dos itens lidos já estão definidos. "DoSendAnimatedText (posição," texto ", 180)": Esta função irá enviar um texto animado para a posição (dano, monstros gritando). A posição é a posição. "Texto" é o texto a ser mostrado (também pode ser um dígito). 180 é a cor. (180 é o vermelho, outros você terá que experimentar). "DoTeleportThing (cid, posição)": Esta função seria teleportar o jogador para uma nova posição. Exemplo Código: onUse Função (cid, item, frompos, item2, topos) posição = {x = 273, y = 433, z = 9} doTeleportThing (cid, posição) ": EndThe valor de armazenamento posição tem multiplicar itens armazenados. Depois de ter definido uma posição de, por exemplo, "posição = {x = 273, y = 433, z = 9}" você sempre pode mudar apenas as coordenadas X assim: Position.x 272 = "DoSendMagicEffect (posição 2)": Esta função simplesmente envia um efeito mágico para uma posição. Os valores de posição podem ser armazenados da mesma forma como no doTeleportThing () função. 2 significa que o efeito mágico. Eu acho que estes podem variar de 1-15 ou algo parecido. Eu não sei o que todos estes efeitos mágicos fazer (2 puf = 12 é bolha teletransporte). "DoTransformItem (item.uid, 1945)": Com esta função você pode alterar um item existente em um outro item. Ao utilizar esta função, o item que você clicou irá mudar para o 1945 itemid (a oeste da alavanca apontando, neste caso). "DoSummonCreature (" guerreiro orc ", a posição)" Esta função irá invocar uma criatura em uma posição que você definiu. (A posição é um valor de armazenamento). "DoPlayerFeed (cid, alimentos)"; Esta função irá alimentar o jogador uma quantidade de alimentos. Eu não sei a quantidade comum para qualquer tipo de alimento embora. Você terá que experimentar com ela. - Obter funções "GetPlayerAcces (cid)": Essa função vai ter o acesso do leitor. Por exemplo: = Acesso getPlayerAcces (CID) O valor de armazenamento de acesso passará a conter o número de acesso do leitor. "GetPlayerGuildId (cid)": Esta função irá fazer os jogadores da guilda id. "GetPlayerHealth (cid)": Essa função vai ficar a saúde dos jogadores. "GetPlayerLevel (cid)": Esta função terá a jogadores do nível atual. "GetPlayerMagLevel (cid)": Esta função irá fazer os jogadores magic level atual. "GetPlayerMana (cid)": Esta função terá a mana jogadores. "GetPlayerMasterPos (cid)": Esta função terá a posição de mestre jogadores (na maioria das vezes o templo spawn posição). "GetPlayerName (cid)": Esta função irá obter o nome dos jogadores. "GetPlayerPosition (cid)": Essa função vai ficar a situação jogadores. "GetPlayerSkill (cid, 6)" Esta função irá obter o nível de perícia dos jogadores. 6 significa que o tipo de habilidade (0 = magia, uma espada = 2 = clube, 3 = ax, 4 = distância, 5 = blindagem, 6 = pesca. Pelo menos se não me engano). Este é o nível da habilidade, e não o número! "GetTilePzInfo (posição)": Essa função vai verificar se o título é uma zona de protecção ou não. Se o resultado for 0, o título vai ser uma zona de protecção. "GetPlayerFood (cid)": Essa função obtém a quantidade de comida que o jogador tem actualmente comido. (Diminui a cada segundo, ele está online ou na cama). A quantidade normal para um jogador estar "cheio" é de 1200. "GetThingfromPos (posição)": Essa função vai ficar tudo em uma posição. Por exemplo: Código: onUse Função (cid, item, frompos, item2, topos) posição = {x = 273, y = 433, z = 9, stackpos = 0} positioninfo = getThingfromPos (posição) EndPositioninfo agora contém informações sobre o título que a posição é. (Porque é stackpos 0) Positioninfo.itemid seria o item.id do título a partir da posição {x = 273, y = 433, z = 9}. Mais informações sobre o stackpos em "4 - Fazer Quests". "GetPlayerStorageValue (cid, o número de armazenamento)": Esta função seria obter um valor de conservação a partir da playersname.xml. Os valores de armazenamento são uma maneira de olhar se o jogador, por exemplo, já fez uma busca. Então, se você gostaria de obter um valor de armazenamento, provavelmente parecido com isto: queststatus = getPlayerStorageValue (cid, 2000) Queststatus que agora contêm um número (na maioria das vezes esse número é -1 se ele não fez a quest, e se ele tiver um). - Outras funções "SetPlayerStorageValue (número, armazenamento cid, 1)" Com esta função você deve definir um valor de armazenamento. Por exemplo: setPlayerStorageValue (cid, 20001) "Print (" oi ", item)": Uma função muito simples de imprimir um texto com um valor dentro da caixa de armazenamento do servidor. Portanto, este será impresso oi 5 (ou qualquer valor item contém). ---- Fazendo utilizáveis A primeira coisa que você teria que fazer é editar o actions.xml. Você pode encontrar esse arquivo dentro do dados / ações / pasta. Este arquivo contém uma grande quantidade de informações. A maioria das linhas se parecem muito com isso: Existem dois tipos diferentes de coisas que você pode adicionar a este arquivo. Quando você insere um itemid =. O script.lua será realizada quando você usa todos os itens com este ID! Ao utilizar o script.lua o uniqueid só será efectuada quando o item que você usa tem uma ID exclusiva "1000" (ou um outro tipo de identificação). Script.lua é o script que será realizada ao usar o item. "Script" pode ser o que quiser. O local de onde o script deve ser-se de dados / ações / ações /. Agora vamos dizer que queremos fazer um arbusto de mirtilo, que você pode realmente usar! Primeiro teríamos que inserir uma linha dentro do actions.xml. Esta linha ficaria assim: Não importa onde essa linha fica contanto que fica entre a ... O roteiro, estamos nos referindo é bush.lua. Então vá para os dados / ações / pasta de ações e criar um novo arquivo chamado bush.lua (quando usando o notepad ser cuidado você não criar um bush.txt). O bush.lua teria que ficar assim: Código: onUse function (cid, item, frompos, item2, topos) se item.itemid == 2785, em seguida, doPlayerFeed (cid, 5) doCreateItem (2677,3, topos) doTransformItem (item.uid, 2786) doDecayItem (item.uid) final endThe if .. olha se o final item.id é igual ao item de id de um arbusto azul. (Na verdade, não necessariamente porque bush.lua só tem de realizar quando se utiliza um arbusto azul. doPlayerFeed (cid, 5) alimentam o leitor doCreateItem (2677,3, topos) cria três bagas azul em cima da bucha. doTransformItem (item.uid, 2786) irá alterar o mato para um arbusto sem bagas azul. Agora salve o arquivo novamente. Quando iniciar o seu servidor e usar um arbusto azul que você vai comer, e 3 bagas azul vai estar em cima da bucha! Eu não descobri como deixar a decadência de Bush para que ele retorne a um arbusto com bagas novamente após algum tempo. Este foi apenas um item simples utilizável. Agora vamos dizer que queremos criar uma alavanca que abriria um "natal" novo para a posição. Esta é uma ação legal quando você tem mais cidades. Você vai para fora do curso precisa adicionar uma linha no actions.xml. A primeira coisa que você tem a fazer é definir a ação id da alavanca que vai usar no editor. Isto é como eu fiz isso: Esta imagem foi redimensionada. Clique nesta barra para ver a imagem completa. A imagem original é 1280x768 261KB de tamanho e pesos. Agora a alavanca no templo tem a ação ID 2000. Teremos de colocar uma linha no actions.xml que dizer que cada vez que alguém usa o item com o ID de um roteiro original 2000 será realizada. Eu adicionei essa linha Agora precisamos fazer uma changehometown.lua que será realizado quando alguém usa a alavanca com a Unique ID 2000. Eu fiz assim: Código: onUse function (cid, item, frompos, item2, topos) se item.itemid == 1945, em seguida, doTransformItem (item.uid, 1946) newpos = {x = 100, y = 100, z = 7} doPlayerSetMasterPos (cid, newpos) mais doTransformItem (item.uid, 1945) final endThe if ... else ... end vai verificar se a alavanca enfrenta o oeste ou leste. Quando caing oeste do id alavanca será 1945. Quando um jogador puxa a alavanca a sua posição de mestre será mudado para uma posição de novo mestre pus no valor de armazenamento newpos. Quando o ID de item não é 1945, a alavanca está voltada para o leste, e em seguida a alavanca só será mudado a face oeste. Estes dois exemplos onde a calma scripts de ação mais fácil. Mas lembre-se que você pode fazer a maneira mais avançado ou maior uma vez e depois estes! ---- 4 Fazendo quests Aqui vou dar uma aula rápida de como você pode fazer buscas avançadas agradável. Na busca primeiro vou explicar algumas coisas em geral. Primeiro: Elevadores (trabalhar com valores de armazenamento e teleports). Isto é como olha no meu mapa: Esta imagem foi redimensionada. Clique nesta barra para ver a imagem completa. A imagem original é 1280x768 184KB de tamanho e pesos. Este é o 3 º andar. Com um elevador e de manutenção. Quando um jogador quer usar o elevador, mas ele ainda não usou qualquer uma das alavancas que não vai funcionar. Assim, ele terá que usar uma das alavancas, antes que ele será enviado para cima ou para baixo. Esta imagem foi redimensionada. Clique nesta barra para ver a imagem completa. A imagem original é 1280x768 182kb de tamanho e pesos. Este é o 2 º andar. Quando você usa a alavanca no 3 º andar será provável teleportado para o 2 º andar. Esta imagem foi redimensionada. Clique nesta barra para ver a imagem completa. A imagem original é 1280x768 178kb de tamanho e pesos. Este é o 1 º andar. Repare que isso parece um pouco mais "assustador" e depois os outros dois. Isso é porque ele é um chão onde você só será teleportado para se você tiver todas as 4 alavancas de manutenção (primeira imagem) em uma posição correta. Aqui está o lever.lua que usei para este script. Os comentários serão iniciar a codificação com um "--comentário" Código: onUse function (cid, item, frompos, item2, topos) Se a alavanca == 2000 then-Elevador item.uid (screen1) queststatus = getPlayerStorageValue (cid, 2000) - - se ele já usou uma das alavancas na manutenção se queststatus == -1 then - - se ele não tem usado == 1945 se item.itemid texto então alguns simples e movimento da alavanca doTransformItem (item.uid, 1946) doPlayerSendCancel (cid, "happends Nada"). mais doTransformItem (item.uid, 1945) doPlayerSendCancel (cid, "A plataforma que está em pé sobre shakes por um segundo.") final outro - - se ele usou uma das alavancas se item.itemid == 1945 then - - se a alavanca é puxada leste doTransformItem (item.uid, 1946) doPlayerSendCancel (cid, "Você ouve algo se mover ...") outro - - se a alavanca é puxada oeste (happends algo) doTransformItem (item.uid, 1945) queststatus1 = getPlayerStorageValue (cid, 2005) - - valor de armazenamento das 4 alavancas na sala de manutenção. Eu não queria olhar para a posição da alavanca, porque senti que todos tinham de dar a tacada a alavanca na posição correta. queststatus2 = getPlayerStorageValue (cid, 2006) queststatus3 = getPlayerStorageValue (cid, 2007) queststatus4 = getPlayerStorageValue (cid, 2008) se queststatus1 == -1 e queststatus2 == -1 e queststatus3 == 1 e queststatus4 == -1 then - - se a posição das alavancas é assim que você será teleportado para o 1 º andar nplayer1pos = {x = 273, y = 433, z = 11} doSendMagicEffect (cid, 2) doTeleportThing (cid, nplayer1pos) outro - - Não se você será teleportado para o 2 º andar nplayer1pos = {x = 273, y = 433, z = 10} doSendMagicEffect (cid, 2) doTeleportThing (cid, nplayer1pos) final final final elseif item.uid == == item.uid 2001 ou 2002, em seguida, - - o elevador para voltar ao terceiro andar se item.itemid == 1945, em seguida, doTransformItem (item.uid, 1946) mais doTransformItem (item.uid, 1945) nplayer1pos = {x = 273, y = 433, z = 9} doSendMagicEffect (nplayer1pos, 2) doTeleportThing (cid, nplayer1pos) final elseif item.uid> 2004 e item.uid <2.009 então - chaves para o elevador na sala de manutenção se item.uid == 2005, então se item.itemid == 1945, em seguida, doTransformItem (item.uid, 1946) setPlayerStorageValue (cid, 2005,1) setPlayerStorageValue (cid, 20001) doPlayerSendCancel (cid, "Você trigered algo.") mais doTransformItem (item.uid, 1945) setPlayerStorageValue (cid, 2005, -1) final elseif item.uid == 2006, em seguida, se item.itemid == 1945, em seguida, doTransformItem (item.uid, 1946) setPlayerStorageValue (cid, 2006,1) setPlayerStorageValue (cid, 20001) doPlayerSendCancel (cid, "Você trigered algo.") mais doTransformItem (item.uid, 1945) setPlayerStorageValue (cid, 2006, -1) final elseif item.uid == 2007, em seguida, se item.itemid == 1945, em seguida, doTransformItem (item.uid, 1946) setPlayerStorageValue (cid, 2007,1) setPlayerStorageValue (cid, 20001) doPlayerSendCancel (cid, "Você trigered algo.") mais doTransformItem (item.uid, 1945) setPlayerStorageValue (cid, 2007, -1) final mais se item.itemid == 1945, em seguida, doTransformItem (item.uid, 1946) setPlayerStorageValue (cid, 2008,1) setPlayerStorageValue (cid, 20001) doPlayerSendCancel (cid, "Você trigered algo.") mais doTransformItem (item.uid, 1945) setPlayerStorageValue (cid, 2008, -1) final final retorno 1 endSo com este código que você fez um script elevador tranquila avançado que pode ser parte de uma missão. Agora, para um script segunda busca. Criando buracos escolher! Se uma pessoa usa uma pick que eu fiz o servidor executar o script pick.lua. Este é o script pick.lua. Código: onUse function (cid, item, frompos, item2, topos) se topos.y topos.x == == 209 e 456 e, em seguida, topos.z == 12 - - coordenadas doTransformItem (item2.uid, 383) - - alteração buraco mais return 0 - - retorno 0 significa que você começa a mensagem. Isso não é possível. (Ou algo do mesmo modo) final return 1 - - retornar 1 significa que ele tem trabalhado endThis é um código muito simples de usar buracos escolher! E se você quiser ter mais furos escolher simplesmente um anúncio topos.x elseif == ... e assim por diante. No entanto, eu não descobri como fazer a decadência buraco, por isso vai voltar ao normal após um período de tempo. Alguém me perguntou se é possível fazer legíveis. Sim, é. Eu trabalhei isso uma vez, mas perdi os dados de como. No entanto eu posso dar um bom palpite sobre como vai funcionar. doSetItemText (uid, "texto") Com esta função você pode definir o conteúdo de um livro, por exemplo, letras legíveis rola ou outro. uid é o ID único de um item do qual deseja alterar o texto. O texto é claro é o texto que você deseja colocar dentro Mas eu notei que algumas vezes você só pode colocar em cerca de 255 caracteres e não mais. Não sei se todos os servidores tem como aquele. Também acredito que se você colocar em "\ n" isso seria o mesmo que um Enter (linha seguinte). Gostou +Rep Creditos:Darker(Ediçao),(Traduçao),(e levar ao xtibia.com) Mindstorm(Criador)1 ponto
-
Tutorial De Action Script
jefreyslyn reagiu a yurez700 por um tópico no fórum
Tutorial de Actions Em primero lugar vamos criar um Script Passo a Passo para acustumar. Crie um arquivo.lua na sua pasta de scripts chamado mineaction e siga os passos abaixo - > Bom , Aconselho sempre começar sua action com: Código: function onUse(cid, item, frompos, item2, topos) Depois com os famosos "Ifs" função "Se" Código: if item.uid == 3000 then Aqui no caso acontecerá alguma coisa se o item que tem a UniqueId 3000 for usado ! (UniqueIds são IDs unicas , que são se pode ter 1 no mapa e podem ser facilmente colocadas com qualquer map editor [botão Direito , Properties , e teremos actionID e UniqueID]) Bom apos o if item.uid == 3000 then Temos que colocar as funções desejadas. No caso temos as funções : Código: * doChangeTypeItem * doCreateItem * doDecayItem * doPlayerAddHealth * doPlayerAddItem * doPlayerAddMana * doPlayerAddSkillTry * doPlayerFeed * doPlayerRemoveItem * doPlayerRemoveMoney * doPlayerSay * doPlayerSendCancel * doPlayerSendTextMessage * doPlayerSetMasterPos * doPlayerSetVocation * doRemoveItem * doSendMagicEffect * doSetItemActionId * doSetItemSpecialDescription * doSetItemText * doShowTextWindow * doSendAnimatedText * doSummonCreature * doTeleportThing * doTransformItem * getItemRWInfo * getPlayerAccess * getPlayerFood * getPlayerGuildId * getPlayerHealth * getPlayerLevel * getPlayerMagLevel * getPlayerMana * getPlayerMasterPos * getPlayerName * getPlayerPosition * getPlayerSkill * getPlayerStorageValue * getPlayerVocation * getThingfromPos * getTilePzInfo * setPlayerStorageValue Não falaremos de Todas mas é bom conhece-las .. Então pule uma linha para colocarmos as funções [No Primeiro exemplo aqui colocarei uma action de Sumonar um determinado Montro.] Bom adicione Código: doSummonCreature("Demon",topos) Isso fará que quando eu usar o Item que tem a UID 3000 seja sumonado um monstro na frente do player Adicione uma linha abaixo de doSummon o efeito magico : Código: doSendMagicEffect(topos,14) Pronto quando o Demon for sumonado agora haverá um efeito magico. agora adicione isto no final Código: else doPlayerSendCancel(cid,"Sorry, not possible.") end return 1 end Sua action terminada deve estar assim : Código: function onUse(cid, item, frompos, item2, topos) Â*Â*if item.uid == 3002 then doSummonCreature("Demon",topos) doSendMagicEffect(topos,14) else doPlayerSendCancel(cid,"Sorry, not possible.") end return 1 end No caso Else significa Mais e Else IF que tambem é muito usado ( não agora ) mais se end é o chamado fim que é usado no fim dos scripts sempre que finaliza alguma coisa. Agora vamos abrir o map editor criar uma statua e adicionar a UniqueID 3000 e abrir tambem a action.xml e adicionar : <action uniqueid="3000" script="mineaction.lua" /> Se tudo deu certo é porque você esta seguindo nosso tuto normalmente! Agora encinarei um pouco outros comandos para então voltar a pratica ! Os mais famosos e usados são : Código: doPlayerAddMana(cid,100) Neste caso adiciona 100 de mana ao player que usar o item que esta destacado na action ! doPlayerAddHealth(cid,100) Mesmo que o acima mas neste caso adiciona life ! doPlayerFeed(cid,120) Adiciona Digamos.. food ao player neste caso o player subirá life e mana por 120 seconds. doPlayerSay(cid,"Hicks",2) Faz o player a dizer uma mensagem usado em cachaça e em mana fluid. doPlayerAddItem(cid,2400,1) É usado em quests no caso adiciona um item do id 2400 que eh uma Magic Sword. doPlayerRemoveMoney(cid,100) Tira dinheiro do player , no caso ali 100 gps. doPlayerSendTextMessage(cid,2,"Tutorial") Aparece uma mensagem no screnn(tela) do player, no caso ali Tutorial. doSendMagicEffect(topos,2) Ele é u famoso efeito magico ^^ doSummonCreature("Dragon",topos) Ali sumona um demon na posição do item usado ! Ele pode ser usado pra sumonar em determinada coordenada exemplo : doSummonCreature("Dragon", {x=138, y=281, z=8}) Bom acho que falei o suficiente por hoje Use sua criatividade em uma suas actions ! Continuando ... Especial Alavancas de Mil maneiras 1 - Removendo pedras - Vejam o Ex(By Peonso) : Código: function onUse(cid, item, frompos, item2, topos) gatepos = {x=181, y=135, z=11, stackpos=1} getgate = getThingfromPos(gatepos) if item.uid == 3002 and item.itemid == 2711 and getgate.itemid == 1822 then doRemoveItem(getgate.uid,1) doTransformItem(item.uid,item.itemid+1) elseif item.uid == 3002 and item.itemid == 2712 and getgate.itemid == 0 then doCreateItem(1822,1,gatepos) doTransformItem(item.uid,item.itemid-1) else doPlayerSendCancel(cid,"Sorry, not possible.") end return 1 end Neste caso vamos esclarecer tudo 3002 o UID da alavanca (não precisa ser necessariamente alavanca mas este exemplo é alavanca) GatePos , é a posição da pedra , parede , estatua ou outra coisa que esteja bloqueando o caminho 1822 É o ID da pedra , parede ... 2711 o ID da alavanca Bom ?!? Sim Otimo Mas podemos editar este exemplo para fazer varias coisas ex: Acordar monstros que estavam transformados em Pedra ... Muita gente deve estar pensando" hã?!? oq isso tem haver?" Olhem só se adicionarmos Código: doSummonCreature("Gargoyle", {x=181, y=135, z=11}) doSendMagicEffect(topos,14) Abaixo do doremoveitem teremos isso basta apenas trocar o ID da pedra para 2015 que é o id da estatua Viram é só usar a criatividade de vocês - Alavancas Sumonando Monstros e colocando Hole No Lugar de uma quest Vamos ver mais uma vez o exemplo do peonso : Código: function onUse(cid, item, frompos, item2, topos) gatepos = {x=181, y=135, z=11, stackpos=1} getgate = getThingfromPos(gatepos) if item.uid == 3002 and item.itemid == 2711 and getgate.itemid == 1822 then doRemoveItem(getgate.uid,1) doTransformItem(item.uid,item.itemid+1) elseif item.uid == 3002 and item.itemid == 2712 and getgate.itemid == 0 then doCreateItem(1822,1,gatepos) doTransformItem(item.uid,item.itemid-1) else doPlayerSendCancel(cid,"Sorry, not possible.") end return 1 end Vamos Pensar o que podemos fazer ... Que tal se nós adicionarmos após o doRemoveItem isso : Código: doSummonCreature("Dragon", {x=190, y=135, z=11}) doSummonCreature("Dragon", {x=187, y=139, z=11}) doSummonCreature("Dragon", {x=184, y=133, z=11}) doCreateItem(409,1,gatepos) Neste caso , vai sumonar 3 Dragons e aparecer um Hole é com para ser usado em Quests [409 é o id da hole] Viram como é facil? É só usar a criatividade ! Bom agora acho que vocêss entenderam como usar as alavancas ... Vamos Falar de Runas e MFs Este exemplo do Joao será nossa Base: Código: -- New MF rune by Joao Paulo 3.0 version -- function onUse(cid, item, frompos, item2, topos) playerpos = {x=topos.x, y=topos.y, z=topos.z, stackpos=253}Â*Â*Â*Â* player = getThingfromPos(playerpos) ml = getPlayerMagLevel(cid) lvl = getPlayerLevel(cid) formula = math.random(((lvl+ml)*2)-(lvl-ml)) if item2.itemid == 1 and ml >= 2 then doSendMagicEffect(playerpos,1) doPlayerAddMana(player.uid,formula) doPlayerSay(player.uid,"Ahhhhhh",2) if item.type > 1 then doChangeTypeItem(item.uid,item.type-1) else doRemoveItem(item.uid,1) end end if item2.itemid == 1 and ml <= 1 then doSendMagicEffect(frompos,2) doPlayerSendCancel(cid,"You dont Have Magic Level to use this rune.") end if item2.itemid >= 2 then doPlayerSendCancel(cid,"You can only use this rune in you or in players.") doSendMagicEffect(frompos,2) end return 1 end Ai logo você ve que não é tão dificil assim ... Se vocês testarem essa versão que upa MTTTTT mana de Mages Oque podemos fazer bom eu não gosto de formulas retire a formula e o getplayerlvl E coloque Código: doPlayerAddMana(cid,100) no lugar do antigo doPlayerAddMana Com isso você pode reparar que toda hora vai upar 100 de mana.. Agora vamos fazer uma runa baseada na do Joao passo a passo : Essa primera runa será pelas actions depois vou encinar uma pela pasta spells. Bom vamos começar igual o exemplo dele: Código: function onUse(cid, item, frompos, item2, topos) playerpos = {x=topos.x, y=topos.y, z=topos.z, stackpos=253} player = getThingfromPos(playerpos) Isso mostra as funções a serem usadas e a posição do Player Vamos pular uma linha e colocar : Código: ml = getPlayerMagLevel(cid) if item2.itemid == 1 and ml >= 2 then Bom isso pega o ML da pessoa para saber se ela tem o Magic necessario para usar. Código: doPlayerAddHealth(player.uid,100) doSendMagicEffect(playerpos,1) doPlayerAddMana(player.uid,100) doPlayerSay(player.uid,"This Potion Are Mud",2) Bom com isso adicionará 100 de life e 100 de mana ao player e força ele a dizer This Potion Are Mud Código: if item.type > 1 then doChangeTypeItem(item.uid,item.type-1) else doRemoveItem(item.uid,1) end end Isso remove 1 carga if item2.itemid == 1 and ml <= 1 then doSendMagicEffect(frompos,2) doPlayerSendCancel(cid,"You dont Have Magic Level to use this rune.") Isso mostra qual ML necessario para usar a LMF (Life mana fluid) Código: end if item2.itemid >= 2 then doPlayerSendCancel(cid,"You can only use this rune in you or in players.") doSendMagicEffect(frompos,2) end return 1 end Finalizando oque acontece quando erra o player e o end. Viram ? Se quiserem fazer runas de adicionar equipes ou senão de teleport como nesse exemplo : Código: function onUse(cid, item, frompos, item2, topos) if item2.itemid == 0 then doPlayerSendCancel(cid,"Sorry, not possible.") else if getPlayerAccess(cid) == 3 then playerpos = getPlayerPosition(cid) doTeleportThing(cid,topos) doSendMagicEffect(playerpos,2) doSendMagicEffect(topos,10) else doPlayerSendCancel(cid,"You are not allowed to use this rune.") end end return 1 end Ou senão o item : Código: doPlayerAddItem(cid,2400,1) É muito facil, apenas adicionar as funções - Agora vou falar sobre quests Bom se você usa YourOts é muito facil Código: -- Tutorial quest if item.uid == (uniqueid que você quer) then queststatus = getPlayerStorageValue(cid,[aconselho colocar a uniqueid]) if queststatus == -1 then if getPlayerLevel(cid) >= (level necessario) then doPlayerSendTextMessage(cid,22,"You have found Tutorial Rox Item.") doPlayerAddItem(cid,(Id Do Item),[Quantidade]) setPlayerStorageValue(cid,(uid),1) else doPlayerSendTextMessage(cid,22,"You need level 20 to get prize.") end else doPlayerSendTextMessage(cid,22,"It is empty.") end Adicione isso na chest.lua Bom agora edite conforma esta acima só que sem os {} [] () Se você não usa YourOts - Baixe YourOts (Brincadera a parte) Ignore o passo acima Vamos ver um exemplo do Peonso Código: function onUse(cid, item, frompos, item2, topos) if item.uid == (UID) then queststatus = getPlayerStorageValue(cid,[uID]) if queststatus == -1 or queststatus == 0 then doPlayerSendTextMessage(cid,22,"You have found an Tutorial Rox.") doSendMagicEffect(topos,12) coins_uid = doPlayerAddItem(cid,[iD Do Item],{Quantidade}) setPlayerStorageValue(cid,[uID],1) else doPlayerSendTextMessage(cid,22,"This chest is empty.") end elseif item.uid == [uID] then queststatus = getPlayerStorageValue(cid,[uID]) if queststatus == -1 or queststatus == 0 then doPlayerSendTextMessage(cid,22,"You have found a Tutorial.") doSendMagicEffect(topos,12) coins_uid = doPlayerAddItem(cid,[iD do Item],{quantidade}) setPlayerStorageValue(cid,[uID],1) else doPlayerSendTextMessage(cid,22,"This chest is empty.") end else return 0 end return 1 end É só substituir colocando os IDs sem os [] {} () Editando LvLDoors by Peonso Bom antes de mais nada temos que adicionar isso no actions.xml Código: <action itemid="1627" script="lvldoor.lua"/> <action itemid="1629" script="lvldoor.lua"/> <action itemid="1645" script="lvldoor.lua"/> <action itemid="1647" script="lvldoor.lua"/> <action itemid="1659" script="lvldoor.lua"/> <action itemid="1661" script="lvldoor.lua"/> <action itemid="1668" script="lvldoor.lua"/> <action itemid="1677" script="lvldoor.lua"/> Essas são as portas mais usadas , quem usa outras pode adicionar facilmente assim: Código: <action itemid="ID Da Porta" script="lvldoor.lua"/> Bom com sua porta add vamos ao script do peonso Código: -- By Peonso, based on Junk Food script function onUse(cid, item, frompos, item2, topos) doorpos = {x=frompos.x, y=frompos.y, z=frompos.z} playerpos = getPlayerPosition(cid) playerlevel = getPlayerLevel(cid) --shadowtemple if item.itemid == 1629 and doorpos.x == 265 and doorpos.y == 118 and doorpos.z == 8 then if playerlevel > 29 then doTeleportThing(cid,doorpos) elseif playerlevel < 30 then doPlayerSendTextMessage(cid,22,"You need to be level 30 or higher.") end --DOMS elseif item.itemid == 1627 and doorpos.x == 133 and doorpos.y == 250 and doorpos.z == 8 then if playerlevel > 39 then doTeleportThing(cid,doorpos) elseif playerlevel < 40 then doPlayerSendTextMessage(cid,22,"You need to be level 40 or higher.") end end return 1 end Explicando : Ali temos 2 portas os ids são 1627 e 1629 a seguir dos IDS temos as coodernadas o lvl 39 then + que 39 ou seja apenas 40 pra cima doTeleportthing(cid,doorpos) isso é a posição da door ou seja vai teleporta o player para dentro da porta Facil não? Edite sua porta você mesmo e mude o ID e as coordenadas - Picks System ( Creditos de Skoll ) Código: function onUse(cid, item, frompos, item2, topos) tilepos = {x=topos.x, y=topos.y, z=topos.z} if item2.itemid == 0 then return 0 end if item2.itemid == 782 and tilepos.x == 56 and tilepos.y == 49 and tilepos.z == 8 then player1pos = {x=56, y=50, z=8, stackpos=253} player1 = getThingfromPos(player1pos) if player1.itemid > 0 then nplayer1pos = {x=56, y=49, z=9} doSendMagicEffect(player1pos,2) doTeleportThing(player1.uid,nplayer1pos) doSendMagicEffect(nplayer1pos,10) else doSendMagicEffect(frompos,2) doPlayerSendCancel(cid,"You are not in the right place!") end end return 1 end Explicando o código By Skoll: Agora la em and tilepos.x == 56 and tilepos.y == 49 and tilepos.z == 8 Ai eh as cordenadas do xaozinhu q vc irá usar a pick para ser teleportado. Tamo quase la! Em if item2.itemid == 782 Este 782 eh o id da tile (o xaumzinhu) q vc colocou na coordenada q a pick devera ser usada. Para dar um toke a+ eu puiz la em doPlayerSendCancel(cid,"You are not in the right place!") esta mensagem se a mula do cara usa a pick e naum estiver no lugar certo q vc colocou. OBS: tilepos = {x=topos.x, y=topos.y, z=topos.z} n mexe ai pq se naum vai dar erro! Agora entendendo e execuntando by Skoll Isso é o pick system tem gente que não sabe nem oq é pick eh aquele intrumento que usamos para fazer buracos no chão , nesta aula que você teve retirada de um tuto do Skoll com autorização dele é claro ele encinou como executar essa magnifica action , é a primeira vez que trabalhamos com o item2 em nossas aulas , o item2 é aquele segundo item do use with ( ex - eu dou use em uma rope e depois na tile de subir no caso a tile de subir é o item2) ele é utilizado em boa parte das actions ai você pergunta em não vi um "item1", ai que entra a code do actions.xml. Código: <action itemid="3394" script="pick.lua" /> Em actions gerais (eu gosto de chamar assim) você deve sempre colocar o id do item que da o use na actions.xml Código: Glossário Item2 - Serve para itens tipo que você da use e tem que clicar em outro esse outro é o item2 Math Random - Define tudo aquilo que é aletorio ou não é pré definido. If - Função 'Se' é usada em 90% das actions Do - As Funções 'Do' representam sempre o fazer , Ex Sumonar , Transformar And - É o famoso "E" usamos ele quando colocamos algo a + Or - Função Ou , serve para as actions não ficarem muito extensas UID - UniqueIds , elas só podem ser usadas em 1 item no jogo elas são unicas Elseif - E se , Mas se , Determina um especie de condição se algo acontecer ela ativará a ação. End - Finaliza as ações 50% Skoll e 50% Yurez700 Tutorial Feito Ontem1 ponto -
Lizard Castle
guiabc321 reagiu a riqueemapper por um tópico no fórum
Lizards Castle by Riquemaper' Bom Gente venho divulgar mais um de meus trabalhos. Fiz uma um castelo de Lizards estilo o de Razachai(drakens).Os novos Lizards se acomodaram nos andares superiores do castelo a fim de proteger seu rei, e, no Subosolo há uma classe de Drakens trabalhando para aumentar o castelo, outras criaturas também são encontradas num spawn diferenciado e interessante! Abaixo algumas imagens: Quaisquer defeitos, por favor, me avisem para buscar sempre melhorar! Bom pra quem gostou está ai o Link para Download: Clique aqui Ainda não sei como funciona este sistema de scan, mas afirmo de que está livre de vírus. É isso ai, em breve estarei divulgando mais criações minhas. QUEM GOSTOU DA +REP! Obrigado! :smile_positivo:1 ponto -
O Melhor Mapa #1
Mophus reagiu a Gabriel Couto por um tópico no fórum
Boa tarde XTibianos e Mappers, anunciamos um novo concurso na área de Mapping Hoje! O Melhor Mapa #1 Tema: Vilarejo Uma pequena vila no meio do mapa, perto da natureza, com poucas casas, poço d'água.. *Lembrando que é algo pequeno, não é preciso fazer um vilarejo muito grande, não estaremos avaliando o número de casas, sim o seu mapa. Como Participar: Envie seu mapa para AnyurCT e Koalawopit por mensagem pessoal, em arquivo .otbm Seu Mapa deverá ter o nome no arquivo de: MelhorMapa#1-(Nome No Xtibia) Você pode enviar até duas imagens, hospedadas no ImageShack ou TinyPic. Seu Mapa deverá ser enviado na mensagem pessoal pelo link do site onde você hospedou o arquivo. Você pode hospedar em qualquer site, mas dê Preferência ao 4shared e EasyShare. Regras: Só será aceito o envio do arquivo em .otbm, caso ele não for enviado, você estará desclassificado. Não poderá ser reclamada a foto que postarmos do seu mapa. Se você enviar mais de 2 fotos, escolheremos duas para colocar no post, não serão aceitas reclamações. Não EDITE sua foto, não aceitaremos elas, caso isso ocorrer, a foto a ser postada será a nossa. Não serão Aceitas fotos tiradas no Tibia, caso isso ocorrer, a foto a ser postada será a nossa. Critérios de Avaliação: O Mapa será avaliado por AnyurCT e Koalawopit, com os seguintes critérios: Detalhamento (13 Pontos) Criatividade (12 Pontos) Beleza do Mapa (13 Pontos) Jogabilidade (12 Pontos) Bugs (Cada Bug Irá Caracterizar a Perda de 1 Ponto) Total: 50 Pontos Após a avaliação individual, serão somados os pontos de cada avaliador, dando um total de 100 Pontos. O Vencedor será o que possuir mais pontos. Premiação: Os Vencedores ganharão os seguintes pontos: 1º Lugar: 3 Pontos e Sign. 2º Lugar: 2 Pontos e Sign. 3º Lugar: 1 Ponto e Sign. 4º Lugar ou Menos: 0,5 Pontos. Esses Pontos Ganhados Estarão em um Ranking. Você pode conferir o Ranking e as regras de pontuação clicando Aqui Calendário: Início do Concurso: 12/06/2011 Término do Concurso (Prazo de Entrega): 17/06/2011 *Resultado do Concurso: 18/06/2011 **Início da Próxima Edição: 19/06/2011 * O Resultado Poderá Atrasar no MÁXIMO 1 dia. **Caso Atrasar o Resultado, o Início da próxima edição ocorrerá no mesmo dia do resultado. Imparcialidade: Lembrando a todos que seremos totalmente imparciais ao julgar os mapas e que qualquer um poderá ser o ganhador, e que o ranking é mais um motivo para continuar participando. Projeto: Os Mapas vencedores serão juntados para fazermos uma Cidade, que será postada na área de download ao fim dela. Espero que participem. Confiram o tópico do ranking para saber como será a premiação correta. Atenciosamente, AnyurCT1 ponto -
[Encerrado] Erro 64 Bits!
brubru01 reagiu a decosiqueira por um tópico no fórum
junto com seu distro vem os sources abra ele altera as linhas para 64 bits e compila se não conseguir vou ver se faço amanha e digo se funfo, agora só tenho o tfs 0.4 serve?1 ponto -
Bone Brother
fsg reagiu a Matheuzinhoul por um tópico no fórum
Grau? Premium? Pontos? 1 (um) Descrição Você entrou para a irmandade dos mortos-vivos - tornando a morte sua inimiga, assim como sua arma. Seu objetivo principal é devorar tudo o que é fraco, abrindo espaço para o que é forte. Spoiler Obtido ao entrar na Brotherhood of Bones na Dreamer's Challenge Quest.1 ponto -
em creaturescripts/scripts crie um arquivo chamado levelmax.lua e cole o seguinte código: local LevelMax = 200 function onAdvance(cid, skill, oldLevel, newLevel) if skill == 8 then if oldLevel == LevelMax then doPlayerAddLevel(cid, -1) end end return true end depois na mesma pasta procure o login.lua e registre o evento como registerCreatureEvent(cid, "LevelMax") na pasta anterior no arquivo creaturescripts.xml adc a seguinte tag: <event type="advance" name="LevelMax" event="script" value="levelmax.lua"/> para configurar o level max é bem simples é só mudar no script: local LevelMax = 200 flw's1 ponto
-
[Encerrado] Como Mudar O Acc Manager?
murilo351 reagiu a ereveworld1 por um tópico no fórum
É só ir no arquivo LUA do seu servidor e lá vai ter: Ou algo parecido, é só colocar "no" Ajudei ? Rep +1 ponto -
Ajudando... http://www.megaupload.com/?d=M7IYNCL4 Baixe Ai e Coloque Nesta Pasta DATA/ITEMS Espero Ter Ajudado1 ponto
-
[Encerrado] [Dúvida] Sqlite Studio 8.71
miragemowna reagiu a pessoa93 por um tópico no fórum
Isso é no config.lua. aperta ctrl + f e procure por sha1 e troque por plain.. cria uma conta nova e veja. se ajudei custa nada da rep+1 ponto -
Feliz Aniversário Guimanucci
Vodkart reagiu a spartangui por um tópico no fórum
valeu cara s2 vc é bonzinho *-*1 ponto -
Erro No Mysql
lpcordovil reagiu a Piabeta Kun por um tópico no fórum
mans se vc usa encryptionType = "sha1" passe para encryptionType = "plain" reset seu server e teste! axu q dara certo se for esse o caso!1 ponto -
De nada. Se tiver mais duvidas não exite em postar! Me agradeça. me de REP+ Só clica nesse botão no meu post lá $config['site']['newchar_towns'][0] = array(2); $config['site']['newchar_towns'][1] = array(1,2); muda pra $config['site']['newchar_towns'][0] = array(1,2); $config['site']['newchar_towns'][1] = array(2); Vai ter pra escolher entre a cidade 1 e 2 agora.1 ponto
-
Item Que Da Storage.
othereality reagiu a Demonbholder por uma questão
function onUse(cid, item) if getPlayerStorageValue(cid, 25504) == -1 then setPlayerStorageValue(cid, 25504, 1) doPlayerSendTextMessage(cid, 22, "Voce encontrou uma chave.") else doPlayerSendTextMessage(cid, 22, "Voce já fez esta quest.") return FALSE end return TRUE end <action actionid="AID" event="script" value="chave.lua"/>1 ponto -
aqui vai: Obs: Ainda Não Testei =S :google_lt: :cool:1 ponto
-
[Encerrado] Duvidas Para Iniciar Meu Ot
FL4REON reagiu a GODRaphael por um tópico no fórum
Cara eu Uso o Flash Pra Mim é o Melhor Acho Que Seria o Mais Adequado Para você, e Também é Mas Atualizado xD1 ponto -
Gabriel, só pra te dar uma ideia: Com foco Sem foco dei mais foco na sua sign, como: Escureci os cantos Dei blur nas partes que não são a render Dei um pequeno sharpen na render1 ponto
-
1 ponto
-
[Urgente]Quero Script Que Acumula Items Automaticamente Na Bp
affcara reagiu a othereality por um tópico no fórum
@ KamuiHunt2 vc é programador e não sabe que isso só é possivel compilando ? @ topico eu ja vi tutos sobre isso aki no xtibia mas tem que compilar..1 ponto -
-1 pontos