1
This commit is contained in:
parent
28e4f36c4f
commit
e73cc99198
@ -7,6 +7,7 @@
|
|||||||
#include "loot.h"
|
#include "loot.h"
|
||||||
#include "perfmonitor.h"
|
#include "perfmonitor.h"
|
||||||
#include "typeconvert.h"
|
#include "typeconvert.h"
|
||||||
|
#include "bullet.h"
|
||||||
|
|
||||||
Car::Car():Creature()
|
Car::Car():Creature()
|
||||||
{
|
{
|
||||||
@ -211,5 +212,38 @@ float Car::GetSpeed()
|
|||||||
|
|
||||||
void Car::OnBulletHit(Bullet* bullet)
|
void Car::OnBulletHit(Bullet* bullet)
|
||||||
{
|
{
|
||||||
|
if (!IsDead(room)) {
|
||||||
|
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);
|
||||||
|
DecHP(finaly_dmg,
|
||||||
|
bullet->sender.Get()->GetEntityUniId(),
|
||||||
|
bullet->sender.Get()->GetName(),
|
||||||
|
bullet->gun_meta->i->id());
|
||||||
|
if (bullet->meta->buff_meta) {
|
||||||
|
MustBeAddBuff(this, bullet->meta->i->buffid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Car::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id)
|
||||||
|
{
|
||||||
|
float old_health = GetHP();
|
||||||
|
float new_health = std::max(0.0f, GetHP() - dec_hp);
|
||||||
|
ability.hp = std::max(0.0f, new_health);
|
||||||
|
if (GetHP() <= 0.0001f && !IsDead(room)) {
|
||||||
|
BeKill(killer_id, killer_name, weapon_id);
|
||||||
|
}
|
||||||
|
room->frame_event.AddHpChg(GetWeakPtrRef());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Car::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
||||||
|
{
|
||||||
|
dead = true;
|
||||||
|
BroadcastDeleteState(room);
|
||||||
|
RemoveFromAroundPlayers(room);
|
||||||
|
room->grid_service->RemoveCreature(this);
|
||||||
}
|
}
|
||||||
|
@ -32,9 +32,11 @@ class Car : public Creature
|
|||||||
void SyncPos();
|
void SyncPos();
|
||||||
virtual float GetRadius() override;
|
virtual float GetRadius() override;
|
||||||
virtual float GetSpeed() override;
|
virtual float GetSpeed() override;
|
||||||
|
virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int AllocSeat();
|
int AllocSeat();
|
||||||
|
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
long long born_frameno_ = 0;
|
long long born_frameno_ = 0;
|
||||||
|
@ -183,11 +183,11 @@ void FrameEvent::AddPlaySkill(CreatureWeakPtr& sender, int skill_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameEvent::AddHpChg(Human* sender)
|
void FrameEvent::AddHpChg(CreatureWeakPtr& sender)
|
||||||
{
|
{
|
||||||
chged_hps_.push_back(sender);
|
chged_hps_.push_back(sender);
|
||||||
int idx = chged_hps_.size() - 1;
|
int idx = chged_hps_.size() - 1;
|
||||||
sender->TouchAllLayerHumanList
|
sender.Get()->TouchAllLayerHumanList
|
||||||
(
|
(
|
||||||
[idx] (Human* hum, bool& stop)
|
[idx] (Human* hum, bool& stop)
|
||||||
{
|
{
|
||||||
|
@ -25,7 +25,7 @@ public:
|
|||||||
void AddPlaySkill(CreatureWeakPtr& sender, int skill_id);
|
void AddPlaySkill(CreatureWeakPtr& sender, int skill_id);
|
||||||
void AddExplosionEx(CreatureWeakPtr& sender, int item_id, a8::Vec2 bomb_pos, int effect);
|
void AddExplosionEx(CreatureWeakPtr& sender, int item_id, a8::Vec2 bomb_pos, int effect);
|
||||||
void AddBulletNumChg(Human* hum);
|
void AddBulletNumChg(Human* hum);
|
||||||
void AddHpChg(Human* hum);
|
void AddHpChg(CreatureWeakPtr& sender);
|
||||||
void AddWeaponAmmoChg(Human* hum);
|
void AddWeaponAmmoChg(Human* hum);
|
||||||
void AddBuff(CreatureWeakPtr& sender, Buff* buff);
|
void AddBuff(CreatureWeakPtr& sender, Buff* buff);
|
||||||
void RemoveBuff(CreatureWeakPtr& sender, int buff_id);
|
void RemoveBuff(CreatureWeakPtr& sender, int buff_id);
|
||||||
@ -50,7 +50,7 @@ private:
|
|||||||
std::vector<std::tuple<Human*, int, int>> chged_items_;
|
std::vector<std::tuple<Human*, int, int>> chged_items_;
|
||||||
std::vector<Human*> chged_bullet_nums_;
|
std::vector<Human*> chged_bullet_nums_;
|
||||||
std::vector<std::tuple<Human*, int, int>> chged_weapon_ammo_;
|
std::vector<std::tuple<Human*, int, int>> chged_weapon_ammo_;
|
||||||
std::vector<Human*> chged_hps_;
|
std::vector<CreatureWeakPtr> chged_hps_;
|
||||||
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skillcds_;
|
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skillcds_;
|
||||||
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skill_curr_times_;
|
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skill_curr_times_;
|
||||||
std::vector<Human*> chged_zombieids_;
|
std::vector<Human*> chged_zombieids_;
|
||||||
|
@ -222,19 +222,19 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
|
|||||||
}
|
}
|
||||||
for (size_t idx : hum->chged_hps_) {
|
for (size_t idx : hum->chged_hps_) {
|
||||||
if (idx < room->frame_event.chged_hps_.size()) {
|
if (idx < room->frame_event.chged_hps_.size()) {
|
||||||
Human* target = room->frame_event.chged_hps_[idx];
|
CreatureWeakPtr& target = room->frame_event.chged_hps_[idx];
|
||||||
if (hum->CanSee(target)) {
|
if (target.Get() && hum->CanSee(target.Get())) {
|
||||||
{
|
{
|
||||||
auto p = msg->add_chged_property_list();
|
auto p = msg->add_chged_property_list();
|
||||||
p->set_obj_id(target->GetEntityUniId());
|
p->set_obj_id(target.Get()->GetEntityUniId());
|
||||||
p->set_property_type(kPropHp);
|
p->set_property_type(kPropHp);
|
||||||
p->set_value(target->GetHP());
|
p->set_value(target.Get()->GetHP());
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto p = msg->add_chged_property_list();
|
auto p = msg->add_chged_property_list();
|
||||||
p->set_obj_id(target->GetEntityUniId());
|
p->set_obj_id(target.Get()->GetEntityUniId());
|
||||||
p->set_property_type(kPropMaxHp);
|
p->set_property_type(kPropMaxHp);
|
||||||
p->set_value(target->GetMaxHP());
|
p->set_value(target.Get()->GetMaxHP());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -952,7 +952,7 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
room->frame_event.AddHpChg(this);
|
room->frame_event.AddHpChg(GetWeakPtrRef());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3021,7 +3021,7 @@ void Human::OnMetaChange()
|
|||||||
ability.hp += weapon.meta ? weapon.GetAttrValue(kHAT_MaxHp) : 0;
|
ability.hp += weapon.meta ? weapon.GetAttrValue(kHAT_MaxHp) : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
room->frame_event.AddHpChg(this);
|
room->frame_event.AddHpChg(GetWeakPtrRef());
|
||||||
RecalcBaseAttr();
|
RecalcBaseAttr();
|
||||||
ClearSkill();
|
ClearSkill();
|
||||||
AddSkill(meta->i->active_skill());
|
AddSkill(meta->i->active_skill());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user