tutorial Callbacks
-
Quem Está Navegando 0 membros estão online
Nenhum usuário registrado visualizando esta página.
-
Conteúdo Similar
-
Por Underewar
Tutorial: Criando um Sistema de Enviar efeito com OTClient.
Neste tutorial, vamos criar um sistema simples de Enviar efeito no OTClient.
Este sistema permitirá que os jogadores ativem um efeito especial e vejam uma janela ao clicar em um botão específico.
Pré-requisitos:
Ambiente de Desenvolvimento:
Certifique-se de ter um ambiente de desenvolvimento configurado com OTClient Edubart. Conhecimento Básico em Lua:
Familiaridade com a linguagem de script Lua.
Passo 1: Estrutura do projeto
Organize seu projeto conforme abaixo:
OTC / MODS
Passo 2: Criando a Interface Gráfica (OTUI)
game_pass.otui
Repare que em nossa interface nossos botões de ação entram no caminho do module e iniciam uma função que esta disponivel em nosso game_pass.lua (Client-Side)
Passo 3: Criando funções Client-Side
Agora com as funções criada podemos chamar elas de acordo com a necessidade em nosso arquivo de interface.
Por exemplo a função effect() que foi chamada em nosso arquivo de interface.otui agora é criada aqui para mostrar o efeito ao jogador.
game_pass.lua
Passo 4: Registrando o novo Mod
Agora podemos registrar e iniciar nosso modulo usando o arquivo de configuração
game_pass.otmod
Feito isso ja podemos ver nosso module no client e enviar opcodes através do gameprotocol e também receber o buffer para manipular os dados podemos utilizar :
protocolGame:sendExtendedOpcode(14, "1")
Basicamente oque estamos fazendo é armazenando o valor 1 na variaval 14 do ExtendedOpcode e futuramente podemos recuperar esse valor.
Recuperamos esse valor em nosso server side data/creatuerscript/otc/game_pass.lua
Verificando se o opcode é 14 se for 14 então fazemos x ação.
Show, tendo isso em mente para que o nosso client-side consiga receber com sucesso o efeito enviado ao jogador então utilizamos
Passo 5: Criando o Server-side responsavel por enviar o efeito correto ao jogador dependendo do opcode selecionado no nosso cliente.
data/creaturescripts/otc/game_pass.lua
Passo 6: Registrando o evento para evitar erros futuros!
Para que tudo funcione corretamente sem erros é necessário registrar o evento no creaturescript.xml / login.lua
creaturescript.xml
<event type="extendedopcode" name="GamePass" script="otc/game_pass.lua" />
login.lua
player:registerEvent("GamePass")
Ótimo agora ao selecionar o menu recompensa o jogador recebera um efeito.
Espero que tenha ficado claro como usar Opcodes/ExetendedOpcodes.
Arquivos usados no tutorrial:
OTC MODULE
game_pass.rar
Creaturescript
game_pass.lua
Vi muitos tutoriais desatualizado então resolvi trazer esse!
Reparem que nesse caso passamos creature como parametro do buffer isso porque precisamos enviar um efeito no player.
Melhorando a formatação com JSON Encoder
-
Por Renato
O que é?
O script é assim, ele conta quantos monstros você já matou até o momento, consultando por [ !monsters ]
Agora com a versão 2.0 você pode consultar monstro específico, pela talk [ !monsters Demon ] por exemplo. SE O MONSTRO ESTIVER CONFIGURADO.
Ahh, e você também configura a recompensa que ele ganhará ao matar X de determinado monstro =p
Vamos lá.
Se você já instalou o Killed Monsters Count 1.0 é só abrir o mesmo arquivo e substituir.
Caso não, vá em server/data/mods ou server/mods crie o arquivo monsterskill.xml e coloque dentro:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Monsters Kill Count and Awards" version="2.0" author="Renato Ribeiro" enabled="yes">
<config name="config-monsterskill"><![CDATA[
local monters = {
['demon'] = { id = 1, qtKill = 250, itemId = xxxx, qtItem = 1 },
['hydra'] = { id = 2, qtKill = 500, itemId = yyyy, qtItem = 1 },
['frost dragon'] = { id = 3, qtKill = 750, itemId = zzzz, qtItem = 1},
}
storage = 1647
killedMonsters = getPlayerStorageValue(cid, storage)
]]></config>
<event type="look" name="monsterLook" event="script"><![CDATA[
domodlib("config-monsterskill")
function onLook(cid, thing, position, lookDistance)
if(isPlayer(thing.uid)) then
doPlayerSetSpecialDescription(thing.uid, "\n Killed Monsters: " .. killedMonsters)
end
return TRUE
end
]]></event>
<event type="kill" name="monsterKill" event="script"><![CDATA[
domodlib("config-monsterskill")
function onKill(cid, target)
if (isMonster(target)) then
setPlayerStorageValue(cid, storage, math.max(1, getPlayerStorageValue(cid, storage) + 1))
end
if (monsters[string.lower(getCreatureName(target))]) then
mName = getCreatureName(target)
mId = monsters[string.lower(mName)].id
mqtKill = monsters[string.lower(mName)].qtKill
mItemId = monsters[string.lower(mName)].itemId
mqtItem = monsters[string.lower(mName)].qtItem
getMStorage = getPlayerStorageValue(cid, storage + mId)
setPlayerStorageValue(cid, storage + mId, math.max(0, getMStorage + 1))
if (getMStorage == mqtKill) then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! You earned " .. mqtItem .. " " .. getItemNameById(mItemId) .. ".")
adding = doPlayerAddItem(cid, mItemId, mqtItem)
doSetItemSpecialDescription(adding, "\n Reward to " .. getPlayerName(cid) .. " to kill " .. qtKill .. " " .. mName .. "s")
end
end
return TRUE
end
]]></event>
<event type="login" name="monsterLogin" event="script"><![CDATA[
function onLogin(cid)
registerCreatureEvent(cid, "monsterLook")
registerCreatureEvent(cid, "monsterKill")
return TRUE
end
]]></event>
<talkaction words="!monsters" event="script"><![CDATA[
domodlib("config-monsterskill")
function onSay(cid, words, param, channel)
if (monsters[string.lower(param)] or monsters[param]) then
killedMonstersX = getPlayerStorageValue(cid, storage + monsters[string.lower(param)] and monsters[string.lower(param)] or monsters[param])
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have killed " .. killedMonstersX .. " " .. param .. "s at the moment.")
elseif (param) then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Do not have a " .. param .. " task.")
else
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have killed " .. killedMonsters .. " monsters at the moment")
end
return TRUE
end
]]></talkaction>
</mod>
[/code]
[b]Talkactions:[/b]
!monsters - consulta quantos monstros você já matou ao total (também aparece no seu look)
!monsters NOME - consulta quantos monstros 'NOME' você já matou
[b]Pra adicionar novos monstros siga o padrão:[/b]
['frost dragon'] = { id = 3, qtKill = 750, itemId = zzzz, qtItem = 1},
['nome do monstro'] = { o id tem que ser sequencial, ou seja, se o ultimo for 3, o proximo é 4, depois 5 etc. o qtKill é q quantidade que o cara tem que matar pra ganhar o item. itemId é o id do item que o cara ganha e qtItem é a quantidade que ele ganha. Por exemplo você pode por o id da arrow e na qtItem você poe 100, ele ganha 100 arrows. Agora se for um item que não da pra juntar, mesmo você colocando 100 ele só vai ganhar 1. }
[b]Enfim, script não testado, qualquer erro POSTE AQUI![/b]
Abraços.
-
Por Renato
Olá galera,
venho trazer a vocês o StoneCraft system, um sisteminha com iniciativa mais para treino pessoal, mas que ficou bem legal.
Como este 1.0 ainda é simples, não está em mod, só é necessário um action.
Intro >
Vamos lá, o script serve para coletar pedras, no exemplo eu coloquei só algumas como, ancient stone, battle stone, que em meu server (Arcadia) eu usarei para complementar receitas e forjar items, agora vocês usem a criatividade.
é basicamente assim, você usa a pick em alguma pedra que está configurado em sua tabela, ficará usando até quebrar (configurado por breakChance, em porcentagem) a pedra. Quando quebrar você pode 'dropar' uma pedra ou não, depende da sua sorte (configurado por dropChance, em porcentagem). Caso não consiga dropar, vá para outra pedra e tente novamente sua sorte, ou espera a pedra voltar ao seu estado normal em tantos minutos (configurado por respawnTime, em minutos). Caso consiga dropar algo, será de acordo com sua sorte um dos items presentes na array drops da pedra quebrada.
O script é praticamente isso só, caso não entenda, pergunte.
Imagem >
Instalando >
Crie um arquivo lua em actions/scripts com o nome stonecraft.lua, e dentro ponha:
-- Name: StoneMining
-- Version: 1.0
-- Author: Renato Ribeiro
-- Official Forum: www.tibiaking.com
-- About Script: read in (http://tibiaking.com/forum/topic/8998-stonemining-system/) -> brazilian portuguese only
-- Read: GNU General Public License
function createItem(pos, itemid)
doSendMagicEffect(pos, 34)
doCreateItem(itemid, 1, pos)
doSendMagicEffect(pos, 34)
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
stones = { -- time in minutes, chance in percent '%', drops separated by comma (virgula)
[1285] = { breakChance = 35, respawnTime = 3, dropChance = 50, drops = {10549, 10549, 10549, 10549, 12403}},
[3609] = { breakChance = 25, respawnTime = 7, dropChance = 30, drops = {10549, 10549, 12403}},
[3608] = { breakChance = 25, respawnTime = 7, dropChance = 30, drops = {10549, 10549, 12403}},
[3607] = { breakChance = 20, respawnTime = 7, dropChance = 30, drops = {10549, 10549, 12403}},
[3616] = { breakChance = 15, respawnTime = 7, dropChance = 30, drops = {10549, 10549, 12403}},
[3615] = { breakChance = 20, respawnTime = 7, dropChance = 20, drops = {10549, 10549, 10549, 13943, 13943, 11227, 11232}},
[1356] = { breakChance = 20, respawnTime = 15, dropChance = 20, drops = {10549, 10549, 10549, 13943, 13943, 11227, 11232}},
[1355] = { breakChance = 20, respawnTime = 15, dropChance = 20, drops = {10549, 10549, 10549, 13943, 13943, 11227, 11232}},
[1357] = { breakChance = 20, respawnTime = 20, dropChance = 20, drops = {10549, 10549, 13943, 13943, 11227, 11232}},
[1358] = { breakChance = 20, respawnTime = 20, dropChance = 15, drops = {10549, 13943, 13943, 11227, 11232}},
[1359] = { breakChance = 20, respawnTime = 25, dropChance = 15, drops = {13943, 11227, 11232}}
}
if isInArray({0, 65535}, toPosition.x) then
return false
elseif stones[itemEx.itemid] then
stoneEx = stones[itemEx.itemid]
if (math.random(1, 100) < stoneEx.breakChance) then
doRemoveItem(getTileItemById(toPosition, itemEx.itemid).uid)
addEvent(createItem, stoneEx.respawnTime * 60000, toPosition, itemEx.itemid)
if (math.random(1, 100) < stoneEx.dropChance) then
itemDrop = stoneEx.drops[math.random(1, #stoneEx.drops)]
doPlayerAddItem(cid, itemDrop)
doSendMagicEffect(toPosition, 12)
return doPlayerSendCancel(cid, "Your craft sucess, you found " .. getItemArticleById(itemDrop) .. " " .. getItemNameById(itemDrop) ..".")
else
doSendMagicEffect(toPosition, 9)
return doPlayerSendCancel(cid, "Your craft sucess, but they found nothing.")
end
else
doSendMagicEffect(toPosition, 2)
return doPlayerSendCancel(cid, "Your craft fail, try again.")
end
else
return doPlayerSendCancel(cid, "You must craft in a specially stone.")
end
end
[/code] [b]Agora vá em actions/actions.xml e ponha:[/b] [code]
<action itemid="2553" event="script" value="stonecraft.lua">
Adicionando novas pedras >
Siga o exemplo da tabela:
Assim: [iD_DA_PEDRA] = { breakChance = CHANCE_DE_QUEBRAR_A_PEDRA, respawnTime = MINUTOS_PARA_RESPAWN_DA_PEDRA, dropChance = CHANCE_DE_DROPAR_ALGUM_ITEM, drops = {ITEMS_QUE_DROPAM, SEPARADOS_POR_VIRGULA}},
Ficará: [3609] = { breakChance = 25, respawnTime = 7, dropChance = 30, drops = {10549, 10549, 12403}},
Script Funcionando
Testado em: Crystal Server 0.1.5, e TFS 0.4
--
Até a próxima, estou desenvolvento um sistema para fusão de summons (: aguardem!
Abraços.</action>
-
Por Mateus Robeerto
este é um tutorial de como usar um cliente com spr/dat estendido e protegido pelo CAB.
fiz um video mostrando como usar um client com spr/dat estendido sem o error, basta seguir passo a passo o que eu fiz, em resumo voce precisara copiar seu dat estendido pra outro local para poder editar ele, salvando ele como não estendido e dps renomeando para poder usar junto com o original e compilando tudo com o programa cab...
A DLL ajuda o cliente a ler as 2 dat (compilada pelo programa cab) , sem ela o cliente não abre, caso o teu cliente tenha o bug do ctrl+n ou alguns outros bugs que eu vi em alguns casos, a DLL tem a função de arrumar a maioria deles.
LINK DOWNLOAD
https://www.mediafire.com/file/kxqkywxeijk8hn2/programa_para_oldclient.rar/file
ou
creator cab
https://drive.google.com/file/d/19b-EqpS-RmOQ_1o7ubb2a7j6RKcijjUa/view?usp=sharing
scan https://www.virustotal.com/gui/file/4398e414d680ac26addbedc1f20bd59a82b546a1633abbb02b13d2f7150e950e/detection
DLL
https://drive.google.com/file/d/1T8XgwgHJAO9sgw5WR809GjMfej2NvP3n/view?usp=sharing
SCAN https://www.virustotal.com/gui/file/539f0f7187c668457a14d87603e075ab5d1b6f6ac6a17aabf2b591fc3c177741/detection
stup-pe hoohar o client
https://drive.google.com/file/d/1cwR1wj3M8IsvxmIt5pQhZ4-DlFSMQVal/view?usp=sharing
scan https://www.virustotal.com/gui/file/d06889d61474ee9480947956e52916fb997a3717e9f59d3ed830b5c780e81340/detection
-
Por oclipper
Nesse video eu ensino como encontrar os Address e Offsets basicos para OTClient, eu usei meu bot como exemplo, com essses dados voce pode atualizar e conseguir utilizar bastantes funçoes do bot (heal, mana train, auto utamo/hur, etc)
tipos de variaveis pra cada offset:
name = string
hp = double
mana = double
light = 1 byte
color = 1 byte
flags = 4 byte
speed = 4 byte
pos x = 4 byte
pos y = 4 byte
pos z = 1 byte
id = 4 byte
hp% = 1 byte
direcao = 4 byte
skull = 1 byte
-
Posts Recomendados
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.