skill ok
This commit is contained in:
parent
316f18a173
commit
e13331b253
@ -104,11 +104,17 @@ void Bullet::OnHit(std::set<Entity*>& objects)
|
||||
#else
|
||||
if (!hum->dead && (hum->team_id == 0 || hum->team_id != player->team_id)) {
|
||||
#endif
|
||||
float dmg = gun_meta->i->atk();
|
||||
float def = hum->def;
|
||||
float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add);
|
||||
float def = hum->def + hum->buff.def_add;
|
||||
float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K);
|
||||
player->stats.damage_amount += finaly_dmg;
|
||||
hum->DecHP(finaly_dmg, player->entity_uniid, player->name);
|
||||
if (a8::HasBitFlag(hum->status, HS_ReflectDamage) && hum->skill_meta) {
|
||||
float reflect_dmg = finaly_dmg * hum->skill_meta->i->value1();
|
||||
if (reflect_dmg > 1.0f) {
|
||||
player->DecHP(reflect_dmg, hum->entity_uniid, hum->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -116,7 +122,7 @@ void Bullet::OnHit(std::set<Entity*>& objects)
|
||||
{
|
||||
Obstacle* obstacle = (Obstacle*)target;
|
||||
if (!obstacle->dead && obstacle->meta->i->attack_type() == 1) {
|
||||
float dmg = gun_meta->i->atk();
|
||||
float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add);
|
||||
float def = 0;
|
||||
float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K);
|
||||
player->stats.damage_amount += finaly_dmg;
|
||||
|
@ -87,6 +87,24 @@ enum InventorySlot_e
|
||||
IS_END
|
||||
};
|
||||
|
||||
enum SkillType_e
|
||||
{
|
||||
ST_Hide = 1,
|
||||
ST_SummonHero = 2,
|
||||
ST_Accelerate = 3,
|
||||
ST_DamageAdd = 4,
|
||||
ST_DefAdd = 5,
|
||||
ST_RecoverHP = 6,
|
||||
ST_ReflectDamage = 7,
|
||||
ST_SelfDetonate = 8
|
||||
};
|
||||
|
||||
enum SkillCond_e
|
||||
{
|
||||
SC_Active = 1,
|
||||
SC_Passive = 2
|
||||
};
|
||||
|
||||
const char* const PROJ_NAME_FMT = "game%d_gameserver";
|
||||
const char* const PROJ_ROOT_FMT = "/data/logs/%s";
|
||||
|
||||
|
@ -43,7 +43,7 @@ void Human::Initialize()
|
||||
|
||||
float Human::GetSpeed()
|
||||
{
|
||||
return meta->i->move_speed();
|
||||
return meta->i->move_speed() + buff.speed;
|
||||
}
|
||||
|
||||
void Human::FillMFObjectPart(cs::MFObjectPart* part_data)
|
||||
@ -102,49 +102,49 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data)
|
||||
int passed_time = (room->frame_no - jump_frameno) * FRAME_RATE_MS;
|
||||
cs::MFBodyState* state = p->add_states();
|
||||
state->set_state_type(3);
|
||||
state->set_left_time(std::min(0, MetaMgr::Instance()->jump_time * 1000 - passed_time));
|
||||
state->set_left_time(std::max(0, MetaMgr::Instance()->jump_time * 1000 - passed_time));
|
||||
state->set_lasting_time(MetaMgr::Instance()->jump_time * 1000);
|
||||
}
|
||||
if (a8::HasBitFlag(status, HS_Hide) && skill_meta) {
|
||||
int passed_time = (room->frame_no - hide_frameno_) * FRAME_RATE_MS;
|
||||
cs::MFBodyState* state = p->add_states();
|
||||
state->set_state_type(HS_Hide);
|
||||
state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_left_time(std::max(0, skill_meta->i->cd_time() * 1000 - passed_time));
|
||||
state->set_lasting_time(skill_meta->i->last_time() * 1000);
|
||||
}
|
||||
if (a8::HasBitFlag(status, HS_Accelerate) && skill_meta) {
|
||||
int passed_time = (room->frame_no - accelerate_frameno_) * FRAME_RATE_MS;
|
||||
cs::MFBodyState* state = p->add_states();
|
||||
state->set_state_type(HS_Accelerate);
|
||||
state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_lasting_time(skill_meta->i->last_time() * 1000);
|
||||
}
|
||||
if (a8::HasBitFlag(status, HS_DamageAdd) && skill_meta) {
|
||||
int passed_time = (room->frame_no - damageadd_frameno_) * FRAME_RATE_MS;
|
||||
cs::MFBodyState* state = p->add_states();
|
||||
state->set_state_type(HS_DamageAdd);
|
||||
state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_lasting_time(skill_meta->i->last_time() * 1000);
|
||||
}
|
||||
if (a8::HasBitFlag(status, HS_DefAdd) && skill_meta) {
|
||||
int passed_time = (room->frame_no - defadd_frameno_) * FRAME_RATE_MS;
|
||||
cs::MFBodyState* state = p->add_states();
|
||||
state->set_state_type(HS_DefAdd);
|
||||
state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_lasting_time(skill_meta->i->last_time() * 1000);
|
||||
}
|
||||
if (a8::HasBitFlag(status, HS_RecoverHP) && skill_meta) {
|
||||
int passed_time = (room->frame_no - recover_hp_frameno_) * FRAME_RATE_MS;
|
||||
cs::MFBodyState* state = p->add_states();
|
||||
state->set_state_type(HS_RecoverHP);
|
||||
state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_lasting_time(skill_meta->i->last_time() * 1000);
|
||||
}
|
||||
if (a8::HasBitFlag(status, HS_ReflectDamage) && skill_meta) {
|
||||
int passed_time = (room->frame_no - reflect_damage_frameno_) * FRAME_RATE_MS;
|
||||
cs::MFBodyState* state = p->add_states();
|
||||
state->set_state_type(HS_ReflectDamage);
|
||||
state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time));
|
||||
state->set_lasting_time(skill_meta->i->last_time() * 1000);
|
||||
}
|
||||
}
|
||||
@ -638,6 +638,167 @@ void Human::DoJump()
|
||||
}
|
||||
}
|
||||
|
||||
void Human::DoSkill()
|
||||
{
|
||||
if (skill_meta && skill_meta->i->condition() == SC_Active) {
|
||||
int passed_time = (room->frame_no - last_use_skill_frameno_) * FRAME_RATE_MS;
|
||||
int skill_left_time = std::max(0, skill_meta->i->last_time() * 1000 - passed_time);
|
||||
if (skill_left_time <= 0) {
|
||||
skill_xtimer_attacher_.ClearTimerList();
|
||||
switch (skill_meta->i->type()) {
|
||||
case ST_Hide:
|
||||
{
|
||||
hide_frameno_ = room->frame_no;
|
||||
a8::SetBitFlag(status, HS_Hide);
|
||||
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
},
|
||||
&skill_xtimer_attacher_.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
a8::UnSetBitFlag(hum->status, HS_Hide);
|
||||
hum->need_sync_active_player = true;
|
||||
hum->BroadcastFullState();
|
||||
}
|
||||
);
|
||||
need_sync_active_player = true;
|
||||
BroadcastFullState();
|
||||
}
|
||||
break;
|
||||
case ST_SummonHero:
|
||||
{
|
||||
|
||||
}
|
||||
break;
|
||||
case ST_Accelerate:
|
||||
{
|
||||
accelerate_frameno_ = room->frame_no;
|
||||
a8::SetBitFlag(status, HS_Accelerate);
|
||||
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
},
|
||||
&skill_xtimer_attacher_.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
a8::UnSetBitFlag(hum->status, HS_Accelerate);
|
||||
hum->need_sync_active_player = true;
|
||||
hum->BroadcastFullState();
|
||||
}
|
||||
);
|
||||
need_sync_active_player = true;
|
||||
BroadcastFullState();
|
||||
}
|
||||
break;
|
||||
case ST_DamageAdd:
|
||||
{
|
||||
damageadd_frameno_ = room->frame_no;
|
||||
a8::SetBitFlag(status, HS_DamageAdd);
|
||||
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
},
|
||||
&skill_xtimer_attacher_.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
a8::UnSetBitFlag(hum->status, HS_DamageAdd);
|
||||
hum->need_sync_active_player = true;
|
||||
hum->BroadcastFullState();
|
||||
}
|
||||
);
|
||||
need_sync_active_player = true;
|
||||
BroadcastFullState();
|
||||
}
|
||||
break;
|
||||
case ST_DefAdd:
|
||||
{
|
||||
defadd_frameno_ = room->frame_no;
|
||||
a8::SetBitFlag(status, HS_DefAdd);
|
||||
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
},
|
||||
&skill_xtimer_attacher_.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
a8::UnSetBitFlag(hum->status, HS_DefAdd);
|
||||
hum->need_sync_active_player = true;
|
||||
hum->BroadcastFullState();
|
||||
}
|
||||
);
|
||||
need_sync_active_player = true;
|
||||
BroadcastFullState();
|
||||
}
|
||||
break;
|
||||
case ST_RecoverHP:
|
||||
{
|
||||
recover_hp_frameno_ = room->frame_no;
|
||||
a8::SetBitFlag(status, HS_RecoverHP);
|
||||
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
},
|
||||
&skill_xtimer_attacher_.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
a8::UnSetBitFlag(hum->status, HS_RecoverHP);
|
||||
hum->need_sync_active_player = true;
|
||||
hum->BroadcastFullState();
|
||||
}
|
||||
);
|
||||
need_sync_active_player = true;
|
||||
BroadcastFullState();
|
||||
}
|
||||
break;
|
||||
case ST_ReflectDamage:
|
||||
{
|
||||
reflect_damage_frameno_ = room->frame_no;
|
||||
a8::SetBitFlag(status, HS_ReflectDamage);
|
||||
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
},
|
||||
&skill_xtimer_attacher_.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
a8::UnSetBitFlag(hum->status, HS_ReflectDamage);
|
||||
hum->need_sync_active_player = true;
|
||||
hum->BroadcastFullState();
|
||||
}
|
||||
);
|
||||
need_sync_active_player = true;
|
||||
BroadcastFullState();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
last_use_skill_frameno_ = room->frame_no;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Human::FindLocation()
|
||||
{
|
||||
{
|
||||
@ -835,6 +996,14 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data)
|
||||
player_data->set_max_energy_shield(max_energy_shield);
|
||||
}
|
||||
#endif
|
||||
#if 1
|
||||
if (skill_meta) {
|
||||
int passed_time = (room->frame_no - last_use_skill_frameno_) * FRAME_RATE_MS;
|
||||
int skill_left_time = std::max(0, skill_meta->i->last_time() * 1000 - passed_time);
|
||||
player_data->set_skill_left_time(skill_left_time);
|
||||
player_data->set_skill_cd_time(skill_meta->i->last_time() * 1000);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void Human::FillMFGasData(cs::MFGasData* gas_data)
|
||||
|
@ -39,6 +39,7 @@ class Human : public Entity
|
||||
MetaData::Equip* chest_meta = nullptr;
|
||||
MetaData::Dress* skin_meta = nullptr;
|
||||
MetaData::Skill* skill_meta = nullptr;
|
||||
HumanAbility buff;
|
||||
|
||||
Vector2D move_dir;
|
||||
Vector2D attack_dir;
|
||||
@ -131,6 +132,7 @@ class Human : public Entity
|
||||
bool HasLiveTeammate();
|
||||
void Land();
|
||||
void DoJump();
|
||||
void DoSkill();
|
||||
void FindLocation();
|
||||
void RefreshView();
|
||||
void OnGridListChange(std::set<GridCell*>& old_grid_list,
|
||||
@ -149,12 +151,14 @@ class Human : public Entity
|
||||
|
||||
protected:
|
||||
long long last_shot_frameno_ = 0;
|
||||
long long last_use_skill_frameno_ = 0;
|
||||
long long hide_frameno_ = 0;
|
||||
long long accelerate_frameno_ = 0;
|
||||
long long damageadd_frameno_ = 0;
|
||||
long long defadd_frameno_ = 0;
|
||||
long long recover_hp_frameno_ = 0;
|
||||
long long reflect_damage_frameno_ = 0;
|
||||
a8::XTimerAttacher skill_xtimer_attacher_;
|
||||
|
||||
std::array<int, IS_END - 1> inventory_ = {};
|
||||
std::array<int, IS_END> volume_ = {};
|
||||
|
@ -81,6 +81,9 @@ void Player::Update(int delta_time)
|
||||
if (jump) {
|
||||
UpdateJump();
|
||||
}
|
||||
if (use_skill) {
|
||||
UpdateUseSkill();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -417,6 +420,12 @@ void Player::UpdateJump()
|
||||
jump = false;
|
||||
}
|
||||
|
||||
void Player::UpdateUseSkill()
|
||||
{
|
||||
DoSkill();
|
||||
use_skill = false;
|
||||
}
|
||||
|
||||
void Player::Shot()
|
||||
{
|
||||
if (!curr_weapon->meta) {
|
||||
@ -837,6 +846,9 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
|
||||
if (msg.has_jump()) {
|
||||
jump = true;
|
||||
}
|
||||
if (msg.has_use_skill()) {
|
||||
use_skill = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Player::UpdateDropWeapon()
|
||||
|
@ -60,6 +60,8 @@ class Player : public Human
|
||||
|
||||
bool jump = false;
|
||||
|
||||
bool use_skill = false;
|
||||
|
||||
::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids;
|
||||
|
||||
template <typename T>
|
||||
@ -85,6 +87,7 @@ class Player : public Human
|
||||
void UpdateGameOver();
|
||||
void UpdateEmote();
|
||||
void UpdateJump();
|
||||
void UpdateUseSkill();
|
||||
void Shot();
|
||||
void ProcInteraction();
|
||||
void ObstacleInteraction(Obstacle* entity);
|
||||
|
@ -68,3 +68,11 @@ struct Plane
|
||||
Vector2D dir;
|
||||
Vector2D curr_pos;
|
||||
};
|
||||
|
||||
struct HumanAbility
|
||||
{
|
||||
float speed = 0.0f;
|
||||
float damage_add = 0.0f;
|
||||
float def_add = 0.0f;
|
||||
float reflect_damage = 0.0f;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user