Histórico de Curtidas
-
Nother deu reputação a L3K0T em Tela Estendida para OTClient V8 (TFS 0.4)Tela Estendida para OTClient V8 (TFS 0.4)
Olá pessoal, hoje estou trazendo uma tela estendida para o OTClient V8 na versão mais recente. Espero que isso seja útil para vocês! Esta versão vem com atualizações de código que são fáceis de entender. Testado em TFS 0.4.
Passo 1: Modificações no const.h
Abra o arquivo const.h e encontre:
#define NETWORK_MAX_SIZE ou
#define NETWORKMESSAGE_MAXSIZE
Altere para:
#define NETWORK_MAX_SIZE 49180 ou, dependendo da sua source, #define NETWORKMESSAGE_MAXSIZE 49180
Passo 2: Modificações no Protocollgame.cpp
Encontre:
((x >= myPos.x - 8 + offsetz) && (x <= myPos.x + 9 + offsetz) && //(y >= myPos.y - 6 + offsetz) && (y <= myPos.y + 7 + offsetz));
Altere para:
((x >= myPos.x - Map::maxClientViewportX + offsetz) && (x <= myPos.x + (Map::maxClientViewportX+1) + offsetz) && (y >= myPos.y - Map::maxClientViewportY + offsetz) && (y <= myPos.y + (Map::maxClientViewportY+1) + offsetz));
Passo 3: Atualizações nas descrições do mapa
Encontre:
GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg);
Altere para:
GetMapDescription(pos.x - Map::maxClientViewportX, pos.y - Map::maxClientViewportY, pos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, msg);
Passo 4: Atualizações na movimentação do personagem
Encontre:
if(oldPos.y > newPos.y) // north, for old x { msg->put<char>(0x65); GetMapDescription(oldPos.x - 8, newPos.y - 6, newPos.z, 18, 1, msg); } else if(oldPos.y < newPos.y) // south, for old x { msg->put<char>(0x67); GetMapDescription(oldPos.x - 8, newPos.y + 7, newPos.z, 18, 1, msg); } if(oldPos.x < newPos.x) // east, [with new y] { msg->put<char>(0x66); GetMapDescription(newPos.x + 9, newPos.y - 6, newPos.z, 1, 14, msg); } else if(oldPos.x > newPos.x) // west, [with new y] { msg->put<char>(0x68); GetMapDescription(newPos.x - 8, newPos.y - 6, newPos.z, 1, 14, msg); }
Altere para:
if (oldPos.y > newPos.y) { // north, for old x msg->put<char>(0x65); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } else if (oldPos.y < newPos.y) { // south, for old x msg->put<char>(0x67); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y + (Map::maxClientViewportY+1), newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } if (oldPos.x < newPos.x) { // east, [with new y] msg->put<char>(0x66); GetMapDescription(newPos.x + (Map::maxClientViewportX+1), newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } else if (oldPos.x > newPos.x) { // west, [with new y] msg->put<char>(0x68); GetMapDescription(newPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); }
Passo 5: Atualizações na descrição dos pisos
Encontre:
GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 5, 18, 14, 3, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 4, 18, 14, 4, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 3, 18, 14, 5, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 2, 18, 14, 6, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 1, 18, 14, 7, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 0, 18, 14, 8, skip);
Altere para:
GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 5, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 4, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 4, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 5, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 6, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 7, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 0, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 8, skip);
Passo 6: Outras modificações
Encontre:
GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, oldPos.z - 3, 18, 14, 3, skip);
Altere para:
GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, oldPos.z - 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip);
Passo 7: Modificações adicionais
Encontre:
GetMapDescription(oldPos.x - 8, oldPos.y + 1 - 6, newPos.z, 1, 14, msg);
Altere para:
GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg);
Passo 8: Atualizações finais
Encontre:
GetMapDescription(oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 1, msg);
ALTERE PARA
GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg);
Passo 9: Mais modificações nas descrições de pisos
Encontre:
GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 14, -1, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 1, 18, 14, -2, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip);
Altere para:
GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -1, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -2, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip);
Passo 10: Últimas modificações
Encontre:
GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip);
Altere para:
GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip);
Passo 11: Ajustes finais
Encontre:
GetMapDescription(oldPos.x + 9, oldPos.y - 1 - 6, newPos.z, 1, 14, msg);
Altere para:
GetMapDescription(oldPos.x + Map::maxClientViewportX+1, oldPos.y - (Map::maxClientViewportY+1), newPos.z, 1, ((Map::maxClientViewportY+1)*2), msg);
Passo 12: Atualizações em MAP.H
Abra o arquivo MAP.H do servidor e encontre:
static const int32_t maxViewportX = 11; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 11; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 8; static const int32_t maxClientViewportY = 6;
Altere para:
static const int32_t maxViewportX = 15; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 15; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 14; static const int32_t maxClientViewportY = 12;
Pronto, agora é só compilar as sources do seu servidor no modo Rebuild para apagar o cache.
Parte 2: OTClient 0.6.6
Abra o arquivo map.cpp das sources do OTClient V8 e encontre:
void Map::resetAwareRange() { AwareRange range; range.left = 8; range.top = 6; range.bottom = 7; range.right = 9; setAwareRange(range); }
Altere para:
void Map::resetAwareRange() { AwareRange range; range.left = 14; //Change this to = maxClientViewportX range.top = 12; //Change this to = maxClientViewportY range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); }
Compile a source do OTClient também no modo Rebuild e pronto!
-
Nother recebeu reputação de Fabi Marzan em Procuro parceiro para criar um server de JujutsuEstou a fim de criar um server de Jujutsu, porém criar sozinho é intensamente maçante pois tudo que fazemos não temos com quem compartilhar e as ideias são muito limitadas quando tem só uma pessoa fazendo, e aos poucos os projetos vão perdendo o brilho. E sei que pessoas com experiencia cobram e estão mais que certas. Então estou disposto a ensinar tudo que sei para quem quiser entrar no projeto. Não sei tudo, na verdade tenho conhecimento bem básico em criar server, mas o que sei já é o suficiente para fazer a ideia sair do papel e ficar on, e sobre remuneração, iremos repartir lucros quando o server estiver online, então é um investimento de tempo a longo prazo.
Quem tiver interesse me chama la no discord (nother0705).
-
Nother deu reputação a Underewar em [Tutorial Definitivo] Como usar ExtendedOpcodes OTC (Client-Side | Server-Side) + JSON EncoderTutorial: 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
-
Nother deu reputação a gabriellippa em [Tutorial Definitivo] Como usar ExtendedOpcodes OTC (Client-Side | Server-Side) + JSON EncoderEste tutorial é notável por sua clareza e abordagem passo a passo. Ele destaca a organização do projeto, explora a criação da interface gráfica (OTUI) e fornece uma implementação completa tanto no lado do cliente quanto do servidor. O autor demonstra cuidado ao incluir pré-requisitos e compartilha os arquivos usados no tutorial, tornando-o acessível e aplicável. Além disso, os toques finais sobre o registro de eventos e a melhoria da formatação com JSON Encoder contribuem para tornar este tutorial uma valiosa e compreensível contribuição para a comunidade de desenvolvimento.
-
Nother deu reputação a Gabrieltxu em Taunt System [Pokémon]Yoooooooooo Eae galera Achei o taunt System na NET E vi que Aki no TK Não Tem esse Topico xD Então Vou Postar..
Oq ele é?
um sistema do PXG, o TAUNT SYSTEM, alguns ja conheçem mas para aqueles que nao conheçem, ele funciona assim:
Voçe fala o comando "!taunt" e em seguida começa a aparecer varios looktype como se ele estivesse se mechendo, vamos ao que interessa.
Va em data/talkactions/scripts e crie um arquivo qualquer, voçe escolhe o nome, e cole isso dentro:
Salve em LUA e feche, Depois va em data/talkactions/ e abra o talkactions.xml e cole isso la:
<talkaction words="!taunt" event="script" value="ARQUIVO.lua"/>
EXPLICAÇÃO:
Azul: ali voçe coloca sua sequencia de looktype.
Vermelho: ali voçe coloca seu addon, oque ira dar inicio ao taunt.
Verde: mensagem para quando nao estiver usando o addon certo.
-----------------------------------------------------------------------
Eu tambem tenho o script do slicer modificado, esse ai é do brun123, agora que me lembrei, aqui esta o do slicer modificado:
EXPLICAÇÃO:
Azul: ali voçe coloca sua sequencia de looktype.
Vermelho: ali voçe coloca seu addon, oque ira dar inicio ao taunt.
Verde: mensagem para quando nao estiver usando o addon certo.
é o mesmo esquema do brun123 só que ali voçe pode adicionar mais um script e assim por diante.
Creditos:
Brun123 (pelo script)
Slicer (pela modificação)
Gabrieltxu (por postar)
é isso, comentem ai, e se gostou Resp+. Até mais.
-
Nother deu reputação a FeeTads em (Resolvido)Ids da database não zeram os númerosvc pode fazer isso direto pelo seu phpmyadmin, ou até pelo SQL mesmo
mudando o "auto_increment" e dando executar *a tabela precisa estar resetada*
ou dando o comando no SQL
ALTER TABLE `nome-da-tabela` AUTO_INCREMENT = 1
-
Nother deu reputação a JulianoZN em (Resolvido)Ids da database não zeram os númerosBaixa o banco de dados e altera
/\ /\ id com o AUTO_INCREMENT que vem por padrao na maioria dos Nome.sql
\/ \/ auto incremente no final da função com o valor de onde vai começar se mudar para 1 a primeira conta a ser criada vai ser a 1
279 e a conta que vai ser criada então se alguem criar agora esse 279 vai subir para 280 para uma nova conta que vai ser criada
-
Nother deu reputação a FeeTads em Item que heala e da buffGG mano, testa certinho, faz varios tipos de testes que os players podem tentar fazer, tipo usar e deslogar, usar varios, etc.. e ve se da algum bug, se der volta aki kkkkkkkk, tmj mano
-
Nother deu reputação a FeeTads em Item que heala e da buffa distro deixou o erro ali kkkkkk
" ' , ' expected near '#' " ?
kkkkkk faltou uma virgula no for da linha 46
aki nesse for i=1 #need_vocation
for i=1 #need_vocation do -- checa as vocações que podem usar o food //setadas no cabeçalho if getPlayerVocation(cid) == need_vocation[i] then -- se for, aparece msg de sucesso na tela doPlayerSendTextMessage(cid, 22, msg_sucess) else doPlayerSendTextMessage(cid, 22, msg_no_vocation) -- se não tiver a vocação necessaria, manda msg avisando return true -- e sai da função end end
coloca assim
for i=1, #need_vocation do
só uma virgula após o i=1
de qualquer maneira, atualizei a linha 46 no código ali em cima, qualquer coisa só copiar e colar kkk
e caso funcione 100%, deixa o REP+ e o Mark as Solution ?
tmj meu mano
po mano e percebi um "mini erro" meu aqui, quando estava chamando a função, caso fosse diferente de 1 segundo, iria bugar
deixando o código arrumado aki pra baixo
fix: GARANTE que o buff vai durar exatamente o tempo descrito no cabeçalho, independente de quantas curas executar.
fix2: arrumei a checagem de vocação do for também, da outra maneira ia checar apenas a primeira vocação e sair.
sugiro muito que copie esse script \/
local itemID = 9998 -- id do item local tempoDeBuff = 60 -- em segundos local porcentagemDeCura = 2 -- vai curar 2% por [tempo entre curas] durante [tempo de buff] local qtdDeSkill = 10 -- quantidade de skill que dará local efeito = 4 -- efeito que sairá do player local removerItem = true -- remover o item? true = remove, false = não remove local tempoEntreCuras = 1 * 1000 -- tempo entre o efeito da cura, 1 * 1000 = 1000ms logo //1 segundo local need_vocation = {1,2,3,4,5} -- IDs da vocações QUE PODEM usar o food local buff = SKILL_FISHING -- qual skill vai aumentar //pra saber qual skill vc quer aumentar procure por "skill" em "lib/000-constant.lua" local storage = 5474767 -- pode ser qualquer numero //não pode repetir numero de outra storage existente local storage_buff_ativo = 5474768 local function CuraFoodBuff(cid, flag) if isCreature(cid) then --se estiver logado entra, se não termina o loop, ou seja, se deslogar/morrer perde o efeito do food if flag > 0 then doCreatureAddHealth(cid, (getCreatureMaxHealth(cid) * (porcentagemDeCura/100))) -- n mexer :P doSendMagicEffect(getThingPos(cid), efeito) -- efeito que vai sair do player flag = getPlayerStorageValue(cid, storage) - os.time() -- garante que execute a função pelo [tempo de buff] addEvent(CuraFoodBuff, tempoEntreCuras, cid, flag) -- chama de novo a função passando -1 segundo pro tempo else doPlayerAddSkill(cid, buff, -qtdDeSkill, true) -- quando acabar o efeito seta o fishing pro normal setPlayerStorageValue(cid, storage_buff_ativo, -1) return true end else return true end end function onUse(cid, item, frompos, item2, topos) local msg_no_vocation = "Sua Vocação não pode usar esse item!" -- mensagem caso não tenha a voc necessária local msg_sucess = "Você usou o Heal Food, o efeito irá durar"..tempoDeBuff.." segundos" -- mensagem de sucesso if item.itemid == itemID then local tempo = getPlayerStorageValue(cid, storage) - os.time() -- tempo recebe o tempo restante pra usar a potion de novo if tempo > 0 then -- se tempo for maior que 0, significa que está em uso if tempo > 60 then -- só pra mostrar bonitinho doPlayerSendCancel(cid,"Você precisa esperar "..math.floor(tempo/60).." minutos e "..(tempo%60).." segundos.") else doPlayerSendCancel(cid,"Você precisa esperar "..(tempo%60).." segundos.") end return true end for i=1, #need_vocation do -- checa as vocações que podem usar o food //setadas no cabeçalho if getPlayerVocation(cid) == need_vocation[i] then -- se for, aparece msg de sucesso na tela doPlayerSendTextMessage(cid, 22, msg_sucess) no_have_voc = false -- seta a variavel de não ter voc pra false, ou seja tem a voc necessaria break -- quebra o for depois disso //necessario deixar o BREAK end end if no_have_voc then doPlayerSendTextMessage(cid, 22, msg_no_vocation) -- se não tiver a vocação necessaria, manda msg avisando return true -- e sai da função end setPlayerStorageValue(cid, storage, os.time() + tempoDeBuff) -- storage pra salvar o tempo de buff, apenas pra tirar o skill de fishing caso o player deslogue/morra doPlayerAddSkill(cid, buff, qtdDeSkill, true) -- aumenta o skill setado no cabeçalho setPlayerStorageValue(cid, storage_buff_ativo, 1) if removerItem then -- se removerItem no cabeçalho for true REMOVE O ITEM, se não, não remove doRemoveItem(item.uid, 1) -- função de remover o item, não precisa mexer end CuraFoodBuff(cid, tempoDeBuff) -- chama a função end return true end
-
Nother recebeu reputação de DonaTello em Spell de 8 hits com 8 animação.-----DISCORD:SoyFabi#5938 local combat = createCombatObject() local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, COLOR_YELLOW) --180(red), 70(blue), 156(brown), 215(white), 145(red 2), 95(lightblue) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -1.0, -1000, -1.0, -1000) ------------------- local function onCastSpell1(parameters) doCombat(parameters.cid, parameters.combat1, parameters.var) end ------------------- local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_HITCOLOR, COLOR_YELLOW) --180(red), 70(blue), 156(brown), 215(white), 145(red 2), 95(lightblue) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -1.0, -1000, -1.0, -1000) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 22) -- Missile ------------------- local function onCastSpell2(parameters) doCombat(parameters.cid, parameters.combat2, parameters.var) end ------------------- local function Effect(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 1, y = pos.y + 1, z = pos.z}, 216) end local function Effect_two(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 1, y = pos.y + 2, z = pos.z}, 217) end local function Effect_three(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 2, y = pos.y + 2, z = pos.z}, 218) end local function Effect_four(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 2, y = pos.y + 1, z = pos.z}, 219) end local function Effect_five(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 1, y = pos.y + 1, z = pos.z}, 220) end local function Effect_six(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 2, y = pos.y + 1, z = pos.z}, 223) end local function Effect_seven(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 1, y = pos.y + 1, z = pos.z}, 222) end local function Effect_eight(cid, target) local pos = getCreaturePosition(target) doSendMagicEffect({x = pos.x + 1, y = pos.y + 1, z = pos.z}, 221) end function onCastSpell(cid, var) local exhausted = 1 -- Time of exhaustion. local storage = 17002 -- Storage for combo for each spell. if exhaustion.check(cid, storage) then doPlayerSendCancel(cid, "You are exhausted.") doSendMagicEffect(getCreaturePosition(cid), 2) return false end local parameters = {cid = cid, var = var, combat1 = combat1 , combat2 = combat2} addEvent(onCastSpell2, 100, parameters) addEvent(onCastSpell1, 300, parameters) addEvent(onCastSpell1, 400, parameters) addEvent(onCastSpell1, 500, parameters) addEvent(onCastSpell1, 600, parameters) addEvent(onCastSpell1, 700, parameters) addEvent(onCastSpell1, 800, parameters) local config = { hit = 1, -- Veces que dara un hit. time = 100, -- tiempo que saldra la magia. time2 = 300, -- tiempo que saldra la magia. time3 = 400, -- tiempo que saldra la magia. time4 = 500, -- tiempo que saldra la magia. time5 = 600, -- tiempo que saldra la magia. time6 = 700, -- tiempo que saldra la magia. time7 = 800, -- tiempo que saldra la magia. time8 = 900, -- tiempo que saldra la magia. configtarget = getCreatureTarget(cid), --- No borre (es importante para que salga las magias). } for a = 1, config.hit do addEvent(Effect, config.time * a, cid, config.configtarget) addEvent(Effect_two, config.time2 * a, cid, config.configtarget) addEvent(Effect_three, config.time3 * a, cid, config.configtarget) addEvent(Effect_four, config.time4 * a, cid, config.configtarget) addEvent(Effect_five, config.time5 * a, cid, config.configtarget) addEvent(Effect_six, config.time6 * a, cid, config.configtarget) addEvent(Effect_seven, config.time7 * a, cid, config.configtarget) addEvent(Effect_eight, config.time8 * a, cid, config.configtarget) end exhaustion.set(cid, storage, exhausted) return doCombat(cid, combat, var) end ---DISCORD:SoyFabi#5938 Editei o script que o Fabi mandou ai, agora ta certinho mas precisa fazer as alterações no object builder, lembra de colocar em parametros de cada sprite x16 e y16 caso seu server seja topdown. Muda tbm o script, coloca suas configs pois testei no meu server aqui! Se for isso ai deixa Rep+ para ele lá em cima
-
Nother deu reputação a rojaoxd em Kakashi & Kyuubi Outfit com MascaraOlá pessoal, há alguns meses venho desenvolvendo um projeto Naruto MOBA.
Tive muita ajuda aqui dentro da comunidade para problemas que não consegui resolver, acho justo compartilhar com vocês a criação de alguns dos meus trabalhos, faço como hobby porque gosto então não tenho problema em compartilha-los.
Está em PNG e também em OTB para instalar facilmente em seu clint.
Assim que eu terminar os outros eu compartilho aqui.
Créditos Kakashi
Vagner - Naruto Online (Para base)
Rojao(Devido ao aumento do tamanho e da máscara)
Créditos Kyuubi
Digimon Online (Para roupa)
Rojao (Para máscara)
OTB.rar
-
Nother deu reputação a Elpeto em Pack spr dat Return Of SayansReturn of sayans
Ja postei no face, precisa do object build 10.98
Essas spr ja vazaram a um bom tempo,
Tem gente querendo vender, sendo que vazou, nao acho certo, resolvi disponibilizar pra vcs
https://www.mediafire.com/file/63dn7lebrg6fym7/R_O__T_S_GRAFIKA.rar/file
-
Nother deu reputação a compp em Porta Que Nao Abre no RMEVai na pasta Item.xml
Espero ter ajudado! -
Nother deu reputação a FeeTads em (Resolvido)Usar Item e Mudar Outfit.local remover = false -- Remover ao usar? false = não remove, true = remover local outfits = { [11478] = {out = 2013}, } function onUse(cid, item) local t = outfits[item.itemid] if getPlayerVocation(cid) > 13 then doPlayerSendTextMessage(cid, 22, "Sua vocação não pode usar este item!") return true end if getCreatureOutfit(cid).lookType ~= 2013 then --se o outfit for diferente do 2013 setPlayerStorageValue(cid, 1234567, getCreatureOutfit(cid).lookType) --salva o looktype atual do player doCreatureChangeOutfit(cid, {lookType = t.out}) --transforma doPlayerSendTextMessage(cid, 22, "Voce alterou seu Outfit!") else doCreatureChangeOutfit(cid, {lookType = getPlayerStorageValue(cid, 1234567)}) --se o looktype for 2013 volta ao original doPlayerSendTextMessage(cid, 22, "De volta ao seu outfit original!") end if remover then doRemoveItem(item.uid, 1) -- pode deixar 1 aqui e no escopo deixa false end return true end
se funcionar deixa o rep+ ai pra ajudar
-
Nother recebeu reputação de FeeTads em Como removo o limite da barra de vida e mana?SAQUEI, QUE PENA ENTÃO, DE QUALQUER FORMA VLW AI.
-
Nother deu reputação a Aksz em (Resolvido)Como adicionar foto no site na hora de criar a vocation.Problema resolvido.
Solução :
Foi trocado a linha do input que puxava somente o nome das vocations, por essa.
OBS : Tanto na tela de criação de char, quando na criação de conta foi alterado e posto esse código.
<div class="vocations"> {% for key, sample_char in config.character_samples %} <div class="vocation"> <input type="radio" class="vocation__radio-item" name="vocation" id="vocation{{ key }}" value="{{ key }}" {% if vocation is not null and vocation == key %} checked="checked"{% endif %}> <label for="vocation{{ key }}" class="vocation-label"> <img class="vocation-label__img" src="{{ config['vocation_images'][key] }}" alt="{{ config['vocations'][key] }}"/> <span class="vocation-label__name">{{ config['vocations'][key] }}</span> </label> </div> {% endfor %} </div> E o código CSS para ficar certinho usado foi esse.
.vocations { display: flex; flex-direction: row; flex-wrap: wrap; } .vocation { flex: 50%; text-align: center; } .vocation input[type=radio] { display: none; } .vocation__radio-item:checked +.vocation-label .vocation-label__name { color: red; } .vocation-label__img { max-width: 100%; } .vocation-label__name { display: block; margin-top: 20px; } .vocation-label:hover .vocation-label__name, .vocation-label:active .vocation-label__name, .vocation-label:focus .vocation-label__name { color: red; }
-
Nother deu reputação a warlens em (Resolvido)Como adicionar foto no site na hora de criar a vocation.Opa depois de quebrar muito a cabeça, eu conseguir colocar de um jeito através do modern acc, com click, seguindo muitos tutoriais, ficou assim:
eu usei uns codigo src com <center> e outras função pra detectar as vocações.
-
Nother deu reputação a Aksz em (Resolvido)Como adicionar foto no site na hora de criar a vocation.Bom dia!
Me manda uma mensagem MP, como se trata de um caso especifico, vamos te que testar varias configurações, então fica combinado assim, quando achar a solução, postamos aqui, para quem quiser usar também, ta bom?
-
Nother recebeu reputação de Vodkart em (Resolvido)Teleport que muda estando com target ou não.mandei mensagem la kkk, quando tiver ok eu posto aqui para o pessoal
Ai galera, consegui editar o effect e o cooldown tbm, a spell ta muito boa, @Vodkart muito obrigado mesmo.
Deixei o CD em 5 minutos.
local from, to = {x=947, y=955, z=15}, {x=1055, y=1041, z=15} -- area total do kamui local from, arena = {x=900, y=895, z=7}, {x=921, y=915, z=7} -- area total da arena local teleport = {x=1000, y=1000, z=15} -- para onde vai local blocks = {"tronco"} -- defina o nome dos monstro em minusculo local storage = 753159 function isInKamuiArea(cid) return isInRange(getCreaturePosition(cid), from, to) and true or false end function isInKamuiArea(cid) return isInRange(getCreaturePosition(cid), from, arena) and true or false end function TeleportToKamui(alvo, pos) if not isCreature(alvo) then return LUA_ERROR end doTeleportThing(alvo, pos) local positionpk = {x=getThingPos(alvo).x+1, y=getThingPos(alvo).y+1, z=getThingPos(alvo).z} doSendMagicEffect(positionpk, 315) -- cid end function onCastSpell(cid, var) local tempo = 300 -- Tempo de exhaustion em segundos local sto = 545550 -- Storage de Spell, nunca usar a mesma em outra spell, a menos que não queira usar duas spell juntas! if exhaustion.check(cid, sto) then doPlayerSendCancel(cid, "Aguarde " .. exhaustion.get(cid, sto) .. " segundos para usar o kamui novamente.") return false end local target = getCreatureTarget(cid) if target > 0 and isCreature(target) then -- se tiver target if isMonster(target) then if isInArray(blocks, getCreatureName(target):lower()) then doPlayerSendCancel(cid, "voce nao pode usar o kamui neste alvo") return true end local positionp = {x=getCreaturePosition(cid).x+1, y=getCreaturePosition(cid).y+1, z=getCreaturePosition(cid).z} doSendMagicEffect(positionp, 315) -- effect que sai em voce local positiont = {x=getThingPosition(getCreatureTarget(cid)).x+1, y=getThingPosition(getCreatureTarget(cid)).y+1, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(positiont, 315) -- effect ao usar kamui em um player local min = ((30) * (getPlayerMagLevel(cid) + getPlayerLevel(cid))) local max = ((35) * (getPlayerMagLevel(cid) + getPlayerLevel(cid))) doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -min, -max, CONST_ME_BLOCKHIT) -- defina combat e effect COMBAT_PHYSICALDAMAGE / CONST_ME_BLOCKHIT addEvent(TeleportToKamui, 700, target,teleport) elseif isPlayer(target) then if isInKamuiArea(target) then doPlayerSendCancel(cid, "voce nao pode usar o kamui em alguem nesta area") return true end setPlayerStorageValue(target, storage, ":".. getCreaturePosition(target).x ..",:".. getCreaturePosition(target).y ..",:".. getCreaturePosition(target).z) local positionp1 = {x=getCreaturePosition(cid).x+1, y=getCreaturePosition(cid).y+1, z=getCreaturePosition(cid).z} doSendMagicEffect(positionp1, 315) -- effect que sai em voce local positiont1 = {x=getThingPosition(getCreatureTarget(cid)).x+1, y=getThingPosition(getCreatureTarget(cid)).y+1, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(positiont1, 315) -- effect ao usar kamui em um monstro local min = ((30) * (getPlayerMagLevel(cid) + getPlayerLevel(cid))) local max = ((35) * (getPlayerMagLevel(cid) + getPlayerLevel(cid))) doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -min, -max, CONST_ME_BLOCKHIT) -- defina combat e effect COMBAT_PHYSICALDAMAGE / CONST_ME_BLOCKHIT addEvent(TeleportToKamui, 700, target, teleport) end else if isInKamuiArea(cid) then doPlayerSendCancel(cid, "voce nao pode usar o kamui nesta area") return true end setPlayerStorageValue(cid, storage, ":".. getCreaturePosition(cid).x ..",:".. getCreaturePosition(cid).y ..",:".. getCreaturePosition(cid).z) local positionp2 = {x=getCreaturePosition(cid).x+1, y=getCreaturePosition(cid).y+1, z=getCreaturePosition(cid).z} doSendMagicEffect(positionp2, 315) -- effect ao usar o kamui em voce mesmo addEvent(TeleportToKamui, 700, cid, teleport) doCreatureAddHealth(cid, -100) end exhaustion.set(cid, sto, tempo) return true end
O XML
<instant name="Kamui" words="kamui in" lvl="300" mana="10000" prem="0" needtarget="0" range="4" exhaustion="0" blockwalls="1" needlearn="0" script="kakashi/kamui in.lua"> <vocation id="0"/> </instant>
O movements do portal é aquele mesmo que ele passou no inicio da spell.
-
Nother deu reputação a Vodkart em (Resolvido)Teleport que muda estando com target ou não.testa o dano
local from, to = {x=980, y=980, z=15}, {x=1050, y=1050, z=15} -- area total do kamui local teleport = {x=1000, y=1000, z=15} -- para onde vai local blocks = {"demon", "hydra"} -- defina o nome dos monstro em minusculo local storage = 753159 function isInKamuiArea(cid) return isInRange(getCreaturePosition(cid), from, to) and true or false end function TeleportToKamui(alvo, pos) if not isCreature(alvo) then return LUA_ERROR end doTeleportThing(alvo, pos) doSendMagicEffect(getThingPos(alvo), 40) -- effect target ao entrar no kamui end function onCastSpell(cid, var) local target = getCreatureTarget(cid) if target > 0 and isCreature(target) then -- se tiver target if isMonster(target) then if isInArray(blocks, getCreatureName(target):lower()) then doPlayerSendCancel(cid, "voce nao pode usar a spell neste monstro") return true end doSendMagicEffect(getCreaturePosition(cid), 4) -- cid doSendMagicEffect(getThingPos(target), 10) -- effect target ao usar kamui local min = (getPlayerLevel(cid) * 2 + getPlayerMagLevel(cid) * 20) * 5 local max = (getPlayerLevel(cid) * 5 + getPlayerMagLevel(cid) * 50) * 8 doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -min, -max, CONST_ME_BLOCKHIT) -- defina combat e effect COMBAT_PHYSICALDAMAGE / CONST_ME_BLOCKHIT addEvent(TeleportToKamui, 300, target,teleport) elseif isPlayer(target) then if isInKamuiArea(target) then doPlayerSendCancel(cid, "voce nao pode usar a spell em um target dentro do kamui") return true end setPlayerStorageValue(target, storage, ":".. getCreaturePosition(target).x ..",:".. getCreaturePosition(target).y ..",:".. getCreaturePosition(target).z) doSendMagicEffect(getCreaturePosition(cid), 4) -- cid doSendMagicEffect(getThingPos(target), 10) -- effect target ao usar kamui local min = (getPlayerLevel(cid) * 2 + getPlayerMagLevel(cid) * 20) * 5 local max = (getPlayerLevel(cid) * 5 + getPlayerMagLevel(cid) * 50) * 8 doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -min, -max, CONST_ME_BLOCKHIT) -- defina combat e effect COMBAT_PHYSICALDAMAGE / CONST_ME_BLOCKHIT addEvent(TeleportToKamui, 300, target, teleport) end else if isInKamuiArea(cid) then doPlayerSendCancel(cid, "voce nao pode usar a spell dentro do kamui") return true end setPlayerStorageValue(cid, storage, ":".. getCreaturePosition(cid).x ..",:".. getCreaturePosition(cid).y ..",:".. getCreaturePosition(cid).z) doSendMagicEffect(getCreaturePosition(cid), 4) -- cid addEvent(TeleportToKamui, 300, cid, teleport) doCreatureAddHealth(cid, -100) end return true end
-
Nother deu reputação a Vodkart em (Resolvido)Adcionar delay na spell de teleport.local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_HITCOLOR, COLOR_TEAL) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 32) function onGetFormulaValues(cid, level, maglevel) min = -((30) * (maglevel + level)) max = -((33) * (maglevel + level)) return min, max end setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") local function onCastSpell1(parameters) return isCreature(parameters.cid) and doCombat(parameters.cid, combat, parameters.var) end function onCastSpell(cid, var) local parameters = { cid = cid, var = var} local waittime = 1 -- Tempo de exhaustion local storage = 445000 if exhaustion.check(cid, storage) then doPlayerSendCancel(cid, "Podera usar novamente dentro de 1 segundos.") doSendMagicEffect(getCreaturePosition(cid), 32) return false end exhaustion.set(cid, storage, waittime) local positionp = getPlayerPosition(cid) local target = getCreatureTarget(cid) local enemypos = getCreaturePosition(target) addEvent(onCastSpell1, 550, parameters) if target == isMonster or isCreature then addEvent(function() if not isCreature(cid) then return LUA_ERROR end doTeleportThing(cid, enemypos) end, 500) addEvent(doSendMagicEffect, 500, {x = enemypos.x, y = enemypos.y+1, z = enemypos.z}, 311) addEvent(doSendMagicEffect, 10, {x = positionp.x, y = positionp.y+1, z = positionp.z}, 312) end return true end
-
Nother recebeu reputação de Vodkart em (Resolvido)Teleport que muda estando com target ou não.Que isso, so oque vc ja fez aqui e mais doque eu faria em um ano kkk, seguinte, agora a spell com needtarget 0 pega no alvo mas não pega em mim, o effect agora esta funcionando nos 2.
-
Nother recebeu reputação de XGaduX em Exhaustion na spelllocal atk1 = createCombatObject() local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, COLOR_RED) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) function kiaiho(cid, level, maglevel) local min = -(level * 100.0+ maglevel * 100 +0) local max = -(level * 500.0+ maglevel * 500 +0) return min, max end setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "kiaiho") arr1 = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 2, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, } local area1 = createCombatArea(arr1) setCombatArea(atk1, area1) function onTargetTile(cid, pos) doCombat(cid,combat1,positionToVariant(pos)) end setCombatCallback(atk1, CALLBACK_PARAM_TARGETTILE, "onTargetTile") local function onCastSpell1(parameters) doCombat(parameters.cid, atk1, parameters.var) end function onCastSpell(cid, var) if exhaustion.check(cid, 100010) == TRUE then -- em 100010 coloca uma storage que não está sendo usada doPlayerSendCancel(cid, "Podera usar novamente dentro de 15 segundos.") doSendMagicEffect(getCreaturePosition(cid), 32) --effect que sai quando ta com exaust. se não quiser nada so colocar um effect vazio. return false end local parameters = { cid = cid, var = var} local pos1 = {x = getPlayerPosition(cid).x + 2, y = getPlayerPosition(cid).y + 2, z = getPlayerPosition(cid).z} local parameters = { cid = cid, var = var, combat1 = combat1} addEvent(onCastSpell1, 250, parameters) doSendMagicEffect(pos1, 979) exhaustion.set(cid, 100010, 15.0) -- storage aqui tem que ser a mesma de cima return true end Cara não sei nada sobre criar spells, mas o seu exaust colocado errado e eu coloquei da forma certa mas não deu, então peguei o exaust da minha spell e adaptei, testa ai
-
Nother recebeu reputação de So volto tarde em Ajuda colocar efeito em spell e so funcionar em playerTbm não deu certo para sair o effect mas eu fiz uma gambiarra aqui que deu certo, de qualquer forma o script ta funcional, mt obrigado, acabo de te colocar na minha lista de pessoas que eu chamaria para um churrasco kkk vlw
A gambiarra V
function onCastSpell(cid, var) local target = getCreatureTarget(cid) local tPos = {x = getThingPos(target).x, y = getThingPos(target).y, z = getThingPos(target).z} if(target > 0) then if (isMonster(target)) then doTeleportThing(cid, tPos) end doTeleportThing(target, getThingPos(cid)) doTeleportThing(cid, tPos) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Selecione um alvo") end local enemy = getCreaturePosition(getCreatureTarget(cid)) local pos1 = {x=enemy.x, y=enemy.y, z=enemy.z} local positionp = {x=getPlayerPosition(cid).x, y=getPlayerPosition(cid).y, z=getPlayerPosition(cid).z} doSendMagicEffect(pos1, 14) doSendMagicEffect(positionp, 243) return true end
-
Nother deu reputação a So volto tarde em Ajuda colocar efeito em spell e so funcionar em playerno monstro não adicionei nada sobre efeitos, no código você pode encontrar uma tabela "local effects", altere o "CONST_ME_POFF" para o efeito que quiser, ou, caso queira, pode deletar a tabela e alterar nas próprias linhas (17 e 18), ficando "doSendMagicEffect(getThingPos(cid), 11)". sendo 11 o id do effect
//na real, vamos alterar, altere as linhas 17 e 18 para:
ficando: