-
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 Zedgast
Boa noite, toda vez que eu tenta usar um egg de experiencia, ele não é consumido ou usado e aparece o seguinte erro no console ''[Error - Action Interface]
data/actions/scripts/exp_potion.lua:onUse
Description:
data/lib/exp_potion.lua:29: attempt to index field '?' (a nil value)
stack traceback:
data/lib/exp_potion.lua:29: in function <data/lib/exp_potion.lua:16>
(tail call): ?''
o lua da pagina data/lib/exp_potion vai estar logo a baixo
Desde já agradeço vossa colaboração e ajuda, sou novato na área
-
Por Akun
Oiiii Boa Noite !!! , Gostaria de pedir a ajuda de vocês em um poblemas que eu estou tendo,
Adicionei recentemente esse Script Abaixo e consegui instalar tudo direitinho, ta rodando liso.. Mas Gostaria de implementar bonus nesse script
Exemplo:
Player Vip: 20% a + de XP
Player Vip: 1% a + de ATK SPEED
abaixo todo o Script
[Fonte]
Sistema Vip
1° execute dentro da sua db
ALTER TABLE `accounts` ADD COLUMN `viplastday` int(10) NOT NULL DEFAULT 0 AFTER `lastday`, ADD COLUMN `vipdays` int(11) NOT NULL DEFAULT 0 AFTER `lastday`;
2º na pasta data/creaturescripts/scripts procure pelo arquivo login.lua e adicione na segunda linha, logo após o function onLogin(player) isso
player:loadVipData() player:updateVipTime() 3° na pasta data\ crie um arquivo chamado vipsystem.lua e adicione o seguinte
local config = { -- true = player will be teleported to this position if Vip runs out -- false = player will not be teleported useTeleport = true, expirationPosition = Position(95, 114, 7), -- true = player will received the message you set -- false = player will not receive a message useMessage = true, expirationMessage = 'Your vip days ran out.', expirationMessageType = MESSAGE_STATUS_WARNING } if not VipData then VipData = { } end function Player.onRemoveVip(self) if config.useTeleport then self:teleportTo(config.expirationPosition) config.expirationPosition:sendMagicEffect(CONST_ME_TELEPORT) end if config.useMessage then self:sendTextMessage(config.expirationMessageType, config.expirationMessage) end end function Player.getVipDays(self) return VipData[self:getId()].days end function Player.getLastVipDay(self) return VipData[self:getId()].lastDay end function Player.isVip(self) return self:getVipDays() > 0 end function Player.addInfiniteVip(self) local data = VipData[self:getId()] data.days = 0xFFFF data.lastDay = 0 db.query(string.format('UPDATE `accounts` SET `vipdays` = %i, `viplastday` = %i WHERE `id` = %i;', 0xFFFF, 0, self:getAccountId())) end function Player.addVipDays(self, amount) local data = VipData[self:getId()] local amount = math.min(0xFFFE - data.days, amount) if amount > 0 then if data.days == 0 then local time = os.time() db.query(string.format('UPDATE `accounts` SET `vipdays` = `vipdays` + %i, `viplastday` = %i WHERE `id` = %i;', amount, time, self:getAccountId())) data.lastDay = time else db.query(string.format('UPDATE `accounts` SET `vipdays` = `vipdays` + %i WHERE `id` = %i;', amount, self:getAccountId())) end data.days = data.days + amount end return true end function Player.removeVipDays(self, amount) local data = VipData[self:getId()] if data.days == 0xFFFF then return false end local amount = math.min(data.days, amount) if amount > 0 then db.query(string.format('UPDATE `accounts` SET `vipdays` = `vipdays` - %i WHERE `id` = %i;', amount, self:getAccountId())) data.days = data.days - amount if data.days == 0 then self:onRemoveVip() end end return true end function Player.removeVip(self) local data = VipData[self:getId()] if data.days == 0 then return end data.days = 0 data.lastDay = 0 self:onRemoveVip() db.query(string.format('UPDATE `accounts` SET `vipdays` = 0, `viplastday` = 0 WHERE `id` = %i;', self:getAccountId())) end function Player.loadVipData(self) local resultId = db.storeQuery(string.format('SELECT `vipdays`, `viplastday` FROM `accounts` WHERE `id` = %i;', self:getAccountId())) if resultId then VipData[self:getId()] = { days = result.getDataInt(resultId, 'vipdays'), lastDay = result.getDataInt(resultId, 'viplastday') } result.free(resultId) return true end VipData[self:getId()] = { days = 0, lastDay = 0 } return false end function Player.updateVipTime(self) local save = false local data = VipData[self:getId()] local days, lastDay = data.days, data.lastDay local daysBefore = days if days == 0 or days == 0xFFFF then if lastDay ~= 0 then lastDay = 0 save = true end elseif lastDay == 0 then lastDay = os.time() save = true else local time = os.time() local elapsedDays = math.floor((time - lastDay) / 86400) if elapsedDays > 0 then if elapsedDays >= days then days = 0 lastDay = 0 else days = days - elapsedDays lastDay = time - ((time - lastDay) % 86400) end save = true end end if save then if daysBefore > 0 and days == 0 then self:onRemoveVip() end db.query(string.format('UPDATE `accounts` SET `vipdays` = %i, `viplastday` = %i WHERE `id` = %i;', days, lastDay, self:getAccountId())) data.days = days data.lastDay = lastDay end end
4° no arquivo global.lua adicione a seguinte linha
dofile('data/vipsystem.lua')
Talkaction !checkvip para todos os players
1° vá na pasta data/talkactions/scripts e crie um arquivo chamando checkvip.lua e adicione o seguinte
function onSay(cid, words, param) local player = Player(cid) local days = player:getVipDays() if days == 0 then player:sendCancelMessage('You do not have any vip days.') else player:sendCancelMessage(string.format('You have %s vip day%s left.', (days == 0xFFFF and 'infinite amount of' or days), (days == 1 and '' or 's'))) end return false end 2° e em data/talkactions/talkactions.xml adicione
<talkaction words="!checkvip" script="checkvip.lua"/>
Talkaction /vip para membros da staff
- /vip adddays, NomedoPlayer, 5 --> Adiciona 5 dias vip para o Player. - /vip removedays, NomedoPlayer, 5 --> Remove 5 dias vip do Player. - /vip remove, PlayerName --> Remove todos os dias vip do Player. - /vip check, NomedoPlayer --> Checa quantos dias vip o Player tem. - /vip addinfinite, NomedoPlayer --> Adiciona tempo vip infinito para o Player.
Tiles VIP
1° em data/movements/movements.xml e adicione
<movevent event="StepIn" actionid="1500" script="viptiles.lua"/> <movevent event="StepIn" actionid="1501" script="viptiles.lua"/> 2° em data/movements/script crie o arquivo viptiles.lua e adicione o seguinte
local vipPosition = Position(101, 116, 7) function onStepIn(cid, item, position, fromPosition) local player = Player(cid) if not player then return true end if item.actionid == 1500 then if not player:isVip() then player:teleportTo(fromPosition) fromPosition:sendMagicEffect(CONST_ME_POFF) player:sendCancelMessage('You do not have any vip days.') end elseif item.actionid == 1501 then if player:isVip() then player:teleportTo(vipPosition) player:say('!* VIP *!', TALKTYPE_MONSTER_SAY) vipPosition:sendMagicEffect(CONST_ME_STUN) else player:teleportTo(fromPosition) player:sendCancelMessage('You do not have any vip days.') fromPosition:sendMagicEffect(CONST_ME_POFF) end end return true end Items que adicionam dias VIP
ItemId 10135 adiciona 10 dias vip. ItemId 10134 adiciona 30 dias vip. ItemId 10133 adiciona 90 dias vip.
1° em data/actions/actions.xml adicione
<action fromid="10133" toid="10135" script="vipitems.lua"/> 2° e em data/actions/scripts crie um arquivo chamado vipitems.lua e adicione o seguinte
local vipItems = { -- [itemid] = amount of vip days [10135] = 10, [10134] = 30, [10133] = 90 } function onUse(cid, item, fromPosition, itemEx, toPosition, isHotkey) local player = Player(cid) local days = vipItems[item.itemid] player:addVipDays(days) player:say('!* YAY VIP! *!', TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(CONST_ME_STUN) player:sendTextMessage(MESSAGE_INFO_DESCR, string.format('You received %s vip days.', days)) Item(item.uid):remove(1) return true end -
Por EddyHavoc
Descrição: Com estas alterações nas sources do servidor e do OTC você conseguirá adicionar ao jogo uma barra de carregamento nas criaturas do jogo. Esta barra é personalizável e pode ser utilizada de diversas formas em diferentes scripts.
Server sources.
No arquivo game.h
Abaixo de:
Adicione:
No arquivo game.cpp
Adicione:
No arquivo luascript.h
Abaixo de:
Adicione:
No arquivo luascript.cpp
Abaixo de:
Adicione:
Abaixo de:
Adicione:
No arquivo player.h
Abaixo de:
Adicione:
No arquivo protocolgame.h
Abaixo de:
Adicione:
No arquivo protocolgame.cpp
No final do arquivo adicione:
Client sources.
No arquivo protocolcodes.cpp
Abaixo de:
Adicione:
No arquivo protocolgame.h
Abaixo de:
Adicione:
No arquivo protocolgameparse.cpp
Abaixo de:
Adicione:
Abaixo de:
Adicione:
No arquivo creature.h
Abaixo de:
Adicione:
Abaixo de:
Adicione:
No arquivo creature.cpp
Abaixo de:
Adicione:
Substitua o código abaixo:
Por este código:
E ainda no arquivo creature.cpp no final da página adicione:
Fim! Estas são todas as alterações!
Créditos:
EddyHavoc
Flatlander
Kondrah
Oen432
-
Por EddyHavoc
[TUTORIAL] [UBUNTU] Como gerar e configurar uma nova chave RSA
Este tutorial pode ser útil para você deixar o uso obrigatório do seu client customizado para o seu servidor.
Para seguir este tutorial você precisará ter o OpenSSL instalado.
Consultando se o seu sistema já tem OpenSSL
Gerando a chave RSA
Primeiramente, vamos gerar uma nova chave RSA exclusiva
Assim que gerado, será criado um arquivo "key.pem" no diretório em que você está, esta será a sua chave RSA.
Execute agora o seguinte comando
Após executado o comando acima, será criado um arquivo "public.pem" neste mesmo diretório. Esta é a sua RSA pública.
Precisamos agora converter a chave RSA publica em hexadecimal para decimal, somente desta forma será aceito no Servidor e no OTClient.
Antes de tudo será necessário tratar a RSA pública, portando execute os comandos abaixo:
Após executar o comando acima o terminal deve printar algo como isso:
Em seguida execute o comando abaixo:
Após executar o comando acima o terminal deve printar algo como isso:
Agora para realizar a conversão de Hex para Decimal utilize o seguinte site: Hexadecimal to Decimal Converter (rapidtables.com)
A sua RSA deve ter obrigatoriamente 309 caracteres.
Configurando a Chave RSA no OTClient
Agora entre no seguinte caminho modules/gamelib/ do OTClient e abra o arquivo const.lua
Procure por OTSERV_RSA, você encontrará algo como isto:
Apague e insira a sua chave RSA pública já em Decimal, quando inserir indico deixar tudo em uma linha, como exemplo abaixo:
Não é necessário mexer na CIPSOFT_RSA.
Configurando a Chave RSA no Servidor
Substitua o seu novo arquivo gerado key.pem pelo mesmo arquivo localizado na pasta do seu servidor.
Considerações Finais
Pronto! Melhoria concluída com sucesso!
Após isso só será possível efetuar login em seu servidor com um client que tem a sua RSA pública configurada.
Créditos:
@Cjaker
Sun
Marcos Pacheco
@Breno Alves
@EddyHavoc
@Cat
-
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.