1
This commit is contained in:
parent
2d46bd1b64
commit
15a137c3b9
@ -56,7 +56,7 @@ void Bullet::Update(int delta_time)
|
||||
if (!objects.empty()) {
|
||||
OnHit(objects);
|
||||
}
|
||||
room->AddDeletedObject(entity_uniid);
|
||||
room->AddDeletedObject(entity_uniid, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -166,5 +166,5 @@ void Bullet::ProcBomb()
|
||||
}
|
||||
break;
|
||||
}
|
||||
room->AddDeletedObject(entity_uniid);
|
||||
room->AddDeletedObject(entity_uniid, true);
|
||||
}
|
||||
|
@ -4,12 +4,13 @@
|
||||
|
||||
struct RoomFrameData
|
||||
{
|
||||
std::set<unsigned short> deleted_objects;
|
||||
std::map<long long, std::set<unsigned short>> deleted_objects_hash;
|
||||
std::map<long long, std::set<unsigned short>> softdeleted_objects_hash;
|
||||
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>> explosions_hash;
|
||||
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>> smokes_hash;
|
||||
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFEmote>> emotes_hash;
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets;
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFShot> shots;
|
||||
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFBullet>> bullets_hash;
|
||||
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFShot>> shots_hash;
|
||||
};
|
||||
|
||||
struct HumanFrameData
|
||||
|
@ -118,14 +118,37 @@ void Human::Shot(Vector2D& target_dir)
|
||||
return;
|
||||
}
|
||||
{
|
||||
cs::MFShot* shot = room->frame_data.shots.Add();
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFShot>* shots = nullptr;
|
||||
{
|
||||
{
|
||||
auto itr = room->frame_data.shots_hash.find(room->frame_no);
|
||||
if (itr == room->frame_data.shots_hash.end()) {
|
||||
room->frame_data.shots_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFShot>();
|
||||
itr = room->frame_data.shots_hash.find(room->frame_no);
|
||||
}
|
||||
shots = &itr->second;
|
||||
}
|
||||
}
|
||||
|
||||
cs::MFShot* shot = shots->Add();
|
||||
shot->set_player_id(entity_uniid);
|
||||
curr_weapon->ToPB(shot->mutable_weapon());
|
||||
shot->set_offhand(true);
|
||||
shot->set_bullskin(10001);
|
||||
}
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFBullet>* bullets = nullptr;
|
||||
{
|
||||
cs::MFBullet* bullet = room->frame_data.bullets.Add();
|
||||
{
|
||||
auto itr = room->frame_data.bullets_hash.find(room->frame_no);
|
||||
if (itr == room->frame_data.bullets_hash.end()) {
|
||||
room->frame_data.bullets_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFBullet>();
|
||||
itr = room->frame_data.bullets_hash.find(room->frame_no);
|
||||
}
|
||||
bullets = &itr->second;
|
||||
}
|
||||
}
|
||||
{
|
||||
cs::MFBullet* bullet = bullets->Add();
|
||||
bullet->set_player_id(entity_uniid);
|
||||
bullet->set_bullet_id(curr_weapon->meta->i->use_bullet());
|
||||
pos.ToPB(bullet->mutable_pos());
|
||||
|
@ -307,7 +307,19 @@ void Player::Shot()
|
||||
}
|
||||
|
||||
{
|
||||
cs::MFShot* shot = room->frame_data.shots.Add();
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFShot>* shots = nullptr;
|
||||
{
|
||||
{
|
||||
auto itr = room->frame_data.shots_hash.find(room->frame_no);
|
||||
if (itr == room->frame_data.shots_hash.end()) {
|
||||
room->frame_data.shots_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFShot>();
|
||||
itr = room->frame_data.shots_hash.find(room->frame_no);
|
||||
}
|
||||
shots = &itr->second;
|
||||
}
|
||||
}
|
||||
|
||||
cs::MFShot* shot = shots->Add();
|
||||
shot->set_player_id(entity_uniid);
|
||||
curr_weapon->ToPB(shot->mutable_weapon());
|
||||
shot->set_offhand(true);
|
||||
@ -317,8 +329,19 @@ void Player::Shot()
|
||||
Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple));
|
||||
bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP));
|
||||
Vector2D bullet_born_pos = pos + bullet_born_offset;
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFBullet>* bullets = nullptr;
|
||||
{
|
||||
cs::MFBullet* bullet = room->frame_data.bullets.Add();
|
||||
{
|
||||
auto itr = room->frame_data.bullets_hash.find(room->frame_no);
|
||||
if (itr == room->frame_data.bullets_hash.end()) {
|
||||
room->frame_data.bullets_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFBullet>();
|
||||
itr = room->frame_data.bullets_hash.find(room->frame_no);
|
||||
}
|
||||
bullets = &itr->second;
|
||||
}
|
||||
}
|
||||
{
|
||||
cs::MFBullet* bullet = bullets->Add();
|
||||
bullet->set_player_id(entity_uniid);
|
||||
bullet->set_bullet_id(curr_weapon->meta->i->use_bullet());
|
||||
bullet_born_pos.ToPB(bullet->mutable_pos());
|
||||
@ -560,7 +583,7 @@ void Player::LootInteraction(Loot* entity)
|
||||
break;
|
||||
}
|
||||
entity->pickuped = true;
|
||||
room->AddDeletedObject(entity->entity_uniid);
|
||||
room->AddDeletedObject(entity->entity_uniid, false);
|
||||
}
|
||||
|
||||
void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
|
||||
@ -799,12 +822,28 @@ void Player::MakeUpdateMsg()
|
||||
update_msg->Clear();
|
||||
{
|
||||
update_msg->set_ack(last_seq_id);
|
||||
for (auto& obj_uniid : room->frame_data.deleted_objects) {
|
||||
update_msg->add_del_objids(obj_uniid);
|
||||
}
|
||||
*update_msg->mutable_shots() = room->frame_data.shots;
|
||||
*update_msg->mutable_bullets() = room->frame_data.bullets;
|
||||
{
|
||||
for (auto& pair : room->frame_data.deleted_objects_hash) {
|
||||
if (pair.first <= room->frame_no) {
|
||||
for (auto& itr : pair.second) {
|
||||
update_msg->add_del_objids(itr);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (auto& pair : room->frame_data.shots_hash) {
|
||||
if (pair.first <= room->frame_no) {
|
||||
for (auto& itr : pair.second) {
|
||||
*update_msg->add_shots() = itr;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (auto& pair : room->frame_data.bullets_hash) {
|
||||
if (pair.first <= room->frame_no) {
|
||||
for (auto& itr : pair.second) {
|
||||
*update_msg->add_bullets() = itr;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (auto& pair : room->frame_data.explosions_hash) {
|
||||
if (pair.first <= room->frame_no) {
|
||||
for (auto& itr : pair.second) {
|
||||
|
@ -27,6 +27,7 @@ const int ANDROID_NUM = 10;
|
||||
void Room::Initialize()
|
||||
{
|
||||
ShuaAndroid();
|
||||
CreateThings();
|
||||
#if 0
|
||||
a8::Timer::Instance()->AddRepeatTimer(
|
||||
1000 * 5,
|
||||
@ -63,6 +64,50 @@ void Room::Update(int delta_time)
|
||||
ClearDeletedObjects();
|
||||
ProcAddedObjects();
|
||||
{
|
||||
{
|
||||
std::vector<long long> del_ids;
|
||||
for (auto& pair : frame_data.deleted_objects_hash) {
|
||||
if (pair.first < frame_no) {
|
||||
del_ids.push_back(pair.first);
|
||||
}
|
||||
}
|
||||
for (long long id : del_ids) {
|
||||
frame_data.deleted_objects_hash.erase(id);
|
||||
}
|
||||
}
|
||||
{
|
||||
std::vector<long long> del_ids;
|
||||
for (auto& pair : frame_data.softdeleted_objects_hash) {
|
||||
if (pair.first < frame_no) {
|
||||
del_ids.push_back(pair.first);
|
||||
}
|
||||
}
|
||||
for (long long id : del_ids) {
|
||||
frame_data.softdeleted_objects_hash.erase(id);
|
||||
}
|
||||
}
|
||||
{
|
||||
std::vector<long long> del_ids;
|
||||
for (auto& pair : frame_data.bullets_hash) {
|
||||
if (pair.first < frame_no) {
|
||||
del_ids.push_back(pair.first);
|
||||
}
|
||||
}
|
||||
for (long long id : del_ids) {
|
||||
frame_data.bullets_hash.erase(id);
|
||||
}
|
||||
}
|
||||
{
|
||||
std::vector<long long> del_ids;
|
||||
for (auto& pair : frame_data.shots_hash) {
|
||||
if (pair.first < frame_no) {
|
||||
del_ids.push_back(pair.first);
|
||||
}
|
||||
}
|
||||
for (long long id : del_ids) {
|
||||
frame_data.shots_hash.erase(id);
|
||||
}
|
||||
}
|
||||
{
|
||||
std::vector<long long> del_ids;
|
||||
for (auto& pair : frame_data.explosions_hash) {
|
||||
@ -164,6 +209,21 @@ void Room::AddPlayer(Player* hum)
|
||||
hum->part_objects.insert(pair.second);
|
||||
}
|
||||
}
|
||||
for (auto& pair : uniid_hash_) {
|
||||
switch (pair.second->entity_type) {
|
||||
case ET_Building:
|
||||
case ET_Obstacle:
|
||||
{
|
||||
hum->new_objects.insert(pair.second);
|
||||
hum->part_objects.insert(pair.second);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned short Room::AllocUniid()
|
||||
@ -265,9 +325,25 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vector<E
|
||||
}
|
||||
}
|
||||
|
||||
void Room::AddDeletedObject(unsigned short obj_uniid)
|
||||
void Room::AddDeletedObject(unsigned short obj_uniid, bool soft_delete)
|
||||
{
|
||||
frame_data.deleted_objects.insert(obj_uniid);
|
||||
std::set<unsigned short>* deleted_objects = nullptr;
|
||||
if (soft_delete) {
|
||||
auto itr = frame_data.softdeleted_objects_hash.find(frame_no);
|
||||
if (itr == frame_data.softdeleted_objects_hash.end()) {
|
||||
frame_data.softdeleted_objects_hash[frame_no] = std::set<unsigned short>();
|
||||
itr = frame_data.softdeleted_objects_hash.find(frame_no);
|
||||
}
|
||||
deleted_objects = &itr->second;
|
||||
} else {
|
||||
auto itr = frame_data.deleted_objects_hash.find(frame_no);
|
||||
if (itr == frame_data.deleted_objects_hash.end()) {
|
||||
frame_data.deleted_objects_hash[frame_no] = std::set<unsigned short>();
|
||||
itr = frame_data.deleted_objects_hash.find(frame_no);
|
||||
}
|
||||
deleted_objects = &itr->second;
|
||||
}
|
||||
deleted_objects->insert(obj_uniid);
|
||||
}
|
||||
|
||||
void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg)
|
||||
@ -288,9 +364,6 @@ void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg)
|
||||
|
||||
void Room::ResetFrameData()
|
||||
{
|
||||
frame_data.deleted_objects.clear();
|
||||
frame_data.bullets.Clear();
|
||||
frame_data.shots.Clear();
|
||||
}
|
||||
|
||||
void Room::ScatterDrop(Vector2D center, int drop_id)
|
||||
@ -328,10 +401,6 @@ void Room::CreateThings()
|
||||
entity->pos = Vector2D(thing_tpl.i->x(), thing_tpl.i->y());
|
||||
entity->Initialize();
|
||||
uniid_hash_[entity->entity_uniid] = entity;
|
||||
for (auto& pair : human_hash_) {
|
||||
pair.second->new_objects.insert(entity);
|
||||
pair.second->part_objects.insert(entity);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Obstacle* entity = new Obstacle();
|
||||
@ -341,10 +410,6 @@ void Room::CreateThings()
|
||||
entity->pos = Vector2D(thing_tpl.i->x(), thing_tpl.i->y());
|
||||
entity->Initialize();
|
||||
uniid_hash_[entity->entity_uniid] = entity;
|
||||
for (auto& pair : human_hash_) {
|
||||
pair.second->new_objects.insert(entity);
|
||||
pair.second->part_objects.insert(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -510,18 +575,37 @@ void Room::OnHumanDie(Human* hum)
|
||||
|
||||
void Room::ClearDeletedObjects()
|
||||
{
|
||||
for (auto& obj_uniid : frame_data.deleted_objects) {
|
||||
Entity* entity = GetEntityByUniId(obj_uniid);
|
||||
if (entity) {
|
||||
if (entity->entity_type != ET_Player) {
|
||||
uniid_hash_.erase(entity->entity_uniid);
|
||||
moveable_hash_.erase(entity->entity_uniid);
|
||||
for (auto& pair : frame_data.deleted_objects_hash) {
|
||||
for (auto& obj_uniid : pair.second) {
|
||||
Entity* entity = GetEntityByUniId(obj_uniid);
|
||||
if (entity) {
|
||||
if (entity->entity_type != ET_Player) {
|
||||
uniid_hash_.erase(entity->entity_uniid);
|
||||
moveable_hash_.erase(entity->entity_uniid);
|
||||
}
|
||||
for (auto& pair : human_hash_) {
|
||||
pair.second->new_objects.erase(entity);
|
||||
pair.second->part_objects.erase(entity);
|
||||
}
|
||||
delete entity;
|
||||
}
|
||||
for (auto& pair : human_hash_) {
|
||||
pair.second->new_objects.erase(entity);
|
||||
pair.second->part_objects.erase(entity);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& pair : frame_data.softdeleted_objects_hash) {
|
||||
for (auto& obj_uniid : pair.second) {
|
||||
Entity* entity = GetEntityByUniId(obj_uniid);
|
||||
if (entity) {
|
||||
if (entity->entity_type != ET_Player) {
|
||||
uniid_hash_.erase(entity->entity_uniid);
|
||||
moveable_hash_.erase(entity->entity_uniid);
|
||||
}
|
||||
for (auto& pair : human_hash_) {
|
||||
pair.second->new_objects.erase(entity);
|
||||
pair.second->part_objects.erase(entity);
|
||||
}
|
||||
delete entity;
|
||||
}
|
||||
delete entity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public:
|
||||
Human* FindEnemy(Human* hum);
|
||||
|
||||
void CollisionDetection(Entity* sender, int detection_flags, std::vector<Entity*>& objects);
|
||||
void AddDeletedObject(unsigned short obj_uniid);
|
||||
void AddDeletedObject(unsigned short obj_uniid, bool soft_delete);
|
||||
void BeAddedObject(Entity* entity);
|
||||
|
||||
void FetchBuilding(Human* hum);
|
||||
|
@ -50,7 +50,6 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg)
|
||||
Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(hdr.socket_handle, msg);
|
||||
hum->meta = hum_meta;
|
||||
room->AddPlayer(hum);
|
||||
room->CreateThings();
|
||||
|
||||
{
|
||||
cs::SMJoinedNotify notifymsg;
|
||||
|
Loading…
x
Reference in New Issue
Block a user