game2001/server/gameserver/building.cc
2019-03-27 16:43:41 +08:00

92 lines
3.0 KiB
C++

#include "precompile.h"
#include "building.h"
#include "metamgr.h"
#include "movement.h"
#include "room.h"
#include "collider.h"
#include "obstacle.h"
#include "human.h"
#include "loot.h"
Building::Building():Entity()
{
entity_type = ET_Building;
}
Building::~Building()
{
}
void Building::Initialize()
{
RecalcSelfCollider();
}
void Building::RecalcSelfCollider()
{
for (auto& obj : meta->i->staticobj()) {
AabbCollider* collider = new AabbCollider();
collider->owner = this;
collider->_min = Vector2D(obj.x() - obj.width()/2.0 - meta->i->tilewidth()/2.0,
obj.y() - obj.height()/2.0 - meta->i->tileheight()/2.0);
collider->_max = Vector2D(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0,
obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0);
colliders.push_back(collider);
}
for (auto& obj : meta->i->lootobj()) {
MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(obj.id());
if (thing) {
Obstacle* entity = new Obstacle();
entity->room = room;
entity->meta = thing;
entity->entity_uniid = room->AllocUniid();
entity->pos = Vector2D(pos.x + obj.x() - meta->i->tilewidth() / 2.0,
pos.y + obj.y() - meta->i->tileheight() / 2.0);
entity->Initialize();
room->uniid_hash_[entity->entity_uniid] = entity;
for (auto& pair : room->human_hash_) {
pair.second->new_objects.insert(entity);
pair.second->part_objects.insert(entity);
}
}
}
for (auto& obj : meta->i->dropobj()) {
MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(obj.id());
if (equip_meta) {
Loot* entity = new Loot();
entity->room = room;
entity->meta = equip_meta;
entity->entity_uniid = room->AllocUniid();
entity->pos = Vector2D(pos.x + obj.x() - meta->i->tilewidth() / 2.0,
pos.y + obj.y() - meta->i->tileheight() / 2.0);
entity->item_id = obj.id();
entity->count = 1;
entity->Initialize();
room->uniid_hash_[entity->entity_uniid] = entity;
for (auto& pair : room->human_hash_) {
pair.second->new_objects.insert(entity);
pair.second->part_objects.insert(entity);
}
}
}
}
void Building::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(ET_Building);
cs::MFBuildingPart* p = part_data->mutable_union_obj_3();
p->set_obj_uniid(entity_uniid);
pos.ToPB(p->mutable_pos());
}
void Building::FillMFObjectFull(cs::MFObjectFull* full_data)
{
full_data->set_object_type(ET_Building);
cs::MFBuildingFull* p = full_data->mutable_union_obj_3();
p->set_obj_uniid(entity_uniid);
pos.ToPB(p->mutable_pos());
p->set_building_id(meta->i->_building_id());
}