Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
blockmodifier.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2017 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include <string>
8#include <vector>
9#include <map>
10#include <unordered_set>
11#include <unordered_map>
12
13#include "irr_v3d.h"
14#include "mapnode.h"
15
17class ServerMap;
18class MapBlock;
19class IGameDef;
20
21/*
22 ABMs
23*/
24
26{
27public:
29 virtual ~ActiveBlockModifier() = default;
30
31 // Set of contents to trigger on
32 virtual const std::vector<std::string> &getTriggerContents() const = 0;
33 // Set of required neighbors (trigger doesn't happen if none are found)
34 // Empty = do not check neighbors
35 virtual const std::vector<std::string> &getRequiredNeighbors() const = 0;
36 // Set of without neighbors (trigger doesn't happen if any are found)
37 // Empty = do not check neighbors
38 virtual const std::vector<std::string> &getWithoutNeighbors() const = 0;
39 // Trigger interval in seconds
40 virtual float getTriggerInterval() = 0;
41 // Random chance of (1 / return value), 0 is disallowed
42 virtual u32 getTriggerChance() = 0;
43 // Whether to modify chance to simulate time lost by an unnattended block
44 virtual bool getSimpleCatchUp() = 0;
45 // get min Y for apply abm
46 virtual s16 getMinY() = 0;
47 // get max Y for apply abm
48 virtual s16 getMaxY() = 0;
49 // This is called usually at interval for 1/chance of the nodes
50 virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){};
51 virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n,
52 u32 active_object_count, u32 active_object_count_wider){};
53};
54
62
63struct ActiveABM; // hidden
64
66{
68 // vector index = content_t
69 std::vector<std::vector<ActiveABM>*> m_aabms;
70
71public:
72 ABMHandler(std::vector<ABMWithState> &abms,
73 float dtime_s, ServerEnvironment *env,
74 bool use_timers);
76
77 // Find out how many objects the given block and its neighbors contain.
78 // Returns the number of objects in the block, and also in 'wider' the
79 // number of objects in the block and all its neighbors. The latter
80 // may be an estimate if any neighbors are unloaded.
81 static u32 countObjects(MapBlock *block, ServerMap * map, u32 &wider);
82
83 void apply(MapBlock *block, int &blocks_scanned, int &abms_run, int &blocks_cached);
84};
85
86/*
87 LBMs
88*/
89
90#define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:"
91
93{
94 // Set of contents to trigger on
95 std::vector<std::string> trigger_contents;
96 std::string name;
97 bool run_at_every_load = false;
98
99 virtual ~LoadingBlockModifierDef() = default;
100
106 virtual void trigger(ServerEnvironment *env, MapBlock *block,
107 const std::unordered_set<v3s16> &positions, float dtime_s) {};
108};
109
111{
112public:
113 typedef std::vector<LoadingBlockModifierDef*> lbm_vector;
114 typedef std::unordered_map<content_t, lbm_vector> lbm_map;
115
116 LBMContentMapping() = default;
117 void addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef);
118 const lbm_map::mapped_type *lookup(content_t c) const;
119 const lbm_vector &getList() const { return lbm_list; }
120 bool empty() const { return lbm_list.empty(); }
121
122 // This struct owns the LBM pointers.
126
127private:
130};
131
133{
134public:
135 LBMManager() = default;
136 ~LBMManager();
137
138 // Don't call this after loadIntroductionTimes() ran.
139 void addLBMDef(LoadingBlockModifierDef *lbm_def);
140
142 void loadIntroductionTimes(const std::string &times,
143 IGameDef *gamedef, u32 now);
144
145 // Don't call this before loadIntroductionTimes() ran.
146 std::string createIntroductionTimesString();
147
148 // Don't call this before loadIntroductionTimes() ran.
149 void applyLBMs(ServerEnvironment *env, MapBlock *block,
150 u32 stamp, float dtime_s);
151
152 // Warning: do not make this std::unordered_map, order is relevant here
153 typedef std::map<u32, LBMContentMapping> lbm_lookup_map;
154
155private:
156 // Once we set this to true, we can only query,
157 // not modify
158 bool m_query_mode = false;
159
160 // For m_query_mode == false:
161 // The key of the map is the LBM def's name.
162 std::unordered_map<std::string, LoadingBlockModifierDef *> m_lbm_defs;
163
164 // For m_query_mode == true:
165 // The key of the map is the LBM def's first introduction time.
167
169 static std::unordered_map<std::string, u32>
170 parseIntroductionTimesString(const std::string &times);
171
172 // Returns an iterator to the LBMs that were introduced
173 // after the given time. This is guaranteed to return
174 // valid values for everything
175 lbm_lookup_map::const_iterator getLBMsIntroducedAfter(u32 time)
176 { return m_lbm_lookup.lower_bound(time); }
177};
Definition blockmodifier.h:66
~ABMHandler()
Definition blockmodifier.cpp:105
ABMHandler(std::vector< ABMWithState > &abms, float dtime_s, ServerEnvironment *env, bool use_timers)
Definition blockmodifier.cpp:40
std::vector< std::vector< ActiveABM > * > m_aabms
Definition blockmodifier.h:69
void apply(MapBlock *block, int &blocks_scanned, int &abms_run, int &blocks_cached)
Definition blockmodifier.cpp:134
static u32 countObjects(MapBlock *block, ServerMap *map, u32 &wider)
Definition blockmodifier.cpp:111
ServerEnvironment * m_env
Definition blockmodifier.h:67
Definition blockmodifier.h:26
virtual ~ActiveBlockModifier()=default
virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider)
Definition blockmodifier.h:51
virtual const std::vector< std::string > & getRequiredNeighbors() const =0
virtual bool getSimpleCatchUp()=0
virtual const std::vector< std::string > & getTriggerContents() const =0
virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n)
Definition blockmodifier.h:50
virtual s16 getMinY()=0
ActiveBlockModifier()=default
virtual s16 getMaxY()=0
virtual u32 getTriggerChance()=0
virtual const std::vector< std::string > & getWithoutNeighbors() const =0
virtual float getTriggerInterval()=0
Definition gamedef.h:26
Definition blockmodifier.h:111
void addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef)
Definition blockmodifier.cpp:275
bool empty() const
Definition blockmodifier.h:120
lbm_vector lbm_list
Definition blockmodifier.h:128
const lbm_map::mapped_type * lookup(content_t c) const
Definition blockmodifier.cpp:307
DISABLE_CLASS_COPY(LBMContentMapping)
LBMContentMapping()=default
ALLOW_CLASS_MOVE(LBMContentMapping)
const lbm_vector & getList() const
Definition blockmodifier.h:119
~LBMContentMapping()
Definition blockmodifier.cpp:268
lbm_map map
Definition blockmodifier.h:129
std::unordered_map< content_t, lbm_vector > lbm_map
Definition blockmodifier.h:114
std::vector< LoadingBlockModifierDef * > lbm_vector
Definition blockmodifier.h:113
Definition blockmodifier.h:133
static std::unordered_map< std::string, u32 > parseIntroductionTimesString(const std::string &times)
Definition blockmodifier.cpp:424
lbm_lookup_map m_lbm_lookup
Definition blockmodifier.h:166
void addLBMDef(LoadingBlockModifierDef *lbm_def)
Definition blockmodifier.cpp:323
void applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp, float dtime_s)
Definition blockmodifier.cpp:465
std::string createIntroductionTimesString()
Definition blockmodifier.cpp:402
~LBMManager()
Definition blockmodifier.cpp:315
std::map< u32, LBMContentMapping > lbm_lookup_map
Definition blockmodifier.h:153
lbm_lookup_map::const_iterator getLBMsIntroducedAfter(u32 time)
Definition blockmodifier.h:175
bool m_query_mode
Definition blockmodifier.h:158
void loadIntroductionTimes(const std::string &times, IGameDef *gamedef, u32 now)
Definition blockmodifier.cpp:342
std::unordered_map< std::string, LoadingBlockModifierDef * > m_lbm_defs
Definition blockmodifier.h:162
LBMManager()=default
Definition mapblock.h:58
Definition serverenvironment.h:113
Definition servermap.h:43
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
u16 content_t
Definition mapnode.h:21
Definition blockmodifier.h:56
ABMWithState(ActiveBlockModifier *abm_)
Definition blockmodifier.cpp:18
float timer
Definition blockmodifier.h:58
ActiveBlockModifier * abm
Definition blockmodifier.h:57
Definition blockmodifier.cpp:30
Definition blockmodifier.h:93
std::string name
Definition blockmodifier.h:96
bool run_at_every_load
Definition blockmodifier.h:97
virtual ~LoadingBlockModifierDef()=default
std::vector< std::string > trigger_contents
Definition blockmodifier.h:95
virtual void trigger(ServerEnvironment *env, MapBlock *block, const std::unordered_set< v3s16 > &positions, float dtime_s)
Called to invoke LBM.
Definition blockmodifier.h:106
Definition mapnode.h:123
static std::string p(std::string path)
Definition test_filesys.cpp:64