From 7178214c6577273da0c052468bde0fe1a6931a5c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 11 Apr 2019 12:42:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E7=AE=97Ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 1 + server/gameserver/human.cc | 32 ++++++++++++++++++++++++++++++-- server/gameserver/player.cc | 8 +++++--- server/gameserver/room.cc | 6 +++--- server/gameserver/room.h | 2 +- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index d7f134a..54d315d 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -80,6 +80,7 @@ void Bullet::OnHit(std::vector& objects) { Human* hum = (Human*)target; if (!hum->dead) { + player->stats.damage_amount += 10; hum->DecHP(10, player->entity_uniid, player->name); } } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index b2e0367..5715a2b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -328,8 +328,32 @@ void Human::ResetAction() void Human::FillSMGameOver(cs::SMGameOver& msg) { + std::vector human_list; + room->TouchHumanList(a8::XParams(), + [&human_list] (Human* hum, a8::XParams& param) + { + human_list.push_back(hum); + }); + std::sort(human_list.begin(), human_list.end(), + [] (Human* a, Human* b ) + { + if (a->dead_frameno == b->dead_frameno) { + return a->entity_uniid < b->entity_uniid; + } else { + return a->dead_frameno == 0 || + (b->dead_frameno != 0 && a->dead_frameno > b->dead_frameno); + } + }); + int rank = human_list.size(); + for (size_t i = 0; i < human_list.size(); ++i) { + if (human_list[i] == this) { + rank = i + 1; + break; + } + } + msg.set_team_id(0); - msg.set_team_rank(0); + msg.set_team_rank(rank); msg.set_team_allcnt(1); msg.set_game_over(true); msg.set_victory(false); @@ -341,6 +365,10 @@ void Human::FillSMGameOver(cs::SMGameOver& msg) void Human::BeKill(int killer_id, const std::string& killer_name) { if (!dead) { + Entity* hum = room->GetEntityByUniId(killer_id); + if (hum && hum->entity_type == ET_Player) { + ((Human*)hum)->stats.kills++; + } stats.killer_id = killer_id; stats.killer_name = killer_name; dead = true; @@ -354,7 +382,7 @@ void Human::BeKill(int killer_id, const std::string& killer_name) void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name) { - health = std::min(0.0f, health - dec_hp); + health = std::max(0.0f, health - dec_hp); if (health <= 0.0001f) { BeKill(killer_id, killer_name); } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 962d573..ce329d9 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -195,8 +195,10 @@ void Player::UpdateAction() MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquipBySlotId(action_item_id); if (item_meta){ if (inventory[item_meta->i->_inventory_slot()] > 0) { + float old_health = health; health += item_meta->i->heal(); health = std::min(100.0f, health); + stats.heal_amount += health - old_health; --inventory[item_meta->i->_inventory_slot()]; need_sync_active_player = true; SyncAroundPlayers(); @@ -517,7 +519,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - room->DropItem(pos, old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id(), 1); } backpack = item_meta->i->id(); } @@ -532,7 +534,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - room->DropItem(pos, old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id(), 1); } chest = item_meta->i->id(); } else if (item_meta->i->equip_subtype() == 2) { @@ -542,7 +544,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - room->DropItem(pos, old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id(), 1); } helmet = item_meta->i->id(); } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 1b4a402..a1d3432 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -295,7 +295,7 @@ void Room::ScatterDrop(Vector2D center, int drop_id) for (auto& item : drop_items) { Vector2D dir = Vector2D::UP; dir.Rotate(a8::RandAngle()); - DropItem(center + dir * (5 + rand() % 50), std::get<0>(item)); + DropItem(center + dir * (5 + rand() % 50), std::get<0>(item), std::get<1>(item)); } } } @@ -376,7 +376,7 @@ void Room::FillSMMapInfo(cs::SMMapInfo& map_info) } } -void Room::DropItem(Vector2D pos, int item_id) +void Room::DropItem(Vector2D pos, int item_id, int item_count) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(item_id); if (equip_meta) { @@ -390,7 +390,7 @@ void Room::DropItem(Vector2D pos, int item_id) entity->pos = pos + dir * (25 + rand() % 50); } entity->item_id = equip_meta->i->id(); - entity->count = 1; + entity->count = item_count; entity->Initialize(); uniid_hash_[entity->entity_uniid] = entity; for (auto& pair : human_hash_) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 5841507..d36f302 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -49,7 +49,7 @@ public: std::function func); void ScatterDrop(Vector2D center, int drop_id); - void DropItem(Vector2D pos, int item_id); + void DropItem(Vector2D pos, int item_id, int item_count); void CreateThings(); void CreateDoor(Building* building, int door_idx);