Histórico de Curtidas
-
Rodrigo94 deu reputação a L3K0T em System Drop Global - L3K0T TFS 0.4Sistema de Drop Personalizado
Esse sistema de loot foi projetado para adicionar um elemento de sorte e surpresa ao derrotar monstros. Sempre que um jogador derrota um monstro, há uma chance configurada para que ele solte entre 1 a 3 itens especiais, garantindo recompensas valiosas ao jogador.
O sistema realiza as seguintes ações:
Chance de Drop: A cada morte de um monstro, há uma chance configurada para dropar itens específicos. O sistema permite que sejam dropados entre 1 a 3 unidades do item, tornando o sistema mais dinâmico.
Efeito Visual: Quando o loot é bem-sucedido, um efeito visual especial (ID 231) é exibido na posição exata onde o monstro foi derrotado, criando uma animação visual que destaca a recompensa.
Notificação ao Jogador: Após o drop, o jogador recebe uma mensagem personalizada informando a quantidade de itens obtidos. Essa notificação aparece após 3 segundos, adicionando uma camada de imersão e evitando sobrecarregar o chat imediatamente após a morte do monstro.
*Ótimo para fazer eventos de dropar certo itens para alguma missão ou resgates.
*Uso no meu TIBIA HARRY POTTER ORIGIN
VAi em creaturescripts/scripts.lua
local function findCorpse(position) for i = 1, 255 do position.stackpos = i local corpse = getThingfromPos(position) if isCorpse(corpse.uid) then return corpse.uid end end return false end local function dropLoot(position, killer) local corpse = findCorpse(position) if not corpse then return false end local itemId = 2160 local chance = 23 if math.random(100) <= chance then local amountToDrop = math.random(1, 3) doAddContainerItem(corpse, itemId, amountToDrop) local corpsePosition = getThingPos(corpse) doSendMagicEffect(corpsePosition, 7) local function sendMessage() if isPlayer(killer) then local message = string.format("Você dropou %d Crystal Coin(s).", amountToDrop) doPlayerSendTextMessage(killer, MESSAGE_INFO_DESCR, message) end end addEvent(sendMessage, 2500) end return true end function onKill(cid, target) local position = getCreaturePosition(target) addEvent(dropLoot, 100, position, cid) return true end
creaturescripts.xml
<event type="kill" name="GlobalDrops" registerTo ="GlobalDrops" event="script" value="globalDrops.lua"/> ou depende do tfs
<event type="kill" name="GlobalDrops" event="script" value="globalDrops.lua"/>
Para ambos TFS registra o evento no login.lua
registerTo ="GlobalDrops"
feito isso.. agora todos os monstros do mapa vai cair os crystal coins de 1 há 3.
-
Rodrigo94 deu reputação a GM Antica em Mapa "Training Room" 8.60Olá galera tudo bem?
Achei esse mapa aqui no fórum, porém ele nao estava funcional. Foi retirado alguns bugs visuais, e certificado que não ocorra PVP dentro dos Treiners:
Modificações:
● Capacidade total = 76 players
● Treiners divididos com "Wall" para o bom funcionamento e evitar que ocorra mortes dentro dos Treiners...
● Paisagens refeitas, um andar "Lobby" foi adicionado para interação e comércio
● Teleport adicionado no final de cada corredor para uma possível extensão
CRÉDITOS: Alissow + GM Antica
Segue alguns Prints:
Scan Vírus Total: https://www.virustotal.com/gui/file/456c5959bd38bd7bd61f8c46af1117e0425963da0f8e5afce0bf411bdd366171?nocache=1
Download:
Training Room 8.60 - by Alissow & GM Antica.rar
-
Rodrigo94 deu reputação a WakeSoft em (PEDIDO) Task system (Killing in the name of) grizzly addans com boss room tfs 0.4tem vários datapacks disponibilizados no forum com tal sistema. dá uma procurada e transfere para seu servidor
-
Rodrigo94 deu reputação a Pandawan. em (Resolvido)Pedido NPC CassinoOlá amigo, teste esse script, se apresentar algum erro me avise!
Na pasta NPC você cria o arquivo: Cassino (ou nome do NPC a sua escolha)
A outfit pode ser alterada ao seu gosto
Na pasta NPC>Scripts você cria: cassino_dice.lua (ou nome do script a sua escolha)
Aqui lembre de mudar o LOCAL TABLE !!!
-
Rodrigo94 deu reputação a bobyx em [PEDIDO] Mounts GesiorTem como fazer sim sem ser pelo addon doll. Use esse código no shop.lua
ao cadastrar no gesior ao invés de voce coloca o id do item você coloca a id do mount.
-- ### CONFIG ### -- message send to player by script "type" (types you can check in "global.lua") SHOP_MSG_TYPE = 18 -- time (in seconds) between connections to SQL database by shop script SQL_interval = 30 -- ### END OF CONFIG ### function onThink(interval, lastExecution) local result_plr = db.storeQuery("SELECT * FROM z_ots_comunication") if(result_plr ~= false) then repeat local id = tonumber(result.getDataInt(result_plr, "id")) local action = tostring(result.getDataString(result_plr, "action")) local delete = tonumber(result.getDataInt(result_plr, "delete_it")) local cid = getPlayerByName(tostring(result.getDataString(result_plr, "name"))) if(cid) then local itemtogive_id = tonumber(result.getDataInt(result_plr, "param1")) local itemtogive_count = tonumber(result.getDataInt(result_plr, "param2")) local container_id = tonumber(result.getDataInt(result_plr, "param3")) local container_count = tonumber(result.getDataInt(result_plr, "param4")) local add_item_type = tostring(result.getDataString(result_plr, "param5")) local add_item_name = tostring(result.getDataString(result_plr, "param6")) local received_item = 0 local full_weight = 0 -- Script para addons e montaria full pelo Gesior -- if(add_item_type == 'mounts') then local player = Player(cid) if (getPlayerStorageValue(cid,itemtogive_id) == -1) then doPlayerAddMount(cid, itemtogive_id) setPlayerStorageValue(cid,itemtogive_id,1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYDAMAGE) doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, 'You received '.. add_item_name ..' from Otserv Soft Shop.') db.query("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";") db.query("UPDATE `z_shop_history_item` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";") else doPlayerSendTextMessage(cid,25,"You Already have this Mount.") end return TRUE end -- fim do script -- -- Script para addons e montaria full pelo Gesior -- if(add_item_type == 'addons') then local player = Player(cid) if (getPlayerStorageValue(cid,itemtogive_id) == -1) then doPlayerAddOutfit(cid, itemtogive_id, 3) doPlayerAddOutfit(cid, container_id, 3) setPlayerStorageValue(cid,itemtogive_id,1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYDAMAGE) doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, 'You received '.. add_item_name ..' from Otserv Soft Shop.') db.query("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";") db.query("UPDATE `z_shop_history_item` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";") else doPlayerSendTextMessage(cid,25,"You Already have this Outfit.") end return TRUE end -- fim do script -- if(add_item_type == 'container') then container_weight = getItemWeight(container_id, 1) if(isItemRune(itemtogive_id)) then items_weight = container_count * getItemWeight(itemtogive_id, 1) else items_weight = container_count * getItemWeight(itemtogive_id, itemtogive_count) end full_weight = items_weight + container_weight else full_weight = getItemWeight(itemtogive_id, itemtogive_count) if(isItemRune(itemtogive_id)) then full_weight = getItemWeight(itemtogive_id, 1) else full_weight = getItemWeight(itemtogive_id, itemtogive_count) end end local free_cap = getPlayerFreeCap(cid) if(full_weight <= free_cap) then if(add_item_type == 'container') then local new_container = doCreateItemEx(container_id, 1) local iter = 0 while(iter ~= container_count) do doAddContainerItem(new_container, itemtogive_id, itemtogive_count) iter = iter + 1 end received_item = doPlayerAddItemEx(cid, new_container) else local new_item = doCreateItemEx(itemtogive_id, itemtogive_count) received_item = doPlayerAddItemEx(cid, new_item) end if(type(received_item) == "number" and received_item == RETURNVALUE_NOERROR) then doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, 'You received '.. add_item_name ..' from Otserv Soft Shop.') db.query("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";") db.query("UPDATE `z_shop_history_item` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";") else doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, ' '.. add_item_name ..' from Keltera Shop is waiting for you. Please make place for this item in your backpack/hands and wait about '.. SQL_interval ..' seconds to get it.') end else doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, ' '.. add_item_name ..' Keltera Shop is waiting for you. It weight is '.. full_weight ..' oz., you have only '.. free_cap ..' oz. free capacity. Put some items in depot and wait about '.. SQL_interval ..' seconds to get it.') end end until not result.next(result_plr) result.free(result_plr) end return true end -
Rodrigo94 deu reputação a dezon em Shop Admin Gesior 2012 (TFS 0.3.6 ~ 0.4, 1.0)[+] Shop Admin Gesior 2012 (TFS 0.3.6 ~ 0.4, 1.0) [+]
[+] Nova versão 2015 [+]
Olá pessoal!
Quero apresentar a mais nova versão do meu script para administrar Web Shop do Gesior 2012.
[+] O que tem de novo?:
O script foi revisado; Comentado as principais partes; Escrito algumas funções e ações novas; Revisado anti-inject; Agora você pode adicionar pontos para quem fizer doação; De uma forma geral, foi revisado de cabo à rabo ! [+] Imagens:
[+] Galeria de imagens online
http://postimg.org/gallery/1ssnwbf1i/
[+] Instalação:
Basta você ter o Gesior 2012 instalado junto aos scripts LUA de shop do mesmo; Ter o banco de dados instalado e um servidor TFS 0.3.6+, TFS 1.0, 1 rodando também.
+ Vá na pata {seu_web_server}\www ou htdocs\pages\ e renomeie o arquivo 'shopadmin.php' para 'shopadmin.php.old';
+ Faça download do script novo e cole na pasta que citei à cima;
+ Faça download desse arquivo http://item-images.ots.me/items_images_1076.zip;
+ Copie e cole a pasta que vem dentro desse arquivo e cole na pasta {seu_web_server}\www ou htdocs\images\ ficando assim {seu_web_server}\www ou htdocs\images\items\ e dentro dessa pasta as imagens dos itens do tibia;
+ Pronto!
[+] Download:
http://www.mediafire.com/view/z62d9zxylpg36dz/shopadmin.php
[+] Scan:
https://www.virustotal.com/pt/file/c06a2f7e1c1909b34f4dee2a7c27930a6c7cad1882edfcdf101689b0b61899d9/analysis/1399682407/
[+] ATENÇÃO: Bug encontrado:
Na realidade o shopadmin.php desenvolvido por mim, não contém bug's, ele faz o registro das ofertas corretamente, o que eu não consegui consertar foi o data/globalevents/scripts/others/shop.lua.
Ele não consegue criar o container e adicionar os itens dentro desse container da oferta cadastrada, exemplo: se você criar uma BP de SD, dá o seguinte erro:
Lua Script Error: [GlobalEvent Interface] data/globalevents/scripts/others/shop.lua:onThink LuaScriptInterface::luaPlayerAddItemEx(). Item not found stack traceback: [C]: in function 'addItemEx' data/lib/compat/compat.lua:363: in function 'doPlayerAddItemEx' data/globalevents/scripts/others/shop.lua:50: in function <data/globalev ents/scripts/others/shop.lua:7> Claro que estou correndo atrás de resolver esse problema, mas se por um acaso alguém tiver a solução, peço que por gentileza, poste aqui que darei os devidos créditos!
[+] Como adicionar items?
Para adicionar items ao shopping é muito fácil, basta você seguir igual eu postei nas fotos a configuração, respeitando o ID do item, Quantidade, o Tipo da oferta e etc, assim você enviará uma nova oferta para o seu site.
Para adicionar uma oferta do tipo Container (Bp, Bag, etc) é fácil também, basta você preencher como na imagem à seguir:
[+] Explicando:
Coloque o 'Nome' da oferta. Insira uma 'Descrição' para essa oferta. Diga a quantidade de 'Premium points' necessários. Selecione o tipo da oferta: 'Item' ou 'Container'. Coloque o 'ID Item 1' à ser vendido, caso seja um item normal: armadura, espada, etc. Preencha a 'Qtde. Item 1' que o player irá receber quando comprar essa oferta. Deixe em branco 'ID Item 2' e 'Qtde. Item 2'. Caso seja BP, selecione o tipo para 'Container', no 'ID Item 1' coloque o Id da BP. Em 'Qtde. Item 1' você deve colocar a quantidade para cada item dentro do container, exemplo: se for BP de Runa, para preencher a BP você terá um total de 20 slots preenchidos pela quantidade de runas do 'Qtde. Item 2', então coloque 20, pois representa a quantidade de slots dentro do container. Agora em 'ID Item 2' você coloca o ID da Runa ou do item que você está vendendo dentro do container. Preencha a 'Qtde. Item 2' com a quantidade para cada slot do container que você está vendendo. Clique em salvar. Pronto, adicionado! [+] Isso é necessário:
Lembrando que você precisa estar já com os scripts em lua funcionando corretamente do sistema de shop do Gesior 2012, você pode encontrá-los aqui: http://otland.net/threads/gesior2012-items-shop-installation-administration.170654/
Obrigado à todos!!!
-
Rodrigo94 deu reputação a zGiovani em Adicionando Novas Montarias e Itens Tibia Ot Server 12x (Assets Editor) Corrigindo Itens não aparecendo na Store.Olá pessoal, mais uma vez venho aqui na intenção de ajudar a galera que está quebrando a cabeça como eu quebrei...
Procurei vários videos e comunidades e não encontrei como resolver esse bug de quando importava as novas montarias ou itens no assets editor ele não funcionava no jogo, mesmo estando tudo configurado certinho.
Uma Maneira rápida e simples de explicação é:
Depois de adicionado e configurado o item, montaria, monstro ou Addon;
De um compile no Assets Editor
Abra a pasta do seu client
Abra a pasta Assets do seu client
Localize o arquivo parecido ou igual a esse: "appearances-57a4033d729f0cc94a3699172abb36d232cb8cd3babfb738e7cab08b475d3ccf.dat"
Copie ele e cole na pasta do seu: server/data/items
Renomeie o arquivo para: appearances.dat
Problema Resolvido, espero ter ajudado
VIDEO TUTORIAL
Quem puder dar uma força la no canal, será bem vindo!
Desculpa se postei no lugar errado, a intenção é ajudar...
-
Rodrigo94 deu reputação a KotZletY em Aumentando a quantidade de ShootEffects permitida - 8.60Salve galera recentemente Criei um Tópico de como aumentar o Limite de effects no 8.60 para mais de 255 efeitos, e fiz um Tópico de como mudar de uint8 para uint16 nas Source, para MagicEffect e ShootEffect, porém o Tutorial ficou meio inútil para ShootEffect pois precisa mudar no Client também. E então hoje estarei mostrando como mudar no Client. Abaixo mais informações!
Esse Tutorial serve apenas para Versão 8.60 do Client, a versão 8.54 é diferente e então caso queiram eu posso mostra como fazer em um Futuro não distante. Hehe!
Para que as alterações funcione, é preciso que você modifique também na source da sua distro!
Muito bem, abra o OllyDbg e abra seu Client:
Depois de ter aberto o Client aperte Ctrl+G e procure pela função 004108F1 e de um enter, como mostra a foto abaixo:
Feito isso, você cairá exatamente em cima do endereço onde deve alterar, como mostra a imagem abaixo:
Muito bem hora de altera, o endereço que devemos altera é o segundo e terceiro. Dê 2x clicks ou aperte espaço em cima da função e mude o segundo endereço para CALL 004F9C00
e depois click em Assembly, como mostra a imagem abaixo:
Depois mudamos o terceiro endereço, para MOVZX EAX, AX e depois click em assembly, como mostra a imagem abaixo:
E fim, precisamos agora salvar nosso Client com a modificação, aperte com o Botão direito do mause e vá em
Copy to executable > All modifications
Depois em Copy All
Vai abrir outra janela, novamente click com o botão direito do mause, e vá em save file:
E depois escolha o Luga onde quer salvar:
E fim, lembre-se de fazer a modificação na Source, caso não saiba fazer use esse Tutorial aqui!
Download do OllyDbg
Scan do OllyDbg
Lembrando que o Vírus encontrado no OllyDbg é por causa da sua Dll que faz alteração interna na source de um Programa.
Créditos: {
Breno Neves (Eu)
Fernando Prado (Parça que me passou os últimos endereços.)
}
É proibido posta esse Conteúdo em outro Blog, site ou fórum, Tutorial feito exclusivo para o Tk!
Bom uso e até mais! xD
-
Rodrigo94 deu reputação a Unforged em VIP System by Mock 100%VIP System by Mock 100%
Fala galerinha do TK, então, há muito tempo atrás lá para meados de 2010 eu e alguns amigos pegamos um sistema de VIP inacabado pelo tão famoso scripter Mock e finalizamos ele deixando-o perfeito para uso, enfim, eu não achei esse script aqui no fórum e resolvi compartilhar com vocês, espero que gostem, confiram:
1° - Acesse a pasta data/lib e crie um arquivo chamado 049-vipsys.lua, coloque isso dentro do arquivo:
vip = { name = "VIP System"; author = "Mock"; version = "1.0.0.0"; query="ALTER TABLE `accounts` ADD `vip_time` INTEGER"; query2="ALTER TABLE `accounts` ADD `vip_time` INT(15) NOT NULL" } function vip.setTable() dofile('config.lua') if sqlType == "sqlite" then db.executeQuery(vip.query) else db.executeQuery(vip.query2) end end function vip.getVip(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == FALSE then error('Player don\'t find') end; ae = db.getResult("SELECT `vip_time` FROM `accounts` WHERE `name` = '"..getPlayerAccount(cid).."';") if ae:getID() == -1 then return 0 end local retee = ae:getDataInt("vip_time") or 0 ae:free() return retee end function vip.getVipByAcc(acc) assert(acc,'Account is nil') local a = db.getResult("SELECT `vip_time` FROM `accounts` WHERE `name` = '"..acc.."';") if a:getID() ~= -1 then return a:getDataInt("vip_time") or 0, a:free() else error('Account don\'t find.') end end function vip.setVip(cid,time) dofile("config.lua") assert(tonumber(cid),'Parameter must be a number') assert(tonumber(time),'Parameter must be a number') if isPlayer(cid) == FALSE then error('Player don\'t find') end; db.executeQuery("UPDATE `"..sqlDatabase.."`.`accounts` SET `vip_time` = '"..(os.time()+time).."' WHERE `accounts`.`name` ='".. getPlayerAccount(cid).."';") end function vip.getVipByAccount(acc) assert(acc,'Account is nil') return db.getResult("SELECT `vip_time` FROM `accounts` WHERE `name` = '"..acc.."';"):getDataInt("vip_time") or 0 end function vip.hasVip(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == FALSE then return end; local t = vip.getVip(cid) or 0 if os.time(day) < t then return TRUE else return FALSE end end function vip.hasVips(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == FALSE then return end; local t = vip.getVip(cid) if os.time(day) < t then return TRUE else return FALSE end end function vip.accountHasVip(acc) assert(acc,'Account is nil') if os.time() < vip.getVipByAccount(acc) then return TRUE else return FALSE end end function vip.getDays(days) return (3600 * 24 * days) end function vip.addVipByAccount(acc,time) assert(acc,'Account is nil') assert(tonumber(time),'Parameter must be a number') local a = vip.getVipByAcc(acc) a = os.difftime(a,os.time()) if a < 0 then a = 0 end; a = a+time return vip.setVipByAccount(acc,a) end function vip.setVipByAccount(acc,time) dofile("config.lua") assert(acc,'Account is nil') assert(tonumber(time),'Parameter must be a number') db.executeQuery("UPDATE `accounts` SET `vip_time` = '"..(os.time()+time).."' WHERE `accounts`.`name` ='"..acc.."';") return TRUE end function vip.returnVipString(cid) assert(tonumber(cid),'Parameter must be a number') if isPlayer(cid) == TRUE then return os.date("%d %B %Y %X ", vip.getVip(cid)) end end 2° - Abra a pasta data/creaturescrpits/scripts e crie um arquivo chamado fimvip.lua, dentro dele adicione:
By Lukeskywalker
function onLogin(cid) local temple = { x =32369, y = 32246, z = 6} if vip.hasVip(cid) == true then if getPlayerStorageValue(cid,55555) ~= 1 then setPlayerStorageValue(cid,55555,1) end else if getPlayerStorageValue(cid,55555) == 1 then doTeleportThing(cid, temple) doPlayerSendTextMessage(cid, 22, "Your VIP Time over!") db.executeQuery("UPDATE `accounts` SET `vip_time` = 0 WHERE `id` = ".. getAccountIdByName(getPlayerName(cid)) ..";") setPlayerPromotionLevel(cid, 1) setPlayerStorageValue(cid, 55555, 0) end end return true end Você pode troca as coordenadas do templo: local temple = {x=32369, y=32246, z=6}.
3° - Em data/creaturescripts/scripts/login.lua adicione essas tags:
registerCreatureEvent(cid, "FimVip") registerCreatureEvent(cid, "VipReceive") 4° - Em data/creaturescripts/creaturescripts.xml adicione está tag:
<event type="login" name="FimVip" event="script" value="fimvip.lua"/> 5º - Em data\movements\scripts e crie um arquivo chamado viptile.lua e adicione isso dentro dele:
function onStepIn(cid, item, position, fromPosition) local tileConfig = { kickPos = fromPosition, kickEffect = CONST_ME_POFF, kickMsg = "You need to be a vip player to access this area.", enterMsg = "Welcome to vip area!", enterEffect = CONST_ME_MAGIC_RED, } if isPlayer(cid) == true then if vip.hasVip(cid) == FALSE then doTeleportThing(cid, tileConfig.kickPos) doSendMagicEffect(tileConfig.kickPos, tileConfig.kickEffect) doPlayerSendCancel(cid, tileConfig.kickMsg) return end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tileConfig.enterMsg) doSendMagicEffect(position, tileConfig.enterEffect) return true end end 6° - Em data\movements\movements.xml adicione a tag:
<movevent type="StepIn" actionid="13500" event="script" value="viptile.lua"/> Vejam a numeração 13500 você irá usar no tile que você quer para a passagem de player VIP para configurar adicione a numeração em ActionID do tile.
7° - Em data/talkactions/scripts acrescente dentro da pasta scripts uma outra pasta com o nome VIP vamos precisar de 7 arquivos.lua que teram os nomes e códigos a seguir:
add.lua
function onSay(cid, words, param, channel) doPlayerSendCancel(cid, "Added "..param.." Vip Days.") return doPlayerAddVipDays(cid, param) end addvipp.lua
function onSay(cid, words, param) if param == "" then return doPlayerPopupFYI(cid,"Está com problemas?\nAprenda os comandos!\n---------------\nAdicionar vip:\n/vip add days player\n/vip add 30 Real\n---------------\nDeletar vip:\n/vip del player\n/vip del Real\n---------------\nVer a vip:\n/vip see player\n/vip see Real\n---------------\n") end if param:lower():find('add') == 1 and 3 then local _,_,id,name = param:lower():find('add (%d+) (.+)') name = name or "" id = tonumber(id or 1) or 1 if tonumber(id) == nil or getPlayerByName(name) == false then return doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"Adicionar vip:\n/vip add days player\n/vip add 30 Real\n [Player: "..name.."]") end if isPlayer(getPlayerByName(name)) == TRUE then vip.addVipByAccount(getPlayerAccount(getPlayerByName(name)) ,vip.getDays(id)) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,"Foram adicionados "..tonumber(id).." dias de vip a "..name..".") doPlayerSendTextMessage(getPlayerByName(name),MESSAGE_INFO_DESCR,"Você recebeu "..tonumber(id).." dias de vip.") else doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,name.." não esta online ou não existe.") end elseif param:lower():find('del') == 1 and 3 then local _,_,name = param:lower():find('del (.+)') if getPlayerByName(name) == false then return doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"Deletar vip:\n/vip del player\n/vip del Real\n") end vip.setVipByAccount(getPlayerAccount(getPlayerByName(name)),-os.time()) doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"A vip de "..name.." foi apagada.") elseif param:lower():find('see') == 1 and 3 then local _,_,name = param:lower():find('see (.+)') name = name or "" if getPlayerByName(name) == false then return doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"Ver a vip:\n/vip see player\n/vip see Real\n") end local ret_ = vip.getVip(getPlayerByName(name)) if ret_ == 0 then return doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,name.." Não tem vip, e nunca teve.") else return doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "A vip de "..name.." Acaba/terminou em "..os.date("%d %B %Y %X ",ret_)) end end return TRUE end get.lua
function onSay(cid, words, param, channel) doPlayerSendCancel(cid, ""..getPlayerVipDays(cid).." days VIP left.") end is.lua
function onSay(cid, words, param, channel) if isPlayerVip(cid) == TRUE then doPlayerSendCancel(cid, "You are a VIP player.") else doPlayerSendCancel(cid, "You are not a VIP player.") end end removevip.lua
function onSay(cid, words, param, channel) doPlayerSendCancel(cid, "Vip removed.") return doPlayerRemoveVip(cid) end set.lua
function onSay(cid, words, param, channel) doPlayerSendCancel(cid, "VIP Days: "..param..".") return setPlayerVipDays(cid, param) end vipdays.lua
function onSay(cid, words, param) if vip.hasVip(cid) == TRUE then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your vip end in "..os.date("%d %B %Y %X ",vip.getVip(cid))) else if vip.getVip(cid) ~= 0 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You're not a vip player. Your vip has finished in "..os.date("%d %B %Y %X ", vip.getVip(cid)).." and now is "..os.date("%d %B %Y %X ", os.time())) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You're not a vip player. You naver has a vip.") end end return TRUE end 8° - Em data/talkactions/talkactions.xml adicione está tag:
<!-- VIP System --> <talkaction log="yes" words="/vip" access="5" event="script" value="VIP/addvipp.lua" /> <talkaction words="!vipdays" event="script" value="VIP/vipdays.lua" /> 9° - Para finalizar execute este comando na sua database:
ALTER TABLE `accounts` ADD `vip_time` INT NOT NULL; Bom galera este sistema vip adiciona os dias corretos e ao termino do VIP o player recebe a mensagem que a VIP acabou e é teletransportado para o templo.
Créditos:
Mock (por ter iniciado algo e não terminou)
Lukeskywalker (Sistema de finalização perfeito do vip)
Matheus [Eu] (Por ter feito várias alterações nas talkacions)
Natan Beckman (Por ter ido atrás da conclusão 100% in game e php)
Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!?
Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!
-
Rodrigo94 deu reputação a vankk em Script de recuperar stamina em zona protegidaEu fiz esse script rápido em C++ para regenerar Stamina X de stamina no PZ a cada X segundos.
https://gist.github.com/vankk/ebd1377d52b3b92028ecad632e949d0c
Só você adicionar no config.lua
staminaRegenPz = true staminaSecondsToRegen = 30 gainStaminaRegerationPz = 1 Vai recuperar 1 minuto de stamina a cada 30 segundos. Caso você deseja desativar o script basta mudar de true para false.
-
Rodrigo94 deu reputação a xWhiteWolf em (Resolvido)[PEDIDO] Editar Items.Você coloca no items.xml oque vc quer que o item faça, experimenta usar comandos de itens parecidos:
Exemplo: Quero que o set de Knight dê skill de club/sword/axe.. daí vc procura algum item que faça isso e só copia a parte que aumenta a skill
<attribute key="skillSword" value="3" /> <attribute key="skillAxe" value="3" /> <attribute key="skillClub" value="3" /> Se você quiser que aumente distance é só colocar
<attribute key="skillDist" value="3" /> para absorver danos é bem simples
<attribute key="absorbPercentPhysical" value="3" /> <attribute key="absorbPercentEarth" value="5" /> <attribute key="absorbPercentDeath" value="6" /> <attribute key="absorbPercentFire" value="-3" /> <attribute key="absorbPercentIce" value="2" /> Perceba que o PercentFire está negativo, é porque ele tem fraqueza contra fogo, positivo ele é bom contra o elemento, negativo ele é fraco contra o elemento.
Pra aumentar ML é só usar:
<attribute key="magiclevelpoints" value="1" /> Pra aumentar speed é só procurar a BOH e copiar:
<attribute key="speed" value="20" /> E não esquece de colocar no final
<attribute key="showattributes" value="1" /> para que apareçam os atributos quando o player der look no item.
Em
<attribute key="slotType" value="necklace" /> Você escolhe que tipo de item aquilo é, os values são: body, two-handed, one-handed, ammo, ring, necklace, legs, feet, head, backpack
E PARA FINALIZAR DECLARE TUDO NO MOVEMENTS.XML:
<movevent type="Equip" itemid="IDDOITEM" slot="TIPO DE SLOT" event="function" value="onEquipItem"/> <movevent type="DeEquip" itemid="IDDOITEM" slot="TIPO DE SLOT" event="function" value="onDeEquipItem"/> itemid="IDDOITEM" troque IDDOITEM pelo ID DO ITEM (BEM ÓBVIO, NÉ?)
slot="TIPO DE SLOT" coloque um dos slots possíveis, os que são possiveis estão nessa lista aqui:
armor feet legs head shield pickupable necklace ring OBSERVAÇÃO FINAL: O SLOT QUE VC DECLARAR NO MOVEMENTS TEM QUE SER DO MESMO TIPO QUE O ITEMS.XML
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Agora as flechas/bows/armas: Essas não precisam declarar no movements.xml mas precisam de um script no weapon.xml
1) Flechas
As flechas são bem simples:
<attribute key="slotType" value="ammo" /> <attribute key="attack" value="25" /> <attribute key="maxHitChance" value="90" /> <attribute key="weaponType" value="ammunition" /> <attribute key="ammoType" value="arrow" /> <attribute key="shootType" value="arrow" /> slotype = ammo para ficar no lugar da munição (ammo)
Attack vc muda a vontade pro que vc quiser
MaxHitChance = chance de acertar o hit, qualquer numero menor que 100 apresenta uma chance do hit falhar
WeaponType= Tipo de arma, flechas são munições então deixe sempre ammunition
ammoTyoe = Tipo de munição, pode ser "arrow" ou "bolt" dependendo doque vc quiser usar, um bow ou um crossbow
shootType é o efeito que vai sair, no caso dessa aí seria uma arrow normalzinha mas vc pode colocar qualquer flecha que exista ou até mesmo copiar efeitos de runas
Dê ctrl+F no items.xml em shootType e copie diferentes tipos e vá vendo no servidor qual se encaixa melhor na sua opinião.
2) Bows e Crossbows
Eu te aconselho copiar de algum item que já exista o modificar oque você quiser
<attribute key="slotType" value="two-handed" /> <attribute key="weaponType" value="distance" /> <attribute key="ammoType" value="bolt" /> <attribute key="range" value="5" /> <attribute key="hitChance" value="1" /> isso daqui é um crossbow duas mãos que ataca bolt (podia ser arrows tb) a uma distância de no máximo 5 SQM (modifique o range)
a chance de hit padrão dele é 1 e essa hit chance soma com a da munição
3) Wands e Rods
<attribute key="weight" value="2900" /> <attribute key="weaponType" value="wand" /> <attribute key="shootType" value="ice" /> <attribute key="range" value="3" /> peso, tipo (mesmo que seja uma rod o tipo é "wand"), tipo de efeito que sai dela (no caso é o ice), distância que ataca (no caso, 3 sqm)
Agora no weapons.xml:
<wand id="2190" level="7" mana="2" min="8" max="18" type="energy" event="function" value="default"> <!-- Wand of Vortex --> <vocation id="1"/> </wand> id do item, level pra usar, custo de mana por hit, dano minimo e maximo, tipo de ataque, event (deixe function para ele fazer tudo que vc colocou no items.xml) value= não mexa a menos que vc seja um programador C++, vocation vc coloca as classes que podem usar.
1= sorc, 2= druid, 3= pally, 4= kina, 5= master sorc, 6= elder druid, 7= royal pally, 8= elit kina
OBS: Você pode colocar isso também para que quando o player dê look não apareça o nome da classe que pode usar aquele determinado item (isso é util quando vc declarar que ambos sorceres e master sorcerers podem usar o item, evitando as repetições quando o player der look no item
<vocation id="5" showInDescription="0"/> <vocation id="1"/> 4) Outros tipos de arma
É bem simples, só edite oque quiser seguindo o modelo:
<attribute key="weight" value="6800" /> <attribute key="defense" value="65" /> <attribute key="attack" value="90" /> <attribute key="weaponType" value="sword" /> <attribute key="extradef" value="5" /> <attribute key="elementIce" value="30" /> <attribute key="slotType" value="two-handed" /> <attribute key="decayTo" value="2401" /> <attribute key="duration" value="60" /> weight = peso
defense= defesa q ela dá
attack = ataque
weapontype = Tipo de arma (sword, axe, club)
extradef = defesa extra (fica Defesa 65 +5 nesse caso)
ElementIce = adiciona dano elemental à arma, pode usar também ElementFire, ElementEarth e ElementEnergy
slotType = se a arma é duas mãos ou não (caso não seja apenas retire essa linha)
decayTo = apos um tempo igual a duration (em segundos) ela vira o item de ID 2401 (se não quiser isso apenas remova essas duas ultimas linhas)
OBSERVAÇÃO FINAL: Tudo que você não quiser utilizar é só remover a linha do items.xml, e todo tipo de edição em armas deve ser declarado no weapons.xml seguindo o exemplo. (COMO VOCÊ NÃO TÁ CRIANDO NENHUM ITEM E SIM EDITANDO OS QUE JÁ EXISTEM EU TE ACONSELHO A PROCURAR O ITEM LÁ DANDO CTRL F E PROCURANDO PELO ID DOQUE SAIR ADICIONANDO UM MONTE DE LINHA A MAIS QUE TALVEZ DÊ CONFLITO COM AS QUE JÁ EXISTAM).
OS ITENS QUE VC COLOCAR PRA DAR SKILL, ML OU PORCENTAGEM ELEMENTAL VOCÊ DEVE DECLARAR NO MOVEMENTS.XML E SE ESSE ITEM FOR PARA UMA DETERMINADA VOCAÇÃO VOCÊ DEVE DECLARAR TAMBÉM SEGUINDO O EXEMPLO:
<movevent type="Equip" itemid="7886" slot="feet" event="function" value="onEquipItem"> <vocation id="1"/> <vocation id="5" showInDescription="0"/> <vocation id="2"/> <vocation id="6" showInDescription="0"/> </movevent> <movevent type="DeEquip" itemid="7886" slot="feet" event="function" value="onDeEquipItem"/> -
Rodrigo94 deu reputação a Panef em Trade Offline V2.0alguem me ajude a resolver esse erro ou me passe a lib doItemSetDuration(uid, duration) & getItemDurationTime(uid)
-
Rodrigo94 deu reputação a WooX em [TFS 0.x] Funções doItemSetDuration(uid, duration) & getItemDurationTime(uid)doItemSetDuration(uid, duration)
getItemDurationTime(uid)
A primeira função adiciona ou altera a duração de um item, a segunda retorna o valor em segundos da duração de um item.
Instalação
No arquivo luascript.cpp da source procure por:
//getItemWeight(uid[, precise = true]) lua_register(m_luaState, "getItemWeight", LuaInterface::luaGetItemWeight); Acima adicione:
//doItemSetDuration(uid, duration) lua_register(m_luaState, "doItemSetDuration", LuaInterface::luaDoItemSetDuration); //getItemDurationTime(uid) lua_register(m_luaState, "getItemDurationTime", LuaInterface::luaGetItemDurationTime); Depois procure por:
int32_t LuaInterface::luaGetItemWeight(lua_State* L) E adicione acima:
int32_t LuaInterface::luaDoItemSetDuration(lua_State* L) { //doItemSetDuration(uid, duration) uint32_t duration = (popNumber(L) * 1000); ScriptEnviroment* env = getEnv(); Item* item = env->getItemByUID(popNumber(L)); if(!item) { errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND)); lua_pushboolean(L, false); return 1; } item->setDuration(duration); return 1; } int32_t LuaInterface::luaGetItemDurationTime(lua_State* L) { //getItemDurationTime(uid) ScriptEnviroment* env = getEnv(); Item* item = env->getItemByUID(popNumber(L)); if(!item) { errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND)); lua_pushboolean(L, false); return 1; } uint32_t duration = (item->getDuration() / 1000); lua_pushnumber(L, duration); return 1; } Agora no arquivo luascript.h da source procure por:
static int32_t luaGetItemWeight(lua_State* L); E adicione acima:
static int32_t luaDoItemSetDuration(lua_State* L); static int32_t luaGetItemDurationTime(lua_State* L); Pronto, agora basta compilar e ambas as funções irão estar prontas para serem usadas.
-
Rodrigo94 deu reputação a WooX em Algumas funções LuaBiblioteca de funções Lua
Eu me recordo que alguns anos atrás quando iniciei meus estudos em Lua, a biblioteca de funções postada pelo @xWhiteWolf me ajudou muito com a escrita de alguns scripts, me fez economizar tempo e algumas linhas de código. Ter uma biblioteca de funções uteis é uma mão na roda para qualquer desenvolvedor pois poupa tempo que teria de ser gasto desenvolvendo algo que algum outro programador provavelmente já fez.
Pensando nisso, hoje eu decidi trazer algumas funções Lua, tenho certeza que poderá ser útil pra alguém algum dia. Algumas dessas funções foram feitas por mim, outras por amigos meus e algumas eu já nem lembro mais onde encontrei. Irei postar aqui o conteúdo desta biblioteca porem ela também estará no final do tópico como anexo. As funções que me recordo a origem estará com os créditos do autor.
Lib
Explicação das funções:
Por enquanto é isso... pretendo atualizar este tópico sempre que achar necessidade de escrever algo novo ou encontrar algo que possa ser útil a biblioteca.
090-woox_functions.lua
-
Rodrigo94 deu reputação a WooX em Trade Offline V2.0Trade Offline V2.0
Esse sistema me foi pedido a alguns meses atrás e hoje tirei um tempinho pra trazer aqui.
O sistema consiste em permitir que jogadores negociem sem contato direto entre comprador e vendedor.
Mas como assim?
O vendedor pode criar um anuncio de venda informando item, valores ou até mesmo items que ele queira em troca, após feito o anuncio todas essas informações ficam armazenadas no banco de dados do servidor, permitindo assim serem exibidas em uma página no site para interessados, junto de todas informações fornecidas pelo vendedor é exibido um comando para que os interessados possam adquirir a oferta exibida na página.
Sobre o sistema
O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4
Versão para TFS 1.x adaptada pelo @luanluciano93
Como mencionado acima, o sistema funciona de forma semelhante ao Market System das versões atuais porem sem exibição gráfica das ofertas in-game, para isso o sistema vai acompanhado de uma página para o Gesior AAC. Este sistema existe no fórum há um bom tempo e já é familiar pra muitos jogadores, essa versão trás consigo algumas melhorias e diferenças que irei listar abaixo.
Sistema
Agora é possivel vender um item exigindo outro item em troca ao invés de dinheiro. Containers com um conjunto de items dentro agora podem ser anunciados. Agora o sistema verifica as cargas e durações dos items antes de criar uma oferta. Novo parâmetro adicionado para verificar informações de ofertas in-game. Agora todo valor recebido vai diretamente para o banco do vendedor. Página
A depender da quantidade de ofertas existentes no servidor, a página agora irá separa-las por páginas. Agora além do valor é exibido também imagem da moeda a depender do valor da oferta. Agora é possivel ver as características tanto dos items ofertados como dos items exigidos pelo vendedor. Adicionado filtros para exibir somente ofertas de items vip, containers ou trocas. Adicionado barras de pesquisas para filtrar as ofertas por items ou nome do jogador.
Algumas imagens
Instalação
Antes de mais nada é necessário citar os requisitos necessários para o funcionamento correto do sistema, ele utiliza de algumas funções que não estão no script principal e portanto é necessário a instalação de uma lib extra, também é necessário instalar as funções doItemSetDuration e getItemDurationTime na source do servidor, ambos os links se encontram abaixo.
Todos os arquivos necessários para a instalação estão anexados no tópico, irei apenas dizer onde instalar e como deve ser configurado.
Primeiramente importe o arquivo schema.sql no banco de dados, ou se preferir pode executar as queries a seguir.
CREATE TABLE IF NOT EXISTS `trade_off_offers` ( `id` int(11) NOT NULL auto_increment, `player_id` int(11) NOT NULL, `type` int(1) NOT NULL DEFAULT '0', `item_id` int(11), `item_count` int(11) NOT NULL DEFAULT '1', `item_charges` int(11) NULL, `item_duration` int(11) NULL, `item_name` varchar(255), `item_trade` tinyint(1) NOT NULL DEFAULT '0', `cost` bigint(20) UNSIGNED NOT NULL, `cost_count` int(11) NOT NULL DEFAULT '1', `date` bigint(20), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `trade_off_container_items` ( `offer_id` int(11) NOT NULL, `item_id` int(11), `item_charges` int(11) NULL, `item_duration` int(11) NULL, `count` int(11) DEFAULT '1' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; ALTER TABLE `trade_off_container_items` ADD KEY `offer_id` (`offer_id`); ALTER TABLE `trade_off_container_items` ADD CONSTRAINT `offer_id_fk` FOREIGN KEY (`offer_id`) REFERENCES `trade_off_offers`(`id`) ON DELETE CASCADE;
Configuração no arquivo tradeoff.lua:
-- Trade Offline 2.0 by WooX -- local config = { priceLimit = 2000000000, -- 2kkk offerLimit = 3, offerLimitStor = 86420, infoOnPopUp = true, infoMsgType = MESSAGE_STATUS_CONSOLE_BLUE, errorMsgType = MESSAGE_STATUS_CONSOLE_RED, successMsgType = MESSAGE_INFO_DESCR, helpMsg = "Enter the parameters (add, remove, active, buy, info).", goldItems = {2148, 2152, 2160}, itemsVIP = {4540, 4545, 4560}, } priceLimit: define o valor máximo de uma oferta. offerLimit: define o valor máximo de ofertas que um jogador pode adicionar. offerLimitStor: storage que irá armazenar quantas ofertas ativas o jogador possui. infoOnPopUp: pode ser definido como true ou false, se definido como falso irá enviar os detalhes da oferta no default ao invés de como é mostrado nas imagens acima. infoMsgType: define como será exibido uma mensagem de informação ao jogador (não recomendo mexer a menos que saiba o que está fazendo). errorMsgType: define como será exibido uma mensagem de erro ao jogador (não recomendo mexer a menos que saiba o que está fazendo). successMsgType: define como será exibido uma mensagem de ação sucedida ao jogador (não recomendo mexer a menos que saiba o que está fazendo). helpMsg: mensagem que será enviada para o jogador caso ele erre os parâmetros do comando. goldItems: nesta tabela deve ser preenchido todos os IDs de moedas no servidor como gold coins, platinum coins, etc. itemsVIP: nesta tabela deve ser preenchido os IDs dos items vips existentes no servidor.
Agora para a instalação da página, no arquivo mysql_db.php deve ser preenchido os dados para conexão no banco de dados do servidor.
/** * Host do banco de dados * @var string */ private static $DB_HOST = 'localhost'; /** * Usuario de conexao ao banco de dados * @var string */ private static $DB_USER = 'root'; /** * Senha de conexao ao banco de dados * @var string */ private static $DB_PASS = 'SUA_SENHA'; /** * Nome do banco de dados * @var string */ private static $DB_NAME = 'NOME_BANCO'; Após feito isso, o arquivo paginationClass.php em conjunto do arquivo mysql_db.php devem ser adicionados no seguinte diretório do Gesior AAC.
classes/
Finalizado isto, basta jogar o arquivo tradeoff.php dentro do diretório informado abaixo e o sistema estará pronto para uso.
pages/
Avisos
Eu escrevi somente o sistema, não sou o autor da página para o Gesior AAC portanto não estarei dando suporte em relação a página que não seja sobre a instalação da mesma no Gesior AAC 2012, e embora esteja funcional, eu não recomendo o uso da página devido a falta do uso de cache para leitura do items.xml. Foram mais de 600 linhas de código sem contar funções extras e alterações na source, além de muitas horas de testes para garantir que tudo estava funcionando corretamente, tudo que peço em troca é que não removam os créditos no arquivo quando forem usar.
Créditos
@MatheusDuarte pela página do Gesior AAC.
schema.sql tradeoff.lua tradeoff.php mysql_db.php paginationClass.php
-
Rodrigo94 deu reputação a Vodkart em Script de recuperar stamina em zona protegidasera que fazendo pelo onThink nao é melhor? exemplo no creaturescript:
staminareco.lua
local storage = 323274 local store,exausted = 156892,30 function onLogin(cid) registerCreatureEvent(cid, "StaminaThink") setPlayerStorageValue(cid, store,0) setPlayerStorageValue(cid, storage, 0) return true end function onThink(cid, interval) if not isPlayer(cid) or not isCreature(cid) then return true end if getTilePzInfo(getCreaturePosition(cid)) and getPlayerStorageValue(cid, storage) <= 0 then setPlayerStorageValue(cid, storage, 1) if getPlayerStorageValue(cid, store) - os.time() <= 0 then doPlayerSendTextMessage(cid, 20, "{Stamina Recovery} Sua stamina começou a se recuperar, o fator de recuperação é de 30 segundos de stamina a cada 5 segundos dentro da zona de proteção em relação as condições normais.") setPlayerStorageValue(cid, store, os.time()+exausted) end elseif not getTilePzInfo(getCreaturePosition(cid)) and getPlayerStorageValue(cid, storage) > 0 then setPlayerStorageValue(cid, storage, 0) end return true end
TAG
<event type="login" name="StaminareLogin" event="script" value="staminareco.lua"/> <event type="think" name="StaminaThink" event="script" value="staminareco.lua"/>
e no globalevents:
staminareco.lua
function onThink(pid, interval, lastExecution, thinkInterval) local refuel = 42 * 60 * 1000 -- full local add = 30000 -- 30 segundos for _, pid in ipairs(getPlayersOnline()) do if getTilePzInfo(getCreaturePosition(pid)) and getPlayerStamina(pid) < refuel then doPlayerSetStamina(pid, getPlayerStamina(pid) + add) end end return true end
TAG
<globalevent name="StaminaRegen" interval="5" script="staminareco.lua"/>
obs: se o seu servidor for em milesegundos trocar o "5" por "5000"
-
Rodrigo94 deu reputação a Antipush em [MODS] Cast on/off em OTX! 8.60MOD CAST OTX-TFS
HAIL TK!
VENHO HOJE TRAZER SOLUÇÃO DE PROBLEMAS DE MUITOS USUÁRIOS AQUI NO TK QUE NÃO CONSEGUE ATIVA O CAST COM SCRIPTS DO FÓRUM UTILIZADO PARA VERSÃO 8.60 VAMOS LA?
Crie um Arquivo com Nome mod_cast.xml na pasta /Mods/
e adicione o seguinte script
Em /data/creaturescript/ crie um arquivo com nome castlogout.lua e adicione
Em Talkactions crie um arquivo com nome cast.lua e adicione
TAG= <talkaction words="/cast;!cast" event="script" value="cast.lua"/>
Ultima Parte crie uma conta em sua db com login 10 e senha qualquer uma. (nao crie character no login 10)
Diga /cast , /cast on /cast off ect..
Rep+?
creditos
Antipush
Matryx
Procura um Excelente Serviço Para Hospeda Seu Projeto?
Damos Suporte Para openTibia, pm! melhores preços do mercado!!
-
Rodrigo94 deu reputação a Mateus Robeerto em (Resolvido)Alguem ai tem cliente 8.6 estendido ?Você tem duas opções: pode usar o DLL para ter o client estendido ou, sem o DLL, fazer a alteração no client para ler o cliente estendido. Vou mandar os dois links...
ddraw.dll
SEM DLL.
-
Rodrigo94 deu reputação a ubnt22 em [Loot Channel] -- Tutorial como adicionar Loot Channeleu estava com mesmo problema, foda e que a galera descobre como resolver o problema mas nao passa adiante.
em monsters.cpp
altera toda essa parte que inicia com:
std::stringstream ss;
std::string nick;
substitui tudo por:
std::stringstream ss;
std::string nick;
ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << ".";
int lootChannelId = g_config.getNumber(ConfigManager::LOOT_CHANNEL);
if (owner->getParty() && message > LOOTMSG_PLAYER) {
// Envia mensagem para a party
owner->getParty()->broadcastPartyLoot((MessageClasses)MSG_CHANNEL, ss.str());
} else {
// Verificar se o canal de loot existe
ChatChannel* lootChannel = g_chat.getChannel(owner, lootChannelId);
if (!lootChannel) {
// Caso o canal de loot não exista, enviar diretamente ao jogador
owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
} else {
// Verificar se o jogador está no canal de loot
if (!lootChannel->hasUser(owner)) {
// Jogador não está no canal, enviar diretamente ao jogador
owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
} else {
// Jogador está no canal de loot, enviar mensagem para o canal
owner->sendChannelMessage("", ss.str(), (MessageClasses)MSG_CHANNEL, lootChannelId);
}
}
}
-
Rodrigo94 deu reputação a WooX em War System Anti-EntrosaPrimeiramente já peço desculpas pela má formatação do tópico, são 4 horas da manhã, eu estou caindo da cadeira de sono, e sem o minimo animo para faze-lo direito.
Bom, já possuo esse sistema a um bom tempo e venho postar ele para o publico pois acabo de saber que o mesmo sistema, com minimas modificações está sendo vendido pela Removido. Não pretendo explicar como o sistema funciona, muito menos dar suporte a eventuais duvidas/problemas. Vim simplesmente postar para evitar que paguem por algo que pode ser obtido de graça.
https://mega.nz/#!CBETkAyY!bm1ebrpYm2uH_iZhnw64YF1Dc9JOHsIU-iz4SmnHHfI
Está ai para quem interessar.
Testado somente em TFS 0.4 (8.6)
Créditos: Killua / Vitor Bertolucci
-
Rodrigo94 deu reputação a Doria Louro em (Resolvido)Npc Comprar 100 unidadesOlá nobres amigos, eu novamente.
Servidor: TFS 0.3.6
Cliente: 8.60
Durante o desenvolvimento de meu servidor notei que os itens que possui cargas/charges, exemplo: amuletos, estavam todos sendo vendidos/comprados apenas com uma carga pelo NPC, mesmo que no itens.xml estivesse declarado a tag com o numero de cargas/charges desejado, através das minhas efetuei a seguinte correção:
Em npc/lib/npcsystem/modules.lua localize a seguinte função addBuyableItem e substitua por:
function ShopModule:addBuyableItem(names, itemid, cost, subType, realName) if (type(subType) == 'string' and realName == nil) then realName = subType subType = nil end local v = getItemInfo(itemid) if (SHOPMODULE_MODE ~= SHOPMODULE_MODE_TALK) then if (self.npcHandler.shopItems[itemid] == nil) then self.npcHandler.shopItems[itemid] = { buyPrice = -1, sellPrice = -1, subType = tonumber(subType) or (v.charges > 0 and v.charges or 0), realName = "" } end self.npcHandler.shopItems[itemid].buyPrice = cost self.npcHandler.shopItems[itemid].realName = realName or getItemNameById(itemid) self.npcHandler.shopItems[itemid].subType = tonumber(subType) or (v.charges > 0 and v.charges or 1) end if (names ~= nil and SHOPMODULE_MODE ~= SHOPMODULE_MODE_TRADE) then local parameters = { itemid = itemid, cost = cost, eventType = SHOPMODULE_BUY_ITEM, module = self, realName = realName or v.name, subType = tonumber(subType) or (v.charges > 0 and v.charges or 1) } for i, name in pairs(names) do local keywords = {} table.insert(keywords, 'buy') table.insert(keywords, name) local node = self.npcHandler.keywordHandler:addKeyword(keywords, ShopModule.tradeItem, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end end
No mesmo arquivo altere também a função addSellableItem:
function ShopModule:addSellableItem(names, itemid, cost, realName) local v = getItemInfo(itemid) if (SHOPMODULE_MODE ~= SHOPMODULE_MODE_TALK) then if (self.npcHandler.shopItems[itemid] == nil) then self.npcHandler.shopItems[itemid] = { buyPrice = -1, sellPrice = -1, subType = ((v.charges > 0 and v.stackable) and v.charges or 0), realName = "" } end self.npcHandler.shopItems[itemid].sellPrice = cost self.npcHandler.shopItems[itemid].realName = realName or v.name end if (names ~= nil and SHOPMODULE_MODE ~= SHOPMODULE_MODE_TRADE) then local parameters = { itemid = itemid, cost = cost, eventType = SHOPMODULE_SELL_ITEM, module = self, realName = realName or v.name } for i, name in pairs(names) do local keywords = {} table.insert(keywords, 'sell') table.insert(keywords, name) local node = self.npcHandler.keywordHandler:addKeyword(keywords, ShopModule.tradeItem, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end end
Aqui funcionou perfeitamente, venda dos agrupáveis e compra de itens com charges.
Vida de desenvolvedor é resolver um bug e criar outro
Espero ter ajudado 😄
-
Rodrigo94 deu reputação a luanluciano93 em [8.60] Sistema de Recompensa Loot De Boss Compartilhado (reward chest)Olá pessoal, resolvi criar um sistema de recompensa parecido com o sistema do tibia global para a versão 8.60, mas tie que fazer varias "gambiarras" para ele funcionar nesta versão.
Para quem não conhece: http://www.tibiawiki.com.br/wiki/Loot#Sistema_de_Recompensas
Basicamente meu sistema funciona da seguinte forma:
• você determina as criaturas que irão funcionar com esse sistema (normalmente bosses).
• durante a batalha com a criatura o sistema conta pontos aos jogadores por ataque, bloqueio e suporte ("healar" quem esta na batalha).
• quando a criatura é morta o sistema cria um "loot" de acordo com os pontos e envia-o ao depot do jogador em uma bag determinada nas configurações.
Primeiramente vamos criar o arquivo das configurações gerais, crie uma pasta dentro do "data" com o nome de sistemas e dentro cria um arquivo rewardchest.lua:
Depois em creaturescript crie dois arquivos:
rewardchest_boss.lua:
e rewardchest_pontos.lua:
Lembrando que em todas as criaturas que forem adicionadas ao sistema além de coloca-las no rewarchest.lua você deve add isso no xml do monstro:
<script> <event name="RewardChestDeath"/> <event name="RewardChestMonster"/> </script> E isso no creaturescript.xml:
<!-- Sistema de recompensa criado por luanluciano93 --> <event type="login" name="RewardChestLogin" event="script" value="rewardchest_pontos.lua"/> <event type="statschange" name="RewardChestStats" event="script" value="rewardchest_pontos.lua"/> <event type="death" name="RewardChestDeath" event="script" value="rewardchest_boss.lua"/> <event type="statschange" name="RewardChestMonster" event="script" value="rewardchest_boss.lua"/>
Basicamente é isso, qualquer dúvida postem aqui ... abraços!
LINK DO SCRIPT NO GITHUB: https://github.com/luanluciano93/ESTUDOS/tree/master/LUA/REWARD_SYSTEM_860
-
Rodrigo94 deu reputação a Natanael Beckman em GesiorACC 2019 8.60 UPDATE 29/06/2019Atualização de 29/06/2019.
Olá meus amigos, essa é a minha última contribuição free que faço na área de OTserver, fiz uma atualização bem completa do Gesior comparando com os que existem disponíveis, não vou falar muito pois grande parte já conhecem... Vou apenas posta algumas imagem das mudanças feitas.
Sempre gostei de evoluir e de oferecer aos demais uma facilidade de obter um material grátis e de qualidade, nunca utilizei meu pouco conhecimento para prejudicar os demais, pelo o contrario sempre foi na intenção de ajudar e se em algum momento falhei, falhei inconscientemente.
- Foi mudado algumas imagens de layout para renovar a estrutura.
- Server Info + Most Power Ful Guilds na mesma estrura.
- Create Account exigindo senhas com letras minusculas, maiúsculas e números, fortalecendo
a segurança do seu cliente e dificultando futuras dores de cabeças.
- Adicionado o mecanismo que identifica os valores de Premuim Points e Backup Points.
- Algumas mudanças de layout.
- Nome do player abaixo linkado.
- Adicionado um Box de doação, com a intenção apenas de complementar
o layout enriquecendo a pagina.
- Fixado o bug edit town, e melhorado o layout.
- Characters.php refeito, nesta imagem é uma visão de uma conta com access admin.
- Visão normal.
- Inventário completo.
- Guilds com visão ampliada.
- Detalhes...
- Novo SHOP com as estrutura de layout melhorada e modernizada.
- Sem BUGs lembre-se do CTRL + F5 para atualizar os cookies nesta pagina.
- Detalhes...
- Detalhes...
- Detalhes...
- Histórico do SHOP...
DOWNLOAD SITE
SHOP.LUA XAMPP 1.7.3 DATABASE LIMPA MYSQL DATABASE COMPLETA MYSQL TUTORIAIS ÚTEIS E COMPATÍVEIS PARA O SITE: PAGSEGURO AUTOMATICO SHOPGUILD BACKUP_POINTS SISTEMA VIP_TIME Créditos: Gesior.pl(WEBMaster) Felipe Monteiro(WEBMaster, WEBDesigner) Natanael Beckman(WEBNada) Nailan (WEBMaster) Ivens Pontes (WEBMaster) Marcio Porto (WEBMaster) Danyel Varejão (Programmer LUA, C++)
-
Rodrigo94 deu reputação a xWhiteWolf em Novo Sistema de Trainer [0.36~0.4]Olá meus caros do Tibia King, hoje vim trazer pra vocês um sistema que bolei pra um concurso em outro fórum mas acabei ficando descontente e nunca cheguei a disponibilizar.
Eu gostaria de agradecer inicialmente à três acontecimentos que sem eles não seriam possíveis a criação desse sistema.
- A otlist obrigar que os servidores utilizem anti idle
- Os mages do meu servidor reclamarem que não dava pra treinar ml nos trainers
- Ao @Storm Night, que embora tenha me irritado muito nesse tópico aqui , botou a sementinha dessa idéia na minha cabeça.
Explicação É a combinação de dois sistemas que eu ja havia feito, o primeiro escolhe entre todas as salas de treiner aquela que está vazia pra te alocar e o segundo te mantém alimentado e rodando pra simular o anti idle. (Nota: ele não impede o anti idle de fato, se vc quiser fazer isso vc vai precisar editar o script de anti idle que vc utiliza pra ignorar players com determinado storage e adicionar o storage no player quando ele entrar na sala e tirar ao sair.. mas não sei até que ponto isso pode provocar ban da OTservlist por isso decidi não ensinar isso aqui.)
Sem mais delongas, talk is cheap, show me the code.
Idéia Basicamente dá pra reduzir toda a idéia do código nessa foto aqui:
Você tem diversas salas com trainers nesse formato (pode ser em linha reta horizontal ou vertical tb, mas assim fica melhor distribuído). Você inclusive pode criar salas no meio do void de forma que a distancia de uma vc nao consiga ver a outra e vai ser uma experiencia muito amigável para o player ver que está treinando sozinho na paz. Ao entrar no tp ele te aloca na primeira sala vazia, se não houverem salas vazias ele retorna que não tem posições livres
Instalação Você precisa criar as salinhas dos trainers equidistantemente, ou seja, tendo a mesma distância A em X e mesma distância B em Y. Sério, se vc errar nessa parte é porque vc não sabe oque significa equidistante. Vai pesquisar preguiçoso!! Já aviso que não vou dar suporte quanto à isso.
Você vai precisar criar salas parecidas com isso daqui:
Perceba que não tem como ter acesso a essa sala, não tem como ser puxado pra fora do trainer, não tem dor de cabeça nenhuma e quando o player quiser sair ele só entra no tp e volta pro templo ou pra onde vc definir.
Nesse teleport da sala vc adiciona o actionid 14877 e não bota nenhuma posição nele.
Naquele tile que o player irá ficar que inclusive tem id diferente vc bota actionid 14878.
Agora seleciona a area dessa sala no rme e vai copiando e colando percebendo sempre se vc tá criando as salas com mesma distância em X. Se o ponto inicial de uma sala é 140 e vc quer que todas tenham 12 sqm de distancia vc cria em 152, 164, 178.. por aí vai.
Quando terminar as salas que quiser e tiver montado as linhas e colunas da forma que desejou, vc vai criar um tp principal pra alocar os players nessa sala:
Lembrando que ele não deve ter posição no rme, vc só bota o actionID 14876 e deixa a toPos dele 0, 0, 0. Ele não tem q te teleportar pra nenhum lugar pois a posição será decidida por script.
Se você fez tudo certo até agora vc deve ter algo +- assim:
O importante é manter a distancia certinha entre cada sala. Aí no caso eu fiz rX = 11 e rY = 8 (é a terceira ou quarta vez q eu to falando isso, se vcs errarem pqp eu vou ficar muito irritado);
Vc não bota os trainers, e ali embaixo do spawn vc tem que botar um outro obstáculo pra impedir que o player ande pra baixo e dê a sala como livre.
Feito isso só adicionar os scripts abaixo:
movements.xml
<movevent type="StepIn" actionid="14876" event="script" value="trainertp.lua"/> <movevent type="StepIn" actionid="14877" event="script" value="trainertp2.lua"/> <movevent type="StepIn" actionid="14878" event="script" value="foodtrainer.lua"/>
movements/scripts/trainertp.lua:
movements/scripts/trainertp2.lua:
movements/scripts/foodtrainer.lua:
FIM, qualquer dúvida ou comentário ou sugestão coloquem abaixo. Se gostou REP+, se não gostou REP+ pq deu trabalho e vai ser útil pra alguém, mesmo que de estudo.
Abraços do Lobo.
E ao cara do outro fórum que ficou falando que ia dar erro e quis ficar me corrigindo e mandando scripts sem noção pra "mostrar" que sabia de lua:
-
Rodrigo94 deu reputação a Danihcv em [NPC] Papai Noel - Que dá presenteBom galera, sei que o natal acabou de passar, porém esqueci de postar esse system antes...
Fiz uma versão 2.0 do meu npc de natal (papai noel).
Agora ao invés do bom velhinho entregar diretamente o item, vc recebe uma caixa que ao clicar vc recebe um item 100% aleatorio (dentre os itens que foram programados dentro do script).
Funciona assim: o player vai até o papai noel e fala: hi, aí o papai noel fala ho-ho-ho... aí o player responde sim (ou yes) e então o player recebe uma caixa. Ao clicar na caixa, o player recebe um dos itens, que estiverem programados no script, de forma aleatoria.
Então vamo lá.
Pra adicionar esse system, primeiro vá na pasta data/npc e crie um arquivo chamado Papai Noel.xml e coloque isso dentro:
<?xml version="1.0" encoding="UTF-8"?> <npc name="Papai Noel" script="data/npc/scripts/papai_noel.lua" walkinterval="1500" speed="100" walkradius="2" floorchange="0"> <health max="100" now="100"/> <look type="160" head="0" body="113" legs="94" feet="132" addons="0" mount="0"/> <parameters> <!--MESSAGES--> <parameter key="message_greet" value="HO-HO-HO, |PLAYERNAME| bem-vindo. Voce gostaria de um presente?"/> <parameter key="message_farewell" value="HO-HO-HO, tenha um feliz natal, |PLAYERNAME|."/> </parameters> </npc> Agora vá na pasta data/npc/scripts e crie um arquivo chamado papai_noel.lua e coloque isso dentro:
Agora vá na pasta data/actions e adicione essa tag dentro do arquivo actions.xml:
<action itemid="11401" event="script" value="giftbox.lua"/> Agora va na pasta data/actions/scripts e crie um arquivo chamado giftbox.lua e coloque isso dentro:
local items = { [1]=2160, --ID do item 1 [2]=2157, --ID do item 2 [3]=2121} --ID do item 3 local stor = (11401+os.date("%Y")) --Nao mexa function onUse(cid) if getPlayerStorageValue(cid, stor) ~= 1 then a = math.random(1, #items) doPlayerAddItem(cid, items[a], 1) setPlayerStorageValue(cid, stor, 1) else doPlayerSendCancel(cid, "Voce ja pegou seu presente.") end doPlayerRemoveItem(cid, 11401, 1) return true end E isso é tudo pessoal!