This commit is contained in:
aozhiwei 2019-04-28 14:03:26 +08:00
parent 316f18a173
commit e13331b253
7 changed files with 231 additions and 11 deletions

View File

@ -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;

View File

@ -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";

View File

@ -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)

View File

@ -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_ = {};

View File

@ -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()

View File

@ -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);

View File

@ -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;
};