aboutsummaryrefslogtreecommitdiff
path: root/advtrains/speed.lua
blob: ec4f92807ceb208d9bb8df9fd2a94763d9cb97bf (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
-- auxiliary functions for the reworked speed restriction system

local function s_lessp(a, b)
	if not a or a == -1 then
		return false
	elseif not b or b == -1 then
		return true
	else
		return a < b
	end
end

local function s_greaterp(a, b)
	return s_lessp(b, a)
end

local function s_not_lessp(a, b)
	return not s_lessp(a, b)
end

local function s_not_greaterp(a, b)
	return not s_greaterp(a, b)
end

local function s_equalp(a, b)
	return (a or -1) == (b or -1)
end

local function s_not_equalp(a, b)
	return (a or -1) ~= (b or -1)
end

local function s_max(a, b)
	if s_lessp(a, b) then
		return b
	else
		return a
	end
end

local function s_min(a, b)
	if s_lessp(a, b) then
		return a
	else
		return b
	end
end

local function get_speed_restriction_from_table (tbl)
	local strictest = -1
	for _, v in pairs(tbl) do
		strictest = s_min(strictest, v)
	end
	if strictest == -1 then
		return nil
	end
	return strictest
end

local function set_speed_restriction (tbl, rtype, rval)
	if rval then
		tbl[rtype or "main"] = rval
	end
	return tbl
end

local function set_speed_restriction_for_train (train, rtype, rval)
	local t = train.speed_restrictions_t or {main = train.speed_restriction}
	train.speed_restrictions_t = set_speed_restriction(t, rtype, rval)
	train.speed_restriction = get_speed_restriction_from_table(t)
end

local function merge_speed_restriction_from_aspect_to_train (train, asp)
	return set_speed_restriction_for_train(train, asp.type, asp.main)
end

return {
	lessp = s_lessp,
	greaterp = s_greaterp,
	not_lessp = s_not_lessp,
	not_greaterp = s_not_greaterp,
	equalp = s_equalp,
	not_equalp = s_not_equalp,
	max = s_max,
	min = s_min,
	set_restriction = set_speed_restriction_for_train,
	merge_aspect = merge_speed_restriction_from_aspect_to_train,
}
pan class="hl opt">; }; class EmergeManager { public: const NodeDefManager *ndef; bool enable_mapgen_debug_info; // Generation Notify u32 gen_notify_on = 0; std::set<u32> gen_notify_on_deco_ids; // Parameters passed to mapgens owned by ServerMap // TODO(hmmmm): Remove this after mapgen helper methods using them // are moved to ServerMap MapgenParams *mgparams; // Hackish workaround: // For now, EmergeManager must hold onto a ptr to the Map's setting manager // since the Map can only be accessed through the Environment, and the // Environment is not created until after script initialization. MapSettingsManager *map_settings_mgr; // Managers of various map generation-related components BiomeManager *biomemgr; OreManager *oremgr; DecorationManager *decomgr; SchematicManager *schemmgr; // Methods EmergeManager(Server *server); ~EmergeManager(); DISABLE_CLASS_COPY(EmergeManager); bool initMapgens(MapgenParams *mgparams); void startThreads(); void stopThreads(); bool isRunning(); bool enqueueBlockEmerge( session_t peer_id, v3s16 blockpos, bool allow_generate, bool ignore_queue_limits=false); bool enqueueBlockEmergeEx( v3s16 blockpos, session_t peer_id, u16 flags, EmergeCompletionCallback callback, void *callback_param); v3s16 getContainingChunk(v3s16 blockpos); Mapgen *getCurrentMapgen(); // Mapgen helpers methods int getSpawnLevelAtPoint(v2s16 p); int getGroundLevelAtPoint(v2s16 p); bool isBlockUnderground(v3s16 blockpos); static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); private: std::vector<Mapgen *> m_mapgens; std::vector<EmergeThread *> m_threads; bool m_threads_active = false; std::mutex m_queue_mutex; std::map<v3s16, BlockEmergeData> m_blocks_enqueued; std::unordered_map<u16, u16> m_peer_queue_count; u16 m_qlimit_total; u16 m_qlimit_diskonly; u16 m_qlimit_generate; // Requires m_queue_mutex held EmergeThread *getOptimalThread(); bool pushBlockEmergeData( v3s16 pos, u16 peer_requested, u16 flags, EmergeCompletionCallback callback, void *callback_param, bool *entry_already_exists); bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata); friend class EmergeThread; };