From b0c3333572f637010b843d77b5d436870ed99e1d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 3 Apr 2019 17:13:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B8=E5=BC=B9=E9=80=BB=E8=BE=91ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 79 +++++++++++++++++++++---- server/gameserver/bullet.h | 2 + server/gameserver/player.cc | 38 ++++++++++++ server/gameserver/player.h | 1 + server/gameserver/room.cc | 33 ++++++++++- server/gameserver/room.h | 3 +- server/tools/protobuild/cs_proto.proto | 1 - server/tools/protobuild/metatable.proto | 1 - 8 files changed, 141 insertions(+), 17 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index c8cec94..535bd93 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -30,20 +30,28 @@ void Bullet::Update(int delta_time) { movement->Update(delta_time); pos = pos + dir * gun_meta->i->bullet_speed() / 20.0f; - std::vector objects; - int detection_flags = 0; - { - a8::SetBitFlag(detection_flags, ET_Obstacle); - a8::SetBitFlag(detection_flags, ET_Player); - } - room->CollisionDetection(this, detection_flags, objects); float distance = (pos - born_pos).Norm(); - if (!objects.empty() || distance > gun_meta->i->range()) { - deleted = true; - if (!objects.empty()) { - OnHit(objects); + if (meta->i->_inventory_slot() == 5 || + meta->i->_inventory_slot() == 6) { + if (distance >= fly_distance) { + //炸弹烟雾弹飞到目的地 + ProcBomb(); + } + } else { + std::vector objects; + int detection_flags = 0; + { + a8::SetBitFlag(detection_flags, ET_Obstacle); + a8::SetBitFlag(detection_flags, ET_Player); + } + room->CollisionDetection(this, detection_flags, objects); + if (!objects.empty() || distance > gun_meta->i->range()) { + deleted = true; + if (!objects.empty()) { + OnHit(objects); + } + room->AddDeletedObject(entity_uniid); } - room->AddDeletedObject(entity_uniid); } } @@ -93,3 +101,50 @@ void Bullet::OnHit(std::vector& objects) } } } + +void Bullet::ProcBomb() +{ + switch (meta->i->_inventory_slot()) { + case 5: + { + //手雷 + ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>* explosions = nullptr; + { + auto itr = room->frame_data.explosions_hash.find(room->frame_no); + if (itr == room->frame_data.explosions_hash.end()) { + room->frame_data.explosions_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>(); + itr = room->frame_data.explosions_hash.find(room->frame_no); + } + explosions = &itr->second; + } + + Vector2D bomb_pos = born_pos + born_dir * fly_distance; + cs::MFExplosion* explosion = explosions->Add(); + explosion->set_item_id(meta->i->id()); + bomb_pos.ToPB(explosion->mutable_pos()); + explosion->set_player_id(player->entity_uniid); + } + break; + case 6: + { + //烟雾弹 + ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>* smokes = nullptr; + { + auto itr = room->frame_data.smokes_hash.find(room->frame_no); + if (itr == room->frame_data.smokes_hash.end()) { + room->frame_data.smokes_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>(); + itr = room->frame_data.smokes_hash.find(room->frame_no); + } + smokes = &itr->second; + } + + Vector2D bomb_pos = born_pos + born_dir * fly_distance; + cs::MFSmoke* smoke = smokes->Add(); + smoke->set_item_id(meta->i->id()); + bomb_pos.ToPB(smoke->mutable_pos()); + smoke->set_player_id(player->entity_uniid); + } + break; + } + room->AddDeletedObject(entity_uniid); +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index ef53934..850e5d9 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -19,6 +19,7 @@ class Bullet : public Entity Vector2D dir; Vector2D born_pos; Vector2D born_dir; + float fly_distance = 0.0f; Bullet(); virtual ~Bullet() override; @@ -29,6 +30,7 @@ class Bullet : public Entity private: void OnHit(std::vector& objects); + void ProcBomb(); private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 60afaca..6b931ae 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -176,6 +176,7 @@ void Player::Shot() attack_dir.ToPB(bullet->mutable_dir()); bullet->set_bulletskin(10001); bullet->set_gun_id(curr_weapon->meta->i->id()); + bullet->set_fly_distance(fly_distance); } { Bullet* bullet = new Bullet(); @@ -187,10 +188,23 @@ void Player::Shot() bullet->dir = attack_dir; bullet->born_pos = pos; bullet->born_dir = attack_dir; + bullet->fly_distance = fly_distance; bullet->entity_uniid = bullet->room->AllocUniid(); bullet->Initialize(); room->AddBullet(bullet); } + switch (curr_weapon->meta->i->_inventory_slot()) { + case 5: + { + //手雷 + } + break; + case 6: + { + //烟雾弹 + } + break; + } } void Player::ProcInteraction() @@ -298,6 +312,7 @@ void Player::LootInteraction(Loot* entity) weapon->weapon_id = entity->item_id; weapon->weapon_lv = 1; weapon->num = 0; + weapon->meta = item_meta; need_sync_active_player = true; for (auto& pair : room->human_hash_) { pair.second->new_objects.insert(this); @@ -317,6 +332,7 @@ void Player::LootInteraction(Loot* entity) weapon->weapon_id = entity->item_id; weapon->weapon_lv = 1; weapon->num = 0; + weapon->meta = item_meta; } } if (item_meta->i->_inventory_slot() > 12) { @@ -363,6 +379,7 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) } shot_start = msg.shot_start(); shot_hold = msg.shot_hold(); + fly_distance = std::min(200.0f, msg.fly_distance()); if (!shot_hold) { series_shot_frames = 0; } @@ -564,6 +581,27 @@ void Player::MakeUpdateMsg() } *update_msg->mutable_shots() = room->frame_data.shots; *update_msg->mutable_bullets() = room->frame_data.bullets; + //*update_msg->mutable_explosions() = room->frame_data.explosions; + //*update_msg->mutable_smokes() = room->frame_data.smokes; + { + for (auto& pair : room->frame_data.explosions_hash) { + if (pair.first <= room->frame_no) { + for (auto& itr : pair.second) { + *update_msg->add_explosions() = itr; + } + } + } + for (auto& pair : room->frame_data.smokes_hash) { + if (pair.first <= room->frame_no) { + for (auto& itr : pair.second) { + *update_msg->add_smokes() = itr; + } + } + } + } + if (update_msg->mutable_smokes()->size() > 0) { + int i = 0; + } for (auto& itr : new_objects) { itr->FillMFObjectFull(update_msg->add_full_objects()); #if 0 diff --git a/server/gameserver/player.h b/server/gameserver/player.h index ee0526e..7bc8a7c 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -38,6 +38,7 @@ class Player : public Human bool shot_start = false; bool shot_hold = false; int series_shot_frames = 0; + float fly_distance = 0.0f; bool select_weapon = false; int selected_weapon_idx = 0; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index fdbe736..6ebaa84 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -32,6 +32,30 @@ void Room::Update(int delta_time) if (frame_no % 2 == 0) { ClearDeletedObjects(); ProcAddedObjects(); + { + { + std::vector del_ids; + for (auto& pair : frame_data.explosions_hash) { + if (pair.first < frame_no) { + del_ids.push_back(pair.first); + } + } + for (long long id : del_ids) { + frame_data.explosions_hash.erase(id); + } + } + { + std::vector del_ids; + for (auto& pair : frame_data.smokes_hash) { + if (pair.first < frame_no) { + del_ids.push_back(pair.first); + } + } + for (long long id : del_ids) { + frame_data.smokes_hash.erase(id); + } + } + } } ++frame_no; elapsed_time_ -= 50; @@ -329,10 +353,15 @@ void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg) void Room::ResetFrameData() { frame_data.deleted_objects.clear(); - frame_data.explosions.Clear(); - frame_data.emotes.Clear(); + #if 0 + { + frame_data.explosions_hash.clear(); + frame_data.smokes_hash.clear(); + } + #endif frame_data.bullets.Clear(); frame_data.shots.Clear(); + frame_data.emotes.Clear(); } void Room::ProcDrop(Vector2D center, int drop_id) diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 60e5860..1ceee83 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -18,7 +18,8 @@ namespace MetaData struct RoomFrameData { std::set deleted_objects; - ::google::protobuf::RepeatedPtrField<::cs::MFExplosion> explosions; + std::map> explosions_hash; + std::map> smokes_hash; ::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes; ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index eff6997..4efe33a 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -457,7 +457,6 @@ message MFSmoke { optional int32 item_id = 1; //配置表id optional MFVector2D pos = 2; //位置 - optional float rad = 3; //半径 optional int32 player_id = 4; //玩家id } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 9c610ac..622cbd3 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -61,7 +61,6 @@ message Equip optional int32 use_time = 15; //使用时间 optional int32 heal = 16; //瞬间生命恢复 optional int32 energy = 17; //能量值 - optional int32 number = 18; //视野参数 optional int32 volume = 19; //装备容量 optional int32 bullet_rad = 20; //子弹半径