Bom, uma dúvida muito frequente com quem cria um server com monstros editado é: "Como eu mudo a aparência deles?". É bem simples naverdade, você só precisa saber os conceitos básicos. Se você já criou o seu monstro, só leia o tutorial abaixo, agora se você quer saber como se cria um monstro novo, procure tutoriais pelo XTibia. Vamos lá:
➨ Tio, o que é newtype?
Bom caro gafanhoto, as várias imagens, que em sequência formam o movimento de qualquer coisa em um jogo, são chamadas de sprites. E a junção das sprites, formam um newtype no Tibia. São por exemplo, a Sprite de um rat andando para a esquerda, de um rat andando para a direita, para baixo, pra cima e dele parado, essas sprites juntas, formam o newtype do rat. Cada newtype, é classificado no Tibia por números pra cada uma, pra facilitar a configuração.
➨ Tio, como se edita um newtype?
Newtypes não podem ser editados. As outfits são excessão, pois dentro do jogo, você pode mudar as cores delas, mas somente porque as sprites te permitem isso, para alterar um newtype, você deve alterar a sprite o que já foge para a parte de design. Existem outros poucos newtypes de monstros que se pode mudar as cores. Como Dwarf, Elf, ArchDemon, Barbarians, Frog e assim vai...
➨ Tio, onde eu vejo qual número corresponde a qual newtype?
Bom existem várias listas por aí, principalmente no XTibia e como não quero ser processado acusado de roubar trabalho de alguém, eu recomendarei o tópico do usuário MatheusMkalo.
➨ Lista de Newtypes:
Lembrete: Você já deve ter reparado, que a cada atualização do Tibia, surgem novos bixos com sprites novas. É porque o client é atualizado, ou seja, é modificado e nessa modificação, são adicionados as novas sprites. Por isso só se pode colocar sprites correspondentes a versão, uma sprite adicionada no 8.6 por exemplo, não pode ser colocada em um monstro num servidor 8.57. Essa lista se limita com os newtypes até o 8.6, os newtypes adicionados depois disso não estão nessa lista.
➨ Tio, agora eu sei os newtypes mais como edito a aparência dos monstros?
Bom se você ainda não criou o monstro, crie um arquivo com a extensão lua dentro da pasta monsters, ou copie um que já existe. Nomeie do nome o qual você quer para o monstro em seguida abra-o. Lembre-se também de colar sua tag no Monsters.xml (existem tutoriais sobre isso aqui no XTibia).
Veja que logo no começo do arquivo do monstro tem isso:
Iremos nos concentrar nessa parte:
Coloque onde está "130" o número do newtype desejado.
Aqui são onde se edita as cores, no caso de ser um newtype Outfit, cada cor da tabela de outfit também se corresponde a um número. Então coloque o número da cor entre as aspas sendo:
Head - Cor da cabeça
Body - Cor Primária
Legs - Cor Secundária
Feet - Cor dos pés
Aqui, caso tenha escolhido um newtype de uma outfit, é onde você botará a quantidade de addons. 0 equivale a nenhum, 1 equivale ao primeiro, 2 equivale ao segundo e 3 equivale aos dois juntos.
Aqui você põe o ID do corpo desejado para o seu monstro. Não tenho lista disso, mais procure em listas de ID pelo XTibia ou de look no corpo de um monstro similar com um char GOD.
➨ Tio onde eu vejo os números das cores?
É, as cores também são divididas em números, e para ver qual cor corresponde a qual número, existe a seguinte lista, também disponibilzada ao XTibia pelo MatheusMkalo.
Usa esse:
http://www.xtibia.com/forum/topic/177761-um-pet-system-diferente/page__fromsearch__1
Adiciona os storages e nomes como vc quiser e apenas troca o arquivo petsystem.lua por esse, o resto faz conforme esta la:
local petNames = {"RAT","DRAGON","DEMON"}
local petStorage = {
["RAT"] = 203105, -- storage do pet 1
["DRAGON"] = 203106, -- storage do pet 2
["DEMON"] = 203107 -- storage do pet 3
}
local textSay = {"Sim", "Nao", "Talves", "Nao intendi vc poderia repetir?"}
function onSay(cid, words, param, channel)
local summons = getCreatureSummons(cid)
if param == "" then
local text = "Você não possui pets!"
local o = 0
for i=1, #petNames do
if getPlayerStorageValue(cid, petStorage[petNames[i]]) > 0 then
o = o + 1
if o == 1 then
text = o.." - ".. string.lower(petNames[i]) .."\n"
else
text = text.. o .." - ".. string.lower(petNames[i]) .."\n"
end
end
end
doShowTextDialog(cid,8977,text)
return true
end
if param == "back" then
for k = 1, #summons do
pet = getCreatureName(summons[k])
doCreatureSay(cid, string.lower(pet) ..", back!", 1)
doRemoveCreature(summons[k])
setPlayerStorageValue(cid, petStorage[pet], 1)
end
return true
end
local t = string.explode(param, ",")
if t[1] == "say" then
if #summons > 0 then
doCreatureSay(summons[1], t[2], 1)
else
doPlayerSendCancel(cid,"Você possui Pet sumonado.")
end
return true
end
if t[1] == "conversa" then
if #summons > 0 then
doCreatureSay(summons[1], textSay[math.random(1,#textSay)], 1)
else
doPlayerSendCancel(cid,"Você possui Pet sumonado.")
return true
end
end
param = string.upper(param)
if isInArray(petNames, param) then
if getPlayerStorageValue(cid, petStorage[param]) == -1 then
doPlayerSendCancel(cid,"Você não possui esse Pet.")
return true
elseif getPlayerStorageValue(cid, petStorage[param]) == 1 then
if getTilePzInfo(getCreaturePosition(cid)) == false then
x = doSummonCreature(param, getCreaturePosition(cid))
doConvinceCreature(cid, x)
doCreatureSay(cid, string.lower(param) ..", go!", 1)
doSendMagicEffect(getThingPos(getCreatureSummons(cid)[1]), 2)
setPlayerStorageValue(cid, petStorage[param], 2)
else
doPlayerSendTextMessage(cid, 22, "Você não pode sumonar seu Pet em Pz.")
return true
end
elseif getPlayerStorageValue(cid, petStorage[param]) == 2 and #summons > 0 then
doPlayerSendTextMessage(cid, 22, "Seu Pet esta sumonado, fale !pet back.")
return true
else
doPlayerSendTextMessage(cid, 22, "Seu Pet esta morto, fale !petrevive nomedopet para revivelo.")
return true
end
else
doPlayerSendCancel(cid,"Esse Pet não existe.")
end
return true
end
Estou aqui hoje para trazer um sistema simples que eu criei, porém pode ser até muito útil, o Sistema de Reputação !
Esse sistema vai funcionar da seguinte forma, você adiciona os monstros que darão Rep+ ao morrer, e a cada monstro desse, o player que o matou conquista +1 ponto de Reputação. Exemplo de monstro que seria legal adicionar: Bosses.
Outro meio de ganhar Reputação com esse sistema será matando outros players que estejam pk.
E o único meio de perder Pontos de Reputação é matando players que não estejam pk.
O Sistema também vem com um rank de Reputação que sera adicionado nas talkactions e listara os tops Reputação e um comando para verificar seus pontos de reputação.
Para que Esse Sistema pode ser Útil:
Vamos pensar da seguinte maneira, pontos ao matar. Diminuirá o número de pk's in-game pois mais players vão querer mata-los. (REP +)
Pontos negativos ao matar players comuns, também contribuirá para diminuição de pk's. (REP -)
Pontos por matar bosses e outros monstros fortes, vai estimular os player's a matarem monstros mais perigosos. (REP +)
Esse Sistema pode ser útil também para que só players com certa quantidade de Rep+ possam:
-Entrar em lugares;
-Fazer quests;
-Usar magias;
-Usar outras talkactions;
-E várias outras coisas.
Primeiro vai em "data/creaturescripts/scripts/" duplica um arquivo dessa pasta e renomeia para "repsystem" sem as aspas, nele cole:
--<Script by jhon992>--
function onKill(cid, target, lastHit)
vetMonster = { "Demon", "Morgaroth", "Hydra", "Dragon" } -- adicionar monstros que darão rep+
-- Ao matar monstros do vetMonster, ganhara rep+.
for i=0, #vetMonster do
if (getCreatureName(target) == vetMonster[i]) then
setPlayerStorageValue(cid, 102086, getPlayerStorageValue(cid, 102086)+1)
doSendAnimatedText(getThingPos(cid), 'Rep+', 30)
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você ganhou 1 ponto de reputação por matar um "..vetMonster[i]..".")
return TRUE
end
end
-- Ao matar um pk, ganhara rep+.
if (isPlayer(target) == true) then
if (getCreatureSkullType(target) > 2) then
setPlayerStorageValue(cid, 102086, getPlayerStorageValue(cid, 102086)+1)
doSendAnimatedText(getThingPos(cid), 'Rep+', 30)
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você ganhou 1 ponto de reputação por matar "..getCreatureName(target)..".")
return TRUE
end
-- Ao matar um player normal, ganhara rep-.
setPlayerStorageValue(cid, 102086, getPlayerStorageValue(cid, 102086)-1)
doSendAnimatedText(getThingPos(cid), 'Rep-', 144)
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você perdeu 1 ponto de reputação por matar "..getCreatureName(target)..".")
return TRUE
end
return TRUE
end
Agora em "data/creaturescripts/creaturescripts.xml" cole a tag:
Entre na pasta "data/creaturescripts/scripts" novamente, e abra o arquivo "login.lua" sem as aspas. Nele cole a tag:
-- Verificar se é primeira vez que loga, pois ao usar storage ele ja começa com -1,
-- Então vamos zera-lo para que sua Reputação comece do 0.
if (getPlayerStorageValue(cid, 102087) ~= 1) then
setPlayerStorageValue(cid, 102087, 1)
setPlayerStorageValue(cid, 102086, 0)
end
registerCreatureEvent(cid, "RepSystem")
Terminamos a parte do Sistema e agora vamos para o talkaction de rank.
Vai na pasta "data/talkaction/scripts", duplique um arquivo e remomeie para "rankrep" sem as aspas. Abra-o e cole:
function getPlayerNameByGUID2(n)
local c = db.getResult("SELECT `name` FROM `players` WHERE `id` = "..n..";")
if c:getID() == -1 then
return "SQL_ERROR["..n.."]"
end
return c:getDataString("name")
end
function onSay(cid, words, param)
if (param == "") then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você possui "..getPlayerStorageValue(cid, 102086).." pontos de Reputação.")
return TRUE
end
if (param == "rank") then
local max = 50
local letters_to_next = 50
local name_now
local name = "Highscore for Reputação\n"
local rkn = 0
local no_break = 0
name = name.."\n"
name = name.."Rank. Pontos | Nome do Jogador\n"
local v = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = 102086 ORDER BY cast(value as INTEGER) DESC;")
local kk = 0
repeat
if kk == max or v:getID() == -1 then
break
end
kk = kk+1
name_now, l = getPlayerNameByGUID2(v:getDataInt("player_id")), string.len(getPlayerNameByGUID2(v:getDataInt("player_id")))
space = ""
for i=1, letters_to_next-l do
space = space.." "
end
if name_now == nil then
name_now = 'sql error['..v:getDataInt("player_id")..']'
end
name = name..kk..". "..v:getDataInt("value").." | "..name_now..space.." \n"
until v:next() == false
if name ~= "Highscore\n" then
doPlayerPopupFYI(cid, name)
end
return TRUE
else
doPlayerSendCancel(cid, "Command valid: !rep, !rep rank.")
return TRUE
end
end
E por último mais não menos importante, abra "data/talkactions/talkacitons.xml" e cole a tag:
Vai em data/actions/script, duplica um arquivo e nomeia para "repDoor" sem as aspas e nele cole:
function onUse(cid, item, frompos, item2, topos)
local quantRep = 30 -- quantidade de reset para entrar na porta
newnPosition = {x=784, y=805, z=7} -- onde será teleportado ao clicar na porta
if item.actionid == 2085 and getPlayerStorageValue(cid, 102086) >= quantRep then
doTeleportThing(cid, newnPosition)
doSendMagicEffect(newnPosition, 10)
else
doCreatureSay(cid, "Voce nao tem reputação suficiente para entrar!", TALKTYPE_ORANGE_1)
end
return TRUE
end
Agora em data/actions/actions.xml cole a tag:
<action actionid="2085" script="repDoor.lua"/>
E por último com seu mapa editor, vai na porta desejada do seu server e coloque o actionid 2085.
----- Quantidade de Reputação para usar determinado item -----
Vai em data/movements/script e duplica um arquivo dessa pasta e nomeie para "itemRep" sem aspas, abra-o e cole:
local quantRep = 30 -- quantidade de reset para usar determinado item
function onEquip(cid, item, slot)
if getPlayerStorageValue(cid, 102086) < quantRep then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players com "..quantRep.." pontos de reputação ou mais, podem usar essa arma!")
return FALSE
end
return TRUE
end
Agora vai em data/movements/movements.xml abre e adicione a tag:
<movevent type="Equip" itemid="id do seu item" slot="hand" event="script" value="itemRep.lua"/>
Troque os slots na tag acima como desejar, tipos de slots:
head
armor
legs
hand
shield
ring
necklace
feet
pickupable
Para itens que você for usar com a mesma quantidade de reps que o item anterior, apenas crie uma nova tag no movementes.xml com o itemid diferente. Senão você devera criar um novo script com o nome diferente e mudar a quantRep.
----- Comprar determinado item com Pontos de Reputação -----
Vai em data/talkactions/scripts, duplique um arquivo e nomeiei para "buyrep" sem as aspas e nele cole:
local itemNames = {
{name = "Dragon Shield", pontos = 2}, -- nome do item e pontos que gastara.
{name = "Crown Armor", pontos = 8},
{name = "Arbalest", pontos = 25},
{name = "Heroic Axe", pontos = 20},
{name = "Magic Sword", pontos = 30},
{name = "Demon Armor", pontos = 50}
}
function onSay(cid, words, param, channel)
if param == "" then
for i=1, #itemNames do
if i == 1 then
text = "-- Lista de Items --\n"
else
text = text .. (itemNames[i].name) .." = ".. itemNames[i].pontos .." pontos\n"
end
end
doShowTextDialog(cid,8977,text)
return true
end
param = string.upper(param)
for j=1, #itemNames do
if (param == string.upper(itemNames[j].name)) then
if getPlayerStorageValue(cid, 102086) < tonumber(itemNames[j].pontos) then
doPlayerSendCancel(cid,"Você não possui pontos suficientes.")
return true
else
doPlayerAddItem(cid, getItemIdByName(param))
doPlayerSendTextMessage(cid, 22, "Você comprou 1 ".. itemNames[j].name ..".")
setPlayerStorageValue(cid, 102086, getPlayerStorageValue(cid, 102086) - itemNames[j].pontos)
return true
end
end
end
doPlayerSendCancel(cid,"Este item não existe.")
return true
end
Agora em data/talkactions/talkactions.xml cole a tag:
Em jogo, ao falar "!buy" aparecera a lista de itens que pode ser comprado e seus determinados custos, conforme foram configurados no arquivo "buyrep.lua".
Para comprar um item basta ter a quantidade de reputação necessaria e usar o comando "!buy NomeDoItem".
Vai em data/creaturescripts/scripts, duplique um arquivo e nomeiei para "showrep" sem as aspas e nele cole:
function getReps(cid)
return getPlayerStorageValue(cid,102086) < 0 and 0 or getPlayerStorageValue(cid,102086)
end
function onLook(cid, thing, position, lookDistance)
if isPlayer(thing.uid) then
doPlayerSetSpecialDescription(thing.uid, "\n[Reps: " .. getReps(thing.uid) .."]")
end
return true
end
----- Versão 2.0 repsystem.lua -----
Caso você queira que cada monstro que você matar de pontos diferentes de reputação, voce deve substituir oque tem dentro do seu arquivo inicialmente criado e nomeado como repsystem.lua por isso:
É isso aew galera, qualquer coisa que precise ser modificado ou dica para melhorar os scripts e o sistema serão bem vindas!
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
local itemNeed = { -- itens que precisa para completar a troca
{itemid = 1234, quant = 5}, -- id do item, quantidade
{itemid = 4352, quant = 3},
{itemid = 9876, quant = 100},
{itemid = 6719, quant = 15}
}
local itemGain, quantGain = 2160, 10 -- item que ganhara ao fim da troca
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
if msgcontains(msg, 'trocar') then
selfSay('Você deseja trocar '.. itemNeed[1].quant ..''.. getItemNameById(itemNeed[1].itemid) ..', '.. itemNeed[2].quant ..''.. getItemNameById(itemNeed[2].itemid) ..', '.. itemNeed[3].quant ..''.. getItemNameById(itemNeed[3].itemid) ..', '.. itemNeed[4].quant ..''.. getItemNameById(itemNeed[4].itemid) ..', por' .. quantGain ..''.. getItemNameById(itemGain) ..'.', cid)
talkState[talkUser] = 2
elseif talkState[talkUser] == 2 then
if msgcontains(msg, 'yes') then
for i=1, #itemNeed do
if getPlayerItemCount(cid, itemNeed[i].itemid) < itemNeed[i].quant then
selfSay('Você não possui os item necessarios para troca.', cid)
return true
end
end
for i=1, #itemNeed do
doPlayerRemoveItem(cid, itemNeed[i].itemid, itemNeed[i].quant)
end
doPlayerAddItem(cid, itemGain, quantGain)
selfSay('A troca esta completa.', cid)
else
selfSay('Você não desja {trocar}?', cid)
end
end
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Quem Está Navegando
0 membros estão online
Nenhum usuário registrado visualizando esta página.