炸弹逻辑ok
This commit is contained in:
parent
ce2d604f9c
commit
b0c3333572
@ -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<Entity*> 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<Entity*> 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<Entity*>& 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);
|
||||
}
|
||||
|
@ -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<Entity*>& objects);
|
||||
void ProcBomb();
|
||||
|
||||
private:
|
||||
CircleCollider* self_collider_ = nullptr;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -32,6 +32,30 @@ void Room::Update(int delta_time)
|
||||
if (frame_no % 2 == 0) {
|
||||
ClearDeletedObjects();
|
||||
ProcAddedObjects();
|
||||
{
|
||||
{
|
||||
std::vector<long long> 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<long long> 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)
|
||||
|
@ -18,7 +18,8 @@ namespace MetaData
|
||||
struct RoomFrameData
|
||||
{
|
||||
std::set<unsigned short> deleted_objects;
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFExplosion> explosions;
|
||||
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>> explosions_hash;
|
||||
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>> smokes_hash;
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes;
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets;
|
||||
::google::protobuf::RepeatedPtrField<::cs::MFShot> shots;
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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; //子弹半径
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user