FlamesAdmin
-
Total de itens
1550 -
Registro em
-
Última visita
-
Dias Ganhos
19
Histórico de Reputação
-
FlamesAdmin recebeu reputação de lSainty em [PDA] Pokeball Icon System
Não existe tutorial sobre o mesmo por aí, então venho aqui postar um.
Pra começar, primeiramente vamos a pasta actions. Adicione um novo arquivo .lua com nome icons
Agora crie um nome de iconsDP na mesma pasta
Em actions.xml adicione as tags
<action itemid="11989" event="script" value="icons.lua"/> <action itemid="2589" event="script" value="iconsDP.lua"/> Já adiantando ainda em actions.xml não se esqueça de adicionar os IDS dos icons na tag do goback.lua
Vamos ao login.lua da pasta creaturescripts. Antes do último return true adicione isso
doPlayerChangeModeIcon(cid) Ficando
doPlayerChangeModeIcon(cid) return true end
Vamos a pasta lib agora. Adicione um arquivo .lua com nome de iconsSystem e coloque isso dentro
Agora adicione outro .lua e com nome de iconsTable e cole isso dentro
LEMBRANDO: Não se esqueçam de trocar os ids de cada pokemon e icon no arquivo iconTable da pasta lib
Vamos agora no some functions.lua na mesma pasta e procure por function addPokeToPlayer
Abaixo de local happy = 250, adicione
if icons[pokemon] then id = icons[pokemon].on else id = pokeballs[btype].on end Abaixo de doItemSetAttribute(item, "fakedesc", "Contains a "..pokemon..".")
Adicione:
doItemSetAttribute(item, "defeated", "no") doItemSetAttribute(item, "ball", btype) Vamos em catch system.lua na mesma pasta e procure por
if not tonumber(getPlayerStorageValue(cid, 54843)) or getPlayerStorageValue(cid, 54843) == -1 then setPlayerStorageValue(cid, 54843, 1) else setPlayerStorageValue(cid, 54843, getPlayerStorageValue(cid, 54843) + 1) end Adicione isso embaixo:
if icons[poke] then ballid = icons[poke].on end Abaixo de doItemSetAttribute(item, "hands", 0) adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo do end da função citada acima, também adicione:
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo de setPlayerStorageValue(cid, 854788, 'done'), também adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo do end da função acima, também adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo de if getPlayerFreeCap(cid) >= 6 then também adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone")
Vamos rapidamente na pasta talkactions dentro do arquivo createpokeball.lua troque o seu por esse:
Voltamos para pasta actions e no arquivo evolution.lua procure por if getPokemonName(item2.uid) == "Eevee" then
Adicione abaixo de doEvolvePokemon(cid, item2, eevee, 0, 0)
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Agora procure por doEvolvePokemon(cid, item2, theevo, evolution, water) e adicione logo abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, theevo, water, punch) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, theevo, water, king) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, theevo, evolution, leaf) e adiciona abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Vileplume", leaf, leaf) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Bellossom", sun, leaf) e adiciona abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Slowbro", enigma, 0) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Slowking", king, 0) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, evolution, punch, 0) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, evo, stnid, stnid2) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) No seu script de pokémon inicial (ex: starter.lua) na pasta actions, em local btype troque por local btype = "Icone"
Em items.xml vamos adicionar os IDS dos icons que você criou no ItemEditor
Cada icone (vivo, usando e morta) precisa de uma tag para eles no items.xml
Sim, vocês terão que criar cada pokemon para cada icon. Essa é a parte mais chata
Agora vamos em movements.xml na tag do portrait.lua e adicionar todos os itens dos icons no mesmo nas duas linhas do portrait.lua
Vamos rapidamente na pasta npcs de preferencia nos npcs de clan ou algum outro que troque pokémon no arquivo .lua deles
Em todos eles possue essa linha doTransformItem(getPlayerSlotItem(cid, 7).uid, fotos["Shiny "..name]) e abaixo dela vocês adicionem
doItemSetAttribute(pb, "Icone", "yes") doTransformItem(pb, icons[getItemAttribute(pb, "poke")].on)
Espero que eu não tenha esquecido de alguma parte.
Bom proveito
Sistema não foi feito por mim massss... Não sei a quem dar os créditos
FUI
-
FlamesAdmin recebeu reputação de Taiger em [PDA] Pokeball Icon System
Não existe tutorial sobre o mesmo por aí, então venho aqui postar um.
Pra começar, primeiramente vamos a pasta actions. Adicione um novo arquivo .lua com nome icons
Agora crie um nome de iconsDP na mesma pasta
Em actions.xml adicione as tags
<action itemid="11989" event="script" value="icons.lua"/> <action itemid="2589" event="script" value="iconsDP.lua"/> Já adiantando ainda em actions.xml não se esqueça de adicionar os IDS dos icons na tag do goback.lua
Vamos ao login.lua da pasta creaturescripts. Antes do último return true adicione isso
doPlayerChangeModeIcon(cid) Ficando
doPlayerChangeModeIcon(cid) return true end
Vamos a pasta lib agora. Adicione um arquivo .lua com nome de iconsSystem e coloque isso dentro
Agora adicione outro .lua e com nome de iconsTable e cole isso dentro
LEMBRANDO: Não se esqueçam de trocar os ids de cada pokemon e icon no arquivo iconTable da pasta lib
Vamos agora no some functions.lua na mesma pasta e procure por function addPokeToPlayer
Abaixo de local happy = 250, adicione
if icons[pokemon] then id = icons[pokemon].on else id = pokeballs[btype].on end Abaixo de doItemSetAttribute(item, "fakedesc", "Contains a "..pokemon..".")
Adicione:
doItemSetAttribute(item, "defeated", "no") doItemSetAttribute(item, "ball", btype) Vamos em catch system.lua na mesma pasta e procure por
if not tonumber(getPlayerStorageValue(cid, 54843)) or getPlayerStorageValue(cid, 54843) == -1 then setPlayerStorageValue(cid, 54843, 1) else setPlayerStorageValue(cid, 54843, getPlayerStorageValue(cid, 54843) + 1) end Adicione isso embaixo:
if icons[poke] then ballid = icons[poke].on end Abaixo de doItemSetAttribute(item, "hands", 0) adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo do end da função citada acima, também adicione:
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo de setPlayerStorageValue(cid, 854788, 'done'), também adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo do end da função acima, também adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone") Abaixo de if getPlayerFreeCap(cid) >= 6 then também adicione
doItemSetAttribute(item, "morta", "no") doItemSetAttribute(item, "Icone", "yes") doItemSetAttribute(item, "ball", "Icone")
Vamos rapidamente na pasta talkactions dentro do arquivo createpokeball.lua troque o seu por esse:
Voltamos para pasta actions e no arquivo evolution.lua procure por if getPokemonName(item2.uid) == "Eevee" then
Adicione abaixo de doEvolvePokemon(cid, item2, eevee, 0, 0)
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Agora procure por doEvolvePokemon(cid, item2, theevo, evolution, water) e adicione logo abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, theevo, water, punch) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, theevo, water, king) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, theevo, evolution, leaf) e adiciona abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Vileplume", leaf, leaf) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Bellossom", sun, leaf) e adiciona abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Slowbro", enigma, 0) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, "Slowking", king, 0) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, evolution, punch, 0) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) Procure por doEvolvePokemon(cid, item2, evo, stnid, stnid2) e adicione abaixo
local ball = getPlayerSlotItem(cid, 8).uid doItemEraseAttribute(ball, "boost") doItemSetAttribute(ball, "morta", "no") doItemSetAttribute(ball, "Icone", "yes") doTransformItem(ball, icons[getItemAttribute(ball, "poke")].use) No seu script de pokémon inicial (ex: starter.lua) na pasta actions, em local btype troque por local btype = "Icone"
Em items.xml vamos adicionar os IDS dos icons que você criou no ItemEditor
Cada icone (vivo, usando e morta) precisa de uma tag para eles no items.xml
Sim, vocês terão que criar cada pokemon para cada icon. Essa é a parte mais chata
Agora vamos em movements.xml na tag do portrait.lua e adicionar todos os itens dos icons no mesmo nas duas linhas do portrait.lua
Vamos rapidamente na pasta npcs de preferencia nos npcs de clan ou algum outro que troque pokémon no arquivo .lua deles
Em todos eles possue essa linha doTransformItem(getPlayerSlotItem(cid, 7).uid, fotos["Shiny "..name]) e abaixo dela vocês adicionem
doItemSetAttribute(pb, "Icone", "yes") doTransformItem(pb, icons[getItemAttribute(pb, "poke")].on)
Espero que eu não tenha esquecido de alguma parte.
Bom proveito
Sistema não foi feito por mim massss... Não sei a quem dar os créditos
FUI
-
FlamesAdmin recebeu reputação de vinicius231 em [RME] Deixando montanha com Auto-Border
Boa tarde, irei mostrar como deixar a montanha com auto-border nos pisos.
Vá até a pasta do seu RME, abra o arquivo grounds.xml da versão que você utiliza, procure por:
<brush name="mountain" type="ground"
Ele vai estar assim:
<brush name="mountain" type="ground" server_lookid="918" z-order="9900">
<item id="919" chance="1"/>
<border align="inner" to="icy mountain" id="53"/>
<border align="inner" to="snowy mountain" id="53"/>
<border align="inner" to="none" id="3"/>
<border align="outer" to="none" id="51"/>
<border align="outer" id="10"/>
<border align="inner" id="3"/>
<optional id="29"/>
</brush>
Substitua por esse:
<brush name="mountain" type="ground" server_lookid="918" z-order="9900">
<item id="919" chance="1"/>
<border align="inner" to="icy mountain" id="53"/>
<border align="inner" to="snowy mountain" id="53"/>
<border align="outer" to="none" id="29"/>
<border align="outer" id="29"/>
<optional id="29"/>
</brush>
Demonstração:
Antes sem editar
Depois com a edição
Simples.
Até logo!!!
-
FlamesAdmin recebeu reputação de spoockk em [OPEN-SOURCE] POKEMASTERX
modules/client/client.lua procure por
g_window.setTitle(g_app.getName()) e troque por
g_window.setTitle('NOME QUE APARECERÁ') e em modules/client_background/background.lua
clientVersionLabel:setText(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' .. 'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' .. 'Built on ' .. g_app.getBuildDate()) deixe assim
--clientVersionLabel:setText(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' .. --'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' .. --'Built on ' .. g_app.getBuildDate())
-
FlamesAdmin recebeu reputação de Kooask em [Resolvido] Trocar AURAS POKETIBIA
se vc quer um effect e o numero dele é 200, vc precisa colocar o effect 199. Sempre diminuindo 1
-
FlamesAdmin deu reputação a BlazerX em [OTC] Trainer Card
Trainer Card
Fala galera do Xtibia, vim trazer mais uma contribuição para a comunidade, é um módulo para otclient básico porém legal.
Como funciona?
O Trainer Card vai mostrar digamos algumas informações do seu personagem,
você pode adicionar mais informações a esse card, vai da criatividade de cada um deixar bem funcional.
Script do servidor:
Crique um arquivo na pasta do seu servidor em data/creaturescript/ e coloque o nome de trainercard.lua
Coloque a seguinte tag no arquivo do creaturescripts.xml:
<event type="extendedopcode" name="TrainerCard" event="script" value="trainercard.lua"/> Registre o evento no arquivo onLogin.lua onde se encontra na mesma pasta:
registerCreatureEvent(cid, "TrainerCard")
Módulo otClient:
Coloque o módulo na pasta do seu otClient em modules/
Para abrir o módulo pressione a tecla Ctrl+Shift+Q
Imagem do módulo:
A base que foi utilizada do servidor foi a DarkXPoke.
O meu módulo tem mais informações do que o da imagem, porém eu dei uma mexida,
o módulo que o Gengo me passou do Trainer Card que eu utilizo está em um nivel totalmente
diferente do apresentado nesse tutorial, eu só modifiquei para compartilhar com a galera.
Espero que tenham gostado e faça um bom proveito do módulo, use sua criatividade para fazer de um belo sistema funcional.
Créditos:
-
FlamesAdmin deu reputação a zipter98 em [Resolvido] [Pedido] Script Para Pda
Um amigo me pediu este sisteminha alguns dias atrás. Como poderá ver, é algo bem simples. Entretanto, ele pode conflitar com outras mudanças de outfit que o pokémon venha sofrer. Para evitar isso, você terá de fazer algumas mudanças adicionais, explicadas adiante.
Primeiramente, em algum arquivo da lib:
outfits_order = { --["nome_do_pokemon"] = {outfit1, outfit2, outfit3, ...}, } function doTradeOutfit(cid, index) if not isSummon(cid) then return true end local outfit = outfits_order[getCreatureName(cid)] if not outfit[index] then index = 1 end doSetCreatureOutfit(cid, {lookType = outfit[index]}, -1) addEvent(doTradeOutfit, 200, cid, index + 1) end As outfits devem ser configuradas na ordem em que serão trocadas. O resto dependerá de onde a função será chamada. Se a animação do pokémon começar logo após ele ter sido chamado da pokébola, então, em goback.lua (data/actions/scripts): Abaixo de: local pk = getCreatureSummons(cid)[1] if not isCreature(pk) then return true end Coloque: if outfits_order[getCreatureName(pk)] then doTradeOutfit(pk, 1) end Se formos seguir a lógica da gif demonstrada, a função deveria ser chamada após a mega evolução, o que dependeria de como o sistema usado por você foi escrito. Usando o meu, o processo seria o seguinte: Em pokemon moves.lua (data/lib), no código da spell Mega Evolution: Abaixo de: adjustStatus(newPoke, ball, true, false) coloque: if outfits_order[getCreatureName(newPoke)] then doTradeOutfit(newPoke, 1) end Caso os pokémons que façam parte do sistema de mudança constante de outfit possam ter sua looktype alterada de alguma maneira durante o jogo (por exemplo, um Mega Charizard X usando Outrage ou uma Rapidash usando Blue Flames), você deverá fazer algumas pequenas mudanças. Troque a função que passei anteriormente por essa: function doTradeOutfit(cid, index) if not isSummon(cid) then return true end local outfit = outfits_order[getCreatureName(cid)] if not getCreatureCondition(cid, CONDITION_OUTFIT) or isInArray(outfit, getCreatureOutfit(cid).lookType) then if not outfit[index] then index = 1 end doSetCreatureOutfit(cid, {lookType = outfit[index]}, -1) end addEvent(doTradeOutfit, 200, cid, index + 1) end Depois, no código de todos os possíveis fatores que possam mudar a outfit dos pokémons participantes do sistema, acima da linha responsável pela alteração na looktype: doSetCreatureOutfit(...) Coloque isso: if getCreatureCondition(cid, CONDITION_OUTFIT) then doRemoveCondition(cid, CONDITION_OUTFIT) end Sinceramente, acho que você só terá de fazer isso em pouquíssimos códigos.
Por gentileza, poste um feedback do sistema. Assim, saberei se devo ou não mover o tópico.
-
FlamesAdmin deu reputação a JulianoZN em [TFS 0.3.6] Campo de visão > Max view Tiles
Obs: ja tem tutoriais aqui no xtibia porem estão tendo problemas entao vamos lá
Antes de começar lembre-se esse codigo nao da de usar o old cliente depois
Oque Precisa ?
Source do Servidor e Source do OtClient
Source usada:
Para nao dar bug na hora de subir escada ou desce, aumente o máximo de tiles que poderá ser carregado
const.h
procure por #define NETWORKMESSAGE_MAXSIZE 15360 mude para #define NETWORKMESSAGE_MAXSIZE valor que voce quer <OBS isso e para a quantidade de pixel será possivel receber sem bugar> #define NETWORKMESSAGE_MAXSIZE 1000000000 --- Valor que coloquei no meu
protocalgame.cpp
procure por
bool ProtocolGame::canSee(uint16_t x, uint16_t y, uint16_t z) const { #ifdef __DEBUG__ if(z < 0 || z >= MAP_MAX_LAYERS) std::cout << "[Warning - ProtocolGame::canSee] Z-value is out of range!" << std::endl; #endif const Position& myPos = player->getPosition(); if(myPos.z <= 7) { //we are on ground level or above (7 -> 0), view is from 7 -> 0 if(z > 7) return false; } else if(myPos.z >= 8 && std::abs(myPos.z - z) > 2) //we are underground (8 -> 15), view is +/- 2 from the floor we stand on return false; //negative offset means that the action taken place is on a lower floor than ourself int32_t offsetz = myPos.z - z; return ((x >= myPos.x - 8 + offsetz) && (x <= myPos.x + 9 + offsetz) && (y >= myPos.y - 6 + offsetz) && (y <= myPos.y + 7 + offsetz)); }
Substitua por
bool ProtocolGame::canSee(uint16_t x, uint16_t y, uint16_t z) const { #ifdef __DEBUG__ if(z < 0 || z >= MAP_MAX_LAYERS) std::cout << "[Warning - ProtocolGame::canSee] Z-value is out of range!" << std::endl; #endif const Position& myPos = player->getPosition(); if(myPos.z <= 7) { //we are on ground level or above (7 -> 0), view is from 7 -> 0 if(z > 7) return false; } else if(myPos.z >= 8 && std::abs(myPos.z - z) > 2) //we are underground (8 -> 15), view is +/- 2 from the floor we stand on return false; //negative offset means that the action taken place is on a lower floor than ourself int32_t offsetz = myPos.z - z; return ((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)); }
procure por
if(newPos.z > oldPos.z) MoveDownCreature(msg, creature, newPos, oldPos, oldStackpos); else if(newPos.z < oldPos.z) MoveUpCreature(msg, creature, newPos, oldPos, oldStackpos); if(oldPos.y > newPos.y) // north, for old x { msg->AddByte(0x65); GetMapDescription(oldPos.x - 8, newPos.y - 6, newPos.z, 18, 1, msg); } else if(oldPos.y < newPos.y) // south, for old x { msg->AddByte(0x67); GetMapDescription(oldPos.x - 8, newPos.y + 7, newPos.z, 18, 1, msg); } if(oldPos.x < newPos.x) // east, [with new y] { msg->AddByte(0x66); GetMapDescription(newPos.x + 9, newPos.y - 6, newPos.z, 1, 14, msg); } else if(oldPos.x > newPos.x) // west, [with new y] { msg->AddByte(0x68); GetMapDescription(newPos.x - 8, newPos.y - 6, newPos.z, 1, 14, msg); } } } } Substitua por
if(newPos.z > oldPos.z) MoveDownCreature(msg, creature, newPos, oldPos, oldStackpos); else if(newPos.z < oldPos.z) MoveUpCreature(msg, creature, newPos, oldPos, oldStackpos); if (oldPos.y > newPos.y) { // north, for old x msg->AddByte(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->AddByte(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->AddByte(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->AddByte(0x68); GetMapDescription(newPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } } } }
Procure por
////////////// Add common messages void ProtocolGame::AddMapDescription(NetworkMessage_ptr msg, const Position& pos) { msg->AddByte(0x64); msg->AddPosition(player->getPosition()); GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg); }
Substitua por
////////////// Add common messages void ProtocolGame::AddMapDescription(NetworkMessage_ptr msg, const Position& pos) { msg->AddByte(0x64); msg->AddPosition(player->getPosition()); GetMapDescription(pos.x - Map::maxClientViewportX, pos.y - Map::maxClientViewportY, pos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, msg); }
Procure por
void ProtocolGame::MoveUpCreature(NetworkMessage_ptr msg, const Creature* creature, const Position& newPos, const Position& oldPos, uint32_t oldStackpos) { if(creature != player) return; msg->AddByte(0xBE); //floor change up if(newPos.z == 7) //going to surface { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 5, 18, 14, 3, skip); //(floor 7 and 6 already set) 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); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } else if(newPos.z > 7) //underground, going one floor up (still underground) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, oldPos.z - 3, 18, 14, 3, skip); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } //moving up a floor up makes us out of sync //west msg->AddByte(0x68); GetMapDescription(oldPos.x - 8, oldPos.y + 1 - 6, newPos.z, 1, 14, msg); //north msg->AddByte(0x65); GetMapDescription(oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 1, msg); }
Substitua por
void ProtocolGame::MoveUpCreature(NetworkMessage_ptr msg, const Creature* creature, const Position& newPos, const Position& oldPos, uint32_t oldStackpos) { if(creature != player) return; msg->AddByte(0xBE); //floor change up if(newPos.z == 7) //going to surface { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 5, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); //(floor 7 and 6 already set) 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); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } else if(newPos.z > 7) //underground, going one floor up (still underground) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, oldPos.z - 3, (Map::maxClientViewportX+1), (Map::maxClientViewportY+1)*2, 3, skip); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } //moving up a floor up makes us out of sync //west msg->AddByte(0x68); GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); //north msg->AddByte(0x65); GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } Procure por
void ProtocolGame::MoveDownCreature(NetworkMessage_ptr msg, const Creature* creature, const Position& newPos, const Position& oldPos, uint32_t oldStackpos) { if(creature != player) return; msg->AddByte(0xBF); //floor change down if(newPos.z == 8) //going from surface to underground { int32_t skip = -1; 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); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } else if(newPos.z > oldPos.z && newPos.z > 8 && newPos.z < 14) //going further down { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } //moving down a floor makes us out of sync //east msg->AddByte(0x66); GetMapDescription(oldPos.x + 9, oldPos.y - 1 - 6, newPos.z, 1, 14, msg); //south msg->AddByte(0x67); GetMapDescription(oldPos.x - 8, oldPos.y + 7, newPos.z, 18, 1, msg); } Substitua por
void ProtocolGame::MoveDownCreature(NetworkMessage_ptr msg, const Creature* creature, const Position& newPos, const Position& oldPos, uint32_t oldStackpos) { if(creature != player) return; msg->AddByte(0xBF); //floor change down if(newPos.z == 8) //going from surface to underground { int32_t skip = -1; 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); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } else if(newPos.z > oldPos.z && newPos.z > 8 && newPos.z < 14) //going further down { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip); if(skip >= 0) { msg->AddByte(skip); msg->AddByte(0xFF); } } //moving down a floor makes us out of sync //east msg->AddByte(0x66); GetMapDescription(oldPos.x + Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); //south msg->AddByte(0x67); GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y + Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); }
Agora no Map.h
Procure por
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;
Substitua por
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 = 8;
Agora no map.cpp do Otclient
Procure por
void Map::resetAwareRange() { AwareRange range; range.left = 8; range.top = 6; range.bottom = 7; range.right = 9; setAwareRange(range); } Substitua por
{ AwareRange range; range.left = 15; //Change this to = maxClientViewportX range.top = 15; //Change this to = maxClientViewportY range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); } ou por { AwareRange range; range.left = 14; //Change this to = maxClientViewportX range.top = 8; //Change this to = maxClientViewportY range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); }
-
FlamesAdmin deu reputação a Gengo em [OtClient] Mensagem Personalizada
Hoje venho trazer um sistema que pode deixar seu servidor com um diferencial dos demais, espero que vocês possam aprender algo com esse sistema e criar outros tipos de personalização nas mensagens.
O que seria essa personalização?
Seria uma personalização da mensagem do broadcast, em vez de ficar aquela mensagem vermelha no meio da tela, você pode escolher sua própria cor para a mensagem, no fim do tópico demonstrarei com imagens para que você possa entender melhor.
Script:
Procure pela pasta no seu otclient em modules/game_textmessage e abra o arquivo textmessage.otui e substitua por esse:
Agora na mesma pasta abra o arquivo textmessage.lua e procure pela função displayMessage e debaixo de:
if msgtype == MessageSettings.none then return end Coloque o seguinte script:
Feito essas alterações a personalização já deve estar funcionando, para testar você pode utilizar o seguinte comando:
/bc green | O torneio mundial da Elite Four se iniciará em 15min. → Onde /bc é o comando broadcast
→ green é a cor que deseja personalizar, pode ser tanto em hexa como o nome da cor
→ mensagem qualquer
→ É necessário colocar o pipeline | caso queira colocar uma outra cor, senão ele assumirá como padrão a cor vermelha do broadcast.
Caso você não tenha o script do broadcast, porem é impossivel não ter já que é padrão nos servidores, vou deixar disponível aqui:
Imagens de como fica in-game:
Eai, vai ficar de fora?
Implemente já essa personalização e torne-se um servidor diferenciado dos demais.
-
FlamesAdmin deu reputação a BlazerX em Security House [OtPokemon]
Security House
Fala galera do Xtibia, como minha primeira de muitas contribuições, hoje venho trazer para vocês um sistema bem bacana visto no otPokemon.
Como funciona?
Basicamente o script não deixa que outras pessoas invitado nas houses pegue seus itens,
somente o dono ou alguém invitado com aleta som pode pegar os itens da house.
Script:
Coloque na posta do seu servidor em data/creaturescript/ e coloque o nome securityHouse.lua
Coloque a seguinte tag no arquivo do creaturescripts.xml:
<event type="moveitem" name="securityHouse" event="script" value="player/securityHouse.lua"/>
Registre o evento no arquivo onLogin.lua onde se encontra na mesma pasta:
registerCreatureEvent(cid, "securityHouse")
É só isso mesmo, espero que a comunidade goste, pois estarei trazendo muito mais scripts.
Observações:
Caso haja algum erro na execução do script ou você esteja tendo problemas, só darei suporte aqueles que deixaram seu rep+
-
FlamesAdmin recebeu reputação de Rik C em Alguem tem gift desas spell da pxg
Synchronoise = O poke faz uma cópia do proprio e o original fica invisivel. Codigo abaixo tem a mesma funçao
elseif spell == "Substitute" then function sendEff(cid, master, t) if isCreature(cid) and isCreature(master) and t > 0 and #getCreatureSummons(master) >= 2 then doSendMagicEffect(getThingPos(cid), 86, master) addEvent(sendEff, 1000, cid, master, t - 1) end end if not isSummon(cid) then return true end doSummonMonster(getCreatureMaster(cid), getCreatureName(cid)) local substitute = getCreatureSummons(getCreatureMaster(cid))[2] doCreatureSetLookDir(substitute, getCreatureLookDir(cid)) adjustStatus(substitute, getPlayerSlotItem(getCreatureMaster(cid), 8).uid, true, true, true) setPlayerStorageValue(cid, 9658783, 1) doDisapear(cid) sendEff(cid, getCreatureMaster(cid), 6) addEvent(function() if not isCreature(cid) then return true end doAppear(cid) setPlayerStorageValue(cid, 9658783, -1) if isCreature(substitute) then doRemoveCreature(substitute) end end, 6000) Electro Web = Faz com que o target fique tomando pequeno dano em determinado tempo com stun/paralyze. ex: em 5 segundos ele ira receber 3x dano entre o tempo (1seg dano, 3seg dano e 5seg dano)
elseif spell == "Electroweb" then local config = { times = 6, --Quantos ataques. interval = 1000, --Intervalo entre ataques. stunTime = 1, --Duraçăo do stun. distEffect = 37, --Distance effect. effect = 207, --Effect. stunEffect = 207 --Efeito do stun. } local function Electroweb(cid, times) if not isCreature(cid) or not isCreature(target) or times <= 0 then return true end local ret = {} ret.id = target ret.cd = config.stunTime ret.check = getPlayerStorageValue(target, conds["Stun"]) ret.eff = config.stunEffect ret.spell = spell ret.cond = "Stun" doSendDistanceShoot(getThingPos(cid), getThingPos(target), config.distEffect) doSendMagicEffect(getThingPos(target), config.effect) doMoveDano2(cid, target, ELECTRICDAMAGE, min, max, ret, spell) addEvent(Electroweb, config.interval, cid, times - 1) end Electroweb(cid, config.times) Rock Wrecker =
elseif spell == "Rock Wrecker" then local p = getThingPosWithDebug(cid) p.x = p.x+1 p.y = p.y+1 sendEffWithProtect(cid, p, 151) --send eff local function doDano(cid) local pos = getThingPosWithDebug(cid) local function doSendBubble(cid, pos) if not isCreature(cid) then return true end doSendDistanceShoot(getThingPosWithDebug(cid), pos, 39) doSendMagicEffect(pos, 239) end --alterado!! for a = 1, 20 do local r1 = math.random(-4, 4) local r2 = r1 == 0 and choose(-3, -2, -1, 2, 3) or math.random(-3, 3) -- local lugar = {x = pos.x + r1, y = pos.y + r2, z = pos.z} addEvent(doSendBubble, a * 25, cid, lugar) end addEvent(doDanoWithProtect, 150, cid, ROCKDAMAGE, pos, waterarea, -min, -max, 0) end addEvent(doDano, 1250, cid)
-
FlamesAdmin recebeu reputação de Strogman em Alguem tem gift desas spell da pxg
Synchronoise = O poke faz uma cópia do proprio e o original fica invisivel. Codigo abaixo tem a mesma funçao
elseif spell == "Substitute" then function sendEff(cid, master, t) if isCreature(cid) and isCreature(master) and t > 0 and #getCreatureSummons(master) >= 2 then doSendMagicEffect(getThingPos(cid), 86, master) addEvent(sendEff, 1000, cid, master, t - 1) end end if not isSummon(cid) then return true end doSummonMonster(getCreatureMaster(cid), getCreatureName(cid)) local substitute = getCreatureSummons(getCreatureMaster(cid))[2] doCreatureSetLookDir(substitute, getCreatureLookDir(cid)) adjustStatus(substitute, getPlayerSlotItem(getCreatureMaster(cid), 8).uid, true, true, true) setPlayerStorageValue(cid, 9658783, 1) doDisapear(cid) sendEff(cid, getCreatureMaster(cid), 6) addEvent(function() if not isCreature(cid) then return true end doAppear(cid) setPlayerStorageValue(cid, 9658783, -1) if isCreature(substitute) then doRemoveCreature(substitute) end end, 6000) Electro Web = Faz com que o target fique tomando pequeno dano em determinado tempo com stun/paralyze. ex: em 5 segundos ele ira receber 3x dano entre o tempo (1seg dano, 3seg dano e 5seg dano)
elseif spell == "Electroweb" then local config = { times = 6, --Quantos ataques. interval = 1000, --Intervalo entre ataques. stunTime = 1, --Duraçăo do stun. distEffect = 37, --Distance effect. effect = 207, --Effect. stunEffect = 207 --Efeito do stun. } local function Electroweb(cid, times) if not isCreature(cid) or not isCreature(target) or times <= 0 then return true end local ret = {} ret.id = target ret.cd = config.stunTime ret.check = getPlayerStorageValue(target, conds["Stun"]) ret.eff = config.stunEffect ret.spell = spell ret.cond = "Stun" doSendDistanceShoot(getThingPos(cid), getThingPos(target), config.distEffect) doSendMagicEffect(getThingPos(target), config.effect) doMoveDano2(cid, target, ELECTRICDAMAGE, min, max, ret, spell) addEvent(Electroweb, config.interval, cid, times - 1) end Electroweb(cid, config.times) Rock Wrecker =
elseif spell == "Rock Wrecker" then local p = getThingPosWithDebug(cid) p.x = p.x+1 p.y = p.y+1 sendEffWithProtect(cid, p, 151) --send eff local function doDano(cid) local pos = getThingPosWithDebug(cid) local function doSendBubble(cid, pos) if not isCreature(cid) then return true end doSendDistanceShoot(getThingPosWithDebug(cid), pos, 39) doSendMagicEffect(pos, 239) end --alterado!! for a = 1, 20 do local r1 = math.random(-4, 4) local r2 = r1 == 0 and choose(-3, -2, -1, 2, 3) or math.random(-3, 3) -- local lugar = {x = pos.x + r1, y = pos.y + r2, z = pos.z} addEvent(doSendBubble, a * 25, cid, lugar) end addEvent(doDanoWithProtect, 150, cid, ROCKDAMAGE, pos, waterarea, -min, -max, 0) end addEvent(doDano, 1250, cid)
-
-
FlamesAdmin recebeu reputação de VictorWEBMaster em [OPEN-SOURCE] POKEMASTERX
usa o 1.7.3 ou 1.7.4 @Kevin Vittar
-
FlamesAdmin recebeu reputação de mister17 em Preciso de um script de uma porta TIME e bau time
tem esse sistema na base do masterx
-
FlamesAdmin deu reputação a Kuro o Shiniga em [NPC] Walk Hunt - Npc Caminha ate a hunt.
O NPC caminha junto com o player ate a hunt.
Esse sistema é bem SIMPLES, um amigo me pediu, desenvolvi para ele e vim compartilhar com vocês
Crie um arquivo lua em npcs e adicione :
local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local possnpc = { --- poss que o npc vai andar {x=81 ,y=339, z=7}, {x=82 ,y=339, z=7}, {x=83 ,y=339, z=7}, {x=84 ,y=339, z=7}, {x=85 ,y=339, z=7}, {x=86 ,y=339, z=7}, {x=79, y=340, z=7} } local possplayer = { -- poss que o player vai andar {x=81 ,y=339, z=7}, {x=82 ,y=339, z=7}, {x=83 ,y=339, z=7}, {x=84 ,y=339, z=7}, {x=85 ,y=339, z=7}, {x=86 ,y=339, z=7} } local pid = getNpcId() -- não mexa local config = { -- não mexa str = 150729, tempo = 30, } function andarnpc() for i, pos in ipairs(possnpc) do addEvent(doTeleportThing, 1000+400*(i-1), pid, pos) end end function andarplayer(cid) for i, posdois in ipairs(possplayer) do if isCreature(cid) then addEvent(doTeleportThing, 1000+500*(i-1), cid, posdois) end end end for _, player in pairs(getPlayersOnline()) do if msgcontains(msg, "hunt") and getPlayerStorageValue(player, config.str) >= os.time() then selfSay("Não posso atender você agora!", cid) break end if msgcontains(msg, "hunt") and getPlayerStorageValue(player, config.str) < os.time() then setPlayerStorageValue(cid, config.str, os.time() + config.tempo) selfSay("Vou te levar ate a caverna misteriosa !", cid) andarnpc() andarplayer(cid) break end end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
Configuração :
Aqui é aonde o npc vai andar, são as mesma poss que o player vai andar, porem você tem que por uma ultima poss para o npc, nessa ultima poss você coloca a posição aonde o npc estava antes do jogador falar com ele !
local possnpc = { --- poss que o npc vai andar {x=81 ,y=339, z=7}, {x=82 ,y=339, z=7}, {x=83 ,y=339, z=7}, {x=84 ,y=339, z=7}, {x=85 ,y=339, z=7}, {x=86 ,y=339, z=7}, {x=79, y=340, z=7} } Essa é a poss do inicio, aonde o npc vai aparecer quando ele levar o jogador, não esqueca de colocar a posição correta, se não o npc vai ficar dentro da hunt com o player, e outros players não vão conseguir encontrar o npc.
{x=79, y=340, z=7} -- poss aonde o npc tava antes de levar o player para a hunt OBS: Existe um tempo para poder falar com o NPC, caso o npc esteja levando algum player para a hunt, outro jogador não pode conversar com ele, ate que ele complete a caminhada, caso queira mudar o tempo edite aqui :
tempo = 30, -- 30 = 30 segundos
-
FlamesAdmin deu reputação a Kuro o Shiniga em [SIMPLE] Battle Dungeon - Player X Monster
Sistema SIMPLES de Dungeon, o player entra no teleport e é criado alguns monstros para o jogador matar dentro de um tempo de 30 segundos, se ele matar todos os monstro no tempo ele recebe a recompensa em Exp e Gold, se ele não matar todos ele volta para o templo e da a chance de outro jogador entrar na Dungeon.
Testado: Snowz Thyranic 3.1 [Especial Edition] (8.6)
Em movements crie um arquivo do teleport da dungeon e adicione:
function onStepIn(cid, item, position, fromPosition) local config = { posdung = {x=317, y=120, z=7}, -- poss da arena str = 15281, -- não mexer storage = 98551, -- não mexer tempo = 30, tempoarena = 30000, -- tempo que ele tem para terminar a arena 30000 = 30s monsterum = "Dragon" -- primeiro monstro que vai ser criado quando o player entrar na arena } local posstemplo = {x=63, y=42, z=7} function Tp() if isCreature(cid) then doTeleportThing(cid, posstemplo) end return true end function Str() if isCreature(cid) then setPlayerStorageValue(cid,config.storage, 0) end return true end function deletamonstro() local spec = getSpectators(config.posdung, 10, 10) if spec ~= nil then for _, s in pairs(spec) do if isMonster(s) then doRemoveCreature(s) end end end end for _, player in pairs(getPlayersOnline()) do if getPlayerStorageValue(player, config.str) >= os.time() then doTeleportThing(player, fromPosition) doPlayerSendTextMessage(cid, 22, "Já existe player em batalha!") elseif getPlayerStorageValue(player, config.str) < os.time() then setPlayerStorageValue(cid, config.str, os.time() + config.tempo) doTeleportThing(cid, config.posdung) doSendMagicEffect(getThingPos(cid), 10) doCreateMonster(config.monsterum, getThingPos(cid)) addEvent(Tp, config.tempoarena) addEvent(Str, config.tempoarena) addEvent(deletamonstro, config.tempoarena) break end end end <movevent type="StepIn" actionid="2569" event="script" value="arquivo.lua"/> CreatureScripts crie um arquivo lua e adicione :
local monster = { --- tabela de monstro, se quiser adicionar mais e so adicionar na tabela [1] = "Dragon", [2] = "Dragon Lord", [3] = "Hydra", [4] = "Demon", } local config = { posstemplo = {x=63, y=42, z=7}, -- poss aonde o player vai ser enviado quando terminar ou se falhar storage = 98551, -- não mexa premioexp = 800000, -- tanto de exp que o player vai ganhar quant = 1000000, --- quantidade de dinheiro que vai ganhar } function onDeath(cid, corpse, deathList, target) local storage_value = getPlayerStorageValue(deathList[1], config.storage) < 1 and 1 or getPlayerStorageValue(deathList[1], config.storage) local new_value = storage_value + 1 if getCreatureName(cid) == monster[storage_value] then setPlayerStorageValue(deathList[1], config.storage, new_value) doSendMagicEffect(getPlayerPosition(deathList[1]), 12) doCreatureSay(cid, 'Fight', TALKTYPE_MONSTER) if new_value > #monster then doPlayerSendTextMessage(deathList[1], 22, "Completa!") doPlayerAddMoney(deathList[1], config.quant) doPlayerAddExp(deathList[1], config.premioexp) doTeleportThing(deathList[1], config.posstemplo) doSendMagicEffect(getThingPos(cid), 10) else doCreateMonster(monster[new_value], getThingPos(cid)) end end end <event type="death" name="dungeon" event="script" value="arquivo.lua"/> Adicione dentro do arquivo de cada monstro que vai ter na dungeon :
<script> <event name="dungeon"/> </script>
Configurando :
Em movements você adiciona a poss da dungeon
posdung = {x=317, y=120, z=7}, -- poss da arena Aqui você adiciona o primeiro monstro da dungeon
monsterum = "Dragon" -- primeiro monstro que vai ser criado quando o player entrar na arena Em creaturescript você adiciona a poss do templo aonde o player vai aparecer quando finalizar a dungeon
posstemplo = {x=63, y=42, z=7}, -- poss aonde o player vai ser enviado quando terminar E aqui os monstros que vai ter na dungeon
local monster = { --- tabela de monstro, se quiser adicionar mais e so adicionar na tabela [1] = "Dragon", [2] = "Dragon Lord", [3] = "Hydra", [4] = "Demon", } Dentro da sala da dungeon coloque ANT-LOGOUT pelo mapa editor, para evitar de jogadores fazer logout dentro da dungeon.
-
FlamesAdmin deu reputação a Tony Araujo em [ACTION] Auto Loot - Coletando ao abrir corpo
Eai galera do Eks, tudo bão? Quanto tempo que eu não venho por esses lados, saudades xD
Bom, sem muita enrolação, eu vim postar pra vocês o sistema de auto loot que eu fiz aqui rapidinho (literalmente, 10 mins), porém que ficou bem bacana. É aquele esquema, você coleta o loot quando abre o corpo do bicho morto. Está bem simples, porém funcional. Eu pesquisei a respeito, pra ter uma ideia e não encontrei nenhum que tivesse com um código legal, todos estavam bem antigos.
Eu não tive muito tempo testando, então caso encontrem qualquer bug, me avise pfv.
function onUse(cid, item, fromPosition, itemEx, toPosition) if getItemAttribute(item.uid, "corpseowner") ~= cid then return doPlayerSendCancel(cid, "You're not the owner.") end local items = {} for i = 0, getContainerSize(item.uid) do local it = getContainerItem(item.uid, i) if it.uid > 0 then table.insert(items, {it.itemid, it.type}) doRemoveItem(it.uid) end end if #items > 0 then for k = 1, #items do local playerItem = getPlayerItemById(cid, true, items[k][1]) if playerItem.uid > 0 then if (playerItem.type + items[k][2]) > 100 then doPlayerAddItem(cid, items[k][1], (playerItem.type + items[k][2]) - 100) doTransformItem(playerItem.uid, items[k][1], 100) else doTransformItem(playerItem.uid, items[k][1], playerItem.type + items[k][2]) end else doPlayerAddItem(cid, items[k][1], items[k][2]) end end return true end return false end
-
FlamesAdmin deu reputação a JG6 em OTCLIENT 0.6.5++
Todas as versões estão no fórum só dar uma olhada na área clientes.
-
FlamesAdmin recebeu reputação de Vini Original em CP Cinnabar & Cidade Hamlin PxG
Eae galera, to passando aki rapidin pra postar esse mapa que achei no pc que eu fiz do PxG.
Prints:
Download:
http://www.4shared.com/rar/l3jDJmEo/Cp_CinnabarCidade_Hamlin.html
OBS: Em Hamlin é só a Cidade, nao tem as hunts. Bom uso do mapa. Boa noite xD. -
FlamesAdmin recebeu reputação de Shiroe em [Pokémon Mapa] Frontier Access e Violet City
Versao 1
Versão 2
Eae galerinha, vim trazer para vcs a Versão 2 do meu map ai que postei recentemente...
Mapa baseado no "Frontier Access e em Violet City"
Download Aqui.
Scan:
http://tinypic.com/r/302s700/6
Prints: Obs: eu postei essas imagens no meu face, nao tem com que se preucuparem.
Eu esqueci de apertar 'S' para tirar os Respaw...
Comentem ai...
Aé, ja ia me esquecendo, os Creditos de alguns npcs:
Em breve postarei outras atualizaçoes...
Proxima Versao:
-
FlamesAdmin recebeu reputação de Shiroe em CP Cinnabar & Cidade Hamlin PxG
Eae galera, to passando aki rapidin pra postar esse mapa que achei no pc que eu fiz do PxG.
Prints:
Download:
http://www.4shared.com/rar/l3jDJmEo/Cp_CinnabarCidade_Hamlin.html
OBS: Em Hamlin é só a Cidade, nao tem as hunts. Bom uso do mapa. Boa noite xD. -
FlamesAdmin recebeu reputação de Belzebu6 em Sprite e Dat GTA Quilante, TWD & Harry Potter Quilante
Eae galera do XTibia, trago aqui pra vcs fãs de GTA Tibia, The Walking Dead e Harry Potter Tibia, a .Spr e .Dat do GTA Tibia Quilante, The Walking Dead Tibia Quilante e Harry Potter Tibia Quilante recentes.
Lembrando que é versao 8.6. Eu msm rippei as sprites do client com Tibia Unbinder.
Créditos:
Equipe Quilante pelas Sprites
A mim, por rippar ( sla como fala ) as sprites do client.
Tenha bom uso xD.
-
FlamesAdmin deu reputação a Benny em [OTClient] Cor no nome por tag (ADM;GM;HELP)
PREVIEW:
CÓDIGO:
Abra o creature.cpp da source do seu otclient e procure por:
void Creature::setHealthPercent(uint8 healthPercent) Substitua tudo por:
void Creature::setHealthPercent(uint8 healthPercent) { if(m_name.find("[ADM]")!=std::string::npos) m_informationColor = Color(0x00, 0x2a, 0xff); else if(m_name.find("[GM]")!=std::string::npos) m_informationColor = Color(0x00, 0xff, 0x0c); else if(m_name.find("[HELP]")!=std::string::npos) m_informationColor = Color(0xff, 0x00, 0x00); else if(healthPercent > 92) m_informationColor = Color(0x00, 0xBC, 0x00); else if(healthPercent > 60) m_informationColor = Color(0x50, 0xA1, 0x50); else if(healthPercent > 30) m_informationColor = Color(0xA1, 0xA1, 0x00); else if(healthPercent > 8) m_informationColor = Color(0xBF, 0x0A, 0x0A); else if(healthPercent > 3) m_informationColor = Color(0x91, 0x0F, 0x0F); else m_informationColor = Color(0x85, 0x0C, 0x0C); m_healthPercent = healthPercent; callLuaField("onHealthPercentChange", healthPercent); if(healthPercent <= 0) onDeath(); } Explicação:
[ADM] é a tag (Qualquer personagem que tenha [ADM] no nome)
Color(0x00, 0x2a, 0xff) é a cor. No caso, você tem que usar cores RGB Hexadecimais, pode encontrar uma tabela AQUI e completar com 0x.
Exemplo:
A cor amarela tem como código: #FFFF00
Ficaria assim: Color(0xFF, 0xFF, 0x00)
Qualquer dúvida, à disposição!
Créditos: @Refe
Abração!!
-
FlamesAdmin deu reputação a LeoTK em [Proteção Cab] Proteção cab para todas as versões
Olá a todos. Bom eu percebi que tem algumas pessoas levando vantagem em cima de um programa gratuito disponível na internet, então resolvi postar ele para todos usarem gratuitamente é um programa que além de criar a pasta cab muda a file name/mask do aplicativo, assim fazendo com que ele necessite abrir o data.cab criado por você trazendo enfim a proteção.cab para os clientes de hoje, o problema que existe nele é que ele coloca diversos falsos positivos no cliente fazendo com que qualquer anti-virus detecte o cliente do servidor como uma ameaça assim excluindo do computador e consequentemente faz com que o servidor perca jogadores, mas já que tem pessoas levando vantagem sobre esse programa gratuito na internet e cobrando horrores para passar esse programa e um tutorial de como fazer isso eu vou disponibilizar aqui para uso gratuito de todos.
O Nome do programa em questão é
Enigma Virtual Box
Link para acessar o site oficial para baixar o programa
https://enigmaprotector.com/en/downloads.html
Bom agora irei mostrar como fazer o procedimento com um vídeo
obs: estarei usando uma versão inferior mas o procedimento é o mesmo
Após esse processo o cliente fica dessa forma
Scan do cliente
https://www.virustotal.com/#/file/c560af8310c672d88f20649178036220cc20b00e074959e9a14975727a8ec936/detection
Scan da data.cab
https://www.virustotal.com/#/file/2a43b080250ff3e02a1d3d5409f765e70cd4385bca748bae1f0b4b35bbd9e00b/detection
Bom é isso pessoal o intuito é acabar com essa cilada
Aproveito para falar sim que existe programadores que realmente criam programas próprios e realmente cria uma boa proteção mas não é o que esta acontecendo aqui ultimamente então o intuito e acabar com essas pessoas que estão se aproveitando desse programa para querer enganar falando que a proteção foi criada por eles etc... sendo que é um programa gratuito e disponível na internet
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.