summaryrefslogtreecommitdiff
path: root/games/minimal/mods/errorhandler_test/init.lua
blob: 9d1535c1d834c808ac69ed577d6f91b36317e14c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
--
-- exception handler test module
--
--
-- To avoid this from crashing the module will startup in inactive mode.
-- to make specific errors happen you need to cause them by following
-- chat command:
--
-- exceptiontest <location> <errortype>
--
-- location has to be one of:
--   * mapgen:          cause in next on_generate call
--   * entity_step:     spawn a entity and make it do error in on_step
--   * globalstep:      do error in next globalstep
--   * immediate:       cause right in chat handler
--
-- errortypes defined are:
--   * segv:            make sigsegv happen
--   * zerodivision:    cause a division by zero to happen
--   * exception:       throw an exception

if core.cause_error == nil or
	type(core.cause_error) ~= "function" then
	return
end
	

core.log("action", "WARNING: loading exception handler test module!")

local exceptiondata = {
	tocause = "none",
	mapgen = false,
	entity_step = false,
	globalstep = false,
}

local exception_entity =
{
	on_step = function(self, dtime)
		if exceptiondata.entity_step then
			core.cause_error(exceptiondata.tocause)
		end
	end,
}
local exception_entity_name = "errorhandler_test:error_entity"

local function exception_chat_handler(playername, param)
	local parameters = param:split(" ")
	
	if #parameters ~= 2 then
		core.chat_send_player(playername, "Invalid argument count for exceptiontest")
	end
	
	core.log("error", "Causing error at:" .. parameters[1])
	
	if parameters[1] == "mapgen" then
		exceptiondata.tocause = parameters[2]
		exceptiondata.mapgen = true
	elseif parameters[1] == "entity_step" then
		--spawn entity at player location
		local player = core.get_player_by_name(playername)
		
		if player:is_player() then
			local pos = player:getpos()
			
			core.add_entity(pos, exception_entity_name)
		end
		
		exceptiondata.tocause = parameters[2]
		exceptiondata.entity_step = true
		
	elseif parameters[1] == "globalstep" then
		exceptiondata.tocause = parameters[2]
		exceptiondata.globalstep = true
		
	elseif parameters[1] == "immediate" then
		core.cause_error(parameters[2])
		
	else
		core.chat_send_player(playername, "Invalid error location: " .. dump(parameters[1]))
	end
end

core.register_chatcommand("exceptiontest",
	{
		params      = "<location> <errortype>",
		description = "cause a given error to happen.\n" ..
				" location=(mapgen,entity_step,globalstep,immediate)\n" ..
				" errortype=(segv,zerodivision,exception)",
		func        = exception_chat_handler,
		privs       = { server=true }
	})
	
core.register_globalstep(function(dtime)
	if exceptiondata.globalstep then
		core.cause_error(exceptiondata.tocause)
	end
end)

core.register_on_generated(function(minp, maxp, blockseed)
	if exceptiondata.mapgen then
		core.cause_error(exceptiondata.tocause)
	end
end)

core.register_entity(exception_entity_name, exception_entity)