Ir para conteúdo

[Creaturescript] Simple Reputation System !


jhon992

Posts Recomendados

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:

  1. 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 +)
  2. Pontos negativos ao matar players comuns, também contribuirá para diminuição de pk's. (REP -)
  3. 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.

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Agora vamos ao que interessa os scripts:

 

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:

 

<event type="kill" name="RepSystem" event="script" value="repsystem.lua"/>

 

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:

 

<talkaction words="!rep" event="script" value="rankrep.lua"/>

Pronto, terminamos o nosso Simple Reputation System! yipi.gif

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

----- Reputation Door-----

 

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.

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Agora para fazer alavancas, baús e etc, basta seguir o exemplo do script acima da repDoor.

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

----- 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:

 

<talkaction words="!buy" event="script" value="buyrep.lua"/>

 

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".

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

----- Mostrar Reputação no Look (by Vodkart)-----

 

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

 

No creaturescripts.xml cole a tag:

<event type="look" name="showRep" event="script" value="showrep.lua"/>

 

E no arquivo login.lua, antes do último return true:

registerCreatureEvent(cid, "showRep")

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

----- 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:

 

 

--<Script by jhon992>--
function onKill(cid, target, lastHit)

local pkDeathPoints = 1 -- pontos que vai ganhar por matar pk.
local deathPlayer = 2 -- pontos que vai perder por matar player normal.
local vetMonster = {
{nome="Demon", quant=3}, -- nome do monstro e quantidade de rep que ira ganhar.
{nome="Morgaroth", quant=5},
{nome="Hydra", quant=2},
{nome="Dragon", quant=1}
}

-- Ao matar monstros do vetMonster, ganhara rep+.
for i=1, #vetMonster do
  if (getCreatureName(target) == vetMonster[i].nome) then
  setPlayerStorageValue(cid, 102086, getPlayerStorageValue(cid, 102086)+vetMonster[i].quant)
  doSendAnimatedText(getThingPos(cid), 'Rep+', 30)
  doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você ganhou ".. (vetMonster[i].quant) .." ponto(s) de reputação por matar um ".. (vetMonster[i].nome) ..".")
  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)+pkDeathPoints)
  doSendAnimatedText(getThingPos(cid), 'Rep+', 30)
  doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você ganhou "..(pkDeathPoints).." ponto(s) de reputação por matar "..getCreatureName(target)..".")
  return TRUE
  end

-- Ao matar um player normal, ganhara rep-.
  setPlayerStorageValue(cid, 102086, getPlayerStorageValue(cid, 102086)-deathPlayer)  
  doSendAnimatedText(getThingPos(cid), 'Rep-', 144)
  doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você perdeu "..(deathPlayer).." ponto(s) de reputação por matar "..getCreatureName(target)..".")
  return TRUE
end

return TRUE
end

 

 

 

É isso aew galera, qualquer coisa que precise ser modificado ou dica para melhorar os scripts e o sistema serão bem vindas! happy.png

Editado por Jhon992
Link para o comentário
Compartilhar em outros sites

-- Ao matar um pk, ganhara rep+ --

if (getCreatureSkullType(target) > 0) then

 

 

-- Ao matar um player normal, ganhara rep- --

if (getCreatureSkullType(target) > 0) then

 

Ué o que muda nos 2 ? não seria >1 e == 0 ?

Não lembro direito os ids das skulls

Link para o comentário
Compartilhar em outros sites

-- Ao matar um pk, ganhara rep+ --

if (getCreatureSkullType(target) > 0) then

 

 

-- Ao matar um player normal, ganhara rep- --

if (getCreatureSkullType(target) > 0) then

 

Ué o que muda nos 2 ? não seria >1 e == 0 ?

Não lembro direito os ids das skulls

 

Desculpa aew, nem tinha visto isso, dupliquei a parte ali e esqueci de editar.

Link para o comentário
Compartilhar em outros sites

Ta bem legal,só porque de vez de usar o else ou só fechar o if vc abriu outro if?

 


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
		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

 

acho que você poderia fazer um MOD que fica mais fácil de configurar!

parabéns pelo sistema,ficou ótimo.

REP+

Editado por Vodkart
Link para o comentário
Compartilhar em outros sites

Valeu a e @Vodkart pelo elogio e a dica. Nem percebi que não precisava dos dois if, porque a primeira vez que fiz o script não usei isPlayer(target), dae fui testar e reparei que qualquer monstro concedia rep+ asjida. Então fui e adicionei nas duas parte da configuração que precisava verificar se era player.

 

Valeu pela dica tambem @lordbug99 nem tinha estudado o getCreatureSkullType, tinha deduzido que quem tivesse skull era pk então desculpa pelo erro ao galera.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...