mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-27 17:28:41 +00:00
Redefine NodeResolver interface and replace with callback mechanism
This commit is contained in:
parent
3ea5ed4ffe
commit
b67f37f27e
16 changed files with 278 additions and 364 deletions
168
src/nodedef.h
168
src/nodedef.h
|
@ -40,8 +40,6 @@ class IShaderSource;
|
|||
class IGameDef;
|
||||
|
||||
typedef std::list<std::pair<content_t, int> > GroupItems;
|
||||
typedef std::list<std::pair<std::string, std::vector<content_t> *> >
|
||||
ContentVectorResolveList;
|
||||
|
||||
enum ContentParamType
|
||||
{
|
||||
|
@ -284,125 +282,18 @@ struct ContentFeatures
|
|||
}
|
||||
};
|
||||
|
||||
class NodeResolver;
|
||||
class INodeDefManager;
|
||||
|
||||
struct NodeResolveInfo {
|
||||
std::string n_wanted;
|
||||
std::string n_alt;
|
||||
content_t c_fallback;
|
||||
content_t *output;
|
||||
};
|
||||
NodeResolveInfo(NodeResolver *nr)
|
||||
{
|
||||
resolver = nr;
|
||||
}
|
||||
|
||||
#define NR_STATUS_FAILURE 0
|
||||
#define NR_STATUS_PENDING 1
|
||||
#define NR_STATUS_SUCCESS 2
|
||||
|
||||
/**
|
||||
NodeResolver
|
||||
|
||||
NodeResolver attempts to resolve node names to content ID integers. If the
|
||||
node registration phase has not yet finished at the time the resolution
|
||||
request is placed, the request is marked as pending and added to an internal
|
||||
queue. The name resolution request is later satisfied by writing directly
|
||||
to the output location when the node registration phase has been completed.
|
||||
|
||||
This is primarily intended to be used for objects registered during script
|
||||
initialization (i.e. while nodes are being registered) that reference
|
||||
particular nodes.
|
||||
*/
|
||||
class NodeResolver {
|
||||
public:
|
||||
NodeResolver(INodeDefManager *ndef);
|
||||
~NodeResolver();
|
||||
|
||||
/**
|
||||
Add a request to resolve the node n_wanted and set *content to the
|
||||
result, or alternatively, n_alt if n_wanted is not found. If n_alt
|
||||
cannot be found either, or has not been specified, *content is set
|
||||
to c_fallback.
|
||||
|
||||
If node registration is complete, the request is finished immediately
|
||||
and NR_STATUS_SUCCESS is returned (or NR_STATUS_FAILURE if no node can
|
||||
be found). Otherwise, NR_STATUS_PENDING is returned and the resolution
|
||||
request is queued.
|
||||
|
||||
N.B. If the memory in which content is located has been deallocated
|
||||
before the pending request had been satisfied, cancelNode() must be
|
||||
called.
|
||||
|
||||
@param n_wanted Name of node that is wanted.
|
||||
@param n_alt Name of node in case n_wanted could not be found. Blank
|
||||
if no alternative node is desired.
|
||||
@param c_fallback Content ID that content is set to in case of node
|
||||
resolution failure (should be CONTENT_AIR, CONTENT_IGNORE, etc.)
|
||||
@param content Pointer to content_t that receives the result of the
|
||||
node name resolution.
|
||||
@return Status of node resolution request.
|
||||
*/
|
||||
int addNode(const std::string &n_wanted, const std::string &n_alt,
|
||||
content_t c_fallback, content_t *content);
|
||||
|
||||
/**
|
||||
Add a request to resolve the node(s) specified by nodename.
|
||||
|
||||
If node registration is complete, the request is finished immediately
|
||||
and NR_STATUS_SUCCESS is returned if at least one node is resolved; if
|
||||
zero were resolved, NR_STATUS_FAILURE. Otherwise, NR_STATUS_PENDING is
|
||||
returned and the resolution request is queued.
|
||||
|
||||
N.B. If the memory in which content_vec is located has been deallocated
|
||||
before the pending request had been satisfied, cancelNodeList() must be
|
||||
called.
|
||||
|
||||
@param nodename Name of node (or node group) to be resolved.
|
||||
@param content_vec Pointer to content_t vector onto which the results
|
||||
are added.
|
||||
|
||||
@return Status of node resolution request.
|
||||
*/
|
||||
int addNodeList(const std::string &nodename,
|
||||
std::vector<content_t> *content_vec);
|
||||
|
||||
/**
|
||||
Removes all pending requests from the resolution queue with the output
|
||||
address of 'content'.
|
||||
|
||||
@param content Location of the content ID for the request being
|
||||
cancelled.
|
||||
@return Number of pending requests cancelled.
|
||||
*/
|
||||
bool cancelNode(content_t *content);
|
||||
|
||||
/**
|
||||
Removes all pending requests from the resolution queue with the output
|
||||
address of 'content_vec'.
|
||||
|
||||
@param content_vec Location of the content ID vector for requests being
|
||||
cancelled.
|
||||
@return Number of pending requests cancelled.
|
||||
*/
|
||||
int cancelNodeList(std::vector<content_t> *content_vec);
|
||||
|
||||
/**
|
||||
Carries out all pending node resolution requests. Call this when the
|
||||
node registration phase has completed.
|
||||
|
||||
Internally marks node registration as complete.
|
||||
|
||||
@return Number of failed pending requests.
|
||||
*/
|
||||
int resolveNodes();
|
||||
|
||||
/**
|
||||
Returns the status of the node registration phase.
|
||||
|
||||
@return Boolean of whether the registration phase is complete.
|
||||
*/
|
||||
bool isNodeRegFinished() { return m_is_node_registration_complete; }
|
||||
|
||||
private:
|
||||
INodeDefManager *m_ndef;
|
||||
bool m_is_node_registration_complete;
|
||||
std::list<NodeResolveInfo *> m_pending_contents;
|
||||
ContentVectorResolveList m_pending_content_vecs;
|
||||
std::list<std::string> nodenames;
|
||||
std::list<size_t> nodename_sizes;
|
||||
NodeResolver *resolver;
|
||||
};
|
||||
|
||||
class INodeDefManager
|
||||
|
@ -422,7 +313,14 @@ public:
|
|||
|
||||
virtual void serialize(std::ostream &os, u16 protocol_version)=0;
|
||||
|
||||
virtual NodeResolver *getResolver()=0;
|
||||
virtual void pendNodeResolve(NodeResolveInfo *nri)=0;
|
||||
virtual void cancelNodeResolve(NodeResolver *resolver)=0;
|
||||
virtual void runNodeResolverCallbacks()=0;
|
||||
|
||||
virtual bool getIdFromResolveInfo(NodeResolveInfo *nri,
|
||||
const std::string &node_alt, content_t c_fallback, content_t &result)=0;
|
||||
virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri,
|
||||
std::vector<content_t> &result)=0;
|
||||
};
|
||||
|
||||
class IWritableNodeDefManager : public INodeDefManager
|
||||
|
@ -464,10 +362,38 @@ public:
|
|||
virtual void serialize(std::ostream &os, u16 protocol_version)=0;
|
||||
virtual void deSerialize(std::istream &is)=0;
|
||||
|
||||
virtual NodeResolver *getResolver()=0;
|
||||
virtual void pendNodeResolve(NodeResolveInfo *nri)=0;
|
||||
virtual void cancelNodeResolve(NodeResolver *resolver)=0;
|
||||
virtual void runNodeResolverCallbacks()=0;
|
||||
|
||||
virtual bool getIdFromResolveInfo(NodeResolveInfo *nri,
|
||||
const std::string &node_alt, content_t c_fallback, content_t &result)=0;
|
||||
virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri,
|
||||
std::vector<content_t> &result)=0;
|
||||
};
|
||||
|
||||
IWritableNodeDefManager *createNodeDefManager();
|
||||
|
||||
class NodeResolver {
|
||||
public:
|
||||
NodeResolver()
|
||||
{
|
||||
m_lookup_done = false;
|
||||
m_ndef = NULL;
|
||||
}
|
||||
|
||||
~NodeResolver()
|
||||
{
|
||||
if (!m_lookup_done)
|
||||
m_ndef->cancelNodeResolve(this);
|
||||
}
|
||||
|
||||
virtual void resolveNodeNames(NodeResolveInfo *nri) = 0;
|
||||
|
||||
bool m_lookup_done;
|
||||
INodeDefManager *m_ndef;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue