This commit is contained in:
aozhiwei 2021-03-19 11:57:03 +08:00
parent 5591cf792f
commit 4e40976eea
8 changed files with 384 additions and 315 deletions

View File

@ -4,6 +4,15 @@
#include "metamgr.h"
#include "room.h"
#include "skill.h"
#include "human.h"
Creature::~Creature()
{
for (auto& pair : skill_hash_) {
delete pair.second;
}
skill_hash_.clear();
}
bool Creature::HasBuffEffect(int buff_effect_id)
{
@ -79,6 +88,7 @@ void Creature::AddBuff(Creature* caster,
&buff->xtimer_attacher.timer_list_
);
}
ProcBuffEffect(caster, buff);
AddBuffPostProc(caster, buff);
#ifdef DEBUG
SendDebugMsg(a8::Format("添加buff_id:%d buff_effect:%d",
@ -301,7 +311,130 @@ void Creature::AddPassiveSkillBuff(MetaData::Skill* skill_meta)
void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list)
{
switch (CurrentSkill()->meta->i->skill_target()) {
case kST_All:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
if (hum->GetPos().Distance(target_pos) < CurrentSkill()->meta->i->skill_distance()) {
target_list.insert(hum);
}
});
}
break;
case kST_Self:
{
target_list.insert(this);
}
break;
case kST_FriendlyIncludeSelf:
{
target_list.insert(this);
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
#if 0
if ((hum == this || hum->team_id == team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->meta->i->skill_distance()) {
target_list.insert(hum);
}
#endif
});
}
break;
case kST_FriendlyExcludeSelf:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
#if 0
if ((hum != this && hum->team_id == team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) {
target_list.insert(hum);
}
#endif
});
}
break;
case kST_EnemySingle:
{
Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity && entity->IsEntityType(ET_Player)) {
Human* hum = (Human*)entity;
#if 0
if (IsEnemy(hum)) {
target_list.insert(hum);
}
#endif
}
}
break;
case kST_EnemyGroup:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
#if 0
if ((hum->team_id != team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) {
target_list.insert(hum);
}
#endif
});
}
break;
case kST_EnemyAndObject:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
#if 0
if ((hum->team_id != team_id) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) {
target_list.insert(hum);
}
#endif
});
}
break;
case kST_EnemyAndSelf:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
#if 0
if ((hum == this || this->IsEnemy(hum)) &&
hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) {
target_list.insert(hum);
}
#endif
});
}
break;
case kST_SingleEnemyAndSelf:
{
Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity && entity->IsEntityType(ET_Player)) {
Human* hum = (Human*)entity;
#if 0
if (IsEnemy(hum)) {
target_list.insert(hum);
}
#endif
}
target_list.insert(this);
}
break;
default:
break;
}
}
void Creature::TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type)
@ -462,3 +595,211 @@ Skill* Creature::CurrentSkill()
{
return nullptr;
}
void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
{
switch (buff->meta->i->buff_effect()) {
case kBET_ChgAttr:
case kBET_Car:
{
RecalcBuffAttr();
if (buff->meta->i->buff_effect() == kBET_Car) {
RecalcSelfCollider();
MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(buff->meta->param4);
if (equip_meta &&
equip_meta->i->equip_type() == EQUIP_TYPE_CAR &&
equip_meta->i->equip_subtype() == 1
) {
#if 0
MetaData::Equip* car_weapon_meta = MetaMgr::Instance()->GetEquip(equip_meta->int_param1);
if (car_weapon_meta) {
car_weapon.weapon_idx = 100;
car_weapon.weapon_id = car_weapon_meta->i->id();
car_weapon.weapon_lv = 1;
car_weapon.meta = car_weapon_meta;
car_weapon.Recalc();
car_weapon.ammo = car_weapon.GetClipVolume();
}
#endif
}
}
}
break;
case kBET_TurnOver:
{
Skill* skill = CurrentSkill();
if (skill) {
MetaData::SkillPhase* phase = GetCurrSkillPhase();
if (phase && phase->time_offset >= skill->GetLeftTime()) {
if (HasBuffEffect(kBET_Car)) {
_UpdateMove(phase->param1.GetDouble() * 1.5);
} else {
_UpdateMove(phase->param1);
}
}
}
}
break;
case kBET_Camouflage:
{
if (aiming) {
aiming = false;
}
if (action_type != AT_None) {
CancelAction();
}
}
break;
case kBET_BePull:
{
if (caster == this) {
abort();
}
float target_distance = caster->GetPos().Distance(GetPos());
if (target_distance <= 0.000001f) {
SetPos(caster->GetPos());
target_pos = caster->GetPos();
} else {
if (target_distance <= buff->meta->param3) {
SetPos(caster->GetPos());
target_pos = caster->GetPos();
} else {
move_dir = caster->GetPos() - GetPos();
move_dir.Normalize();
target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3);
}
}
}
break;
case kBET_JumpTo:
{
Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity) {
float target_distance = entity->GetPos().Distance(GetPos());
if (target_distance <= 0.000001f) {
SetPos(entity->GetPos());
skill_target_pos_ = entity->GetPos();
} else {
if (target_distance <= buff->meta->param3) {
SetPos(entity->GetPos());
skill_target_pos_ = entity->GetPos();
} else {
move_dir = entity->GetPos() - GetPos();
move_dir.Normalize();
skill_dir = move_dir;
skill_target_pos_ = GetPos() + move_dir * (target_distance - buff->meta->param3);
}
}
}
target_pos = skill_target_pos_;
}
break;
case kBET_Pull:
{
int i = 0;
}
break;
case kBET_Terminator:
{
#if 0
if (GetRace() == kHumanRace &&
MetaMgr::Instance()->terminator_meta &&
meta != MetaMgr::Instance()->terminator_meta) {
WinExp(this, MetaMgr::Instance()->terminator_meta->i->exp() + 1);
room->NotifySysPiao(TEXT("battle_server_terminator_appear", "终结者出现"), a8::MkRgb(255, 0, 0), 3);
OnChgToTerminator();
}
#endif
}
break;
case kBET_PlayShotAni:
{
}
break;
case kBET_Vertigo:
{
int i = 0;
}
break;
case kBET_DecHp:
{
#if 0
float def = hum->ability.def * (1 + hum->GetBuffAttrRate(kHAT_Def)) +
hum->GetBuffAttrAbs(kHAT_Def);
#endif
#if 0
if (caster->GetEntityType() == ET_Player) {
DecHP(buff->meta->param1,
caster->GetEntityUniId(),
((Human*)caster)->name,
0);
}
#endif
}
break;
case kBET_DelayAddBuff:
{
if (caster->GetEntityType() == ET_Player) {
room->xtimer.AddDeadLineTimerAndAttach
(
SERVER_FRAME_RATE * buff->meta->param1,
a8::XParams()
.SetSender(this)
.SetParam1(caster)
.SetParam2(buff->meta->param2)
.SetParam3(((Human*)caster)->skill_meta_),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
Human* caster = (Human*)param.param1.GetUserData();
int buff_id = param.param2;
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (buff_meta && skill == caster->skill_meta_ && caster) {
hum->AddBuff(caster, buff_meta, 1, skill);
}
},
&buff->xtimer_attacher.timer_list_);
}
}
break;
default:
{
}
break;
}
}
void Creature::Initialize()
{
MoveableEntity::Initialize();
skill_xtimer_attacher_.xtimer = &room->xtimer;
}
void Creature::AddSkill(int skill_id)
{
MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(skill_id);
if (skill_meta && !GetSkill(skill_id)) {
Skill* skill = new Skill;
skill->owner = this;
skill->meta = skill_meta;
skill_hash_[skill_id] = skill;
}
}
void Creature::ClearSkill()
{
Skill* reserve_skill = nullptr;
for (auto& pair : skill_hash_) {
if (pair.second->meta->i->skill_id() == TURN_OVER_SKILL_ID) {
reserve_skill = pair.second;
} else {
delete pair.second;
}
}
skill_hash_.clear();
if (reserve_skill) {
skill_hash_[reserve_skill->meta->i->skill_id()] = reserve_skill;
}
}

View File

@ -17,10 +17,15 @@ class Creature : public MoveableEntity
{
public:
bool aiming = false;
ActionType_e action_type = AT_None;
a8::Vec2 attack_dir;
HumanAbility ability;
a8::Vec2 target_pos;
std::function<bool ()> on_move_collision;
virtual ~Creature() override;
virtual void Initialize() override;
bool HasBuffEffect(int buff_effect_id);
Buff* GetBuffByEffectId(int effect_id);
Buff* GetBuffById(int buff_id);
@ -39,6 +44,8 @@ class Creature : public MoveableEntity
void FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* pb_buff_list);
void TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
Skill* GetSkill(int skill_id);
void AddSkill(int skill_id);
void ClearSkill();
void AddPassiveSkill(MetaData::Skill* skill_meta);
void RemovePassiveSkill(MetaData::Skill* skill_meta);
@ -54,15 +61,8 @@ class Creature : public MoveableEntity
Skill* CurrentSkill();
MetaData::SkillPhase* GetCurrSkillPhase();
protected:
a8::Vec2 skill_dir;
float skill_param1 = 0;
bool playing_skill = false;
int skill_target_id_ = 0;
a8::Vec2 skill_target_pos_;
a8::XTimerAttacher skill_xtimer_attacher_;
MetaData::Skill* skill_meta_ = nullptr;
virtual void CancelAction() {};
virtual void ResetAction() {};
private:
@ -72,8 +72,10 @@ private:
virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type);
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos);
virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos);
virtual void _UpdateMove(int speed) {};
void UpdateSkill();
void ProcSkillPhase(MetaData::SkillPhase* phase);
void ProcBuffEffect(Creature* caster, Buff* buff);
private:
std::array<float, kHAT_End> buff_attr_abs_ = {};
@ -81,7 +83,14 @@ private:
std::array<Buff*, kBET_End> buff_effect_ = {};
std::list<Buff> buff_list_;
a8::Vec2 skill_dir;
float skill_param1 = 0;
bool playing_skill = false;
MetaData::Skill* skill_meta_ = nullptr;
size_t curr_skill_phase = 0;
int skill_target_id_ = 0;
a8::Vec2 skill_target_pos_;
std::map<int, Skill*> skill_hash_;
a8::XTimerAttacher skill_xtimer_attacher_;
std::map<MetaData::Skill*, xtimer_list*> passive_skill_metas_;
};

View File

@ -26,6 +26,7 @@ class Entity
virtual bool IsDead(Room* room) { return false;};
virtual long long GetDeadFrameNo(Room* room) { return 0;};
virtual void OnPreCollision(Room* room) {};
virtual void RecalcSelfCollider() {};
int GetEntityUniId() const { return entity_uniid_; }
EntityType_e GetEntityType() const { return entity_type_; }
EntitySubType_e GetEntitySubType() const { return entity_subtype_; }

View File

@ -23,7 +23,7 @@ Hero::~Hero()
void Hero::Initialize()
{
MoveableEntity::Initialize();
Creature::Initialize();
RecalcSelfCollider();
ai = new HeroAI;
ai->owner = this;

View File

@ -20,7 +20,6 @@ public:
bool dead = false;
bool shot_hold = false;
int team_id = 0;
a8::Vec2 attack_dir;
Hero();
virtual ~Hero() override;
@ -37,7 +36,7 @@ protected:
void UpdateMove(int speed);
void InternalUpdateMove(float speed);
bool IsCollisionInMapService();
void RecalcSelfCollider();
virtual void RecalcSelfCollider() override;
private:
bool later_removed_ = false;

View File

@ -137,8 +137,7 @@ Human::~Human()
void Human::Initialize()
{
MoveableEntity::Initialize();
skill_xtimer_attacher_.xtimer = &room->xtimer;
Creature::Initialize();
RecalcSelfCollider();
volume_ = meta->volume;
observers_.insert(this);
@ -2003,12 +2002,13 @@ void Human::_UpdateSpecMove()
if (move_end) {
Buff* buff = GetBuffByEffectId(kBET_JumpTo);
if (buff) {
if (buff->skill_meta == skill_meta_ &&
!skill_meta_->phases.empty()) {
if (CurrentSkill() &&
buff->skill_meta == CurrentSkill()->meta &&
!CurrentSkill()->meta->phases.empty()) {
std::set<Entity*> target_list;
metatable::Skill* mutable_skill_meta = (metatable::Skill*)skill_meta_->i;
float old_skill_distance = skill_meta_->i->skill_distance();
mutable_skill_meta->set_skill_distance(skill_meta_->phases[0].param1.GetDouble());
metatable::Skill* mutable_skill_meta = (metatable::Skill*)CurrentSkill()->meta->i;
float old_skill_distance = CurrentSkill()->meta->i->skill_distance();
mutable_skill_meta->set_skill_distance(CurrentSkill()->meta->phases[0].param1.GetDouble());
SelectSkillTargets(GetPos(), target_list);
mutable_skill_meta->set_skill_distance(old_skill_distance);
@ -2102,6 +2102,7 @@ void Human::WinExp(Human* sender, int exp)
exp_ += exp;
MetaData::Player* old_meta = meta;
int start_meta_id = race_ == kHumanRace ? HUMAN_RACE_META_START_ID : ZOMBIE_RACE_META_START_ID;
ClearSkill();
do {
MetaData::Player* tmp_meta = MetaMgr::Instance()->GetPlayer(start_meta_id + level_);
if (!tmp_meta) {
@ -2109,7 +2110,7 @@ void Human::WinExp(Human* sender, int exp)
}
if (exp_ >= tmp_meta->i->exp()) {
meta = tmp_meta;
skill_meta_ = MetaMgr::Instance()->GetSkill(meta->i->active_skill());
AddSkill(meta->i->active_skill());
ResetSkill();
++level_;
} else {
@ -2905,28 +2906,28 @@ void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type)
if (hum->dead) {
return;
}
auto itr = skill_meta_->trigger_type_buffs.find(trigger_type);
if (itr != skill_meta_->trigger_type_buffs.end()) {
auto itr = CurrentSkill()->meta->trigger_type_buffs.find(trigger_type);
if (itr != CurrentSkill()->meta->trigger_type_buffs.end()) {
for (MetaData::Buff* buff_meta : itr->second) {
switch (buff_meta->i->buff_target()) {
case kBuffTargetSelf: //自己
{
if (hum == this) {
hum->AddBuff(this, buff_meta, 1, skill_meta_);
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
case kBuffTargetFriendly: //友军
{
if (hum->team_id == team_id) {
hum->AddBuff(this, buff_meta, 1, skill_meta_);
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
case kBuffTargetEnemy: //敌军
{
if (hum->team_id != team_id) {
hum->AddBuff(this, buff_meta, 1, skill_meta_);
hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta);
}
}
break;
@ -2940,171 +2941,6 @@ void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type)
void Human::AddBuffPostProc(Creature* caster, Buff* buff)
{
room->frame_event.AddBuff(this, buff);
switch (buff->meta->i->buff_effect()) {
case kBET_ChgAttr:
case kBET_Car:
{
RecalcBuffAttr();
if (buff->meta->i->buff_effect() == kBET_Car) {
RecalcSelfCollider();
MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(buff->meta->param4);
if (equip_meta &&
equip_meta->i->equip_type() == EQUIP_TYPE_CAR &&
equip_meta->i->equip_subtype() == 1
) {
MetaData::Equip* car_weapon_meta = MetaMgr::Instance()->GetEquip(equip_meta->int_param1);
if (car_weapon_meta) {
car_weapon.weapon_idx = 100;
car_weapon.weapon_id = car_weapon_meta->i->id();
car_weapon.weapon_lv = 1;
car_weapon.meta = car_weapon_meta;
car_weapon.Recalc();
car_weapon.ammo = car_weapon.GetClipVolume();
}
}
}
}
break;
case kBET_TurnOver:
{
Skill* skill = CurrentSkill();
if (skill) {
MetaData::SkillPhase* phase = GetCurrSkillPhase();
if (phase && phase->time_offset >= skill->GetLeftTime()) {
if (HasBuffEffect(kBET_Car)) {
_UpdateMove(phase->param1.GetDouble() * 1.5);
} else {
_UpdateMove(phase->param1);
}
}
}
}
break;
case kBET_Camouflage:
{
if (aiming) {
aiming = false;
}
if (action_type != AT_None) {
CancelAction();
}
}
break;
case kBET_BePull:
{
if (caster == this) {
abort();
}
float target_distance = caster->GetPos().Distance(GetPos());
if (target_distance <= 0.000001f) {
SetPos(caster->GetPos());
target_pos = caster->GetPos();
} else {
if (target_distance <= buff->meta->param3) {
SetPos(caster->GetPos());
target_pos = caster->GetPos();
} else {
move_dir = caster->GetPos() - GetPos();
move_dir.Normalize();
target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3);
}
}
}
break;
case kBET_JumpTo:
{
Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity) {
float target_distance = entity->GetPos().Distance(GetPos());
if (target_distance <= 0.000001f) {
SetPos(entity->GetPos());
skill_target_pos_ = entity->GetPos();
} else {
if (target_distance <= buff->meta->param3) {
SetPos(entity->GetPos());
skill_target_pos_ = entity->GetPos();
} else {
move_dir = entity->GetPos() - GetPos();
move_dir.Normalize();
skill_dir = move_dir;
skill_target_pos_ = GetPos() + move_dir * (target_distance - buff->meta->param3);
}
}
}
target_pos = skill_target_pos_;
}
break;
case kBET_Pull:
{
int i = 0;
}
break;
case kBET_Terminator:
{
if (GetRace() == kHumanRace &&
MetaMgr::Instance()->terminator_meta &&
meta != MetaMgr::Instance()->terminator_meta) {
WinExp(this, MetaMgr::Instance()->terminator_meta->i->exp() + 1);
room->NotifySysPiao(TEXT("battle_server_terminator_appear", "终结者出现"), a8::MkRgb(255, 0, 0), 3);
OnChgToTerminator();
}
}
break;
case kBET_PlayShotAni:
{
}
break;
case kBET_Vertigo:
{
int i = 0;
}
break;
case kBET_DecHp:
{
#if 0
float def = hum->ability.def * (1 + hum->GetBuffAttrRate(kHAT_Def)) +
hum->GetBuffAttrAbs(kHAT_Def);
#endif
if (caster->GetEntityType() == ET_Player) {
DecHP(buff->meta->param1,
caster->GetEntityUniId(),
((Human*)caster)->name,
0);
}
}
break;
case kBET_DelayAddBuff:
{
if (caster->GetEntityType() == ET_Player) {
room->xtimer.AddDeadLineTimerAndAttach
(
SERVER_FRAME_RATE * buff->meta->param1,
a8::XParams()
.SetSender(this)
.SetParam1(caster)
.SetParam2(buff->meta->param2)
.SetParam3(((Human*)caster)->skill_meta_),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
Human* caster = (Human*)param.param1.GetUserData();
int buff_id = param.param2;
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (buff_meta && skill == caster->skill_meta_ && caster) {
hum->AddBuff(caster, buff_meta, 1, skill);
}
},
&buff->xtimer_attacher.timer_list_);
}
}
break;
default:
{
}
break;
}
}
int Human::GetItemNum(int item_id)
@ -3284,120 +3120,6 @@ void Human::Revive()
}
}
void Human::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list)
{
switch (skill_meta_->i->skill_target()) {
case kST_All:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
if (hum->GetPos().Distance(target_pos) < skill_meta_->i->skill_distance()) {
target_list.insert(hum);
}
});
}
break;
case kST_Self:
{
target_list.insert(this);
}
break;
case kST_FriendlyIncludeSelf:
{
target_list.insert(this);
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
if ((hum == this || hum->team_id == team_id) &&
hum->GetPos().Distance(target_pos) < skill_meta_->i->skill_distance()) {
target_list.insert(hum);
}
});
}
break;
case kST_FriendlyExcludeSelf:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
if ((hum != this && hum->team_id == team_id) &&
hum->GetPos().Distance(target_pos) < skill_meta_->i->skill_distance()) {
target_list.insert(hum);
}
});
}
break;
case kST_EnemySingle:
{
Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity && entity->IsEntityType(ET_Player)) {
Human* hum = (Human*)entity;
if (IsEnemy(hum)) {
target_list.insert(hum);
}
}
}
break;
case kST_EnemyGroup:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
if ((hum->team_id != team_id) &&
hum->GetPos().Distance(target_pos) < skill_meta_->i->skill_distance()) {
target_list.insert(hum);
}
});
}
break;
case kST_EnemyAndObject:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
if ((hum->team_id != team_id) &&
hum->GetPos().Distance(target_pos) < skill_meta_->i->skill_distance()) {
target_list.insert(hum);
}
});
}
break;
case kST_EnemyAndSelf:
{
TouchAllLayerHumanList
(
[this, &target_pos, &target_list] (Human* hum, bool& stop)
{
if ((hum == this || this->IsEnemy(hum)) &&
hum->GetPos().Distance(target_pos) < skill_meta_->i->skill_distance()) {
target_list.insert(hum);
}
});
}
break;
case kST_SingleEnemyAndSelf:
{
Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity && entity->IsEntityType(ET_Player)) {
Human* hum = (Human*)entity;
if (IsEnemy(hum)) {
target_list.insert(hum);
}
}
target_list.insert(this);
}
break;
default:
break;
}
}
void Human::AutoChgWeapon()
{
if (weapons[GUN_SLOT1].weapon_id != 0) {
@ -3699,7 +3421,8 @@ void Human::OnMetaChange()
}
room->frame_event.AddHpChg(this);
RecalcBaseAttr();
skill_meta_ = MetaMgr::Instance()->GetSkill(meta->i->active_skill());
ClearSkill();
AddSkill(meta->i->active_skill());
ResetSkill();
MetaData::Skill* passive_skill_meta = MetaMgr::Instance()->GetSkill(meta->i->passive_skill());
ClearPassiveSkill();

View File

@ -69,7 +69,6 @@ class Human : public Creature
bool disconnected = false;
int anim_type = 0;
int anim_seq = 0;
ActionType_e action_type = AT_None;
long long action_frameno = 0;
int action_duration = 0;
int action_item_id = 0;
@ -96,7 +95,6 @@ class Human : public Creature
bool real_dead = false;
xtimer_list* revive_timer = nullptr;
int dead_times = 0;
bool aiming = false;
bool dead = false;
long long dead_frameno = 0;
long long real_dead_frameno = 0;
@ -140,7 +138,6 @@ class Human : public Creature
xtimer_list* ad_timer_ = nullptr;
Human* last_human_target = nullptr;
a8::Vec2 target_pos;
int game_times = 0;
int win_times = 0;
int kill_times = 0;
@ -165,7 +162,7 @@ class Human : public Creature
void FillMFTeamData(cs::MFTeamData* team_data, bool is_game_over);
void Shot(a8::Vec2& target_dir, bool& shot_ok);
void CarShot(a8::Vec2& target_dir);
void RecalcSelfCollider();
virtual void RecalcSelfCollider() override;
bool IsCollisionInMapService();
void FindPathInMapService();
float GetRadius();
@ -177,8 +174,8 @@ class Human : public Creature
int action_duration,
int item_id,
int target_id);
void CancelAction();
void ResetAction();
virtual void CancelAction() override;
virtual void ResetAction() override;
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id);
void AddToNewObjects(Entity* entity);
@ -261,7 +258,7 @@ class Human : public Creature
ObjectSyncFlags* GetObjectSyncFlags(int obj_uniid);
bool HasSpecMove();
void _UpdateSpecMove();
void _UpdateMove(int speed);
virtual void _UpdateMove(int speed) override;
RaceType_e GetRace() { return race_; }
void ChangeToRace(RaceType_e race, int level);
void ChangeToRaceAndNotify(RaceType_e race, int level);
@ -279,7 +276,6 @@ protected:
void ProcLootCar(Loot* entity, MetaData::Equip* item_meta);
void ProcCamoutflage(Loot* entity, MetaData::Equip* item_meta);
void ProcSpoils(Loot* entity, MetaData::Equip* item_meta);
virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list) override;
void AutoChgWeapon();
void CancelRevive();

View File

@ -36,7 +36,7 @@ void Player::Initialize()
{
Human::Initialize();
max_energy_shield = energy_shield;
skill_meta_ = MetaMgr::Instance()->GetSkill(41001);
AddSkill(TURN_OVER_SKILL_ID);
RecalcBaseAttr();
}