This commit is contained in:
aozhiwei 2022-09-14 10:36:26 +08:00
parent 83a971edc8
commit 7901b273c4
6 changed files with 46 additions and 16 deletions

View File

@ -12,6 +12,7 @@
#include "skill.h" #include "skill.h"
#include "incubator.h" #include "incubator.h"
#include "car.h" #include "car.h"
#include "frameevent.h"
Buff::Buff() Buff::Buff()
{ {
@ -961,7 +962,12 @@ void Buff::ProcReserveMove()
void Buff::ProcHoldShield() void Buff::ProcHoldShield()
{ {
owner->hold_shield_hp = meta->int_param2; owner->shield_hp_ = meta->int_param2;
owner->shield_max_hp_ = meta->int_param2;
owner->room->frame_event.AddPropChg(owner->GetWeakPtrRef(),
kPropShieldHp,
owner->shield_max_hp_,
owner->shield_hp_);
} }
void Buff::ProcRemoveHoldShield() void Buff::ProcRemoveHoldShield()

View File

@ -512,24 +512,13 @@ void Bullet::Check(float distance)
{ {
Buff* hold_shield_buff = c->GetBuffByEffectId(kBET_HoldShield); Buff* hold_shield_buff = c->GetBuffByEffectId(kBET_HoldShield);
if (hold_shield_buff && !IsBomb() && !c->dead && c != sender.Get()) { if (hold_shield_buff && !IsBomb() && !c->dead && c != sender.Get()) {
float shot_angle = 0.0f; float shot_angle = shot_angle = dir.CalcAngleEx(c->GetAttackDir());
if (c->GetMoveDir().IsZero()) {
shot_angle = dir.CalcAngleEx(a8::Vec2::UP);
} else {
shot_angle = dir.CalcAngleEx(c->GetMoveDir());
}
CircleCollider collider; CircleCollider collider;
collider.owner = c; collider.owner = c;
collider.rad = hold_shield_buff->meta->param1; collider.rad = hold_shield_buff->meta->param1;
if (shot_angle < A8_PI / 4) { if (shot_angle * 180 < 90.0f) {
if (TestCollision(room, &collider)) {
eat = true;
stop = true;
return;
}
} else if (fabs(shot_angle) < 0.000001f &&
shot_angle + A8_PI < A8_PI / 4){
if (TestCollision(room, &collider)) { if (TestCollision(room, &collider)) {
c->OnBulletHit(this);
eat = true; eat = true;
stop = true; stop = true;
return; return;

View File

@ -286,6 +286,7 @@ enum PropertyType_e
kPropDive = 31, kPropDive = 31,
kPropSkillExp = 32, kPropSkillExp = 32,
kPropShieldHp = 33,
}; };
enum MapObjectType_e enum MapObjectType_e

View File

@ -87,7 +87,6 @@ class Creature : public MoveableEntity
long long poisoning_time = 0; long long poisoning_time = 0;
bool playing_skill = false; bool playing_skill = false;
int power_idx = -1; int power_idx = -1;
int hold_shield_hp = 0;
Weapon second_weapon; Weapon second_weapon;
a8::Vec2 context_pos; a8::Vec2 context_pos;
@ -103,6 +102,9 @@ class Creature : public MoveableEntity
int turn_over_times = 0; int turn_over_times = 0;
a8::Vec2 last_turn_over_pos; a8::Vec2 last_turn_over_pos;
int shield_hp_ = 0;
int shield_max_hp_ = 0;
Creature(); Creature();
virtual ~Creature() override; virtual ~Creature() override;
virtual void Initialize() override; virtual void Initialize() override;

View File

@ -555,6 +555,10 @@ void Human::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data
p->set_car_uniid(0); p->set_car_uniid(0);
p->set_car_seat(0); p->set_car_seat(0);
} }
if (GetBuffByEffectId(kBET_HoldShield)) {
p->set_shield_hp(shield_hp_);
p->set_shield_max_hp(shield_max_hp_);
}
} }
void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb)
@ -1597,6 +1601,10 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data)
player_data->set_shoot_offset_x(shoot_offset.x); player_data->set_shoot_offset_x(shoot_offset.x);
player_data->set_shoot_offset_y(shoot_offset.y); player_data->set_shoot_offset_y(shoot_offset.y);
GetAbility()->FillMFAttrAdditionList(room, this, player_data->mutable_attr_addition()); GetAbility()->FillMFAttrAdditionList(room, this, player_data->mutable_attr_addition());
if (GetBuffByEffectId(kBET_HoldShield)) {
player_data->set_shield_hp(shield_hp_);
player_data->set_shield_max_hp(shield_max_hp_);
}
} }
void Human::FillMFGasData(cs::MFGasData* gas_data) void Human::FillMFGasData(cs::MFGasData* gas_data)
@ -3495,6 +3503,21 @@ void Human::OnBulletHit(Bullet* bullet)
return; return;
} }
} }
{
Buff* buff = GetBuffByEffectId(kBET_HoldShield);
if (buff) {
float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet);
shield_hp_ = std::max(0.0f, shield_hp_ - finaly_dmg);
room->frame_event.AddPropChg(GetWeakPtrRef(),
kPropShieldHp,
shield_max_hp_,
shield_hp_);
if (shield_hp_ <= 0) {
RemoveBuffByUniId(buff->buff_uniid);
}
return;
}
}
#ifdef DEBUG #ifdef DEBUG
#if 0 #if 0
if (IsPlayer()) { if (IsPlayer()) {

View File

@ -149,6 +149,9 @@ message MFVec2
property_type: 32 (skill_id可能在本地找不到) property_type: 32 (skill_id可能在本地找不到)
property_subtype: skill_id property_subtype: skill_id
valule: valule:
property_type: 33
property_subtype:
valule:
*/ */
message MFPropertyChg message MFPropertyChg
{ {
@ -267,6 +270,9 @@ message MFPlayerFull
optional float shoot_offset_y = 51 [default = 0]; //-y optional float shoot_offset_y = 51 [default = 0]; //-y
optional string user_data = 60 [default = ""]; // optional string user_data = 60 [default = ""]; //
optional int32 shield_hp = 65; //
optional int32 shield_max_hp = 66; //
} }
//- //-
@ -485,6 +491,9 @@ message MFActivePlayerData
optional int32 energy_shield = 40; // optional int32 energy_shield = 40; //
optional int32 max_energy_shield = 41; // optional int32 max_energy_shield = 41; //
optional int32 shield_hp = 65; //
optional int32 shield_max_hp = 66; //
optional int32 spectator_count = 20; optional int32 spectator_count = 20;
repeated MFBodyState states = 27; // repeated MFBodyState states = 27; //