Ir para conteúdo

[Creatureevents] Anunciador De Quem Mata E Quem Morre.


951357

Posts Recomendados

Olá XTibianos,

 

Basicamente é isso:

 

Se o player morrer automaticamente é enviada uma mensagem no BROADCAST para todos os jogadores dizendo quem matou e quem morreu.

O sistema funciona tanto para mortes PvM(Player versus Monster) quanto para PvP (Player versus Player).

 

Vou citar dois exemplos antes de exibir o script:

 

Juanez tacou uma SD em Pedro e Pedro morreu.

A seguinte mensagem é exibida:

Juanez matou Pedro.

 

Outro exemplo:

 

Laurindo estava caçando Dragons quando de repente ele morre.

A seguinte mensagem é exibida.

Dragon matou Laurindo.

 

Agora vamos ao script

 

Em data/creaturescripts/scripts abra arquivo chamado playerdeath.lua, apague tudo que estiver nele e adicione o seguinte conteúdo:

local config = {

deathListEnabled = getBooleanFromString(getConfigInfo('deathListEnabled')),

sqlType = getConfigInfo('sqlType'),

maxDeathRecords = getConfigInfo('maxDeathRecords')

}

 

config.sqlType = config.sqlType == "sqlite" and DATABASE_ENGINE_SQLITE or DATABASE_ENGINE_MYSQL

 

function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)

if(config.deathListEnabled ~= TRUE) then

return

end

 

local hitKillerName = "field item"

local damageKillerName = ""

if(lastHitKiller ~= FALSE) then

if(isPlayer(lastHitKiller) == TRUE) then

hitKillerName = getCreatureName(lastHitKiller)

else

hitKillerName = getCreatureName(lastHitKiller)

end

 

doBroadcastMessage(""..getPlayerName(cid).." has been killed by "..hitKillerName..".")

 

if(mostDamageKiller ~= FALSE and mostDamageKiller ~= lastHitKiller and getCreatureName(mostDamageKiller) ~= getCreatureName(lastHitKiller)) then

if(isPlayer(mostDamageKiller) == TRUE) then

damageKillerName = getPlayerGUID(mostDamageKiller)

else

damageKillerName = getCreatureName(mostDamageKiller)

end

end

end

 

db.executeQuery("INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `altkilled_by`) VALUES (" .. getPlayerGUID(cid) .. ", " .. os.time() .. ", " .. getPlayerLevel(cid) .. ", " .. db.escapeString(hitKillerName) .. ", " .. db.escapeString(damageKillerName) .. ");")

local rows = db.getResult("SELECT `player_id` FROM `player_deaths` WHERE `player_id` = " .. getPlayerGUID(cid) .. ";")

if(rows:getID() ~= -1) then

local amount = rows:getRows(true) - config.maxDeathRecords

if(amount > 0) then

if(config.sqlType == DATABASE_ENGINE_SQLITE) then

for i = 1, amount do

db.executeQuery("DELETE FROM `player_deaths` WHERE `rowid` = (SELECT `rowid` FROM `player_deaths` WHERE `player_id` = " .. getPlayerGUID(cid) .. " ORDER BY `time` LIMIT 1);")

end

else

db.executeQuery("DELETE FROM `player_deaths` WHERE `player_id` = " .. getPlayerGUID(cid) .. " ORDER BY `time` LIMIT " .. amount .. ";")

end

end

end

end

 

Salve e feche.

 

OBS.¹: Faça o backup do arquivo playerdeath.lua antes de qualquer alteração em seu conteúdo.

 

Créditos:

Aman Kartholic - Eu - 50% de participação na elaboração do script.

kydrai - Membro XTibia - 50% de participação na elaboração do script.

 

Se for postar em outro fórum favor colocar os devidos créditos.

 

Script testado na versão:

TFS - 3.4 (Crying Damson)

 

Problemas na inserção do script favor postar aqui.

OBS.²: Responderei as dúvidas feitas somente 10 dias após a postagem do tópico.

 

Cya ~

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

if(lastHitKiller ~= FALSE) then
if(isPlayer(lastHitKiller) == TRUE) then
hitKillerName = getCreatureName(lastHitKiller)
else
hitKillerName = getCreatureName(lastHitKiller)
end

 

Acho que não precisa do "if(isPlayer(lastHitKiller) == TRUE) then", pq ele vai realizar sempre a msm função.

 

if(lastHitKiller ~= FALSE) then
hitKillerName = getCreatureName(lastHitKiller)

 

O resto parece bom :smile_positivo:

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

Usuário xxterrivel cuidado rapaz, aqui não é lugar de divulgar servidor não.

Peço que da próxima vez não aconteça isto novamente, caso ao contrário poderá levar alerta.

 

Abraços

Link para o comentário
Compartilhar em outros sites

Acho que não precisa do "if(isPlayer(lastHitKiller) == TRUE) then", pq ele vai realizar sempre a msm função.

 

Eu não quis retirar nenhuma função pois desse jeito funcionou perfeitamente. =D

 

Cya ~

Link para o comentário
Compartilhar em outros sites

Gostaria de adicionar uma nova variação para o sistema:

 

Lembrando que o sistema funcionará da mesma maneira mas terá efeitos diferentes.

 

Primeiro vamos ao script:

 

playerdeath.lua

local config = {

deathListEnabled = getBooleanFromString(getConfigInfo('deathListEnabled')),

sqlType = getConfigInfo('sqlType'),

maxDeathRecords = getConfigInfo('maxDeathRecords')

}

 

config.sqlType = config.sqlType == "sqlite" and DATABASE_ENGINE_SQLITE or DATABASE_ENGINE_MYSQL

 

function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)

if(config.deathListEnabled ~= TRUE) then

return

end

 

local hitKillerName = "field item"

local damageKillerName = ""

if(lastHitKiller ~= FALSE) then

if(isPlayer(lastHitKiller) == TRUE) then

hitKillerName = getCreatureName(lastHitKiller)

else

hitKillerName = getCreatureName(lastHitKiller)

end

 

doBroadcastMessage(cid, ""..hitKillerName.." Matou "..getPlayerName(cid)..".", TALKTYPE_ORANGE_1)

 

if(mostDamageKiller ~= FALSE and mostDamageKiller ~= lastHitKiller and getCreatureName(mostDamageKiller) ~= getCreatureName(lastHitKiller)) then

if(isPlayer(mostDamageKiller) == TRUE) then

damageKillerName = getPlayerGUID(mostDamageKiller)

else

damageKillerName = getCreatureName(mostDamageKiller)

end

end

end

 

db.executeQuery("INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `altkilled_by`) VALUES (" .. getPlayerGUID(cid) .. ", " .. os.time() .. ", " .. getPlayerLevel(cid) .. ", " .. db.escapeString(hitKillerName) .. ", " .. db.escapeString(damageKillerName) .. ");")

local rows = db.getResult("SELECT `player_id` FROM `player_deaths` WHERE `player_id` = " .. getPlayerGUID(cid) .. ";")

if(rows:getID() ~= -1) then

local amount = rows:getRows(true) - config.maxDeathRecords

if(amount > 0) then

if(config.sqlType == DATABASE_ENGINE_SQLITE) then

for i = 1, amount do

db.executeQuery("DELETE FROM `player_deaths` WHERE `rowid` = (SELECT `rowid` FROM `player_deaths` WHERE `player_id` = " .. getPlayerGUID(cid) .. " ORDER BY `time` LIMIT 1);")

end

else

db.executeQuery("DELETE FROM `player_deaths` WHERE `player_id` = " .. getPlayerGUID(cid) .. " ORDER BY `time` LIMIT " .. amount .. ";")

end

end

end

end

 

Alteração realizada em relação ao primeiro script:

 

Alterei a linha doBroadcastMessage(cid, ""..hitKillerName.." Matou "..getPlayerName(cid)..".", TALKTYPE_ORANGE_1).

 

Motivo da alteração

Nada em relação à BUG. Apenas altera a mensagem enviada quando o player é morto e altera o tipo da mensagem, sendo de cor laranja.

 

Dúvidas, poste aqui.

 

Cya ~

Link para o comentário
Compartilhar em outros sites

Completamente perfeito, implementado no meu OT.

 

Eu tava tentando fazer uma coisa parecida, era assim :

 

Eu takei uma SD eu vc e vc morreu :

 

Eu matou vc com uma sudden death rune <- e isso mudaria de acordo com o tipo, mostraria o nome da spell e etc.

 

Mas, você está

 

APROVADO

Link para o comentário
Compartilhar em outros sites

Completamente perfeito, implementado no meu OT.

 

Eu tava tentando fazer uma coisa parecida, era assim :

 

Eu takei uma SD eu vc e vc morreu :

 

Eu matou vc com uma sudden death rune <- e isso mudaria de acordo com o tipo, mostraria o nome da spell e etc.

 

Mas, você está

 

APROVADO

 

Olá Stefano26,

 

Realmente não sei se existe tal função que permita dizer com qual ataque o jogador foi morto. Acho que não existe.

 

Mas nada é impossível! Quem sabe algum dia isso aconteça, não é mesmo?

 

Obrigado pelos elogios.

 

Cya ~

Link para o comentário
Compartilhar em outros sites

Teria como fazer que só jogadores fossem aparecer.

ex: se o jogador morre pra dragon n aparece nada

ou que pegasse o namedescription do bixo

ex: nameDescription="a demon"

a demon killed Xd Xd

 

ps.: já mudei pra killed em vez de matou pq meu server tem jogadores de outros países.

Link para o comentário
Compartilhar em outros sites

Teria como fazer que só jogadores fossem aparecer.

ex: se o jogador morre pra dragon n aparece nada

ou que pegasse o namedescription do bixo

ex: nameDescription="a demon"

a demon killed Xd Xd

 

ps.: já mudei pra killed em vez de matou pq meu server tem jogadores de outros países.

 

Não sei se é possível fazer esse script mas acho que deve envolver algo que verifique se é player ou não e, se for, realiza a função de enviar BroadcastMessage.

 

Como estou sem tempo não poderei ajudá-lo com tal script.

Esper que alguém possa auxiliá-lo.

 

Cya ~

Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...

Script ruim..

Pois eu tenho um Ot com 150 On!

Uns 50 é Power Abusing..

Fikam matando diretooo!

ai vai fika o tempo todo msg aparecendo!

 

ex:

 

Zezin mato luizin

Zezin mato luizin

Zezin mato luizin

Zezin mato luizin

Zezin mato luizin

Zezin mato luizin

Zezin mato luizin

....

Link para o comentário
Compartilhar em outros sites

Então, meu ot estava funcionando perfeitamente com a funcao do broadcast e dar um item pro player que matasse

porem nao funcionava a deathlist

 

Agora funciona a deathlist e o broadcast, porem nao funciona o addplayeritem

será que voce poderia me dizer como usar essa funcao nesse script?

eu ja tentei: doPlayerAddItem(hitKillerName, 2152, 2, TRUE)

mas nao consegui.

 

Valeu !

Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...
×
×
  • Criar Novo...