皮肤等级ok

This commit is contained in:
aozhiwei 2019-05-23 11:48:02 +08:00
parent 94f57bd47d
commit bb24c44830
8 changed files with 133 additions and 30 deletions

View File

@ -114,7 +114,7 @@ void Bullet::OnHit(std::set<Entity*>& objects)
player->stats.damage_amount_out += finaly_dmg;
hum->DecHP(finaly_dmg, player->entity_uniid, player->name, gun_meta->i->id());
if (a8::HasBitFlag(hum->status, HS_ReflectDamage) && hum->skill_meta) {
float reflect_dmg = finaly_dmg * hum->skill_meta->i->value1();
float reflect_dmg = finaly_dmg * hum->skill_meta->GetValue1(hum->skin.skin_lv);
if (reflect_dmg > 1.0f) {
player->DecHP(reflect_dmg, hum->entity_uniid, hum->name, gun_meta->i->id());
}

View File

@ -146,6 +146,7 @@ const int SYNC_FRAME_RATE = 10;
const float FRAME_RATE_MS = 1000.0f / SERVER_FRAME_RATE;
const int MAX_WEAPON_NUM = 5;
const int MAX_SKIN_LV = 9;
const int GUN_SLOT1 = 1;
const int GUN_SLOT2 = 2;

View File

@ -773,7 +773,7 @@ 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);
int skill_left_time = std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time);
if (skill_left_time <= 0 || last_use_skill_frameno_ == 0) {
skill_xtimer_attacher_.ClearTimerList();
switch (skill_meta->i->type()) {
@ -781,7 +781,7 @@ void Human::DoSkill()
{
hide_frameno_ = room->frame_no;
a8::SetBitFlag(status, HS_Hide);
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
@ -809,8 +809,8 @@ void Human::DoSkill()
{
accelerate_frameno_ = room->frame_no;
a8::SetBitFlag(status, HS_Accelerate);
buff.speed += skill_meta->i->value1();
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
buff.speed += skill_meta->GetValue1(skin.skin_lv);
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
@ -834,7 +834,7 @@ void Human::DoSkill()
{
damageadd_frameno_ = room->frame_no;
a8::SetBitFlag(status, HS_DamageAdd);
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
@ -857,7 +857,7 @@ void Human::DoSkill()
{
defadd_frameno_ = room->frame_no;
a8::SetBitFlag(status, HS_DefAdd);
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
@ -894,7 +894,7 @@ void Human::DoSkill()
},
&skill_xtimer_attacher_.timer_list_
);
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
@ -917,7 +917,7 @@ void Human::DoSkill()
{
reflect_damage_frameno_ = room->frame_no;
a8::SetBitFlag(status, HS_ReflectDamage);
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
@ -1293,50 +1293,50 @@ void Human::FillBodyState(::google::protobuf::RepeatedPtrField<::cs::MFBodyState
int passed_time = (room->frame_no - hide_frameno_) * FRAME_RATE_MS;
cs::MFBodyState* state = states->Add();
state->set_state_type(HS_Hide);
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);
state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time));
state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000);
}
if (a8::HasBitFlag(status, HS_Accelerate) && skill_meta) {
int passed_time = (room->frame_no - accelerate_frameno_) * FRAME_RATE_MS;
cs::MFBodyState* state = states->Add();
state->set_state_type(HS_Accelerate);
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);
state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time));
state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000);
}
if (a8::HasBitFlag(status, HS_DamageAdd) && skill_meta) {
int passed_time = (room->frame_no - damageadd_frameno_) * FRAME_RATE_MS;
cs::MFBodyState* state = states->Add();
state->set_state_type(HS_DamageAdd);
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);
state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time));
state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000);
}
if (a8::HasBitFlag(status, HS_DefAdd) && skill_meta) {
int passed_time = (room->frame_no - defadd_frameno_) * FRAME_RATE_MS;
cs::MFBodyState* state = states->Add();
state->set_state_type(HS_DefAdd);
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);
state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time));
state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000);
}
if (a8::HasBitFlag(status, HS_RecoverHP) && skill_meta) {
int passed_time = (room->frame_no - recover_hp_frameno_) * FRAME_RATE_MS;
cs::MFBodyState* state = states->Add();
state->set_state_type(HS_RecoverHP);
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);
state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time));
state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000);
}
if (a8::HasBitFlag(status, HS_ReflectDamage) && skill_meta) {
int passed_time = (room->frame_no - reflect_damage_frameno_) * FRAME_RATE_MS;
cs::MFBodyState* state = states->Add();
state->set_state_type(HS_ReflectDamage);
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);
state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time));
state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000);
}
if (a8::HasBitFlag(status, HS_SummonHero) && skill_meta) {
int passed_time = (room->frame_no - summon_hero_frameno_) * FRAME_RATE_MS;
cs::MFBodyState* state = states->Add();
state->set_state_type(HS_SummonHero);
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);
state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time));
state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000);
}
}
@ -1346,7 +1346,7 @@ void Human::SummonHero()
if (hero) {
summon_hero_frameno_ = room->frame_no;
a8::SetBitFlag(status, HS_SummonHero);
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE,
room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE,
a8::XParams()
.SetSender(this)
.SetParam1(hero->entity_uniid),

View File

@ -332,4 +332,92 @@ namespace MetaData
}
}
void Skill::Init()
{
{
std::vector<std::string> strings;
a8::Split(i->value1(), strings, '|');
assert(i->value1() == "" || strings.size() == MAX_SKIN_LV);
for (size_t i = 0; i < strings.size(); ++i) {
if (i < MAX_SKIN_LV) {
value1[i] = a8::XValue(strings[i]).GetDouble();
}
}
}
{
std::vector<std::string> strings;
a8::Split(i->value2(), strings, '|');
assert(i->value2() == "" || strings.size() == MAX_SKIN_LV);
for (size_t i = 0; i < strings.size(); ++i) {
if (i < MAX_SKIN_LV) {
value2[i] = a8::XValue(strings[i]).GetDouble();
}
}
}
{
std::vector<std::string> strings;
a8::Split(i->area(), strings, '|');
assert(i->area() == "" || strings.size() == MAX_SKIN_LV);
for (size_t i = 0; i < strings.size(); ++i) {
if (i < MAX_SKIN_LV) {
area[i] = a8::XValue(strings[i]).GetDouble();
}
}
}
{
std::vector<std::string> strings;
a8::Split(i->last_time(), strings, '|');
assert(i->last_time() == "" || strings.size() == MAX_SKIN_LV);
for (size_t i = 0; i < strings.size(); ++i) {
if (i < MAX_SKIN_LV) {
last_time[i] = a8::XValue(strings[i]);
}
}
}
}
float Skill::GetValue1(int skin_lv)
{
if (skin_lv < 1) {
return value1[0];
}
if (skin_lv > MAX_SKIN_LV) {
return value1[MAX_SKIN_LV - 1];
}
return value1[skin_lv - 1];
}
float Skill::GetValue2(int skin_lv)
{
if (skin_lv < 1) {
return value2[0];
}
if (skin_lv > MAX_SKIN_LV) {
return value2[MAX_SKIN_LV - 1];
}
return value2[skin_lv - 1];
}
float Skill::GetArea(int skin_lv)
{
if (skin_lv < 1) {
return area[0];
}
if (skin_lv > MAX_SKIN_LV) {
return area[MAX_SKIN_LV - 1];
}
return area[skin_lv - 1];
}
int Skill::GetLastTime(int skin_lv)
{
if (skin_lv < 1) {
return last_time[0];
}
if (skin_lv > MAX_SKIN_LV) {
return last_time[MAX_SKIN_LV - 1];
}
return last_time[skin_lv - 1];
}
}

View File

@ -131,6 +131,19 @@ namespace MetaData
struct Skill
{
const metatable::Skill* i = nullptr;
void Init();
float GetValue1(int skin_lv);
float GetValue2(int skin_lv);
float GetArea(int skin_lv);
int GetLastTime(int skin_lv);
private:
std::array<float, MAX_SKIN_LV> value1 = {};
std::array<float, MAX_SKIN_LV> value2 = {};
std::array<float, MAX_SKIN_LV> area = {};
std::array<int, MAX_SKIN_LV> last_time = {};
};
struct Dress

View File

@ -226,6 +226,7 @@ private:
for (auto& meta : skill_meta_list) {
MetaData::Skill& item = a8::FastAppend(skill_list);
item.i = &meta;
item.Init();
skill_hash[item.i->id()] = &item;
}

View File

@ -597,8 +597,8 @@ void Room::OnHumanDie(Human* hum)
for (auto& pair : human_hash_) {
if (pair.second != hum && (pair.second->team_id == 0 || pair.second->team_id != hum->team_id)) {
float distance = (hum->pos - pair.second->pos).Norm();
if (distance <= hum->skill_meta->i->area()) {
pair.second->DecHP(hum->skill_meta->i->value1(),
if (distance <= hum->skill_meta->GetArea(hum->skin.skin_lv)) {
pair.second->DecHP(hum->skill_meta->GetValue1(hum->skin.skin_lv),
hum->entity_uniid,
hum->name,
VW_SelfDetonate);

View File

@ -108,11 +108,11 @@ message Skill
optional int32 id = 1;
optional int32 type = 2;
optional int32 condition = 3;
optional float value1 = 4;
optional float value2 = 5;
optional int32 area = 6;
optional string value1 = 4;
optional string value2 = 5;
optional string area = 6;
optional int32 cd_time = 7;
optional int32 last_time = 8;
optional string last_time = 8;
}
message Drop