v1.4.4
This commit is contained in:
commit
9c94d113d3
10260 changed files with 1237388 additions and 0 deletions
173
source/game/StarEntityFactory.cpp
Normal file
173
source/game/StarEntityFactory.cpp
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
#include "StarEntityFactory.hpp"
|
||||
#include "StarPlayer.hpp"
|
||||
#include "StarPlayerFactory.hpp"
|
||||
#include "StarMonster.hpp"
|
||||
#include "StarObject.hpp"
|
||||
#include "StarObjectDatabase.hpp"
|
||||
#include "StarPlant.hpp"
|
||||
#include "StarPlantDrop.hpp"
|
||||
#include "StarProjectile.hpp"
|
||||
#include "StarProjectileDatabase.hpp"
|
||||
#include "StarItemDrop.hpp"
|
||||
#include "StarNpc.hpp"
|
||||
#include "StarRoot.hpp"
|
||||
#include "StarStagehand.hpp"
|
||||
#include "StarVehicleDatabase.hpp"
|
||||
|
||||
namespace Star {
|
||||
|
||||
EnumMap<EntityType> const EntityFactory::EntityStorageIdentifiers{
|
||||
{EntityType::Player, "PlayerEntity"},
|
||||
{EntityType::Monster, "MonsterEntity"},
|
||||
{EntityType::Object, "ObjectEntity"},
|
||||
{EntityType::ItemDrop, "ItemDropEntity"},
|
||||
{EntityType::Projectile, "ProjectileEntity"},
|
||||
{EntityType::Plant, "PlantEntity"},
|
||||
{EntityType::PlantDrop, "PlantDropEntity"},
|
||||
{EntityType::Npc, "NpcEntity"},
|
||||
{EntityType::Stagehand, "StagehandEntity"},
|
||||
{EntityType::Vehicle, "VehicleEntity"}
|
||||
};
|
||||
|
||||
EntityFactory::EntityFactory() {
|
||||
auto& root = Root::singleton();
|
||||
m_playerFactory = root.playerFactory();
|
||||
m_monsterDatabase = root.monsterDatabase();
|
||||
m_objectDatabase = root.objectDatabase();
|
||||
m_projectileDatabase = root.projectileDatabase();
|
||||
m_npcDatabase = root.npcDatabase();
|
||||
m_vehicleDatabase = root.vehicleDatabase();
|
||||
m_versioningDatabase = root.versioningDatabase();
|
||||
}
|
||||
|
||||
ByteArray EntityFactory::netStoreEntity(EntityPtr const& entity) const {
|
||||
RecursiveMutexLocker locker(m_mutex);
|
||||
|
||||
if (auto player = as<Player>(entity)) {
|
||||
return player->netStore();
|
||||
} else if (auto monster = as<Monster>(entity)) {
|
||||
return monster->netStore();
|
||||
} else if (auto object = as<Object>(entity)) {
|
||||
return object->netStore();
|
||||
} else if (auto plant = as<Plant>(entity)) {
|
||||
return plant->netStore();
|
||||
} else if (auto plantDrop = as<PlantDrop>(entity)) {
|
||||
return plantDrop->netStore();
|
||||
} else if (auto projectile = as<Projectile>(entity)) {
|
||||
return projectile->netStore();
|
||||
} else if (auto itemDrop = as<ItemDrop>(entity)) {
|
||||
return itemDrop->netStore();
|
||||
} else if (auto npc = as<Npc>(entity)) {
|
||||
return npc->netStore();
|
||||
} else if (auto stagehand = as<Stagehand>(entity)) {
|
||||
return stagehand->netStore();
|
||||
} else if (auto vehicle = as<Vehicle>(entity)) {
|
||||
return m_vehicleDatabase->netStore(vehicle);
|
||||
} else {
|
||||
throw EntityFactoryException::format("Don't know how to make net store for entity type '%s'", EntityTypeNames.getRight(entity->entityType()));
|
||||
}
|
||||
}
|
||||
|
||||
EntityPtr EntityFactory::netLoadEntity(EntityType type, ByteArray const& netStore) const {
|
||||
RecursiveMutexLocker locker(m_mutex);
|
||||
|
||||
if (type == EntityType::Player) {
|
||||
return m_playerFactory->netLoadPlayer(netStore);
|
||||
} else if (type == EntityType::Monster) {
|
||||
return m_monsterDatabase->netLoadMonster(netStore);
|
||||
} else if (type == EntityType::Object) {
|
||||
return m_objectDatabase->netLoadObject(netStore);
|
||||
} else if (type == EntityType::Plant) {
|
||||
return make_shared<Plant>(netStore);
|
||||
} else if (type == EntityType::PlantDrop) {
|
||||
return make_shared<PlantDrop>(netStore);
|
||||
} else if (type == EntityType::Projectile) {
|
||||
return m_projectileDatabase->netLoadProjectile(netStore);
|
||||
} else if (type == EntityType::ItemDrop) {
|
||||
return make_shared<ItemDrop>(netStore);
|
||||
} else if (type == EntityType::Npc) {
|
||||
return m_npcDatabase->netLoadNpc(netStore);
|
||||
} else if (type == EntityType::Stagehand) {
|
||||
return make_shared<Stagehand>(netStore);
|
||||
} else if (type == EntityType::Vehicle) {
|
||||
return m_vehicleDatabase->netLoad(netStore);
|
||||
} else {
|
||||
throw EntityFactoryException::format("Don't know how to create entity type '%s' from net store", EntityTypeNames.getRight(type));
|
||||
}
|
||||
}
|
||||
|
||||
Json EntityFactory::diskStoreEntity(EntityPtr const& entity) const {
|
||||
RecursiveMutexLocker locker(m_mutex);
|
||||
|
||||
if (auto player = as<Player>(entity)) {
|
||||
return player->diskStore();
|
||||
} else if (auto monster = as<Monster>(entity)) {
|
||||
return monster->diskStore();
|
||||
} else if (auto object = as<Object>(entity)) {
|
||||
return object->diskStore();
|
||||
} else if (auto plant = as<Plant>(entity)) {
|
||||
return plant->diskStore();
|
||||
} else if (auto itemDrop = as<ItemDrop>(entity)) {
|
||||
return itemDrop->diskStore();
|
||||
} else if (auto npc = as<Npc>(entity)) {
|
||||
return npc->diskStore();
|
||||
} else if (auto stagehand = as<Stagehand>(entity)) {
|
||||
return stagehand->diskStore();
|
||||
} else if (auto vehicle = as<Vehicle>(entity)) {
|
||||
return m_vehicleDatabase->diskStore(vehicle);
|
||||
} else {
|
||||
throw EntityFactoryException::format("Don't know how to make disk store for entity type '%s'", EntityTypeNames.getRight(entity->entityType()));
|
||||
}
|
||||
}
|
||||
|
||||
EntityPtr EntityFactory::diskLoadEntity(EntityType type, Json const& diskStore) const {
|
||||
RecursiveMutexLocker locker(m_mutex);
|
||||
|
||||
if (type == EntityType::Player) {
|
||||
return m_playerFactory->diskLoadPlayer(diskStore);
|
||||
} else if (type == EntityType::Monster) {
|
||||
return m_monsterDatabase->diskLoadMonster(diskStore);
|
||||
} else if (type == EntityType::Object) {
|
||||
return m_objectDatabase->diskLoadObject(diskStore);
|
||||
} else if (type == EntityType::Plant) {
|
||||
return make_shared<Plant>(diskStore);
|
||||
} else if (type == EntityType::ItemDrop) {
|
||||
return make_shared<ItemDrop>(diskStore);
|
||||
} else if (type == EntityType::Npc) {
|
||||
return m_npcDatabase->diskLoadNpc(diskStore);
|
||||
} else if (type == EntityType::Stagehand) {
|
||||
return make_shared<Stagehand>(diskStore);
|
||||
} else if (type == EntityType::Vehicle) {
|
||||
return m_vehicleDatabase->diskLoad(diskStore);
|
||||
} else {
|
||||
throw EntityFactoryException::format("Don't know how to create entity type '%s' from disk store", EntityTypeNames.getRight(type));
|
||||
}
|
||||
}
|
||||
|
||||
Json EntityFactory::loadVersionedJson(VersionedJson const& versionedJson, EntityType expectedType) const {
|
||||
RecursiveMutexLocker locker(m_mutex);
|
||||
|
||||
String identifier = EntityStorageIdentifiers.getRight(expectedType);
|
||||
return m_versioningDatabase->loadVersionedJson(versionedJson, identifier);
|
||||
}
|
||||
|
||||
VersionedJson EntityFactory::storeVersionedJson(EntityType type, Json const& store) const {
|
||||
RecursiveMutexLocker locker(m_mutex);
|
||||
|
||||
String identifier = EntityStorageIdentifiers.getRight(type);
|
||||
return m_versioningDatabase->makeCurrentVersionedJson(identifier, store);
|
||||
}
|
||||
|
||||
EntityPtr EntityFactory::loadVersionedEntity(VersionedJson const& versionedJson) const {
|
||||
RecursiveMutexLocker locker(m_mutex);
|
||||
|
||||
EntityType type = EntityStorageIdentifiers.getLeft(versionedJson.identifier);
|
||||
auto store = loadVersionedJson(versionedJson, type);
|
||||
return diskLoadEntity(type, store);
|
||||
}
|
||||
|
||||
VersionedJson EntityFactory::storeVersionedEntity(EntityPtr const& entityPtr) const {
|
||||
return storeVersionedJson(entityPtr->entityType(), diskStoreEntity(entityPtr));
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue