game2001/server/gameserver/obstacle.cc
2019-03-27 17:51:41 +08:00

86 lines
2.2 KiB
C++

#include "precompile.h"
#include "obstacle.h"
#include "metamgr.h"
#include "movement.h"
#include "room.h"
#include "collider.h"
Obstacle::Obstacle():Entity()
{
entity_type = ET_Obstacle;
}
Obstacle::~Obstacle()
{
}
void Obstacle::Initialize()
{
health = meta->i->hp();
RecalcSelfCollider();
}
void Obstacle::RecalcSelfCollider()
{
switch (meta->i->thing_id()) {
case 61001:
{
if (!self_collider2_) {
self_collider2_ = new AabbCollider();
self_collider2_->owner = this;
colliders.push_back(self_collider2_);
}
self_collider2_->_min = Vector2D(-16.0f, -16.0f);
self_collider2_->_max = Vector2D(16.0f, 16.0f);
}
break;
case 61017:
{
//玻璃32 * 12
if (!self_collider2_) {
self_collider2_ = new AabbCollider();
self_collider2_->owner = this;
colliders.push_back(self_collider2_);
}
self_collider2_->_min = Vector2D(-16.0f, -16.0f);
self_collider2_->_max = Vector2D(6.0f, 6.0f);
}
break;
case 61007:
{
if (!self_collider_) {
self_collider_ = new CircleCollider();
self_collider_->owner = this;
colliders.push_back(self_collider_);
}
self_collider_->pos = Vector2D();
self_collider_->rad = 32 / 2.0;
}
break;
}
}
void Obstacle::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(ET_Obstacle);
cs::MFObstaclePart* p = part_data->mutable_union_obj_2();
p->set_obj_uniid(entity_uniid);
pos.ToPB(p->mutable_pos());
p->set_scale(1.0f);
}
void Obstacle::FillMFObjectFull(cs::MFObjectFull* full_data)
{
full_data->set_object_type(ET_Obstacle);
cs::MFObstacleFull* p = full_data->mutable_union_obj_2();
p->set_obj_uniid(entity_uniid);
pos.ToPB(p->mutable_pos());
p->set_scale(1.0f);
p->set_obstacle_id(meta->i->thing_id());
p->set_health(health);
p->set_dead(dead);
p->set_dead_at_thisframe(dead ? dead_frameno < room->frame_no : false);
}