SimsWorld/ComponentBasic/BehaviorPerform.h

119 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "componentbasic.h"
#include <messagebasic.h>
/// <summary>
/// 行为树实例化节点
/// </summary>
class COMPONENTBASIC_EXPORT MapHost : public Serializable {
private:
/// <summary>
/// {Topicinit-value}
/// </summary>
QHash<QString, std::shared_ptr<TopicData>> _variable_types;
/// <summary>
/// 变量表
/// </summary>
QHash<QString, std::shared_ptr<TopicData>> _variable_map;
public:
virtual ~MapHost() = default;
/// <summary>
/// 注册数据类型
/// </summary>
/// <param name="init"></param>
virtual void registData(std::shared_ptr<TopicData> init) = 0;
/// <summary>
/// 设置变量如果类型错误会抛出UniException异常
/// 节点初始化时会按照配置注册默认值变量
/// </summary>
virtual void setVariable(const QString& key, std::shared_ptr<TopicData> ins);
/// <summary>
/// 获取指定名称的数据变量
/// </summary>
/// <param name="key"></param>
/// <returns>如果不存在指定名称数据返回nullptr类型不确定</returns>
virtual std::shared_ptr<TopicData> getVariable(const QString& key) const;
};
/// <summary>
/// 所有逻辑节点的基类
/// </summary>
class LogicalNode : public Serializable {
public:
virtual ~LogicalNode() = default;
/// <summary>
/// 设置节点id
/// </summary>
/// <param name="unique_id"></param>
virtual void setID(int unique_id) = 0;
/// <summary>
/// 提取节点id
/// </summary>
/// <returns></returns>
virtual int getID() const = 0;
/// <summary>
/// 获取节点名称
/// </summary>
/// <returns></returns>
virtual QString name() const = 0;
/// <summary>
/// 获取子节点列表
/// </summary>
/// <returns></returns>
virtual QList<std::shared_ptr<LogicalNode>> children() const = 0;
/// <summary>
/// 声明输入变量的内部标识和数据接口
/// </summary>
/// <returns>map{name, type}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> inputDeclares() const = 0;
/// <summary>
/// 声明输出变量的内部标识和数据接口
/// </summary>
/// <returns>map{name, type}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> outputDeclares() const = 0;
};
/// <summary>
/// 自定义行为树节点实例
/// </summary>
class COMPONENTBASIC_EXPORT BehaviorMapNode : public MapHost, public LogicalNode {
public:
/// <summary>
/// 重置行为树数据文件
/// </summary>
/// <param name="path"></param>
virtual void setBehaviorMap(const QString &path){}
/// <summary>
/// 设置行为树节点名称
/// </summary>
/// <param name="val"></param>
virtual void resetName(const QString &val){}
};
/// <summary>
/// 行为树组件
/// </summary>
class COMPONENTBASIC_EXPORT BehaviorPerformPlugin : public ProcList<
WsRespond<SyncRequest, RespondDefault>
>{
private:
std::weak_ptr<WsEntity> _bind_entity;
public:
// 通过 ProcList 继承
void execute(std::shared_ptr<Immediate> map, std::shared_ptr<const SyncRequest> in, QList<std::shared_ptr<RespondDefault>>& out) override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
std::shared_ptr<WsComponent> defaultNew() const override;
void bindEntity(std::weak_ptr<WsEntity> host) override;
QString name() const override;
};