RuneScape Wiki
mNo edit summary
Tag: sourceedit
(This will cause crashes, but is necessary until we can switch to a pure SMW solution.)
 
(30 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
-- <pre>
 
-- <pre>
 
local p = {}
 
local p = {}
  +
local JSONS = require('Module:Json')
   
 
function p.main(frame)
 
function p.main(frame)
  +
-- This template is fairly expensive to use, so it should be limited
  +
mw.incrementExpensiveFunctionCount()
  +
 
local args = frame:getParent().args
 
local args = frame:getParent().args
   
Line 10: Line 14:
 
local drop = string.lower(args.userparam or args.drop or '')
 
local drop = string.lower(args.userparam or args.drop or '')
 
drop = mw.text.decode(drop)
 
drop = mw.text.decode(drop)
  +
  +
-- escape lua characters
  +
local _drop = drop:gsub('([%^%$%(%)%%%.%[%]%*%+%-%?])','%%%1')
   
 
local smwdata = frame:preprocess('{{'..
 
local smwdata = frame:preprocess('{{'..
Line 23: Line 30:
   
 
smwdata = mw.text.decode(tostring(smwdata))
 
smwdata = mw.text.decode(tostring(smwdata))
 
 
local _found = false
 
local _found = false
   
 
local json, cmb = unpack( mw.text.split(smwdata,'%(&&SPLITPOINT&&') )
 
local json, cmb = unpack( mw.text.split(smwdata,'%(&&SPLITPOINT&&') )
   
 
local json_good
json = string.format('[ %s ]',json)
+
json_good, json = pcall(JSONS.decode,string.format('[ %s ]',json))
  +
  +
if not json_good then
  +
return ''
  +
end
   
 
cmb = string.format( '(%s',cmb or '?' )
 
cmb = string.format( '(%s',cmb or '?' )
   
  +
local ret = {}
_found = mw.ustring.find(json:lower(), '%{ "name": "'..drop..'"')
 
  +
  +
for _, v in pairs(json) do
  +
if drop == string.lower(v.name) then
  +
table.insert(ret,v)
  +
_found = true
  +
end
  +
end
   
 
if not _found then
 
if not _found then
 
return ''
 
return ''
 
end
 
end
 
local _min,_max,rarity = mw.ustring.match(json:lower(), '%{ "name": "'..drop..'", "quantity": %[([%d%?]+),([%d%?]+)%], "rarity": "([%w ]+)"')
 
 
_min = _min or ''
 
_max = _max or ''
 
rarity = rarity or ''
 
   
 
local combat = mw.ustring.match(cmb:lower(),'%(combat level: (.-)%)') or 'N/A'
 
local combat = mw.ustring.match(cmb:lower(),'%(combat level: (.-)%)') or 'N/A'
 
combat = mw.ustring.gsub(combat,'(%d),(%d%d%d)','%1%2')
  +
local retString = {}
   
  +
for _, v in pairs(ret) do
combat = combat:gsub('(%d%d?),(%d%d%d)','%1%2')
 
  +
local _min,_max = v.quantity[1],v.quantity[2]
 
local quantity
   
 
if tonumber(_min) == tonumber(_max) then
local quantity
 
  +
quantity = _min
if tonumber(_min) == tonumber(_max) then
 
 
else
quantity = _min
 
 
quantity = string.format('%s-%s',_min,_max)
else
 
  +
end
quantity = string.format('%s-%s',_min,_max)
 
  +
  +
table.insert(retString,
  +
string.format('{{ItemDropsLine|Monster=%s|Combat=%s|Quantity=%s|Rarity=%s}}',
  +
monster,
  +
combat,
  +
quantity,
  +
v.rarity)
  +
)
 
end
 
end
   
return frame:preprocess(string.format('{{ItemDropsLine|Monster=%s|Combat=%s|Quantity=%s|Rarity=%s}}',monster,combat,quantity,rarity))
+
return frame:preprocess(table.concat(retString,'\n'))
 
end
 
end
   

Latest revision as of 16:12, 20 March 2019

Documentation for this module may be created at Module:Get drop info/doc

-- <pre>
local p = {}
local JSONS = require('Module:Json')

function p.main(frame)
	-- This template is fairly expensive to use, so it should be limited
	mw.incrementExpensiveFunctionCount()

	local args = frame:getParent().args

	local monster = string.gsub(args['?monster'] or args.monster or '','[][]','')
	monster = mw.text.decode(monster)

	local drop = string.lower(args.userparam or args.drop or '')
	drop = mw.text.decode(drop)

	-- escape lua characters
	local _drop = drop:gsub('([%^%$%(%)%%%.%[%]%*%+%-%?])','%%%1')

	local smwdata = frame:preprocess('{{'..
					'{{{|safesubst:}}}#show:'..
					monster..
				[[
					|?Drop JSON
					|?All Combat level=&&SPLITPOINT&&Combat level:
					|headers=plain
					|format=list
					}}
				]])

	smwdata = mw.text.decode(tostring(smwdata))
	local _found = false

	local json, cmb = unpack( mw.text.split(smwdata,'%(&&SPLITPOINT&&') )

	local json_good
	json_good, json = pcall(JSONS.decode,string.format('[ %s ]',json))

	if not json_good then
		return ''
	end

	cmb = string.format( '(%s',cmb or '?' )

	local ret = {}

	for _, v in pairs(json) do
		if drop == string.lower(v.name) then
			table.insert(ret,v)
			_found = true
		end
	end

	if not _found then
		return ''
	end

	local combat = mw.ustring.match(cmb:lower(),'%(combat level: (.-)%)') or 'N/A'
	combat = mw.ustring.gsub(combat,'(%d),(%d%d%d)','%1%2')
	local retString = {}

	for _, v in pairs(ret) do
		local _min,_max = v.quantity[1],v.quantity[2]
		local quantity

		if tonumber(_min) == tonumber(_max) then
			quantity = _min
		else
			quantity = string.format('%s-%s',_min,_max)
		end
			
		table.insert(retString,
				string.format('{{ItemDropsLine|Monster=%s|Combat=%s|Quantity=%s|Rarity=%s}}',
				monster,
				combat,
				quantity,
				v.rarity)
			)
	end

	return frame:preprocess(table.concat(retString,'\n'))
end

return p