CityMadePurchase event handler

danguru

Chieftain
Joined
Dec 30, 2011
Messages
25
I added an event handler to look at the "CityMadePurchase" event. Somewhere I determined that the parameters are:
function OnCityMadePurchase(owner:number, cityID:number, plotX:number, plotY:number, purchaseType, objectType)

I can see when I buy a unit the ObjectType == unitID (index) of the GameInfo.Units table.
The purchase type is large number that is not obvious what it is. Anytime I buy a unit I get the same number. Buying a tile I get a different number as expected.
Buying a building I get a 3rd number as expected.

The problem is I am unsure where these values came from and what to they represent.
Is it a reference to something? Is it an integer with different fields (subvalues)?

Anyone have a clue?

Thanks
 
They're internal hash numbers corresponding to an internal event sub type.
Code:
function CityMadePurchaseListener(iPlayer, CityID, PlotX, PlotY, ItemTypeReference, iItemId)
	--EventSubTypes.BUILDING	-660405657
	--EventSubTypes.UNIT		366026264
	--EventSubTypes.PLOT		2010226114
	local BuildingHashValue = -660405657
	local UnitHashValue = 366026264
	local PlotHashValue = 2010226114
	local pCity = Players[iPlayer]:GetCities():FindID(CityID)
	local sCityName = Locale.Lookup(pCity:GetName())
	local pPlot = Map.GetPlot(PlotX, PlotY)
	local iPlotID = pPlot:GetIndex()
	if (ItemTypeReference == BuildingHashValue) then
		print("[CityMadePurchaseListener] Purchased ItemTypeReference was a Building")
	elseif (ItemTypeReference == UnitHashValue) then
		print("[CityMadePurchaseListener] Purchased ItemTypeReference was a Unit")
	elseif (ItemTypeReference == PlotHashValue) then
		print("[CityMadePurchaseListener] Purchased ItemTypeReference was a Plot")
	else
		print("[CityMadePurchaseListener] Purchased ItemTypeReference was not a Building, Unit, or Plot or was of an unknown item-type")
	end
	--- more code snipped out
end
Events.CityMadePurchase.Add(CityMadePurchaseListener)
Most but not all other event handlers use simple integers that conform to this usage
Code:
ItemType = 0 : -> UNIT
ItemType = 1 : -> BUILDING
ItemType = 2 : -> DISTRICT
ItemType = 3 : -> PROJECT
But the CityMadePurchase event sends the hash values instead. Generally if an event hook sends an oddball integer value like -1851407529 it's an internal hash number that is being sent. You just have to figure out which hash number conforms to what sort of data, ie Building, Unit, Project, etc.

These are an assortment of the EventSubTypes used in the lua system but it is not a complete list -- it dates back to early days of Vanilla. The function will return the text string for the associated EventSubType and will return text string "NONE" if the integer value does not associate to any of the EventSubTypes listed within the function.
Code:
function GetEventSubTypeString(iData)
	if type(iData) == "number" then
		if iData == EventSubTypes.BUILDING then
			return "EventSubTypes.BUILDING"
		elseif iData == EventSubTypes.UNIT then
			return "EventSubTypes.UNIT"
		elseif iData == EventSubTypes.PLOT then
			return "EventSubTypes.PLOT"
		elseif iData == EventSubTypes.FOUND_CITY then
			return "EventSubTypes.FOUND_CITY"
		elseif iData == EventSubTypes.CONVERT_BARBARIAN then
			return "EventSubTypes.CONVERT_BARBARIAN"
		elseif iData == EventSubTypes.PLANT_FOREST then
			return "EventSubTypes.PLANT_FOREST"
		elseif iData == EventSubTypes.CREATE_GREAT_WORK then
			return "EventSubTypes.CREATE_GREAT_WORK"
		elseif iData == EventSubTypes.PILLAGE then
			return "EventSubTypes.PILLAGE"
		elseif iData == EventSubTypes.CREATE_DISTRICT then
			return "EventSubTypes.CREATE_DISTRICT"
		elseif iData == EventSubTypes.PROJECT then
			return "EventSubTypes.PROJECT"
		elseif iData == EventSubTypes.SPREAD_RELIGION then
			return "EventSubTypes.SPREAD_RELIGION"
		elseif iData == EventSubTypes.ADD then
			return "EventSubTypes.ADD"
		elseif iData == EventSubTypes.REMOVE_FEATURE then
			return "EventSubTypes.REMOVE_FEATURE"
		elseif iData == EventSubTypes.DAMAGE then
			return "EventSubTypes.DAMAGE"
		elseif iData == EventSubTypes.HARVEST_RESOURCE then
			return "EventSubTypes.HARVEST_RESOURCE"
		elseif iData == EventSubTypes.REPAIR then
			return "EventSubTypes.REPAIR"
		elseif iData == EventSubTypes.REMOVE then
			return "EventSubTypes.REMOVE"
		elseif iData == EventSubTypes.CREATE_WONDER then
			return "EventSubTypes.CREATE_WONDER"
		elseif iData == EventSubTypes.DISTRICT then
			return "EventSubTypes.DISTRICT"
		elseif iData == EventSubTypes.CLEAR_CONTAMINATION then
			return "EventSubTypes.CLEAR_CONTAMINATION"
		elseif iData == EventSubTypes.LAUNCH_INQUISITION then
			return "EventSubTypes.LAUNCH_INQUISITION"
		elseif iData == EventSubTypes.FOUND_RELIGION then
			return "EventSubTypes.FOUND_RELIGION"
		elseif iData == EventSubTypes.REMOVE_HERESY then
			return "EventSubTypes.REMOVE_HERESY"
		elseif iData == EventSubTypes.EXTRACT_ARTIFACT then
			return "EventSubTypes.EXTRACT_ARTIFACT"
		elseif iData == EventSubTypes.EVANGELIZE_BELIEF then
			return "EventSubTypes.EVANGELIZE_BELIEF"
		elseif iData == EventSubTypes.CREATE_TRADE_ROUTE then
			return "EventSubTypes.CREATE_TRADE_ROUTE"
		elseif iData == EventSubTypes.CREATE_ROUTE then
			return "EventSubTypes.CREATE_ROUTE"
		elseif iData == EventSubTypes.PILLAGED then
			return "EventSubTypes.PILLAGED"
		elseif iData == EventSubTypes.CREATE_IMPROVEMENT then
			return "EventSubTypes.CREATE_IMPROVEMENT"
		elseif iData == EventSubTypes.VISIBILITY then
			return "EventSubTypes.VISIBILITY"
		elseif iData == EventSubTypes.COMPLETION then
			return "EventSubTypes.COMPLETION"
		elseif iData == EventSubTypes.COMBAT then
			return "EventSubTypes.COMBAT"
		end
	end
	return "NONE"
end
 
OK. Thanks. I get those values so I guess they are consistent across users/versions for now.
Is there a space/document that modders store this kind of information?
 
Executing the following in a GameplayScript:

Code:
print("-----------------------------------------------------------------")
print("                Printing table EventSubTypes")
print("-----------------------------------------------------------------")
for Key,Value in pairs(EventSubTypes) do
	print("EventSubTypes." .. tostring(Key) .. " = " .. tostring(Value))
end
print("-----------------------------------------------------------------")

I get this for the table EventSubTypes

Code:
MyCiv6Changes_Gameplay: -----------------------------------------------------------------
MyCiv6Changes_Gameplay:                 Printing table EventSubTypes
MyCiv6Changes_Gameplay: -----------------------------------------------------------------
MyCiv6Changes_Gameplay: EventSubTypes.SPREAD_RELIGION = -806509670
MyCiv6Changes_Gameplay: EventSubTypes.CONVERT_BARBARIAN = 1892712414
MyCiv6Changes_Gameplay: EventSubTypes.LAUNCH_INQUISITION = 1662217542
MyCiv6Changes_Gameplay: EventSubTypes.CREATE_TRADE_ROUTE = 1760038764
MyCiv6Changes_Gameplay: EventSubTypes.COMBAT = -2108236831
MyCiv6Changes_Gameplay: EventSubTypes.REMOVE_FEATURE = -1308035672
MyCiv6Changes_Gameplay: EventSubTypes.CREATE_ROUTE = 1531636673
MyCiv6Changes_Gameplay: EventSubTypes.FOUND_RELIGION = -1529151563
MyCiv6Changes_Gameplay: EventSubTypes.TOURISM_BOMB = 1204466125
MyCiv6Changes_Gameplay: EventSubTypes.VISIBILITY = -1511087680
MyCiv6Changes_Gameplay: EventSubTypes.DISTRICT = 135083828
MyCiv6Changes_Gameplay: EventSubTypes.EXTRACT_ARTIFACT = 1133412002
MyCiv6Changes_Gameplay: EventSubTypes.CREATE_WONDER = -1565627832
MyCiv6Changes_Gameplay: EventSubTypes.HARVEST_RESOURCE = 422313589
MyCiv6Changes_Gameplay: EventSubTypes.CREATE_DISTRICT = -1318797236
MyCiv6Changes_Gameplay: EventSubTypes.PILLAGE = -318354571
MyCiv6Changes_Gameplay: EventSubTypes.ACCEPT_RELIGIOUS_HEAL = -1931863034
MyCiv6Changes_Gameplay: EventSubTypes.PLOT = 2010226114
MyCiv6Changes_Gameplay: EventSubTypes.PLANT_FOREST = -289600180
MyCiv6Changes_Gameplay: EventSubTypes.DAMAGE = 516910101
MyCiv6Changes_Gameplay: EventSubTypes.UNIT = 366026264
MyCiv6Changes_Gameplay: EventSubTypes.FOUND_CITY = -1828126782
MyCiv6Changes_Gameplay: EventSubTypes.REMOVE_HERESY = 288665268
MyCiv6Changes_Gameplay: EventSubTypes.COMPLETION = -860432962
MyCiv6Changes_Gameplay: EventSubTypes.CLEAR_CONTAMINATION = 1112582991
MyCiv6Changes_Gameplay: EventSubTypes.REMOVE = 1736910153
MyCiv6Changes_Gameplay: EventSubTypes.PILLAGED = 1362298481
MyCiv6Changes_Gameplay: EventSubTypes.CREATE_GREAT_WORK = 306853151
MyCiv6Changes_Gameplay: EventSubTypes.GIVE_RELIGIOUS_HEAL = -61448258
MyCiv6Changes_Gameplay: EventSubTypes.ADD = -1807561070
MyCiv6Changes_Gameplay: EventSubTypes.REPAIR = -2115826600
MyCiv6Changes_Gameplay: EventSubTypes.EVANGELIZE_BELIEF = 385235009
MyCiv6Changes_Gameplay: EventSubTypes.BUILDING = -660405657
MyCiv6Changes_Gameplay: EventSubTypes.CREATE_IMPROVEMENT = -414333283
MyCiv6Changes_Gameplay: EventSubTypes.PROJECT = -284569333
MyCiv6Changes_Gameplay: -----------------------------------------------------------------
 
Top Bottom