From f5dd02c3410bae2e6c98569e7bbedf79db254ebc Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 14:22:39 +0800 Subject: [PATCH 1/7] 1 --- server/gameserver/bullet.cc | 8 +++++--- server/gameserver/bullet.h | 1 + server/gameserver/creature.cc | 8 +++++++- server/gameserver/room.cc | 4 +++- server/gameserver/room.h | 3 ++- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 9d49aa1d..9e8d0e4e 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -50,9 +50,11 @@ void Bullet::Initialize() void Bullet::Update(int delta_time) { - if (!trace_target_id) { - MapServiceUpdate(); - ++updated_times_; + if (shot_animi_time <= (room->GetFrameNo() - create_frameno_) * FRAME_RATE_MS) { + if (!trace_target_id) { + MapServiceUpdate(); + ++updated_times_; + } } } diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 6ad10db8..0500106e 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -36,6 +36,7 @@ class Bullet : public MoveableEntity int strengthen_wall = 0; int hand = 0; std::weak_ptr keep_shot_animi_timer_ptr; + float shot_animi_time = 0.0f; virtual ~Bullet() override; virtual void Initialize() override; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index cb4b3422..7600ac58 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -43,6 +43,7 @@ struct BulletInfo float track_change_time = 0; int is_through = 0; int hand = 0; + float shot_animi_time = 0; std::weak_ptr keep_shot_animi_timer_ptr; }; @@ -94,7 +95,8 @@ static void InternalCreateBullet(BulletInfo& bullet_info) bullet_info.weapon_uniid, bullet_info.trace_target_uniid, bullet_info.hand, - bullet_info.keep_shot_animi_timer_ptr); + bullet_info.keep_shot_animi_timer_ptr, + bullet_info.shot_animi_time); #ifdef DEBUG1 if (bullet_info.c.Get()->IsPlayer()) { bullet_info.c.Get()->SendDebugMsg(a8::Format("CreateBullet id:%d", @@ -325,6 +327,9 @@ void InternalShot(Creature* c, } bullet_dir.Rotate(bullet_angle / 180.0f); int shot_animi_time = (shot_animi ? shot_animi->t : 0); + if (shot_animi_time > 0) { + shot_animi_time = std::max(100, shot_animi_time); + } { bool is_player = c->IsPlayer(); bool is_car = c->IsCar(); @@ -382,6 +387,7 @@ void InternalShot(Creature* c, bullet_info->invincible_buff_uniid = invincible_buff_uniid; bullet_info->trace_target_uniid = trace_target_uniid; bullet_info->keep_shot_animi_timer_ptr = keep_shot_animi_timer_ptr; + bullet_info->shot_animi_time = shot_animi_time; if (skill_meta && (skill_meta->GetMagicId() == MAGIC_AXXF || skill_meta->GetMagicId() == MAGIC_HJHX)) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 43eab4d5..7b927be1 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -599,7 +599,8 @@ int Room::CreateBullet(Creature* sender, long long weapon_uniid, int trace_target_id, int hand, - std::weak_ptr keep_shot_animi_timer_ptr) + std::weak_ptr keep_shot_animi_timer_ptr, + float shot_animi_time) { int bullet_uniid = 0; if (grid_service->CanAdd(pos.x, pos.y)) { @@ -621,6 +622,7 @@ int Room::CreateBullet(Creature* sender, bullet->trace_target_id = trace_target_id; bullet->hand = hand; bullet->keep_shot_animi_timer_ptr = keep_shot_animi_timer_ptr; + bullet->shot_animi_time = shot_animi_time; bullet->Initialize(); AddObjectLater(bullet); bullet_uniid = bullet->GetUniId(); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 8bd6b923..e8cab542 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -173,7 +173,8 @@ public: long long weapon_uniid, int trace_target_id, int hand, - std::weak_ptr keep_shot_animi_timer_ptr); + std::weak_ptr keep_shot_animi_timer_ptr, + float shot_animi_time); Car* CreateCar(Human* driver, int car_uniid, MetaData::Equip* meta, From 337d2e4395b2107a5618f601e4f59a36251ca7b8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 16:16:01 +0800 Subject: [PATCH 2/7] 1 --- server/gameserver/creature.cc | 4 +++- server/gameserver/metamgr.cc | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 7600ac58..80ff9476 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -227,8 +227,9 @@ static void CalcGunMuzzlePosition(Creature* c, 0 ); } + #if 0 if (weapon_meta->movex_position) { - gun_muzzle_position += + gun_muzzle_position -= glm::vec4( std::get<0>(*weapon_meta->movex_position.get()), std::get<1>(*weapon_meta->movex_position.get()), @@ -236,6 +237,7 @@ static void CalcGunMuzzlePosition(Creature* c, 0 ); } + #endif } void InternalShot(Creature* c, diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index be9b5022..2897b977 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -718,6 +718,17 @@ private: movez ); } + a8::UdpLog::Instance()->Info + ("weapon animation equip_id:%d x:%f y:%f z:%f movex:%f lmovey:%f movez:%f", + { + equip_id, + x, + y, + z, + movex, + movey, + movez + }); } } } From 0fae7e9da2d2cc67dbc962c78f3d46fd3fd624b6 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 16:52:29 +0800 Subject: [PATCH 3/7] 1 --- server/gameserver/creature.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 80ff9476..c1ffd5ab 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -220,12 +220,21 @@ static void CalcGunMuzzlePosition(Creature* c, }//end if if (weapon_meta->gun_muzzle_position) { gun_muzzle_position += +#if 1 + glm::vec4( + -std::get<0>(*weapon_meta->gun_muzzle_position.get()), + std::get<1>(*weapon_meta->gun_muzzle_position.get()), + std::get<2>(*weapon_meta->gun_muzzle_position.get()), + 0 + ); +#else glm::vec4( std::get<0>(*weapon_meta->gun_muzzle_position.get()), std::get<1>(*weapon_meta->gun_muzzle_position.get()), std::get<2>(*weapon_meta->gun_muzzle_position.get()), 0 ); + #endif } #if 0 if (weapon_meta->movex_position) { @@ -345,6 +354,13 @@ void InternalShot(Creature* c, auto transform = glm::rotate(hero_transform, bullet_born_angle * A8_PI, glm::vec3(0.0, 1.0, 0.0)); +#if 1 + if (c->IsCar()) { + transform = glm::rotate(hero_transform, + 0 * A8_PI, + glm::vec3(0.0, 1.0, 0.0)); + } +#endif glm::vec4 gun_muzzle_position(0.0, 0.0, 0.0, 0.0); CalcGunMuzzlePosition(c, weapon_meta, shot_animi, gun_muzzle_position, bulletIdx, bulletNum); glm::vec4 v = transform * gun_muzzle_position; From 7e7e3e9b2d427a11df14c180b3ad2dda3d372b16 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 17:28:57 +0800 Subject: [PATCH 4/7] 1 --- server/gameserver/car.h | 3 +++ server/gameserver/creature.cc | 9 +-------- server/gameserver/moveableentity.h | 1 + server/gameserver/player.cc | 4 +++- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/server/gameserver/car.h b/server/gameserver/car.h index f0335ac9..e7a5831b 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -50,7 +50,9 @@ class Car : public Creature virtual void SendDebugMsg(const std::string& debug_msg) override; virtual void SetAttackDir(const a8::Vec2& attack_dir) override; virtual void DropItems(Obstacle* obstacle) override; + virtual const a8::Vec2& GetShotDir() { return curr_shot_dir_; }; void OnKillTarget(Creature* target); + void SetShotDir(const a8::Vec2& dir) { curr_shot_dir_ = dir; }; private: int AllocSeat(); @@ -69,5 +71,6 @@ class Car : public Creature int cur_buff_id_ = 0; int cur_buff_idx_ = -1; float cur_oil_ = 0; + a8::Vec2 curr_shot_dir_; CircleCollider* self_collider_ = nullptr; }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index c1ffd5ab..0ce13f2c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -328,7 +328,7 @@ void InternalShot(Creature* c, ++bulletIdx; a8::Vec2 bullet_born_offset = a8::Vec2(std::get<0>(tuple), std::get<1>(tuple)); a8::Vec2 bullet_born_pos = c->GetPos() + c->shoot_offset + bullet_born_offset; - a8::Vec2 bullet_dir = c->GetAttackDir(); + a8::Vec2 bullet_dir = c->GetShotDir(); float bullet_angle = std::get<2>(tuple); if (weapon_meta->i->bullet_angle() >= 0.10f) { int angle = (int)weapon_meta->i->bullet_angle() * 1000; @@ -354,13 +354,6 @@ void InternalShot(Creature* c, auto transform = glm::rotate(hero_transform, bullet_born_angle * A8_PI, glm::vec3(0.0, 1.0, 0.0)); -#if 1 - if (c->IsCar()) { - transform = glm::rotate(hero_transform, - 0 * A8_PI, - glm::vec3(0.0, 1.0, 0.0)); - } -#endif glm::vec4 gun_muzzle_position(0.0, 0.0, 0.0, 0.0); CalcGunMuzzlePosition(c, weapon_meta, shot_animi, gun_muzzle_position, bulletIdx, bulletNum); glm::vec4 v = transform * gun_muzzle_position; diff --git a/server/gameserver/moveableentity.h b/server/gameserver/moveableentity.h index 9bfbe646..3f39a356 100644 --- a/server/gameserver/moveableentity.h +++ b/server/gameserver/moveableentity.h @@ -28,6 +28,7 @@ class MoveableEntity : public RoomEntity virtual void SetMoveDir(const a8::Vec2& move_dir); virtual const a8::Vec2& GetAttackDir() { return attack_dir_; }; virtual void SetAttackDir(const a8::Vec2& attack_dir); + virtual const a8::Vec2& GetShotDir() { return attack_dir_; }; int GetChgMoveDirTimes() { return chg_move_dir_times_; } int GetChgAttackDirTimes() { return chg_attack_dir_times_; } float GetAttackDirRotate(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 448ba61c..5a467041 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -313,14 +313,16 @@ void Player::UpdateShot() GetCar()->shoot_offset = shoot_offset; GetCar()->shot_hole = GetSeat(); GetCar()->shot_passenger = this; - GetCar()->SetAttackDir(GetAttackDir()); + GetCar()->SetShotDir(GetAttackDir()); GetCar()->Shot(target_dir, shot_ok, fly_distance, 0); if (!moving && GetCar()->IsDriver(this)) { GetCar()->SetMoveDir(GetAttackDir()); } + #if 0 if (!GetCar()->IsDriver(this)) { GetCar()->SetAttackDir(old_car_attack_dir); } + #endif GetCar()->shot_hole = old_car_shot_hole; GetCar()->shoot_offset = old_car_shoot_offset; GetCar()->shot_passenger = old_car_shot_passenger; From d43e781022fdba7b9ad0c26871152b0468e63488 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 19:36:36 +0800 Subject: [PATCH 5/7] 1 --- server/gameserver/bullet.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 9e8d0e4e..47dec281 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -80,7 +80,10 @@ void Bullet::OnHit(std::set& objects) if (IsFlyHook()) { if (sender.Get() && !sender.Get()->dead) { for (auto& target : objects) { - ProcFlyHook(target); + if (target->IsCreature(room) && + !((Creature*)target)->IsCar()) { + ProcFlyHook(target); + } break; } } From 9b77cb1b911d2cd06435110e153af517d4ac743d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 20:12:46 +0800 Subject: [PATCH 6/7] 1 --- server/gameserver/bullet.cc | 14 ++++++++++++-- server/gameserver/creature.cc | 3 ++- server/gameserver/creature.h | 3 ++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 47dec281..73423044 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -809,9 +809,19 @@ void Bullet::ProcFlyHook(Entity* target) if (target->IsCreature(room)) { Creature* c = (Creature*)target; room->frame_event.AddPropChg(c->GetWeakPtrRef(), kPropBeHook, 0, sender.Get()->GetUniId()); - c->AutoNavigation(born_pos, gun_meta->i->bullet_speed() * 2); + int buff_uniid = c->TryAddBuff(c, gun_meta->i->buffid()); + c->AutoNavigation(born_pos, gun_meta->i->bullet_speed() * 2, + [buff_uniid] (Creature* c) + { + c->RemoveBuffByUniId(buff_uniid); + } + ); } else { - sender.Get()->AutoNavigation(GetPos(), gun_meta->i->bullet_speed() * 2); + sender.Get()->AutoNavigation(GetPos(), gun_meta->i->bullet_speed() * 2, + [] (Creature* c) + { + + }); } sender.Get()->IncDisableMoveTimes(); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 0ce13f2c..5ee4f5a6 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -3616,7 +3616,8 @@ void Creature::_UpdateSpecMove() } } -void Creature::AutoNavigation(a8::Vec2 target_pos, float speed) +void Creature::AutoNavigation(a8::Vec2 target_pos, float speed, + std::function cb) { float distance = GetPos().Distance(target_pos); if (distance < 0.001f) { diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 5e28151a..6f166c3a 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -278,7 +278,8 @@ class Creature : public MoveableEntity float GetAttrAbs(int attr_id); float GetAttrRate(int attr_id); void RecalcDtoAttr(); - void AutoNavigation(a8::Vec2 target_pos, float speed); + void AutoNavigation(a8::Vec2 target_pos, float speed, + std::function cb); void AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id); void LockAttackDir(int time); From d943bdf50e9d8c5dc22261e9c6d2c2621b6f04d5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 20:40:17 +0800 Subject: [PATCH 7/7] 1 --- server/gameserver/bullet.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 73423044..c78f5516 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -614,7 +614,19 @@ void Bullet::Check(float distance) sender.Get()->IncDisableAttackDirTimes(); sender.Get()->room->xtimer.AddDeadLineTimerAndAttach ( - (0.2 + distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, + (distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(sender.Get()), + [] (const a8::XParams& param) + { + Creature* c = (Creature*)param.sender.GetUserData(); + c->RemoveBuffById(kKeepShotAnimiBuffId); + }, + &sender.Get()->xtimer_attacher.timer_list_ + ); + sender.Get()->room->xtimer.AddDeadLineTimerAndAttach + ( + (0.75 + distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, a8::XParams() .SetSender(sender.Get()), [] (const a8::XParams& param) @@ -622,7 +634,6 @@ void Bullet::Check(float distance) Creature* c = (Creature*)param.sender.GetUserData(); c->DecDisableMoveTimes(); c->DecDisableAttackDirTimes(); - c->RemoveBuffById(kKeepShotAnimiBuffId); }, &sender.Get()->xtimer_attacher.timer_list_ ); @@ -827,7 +838,7 @@ void Bullet::ProcFlyHook(Entity* target) sender.Get()->IncDisableMoveTimes(); sender.Get()->room->xtimer.AddDeadLineTimerAndAttach ( - (distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, + (distance / gun_meta->i->bullet_speed() / 2 + 0.75) * SERVER_FRAME_RATE, a8::XParams() .SetSender(sender.Get()), [] (const a8::XParams& param)