Jump to content
×
×
  • Create New...

Recommended Posts

  • Diretor

tradepoints by yan.png

#Introdução

Reparei que muitas pessoas estão atrás desse sistema que o DBOBR & NTOBR usa, e atualmente o VitorSubhi postou um, porém é necessário modificar as sources. Apesar de achar o dele bem melhor, estarei deixando este meu sistema(não é necessário mexer nas sources).

 

#Funcionamente

O jogador vai até um NPC e compra um papel, após ter comprado ele pode estar dando trade nesse papel e negociando com algum jogador, em troca de qualquer item. Ao finalizar a negociação, os points são transferidos/removidos(caso houver points na conta). Também é possivel comprar o papel por comando, estarei disponibilizando ambos para vocês.

 

#Alguns prints:

Spoiler

NPC:

npc.png

Item no trade:

trade1.png

Sucesso na troca:

trade2.pngtrade3.png

ERROR:

trade4.pngtrade5.png

 

Estarei deixando o script para vocês em inglês, modifique como quiser ;D

Então vamos lá...

 

#Instalação

Em data/lib crie um arquivo chamado tradepoints.lua cole isto dentro:

Spoiler

function scanContainer(item, tables)
    if isContainer(item.uid) then
        for i = 0, getContainerSize(item.uid) do
            local item_ct = getContainerItem(item.uid, i)
            if (item_ct) then
            if isContainer(item.uid) then
                scanContainer(item_ct, tables)
            end
            table.insert(tables, item_ct.itemid)
         end
      end
   end
end

function getAccountPointsTrade(cid)
	local Points = 0
	local Result = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `name` = '"..getPlayerAccount(cid).."'")
	if Result:getID() ~= -1 then
		Points = Result:getDataInt("premium_points")
	end
	return tonumber(Points)
end

function doAccountAddPointsTrade(cid, count)
	return db.query("UPDATE `accounts` SET `premium_points` = '".. getAccountPointsTrade(cid) + count .."' WHERE `name` = '"..getPlayerAccount(cid).."'")
end

function doAccountRemovePointsTrade(cid, count)
	return db.query("UPDATE `accounts` SET `premium_points` = '".. getAccountPointsTrade(cid) - count .."' WHERE `name` = '"..getPlayerAccount(cid).."'")
end

 

 

Em data/creaturescript/tradepoints.lua:

Spoiler

local ItemID = 1964 -- ID do papel

function PremmyPoints(item)
	return tonumber(getItemAttribute(item.uid, "points"))
end

function Success(fromplayer, toplayer, points)
   if getPlayerItemCount(toplayer, ItemID) >= 1 and getAccountPointsTrade(fromplayer) >= points then
    	doAccountRemovePointsTrade(fromplayer, points)
		doPlayerRemoveItem(toplayer, ItemID, 1)
		doAccountAddPointsTrade(toplayer, points)
		doPlayerSendTextMessage(toplayer, MESSAGE_STATUS_WARNING, "Transfer successfully, you can now use the ".. points .." premium points in our site shop!")
		doPlayerSendTextMessage(fromplayer, MESSAGE_STATUS_WARNING, "Was removed ".. points .." premium points of your account")
		return true
	end
end

function onTradeAccept(cid, target, item, targetItem)
	if isPlayer(cid) and isPlayer(target) then
	  if (item.itemid == ItemID and targetItem.itemid == ItemID) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You can not trade points for points, close the current trade, and try again.")
			doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "You can not trade points for points, close the current trade, and try again.")
			return false
      	end
       if item.itemid == ItemID then
			local points = PremmyPoints(item)
		if getAccountPointsTrade(cid) >= points then
			addEvent(Success, 1, cid, target, points)
		    else
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You do not have ".. points .." premium points to perform this procedure.")
			doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "The buyer does not have ".. points .." premium points to perform this procedure.")
			return false
			end
		end
		if targetItem.itemid == ItemID then
			local points = PremmyPoints(targetItem)
		if getAccountPointsTrade(target) >= points then
			addEvent(Success, 1, target, cid, points)
            else
			doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "You do not have ".. points .." premium points to perform this procedure.")
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "The buyer does not have ".. points .." premium points to perform this procedure.")
			return false
			end
		end
	end
	return true
end

function onTradeRequest(cid, target, item)
local tabela = {}
local black_list = {ItemID}
    scanContainer(item,tabela)
	for i = 1, #black_list do
		if isInArray(tabela, black_list[i]) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You can not place the premmy trade document in this trade, this document can only be used in trade outside containers (bag, backpack, etc).")
			return false
		end
	end
	return true
end

 

 

TAG:

<event type="tradeaccept" name="Trade_Points" event="script" value="tradepoints.lua"/>
<event type="traderequest" name="Trade_Points_Request" event="script" value="tradepoints.lua"/>

login.lua:

registerCreatureEvent(cid, "Trade_Points")
registerCreatureEvent(cid, "Trade_Points_Request")

NPC XML:

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Frodo" script="data/npc/scripts/trade_points.lua" walkinterval="2000" floorchange="0" access="5" level="1" maglevel="1">
	<health now="150" max="150"/>
	<look type="275" head="114" body="113" legs="113" feet="113" corpse="2212"/>
	<parameters>
		<parameter key="module_shop" value="1" />
		<parameter key="message_greet" value="Hello |PLAYERNAME|. I sell some utensils and Premium Points Transfer for you to transfer points to other players, remember to buy use '10' to 10 points." />
	</parameters>
</npc>

Data/npc/scripts/trade_points.lua:

Spoiler

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

---- CONFIG ----
local ItemID = 1964 -- ID do papel
local money = 10000 -- Custo para comprar o Papel(em gold coin)
local min,max = 10, 110 -- Valor minimo e maximo do points em papel
----  FIM ----

	if talkState[cid] == nil or talkState[cid] == 0 then
		points = tonumber(msg)
		if (points ~= nil) and (points>=min and points<=max) then
			selfSay("You can purchase a premium point transfer document that will transfer ".. points .." premium points, right?", cid)
			talkState[talkUser] = 1
		else
			selfSay("I can only sell documents that transfer premium points between "..min.." and "..max..".", cid)
			talkState[talkUser] = 0
		end
	elseif talkState[cid] == 1 then
		if msgcontains(msg, 'yes') then
		if doPlayerRemoveMoney(cid, money) then
			local Paper = doCreateItemEx(ItemID)
			doItemSetAttribute(Paper, "name", "".. points .." premium points transfer Paper")
			doItemSetAttribute(Paper, "points", points)
			selfSay("You got one ".. getItemNameById(ItemID) .." so good ".. points .." premium points, it was a pleasure doing business with you.", cid)
			doPlayerAddItemEx(cid, Paper, true)
			talkState[talkUser] = 0
		else
			selfSay("You do not have enough money!", cid)
			talkState[talkUser] = 0
		  end
		else
		selfSay('OK then!', cid)
		talkState[talkUser] = 0
	   end
	end
	return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

 

Caso queira que a compra do papel seja feita por talkactions, aqui está:

Spoiler

---- CONFIG ----
local itemID = 1964 -- ID do papel
local money = 10000 -- Custo para comprar o Papel(em gold coin)
local min,max = 10, 110 -- Valor minimo e maximo do points em papel
---- FIM ----

function onSay(cid, words, param)
	local name,points = "%s premium points transfer Paper",getAccountPointsTrade(cid)
	if param == "" or not tonumber(param) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, use only numbers.") return true
	elseif not doPlayerRemoveMoney(cid, money) then	
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You do not have enough money!") return true
	elseif tonumber(param) < min or tonumber(param) > max then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, in between "..min.." and "..max.." points.") return true
	elseif points < tonumber(param) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, but you only have "..points.." Premium Points.") return true
	end
	local item = doPlayerAddItem(cid, itemID,1) 
	doItemSetAttribute(item, "name", name:format(tonumber(param)))
	doItemSetAttribute(item, "points", param)
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"You have received a paper with "..param.." Premium Points.")
	return true
end

 

 

TAG:

<talkaction words="!sellpoints;/sellpoints" event="script" value="trade_points.lua"/>

 

Prontinho xD

Agradecimentos ao Junior(lordzetros) por ajudar na função scanContainer e ao @VitorSubhi

Link to post
Share on other sites
  • 5 months later...

[4/2/2020 17:47:1] >>> Loading creaturescripts... [Error - Event::checkScript] Event onTradeAccept not found (data/creaturescripts/scripts/tradepoints.lua)
[4/2/2020 17:47:1] [Error - Event::checkScript] Event onTradeRequest not found (data/creaturescripts/scripts/tradepoints.lua)

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.


    Administrador |  Diretor |  Coordenador |  Moderador |  Suporter |  Estagiário |  Herói
  • Similar Content

    • By kushzinho
      Olá bom dia, se alguém puder me ajudar ficaria muito grato! Porfavor alguém consegue disponibilizar um script de npc que altere PvP do player?
      Vou explicar, a pessoa cria o char e já chega sendo npvp, portanto na cidade terá um npc em que ele possa se alterar pra pvp, gostaria que o player que não tivesse PvP ficasse com a caveirinha verde do lado do char e o PvP fica normal (podendo pegar caveirinha branca, red, black. Também gostaria se for possível adicionar tempo para pode trocar novamente, tipo 24 horas. Se alguém puder uma luz porfavor, desde já agradeço.   Server global 12.51 tfs 1.3
    • By Poccnn
      Olá Homo-Sapiens.
       
      Resolvi trazer para vocês esse sistema de Quest que eu criei para resolver alguns inconvenientes em meu ot serv.
       
      Quais são as características dele?
       
      Ele é totalmente inserido através do mapper sem precisar criar scripts. Ele contém um sistema de parâmetros que podem ser usados para determinar a quem pode receber o prêmio. Ele não usa marcação por storage evitando assim conflitos com outros scripts que usam storage como marcação. Com esse sistema inserido vocês podem criar quest por vocação única, promovidos, mages ou kinas/palas.
      Como ela pode usar os items dentro do baú como items obtiveis de quest, ela aceita qualquer tipo de item inserido, mesmo keys e runas.
       
      Implementação
       
       
      Em actions.xml adicione:
      <!-- Quests baus --> <action fromid="1740" toid="1741" event="script" value="quests/quests.lua"/> <action fromid="1747" toid="1749" event="script" value="quests/quests.lua"/> <action fromid="1410" toid="1420" event="script" value="quests/quests.lua"/> <action actionid="2000" event="script" value="quests/quests.lua"/>  
      Agora em scripts/quests crie ou modifique seu quests.lua para esse:
      --[[ autor = Marcryzius data = segunda-feira, 28 de Dezembro de 2015 >> Alguns parametros de uso. item.uid = itemid << id do item que será ganho - caso o item esteja 'inside' no baú, não se faz nescessario usar o id do item na uid - para habilitar o bau com os items como sendo uma quest se faz necessario acrescentar uma AID. actionid = validação << o baú só será usado na forma de quest se tiver alguma aid. pode usar marcação de vocação como na instrução abaixo ou setar aid 2000 para validar o baú como uma quest. actionid = quantidade << desde que ela seja maior que 100 e menor que 200 (150 = 50 items, 200 = 100 items) actionid = vocação << o primeiro numero diz que é uma quest de vocação; o segundo habilita que, as vocações promovidas também podem fazer a quest; os dois ultimos numero é da vocação em questão. exemplo 1 = 1201 << sorceres e master sorceres -- promovidos exemplo 2 = 1200 << kina e EK -- promovidos exemplo 3 = 1102 << apenas druids e não elder druids -- vocação especifica exemplo 4 = 1000 << apenas knights e paladins. exemplo 5 = 1100 << apenas sorcerers e druids. inside = varios items << todos os items que forem colocados dentro do bau será usado como referencia do premio da quest; pode-se tambem usar aid para determinar a vocação nescessaria dessa quest. -- ### -- Com o uso da nova função, não está mais sendo "setado" no player a store da "quest" usando setPlayerStorageValue(). ]] function onUse(cid,item,pos) if(item.actionid >= 1000 and item.actionid < 3000)then if(item.actionid == 1000 and not(isPaladin(cid) or isKnight(cid)))then -- somente kina ou pala recebem o item return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid-1000 == 100 and not(isSorcerer(cid) or isDruid(cid)))then -- somente mages recebem o item return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid-1000 > 0 and item.actionid-1000 < 100 and not(getPlayerVocation(cid) == item.actionid-1000))then -- vocação especifica - kina pala. return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid-1000 > 100 and item.actionid-1000 < 200 and not(getPlayerVocation(cid) == item.actionid-1100))then -- vocação especifica - mages. return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid-1000 >= 200 and item.actionid-1000 < 300 and not(getPlayerVocation(cid) % 4 == item.actionid-1200))then -- vocações promovidas. return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") end elseif(item.uid > 12000 and item.actionid == 0)then -- um baú qualquer return false -- abre o baú para pegarem os items 'inside' sem marcar nada, como se fosse abrir um baú qualquer sem ser de quest. end local quests_quant = (item.actionid-100 < 1) and 1 or (item.actionid-100 > 100) and 100 or item.actionid-100--Defini a quantidade de items. local playerCap,cap = getPlayerFreeCap(cid),getItemWeightById(item.uid,quests_quant) or 0 if(item.uid > 1000 and cap > 0)then -- quest por uid if(getSaveQuestsInfor(item.uid,cid))then --Função não usa marcação (getPlayerStore...) if(playerCap >= cap)then if(item.uid == 2493)then setPlayerStorageValue(cid,2493,1) end -- compatibilidade, verificar uso > ???...D:::H...??? doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a '..((quests_quant == 1) and '' or quests_quant)..' '..getItemNameById(item.uid)..'.') saveQuestsInfor(item.uid,getItemNameById(item.uid),cid,"Quest system by uid.") doPlayerAddItemEx(cid,doCreateItemEx(item.uid, quests_quant),true) else return false,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a '..(quests_quant == 1 and '' or quests_quant)..' '..getItemNameById(item.uid)..' weighing '..math.floor(cap)..' oz it\'s too heavy.') end else--caso o player já tenha feito a quest, abri-se o baú de forma convencional, podendo obter os items que estejam dentro dele. return false end return true end local size,texto,rewards,peso = isContainer(item.uid) and getContainerSize(item.uid) or 0,'You have found a ',{},0 if(size > 0)then for i = size,0,-1 do local tmp = getContainerItem(item.uid, i) if(tmp.itemid > 0) then if(isItemContainer(tmp.itemid))then -- só é possível adicionar mais um inside. ou seja, uma bolsa com algo dentro desde que não tenha outra bolsa com mais coisas dentro, dentro dessa bolsa primária. table.insert(rewards,1,{[tmp.itemid] = {}}) texto = texto..' a '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') for insize = getContainerSize(tmp.uid),0,-1 do local newtmp = getContainerItem(tmp.uid, insize) table.insert(rewards[1][tmp.itemid],{id=newtmp.itemid, val=(newtmp.actionid > 0 and newtmp.actionid or newtmp.type)}) end else --Foi feito dessa forma para não haver conflito com items do mesmo tipo. table.insert(rewards,{[tmp.itemid]=(tmp.actionid > 0 and tmp.actionid or tmp.type)}) if(tmp.type > 0)then texto = texto..' '..(tmp.type > 0 and tmp.type..' charges of ' or 1)..' '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') elseif(tmp.actionid > 0)then texto = texto..' '..(tmp.type > 0 and tmp.type..' charges of ' or 1)..' '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') else texto = texto..' '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') end end peso = peso + getItemWeight(tmp.uid) end end if(getSaveQuestsInfor(tonumber(pos.x..''..pos.y..''..pos.z),cid))then --Função não usa marcação (getStore...)) if(playerCap >= peso)then for _,reward in pairs(rewards) do for item,valor in pairs(reward) do if(type(valor) == "table")then local bag = doCreateItemEx(item) for _,value in pairs(valor) do if(value and value.id > 0)then doAddContainerItemEx(bag,doCreateItemEx(value.id,(value.val<=0 and 1 or value.val))) end end doPlayerAddItemEx(cid,bag,true) elseif(isInArray(KEYS_DOOR,item))then -- se o item for uma key local ch = doCreateItemEx(item,1) doItemSetAttribute(ch,'aid',valor) doPlayerAddItemEx(cid,ch) else doPlayerAddItemEx(cid,doCreateItemEx(item, valor),true) end end end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, texto) saveQuestsInfor(tonumber((pos.x)..''..(pos.y)..''..(pos.z)),getItemNameById(table.maxn(rewards)),cid,"Quest system by Inside.") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, texto..' weighing '..math.floor(peso)..' oz it\'s too heavy.' ) end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") end else return false, doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is empty.") end return true end  
       
      Em lib/050-functions.lua adicione:
       
      function getSaveQuestsInfor(uid,cid) --[[( Marcryzius )]]-- local str = false if not(db.executeQuery("SELECT * FROM `server_quests`;"))then -- caso a table não exista, será criada db.executeQuery("CREATE TABLE `server_quests` (`uid` INTEGER, `name` VARCHAR(255), `name_player` VARCHAR(255), `pos` VARCHAR(255), `other` TEXT);") return getSaveQuestsInfor(uid,cid) end if(tonumber(uid))then str = db.getResult("SELECT * FROM `server_quests` WHERE `uid` = '"..uid.."' AND `name_player` = ".. db.escapeString(getCreatureName(cid))..";") elseif(type(uid) == 'string')then str = db.getResult("SELECT * FROM `server_quests` WHERE `name_player` = " ..db.escapeString(getCreatureName(cid)).. " AND `name` = '"..uid.."';") else return false,print('getSaveQuestInfor: tipo de uid invalido > '..tostring(type(uid))) end return (str:getID() == -1) and true or false end function saveQuestsInfor(uid,name,cid,other) --[[( Marcryzius )]]-- --[[ uid = Item.uid usado no bau(entre outros) para receber o item da Quest name = nome do item dado ao player ou nome da quest cid = identificacao do player other = informacoes adicionais para serem salvas junto a quest ]]-- if not(db.executeQuery("SELECT * FROM `server_quests`;"))then -- caso a table não exista, será criada db.executeQuery("CREATE TABLE `server_quests` (`uid` INTEGER, `name` VARCHAR(255), `name_player` VARCHAR(255), `pos` VARCHAR(255), `other` TEXT);") end -- caso o parametro uid seja numero, pega-se a posição do item ou, caso não, pega-se a posição do player. local other,pos2 = other or '','' local pos = type(uid) == 'number' and getThingPos(uid) or getCreaturePosition(cid) pos2 = 'x='..pos.x..', y='..pos.y..', z='..pos.z -- verifica se tudo está correto. if not(type(name) == 'string') or not(tonumber(cid))then return false, print('Funcao requer parametros: name,cid') end -- salva as informações na database. db.executeQuery("INSERT INTO `server_quests` (`uid`, `name`, `name_player`,`pos`,`other`) VALUES ("..(uid or tonumber(pos.x..''..pos.y..''..pos.z))..",'"..name.."', '"..getCreatureName(cid).."','"..pos2.."','"..other.."');") return true end  
      Exemplos de uso do sistema
      Quest na qual dá o prêmio de 100 gps:
      Quest na qual dá o prêmio apenas para knights (e não para EKs e outras promoções de knight):
      Quest na qual dá o prêmio apenas para paladins e suas promotions:
      Ressalva: Caso queira fazer para knights use o id 0 (zero) e não 4 (quatro).
      Quest na qual dá o prêmio apenas para todos:
      Nesse caso você pode usar AID 0 (zero) ou AID (2000).
      Caso usem o metodo 'inside' de items no baú pode-se também usar esses mesmos parâmetros para estabelecer a quem pode ganhar os items inseridos no baú. Lembre-se que em quests 'insides' não se usa UID, mantenha ela em 0 (zero):
      Utilizando o metodo 'inside' ela só se tornará uma quest caso tenha alguma AID para válidar como quest. Então para fazer uma validação na qual qualquer player possa obter os itens 'inside' como sendo uma quest, adicione a AID 2000 ao baú:
       
      Bem, é isso pessoal.
      Para finalizar, aqui vai uma crítica ao xtibia. MELHOREM ESSE SISTEMA DE EDIÇÃO DE TEXTO.
    • By Poccnn
      Hail Xtibianos.
       
      Esse script eu criei a pedido de um membro do fórum e resolvi posta-lo para vocês.
       
      Ele serve para que ao matarem um determinado monstros, somente os players que tiverem uma certa quantidade de participação (em porcentagem) na morte do monstro é que receberam algo (configurável).
       
      Em creaturescripts.xml adicione:
      <event type="statschange" name="stats" script="statsMonster.lua"/> <event type="death" name="deathMonster" script="deathMonster.lua"/>  
      Em creaturescripts/scripts crie um arquivo lua com o nome statsMonster e adicione:
      --[[ autor = Marcryzius data = sexta-feira, 05 de fevereiro de 2016 tipo = 1 (um) é ataque, 0 (zero) é healing. query para ser adicionada no monstro: <script> <event name = "stats"/> <event name = "deathMonster"/> </script> ]] M = {} function getDamageInMonster(monster,cid) local monster,cid,m_life,p_dano = tonumber(monster),tonumber(cid),0,0 if not(monster or cid)then return 0,error('function getDamageInMonster(): monster or cid, not number') end if not(isCreature(monster))then return 0,error('function getDamageInMonster(): variavel monster nao e monstro.') end for k,v in pairs(M[monster]) do if(k == cid)then p_dano = v end m_life = m_life + v end return math.floor(p_dano/(m_life/100)) end function onStatsChange(cid, attacker, tipo, combat, value) if not(M[cid])then M[cid] = {} end if not(tipo == 1)then return true end if(isPlayer(attacker))then if not(M[cid][attacker])then M[cid][attacker] = 0 end M[cid][attacker] = M[cid][attacker] + value elseif(isMonster(attacker))then -- caso seja um monstro o atacante local get = getCreatureMaster(attacker) -- averigua se não é um summon que está atacando if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player if not(M[cid][get])then M[cid][get] = 0 end M[cid][get] = M[cid][get] + value end end return true end  
      Agora crie outro arquivo lua na mesma pasta e nomeie para deathMonster e adicione:
      function onDeath(cid, corpse, deathList) --[[> Marcryzius <]] for _,player in pairs(deathList) do local player = isCreature(player) and getCreatureMaster(player) or player if(isPlayer(player) and isPlayerOn(player))then if(getDamageInMonster(cid,player) >= 50)then -- quantidade de danos em % --[[ aqui é a parte onde dar ao player seu premio por ter consegue tantos % de danos ao monstro ]]-- -- exemplos de ações doRemoveItem(getThingfromPos(Full_Items[getCreatureName(cid):lower()]).uid) doCreateItem(2283,1,getCreaturePosition(cid)) doCreateItem(4810,1,Full_Items[getCreatureName(cid):lower()]) setPlayerStorageValue(player,getStoreString('fullitems'),0) end if(M[player])then table.remove(M,player) end end end end  
      No monstro que tu queira usar esse sistema, adicione no xml dele essas duas tags:
      <script> <event name = "stats"/> <event name = "deathMonster"/> </script>  
      Pronto.
      Qualquer duvida, erro e etc, deixe nos comentários. 
    • By bolludo
      Olá, Gostaria de uma ajuda com programação c++, queria que a cada item movido tivesse um salve para nao ter o clone do item, ou um sistema de anti clone alguem poderia me ajudar ?
       
      meu servidor é um 7.92 - xml - source evolutions (editada)
    • By davidsanto195
      Recentemente adicionei um site ao meu servidor Baiak, mas dentro do OT o uniqueid que é fornecido ao player que tem acesso a área vip etc é diferente do uniqueid que o player ganha quando compra pelo site. 
      Gostaria de saber se alguém sabe onde fica o arquivo para eu mudar o uniqueid que o player ganha quando compra pelo site?