完成子弹hit逻辑
This commit is contained in:
parent
d9164d85dc
commit
28e4f36c4f
@ -51,88 +51,7 @@ void Bullet::RecalcSelfCollider()
|
|||||||
void Bullet::OnHit(std::set<Entity*>& objects)
|
void Bullet::OnHit(std::set<Entity*>& objects)
|
||||||
{
|
{
|
||||||
for (auto& target : objects) {
|
for (auto& target : objects) {
|
||||||
switch (target->GetEntityType()) {
|
target->OnBulletHit(this);
|
||||||
case ET_Player:
|
|
||||||
{
|
|
||||||
Human* hum = (Human*)target;
|
|
||||||
if (hum->IsInvincible()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (sender.Get()->room->GetRoomMode() == kZombieMode &&
|
|
||||||
sender.Get()->GetRace() == hum->GetRace()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!hum->dead && (IsBomb() || sender.Get()->team_id != hum->team_id)) {
|
|
||||||
float dmg = GetAtk() * (1 + sender.Get()->GetAttrRate(kHAT_Atk)) +
|
|
||||||
sender.Get()->GetAttrAbs(kHAT_Atk);
|
|
||||||
float def = hum->ability.def * (1 + hum->GetAttrRate(kHAT_Def)) +
|
|
||||||
hum->GetAttrAbs(kHAT_Def);
|
|
||||||
float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K);
|
|
||||||
finaly_dmg = std::max(finaly_dmg, 0.0f);
|
|
||||||
#if 0
|
|
||||||
sender->stats.damage_amount_out += finaly_dmg;
|
|
||||||
#endif
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (App::Instance()->HasFlag(1) && hum->IsPlayer()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (meta->buff_meta) {
|
|
||||||
hum->MustBeAddBuff(hum, meta->i->buffid());
|
|
||||||
}
|
|
||||||
hum->DecHP(finaly_dmg, sender.Get()->GetEntityUniId(), sender.Get()->GetName(), gun_meta->i->id());
|
|
||||||
#ifdef DEBUG
|
|
||||||
sender.Get()->SendDebugMsg(a8::Format("bullet weapon_id:%d atk:%f",
|
|
||||||
{
|
|
||||||
gun_meta->i->id(),
|
|
||||||
GetAtk()
|
|
||||||
})
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ET_Obstacle:
|
|
||||||
{
|
|
||||||
Obstacle* obstacle = (Obstacle*)target;
|
|
||||||
if (!obstacle->IsDead(room) &&
|
|
||||||
obstacle->Attackable() &&
|
|
||||||
!obstacle->IsTerminatorAirDropBox(room)) {
|
|
||||||
float dmg = GetAtk() * (1 + sender.Get()->GetAttrRate(kHAT_Atk)) +
|
|
||||||
sender.Get()->GetAttrAbs(kHAT_Atk);
|
|
||||||
float def = 0;
|
|
||||||
float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K);
|
|
||||||
obstacle->SetHealth(room, std::max(0.0f, obstacle->GetHealth(room) - finaly_dmg));
|
|
||||||
if (obstacle->GetHealth(room) <= 0.01f) {
|
|
||||||
obstacle->Die(room);
|
|
||||||
}
|
|
||||||
if (obstacle->IsDead(room)) {
|
|
||||||
if (obstacle->meta->i->damage_dia() > 0.01f &&
|
|
||||||
obstacle->meta->i->damage() > 0.01f) {
|
|
||||||
obstacle->Explosion(this);
|
|
||||||
}
|
|
||||||
sender.Get()->DropItems(obstacle);
|
|
||||||
}
|
|
||||||
obstacle->BroadcastFullState(room);
|
|
||||||
#ifdef DEBUG
|
|
||||||
sender.Get()->SendDebugMsg(a8::Format("bullet weapon_id:%d atk:%f",
|
|
||||||
{
|
|
||||||
gun_meta->i->id(),
|
|
||||||
GetAtk()
|
|
||||||
})
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ET_Car:
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,8 @@ class Bullet : public MoveableEntity
|
|||||||
virtual void Initialize() override;
|
virtual void Initialize() override;
|
||||||
virtual void Update(int delta_time) override;
|
virtual void Update(int delta_time) override;
|
||||||
void RecalcSelfCollider();
|
void RecalcSelfCollider();
|
||||||
|
bool IsBomb();
|
||||||
|
float GetAtk();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Bullet();
|
Bullet();
|
||||||
@ -46,9 +48,7 @@ protected:
|
|||||||
void ProcFragBomb(int delay_time);
|
void ProcFragBomb(int delay_time);
|
||||||
void ProcPosionGasBomb(int delay_time);
|
void ProcPosionGasBomb(int delay_time);
|
||||||
void ProcMolotorCocktailBomb(int delay_time);
|
void ProcMolotorCocktailBomb(int delay_time);
|
||||||
bool IsBomb();
|
|
||||||
inline void MapServiceUpdate();
|
inline void MapServiceUpdate();
|
||||||
float GetAtk();
|
|
||||||
void Check(float distance);
|
void Check(float distance);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -36,6 +36,8 @@ void Car::Initialize()
|
|||||||
SetCurrWeapon(&weapons[GUN_SLOT1]);
|
SetCurrWeapon(&weapons[GUN_SLOT1]);
|
||||||
}
|
}
|
||||||
born_frameno_ = room->GetFrameNo();
|
born_frameno_ = room->GetFrameNo();
|
||||||
|
ability.hp = hero_meta_->i->health();
|
||||||
|
ability.max_hp = std::max(ability.hp, ability.max_hp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Car::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data)
|
void Car::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data)
|
||||||
@ -198,8 +200,7 @@ void Car::SyncPos()
|
|||||||
|
|
||||||
float Car::GetRadius()
|
float Car::GetRadius()
|
||||||
{
|
{
|
||||||
abort();
|
return hero_meta_->i->radius();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float Car::GetSpeed()
|
float Car::GetSpeed()
|
||||||
@ -207,3 +208,8 @@ float Car::GetSpeed()
|
|||||||
float speed = hero_meta_->i->move_speed();
|
float speed = hero_meta_->i->move_speed();
|
||||||
return speed;
|
return speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Car::OnBulletHit(Bullet* bullet)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -24,6 +24,7 @@ class Car : public Creature
|
|||||||
virtual void Initialize() override;
|
virtual void Initialize() override;
|
||||||
virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override;
|
virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override;
|
||||||
virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override;
|
virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override;
|
||||||
|
virtual void OnBulletHit(Bullet* bullet) override;
|
||||||
|
|
||||||
bool IsDriver(Human* hum) { return driver_ == hum && driver_; }
|
bool IsDriver(Human* hum) { return driver_ == hum && driver_; }
|
||||||
void GetDown(Human* passenger);
|
void GetDown(Human* passenger);
|
||||||
|
@ -11,6 +11,7 @@ class ColliderComponent;
|
|||||||
class AabbCollider;
|
class AabbCollider;
|
||||||
class CircleCollider;
|
class CircleCollider;
|
||||||
class Human;
|
class Human;
|
||||||
|
class Bullet;
|
||||||
class Entity
|
class Entity
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -30,6 +31,7 @@ class Entity
|
|||||||
virtual long long GetDeadFrameNo(Room* room) { return 0;};
|
virtual long long GetDeadFrameNo(Room* room) { return 0;};
|
||||||
virtual void OnPreCollision(Room* room) {};
|
virtual void OnPreCollision(Room* room) {};
|
||||||
virtual void RecalcSelfCollider() {};
|
virtual void RecalcSelfCollider() {};
|
||||||
|
virtual void OnBulletHit(Bullet* bullet) {};
|
||||||
int GetEntityUniId() const { return entity_uniid_; }
|
int GetEntityUniId() const { return entity_uniid_; }
|
||||||
EntityType_e GetEntityType() const { return entity_type_; }
|
EntityType_e GetEntityType() const { return entity_type_; }
|
||||||
EntitySubType_e GetEntitySubType() const { return entity_subtype_; }
|
EntitySubType_e GetEntitySubType() const { return entity_subtype_; }
|
||||||
|
@ -3644,3 +3644,46 @@ void Human::AddHp(float hp)
|
|||||||
stats.heal_amount += GetHP() - old_health;
|
stats.heal_amount += GetHP() - old_health;
|
||||||
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Human::OnBulletHit(Bullet* bullet)
|
||||||
|
{
|
||||||
|
if (IsInvincible()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (bullet->sender.Get()->room->GetRoomMode() == kZombieMode &&
|
||||||
|
bullet->sender.Get()->GetRace() == GetRace()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) {
|
||||||
|
float dmg = bullet->GetAtk() * (1 + bullet->sender.Get()->GetAttrRate(kHAT_Atk)) +
|
||||||
|
bullet->sender.Get()->GetAttrAbs(kHAT_Atk);
|
||||||
|
float def = ability.def * (1 + GetAttrRate(kHAT_Def)) +
|
||||||
|
GetAttrAbs(kHAT_Def);
|
||||||
|
float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K);
|
||||||
|
finaly_dmg = std::max(finaly_dmg, 0.0f);
|
||||||
|
#if 0
|
||||||
|
sender->stats.damage_amount_out += finaly_dmg;
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (App::Instance()->HasFlag(1) && IsPlayer()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (bullet->meta->buff_meta) {
|
||||||
|
MustBeAddBuff(this, bullet->meta->i->buffid());
|
||||||
|
}
|
||||||
|
DecHP(finaly_dmg,
|
||||||
|
bullet->sender.Get()->GetEntityUniId(),
|
||||||
|
bullet->sender.Get()->GetName(),
|
||||||
|
bullet->gun_meta->i->id());
|
||||||
|
#ifdef DEBUG
|
||||||
|
bullet->sender.Get()->SendDebugMsg
|
||||||
|
(a8::Format("bullet weapon_id:%d atk:%f",
|
||||||
|
{
|
||||||
|
bullet->gun_meta->i->id(),
|
||||||
|
bullet->GetAtk()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -151,6 +151,7 @@ class Human : public Creature
|
|||||||
virtual void GetHitAabbBox(AabbCollider& aabb_box) override;
|
virtual void GetHitAabbBox(AabbCollider& aabb_box) override;
|
||||||
virtual bool IsDead(Room* room) override;
|
virtual bool IsDead(Room* room) override;
|
||||||
virtual long long GetDeadFrameNo(Room* room) override;
|
virtual long long GetDeadFrameNo(Room* room) override;
|
||||||
|
virtual void OnBulletHit(Bullet* bullet) override;
|
||||||
void FillItemList(::google::protobuf::RepeatedPtrField<::cs::MFPair>* pb_item_list);
|
void FillItemList(::google::protobuf::RepeatedPtrField<::cs::MFPair>* pb_item_list);
|
||||||
long long GetRealDeadFrameNo(Room* room);
|
long long GetRealDeadFrameNo(Room* room);
|
||||||
void FillMFTeamData(cs::MFTeamData* team_data, bool is_game_over);
|
void FillMFTeamData(cs::MFTeamData* team_data, bool is_game_over);
|
||||||
|
@ -516,3 +516,37 @@ void Obstacle::SetMasterId(Room* room, int master_id)
|
|||||||
master_id_ = master_id;
|
master_id_ = master_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Obstacle::OnBulletHit(Bullet* bullet)
|
||||||
|
{
|
||||||
|
if (!IsDead(bullet->room) &&
|
||||||
|
Attackable() &&
|
||||||
|
!IsTerminatorAirDropBox(bullet->room)) {
|
||||||
|
float dmg = bullet->GetAtk() * (1 + bullet->sender.Get()->GetAttrRate(kHAT_Atk)) +
|
||||||
|
bullet->sender.Get()->GetAttrAbs(kHAT_Atk);
|
||||||
|
float def = 0;
|
||||||
|
float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K);
|
||||||
|
SetHealth(bullet->room, std::max(0.0f, GetHealth(bullet->room) - finaly_dmg));
|
||||||
|
if (GetHealth(bullet->room) <= 0.01f) {
|
||||||
|
Die(bullet->room);
|
||||||
|
}
|
||||||
|
if (IsDead(bullet->room)) {
|
||||||
|
if (meta->i->damage_dia() > 0.01f &&
|
||||||
|
meta->i->damage() > 0.01f) {
|
||||||
|
Explosion(bullet);
|
||||||
|
}
|
||||||
|
bullet->sender.Get()->DropItems(this);
|
||||||
|
}
|
||||||
|
BroadcastFullState(bullet->room);
|
||||||
|
#ifdef DEBUG
|
||||||
|
bullet->sender.Get()->SendDebugMsg
|
||||||
|
(
|
||||||
|
a8::Format("bullet weapon_id:%d atk:%f",
|
||||||
|
{
|
||||||
|
bullet->gun_meta->i->id(),
|
||||||
|
bullet->GetAtk()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -39,6 +39,7 @@ class Obstacle : public Entity
|
|||||||
virtual bool IsDead(Room* room) override;
|
virtual bool IsDead(Room* room) override;
|
||||||
virtual long long GetDeadFrameNo(Room* room) override;
|
virtual long long GetDeadFrameNo(Room* room) override;
|
||||||
virtual void OnPreCollision(Room* room) override;
|
virtual void OnPreCollision(Room* room) override;
|
||||||
|
virtual void OnBulletHit(Bullet* bullet) override;
|
||||||
virtual bool IsTerminatorAirDropBox(Room* room) { return false; }
|
virtual bool IsTerminatorAirDropBox(Room* room) { return false; }
|
||||||
virtual bool CanThroughable(Human* num) { return false; }
|
virtual bool CanThroughable(Human* num) { return false; }
|
||||||
void Explosion(Bullet* bullet);
|
void Explosion(Bullet* bullet);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user