Vai em data/actions/scripts e duplique um arquivo, nomeie para "skullamulet" sem as aspas e nele cole isso:
function onUse(cid, item, fromPosition, itemEx, toPosition)
local effect = 25 -- efeito ao usar
if (getCreatureSkullType(cid) > 2) then
doCreatureSetSkullType(cid, SKULL_NONE)
doPlayerSendTextMessage(cid, 25, "Sua Skull foi retirada.")
doRemoveItem(item.uid, 1)
doSendMagicEffect(getPlayerPosition(cid) , effect)
else
doPlayerSendTextMessage(cid, 25, "Voce nao possui Skull.")
end
return TRUE
end
Agora vai em data/actions/actions.xml e cole a tag:
Vai em data/movements/script e duplica um arquivo dessa pasta e nomeie para "itemvip" sem aspas, abra-o e cole:
local storageVIp = 55555 -- mude a storage vip, conforme a storage do sistema vip do seu otserv!
function onEquip(cid, item, slot)
if getPlayerStorageValue(cid, storageVIp) <= 0 then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players vip 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="itemvip.lua"/>
E se quiser adicionar mais armas vip, sóh duplica a linha acima e muda o id do item e o slot!
Tipos de Slots:
head
armor
legs
hand
shield
ring
necklace
feet
pickupable
Agora vamos fazer um script para que quando a vip acabe, o item saia do slot!
Abra data/creaturescripts/scripts e duplica um arquivo, renomeia para "itemlogin" sem as aspas e nele cole:
function onLogin(cid)
itensVip = { "2408", "8850", "7413" } -- itens vips
if (getPlayerStorageValue(cid, 55555) <= 0) then
for i=0, #itensVip do
for b = 1,9 do
if (getPlayerSlotItem(cid, b) == itensVip[i]) then
doPlayerRemoveItem(cid, itensVip[i])
local bag = doPlayerAddItem(cid, 1988, 1)
doAddContainerItem(bag, itensVip[i], 1)
end
end
end
end
return TRUE
end
E por último, abra data/creaturescripts/creaturescripts.xml e cole a tag:
Sóh adicionar mais conditions antes da função onAttack
Fire:
local condition = createConditionObject(CONDITION_FIRE)
setConditionParam(condition, CONDITION_PARAM_TICKS, 10000) -- aqui vai o tempo de fire, 1000 = 1 segundo
setConditionFormula(condition, 0, 0, 0, 0)
setCombatCondition(combat, condition)
Ice:
local condition = createConditionObject(CONDITION_FREEZING)
setConditionParam(condition, CONDITION_PARAM_TICKS, 10000) -- aqui vai o tempo de fire, 1000 = 1 segundo
setConditionFormula(condition, 0, 0, 0, 0)
setCombatCondition(combat, condition)
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!
Vi que no fórum de dúvidas varias pessoas perguntam como fazer para Weapons darem Paralyze, então resolvi criar o Weapon Paralyze!
O script é de fácil entendimento e qualquer um pode editar facilmente, vai ser possível adicionar mais weapons, regular a chance de ocorrer o paralyze entre outras configurações.
Vamos ao que interessa, abra a pasta "data/creaturescripts/scripts" duplique um arquivo qualquer e renomeie para "weaponpar" sem as aspas e nele cole:
-- <Script by jhon992> --
local weaponpar = {2377, 2378, 2379, 2380} -- id dos items que darão paralize
local chancepar = 5 -- chance de ocorrer o paralize (10 = 10%, 20 = 20%, 30 = 30%, 1 = 1%, 5 = 5%) e assim por diante
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1)
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) -- aqui edita os valores pro dano de paralize, vai mudando ae e testando até achar o desejado
local condition = createConditionObject(CONDITION_PARALYZE)
setConditionParam(condition, CONDITION_PARAM_TICKS, 10000) -- aqui vai o tempo de paralyze, 1000 = 1 segundo
setConditionParam(condition, CONDITION_PARAM_SPEED, -400) -- velocidade que o monstro irá perder
setConditionFormula(condition, 0, 0, 0, 0)
setCombatCondition(combat, condition)
function onAttack(cid, target)
if ((getCreaturePosition(target).x == getCreaturePosition(cid).x or getCreaturePosition(target).x == getCreaturePosition(cid).x+1 or getCreaturePosition(target).x == getCreaturePosition(cid).x-1) and (getCreaturePosition(target).y == getCreaturePosition(cid).y or getCreaturePosition(target).y == getCreaturePosition(cid).y+1 or getCreaturePosition(target).y == getCreaturePosition(cid).y-1)) then
for i=0, #weaponpar do
if (getPlayerSlotItem(cid, 5).itemid == weaponpar[i] or getPlayerSlotItem(cid, 6).itemid == weaponpar[i]) then
if (math.random(1,100) > (100 - chancepar)) then
doPlayerSendTextMessage(cid, 23, getCreatureName(target).." has paralized.")
doAddCondition(target, condition)
return true
else
return true
end
end
end
end
return true
end
Agora no arquivo, "data/creaturescripts/creaturescripts.xml" cole a tag:
Creditos: Maestrial(60%),MatheusMkalo(20%) & Vodkart(20%) pelas correção de Bugs.
Explicaçao: Quando o player pisa no tile do treiner é mandando uma mensagem dizendo que se ele nao se movimentar em alguns minutos ele será mandado para o templo e será kikado automaticamente.