Fixed so unregistered components are ignored instead of crashing the game.
This commit is contained in:
@@ -52,6 +52,8 @@
|
|||||||
<xs:element ref="c:Button" minOccurs="0"/>
|
<xs:element ref="c:Button" minOccurs="0"/>
|
||||||
<xs:element ref="c:WeaponAttachment" minOccurs="0"/>
|
<xs:element ref="c:WeaponAttachment" minOccurs="0"/>
|
||||||
<xs:element ref="c:DefenderWeapon" minOccurs="0"/>
|
<xs:element ref="c:DefenderWeapon" minOccurs="0"/>
|
||||||
|
<xs:element ref="c:AmmoPickup" minOccurs="0"/>
|
||||||
|
<xs:element ref="c:HealthPickup" minOccurs="0"/>
|
||||||
</xs:all>
|
</xs:all>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "Core/EntityFileParser.h"
|
#include "Core/EntityFileParser.h"
|
||||||
|
|
||||||
EntityFileParser::EntityFileParser(const EntityFile* entityFile)
|
EntityFileParser::EntityFileParser(const EntityFile* entityFile)
|
||||||
: m_EntityFile(entityFile)
|
: m_EntityFile(entityFile)
|
||||||
{
|
{
|
||||||
m_Handler.SetStartEntityCallback(std::bind(&EntityFileParser::onStartEntity, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
m_Handler.SetStartEntityCallback(std::bind(&EntityFileParser::onStartEntity, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
@@ -33,13 +33,20 @@ void EntityFileParser::onStartEntity(EntityID entity, EntityID parent, const std
|
|||||||
|
|
||||||
void EntityFileParser::onStartComponent(EntityID entity, const std::string& component)
|
void EntityFileParser::onStartComponent(EntityID entity, const std::string& component)
|
||||||
{
|
{
|
||||||
EntityID realEntity = m_EntityIDMapper.at(entity);
|
if (m_World->GetComponentPools().count(component) != 0) {
|
||||||
m_World->AttachComponent(realEntity, component);
|
EntityID realEntity = m_EntityIDMapper.at(entity);
|
||||||
|
m_World->AttachComponent(realEntity, component);
|
||||||
|
} else {
|
||||||
|
LOG_ERROR("Tried to attach unregistered component \"%s\"! to entity #%i. Ignoring.", component.c_str(), entity);
|
||||||
|
}
|
||||||
//LOG_DEBUG("Attached component of type \"%s\" to entity #%i (%i)", component.c_str(), entity, realEntity);
|
//LOG_DEBUG("Attached component of type \"%s\" to entity #%i (%i)", component.c_str(), entity, realEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityFileParser::onStartComponentField(EntityID entity, const std::string& componentType, const std::string& fieldName, const std::map<std::string, std::string>& attributes)
|
void EntityFileParser::onStartComponentField(EntityID entity, const std::string& componentType, const std::string& fieldName, const std::map<std::string, std::string>& attributes)
|
||||||
{
|
{
|
||||||
|
if (m_World->GetComponentPools().count(componentType) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
EntityID realEntity = m_EntityIDMapper.at(entity);
|
EntityID realEntity = m_EntityIDMapper.at(entity);
|
||||||
ComponentWrapper component = m_World->GetComponent(realEntity, componentType);
|
ComponentWrapper component = m_World->GetComponent(realEntity, componentType);
|
||||||
auto fieldIt = component.Info.Fields.find(fieldName);
|
auto fieldIt = component.Info.Fields.find(fieldName);
|
||||||
@@ -61,6 +68,9 @@ void EntityFileParser::onStartComponentField(EntityID entity, const std::string&
|
|||||||
|
|
||||||
void EntityFileParser::onFieldData(EntityID entity, const std::string& componentType, const std::string& fieldName, const char* fieldData)
|
void EntityFileParser::onFieldData(EntityID entity, const std::string& componentType, const std::string& fieldName, const char* fieldData)
|
||||||
{
|
{
|
||||||
|
if (m_World->GetComponentPools().count(componentType) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
EntityID realEntity = m_EntityIDMapper.at(entity);
|
EntityID realEntity = m_EntityIDMapper.at(entity);
|
||||||
ComponentWrapper component = m_World->GetComponent(realEntity, componentType);
|
ComponentWrapper component = m_World->GetComponent(realEntity, componentType);
|
||||||
auto fieldIt = component.Info.Fields.find(fieldName);
|
auto fieldIt = component.Info.Fields.find(fieldName);
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ void _LOG(_LOG_LEVEL logLevel, const char* file, const char* func, unsigned int
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
if (logLevel == LOG_LEVEL_ERROR) {
|
if (logLevel == LOG_LEVEL_ERROR) {
|
||||||
//std::cerr << file << ":" << line << " " << func << std::endl;
|
std::cerr << file << ":" << line << " " << func << std::endl;
|
||||||
//std::cerr << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
std::cerr << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
||||||
} else {
|
} else {
|
||||||
std::cout << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
std::cout << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -258,16 +258,17 @@ EntityWrapper EditorSystem::importEntity(EntityWrapper parent, boost::filesystem
|
|||||||
return EntityWrapper::Invalid;
|
return EntityWrapper::Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
//try {
|
||||||
auto entityFile = ResourceManager::Load<EntityFile>(filePath.string());
|
auto entityFile = ResourceManager::Load<EntityFile>(filePath.string());
|
||||||
EntityFilePreprocessor fpp(entityFile);
|
EntityFilePreprocessor fpp(entityFile);
|
||||||
fpp.RegisterComponents(parent.World);
|
fpp.RegisterComponents(parent.World);
|
||||||
EntityFileParser fp(entityFile);
|
EntityFileParser fp(entityFile);
|
||||||
EntityID newEntity = fp.MergeEntities(parent.World, parent.ID);
|
EntityID newEntity = fp.MergeEntities(parent.World, parent.ID);
|
||||||
return EntityWrapper(parent.World, newEntity);
|
return EntityWrapper(parent.World, newEntity);
|
||||||
} catch (const std::exception&) {
|
/*} catch (const std::exception& e) {
|
||||||
|
LOG_ERROR("Failed to import entity \"%s\": \"%s\"", filePath.string().c_str(), e.what());
|
||||||
return EntityWrapper::Invalid;
|
return EntityWrapper::Invalid;
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorSystem::setWidgetMode(EditorGUI::WidgetMode mode)
|
void EditorSystem::setWidgetMode(EditorGUI::WidgetMode mode)
|
||||||
|
|||||||
Reference in New Issue
Block a user