old_contents: # -*- coding: utf-8 -*-
  import json
  
  processFields = [
  	"ScriptMethod",
  	"ScriptString",
  	"ScriptMetadata",
  	"ScriptMetadataMethod",
  	"Addresses",
  ]
  
  functionManager = currentProgram.getFunctionManager()
  baseAddress = currentProgram.getImageBase()
  USER_DEFINED = ghidra.program.model.symbol.SourceType.USER_DEFINED
  
  def get_addr(addr):
  	return baseAddress.add(addr)
  
  def set_name(addr, name):
  	name = name.replace(' ', '-')
  	createLabel(addr, name, True, USER_DEFINED)
  
  def make_function(start, end):
  	next_func_start = getFunctionAfter(start).getEntryPoint()
  	if next_func_start < end:
  		end = next_func_start
  	body = createAddressSet()
  	body.addRange(start, end.subtract(1))
  	functionManager.deleteAddressRange(start, end.subtract(1), getMonitor())
  	func = getFunctionAt(start)
  	if func is None:
  		functionManager.createFunction(None, start, body, USER_DEFINED)
  	else:
  		func.setBody(body)
  
  f = askFile("script.json from Il2cppdumper", "Open")
  data = json.loads(open(f.absolutePath, 'rb').read().decode('utf-8'))
  
  if "ScriptMethod" in data and "ScriptMethod" in processFields:
  	scriptMethods = data["ScriptMethod"]
  	for scriptMethod in scriptMethods:
  		addr = get_addr(scriptMethod["Address"])
  		name = scriptMethod["Name"].encode("utf-8")
  		set_name(addr, name)
  
  if "ScriptString" in data and "ScriptString" in processFields:
  	index = 1
  	scriptStrings = data["ScriptString"]
  	for scriptString in scriptStrings:
  		addr = get_addr(scriptString["Address"])
  		value = scriptString["Value"].encode("utf-8")
  		name = "StringLiteral_" + str(index)
  		createLabel(addr, name, True, USER_DEFINED)
  		setEOLComment(addr, value)
  		index += 1
  
  if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
  	scriptMetadatas = data["ScriptMetadata"]
  	for scriptMetadata in scriptMetadatas:
  		addr = get_addr(scriptMetadata["Address"])
  		name = scriptMetadata["Name"].encode("utf-8")
  		set_name(addr, name)
  		setEOLComment(addr, name)
  
  if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
  	scriptMetadataMethods = data["ScriptMetadataMethod"]
  	for scriptMetadataMethod in scriptMetadataMethods:
  		addr = get_addr(scriptMetadataMethod["Address"])
  		name = scriptMetadataMethod["Name"].encode("utf-8")
  		methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
  		set_name(addr, name)
  		setEOLComment(addr, name)
  
  if "Addresses" in data and "Addresses" in processFields:
  	addresses = data["Addresses"]
  	for index in range(len(addresses) - 1):
  		start = get_addr(addresses[index])
  		end = get_addr(addresses[index + 1])
  		make_function(start, end)
  
  print 'Script finished!'
  
  
new_contents: # -*- coding: utf-8 -*-
  import json
  
  processFields = [
  	"ScriptMethod",
  	"ScriptString",
  	"ScriptMetadata",
  	"ScriptMetadataMethod",
  	"Addresses",
  ]
  
  functionManager = currentProgram.getFunctionManager()
  baseAddress = currentProgram.getImageBase()
  USER_DEFINED = ghidra.program.model.symbol.SourceType.USER_DEFINED
  
  def get_addr(addr):
  	return baseAddress.add(addr)
  
  def set_name(addr, name):
  	name = name.replace(' ', '-')
  	createLabel(addr, name, True, USER_DEFINED)
  
  def make_function(start, end):
  	next_func_start = getFunctionAfter(start).getEntryPoint()
  	if next_func_start < end:
  		end = next_func_start
  	body = createAddressSet()
  	body.addRange(start, end.subtract(1))
  	functionManager.deleteAddressRange(start, end.subtract(1), getMonitor())
  	func = getFunctionAt(start)
  	if func is None:
  		functionManager.createFunction(None, start, body, USER_DEFINED)
  	else:
  		func.setBody(body)
  
  f = askFile("script.json from Il2cppdumper", "Open")
  data = json.loads(open(f.absolutePath, 'rb').read().decode('utf-8'))
  
  if "ScriptMethod" in data and "ScriptMethod" in processFields:
  	scriptMethods = data["ScriptMethod"]
  	monitor.initialize(len(scriptMethods))
  	monitor.setMessage("Methods")
  	for scriptMethod in scriptMethods:
  		addr = get_addr(scriptMethod["Address"])
  		name = scriptMethod["Name"].encode("utf-8")
  		set_name(addr, name)
  		monitor.incrementProgress(1)
  
  if "ScriptString" in data and "ScriptString" in processFields:
  	index = 1
  	scriptStrings = data["ScriptString"]
  	monitor.initialize(len(scriptStrings))
  	monitor.setMessage("Strings")
  	for scriptString in scriptStrings:
  		addr = get_addr(scriptString["Address"])
  		value = scriptString["Value"].encode("utf-8")
  		name = "StringLiteral_" + str(index)
  		createLabel(addr, name, True, USER_DEFINED)
  		setEOLComment(addr, value)
  		index += 1
  		monitor.incrementProgress(1)
  
  if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
  	scriptMetadatas = data["ScriptMetadata"]
  	monitor.initialize(len(scriptMetadatas))
  	monitor.setMessage("Metadata")
  	for scriptMetadata in scriptMetadatas:
  		addr = get_addr(scriptMetadata["Address"])
  		name = scriptMetadata["Name"].encode("utf-8")
  		set_name(addr, name)
  		setEOLComment(addr, name)
  		monitor.incrementProgress(1)
  
  if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
  	scriptMetadataMethods = data["ScriptMetadataMethod"]
  	monitor.initialize(len(scriptMetadataMethods))
  	monitor.setMessage("Metadata Methods")
  	for scriptMetadataMethod in scriptMetadataMethods:
  		addr = get_addr(scriptMetadataMethod["Address"])
  		name = scriptMetadataMethod["Name"].encode("utf-8")
  		methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
  		set_name(addr, name)
  		setEOLComment(addr, name)
  		monitor.incrementProgress(1)
  
  if "Addresses" in data and "Addresses" in processFields:
  	addresses = data["Addresses"]
  	monitor.initialize(len(addresses))
  	monitor.setMessage("Addresses")
  	for index in range(len(addresses) - 1):
  		start = get_addr(addresses[index])
  		end = get_addr(addresses[index + 1])
  		make_function(start, end)
  		monitor.incrementProgress(1)
  
  print 'Script finished!'
  
  
subject: Add progress bar to Ghidra script