mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-11-04 14:42:02 +00:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/main'
This commit is contained in:
		@@ -4,9 +4,9 @@
 | 
			
		||||
//! Constructor
 | 
			
		||||
CDBehaviorParameterTable::CDBehaviorParameterTable(void) {
 | 
			
		||||
	auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM BehaviorParameter");
 | 
			
		||||
	size_t hash = 0;
 | 
			
		||||
	uint32_t uniqueParameterId = 0;
 | 
			
		||||
	uint64_t hash = 0;
 | 
			
		||||
	while (!tableData.eof()) {
 | 
			
		||||
		hash = 0;
 | 
			
		||||
		CDBehaviorParameter entry;
 | 
			
		||||
		entry.behaviorID = tableData.getIntField(0, -1);
 | 
			
		||||
		auto candidateStringToAdd = std::string(tableData.getStringField(1, ""));
 | 
			
		||||
@@ -14,15 +14,13 @@ CDBehaviorParameterTable::CDBehaviorParameterTable(void) {
 | 
			
		||||
		if (parameter != m_ParametersList.end()) {
 | 
			
		||||
			entry.parameterID = parameter;
 | 
			
		||||
		} else {
 | 
			
		||||
			entry.parameterID = m_ParametersList.insert(candidateStringToAdd).first;
 | 
			
		||||
			entry.parameterID = m_ParametersList.insert(std::make_pair(candidateStringToAdd, uniqueParameterId)).first;
 | 
			
		||||
			uniqueParameterId++;
 | 
			
		||||
		}
 | 
			
		||||
		hash = entry.behaviorID;
 | 
			
		||||
		hash = (hash << 31U) | entry.parameterID->second;
 | 
			
		||||
		entry.value = tableData.getFloatField(2, -1.0f);
 | 
			
		||||
 | 
			
		||||
		GeneralUtils::hash_combine(hash, entry.behaviorID);
 | 
			
		||||
		GeneralUtils::hash_combine(hash, *entry.parameterID);
 | 
			
		||||
 | 
			
		||||
		auto it = m_Entries.find(entry.behaviorID);
 | 
			
		||||
		m_ParametersList.insert(*entry.parameterID);
 | 
			
		||||
		m_Entries.insert(std::make_pair(hash, entry));
 | 
			
		||||
 | 
			
		||||
		tableData.nextRow();
 | 
			
		||||
@@ -38,31 +36,28 @@ std::string CDBehaviorParameterTable::GetName(void) const {
 | 
			
		||||
	return "BehaviorParameter";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CDBehaviorParameter CDBehaviorParameterTable::GetEntry(const uint32_t behaviorID, const std::string& name, const float defaultValue) {
 | 
			
		||||
	CDBehaviorParameter returnValue;
 | 
			
		||||
	returnValue.behaviorID = 0;
 | 
			
		||||
	returnValue.parameterID = m_ParametersList.end();
 | 
			
		||||
	returnValue.value = defaultValue;
 | 
			
		||||
float CDBehaviorParameterTable::GetValue(const uint32_t behaviorID, const std::string& name, const float defaultValue) {
 | 
			
		||||
	auto parameterID = this->m_ParametersList.find(name);
 | 
			
		||||
	if (parameterID == this->m_ParametersList.end()) return defaultValue;
 | 
			
		||||
 | 
			
		||||
	size_t hash = 0;
 | 
			
		||||
	GeneralUtils::hash_combine(hash, behaviorID);
 | 
			
		||||
	GeneralUtils::hash_combine(hash, name);
 | 
			
		||||
	uint64_t hash = behaviorID;
 | 
			
		||||
 | 
			
		||||
	hash = (hash << 31U) | parameterID->second;
 | 
			
		||||
 | 
			
		||||
	// Search for specific parameter
 | 
			
		||||
	const auto& it = m_Entries.find(hash);
 | 
			
		||||
	return it != m_Entries.end() ? it->second : returnValue;
 | 
			
		||||
	return it != m_Entries.end() ? it->second.value : defaultValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::map<std::string, float> CDBehaviorParameterTable::GetParametersByBehaviorID(uint32_t behaviorID) {
 | 
			
		||||
	size_t hash;
 | 
			
		||||
	uint64_t hashBase = behaviorID;
 | 
			
		||||
	std::map<std::string, float> returnInfo;
 | 
			
		||||
	for (auto parameterCandidate : m_ParametersList) {
 | 
			
		||||
		hash = 0;
 | 
			
		||||
		GeneralUtils::hash_combine(hash, behaviorID);
 | 
			
		||||
		GeneralUtils::hash_combine(hash, parameterCandidate);
 | 
			
		||||
	uint64_t hash;
 | 
			
		||||
	for (auto& parameterCandidate : m_ParametersList) {
 | 
			
		||||
		hash = (hashBase << 31U) | parameterCandidate.second;
 | 
			
		||||
		auto infoCandidate = m_Entries.find(hash);
 | 
			
		||||
		if (infoCandidate != m_Entries.end()) {
 | 
			
		||||
			returnInfo.insert(std::make_pair(*(infoCandidate->second.parameterID), infoCandidate->second.value));
 | 
			
		||||
			returnInfo.insert(std::make_pair(infoCandidate->second.parameterID->first, infoCandidate->second.value));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return returnInfo;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,16 +12,16 @@
 | 
			
		||||
 | 
			
		||||
 //! BehaviorParameter Entry Struct
 | 
			
		||||
struct CDBehaviorParameter {
 | 
			
		||||
	unsigned int behaviorID;                                    //!< The Behavior ID
 | 
			
		||||
	std::unordered_set<std::string>::iterator parameterID;      //!< The Parameter ID
 | 
			
		||||
	float value;                                                //!< The value of the behavior template
 | 
			
		||||
	unsigned int behaviorID;											//!< The Behavior ID
 | 
			
		||||
	std::unordered_map<std::string, uint32_t>::iterator parameterID;   	//!< The Parameter ID
 | 
			
		||||
	float value;            											//!< The value of the behavior template
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//! BehaviorParameter table
 | 
			
		||||
class CDBehaviorParameterTable : public CDTable {
 | 
			
		||||
private:
 | 
			
		||||
	std::unordered_map<size_t, CDBehaviorParameter> m_Entries;
 | 
			
		||||
	std::unordered_set<std::string> m_ParametersList;
 | 
			
		||||
	std::unordered_map<uint64_t, CDBehaviorParameter> m_Entries;
 | 
			
		||||
	std::unordered_map<std::string, uint32_t> m_ParametersList;
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
	//! Constructor
 | 
			
		||||
@@ -36,7 +36,7 @@ public:
 | 
			
		||||
	 */
 | 
			
		||||
	std::string GetName(void) const override;
 | 
			
		||||
 | 
			
		||||
	CDBehaviorParameter GetEntry(const uint32_t behaviorID, const std::string& name, const float defaultValue = 0);
 | 
			
		||||
	float GetValue(const uint32_t behaviorID, const std::string& name, const float defaultValue = 0);
 | 
			
		||||
 | 
			
		||||
	std::map<std::string, float> GetParametersByBehaviorID(uint32_t behaviorID);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -439,7 +439,7 @@ Behavior::Behavior(const uint32_t behaviorId) {
 | 
			
		||||
float Behavior::GetFloat(const std::string& name, const float defaultValue) const {
 | 
			
		||||
	// Get the behavior parameter entry and return its value.
 | 
			
		||||
	if (!BehaviorParameterTable) BehaviorParameterTable = CDClientManager::Instance()->GetTable<CDBehaviorParameterTable>("BehaviorParameter");
 | 
			
		||||
	return BehaviorParameterTable->GetEntry(this->m_behaviorId, name, defaultValue).value;
 | 
			
		||||
	return BehaviorParameterTable->GetValue(this->m_behaviorId, name, defaultValue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user