From f362689a6e011e219f55779a28fb048e3fe7cc74 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 26 Apr 2019 11:19:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BC=A4=E5=AE=B3=E5=85=AC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 14 +++++++++++--- server/gameserver/human.cc | 13 +++++++++++++ server/gameserver/human.h | 4 ++++ server/gameserver/metamgr.cc | 4 ++++ server/gameserver/metamgr.h | 1 + server/gameserver/player.cc | 2 ++ server/tools/protobuild/metatable.proto | 1 + 7 files changed, 36 insertions(+), 3 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index dd8fd8c..ff574f6 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -104,8 +104,11 @@ void Bullet::OnHit(std::set& objects) #else if (!hum->dead && (hum->team_id == 0 || hum->team_id != player->team_id)) { #endif - player->stats.damage_amount += 10; - hum->DecHP(10, player->entity_uniid, player->name); + float dmg = gun_meta->i->atk(); + float def = hum->def; + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + player->stats.damage_amount += finaly_dmg; + hum->DecHP(finaly_dmg, player->entity_uniid, player->name); } } break; @@ -113,7 +116,12 @@ void Bullet::OnHit(std::set& objects) { Obstacle* obstacle = (Obstacle*)target; if (!obstacle->dead && obstacle->meta->i->attack_type() == 1) { - obstacle->health = std::max(0.0f, obstacle->health - 10); + float dmg = gun_meta->i->atk(); + float def = 0; + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + player->stats.damage_amount += finaly_dmg; + + obstacle->health = std::max(0.0f, obstacle->health - finaly_dmg); obstacle->dead = obstacle->health <= 0.01f; obstacle->dead_frameno = room->frame_no; if (obstacle->dead) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f2a7e8e..7819a08 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -826,3 +826,16 @@ bool Human::CanSee(Human* hum) { return room->grid_service.InView(grid_id, hum->grid_id); } + +void Human::RecalcAttr() +{ + def = meta->i->def(); + MetaData::Equip* chest_meta = MetaMgr::Instance()->GetEquip(chest); + if (chest_meta) { + def += chest_meta->i->def(); + } + MetaData::Equip* helmet_meta = MetaMgr::Instance()->GetEquip(helmet); + if (helmet_meta) { + def += helmet_meta->i->def(); + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 9c9e564..66aad2e 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -86,6 +86,9 @@ class Human : public Entity long long jump_frameno = 0; long long send_msg_times = 0; + + float def = 0.0f; + Human(); virtual ~Human() override; virtual void Initialize() override; @@ -128,6 +131,7 @@ class Human : public Entity void FillMFActivePlayerData(cs::MFActivePlayerData* player_data); void FillMFGasData(cs::MFGasData* gas_data); bool CanSee(Human* hum); + void RecalcAttr(); protected: long long last_shot_frameno_ = 0; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 19ab721..1bbb55b 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -71,6 +71,10 @@ public: { MetaMgr::Instance()->gas_inactive_time = MetaMgr::Instance()->GetSysParamAsInt("gas_inactive_time"); MetaMgr::Instance()->jump_time = MetaMgr::Instance()->GetSysParamAsFloat("jump_time"); + MetaMgr::Instance()->K = MetaMgr::Instance()->GetSysParamAsFloat("K"); + if (MetaMgr::Instance()->K < 0.01f) { + abort(); + } } #endif } diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 0da91f5..a248ad4 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -33,6 +33,7 @@ class MetaMgr : public a8::Singleton int gas_inactive_time = 10; int jump_time = 10; + float K = 100.0f; private: MetaDataLoader* loader_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index d5fbcbb..fe4c3c4 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -675,6 +675,7 @@ void Player::LootInteraction(Loot* entity) room->DropItem(pos, old_item_meta->i->id(), 1); } chest = item_meta->i->id(); + RecalcAttr(); } else if (item_meta->i->equip_subtype() == 2) { //头盔 MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(helmet); @@ -685,6 +686,7 @@ void Player::LootInteraction(Loot* entity) room->DropItem(pos, old_item_meta->i->id(), 1); } helmet = item_meta->i->id(); + RecalcAttr(); } } break; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 6dad641..e9bc105 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -78,6 +78,7 @@ message Player optional float radius = 2; //半径 optional int32 health = 3; //初始血量 optional int32 move_speed = 4; //移动速度 + optional float def = 5; //防御 } message Skill